本記事のきっかけはこちらです。
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」
で理解出来る!... かも...(適当)
参加お待ちしております。
- 関連記事
-
- [読書会][案内] 本日22:30〜 SystemVerilog読書会やります。
- [読書会] 第二回 SystemVerilog読書会行いました。
- [SystemVerilog] fork join_none inside for loop
- [SystemVerilog] program blockについてのメモ
- 第一回SystemVerilog読書会行いました。