3

I'm writing VHDL code for a d-flip-flop on Modelsim and I get an error when I try to simulate it:

Error: (vsim-3601) Iteration limit reached at time 400 ps.

I'm not sure what it means, but I've looked through much of my source code for errors to no success. Can anyone guess what the problem might be?

4

6 回答 6

4

此错误通常表明 ModelSim 陷入了无限循环。在 VHDL 中,当一个信号被放置在敏感度列表中并且这个信号在这个过程中被改变时,就会发生这种情况。信号改变,触发流程,流程改变,信号再次触发流程,循环继续。

以下是导致无限循环的过程的简单示例:

PROCESS (count)

BEGIN

count <= not count;

END PROCESS;
于 2013-05-13T21:36:11.713 回答
2

如果达到您的迭代限制,则意味着系统尚未稳定。很可能是这样的:

a <= b;

--- and then later...

b <= a;

于 2012-02-14T00:52:20.487 回答
2

我只是有一个类似的问题。

我修复它的方法只是增加测试台的延迟。我将延迟从100psto更改1ns为已修复!因为 的延迟FOR LOOP超过了 PicoSeconds 的范围。

于 2019-04-04T18:08:22.893 回答
1

大多数人对 VHDL 或任何其他 HDL 语言的一个问题是他们不明白这不是顺序代码。您在流程中拥有的一切都是并行发生的。Ahmed 的例子是一个很好的例子:

PROCESS (count)

BEGIN

count <= not count;

END PROCESS;

HDL 模拟器会尝试在每次模拟滴答后将计数值设置为“不计数”,并且由于计数值发生更改,因此更改将触发另一个滴答,并且它会一直持续到崩溃或为您提供上述信息问题。

要使 HDL 正常工作,您必须使用延迟(以时钟形式或如果不是用于综合)来使用实际值延迟。

通过将上面的代码更改为

PROCESS (count)
BEGIN
   count <= not count after 1 ns;
END PROCESS;

模拟将起作用,计数将每 1 ns 切换一次。

于 2013-07-16T18:41:32.017 回答
0

您需要在代码中添加断点并单步执行,直到看到循环。另一种可能更有效的技术是仔细查看迭代和敏感度列表的良好代码审查。

于 2012-06-07T11:22:38.540 回答
0

如前所述,问题在于信号不稳定。虽然可能的问题是两个组合逻辑信号不断地相互替换,但为了后代,我想强调一些其他的可能性。

正如 Xilinx 在答复记录 #19068中所记录的,它也可能是由更改其灵敏度列表中的信号的过程引起的。

最终解决我的问题的另一项检查是确保您的模拟分辨率足够小。我的数量级太高了,我的测试台上的时钟在单个模拟步骤中运行了太多次。

于 2013-02-21T20:46:02.283 回答