SystemVerilog|fork/join, join_none, join_anyについて考える

Systemverilog
田中太郎
田中太郎

fork-join/join_none/join_anyについて考えます

forkでプロセスの並列実行

forkを使うことでプロセスを並列に実行できます

3種類あるのでそれぞれ紹介します

fork/join

fork/joinで囲ったプロセスがすべて終了すると次のプロセスに移動します

module tb;
    initial begin
        fork
            begin
                #10;
                $display("1"); // 最初にここに到達
            end
            begin
                #20;
                $display("2"); // 2番目にここ
            end
        join // 1,2が表示されたらプロセス終了

        #5;
        $display("3"); // 3番目に表示される

        #20;
        $finish;
    end
endmodule

// 出力
// 1
// 2
// 3

fork/join_none

fork/join_noneで囲ったプロセスが開始と同時に次のプロセスに移動する
囲っているプロセルも動いている

module tb;
    initial begin
        fork
            begin
                #10;
                $display("1"); // 2番目
            end
            begin
                #20;
                $display("2"); // 3番目
            end
        join_none // プロセスが開始されつつ次の文に移動

        #5;
        $display("3"); // 最初にここに到達する

        #20;
        $finish;
    end
endmodule

// 出力
// 3
// 1
// 2

fork/join_any

fork/join_anyで囲ったプロセスの1つが終了すると次のプロセスに移動する
プロセスが移動しても、終了していないものは動き続ける

module tb;
    initial begin
        fork
            begin
                #10;
                $display("1"); // 最初にここに到達。join_anyなので、forkの次のプロセス開始
            end
            begin
                #20;
                $display("2"); // 3番目
            end
        join_any

        #5;
        $display("3"); // 2番目

        #20;
        $finish;
    end
endmodule

// 出力
// 1
// 3
// 2

まとめ

forkについて考えました。

コメント

タイトルとURLをコピーしました