SystemVerilogにおけるPacked/Unpacked Arrayまとめ
目的
VerilogからSystemVerilogへの移行にあたって、新規に導入されたPacked/Unpacked arrayという概念を整理すること。
Verilogでのrange/dimensionの定義
Verilog 2001(IEEE Std 1364-2001)では単bitで表現される変数をscalar、多ビットで表現される変数をvectorと呼びます。
reg [7:0] reg_data [3:0]; // 8bit regの配列(size 4)
reg [7:0] reg_data [3:0][4:0]; // 8bit regの2次元配列(size 4,5)
変数名(variable_identifier)の前にbit幅(range)を指定し、後ろにarray宣言の次元(dimension)を指定する文法でした。bit幅に指定できるのは1次元までですが、配列は多次元にすることができる。という構成でした。
SystemVerilogでの配列の扱い
packed arrayとunpacked array
SystemVerilog 2017(IEEE Std 1800™-2017)では
rangeはpacked array, dimensionはunpacked arrayという概念に拡張されています。unpacked arrayだけでなくpacked arrayにも多次元配列が許されるのが大きな違いです。
verilogでのrange機構は、要するにあるbit数を持つvector variableをbitごとに分割してアクセスできるようにする機構でした。
SystemVerilogではあるbitのセットとして表現される値をvectorをpacked arrayのsub fieldに分割してアクセスできる、という表現になっています。packed arrayが1次元の場合はverilogのrangeと同じ意味になりますが、vectorをさらに多次元のbitに分割できるように拡張したイメージです。
packed arrayは連続したビットのセットとして表現されることが保証されている一塊のデータということになります。通常、packed arrayの末尾の配列が従来のverilogでいうbit幅を指すと思っていいと思います。
以下は「「8bit×4のpacked array」の10個のunpacked array」を指します。個々のunpacked array要素は8×4の32bitのbit列になります。
bit [3:0] [7:0] joe [1:10]; // 10 elements of 4 8-bit bytes
// (each element packed into 32 bits)
サイズ幅によるunpacked array宣言
また、unpacked arrayのdimension宣言時にはverilogのときからあった[7:0]という表現のほかにCのように要素数だけ書く、[8]という表現も許容されます(IEEE Std 1800™-2017 7.4.2)。以下の2つは同じ意味になります。
int Array[0:7][0:31]; // array declaration using ranges
int Array[8][32]; // array declaration using sizes
packed arrayに対してはこの書き方はできません。
arrayに対する参照
unpacked arrayの参照はすべてのdimensionを表記しない場合は部分arrayの参照になります。全てのdimensionを書かずに参照した場合には全体への参照になり、以下のように直接代入できます。(IEEE Std 1800™-2017 7.4.5)
ここからわかるようにarrayは末尾のarrayが最小単位になります。規格中では最後の要素が"varies most rapidly"という表現がされています。つまり
int A [7][4][2];
はC言語のように「「「int7個のarray」の4個のarray」の2個のarray」ではなく、「「「int2個のarray」の4個のarray」の7個のarray」という解釈がされます。C言語とは逆順なので注意が必要です。
packed arrayとunpacked arrayを両方持つ変数に対する参照
packed arrayとunpacked arrayの両方を持つvariableに対する参照は以下のように表記します。packed dimensionを先に指定してunpacked dimensionを後で指定する表記になります。packed dimensionをすべて指定せずにunpacked dimensionを指定することはできないはずです。
Discussion