web-dev-qa-db-ja.com

Verilogの中括弧は何を意味しますか?

Verilogの次の構文を理解するのに苦労しています。

input [15:0] a;  // 16-bit input
output [31:0] result; // 32-bit output
assign result = {{16{a[15]}}, {a[15:0]}};

assignステートメントはワイヤと組み合わせロジックを使用してresultバスに何かを配線することを知っていますが、中括弧と16 {a [15]}はどうなっていますか?

31
Alex. H

中括弧は、左の最上位ビット(MSB)から右の最下位ビット(LSB)までの連結を意味します。上位16ビットがバスのビット15(MSB)の16コピーで構成され、下位16ビットがバスのみで構成される32ビットバス(結果)を作成しています(この特定の構造は既知です) 符号拡張 。これは、たとえば 2の補数 形式で負の数を右シフトし、MSBitsにゼロを導入するのではなく、負に保つために必要です。

チュートリアル here がありますが、上記の段落よりも多くの説明はありません。

価値があるのは、a[15:0]の周りのネストされた中括弧は不要です。

50
Matt J

マットが言ったように、中括弧は連結用です。 16{a[15]}を囲む余分な中括弧は、複製演算子です。 IEEE規格のVerilogドキュメント(Std 1364-2005)のセクション「5.1.14連結」で説明されています。

{16{a[15]}}

と同じです

{ 
   a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15],
   a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15]
}

ビットブラスト形式では、

assign result = {{16{a[15]}}, {a[15:0]}};

以下と同じです:

assign result[ 0] = a[ 0];
assign result[ 1] = a[ 1];
assign result[ 2] = a[ 2];
assign result[ 3] = a[ 3];
assign result[ 4] = a[ 4];
assign result[ 5] = a[ 5];
assign result[ 6] = a[ 6];
assign result[ 7] = a[ 7];
assign result[ 8] = a[ 8];
assign result[ 9] = a[ 9];
assign result[10] = a[10];
assign result[11] = a[11];
assign result[12] = a[12];
assign result[13] = a[13];
assign result[14] = a[14];
assign result[15] = a[15];
assign result[16] = a[15];
assign result[17] = a[15];
assign result[18] = a[15];
assign result[19] = a[15];
assign result[20] = a[15];
assign result[21] = a[15];
assign result[22] = a[15];
assign result[23] = a[15];
assign result[24] = a[15];
assign result[25] = a[15];
assign result[26] = a[15];
assign result[27] = a[15];
assign result[28] = a[15];
assign result[29] = a[15];
assign result[30] = a[15];
assign result[31] = a[15];
34
toolic