Multidimensional Array

SystemVerilogでは多次元配列を扱えるようになった。

いまさら例を出すまでもないが、8bit長のレジスタを宣言するには、以下のようにしていた。

reg [7:0] a;

8bit長のレジスタの、4ワード分の配列を宣言するには以下の通り。

reg [7:0] a[0:3];

verilogの場合は、多次元配列には対応していないため、例えば4要素*3要素の配列が必要な場合、

reg [7:0] a[0:3] [0:2];

とは記述できずに、

reg [7:0] a[0:4*3-1];

などと、一次元配列に変換せざるをえなかったが、SystemVerilogでは、上記多次元配列の記述を受け付けるようになっている。

初期値宣言の要素の順番は、C言語と同様に、後ろのほうの添え字が最初に変化する。

また、C言語と異なり、配列の要素の一括代入も可能となっている。例えば、二次元配列の場合a[2] = a[0]のようなことが可能だ。

以下に簡単な確認用コードと動作結果を示す。

module test();

reg [7:0] a [0:3] [0:2] =

'{'{8'h0, 8'h1, 8'h2},

'{8'h3, 8'h4, 8'h5},

'{8'h6, 8'h7, 8'h8},

'{8'h9, 8'ha, 8'hb}};

initial begin

$display("Check 1");

for (int i = 0; i <= 3; i++) begin

for (int j = 0; j <= 2; j++) begin

$write("%x ", a[i][j]);

end

$display();

end

$display();

$display("Check 2");

a[2] = a[0];

for (int i = 0; i <= 3; i++) begin

for (int j = 0; j <= 2; j++) begin

$write("%x ", a[i][j]);

end

$display();

end

end

endmodule

# 6.5e

# vsim -do {run -all; quit} -c test

# Loading sv_std.std

# Loading work.test

# run -all

# Check 1

# 00 01 02

# 03 04 05

# 06 07 08

# 09 0a 0b

#

# Check 2

# 00 01 02

# 03 04 05

# 00 01 02

# 09 0a 0b

# quit