请注意第二种情况下
#10
延迟后的分号。
我以为我理解了
fork-join
,但在这些输出之后,我认为我不明白。有人可以解释一下为什么分号造成了差异吗?当延迟后面有分号时,代码如何在fork-join
中流动?
第一种情况,代码是:
module waveform_fork_join();
reg A,B,C,D,E,F,en;
initial
fork
en = 1'b0; A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; E = 1'b1; F = 1'b1;
#10 begin
A = 1'b0; B = 1'b1; C = 1'b1;
end
#20 begin
A = 1'b1; B = 1'b0; D = 1'b1; E = 1'b0;
end
#30 begin
B = 1'b1; E = 1'b1; F = 1'b0;
end
#40 begin
en = 1'b1; B = 1'b0; D = 1'b0; F = 1'b1;
end
#50 begin
B = 1'b1;
end
#60 begin
B = 1'b0; D = 1'b1;
end
#70 B = 1;
#80 $finish;
join
endmodule
第二种情况,代码是:
module waveform_fork_join1();
reg A,B,C,D,E,F,en;
initial
fork
en = 1'b0; A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; E = 1'b1; F = 1'b1;
#10; begin
A = 1'b0; B = 1'b1; C = 1'b1;
end
#20; begin
A = 1'b1; B = 1'b0; D = 1'b1; E = 1'b0;
end
#30; begin
B = 1'b1; E = 1'b1; F = 1'b0;
end
#40; begin
en = 1'b1; B = 1'b0; D = 1'b0; F = 1'b1;
end
#50; begin
B = 1'b1;
end
#60; begin
B = 1'b0; D = 1'b1;
end
#70; B = 1;
#80 $finish;
join
endmodule
在
waveform_fork_join
中,在时间 10,执行 begin/end
块,切换信号。
在
waveform_fork_join1
中,在时间 10,什么也没有发生,因为分号创建了一个 null 语句。与 begin/end
位于同一行的 #10;
块是一个完全独立的语句,在时间 0 执行。
您编写代码的方式非常混乱。首先,对于这样一个简单的例子来展示行为的差异,不需要这么多变量。考虑这种编写代码的替代方法:
module waveform_fork_join();
reg A,B;
initial
fork
A = 1'b1;
B = 1'b0;
#10 begin
A = 1'b0;
B = 1'b1;
end
#20 begin
A = 1'b1;
B = 1'b0;
end
#30 begin
B = 1'b1;
end
join
endmodule
module waveform_fork_join1();
reg A,B;
initial
fork
A = 1'b1;
B = 1'b0;
#10;
begin
A = 1'b0;
B = 1'b1;
end
#20;
begin
A = 1'b1;
B = 1'b0;
end
#30;
begin
B = 1'b1;
end
join
endmodule
也许这更清楚地表明,这 3 个延迟语句与
begin/end
代码无关。