SystemVerilog通过fork…join_any提供了原始版本的变体。如果有任何一个子线程完成,则fork…join_any将允许主线程继续执行位于fork之后的其他语句。 如果启动了五个线程,则仅当五个线程中的任何一个完成执行时,主线程才会恢复执行。 一旦主线程恢复运行,启动的其余四个线程将继续在后台运行。
Syntax
fork
// Thread 1
// Thread 2
// ...
// Thread N
join_any
fork join_any Example
module tb;
initial begin
$display ("[%0t] Main Thread: Fork join going to start", $time);
fork
display (20, "Thread1_0");
display (30, "Thread1_1");
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.
嵌套fork…join_any
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_any
display (10, "Thread2");
join_any
$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
[10] Main Thread: Fork join has finished
[20] Thread1_0
[30] Thread1_1
ncsim: *W,RNQUIE: Simulation is complete.
ncsim> exit
参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-fork-join-any