[Verilog] `define 和 parameter 的差別與使用時機
在一段程式碼中,容易變動或者可調的數字,可以設為參數,讓程式在未來修改規格變得靈活。
Verilog 提供 parameter 關鍵字來定義參數。下列的程式碼提供一個例子:
我們可以看出,counter 的行為,已受 parameter 的約束,因此未來 counter 如果需要更動,可以很快透過 parameter 來調整規格,這是我認為 parameter 比較好的用法。
如果一個電路包含三個子 IP,這三個子 IP 都吃同樣的 parameter,如果這些 IP 都有上述 parameter 的宣告在 code 內,我們就可以在宣告三個 IP 的 instance 時,將共同參數傳遞進去:
接下來討論 `define 語法。
`define 也可以用來定義參數,但以我的觀點,我認為 `define 比較像是從頂層往底層子電路用 top-down 的方式管理共同的參數,因此我反而很少用 `define 來定義參數,我覺得 `define 適合用在全域的 function 開關。例如:
類似這種整體的 IP 電路組態,比較適合用 `define 來切開關。
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 來切開關。
留言
張貼留言