1.`timescale
`timescale后跟计时单位 / 仿真精度,如在testbench前有
`timescale 1ns / 1ps
此时仿真时钟语句
initial begin
clk = 0;
forever #5 clk = !clk;
end
可以看到此时 #5 是延时 5ns,精度为1ps
修改为
`timescale 10ns / 1ns
仿真结果
可以看到 #5 已经是延时50ns了
2.event
写的比较乱,就想到什么写什么吧。
event“事件”只能出现在testbench里,设定一个事件之后对事件进行监测,满足事件的话就出发相应的结果。很多时候事件是可以被其他代码替代的,使用它其实更多是为了让代码的可读性更高。
设定事件:event event_signal;
触发事件:#20 -> event_signal;
监测事件:@(event_signal) begin...end
代码测试
//event
event event_test;
reg event_signal1, event_signal2;
initial begin
#20 -> event_test;
end
initial begin
event_signal1 = 0;
event_signal2 = 0;
@(event_test) begin
fork begin
repeat (10) begin
@(posedge clk)
event_signal1 = $random;
end
end join
fork begin
repeat (10) begin
@(posedge clk)
event_signal2 = !event_signal2;
end
end join
end
end
波形图:
3.force-release
force-release用来强制复制和释放端口,在仿真inout口的时候经常可以用到。
reg [1:0]force_test1, force_test2;
initial begin
force_test1 = 0;
force_test2 = 0;
#10
force_test1 = 1;
assign force_test2 = 1;
#10
force force_test1 = 3;
force force_test2 = 3;
#10
release force_test1;
release force_test2;
end
仿真这段代码时候,由于assign语句的使用,产生了以外的结果。
modelsim的仿真结果:
ISE的仿真结果:
经过查证modelsim的波形应该是正确波形,对这个时我会再用其他仿真软件仿一下。