concatenation - concatenar - system verilog not
¿Qué significan los frenillos en Verilog? (2)
Me está costando entender la siguiente sintaxis en verilog:
input [15:0] a; // 16-bit input
output [31:0] result; // 32-bit output
assign result = {{16{a[15]}}, {a[15:0]}};
Sé que la declaración de assign
conectará algo al bus de result
utilizando cables y lógica combinacional, pero ¿qué pasa con las llaves y 16 {a [15]}?
Como dijo Matt, las llaves son para concatenación. Las llaves adicionales alrededor de 16{a[15]}
son el operador de replicación . Se describen en el documento IEEE Standard for Verilog (Std 1364-2005), sección "5.1.14 Concatenaciones".
{16{a[15]}}
es lo mismo que
{
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]
}
En forma de granallado,
assign result = {{16{a[15]}}, {a[15:0]}};
es lo mismo que:
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];
Las llaves muestran la concatenación, desde el bit más significativo (MSB) a la izquierda hasta el bit menos significativo (LSB) a la derecha. Está creando un bus de 32 bits (resultado) cuyos 16 bits más significativos consisten en 16 copias del bit 15 (MSB) del bus a, y cuyos 16 bits menos significativos consisten solo en el bus a (esta construcción particular es conocida como extensión de signo , que se necesita, por ejemplo, para desplazar a la derecha un número negativo en forma de complemento de dos y mantenerlo negativo en lugar de introducir ceros en los MSBits).
Aquí hay un tutorial, pero no explica mucho más que el párrafo anterior.
Por lo que vale la pena, las llaves anidadas alrededor de a[15:0]
son superfluas.