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;