在 Icarus Verilog 中调试组合逻辑循环

问题描述 投票:0回答:3

我正在使用 Icarus verilog 来模拟相当复杂的设计。我发现在极少数情况下,我的模拟会“卡住”,即时钟不再滴答作响,并且所有信号似乎都没有改变。我怀疑这是因为我的设计中有一个组合逻辑循环。当然,问题是我不知道在哪里。

有没有系统的方法来调试这个?我只是认真地盯着代码,但无法取得任何进展。非常感谢任何关于我可以尝试的事情的建议。

verilog iverilog
3个回答
3
投票

运行模拟时,转储 VCD 文件。如果有无限循环,您将看到 VCD 文件大小继续增长,而没有将新时间写入文件。时间由行首的

#
表示。您将能够确定哪些信号正在变化,而无需时间推进。


3
投票

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


1
投票

IMO,大多数情况下,无限循环发生是在时钟生成过程中。特别是如果您将它们设置为生成可变频率。例如,如果您的时钟设置如下:

`timescale 1ns / 1ns
 real period;
 reg clk;

 initial begin
     period = 5.0;
     clk = 1'b0;
     forever begin
         #(period/2) clk = !clk;
     end
end

如果您更改

period
,那么如果您不小心将
period
更改为 0.0,可能会发生无限循环。

更棘手的是,有时

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,输入命令来询问模拟器它在哪里(遗憾的是模拟器特定,但在 Incisive 中我认为是

where
),然后恢复模拟。这样做几次,您将能够了解代码占用了模拟器的所有时间。

© www.soinside.com 2019 - 2024. All rights reserved.