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

SystemVerilog:fork join块wait语句如何修改以输出i值5、2、7

问题原因

原代码运行无法得到预期结果的核心原因是循环变量i的共享访问问题:

  • for循环中声明的i是单个动态变量,所有fork...join_none派生的子线程会共享这同一个变量的内存空间
  • 循环在0时刻就会全部执行完成,此时i的值已经累加到8,所有子线程的wait语句实际判断的都是abc[8]的电平,永远等不到abc[5]、abc[2]、abc[7]的置位事件,自然无法输出预期值。
修改方案

只需要两个关键修改即可实现预期输出:

  1. 在fork块内声明automatic类型的局部变量,捕获每轮循环的i值,让每个子线程持有独立的索引副本,避免共享变量的覆盖问题
  2. 增加wait fork语句,等待所有派生的子线程执行完成,避免仿真提前退出导致打印语句不执行

修改后的完整可运行代码:

module tb#(int T=8);
  bit [8:0] abc;

  initial
    begin
      for(int i=0; i<T; i++)
      begin
        fork
          automatic int loc_i = i; // 每个子线程独立持有当前轮次的i值
          begin
            wait(abc[loc_i] == 1'b1);
            $display("i值为%0d,当前仿真时间%0t", loc_i, $time);
          end
        join_none
      end
      wait fork; // 等待所有fork出的子线程执行完毕
      $finish;
  end
  
  initial
    begin
      abc[5] = 1'b1;
      #10 abc[2] = 1'b1;
      abc[7] = 1'b1;
    end
endmodule
运行结果

代码运行后会正确输出三个预期索引值,其中5和7在0时刻同时置位,打印顺序可能因仿真器调度略有差异,2在10时刻打印:

i值为5,当前仿真时间0
i值为7,当前仿真时间0
i值为2,当前仿真时间10

内容的提问来源于stack exchange,提问作者soumyajit ghosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:00:49