I like fpga

change the world by fpga
2021/03/25

Two-dimesional array in system verilog and generate multiple instance

VERILOG   

2次元配列を用意して、その配列を引数にして、インスタンスを生成します。

配列を引数に持つ複数生成される回路

複数生成される回路は、配列を入力します。回路では入力されたデータを全部加算します。

module array(
	input clock,
	input reset,
	input [7:0] data[8],
	output [7:0] out_data
    );

回路を複数生成するgenerate文

generateを使ってインスタンスを複数生成します。これでarrayのモジュールが8個生成されます。

genvar i;
generate
	for(i=0;i<8;i=i+1) begin
		array array_inst(
			.clock(CLOCK),
			.reset(RESET),
			.data(DATA[i]),
			.out_data(OUT_DATA[i])
		);
	end
endgenerate

複数回路を生成するので、このモジュールの入力は、2次元配列で持ちます。

2次元配列を引数に持つ

odule parent_array(
	input CLOCK,
	input RESET,
	input [7:0] DATA[8][8],
	output [7:0] OUT_DATA[8]
    );

テスト関数

テスト関数では、2次元配列を引数に持つ関数をコールするため、2次元配列を用意する。

logic [7:0] DATA[8][8];

2次元配列をパラメータとして渡す。

parent_array parent_array_inst(
	.CLOCK(CLOCK),
	.RESET(RESET),
	.DATA(DATA),
	.OUT_DATA(OUT_DATA)
);

テストとしては、入力値に適当な値を入れる。

initial begin
	int i,j;
	for(i=0;i<8;i++) begin
		for(j=0;j<8;j++) begin
			DATA[i][j] <= i*8 + j;
		end
	end

テストが終了したら出力値を表示する

	RESET = 1'b1;
	#STEP;
	RESET = 1'b0;
	#TEST_TIME;
	for(i=0;i<8;i++) begin
		$display (OUT_DATA[i]);
		
	end

シュミレーションの結果、出力値は、桁溢れしているが、想定通りに動作している。

使用したコードと環境はここにおいてある

https://github.com/y38y38/two-dimesional_array

« »