Verilog中的花括号是什么意思?

Ale*_*. H 34 verilog concatenation

我很难理解verilog中的以下语法:

input [15:0] a;  // 16-bit input
output [31:0] result; // 32-bit output
assign result = {{16{a[15]}}, {a[15:0]}};
Run Code Online (Sandbox Code Playgroud)

我知道assign声明会result使用连线和组合逻辑将某些东西连接到总线,但是花括号和16 {a [15]}是什么?

Mat*_*t J 52

花括号表示连接,从左侧的最高有效位(MSB)到右侧的最低有效位(LSB).您正在创建一个32位总线(结果),其16个最高有效位由总线的第15位(MSB)的16个副本组成,其16个最低有效位仅由总线组成(这种特殊结构是已知的)作为符号扩展,例如以二进制补码形式右移一个负数并保持负数而不是将零引入MSBits.

有一个教程在这里,但是它并不能解释比上面的段落太多了.

对于它的价值,嵌套的花括号a[15:0]是多余的.


too*_*lic 35

正如马特所说,花括号是为了连接.额外的花括号16{a[15]}复制操作符.它们在IEEE标准Verilog文档(Std 1364-2005),"5.1.14 Concatenations"部分中描述.

{16{a[15]}}
Run Code Online (Sandbox Code Playgroud)

是相同的

{ 
   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]
}
Run Code Online (Sandbox Code Playgroud)

在爆破形式,

assign result = {{16{a[15]}}, {a[15:0]}};
Run Code Online (Sandbox Code Playgroud)

是相同的:

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];
Run Code Online (Sandbox Code Playgroud)