在我的Verilog测试平台中,我正在使用timescale 1 ns / 1 ns
和$timeformat
,如下所示:
initial $timeformat(-3 , 6, " ms", 14);
在GUI模式(ModelSim)下运行时,调试提示符如预期的那样,例如:
# 0.000000 ms WDOG : *** tc_can_init_check alive: simulation break at 0.200000 ms
# 0.000225 ms INFO : ############################################
# 0.000225 ms INFO : #
# 0.000225 ms INFO : # starting test sequence
# 0.000225 ms INFO : #
# 0.000225 ms INFO : ############################################
请注意,第一行simulation break at 0.200000 ms
的时间格式以及每行开头的时间戳格式(0.000225 ms
表示225纳秒,与``timescale”相对应)是预期的。
现在,当以批处理模式运行ModelSim时,似乎$timeformat
不再被正确考虑:
# 0.000000 ms WDOG : *** tc_can_init_check alive: simulation break at 0.200000 ms
# 224.999000 ms INFO : ############################################
# 224.999000 ms INFO : #
# 224.999000 ms INFO : # starting test sequence
# 224.999000 ms INFO : #
# 224.999000 ms INFO : ############################################
请注意,第一行simulation break at 0.200000 ms
的格式仍然符合预期,但是每行开头的时间戳格式是错误的! (224.999000 ms
基本上是正确的时间,但以6位小数表示-即以纳秒为单位显示时间)。
在我看来,$timeformat
在(ModelSim)以批处理模式运行时被忽略了。
为什么?! 以及如何克服这个问题?
我可以发现的这两种情况之间的唯一区别是GUI模式与批处理模式:
有人可以给我提示吗?
答案 0 :(得分:0)
对单个文件的简单测试将证明问题不在于$ timeformat
`timescale 1ns/1ns
module top;
initial begin
$timeformat(-3 , 6, " ms", 14);
#225000;
$display("time : %t",$realtime);
end
endmodule
尝试在GUI中批量运行以上命令,看看是否有区别。否则,您需要向我们显示您正在使用的确切命令行。
答案 1 :(得分:0)
感谢dave_59提醒我分而治之:)
在实现您的示例并在我的环境中获得相同(差)结果之后,我从头开始创建了一个完全独立的测试环境:在这个新环境中,一切都按预期工作!
所以我试图通过逐步注释脚本集中的部分来找出根本原因。
最后证明是sim.do
文件引起了问题。不论批处理或GUI模式如何,它都会在其中读取:
run 1 ns
restart -f
run -all
此序列的原因是为了加快仿真时间:发出restart
命令后,仿真似乎运行得更快。我无法解释,但这是我一开始就发现的。从那时起,这个序列就在那里了;)
现在我已经像这样修改它了:
if [batch_mode] {
run -all
} else {
run 1 ns
restart -f
run -all
}
=>通过这种治疗,所有问题都消失了!
也许ModelSim restart
命令在批处理而不是在GUI模式下的行为略有不同?