2023年12月26日 星期二

timescale in iverilog compiler

下午看乘法器流水線範例時,在看懂了 wave 後,想要印出各個實例化的模組是否在我想的時間內進去主要的計算區塊(mult_cell.v, en == 1),於是便多傳了一個 id 進去並在 en == 1 時,使用 $display($time, " ", id); 來印出目前時間。

沒想到不管怎樣 $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

沒有留言:

張貼留言