2012-02-14 47 views
0

我寫VHDL代碼上的ModelSim一個d觸發器和我得到一個錯誤,當我試着模擬它:調試迭代限制的錯誤在VHDL的ModelSim

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

我不知道是什麼這意味着,但我已經通過我的許多源代碼查看錯誤沒有成功。任何人都可以猜測問題可能是什麼?

+2

如果你發佈了一些代碼,那就好了。 – ForceMagic 2012-10-22 02:22:07

回答

2

如果達到迭代限制,則表示系統尚未穩定。最有可能是這樣的:

a <= b;

--- and then later...

b <= a;

+0

我認爲你的簡單例子太簡單了,不能解決問題。更像'a <= someFuntionOf(b,c,d,e); b <= someOtherFunctionOf(a,f,g,h)'......但是,聽起來像OP在代碼中有一個反饋循環。 – 2012-02-14 08:52:27

0

您需要添加斷點在你的代碼和單步,直到你看到的循環。 另一種技術,也許更有效率,是一個很好的代碼審查,仔細看看你的迭代和敏感列表。

0

如前所述,問題在於信號不穩定。儘管可能的問題是兩個組合邏輯信號不斷互相取代,但還有其他兩種可能性,我想強調爲了後代的緣故。

如Xilinx在Answer Record #19068中所記錄的,它也可能由更改其靈敏度列表中的信號的過程引起。

另一個檢查終於解決了我的問題,這是爲了確保您的模擬分辨率足夠小。礦井數量級過高,我的測試臺上的時鐘在單個模擬步驟中運行了太多次。

2

該錯誤通常表明ModelSim卡在無限循環中。在VHDL中,當信號放在靈敏度列表中並且在該過程中更改該信號時,可能會發生這種情況。信號改變,觸發該過程,該過程改變信號,這再次觸發過程並且循環繼續。

下面是導致一個無限循環的過程的一個簡單的例子:

PROCESS (count) 

BEGIN 

count <= not count; 

END PROCESS; 
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納秒。