満載のvsアンパックベクトルシステムverilog
-
20-08-2019 - |
質問
を見ているコード感を維持システムVerilogきました。信号で規定されているようになります:
node [range_hi:range_lo]x;
他に定義されているようになります:
node y[range_hi:range_lo];
私は理解してい x
に定義されるパーティーをやりながら揚げながら y
定義として開梱.しかし、私は考えています。
の違いは何ですか梱包-開梱ベクトルシステムVerilog?
編集: への対応@Empiの答えは、なぜハードウェアデザイナーのための書SVの内部表現は、配列の?ありません な または できない 使満載の信号?
解決
本稿では、詳細についてこの問題:http://electrosofts.com/systemverilog/arrays.html, 特にセクション5.2.
満員の配列機構を細分化するベクター分野でできる便利にアクセスとして配列の要素。その結果、昼配列を保証する表現としての連続した設定のビット.は、開梱配列を示すものではありませんで表現されています。詰め込んだ配列とは異なり、開梱配列の場合には満載の配列が表示されている、として扱われる単一のベクトルとなっています。
他のヒント
正確にパックされた配列とアンパックされた配列が何であるかを知る前に、宣言だけでどの配列が何であるかを知る方法も見てみましょう。 パック配列には、サイズ宣言の前にオブジェクト名が付いています。例:
bit [3][7] a;
サイズが宣言された後、オブジェクト名を持つパックされていない配列。例:
bit a[3];
パックされた配列はメモリを作成しますが、パックされていない配列はメモリを作成します。 このように、アンパックされた配列にアクセス/宣言することもできます
reg unpacked_array [7:0] = '{0,0,0,0,0,0,0,1};
パック配列とアンパック配列の両方を混合して、多次元メモリを作成できます。例:
bit [3:0][7:0]a[2:0].
深さ3の4(つまり4 * 8)バイトの配列を作成します。
パック配列は、主に[3:0] [7:0] A [4:0]を書き込むときにメモリを効果的に使用するために使用されます。 32ビット。右側の値は、そのようなスライスが5つあることを意味します。
アンパックされた配列は、パックされた配列よりもコンパイル時のエラーチェックを提供します。
この理由により、モジュールのポート定義に解凍された配列が表示されます。信号の次元が、パックされていない配列を持つポートと正確に同じでない場合、コンパイラはエラーになります。パックされた配列を使用すると、通常は先に進み、エラーを発行することなく、できる限り最高のものを配線します。
bit[3:0] a
-<!> gt;パック配列
パックされた配列は、完全な配列(a='d1
)または配列の一部(a[0]='b1
)
bit a [3:0]
-<!> gt;パックされていない配列
展開された配列はa={8{'b1}}
として使用できません。完全な<=>