沒想到不管怎樣 $time 永遠印出 0,明明 wave 都是間隔 1 個 cycle 時 rdy 才等於 1?
想了一個下午,終於在 5 點多想到原因。
timescale 是 compiler directive,可以在 Standard 2001 Section 19 看到相關說明。
顧名思義,這個指令是在編譯階段決定,由於這個範例有 3 支檔案,沒辦法用我之前的 Windows batch 編譯,只能手動打指令編譯,但我在呼叫 iverilog 時,沒有將 Testbench 擺在最前面,導致 iverilog 在編譯 cell module 或 man module 時,因為未看到 timescale 指令,故無法正確計算 $time。
下次一定要記得將 Testbench 擺在第一個。
如果當初 iverilog 後有帶 -W all,此時也會看到相關警告訊息。
D:\Verilog\05_manual_build>iverilog -W all -o wave mult_cell.v mult_man.v mult_tb.v
mult_tb.v:76: warning: implicit definition of wire 'rstn'.
warning: Some modules have no timescale. This may cause
: confusing timing results. Affected modules are:
: -- module mult_cell declared here: mult_cell.v:1
: -- module mult_man declared here: mult_man.v:1
修正後終於可以驗證我的想法對不對了。
雖然將 -W all 打開,可以避免這個失誤,但會多出很多不必要的警告訊息。
之後也許可以參考這裡,只設定必要的 Warning 即可。
-Wanachronisms
-Wimplicit
-Wimplicit-dimensions
-Wmacro-replacement
-Wportbind
-Wselect-range
-Wtimescale
-Wsensitivity-entire-array
沒有留言:
張貼留言