我正在使用Icarus verilog來模擬相當複雜的設計。我發現,在一些極少數情況下,我的模擬會「卡住」,即時鐘不再勾選,也沒有任何信號出現變化。我懷疑這是因爲我的設計中有一個組合邏輯循環。這個問題當然是,我不知道在哪裏。在Icarus Verilog中調試組合邏輯循環
有沒有一個系統的方法調試呢?我只是盯着代碼,但我無法取得任何進展。任何建議,我可以嘗試的東西非常感謝。
我正在使用Icarus verilog來模擬相當複雜的設計。我發現,在一些極少數情況下,我的模擬會「卡住」,即時鐘不再勾選,也沒有任何信號出現變化。我懷疑這是因爲我的設計中有一個組合邏輯循環。這個問題當然是,我不知道在哪裏。在Icarus Verilog中調試組合邏輯循環
有沒有一個系統的方法調試呢?我只是盯着代碼,但我無法取得任何進展。任何建議,我可以嘗試的東西非常感謝。
當您運行模擬時,轉儲一個VCD文件。如果你有一個無限循環,你會看到VCD文件的大小繼續增長,而沒有新的時間寫入文件。在一行的開始處用#
表示時間。您將能夠確定哪些信號在沒有時間推進的情況下發生變化。
國際海事組織,大多數時間發生無限循環與時鐘生成。特別是如果你讓他們設置產生可變頻率。例如,如果你的時鐘設置是這樣的:
`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
我認爲) ,並恢復模擬。這樣做幾次,你就能夠了解代碼是否佔用了所有模擬器的時間。
所以事實證明,Icarus Verilog的編譯標誌爲「-pfileline = 1」。在打開此標誌的情況下運行vvp會打印出大量有關正在執行的內容的調試信息。
除了在商業模擬器中使用step功能之外,很高興知道這項技術。 –
感謝您的回答,但仿真時間並不適合我。最後的#
當模擬仍在運行時,您正在查看VCD文件嗎? – toolic