我在Modelsim上为d-flip-flop编写VHDL代码,当我尝试模拟它时出错:
错误:(vsim-3601)在400 ps时达到迭代限制。
我不确定这意味着什么,但我查看了很多错误的源代码,但没有成功。谁能猜出问题可能是什么?
答案 0 :(得分:3)
此错误通常表示ModelSim陷入无限循环。在VHDL中,当信号放入灵敏度列表并且在此过程中更改此信号时,可能会发生这种情况。信号改变,触发过程,改变信号,再次触发过程,循环继续。
以下是导致无限循环的过程的简单示例:
PROCESS (count)
BEGIN
count <= not count;
END PROCESS;
答案 1 :(得分:2)
如果达到了迭代限制,则表示系统尚未稳定。最有可能的是:
a <= b;
--- and then later...
b <= a;
答案 2 :(得分:2)
我只是有一个类似的问题。
我修复它的方法仅仅是增加测试台的延迟。我将延迟时间从100ps
更改为1ns
,并已解决!因为FOR
LOOP
的延迟超过了PicoSeconds的范围。
答案 3 :(得分:1)
大多数人使用VHDL或任何其他HDL语言的一个问题是他们不明白这不是顺序代码。你在进程内部的所有事情都是并行发生的。 艾哈迈德的例子很好:
PROCESS (count)
BEGIN
count <= not count;
END PROCESS;
HDL模拟器尝试在每次模拟滴答后将计数值设置为“不计数”,并且更改将触发另一个滴答,因为计数值已更改并且一直持续直到它崩溃或给出你上面的问题。
要使HDL正常工作,您必须使用时钟形式或不用于合成的延迟来使用实际值延迟。
将上述代码更改为
PROCESS (count)
BEGIN
count <= not count after 1 ns;
END PROCESS;
模拟将起作用,计数将每1 ns切换一次。
答案 4 :(得分:0)
您需要在代码和单步中添加断点,直到看到循环。 另一种技术,可能更高效,是一个很好的代码审查,仔细查看迭代和敏感性列表。
答案 5 :(得分:0)
如前所述,问题是信号没有稳定。虽然可能的问题是两个组合逻辑信号不断相互替换,但为了后人的缘故,还有其他一些我想强调的可能性。
正如Xilinx在Answer Record #19068中所记录的那样,它也可能是由一个改变其灵敏度列表中信号的过程引起的。
另一项检查最终解决了我的问题是确保您的模拟分辨率足够小。我的数量级太高,我的测试台上的时钟在一个模拟步骤中运行了太多次。