Time modelsim中的时间刻度定义

Time 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

我在用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;
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;