V/SV 时延控制

例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
V/SV 时延控制
如果改成

initial begin
	fork
		...
		begin
		#3; 
		int_a=4;
		end
 	join

	fork
		...
		#3 int_a=4;
 	join

结果均是7
V/SV 时延控制
解析:

  1. begin-end内各部分串行且延时累加,先执行完fork-join,再依次执行#1,int_b=3, display
  2. 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

上一篇:编写多线程的时候,最好不要再用fork函数,下面是一个多线程使用fork后的例子


下一篇:如何给开源仓库贡献代码