您的位置:首页 > 其它

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

2018-03-12 15:26 309 查看
这个问题不是UVM特定的,但我正在处理的示例与UVM相关。我在UVM环境中有几个agents,我想在所有这些agents上并行启动sequence。
如果我如下图这样做:foreach (env.agt[i])begin
seq.start(env.agt[i].sqr);
endseq首先在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 endwait 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐