スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[SystemVerilog] fork join_none inside for loop

本記事のきっかけはこちらです。


fork join_none inside for loop - Verification Academy


まずはこちらのコードを見てください。
fork~join_noneに do_hogeを5回並行で動作させようとしている所です。

 1|module testbench;
 2|
 3|  task automatic do_hoge(int wait_time);
 4|    #wait_time $display("waited %0d, then did stuff", wait_time);
 5|  endtask
 6|
 7|  initial begin
 8|    for(int i=0; i<5; i++) begin
 9|      fork
10|        do_hoge(i*10);
11|      join_none
12|    end
13|    $display("fork has been joined");
14|  end
15|
16|endmodule

では、実行結果はどうなるでしょうか?
実行してみるとこのようになります。

# fork has been joined
# waited 50, then did stuff
# waited 50, then did stuff
# waited 50, then did stuff
# waited 50, then did stuff
# waited 50, then did stuff

???おかしいですね。
引数として与えていた値が 50 = 5(=i) * 10となっています。
では、少し書きなおします。

 1|module testbench;
 2|
 3|  task automatic do_hoge(int wait_time);
 4|    #wait_time $display("waited %0d, then did stuff", wait_time);
 5|  endtask
 6|
 7|  initial begin
 8|    fork
 9|      for(int i=0; i<5; i++) begin
10|        do_hoge(i*10);
11|      end
12|    join_none
13|    $display("fork has been joined");
14|  end
15|
16|endmodule

fork~join_none内に for文(ループ)を記述しました。
この実行結果はどうなるでしょうか?

# fork has been joined
# waited 0, then did stuff
# waited 10, then did stuff
# waited 20, then did stuff
# waited 30, then did stuff
# waited 40, then did stuff

こちらは、求めていた結果になっています。
では、どうして違うのか???


その答えは明日 22:30~開催される
「第2回 SystemVerilog読書会:4.Scheduling semantics」
で理解出来る!... かも...(適当)

参加お待ちしております。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。