2012-05-10 97 views
3

我正在使用Icarus verilog來模擬相當複雜的設計。我發現,在一些極少數情況下,我的模擬會「卡住」,即時鐘不再勾選,也沒有任何信號出現變化。我懷疑這是因爲我的設計中有一個組合邏輯循環。這個問題當然是,我不知道在哪裏。在Icarus Verilog中調試組合邏輯循環

有沒有一個系統的方法調試呢?我只是盯着代碼,但我無法取得任何進展。任何建議,我可以嘗試的東西非常感謝。

回答

3

當您運行模擬時,轉儲一個VCD文件。如果你有一個無限循環,你會看到VCD文件的大小繼續增長,而沒有新的時間寫入文件。在一行的開始處用#表示時間。您將能夠確定哪些信號在沒有時間推進的情況下發生變化。

+1

除了在商業模擬器中使用step功能之外,很高興知道這項技術。 –

+0

感謝您的回答,但仿真時間並不適合我。最後的#

+0

當模擬仍在運行時,您正在查看VCD文件嗎? – toolic

0

國際海事組織,大多數時間發生無限循環與時鐘生成。特別是如果你讓他們設置產生可變頻率。例如,如果你的時鐘設置是這樣的:

`timescale 1ns/1ns 
real period; 
reg clk; 

initial begin 
    period = 5.0; 
    clk = 1'b0; 
    forever begin 
     #(period/2) clk = !clk; 
    end 
end 

如果你改變,如果你改變period爲0.0意外period然後無限循環可能發生。

即使更復雜,有時period/2可能會超出您的時間範圍精度。例如,如果您設置了period = 1.0,那麼period/2爲0.5,並且由於您的時間精度爲1ns,因此會捕捉到0,導致無限循環。如果我懷疑這一點,我通常會在我進入延遲之前的一段時間留下一名後衛(再次,謹慎,精確......)。

... 
half_period_ns = period_ns/2.0; 
if(half_period_ns == 0) 
    half_period_ns = 1; 
#(half_period_ns) clk = !clk; 
... 

另一件事要做的,就是在交互模式和隨機按Ctrl-C型,模擬在命令問模擬器,它在(模擬特定的,可悲的是,但在犀利它where我認爲) ,並恢復模擬。這樣做幾次,你就能夠了解代碼是否佔用了所有模擬器的時間。

1

所以事實證明,Icarus Verilog的編譯標誌爲「-pfileline = 1」。在打開此標誌的情況下運行vvp會打印出大量有關正在執行的內容的調試信息。