田中太郎
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について考えました。
コメント