01. 並列実行の種類

複数のtaskを並列実行するのに、fork joinを使うと書きました。このfork joinの内部は並列実行されるのですが、fork join自体の処理はいつ終わるのか?終了タイミングは3通りあります。

  1. fork join
  2. fork join_any
  3. fork join_none

1番は、すでに説明したとおりの動作をします。fork joinで囲んだ中のすべてのtaskの処理が完了したときfork joinから抜け出します。

2番は、fork join_anyで囲んだ中の、1つのtaskの処理が完了したときにfork join_anyから抜け出します。

3番は、fork join_noneで囲んだ中の、どのtaskの処理完了を待つことなく、fork join_noneから抜け出します。

これらの動作を確認するサンプルを作りました。

--- test.sv ---module test; task automatic test_task(string name, int wait_val); #wait_val $display("[%0d] %s wait", $time, name); endtask initial begin fork test_task("a",10); test_task("b",20); test_task("c",30); join /// join_any /// join_none $display("[%0d] Done.",$time); endendmodule

実行結果は

  • joinのとき
# [10] a wait# [20] b wait# [30] c wait# [30] Done.
  • join_anyのとき
# [10] a wait# [10] Done.# [20] b wait# [30] c wait
  • join_noneのとき
# [0] Done.# [10] a wait# [20] b wait# [30] c wait

となりました。