我正在使用Icarus verilog来模拟相当复杂的设计。我发现,在一些极少数情况下,我的模拟会“卡住”,即时钟不再勾选,也没有任何信号出现变化。我怀疑这是因为我的设计中有一个组合逻辑循环。这个问题当然是,我不知道在哪里。在Icarus Verilog中调试组合逻辑循环
有没有一个系统的方法调试呢?我只是盯着代码,但我无法取得任何进展。任何建议,我可以尝试的东西非常感谢。
我正在使用Icarus verilog来模拟相当复杂的设计。我发现,在一些极少数情况下,我的模拟会“卡住”,即时钟不再勾选,也没有任何信号出现变化。我怀疑这是因为我的设计中有一个组合逻辑循环。这个问题当然是,我不知道在哪里。在Icarus Verilog中调试组合逻辑循环
有没有一个系统的方法调试呢?我只是盯着代码,但我无法取得任何进展。任何建议,我可以尝试的东西非常感谢。
当您运行模拟时,转储一个VCD文件。如果你有一个无限循环,你会看到VCD文件的大小继续增长,而没有新的时间写入文件。在一行的开始处用#
表示时间。您将能够确定哪些信号在没有时间推进的情况下发生变化。
国际海事组织,大多数时间发生无限循环与时钟生成。特别是如果你让他们设置产生可变频率。例如,如果你的时钟设置是这样的:
`timescale 1ns/1ns
real period;
reg clk;
initial begin
period = 5.0;
clk = 1'b0;
forever begin
#(period/2) clk = !clk;
end
end
如果你改变,如果你改变period
为0.0意外period
然后无限循环可能发生。
即使更复杂,有时period/2
可能会超出您的时间范围精度。例如,如果您设置了period = 1.0
,那么period/2
为0.5,并且由于您的时间精度为1ns,因此会捕捉到0,导致无限循环。如果我怀疑这一点,我通常会在我进入延迟之前的一段时间留下一名后卫(再次,谨慎,精确......)。
...
half_period_ns = period_ns/2.0;
if(half_period_ns == 0)
half_period_ns = 1;
#(half_period_ns) clk = !clk;
...
另一件事要做的,就是在交互模式和随机按Ctrl-C型,模拟在命令问模拟器,它在(模拟特定的,可悲的是,但在犀利它where
我认为) ,并恢复模拟。这样做几次,你就能够了解代码是否占用了所有模拟器的时间。
所以事实证明,Icarus Verilog的编译标志为“-pfileline = 1”。在打开此标志的情况下运行vvp会打印出大量有关正在执行的内容的调试信息。
除了在商业模拟器中使用step功能之外,很高兴知道这项技术。 –
感谢您的回答,但仿真时间并不适合我。最后的#
当模拟仍在运行时,您正在查看VCD文件吗? – toolic