J'ai du mal à comprendre la syntaxe suivante dans Verilog:
input [15:0] a; // 16-bit input
output [31:0] result; // 32-bit output
assign result = {{16{a[15]}}, {a[15:0]}};
Je sais que l'instruction assign
va câbler quelque chose jusqu'au bus result
en utilisant des fils et une logique combinatoire, mais que se passe-t-il avec les accolades et 16 {a [15]}?
Les accolades signifient la concaténation, du bit le plus significatif (MSB) à gauche au bit le moins significatif (LSB) à droite. Vous créez un bus 32 bits (résultat) dont les 16 bits les plus significatifs sont constitués de 16 copies du bit 15 (le MSB) du bus a, et dont les 16 bits les moins significatifs se composent uniquement du bus a (cette construction particulière est connue as extension de signe , ce qui est nécessaire par exemple pour décaler vers la droite un nombre négatif sous la forme complément à deux et le garder négatif plutôt que d'introduire des zéros dans les MSBits).
Il y a un tutoriel ici , mais il n'explique pas beaucoup plus que le paragraphe ci-dessus.
Pour ce que ça vaut, les accolades imbriquées autour de a[15:0]
sont superflus.
Comme Matt l'a dit, les accolades sont pour la concaténation. Les croisillons supplémentaires autour de 16{a[15]}
sont l'opérateur réplication. Ils sont décrits dans le document IEEE Standard for Verilog (Std 1364-2005), section "5.1.14 Concatenations".
{16{a[15]}}
est le même 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]
}
Sous forme sablée,
assign result = {{16{a[15]}}, {a[15:0]}};
est le même 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];