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