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]的置位事件,自然无法输出预期值。
修改方案
只需要两个关键修改即可实现预期输出:
- 在fork块内声明automatic类型的局部变量,捕获每轮循环的i值,让每个子线程持有独立的索引副本,避免共享变量的覆盖问题
- 增加
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
相关产品推荐
相关产品推荐

