【发布时间】:2019-04-05 02:08:22
【问题描述】:
我正在为 Modelsim 上的 d 触发器编写 VHDL 代码,当我尝试对其进行仿真时出现错误:
错误:(vsim-3601) 在 400 ps 时达到迭代限制。
我不确定这意味着什么,但我已经查看了我的大部分源代码中的错误,但没有成功。谁能猜出问题出在哪里?
【问题讨论】:
-
如果您发布一些代码会很好。
我正在为 Modelsim 上的 d 触发器编写 VHDL 代码,当我尝试对其进行仿真时出现错误:
错误:(vsim-3601) 在 400 ps 时达到迭代限制。
我不确定这意味着什么,但我已经查看了我的大部分源代码中的错误,但没有成功。谁能猜出问题出在哪里?
【问题讨论】:
此错误通常表明 ModelSim 陷入了无限循环。在 VHDL 中,当一个信号被放置在敏感度列表中并且这个信号在这个过程中被改变时,就会发生这种情况。信号改变,触发流程,流程改变,信号改变,流程再次触发,循环继续。
以下是导致无限循环的过程的简单示例:
PROCESS (count)
BEGIN
count <= not count;
END PROCESS;
【讨论】:
如果达到您的迭代限制,则意味着系统尚未稳定。很可能是这样的:
a <= b;
--- 然后再...
b
【讨论】:
a <= someFuntionOf(b,c,d,e); b <= someOtherFunctionOf(a,f,g,h)......但是是的,听起来 OP 在他们的代码中有一个反馈循环。
我刚刚遇到了类似的问题。
我修复它的方法只是增加测试台的延迟。我将延迟从 100ps 更改为 1ns 并修复了!因为FORLOOP的延迟超过了PicoSeconds的范围。
【讨论】:
大多数人对 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 切换一次。
【讨论】:
您需要在代码中添加断点并单步执行,直到看到循环。 另一种可能更有效的技术是仔细查看迭代和敏感度列表的良好代码审查。
【讨论】:
如上所述,问题在于信号不稳定。虽然可能的问题是两个组合逻辑信号不断相互替换,但为了后代,我想强调一些其他可能性。
正如 Xilinx 在 Answer Record #19068 中所记录的,它也可能是由更改其灵敏度列表中的信号的进程引起的。
最终解决我的问题的另一项检查是确保您的模拟分辨率足够小。我的数量级太高了,我的测试台上的时钟在单个模拟步骤中运行了太多次。
【讨论】: