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

时间:2012-05-10 06:18:46

标签: verilog icarus

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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) ,并恢复SIM卡。这样做几次,你就可以知道代码占用了所有模拟器的时间。