我正在使用Icarus verilog来模拟一个相当复杂的设计。我发现在极少数情况下,我的模拟会“卡住”,也就是说,时钟不再滴答作响,信号似乎也没有变化。我怀疑这是因为我的设计中有一个组合逻辑循环。当然,问题是我不知道在哪里。
有没有一种系统的方法来调试这个?我只是非常努力地盯着代码,但我无法取得任何进展。对于我可以尝试的任何建议,我都非常感谢。
发布于 2012-05-10 21:26:07
运行仿真时,请转储VCD文件。如果您有一个无限循环,您将看到VCD文件大小继续增长,而没有新的时间写入该文件。时间由行首的#表示。你将能够确定哪些信号在没有时间推进的情况下发生变化。
发布于 2012-05-12 10:30:41
因此,Icarus Verilog对此有一个编译标志"-pfileline=1“。在打开此标志的情况下运行vvp会打印出大量有关正在执行的调试信息。
发布于 2012-05-10 21:56:35
在大多数情况下,无限循环都是通过时钟生成来实现的。特别是当你把它们设置成产生可变频率的时候。例如,如果您的时钟设置如下:
`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,并且由于时间精度为1 is,因此该值将捕捉到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 ),然后恢复模拟。这样做几次,你就能了解到代码占用了模拟器的所有时间。
https://stackoverflow.com/questions/10528457
复制相似问题