k0b0's record.

Computer Engineering, Arts and Books

Verilog/SystemVerilogのparameterの使い方

parameter

 Verilog/SystemVerilogでは以下のようにparameterを設定することができる。parameterを使用することでモジュールの拡張性やコードの可読性が高くなる。

parameterの書式

parameter パラメータ名 =;

parameterの記述例

module ff_para(ck, reset, d, q);

/* parameterを定義 */
parameter width = 32;

input ck, reset;

/* parameterでビット幅を指定 */
input [width-1:0] d;
output reg [width-1:0]  q;

/* parameterの指定により32bitレジスタを生成する記述になる */
always_ff @(negedge ck or negedge reset)
begin
    if(!reset)
	q <= 0;
    else
	q <= d;
end
endmodule

モジュール呼び出し時のparameterの上書き

モジュール内で定義されたparameter値は、上位モジュールの呼び出しの際にdefparamを使って上書きすることができる。

defparamの書式

defparam インスタンス名.パラメータ名 =;

defparamの記述例

// モジュールff_paraのwidthを16で上書きしてインスタンスを生成
defparam ff_para_1.width = 16;
ff_para ff_para_1(.ck(ck), .reset(reset), .d(d), .q(q));

Verilgo2001以降のparameter宣言

Verilog2001以降のバージョンのVerilog(SystemVerilog等)ではポート宣言のようにパラメータを宣言することができる。

parameterの書式(Verilog2001以降)

module モジュール名 #(
  parameter パラメータ名 =,
  parameter パラメータ名 =,
...(省略)
) (
  // ポート宣言
);

parameterの記述例(Verilog2001以降)

module ff_para #(parameter width=32) //パラメータ宣言
                (input ck, reset,    //ポート宣言
		 input [width-1:0] d,
	         output reg [width-1:0] q);

always_ff @(negedge ck or negedge reset)
begin
    if(!reset)
	q <= 0;
    else
	q <= d;
end
endmodule

モジュール呼び出し時のparameterの上書き(Verilog2001以降)

Verilog2001以降では以下の書式でモジュール呼び出し時のparameterの上書きを行う。

parameterの上書きの書式

モジュール名 #(
  .パラメータ名(),
  .パラメータ名(),
...(省略)
) インスタンス名 ( /* ポートの接続 */ );

記述例

// モジュールff_paraのwidthを16で上書きしてインスタンス化
ff_para #(.width(16)) ff_para_1(.ck(ck),.reset(reset),.d(d),.q(q));

parameterに関しての注意事項

以下のようにparameterを使って定数のビット幅を指定することはできないので注意。(`defineでは定数のビット幅を指定することができる。)

parameter width = 16;
parameter height = width'd65535; //エラー : 16'd65535ならOK

`defineを使って定数のビット幅を指定

'define BIT_WIDTH 16
... (省略)
parameter height = `BIT_WIDTH'd65535;