Time modelsim中的时间刻度定义
我在用verilog工作台模拟我的系统时遇到了一个问题。我有一个信号clk_out,我想从中测量并自动检查周期和高、低时间。信号clk_out的周期为1秒,高时间和低时间均为500msTime modelsim中的时间刻度定义,time,verilog,modelsim,Time,Verilog,Modelsim,我在用verilog工作台模拟我的系统时遇到了一个问题。我有一个信号clk_out,我想从中测量并自动检查周期和高、低时间。信号clk_out的周期为1秒,高时间和低时间均为500ms `timescale 1ms / 1ps module tb; parameter PASSED = 1; parameter FAILED = 0; wire clk_out; reg reset_n; reg result; realtime time1; realtime time2; realti
`timescale 1ms / 1ps
module tb;
parameter PASSED = 1;
parameter FAILED = 0;
wire clk_out;
reg reset_n;
reg result;
realtime time1;
realtime time2;
realtime time3;
initial begin
result = PASSED;
reset_n = 1'b0;
// stay in reset for 100ms
reset_n = #100 1'b1;
@(negedge clk_out);
time1 = $realtime;
@(posedge clk_out);
time2 = $realtime;
@(negedge clk_out);
time3 = $realtime;
$display("\n");
$display("period is %f, high time is %f, and low time is %f",time3-time1,time3-time2,time2-time1);
$display("\n");
if (time3-time1 <= 999 || time3-time1 >= 1001) begin
result = FAILED;
end
if (time2-time1 <= time3*0.998/2 || time2-time1 >= time3*1.002/2) begin
result = FAILED;
end
if (time3-time2 <= time3*0.998/2 || time3-time2 >= time3*1.002/2) begin
result = FAILED;
end
$display("\n");
$display("=================================================");
if (result) begin
$display("Test is PASSED");
end else begin
$display("Test is FAILED");
end
// create the 1Hz signal when not in reset
my_module my_module_under_test
(
.RESET_N (reset_n),
.CLK_OUT (clk_out)
);
modelsim输出如下:
周期为1000000000.000000,高时间为500000000.000000,低时间为500000000.000000
=================================================
测试失败
===================模拟结束===============
似乎模拟器没有读取文件顶部定义的时间刻度。我希望:
时间3-时间1=1000.00000
时间2-时间1=500.00000
时间3-时间2=500.00000
我做错了什么
谢谢有两种可能性:
检查模块my_module…(我的模块)上面声明的时间刻度,模块将使用此时间刻度。如果文件中未声明时间刻度,则将使用最近声明的时间刻度;编辑订单很重要。如果没有声明以前编译的时间刻度,那么它将使用模拟器的默认时间刻度
如果使用命令行选项-timescale timeunit/timeprecision,它将显示全局时间刻度,并且verilog文件中的任何声明都将被忽略
我已将您的代码转换为一个独立的测试,没有my_模块 它的输出与您预期的一样
# time3-time1 : 1000.000000
# time3-time2 : 500.000000
# time2-time1 : 500.000000
如果您仍然存在问题,我建议您的my_模块中存在一个问题,即时钟没有以正确的频率运行
小贴士:
1我将更改您应用重置的方式,从:
// stay in reset for 100ms
reset_n = #100 1'b1;
到
最后一个版本将依次等待100毫秒,然后释放重置,然后继续测试程序的其余部分
2如果您的模拟器支持,则使用时间说明符有助于消除对时间刻度的依赖。ps微微秒,ns纳秒,ms毫秒,s秒。您好,实际上,我在调试模块时对其进行了一些更改,但出现了一个错误。我完全忘了删除这些更改。错误是:我更改了时间刻度,但没有更改代码行中的数字,因此clk_out频率是错误的。谢谢你的建议。@grorel我想我们都去过那里。这就是为什么我现在总是使用ns等。
// stay in reset for 100ms
#100ms reset_n = 1'b1;