如何让 fork join/join_any 与循环一起工作

jus*_*eep 1 system-verilog fork-join

根据SV LRM 第 9.3.2 节

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

这是如何fork在循环中创建一个。我已经试过了,它有效。但是,如果我想创建 forkjoin而不是join_none在循环中,它不会按预期工作,而是按顺序工作。

我如何修改它以使用 a 来工作join,我希望我的所有叉子同时分叉,然后等待所有叉子完成(join)或其中一个完成(join_any)?

谢谢

dav*_*_59 5

如果您想等待所有被 fork 分叉的进程fork-jone_none完成,您可以wait fork;在 for 循环之后放置一个语句。这些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
Run Code Online (Sandbox Code Playgroud)

要获得 的行为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;
Run Code Online (Sandbox Code Playgroud)