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

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