SystemVerilogフォーク結合(SystemVerilogブランチ結合)



Systemverilog Fork Join



SystemVerilogは、フォーク結合の構築を通じて並列スレッドまたは並行スレッドのサポートを提供します。フォークと結合を使用して、同時に複数のブロックを生成します。フォーク接続には多くのバリエーションがあり、 メインスレッドは、子スレッドの完了時間に従って残りのステートメントを実行し続けます。

構文

fork // thread 1 // thread 2 // ... // thread 3 join

フォーク結合の例

以下の例では、3つのスレッドがfork ... joinを使用して接続されています。メインスレッドは、フォークから派生したすべてのスレッドが完了するまで中断されたままになります。 beginとendのコードブロックは、別々のスレッド(この場合はThread2)として扱われます。



module tb initial begin $display ('[%0t] Main Thread: Fork join going to start', $time) fork // Thread 1 #30 $display ('[%0t] Thread1 finished', $time) // Thread 2 begin #5 $display ('[%0t] Thread2 ...', $time) #10 $display ('[%0t] Thread2 finished', $time) end // Thread 3 #20 $display ('[%0t] Thread3 finished', $time) join $display ('[%0t] Main Thread: Fork join has finished', $time) end endmodule Simulation Log ncsim> run [0] Main Thread: Fork join going to start [5] Thread2 ... [15] Thread2 finished [20] Thread3 finished [30] Thread1 finished [30] Main Thread: Fork join has finished ncsim: *W,RNQUIE: Simulation is complete.

フォーク...ネスティングに参加

Fork ... joinは、他のfork ... joinにネストできます。

例1

module tb initial begin $display ('[%0t] Main Thread: Fork join going to start', $time) fork fork display (20, 'Thread1_0') display (30, 'Thread1_1') join display (10, 'Thread2') join $display ('[%0t] Main Thread: Fork join has finished', $time) end task automatic display (int _time, string t_name) #(_time) $display ('[%0t] %s', $time, t_name) endtask endmodule Simulation Log ncsim> run [0] Main Thread: Fork join going to start [10] Thread2 [20] Thread1_0 [30] Thread1_1 [30] Main Thread: Fork join has finished ncsim: *W,RNQUIE: Simulation is complete.

注:最初のフォーク...ここでの結合には、次の2つのスレッドが含まれます。



fork display (20, 'Thread1_0') display (30, 'Thread1_1') join with $display ('[%0t] Main Thread: Fork join has finished', $time)

同時に、これら2つのスレッドに注意してください。これらは並行して実行され、結果は最初に出力され、遅延は少なくなります。2番目のフォーク... joinには次のような2つのサブスレッドが含まれます。

display (20, 'Thread1_0') display (30, 'Thread1_1')

これらの2つの子スレッドも並行して実行されます。

例2

module tb initial begin $display ('[%0t] Main Thread: Fork join going to start', $time) fork fork // Thread 1 #50 $display ('[%0t] Thread1_0 ...', $time) #70 $display ('[%0t] Thread1_1 ...', $time) begin #10 $display ('[%0t] Thread1_2 ...', $time) #100 $display ('[%0t] Thread1_2 finished', $time) end join // Thread 2 begin #5 $display ('[%0t] Thread2 ...', $time) #10 $display ('[%0t] Thread2 finished', $time) end // Thread 3 #20 $display ('[%0t] Thread3 finished', $time) join $display ('[%0t] Main Thread: Fork join has finished', $time) end endmodule Simulation Log ncsim> run [0] Main Thread: Fork join going to start [5] Thread2 ... [10] Thread1_2 ... [15] Thread2 finished [20] Thread3 finished [50] Thread1_0 ... [70] Thread1_1 ... [110] Thread1_2 finished [110] Main Thread: Fork join has finished ncsim: *W,RNQUIE: Simulation is complete.

注:begin ... endのステートメントは順番に実行されます



参照:
【1】https://www.chipverify.com/systemverilog/systemverilog-fork-join