SystemVerilog fork join_any

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

发布了71 篇原创文章 · 获赞 8 · 访问量 7398

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104579128