Dynamic Array
Verilogの配列では、Cのように、初期化時に要素数を自動で検出し、必要なだけの領域を確保することができなかった。
以下のコードはCでは認められるが、verilogではエラーになる。
int c[] = {1, 2, 3};
System verilogでは、このようなコードも認められるようになった。ただし、これはDynamic Arrayと呼ばれ、配列の宣言時の領域確保だけでなく、そのサイズを動的に変更できるなど、以下のようにいくつかの拡張がなされている。
配列名A = new[number](配列名B)
配列名Bはオプション
配列Aの要素数をnumberに変更する。配列Aの内容は全て初期化(regの場合は'x)される
ただし配列Bが指定されている場合は、その内容が配列Aにコピーされる
配列名.size
配列の要素数を返す
配列名.delete
配列の要素数を0にする
Cの場合は配列の要素でループを組むのにfor文を使っていたが、System verilogでDynamic arrayを使用する場合、foreach文でまわしたほうがシンプルになる。
以下にDynamic Arrayの機能を使用したサンプルプログラムを示す。
module test();
reg [31:0] tvec[] = {32'h0000_0000, 32'haaaa_aaaa,
32'h5555_5555, 32'hffff_ffff};
initial begin
displayStatus();
tvec = new[2](tvec);
displayStatus();
tvec = new[3];
displayStatus();
tvec.delete;
displayStatus();
end
task displayStatus();
$display("Current size = %d", tvec.size);
$display("Current contents:");
foreach (tvec[i]) begin
$display(" %x", tvec[i]);
end
endtask
endmodule
# 6.5e
# vsim -do {run -all; quit} -c test
# Loading sv_std.std
# Loading work.test
# run -all
# Current size = 4
# Current contents:
# 00000000
# aaaaaaaa
# 55555555
# ffffffff
# Current size = 2
# Current contents:
# 00000000
# aaaaaaaa
# Current size = 3
# Current contents:
# xxxxxxxx
# xxxxxxxx
# xxxxxxxx
# Current size = 0
# Current contents:
# quit
2011.4.19