Le langage permet de définir la taille
de codage d’une valeur en précisant cette taille
avant la valeur et séparée par une apostrophe (‘).
Par défaut cette taille est de 32 bits.
Il est ainsi possible
de limiter la taille des nombres lors des calculs, et ainsi
de contrôler et limiter les warnings générés.
Il permet de définir le codage (base
d’écriture) et reconnaît:
- le binaire (b),
- l’octal (O),
- le décimal (d),
- l’hexadécimal (h).
L’absence de
symbole définit le type décimal.
Remarque : le souligné
(_) tout comme l’espace est un élément
pouvant être inséré pour faciliter la
lecture d’une valeur.
Ainsi :
En reprenant l'exemple de l'additionneur complet 1 bit :
assign
{R1, S1} = A1 + B1 + R0 + 0 ;
Cette ligne génère un warning
indiquant la troncature du résultat de 32 à
2 bits
assign
{R1, S1} = A1 + B1 + R0 + 2‘d0 ;
Cette ligne ne génère aucun
message d'erreur à la compilation.
Un contrôle de la
taille implique des troncatures imposées : il faudra
toujours dimensionner à la bonne taille les résultats
intermédiaires.
Ceci n’est parfois
pas un apport et gène notamment dans la lisibilité
du traitement.
De même : les nombres négatifs
sont connus et pourront être codés (-10, -125
…). Même si les bus sont des variables non signées,
il est possible de faire apparaître des nombres signés
en faisant précéder le signe - devant le nombre.
output [7 :0] S ;
assign S = -1 ; // est valide
assign S = -8'd1 ; // est valide et identique
assign S = 255 ; // est valide et identique
assign S = 8'd-1 ; // est invalide
Attention aux
tests qui peuvent ne pas donner les résultats attendus quand on
manipule des nombres signés et non signés.
Le langage connaît les nombres signés.
Ils se déclarent sous la forme du mot integer
et sont des variables 32 bits.
Exemple :
integer x ;
x = 3*x /12 + 2**4 ;