Verilog 平行叉连接平行叉的确切方式是什么?

Verilog 平行叉连接平行叉的确切方式是什么?,verilog,Verilog,我试图实现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。但是,在我看来,is应该是1。因为a

我试图实现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。但是,在我看来,is应该是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
初始开始
"Ifdef FK
叉
"完"
$display(“初始时间%d,$time”);

a当您将代码放入fork-join时,所有代码都是并行执行的。我看不到中明确提到的,但我的理解是,对于并行块,执行顺序是不确定的。因此,您不知道模拟器是先执行
#1a=1;
还是
#1b=a+1;

第9.3.2节涵盖了平行块

当您在
initial
中有代码时,模拟器依次评估每一行,然后依次执行代码,这是确定的,代码按照写入的顺序执行

您的fork join的等效项是:

initial 
  a = 0;    

initial 
  b = 0;    

initial 
  #1 a = 1;  

initial
  #1 b = a + 1;

当你模拟它时会得到什么?