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
修改如下: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
如果我如下图这样做: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
相关文章推荐
- Java使用Fork/Join框架来并行执行任务
- 我的Java开发学习之旅------>Java使用Fork/Join框架来并行执行任务
- Java使用Fork/Join框架来并行执行任务
- Java使用Fork/Join框架来并行执行任务
- Java使用Fork/Join框架来并行执行任务
- 当forEach碰到表格,怎样才能更美观
- nginx如何配置才能与Tomcat一起使用呢?
- 一个使用TBB Lambda 表达式实现并行执行的例子
- C# 使用Parallel并行开发Parallel.For、Parallel.Foreach实例
- Linux怎样在某一特定时间执行命令(使用at”和“batch”)
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
- 一起谈.NET技术,VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)
- JXLS的使用中,某单个单元格的数据需要通过foreach和if才能得到,使用jxls如何使用
- jdk8中的forEach使用return执行下一次遍历
- GCD使用 串行并行队列 与 同步异步执行的各种组合 及要点分析
- Xmanager中怎样才能使用单窗口模式
- 在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。(以解决)
- Oracle多线程并行使用、关联与指定索引执行
- C# 使用Task实现任务超时,多任务一起执行
- java并行计算Fork和Join的使用