我正在尝试实现fork join Verilog代码,但是出了点问题:
reg [7:0] a, b;
initial fork
a = 0; // initial
b = 0; // initial
#1 a = 1;
#1 b = a + 1; // is b 1 or 2?
join
上述代码令人困惑,因为b
是一个非常模糊的值。
据我所知,fork join是并行的,所以我认为b
应该是1.我是对的吗?
我的模拟结果是'b'是2而不是1.但是,在我看来,应该是1.因为a现在还不是1。
我试图制作一些像这样的示例代码。
Initial
$display("initial time = %d", $time);
Fork
#1000 $display("spend time = %d at #1000", $time);
#5 $display("spend time = %d at #5", $time);
#50 $display("spend time = %d at #50", $time);
join
$display("main process time = %d", $time);
end
然后我得到了如下。 初始时间0 花时间5 花时间50 花1000时间 主要处理时间1000
所以从这个实验中,我得到了关于fork join的信息。
所以我再尝试一次。
Initial begin
'Ifdef FK
fork
'endif
$display ("initial time %d , $time);
a<=0;
b<=0;
#100 a<=1;
#100 b<=a+1;
'Ifdef FK
join
'Endif
$display ("the output a,b %d %d time %d, a,b, $time);
End
结果是这样的 0,0,100 当关闭FK时 1,0,200 但我不明白上面的结果。为什么他们有0,0,100和1,0,200?
答案 0 :(得分:1)
当您将代码放入fork连接时,它将全部并行执行。我无法在LRM中明确提到它,但我的理解是,对于并行块,执行的顺序不是确定性的。因此,您不会先知道模拟器是先执行#1 a = 1;
还是#1 b = a + 1;
。
SystemVerilog IEEE1800-2012的第9.3.2节涵盖了并行块。
当您在initial
中有代码时,代码将由模拟器依次执行,依次评估每一行,这是确定性的,代码按写入的顺序执行。
你的fork join的等价物是:
initial
a = 0;
initial
b = 0;
initial
#1 a = 1;
initial
#1 b = a + 1;