モジュールのインスタンス化にパラメータを用いる
複数のモジュールを含んだ複雑なシステムを表記する場合、parameterによってバス幅やビット数を変更可能なモジュールを使用すると開発の効率が上がる。
しかし同じモジュールを、parameterを変えてインスタンス化するのは煩雑な記述となってしまう。
この場合、インスタンス化する時にparameterを与えることが出来る。
リスト1:ビット幅をパラメータ化したレジスタの記述
module register(wr,we,data_in,data_out); parameter DATA_WIDTH = 8; input wr,we; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] data_out; reg [DATA_WIDTH-1:0] data_out; always @(poseder wr) begin if(we)begin data_out <= data_in; end end endmodule
リスト2:ビット幅をパラメータ化したレジスタのインスタンス化
module paramtop(regesl,wr,we,data_in,data_out); input [ 2:0] regsel; input wr,we; input [31:0] data_in; wire [ 7:0] reg8out; wire [15:0] reg16out; wire [31:0] reg32out; assign data_out = (regsel==1) ? {24'h000000,reg8out }:32'hZZZZZZZZ; assign data_out = (regsel==2) ? {16'h0000 ,reg16out}:32'hZZZZZZZZ; assign data_out = (regsel==4) ? { reg32out}:32'hZZZZZZZZ; register #( 8) reg8 (wr, we, data_in[ 7:0], reg8out); register #(16) reg16 (wr, we, data_in[15:0], reg16out); register #(32) reg32 (wr, we, data_in , reg32out); endmodule
リスト1ではDATA_WIDTHを8と設定しているが、他の値が必要な場合リスト2で示すとおりインスタンス化する際にパラメータ値をモジュール名とインスタンス名の間に挟んで記述する。
リスト1で記述している8より、リスト2でインスタンス化される時の値が優先される。
リスト3:複数のパラメータを持ったモジュールの定義
module sram(...) parameter DATA_WIDTH = 4, ADRS_WIDTH = 4, WORD_NO = 16; //中略// always @(clk)begin if(...)begin ... end end endmodule
リスト4:複数のパラメータを持ったモジュールのインスタンス化
module sramtop(...); //中略// sram #(4,8,256) sram1 (...); sram #(8,10,1024) sram2 (...); endmodule
リスト3のように、複数のパラメータがある場合はコンマ(,)で区切って並べる。
またインスタンス化する場合も#()のカッコの中に(,)を使って並べる。
それぞれの対応は、記述順となる。