You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:24:09