[Verilog] `define 和 parameter 的差別與使用時機

在一段程式碼中,容易變動或者可調的數字,可以設為參數,讓程式在未來修改規格變得靈活。
Verilog 提供 parameter 關鍵字來定義參數。下列的程式碼提供一個例子:

parameter counter_end = 99;
parameter counter_step = 3;
parameter counter_width = 8;

reg   [counter_width-1:0]   counter;
wire  [counter_width-1:0]   counter_zero = {(counter_width){1'b0}};

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)                       counter <= counter_zero;
    else if(counter == counter_end)  counter <= counter_zero;
    else                             counter <= counter + counter_step;
end

我們可以看出,counter 的行為,已受 parameter 的約束,因此未來 counter 如果需要更動,可以很快透過 parameter 來調整規格,這是我認為 parameter 比較好的用法。

如果一個電路包含三個子 IP,這三個子 IP 都吃同樣的 parameter,如果這些 IP 都有上述 parameter 的宣告在 code 內,我們就可以在宣告三個 IP 的 instance 時,將共同參數傳遞進去:

func #(
         .counter_end(99),
         .counter_step(3),
         .counter_width(8)
      )

接下來討論 `define 語法。
`define 也可以用來定義參數,但以我的觀點,我認為 `define 比較像是從頂層往底層子電路用 top-down 的方式管理共同的參數,因此我反而很少用 `define 來定義參數,我覺得 `define 適合用在全域的 function 開關。例如:


`ifdef FUN
    func f1();
`else
    common f1();
`endif

類似這種整體的 IP 電路組態,比較適合用 `define 來切開關。


留言

這個網誌中的熱門文章

[Env] Icarus Verilog(iverilog) + gtkwave 安裝與環境建立

[Env] Vim 安裝 Verilog-mode

[Tools] Verilog-mode 用法整理 (usage collections)