parallel fork join parallel到底是什么?
What exactly does parallel fork join parallel?
我正在尝试执行 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?
当您将代码放入分叉连接时,所有代码都是并行执行的。我看不到它在 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;
我正在尝试执行 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?
当您将代码放入分叉连接时,所有代码都是并行执行的。我看不到它在 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;