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



  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值