例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
本文通过AMD例子解释SystemVerilog中时延控制的区别。在fork-join结构中,各部分并行执行,时延为相对起始点的绝对值。修改代码会影响执行顺序和时延效果。
3402

被折叠的 条评论
为什么被折叠?



