systemverilog中怎样才能使用foreach和fork一起并行执行?

这个问题不是UVM特定的,但我正在处理的示例与UVM相关。我在UVM环境中有几个agents,我想在所有这些agents上并行启动sequence。

如果我如下图这样做:

foreach (env.agt[i])begin
   seq.start(env.agt[i].sqr);
end

seq首先在env.agt [0].sqr上执行。一旦完成,它就会执行env.agt[1].sqr,这种方式是按顺序执行sequence。但是我想实现一个foreach-fork语句,以便在所有agt[i].sqr上并行执行seq。

一开始,我测试了如下方法,均不可行。

foreach (env.agt[i])
  fork
    seq.start(env.agt[i].sqr);
  join
fork
  foreach (env.agt[i])
    seq.start(env.agt[i].sqr);
  join

后来记得在fork join块中使用for循环的例子:估计索引i并没有传递到子线程中。

修改如下:

foreach (env.agt[i])
  begin
    automatic int var_i = i;
    fork
      seq.start(env.agt[var_i].sqr);
    join_none // non_blocking, allow next operation to start
  end
wait fork;// wait for all forked threads in current scope to end

wait fork会阻止当前线程,直到所有子线程完成。 如果有其他更早的fork join_none语句不需要等待它们完成,那么必须小心。 如果有的话,你需要创建一个隔离线程。即用fork_join语句将上图的表达式隔离。

完整代码如下图所示:

fork 
   begin :isolating_thread
      foreach (env.agt[i])
        begin
          automatic int var_i = i;
          fork
            seq.start(env.agt[var_i].sqr);
          join_none // non_blocking, allow next operation to start
        end
      wait fork;// wait for all forked threads in current scope to end
   end :isolating_thread
join




版权声明:本文为zhajio原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。