例1. (AMD) 打印结果是什么?
module tb();
int int_a,int_b;
initial begin
fork
begin
#2;
int_a=1;
int_b=2;
end
#3;
int_a=4;
join
#1;
int_b=3;
$display("%d", int_a+int_b);
#100 $stop;
end
endmodule
4
如果改成
initial begin
fork
...
begin
#3;
int_a=4;
end
join
或
fork
...
#3 int_a=4;
join
结果均是7
解析:
- begin-end内各部分串行且延时累加,先执行完fork-join,再依次执行#1,int_b=3, display
- fork-join内各部分并行且延时是相对共同起始点的绝对值,所以修改前同时执行begin-end, #3, int_a=4,所以这里int_a在0ns就被赋值为4了;修改后同时执行两个begin-end,int_a在3ns被赋值为4
Verilog 时序控制
https://www.runoob.com/w3cnote/verilog-timing-control.html