如何使用fork join / join_any来处理循环

时间:2016-10-28 16:05:50

标签: system-verilog fork-join

根据SV LRM section 9.3.2

for(int j=1; j <=3; ++j)
fork
    automatic int k = j;
    begin
        .... # use k here
    end
join_none

这是在循环中创建fork的方法。我试过了它,它的工作原理。但是,如果我想在循环中使用join而不是join_none创建fork,则它不会按预期工作,而是按顺序工作。

如何使用join修改此功能,我希望我的所有叉子同时分叉然后等待所有它们完成(join)或其中一个完成( join_any)?

感谢

2 个答案:

答案 0 :(得分:3)

如果要等待fork-jone_none分叉的所有进程完成,则在for循环后放置wait fork;语句。 wait fork语句等待当前线程的所有子进程完成。

如果在fork-jone_none循环仍然处于活动状态之前for创建了一些您不想等待的进程,则需要将这段代码放在隔离线程中。

fork
  some_other_process;
join_none
fork 
  begin : isolation_process
    for(int j=1; j <=3; ++j) begin : for_loop
      fork
         automatic int k = j;
         begin
            .... # use k here
         end
      join_none
    end : for_loop
  wait fork; // will not wait for some other process
 end :isolation_thread
 join

要获得fork-join_any的行为,需要在每个过程中发出一些握手信号或事件来表明它已完成。

event join_any_event;
for(int j=1; j <=3; ++j) begin : for_loop
      fork
         automatic int k = j;
         begin
            .... # use k here
            ->> join_any_event;
         end
      join_none
    end : for_loop
  @join_any_event;

答案 1 :(得分:0)

您正在寻找wait fork。请参阅IEEE Std 1800-2012§9.6.1等待叉语句

  

wait fork 语句阻止进程执行流,直到所有直接子子进程(当前进程创建的进程,不包括其后代)完成执行。

在for循环后添加wait fork以获得所需的效果:

for(int j=1; j <=3; ++j)
fork
    automatic int k = j;
    begin
        .... # use k here
    end
join_none

wait fork; // wait for all the above fork-join_none to complete