我正在使用Icarus verilog来模拟一个相当复杂的设计。我发现在极少数情况下我的模拟会“卡住”,即时钟不再打勾而且没有任何信号出现变化。我怀疑这是因为我的设计中有一个组合逻辑循环。当然,问题在于我不知道在哪里。
有没有系统的方法调试这个?我只是盯着代码,但我无法取得任何进展。关于我可以尝试的事情的任何建议都非常感谢。
答案 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卡。这样做几次,你就可以知道代码占用了所有模拟器的时间。