モジュールのインスタンス化にパラメータを用いる

複数のモジュールを含んだ複雑なシステムを表記する場合、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のように、複数のパラメータがある場合はコンマ(,)で区切って並べる。
またインスタンス化する場合も#()のカッコの中に(,)を使って並べる。
それぞれの対応は、記述順となる。