在写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
波形图验证