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 wait

3つとも表示される時間が同じなので、同時に実行されたことがわかります。しかし、指定した文字列が全部 "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

期待した動作になりました。