首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Icarus Verilog中调试组合逻辑循环

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

Stack Overflow用户
提问于 2012-05-10 14:18:46
回答 3查看 2.7K关注 0票数 4

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-10 21:26:07

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-12 10:30:41

因此,Icarus Verilog对此有一个编译标志"-pfileline=1“。在打开此标志的情况下运行vvp会打印出大量有关正在执行的调试信息。

票数 3
EN

Stack Overflow用户

发布于 2012-05-10 21:56:35

在大多数情况下,无限循环都是通过时钟生成来实现的。特别是当你把它们设置成产生可变频率的时候。例如,如果您的时钟设置如下:

代码语言:javascript
复制
`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,从而导致无限循环。如果我怀疑这一点,我通常会在进入延迟之前设置一个时间守卫(同样,要小心精确...)。

代码语言:javascript
复制
...
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 ),然后恢复模拟。这样做几次,你就能了解到代码占用了模拟器的所有时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10528457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档