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