【问题标题】:Wait for only some threads to complete after fork join_none in SystemVerilog在 SystemVerilog 中 fork join_none 后只等待一些线程完成
【发布时间】:2021-08-24 16:38:59
【问题描述】:

在 SystemVerilog 中,我需要等待一些在 fork join_none 结构中执行的线程完成。但是在另一个 fork join_none 结构中还有另一个进程永远不会结束。

我的代码如下所示:

  fork
     process_that_will_never_end();
  join_none

  fork
     for(int i = 0; i < 40; i++) begin
        fork
           process_that_must_end(i);
        join_none
     end
  join

包含 for 循环的 fork 连接没有效果(这是我所期望的)。我想过在最后使用“等待叉”,但这也会等待 process_that_will_never_end(),所以它不会工作。

有没有办法只等待所有 process_that_must_end() 线程完成?

【问题讨论】:

    标签: system-verilog fork-join


    【解决方案1】:

    你几乎拥有它。您只需要将begin/end 的范围移到for 循环之外。那么wait fork 只适用于第二个fork 的孩子。

    fork : first_fork
         process_that_will_never_end();
    join_none
    
    fork begin : second_fork
      for(int i = 0; i < 40; i++) 
         fork : third_forks
           automatic int k = i;
           process_that_must_end(k);
         join_none
       wait fork;
    end join
    

    【讨论】:

    • 谢谢戴夫!以防万一这对其他人有用。我需要在“fork:third_forks”行之后添加“automatic int k = i”,并在 process_that_must_end(k) 中将变量 i 更改为 k。如果没有,它将始终执行“process_that_must_end(40)。
    • 是的,如果代码尚未在具有自动变量生命周期的作用域中(如类方法),则需要 automatic
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2015-08-29
    • 2011-06-09
    相关资源
    最近更新 更多