fork/join_any退出后其内部的无限while循环是否会终止运行?
结论
你观察到的现象完全符合SystemVerilog的语法规则,你的预期和实际运行逻辑确实不一致,fork/join_any退出后第一个while循环会继续执行。
原因说明
SystemVerilog中fork...join系列并行块的三种结束策略定义如下:
join:等待并行块内所有线程全部执行完成,才会继续执行join后的后续代码join_any:仅等待并行块内第一个执行完成的线程结束,就会立刻执行join_any后的后续代码,剩余未结束的线程会继续在后台运行,不会被自动终止join_none:不等待任何并行块内的线程,直接执行后续代码,所有并行块内的线程都在后台异步运行
你的代码中第二个线程的判断条件满足触发break后,该线程就执行结束,join_any就会退出并执行后续的$info("after join any"),但第一个无限循环的线程没有被终止,因此会持续打印i am here日志。
实现预期效果的方案
如果你需要join_any退出时自动终止所有并行块内的剩余线程,需要主动调用disable fork语句。为了避免误杀当前fork块外部的其他线程,建议将整个fork块包裹在独立的begin...end作用域内,修改后的代码示例如下:
begin // 独立作用域,避免disable fork误杀外部线程 fork begin while(1) begin @(posedge trigger_clock); // do something $info("i am here"); end end begin while(1) begin @(posedge trigger_clock); if(condition is true) begin break; end end end join_any disable fork; // 主动终止当前作用域内fork启动的所有剩余活跃线程 $info("after join any"); end
内容的提问来源于stack exchange,提问作者frank_crane
相关产品推荐
相关产品推荐

