System Verilog 首先对fork…join_none里的线程进行调度,但是由于#0
时延阻塞了当前线程,并且将它重新调度到当前时间片之后启动时延使得当前线程必须等到所有在fork…join_none语句中产生的线程执行完之后才得以运行。
program no_auto;
initial begin
for (int j=0; j<3; j++)
fork
$write(j); // 漏洞——得到的是最终的索引值
join_none
# 0 $display("\n");
end
endprogram
"""
输出 3 3 3
"""
应该在fork…join_none语句中使用自动变量来保存变量的拷贝。带初始化的自动变量声明在for循环的线程里运行。在每次循环中,k的一个拷贝被创建并被赋予当前的j值。**在循环完成后,#0阻塞了当前线程,因此三个线程一起运行,打印出各自拷贝的k值。**当线程运行完毕后,在当前时间片已经没有其他时间残留,SV进入下一个语句$display的执行。
program auto;
initial begin
for (int j=0; j<3; j++)
fork
automatic int k=j; // 创建索引的拷贝
$write(j); // 打印拷贝值
join_none
# 0 $display("\n");
end
endprogram
"""
输出 0 1 2
"""