System verilog 系统verilog中for循环内的fork-join
问题:这段代码的输出是什么?为什么System verilog 系统verilog中for循环内的fork-join,system-verilog,System Verilog,问题:这段代码的输出是什么?为什么 module tb; int i; initial begin for(i=0; i<10; i++) begin fork #1 $display("Value = %d", i); join_none end end endmodule 模块tb; int i; 初始开始 对于(i=0;i示例启动$display的10个并行线程,并在将
module tb;
int i;
initial begin
for(i=0; i<10; i++)
begin
fork
#1 $display("Value = %d", i);
join_none
end
end
endmodule
模块tb;
int i;
初始开始
对于(i=0;i示例启动$display的10个并行线程,并在将来调度每个#1。它们打印值10,因为没有时间阻止(join#none根本不阻止)循环,因此循环在t=0时执行其所有迭代
添加了一些打印执行时间,以便更容易看到正在发生的事情。执行线程不会等待其中任何一个完成(join_none),因此最终打印在t=0时执行
模拟输出在这里
如果需要进一步研究,请参阅IEEE 1800-2017第9.3.2节平行块。
如果您想运行它,请访问www.edaplayplace.com,您可以使用几乎免费的行业标准工具运行它(需要通过电子邮件注册)。要生成包含所有可能索引值的fork线程,您可以在for loop中使用自动变量
module tb;
int i;
initial begin
for(i=0; i<10; i++)
begin
automatic int j = i;
fork
#1 $display("Value = %d", **j**);
join_none
end
end
endmodule
要理解自动变量生命周期概念,包括“fork-inside-for”,请参考SV LRM“6.21范围和生命周期”,或者您可以找到许多关于此主题的线程,例如:
Value = 0
Value = 1
Value = 2
Value = 3
Value = 4
Value = 5
Value = 6
Value = 7
Value = 8
Value = 9