testbench——信号的产生

在写testbench时候,需要对各种信号根据时间进行设置。

注意所有需要输入被测试模块的信号均为reg型。

module test();

reg clk;
reg sig1, sig2, sig3, sig4, sig5;
常见信号设置方式

时钟信号一般通过forever语句设置,产生连续时钟。

initial begin
	clk = 1'b0;
	forever #5 clk = ~clk;
end
信号设置方式1:相对时间

initial begin
	sig1 = 1'b0;
	#5 sig1 = 1'b1;
	#25 sig1 = 1'b0;
	#50 sig1 = 1'b1;
end
这样赋值后,初始值为0,5ns时置为1,30ns时置为0,80ns时置为1:时间是相对时间,连续累加的。

信号设置方式2:绝对时间

initial fork
	sig2 = 1'b1;
	#5 sig2 = 1'b0;
	#30 sig2 = 1'b1;
	#42 sig2 = 1'b0;
join
这样赋值后,初始值为1,5ns时置为0,30ns时置为1,42ns时置为0:时间即信号变动的绝对时间。

信号设置方式3:混合时间

initial fork
	begin
		sig3 = 1'b0;
		#16 sig3 = 1'b1;
		#35 sig3 = 1'b0;
	end
	begin
		#56 sig3 = 1'b1;
	end
join
在每个begin-end中,时间为相对时间;多个begin-end块之间为绝对时间。该信号初始值为0,16ns置1,(16+35=)51ns置0,56ns置1。

信号设置方式4

若给信号与其他信号相关,可加入@

initial begin
	sig4 = 1'b0;
	@(posedge sig3);
		sig4 = 1'b1;
end

在sig3由0置1时,sig4发生变化。

信号设置方式5

信号需要重复一定次数,可采用repeat语句

initial begin
	sig5 = 1'b0;
	@(posedge sig3);
		repeat(4) @(negedge clk) sig5 = ~sig5;
end

仿真终止时间设定

initial #100 $finish;

总代码
module test();

reg clk;
reg sig1, sig2, sig3, sig4, sig5;

initial begin
	clk = 1'b0;
	forever #5 clk = ~clk;
end

initial begin
	sig1 = 1'b0;
	#5 sig1 = 1'b1;
	#25 sig1 = 1'b0;
	#50 sig1 = 1'b1;
end

initial fork
	sig2 = 1'b1;
	#5 sig2 = 1'b0;
	#30 sig2 = 1'b1;
	#42 sig2 = 1'b0;
join

initial fork
	begin
		sig3 = 1'b0;
		#16 sig3 = 1'b1;
		#35 sig3 = 1'b0;
	end
	begin
		#56 sig3 = 1'b1;
	end
join

initial begin
	sig4 = 1'b0;
	@(posedge sig3);
		sig4 = 1'b1;
end

initial begin
	sig5 = 1'b0;
	@(posedge sig3);
		repeat(4) @(negedge clk) sig5 = ~sig5;
end

initial #100 $finish;
endmodule

波形图验证
















原文地址:https://www.cnblogs.com/mingmingruyue99/p/7202013.html