System Verilogで管理しているコードを見ると、次のように定義された信号がいくつかあります。
node [range_hi:range_lo]x;
そして、このように定義されている他のもの:
node y[range_hi:range_lo];
x
はパックとして定義され、y
はアンパックとして定義されていることを理解しています。しかし、私はそれが何を意味するのか分かりません。
System 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]を書き込むときにメモリを効果的に使用するために使用されます。右側の値は、そのようなスライスが5つあることを意味します。
bit[3:0] a
->パック配列パック配列は、フル配列(a='d1
)または配列の一部(a[0]='b1
)として使用できます。
bit a [3:0]
-> unpacked array unpacked arrayはa[0]='b1
として使用できません。完全なa={8{'b1}}
として使用する必要があります
パックされていない配列を使用すると、パックされた配列よりもコンパイル時のエラーチェックが多くなります。
この理由から、モジュールのポート定義に解凍された配列が表示されます。信号の次元が、パックされていない配列を持つポートと正確に同じでない場合、コンパイラはエラーになります。パックされた配列を使用すると、通常はエラーが発生することなく、先に進み、できる限り最善のものを配線します。