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

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