01. 並列実行の種類
複数のtaskを並列実行するのに、fork joinを使うと書きました。このfork joinの内部は並列実行されるのですが、fork join自体の処理はいつ終わるのか?終了タイミングは3通りあります。
- fork join
- fork join_any
- 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のとき
- join_anyのとき
- join_noneのとき
となりました。