2012-05-10 39 views
3

我正在使用Icarus verilog来模拟相当复杂的设计。我发现,在一些极少数情况下,我的模拟会“卡住”,即时钟不再勾选,也没有任何信号出现变化。我怀疑这是因为我的设计中有一个组合逻辑循环。这个问题当然是,我不知道在哪里。在Icarus Verilog中调试组合逻辑循环

有没有一个系统的方法调试呢?我只是盯着代码,但我无法取得任何进展。任何建议,我可以尝试的东西非常感谢。

回答

3

当您运行模拟时,转储一个VCD文件。如果你有一个无限循环,你会看到VCD文件的大小继续增长,而没有新的时间写入文件。在一行的开始处用#表示时间。您将能够确定哪些信号在没有时间推进的情况下发生变化。

+1

除了在商业模拟器中使用step功能之外,很高兴知道这项技术。 –

+0

感谢您的回答,但仿真时间并不适合我。最后的#

+0

当模拟仍在运行时,您正在查看VCD文件吗? – toolic

0

国际海事组织,大多数时间发生无限循环与时钟生成。特别是如果你让他们设置产生可变频率。例如,如果你的时钟设置是这样的:

`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我认为) ,并恢复模拟。这样做几次,你就能够了解代码是否占用了所有模拟器的时间。

1

所以事实证明,Icarus Verilog的编译标志为“-pfileline = 1”。在打开此标志的情况下运行vvp会打印出大量有关正在执行的内容的调试信息。