Le composant est avant tout
numérique. Sa spécialité est la manipulation
de bits.
Il est souvent utile de regrouper
des bits (concaténation) pour les utiliser en tant que mot.
Avec Verilog, il est possible de concaténer tous bits, groupe
de bits, bus autant en entrée qu’en sortie.
Ce sont les accolades
qui définissent cette opération.
La syntaxe est :
{bits ou liste de bits
séparés par des virgules (,)}
Exemple :
S = {1'b1, a[2], a[2], b[2
:1]}
Si le nombre de bits
de l’affecté et de l’affectant ne sont pas égaux, des troncatures
s’opèrent ou des 0 sont ajoutés.
Exemple :
input [3:0] a ;
output [4:0] b ;
output [2:0] c ;
assign b = {a, 1'b1, 2'b0} ;
Cette dernière ligne
met dans b, la concaténation de (a, d'un bit à
1 et de 2 bits à 0), soit 7 bits. b ne fait que 5
bits donc le résultat sera amputé de a[3]
et a[2].
assign {c, b[2]} = {1'b1, a} ;
De même, la dernière
ligne se traduit par : mettre dans la concaténation
(c et le bit 2 de b), la concaténation (de 1 et
a). La concaténation affectée étant
plus grande de 1 bit, se verra ajouter un bit à 0
dans C[2]
La ligne suivante aurait
donné le même résultat final, aurait
été élaborée sur 32 bits (1
(sur 32 bits) concaténée avec a est évaluée
sur 32 bits avant d'être affectée :
assign {c, b[2]} = {1, a} ;
Rappel : les opérations
arithmétiques sont réalisées par défaut sur 32 bits et les
résultats sont tronqués au moment des affectations dans
les variables.
Pour réaliser une
rotation à droite de 1 bit (opérateur qui
n'existe pas ce langage) sur la variable r :
output [7 : 0] r ;
assign r = {r[0], r[7
: 1]} ;
ou encore
assign {r[6 : 0], r[7]}
= r ;
IMPORTANT : de même,
les variables qui sont telles que le nombre de bits réellement
utilisés est inférieur à celui de la déclaration, seront
amputées de bits inutiles. Ceci génère un certain nombre
de warnings dont il faut s’enquérir à la compilation.
Il est possible de réaliser des répétitions
de concaténations (ou concaténations imbriquées)
:
{2{a[1], b[2]}, b[0]} est
équivalent à {a[1], b[2], a[1], b[2], b[0]}