06. 並列実行の基本
> 並列実行の種類, > 並列実行と無限ループ
通常、taskを1つ実行すると、そのtaskの実行完了を待ちます。
例えば以下のコードを実行すると…
task test_task(string name); #10 $display("[%0d] %s wait", $time, name); endtask initial begin test_task("a"); test_task("b"); test_task("c"); end↓
# [10] a wait# [20] b wait# [30] c waitとなります。この3つのtaskを並列実行するとどうなるでしょう。fork joinを使います。
initial begin fork test_task("a"); test_task("b"); test_task("c"); join end↓
# [10] c wait# [10] c wait# [10] c wait3つとも表示される時間が同じなので、同時に実行されたことがわかります。しかし、指定した文字列が全部 "c" になっていますね。なぜ???
これは、同じtaskが同時刻に実行されたとき、taskの処理内容が1つのメモリ内で扱われているためのようです。これではユーザの期待した動作ではありません。では、どうするか。taskの定義を少し変更します。
task automatic test_task(string name); #10 $display("[%0d] %s wait", $time, name); endtask"automatic" をtask名の前に入れてあげます。この状態で実行すると、
↓
# [10] a wait# [10] b wait# [10] c wait期待した動作になりました。