Littéraux, vecteurs et opérateurs
Écrire des constantes sans ambiguïté, manipuler les bits et éviter les pièges de taille et de signe.
Donner une taille aux constantes
Une constante Verilog peut préciser sa largeur, sa base et sa valeur :
8'b1010_0110
8'hA6
8'd166
12'o245Ces quatre éléments n'ont pas tous la même largeur : les trois premiers occupent 8 bits, le dernier 12 bits. Le caractère de soulignement améliore la lecture et ne change pas la valeur.
La forme générale est taille'basevaleur. Les bases courantes sont b pour binaire, o pour octal, d pour décimal et h pour hexadécimal.
Une constante sans taille, comme 5, suit des règles implicites qui peuvent élargir une expression ou changer son interprétation signée. Dans le RTL, écrire 4'd5 ou 8'd5 rend l'intention plus claire.
Vecteurs et sélection de bits
wire [7:0] w_byte;
wire [3:0] w_high;
wire w_lsb;
assign w_high = w_byte[7:4];
assign w_lsb = w_byte[0];[7:0] déclare un vecteur de 8 bits. w_byte[0] sélectionne un bit et w_byte[7:4] une partie contiguë.
La convention [poids_fort:poids_faible] est fréquente pour les bus. Il faut tout de même lire la déclaration : Verilog accepte aussi des plages dans l'autre sens.
Concaténer et répéter
Les accolades assemblent plusieurs morceaux :
assign w_packet = {w_header, w_payload};
assign w_mask = {4{2'b10}};La première ligne place w_header dans les bits de poids fort. La seconde répète quatre fois 2'b10 et produit 8'b1010_1010.
La concaténation sert aussi à étendre manuellement un nombre signé en recopiant son bit de signe.
Quatre états logiques
Verilog simule les valeurs 0, 1, x et z :
xindique une valeur inconnue ou un conflit ;zindique une haute impédance ;0et1sont les niveaux logiques connus.
Une valeur x est un signal d'alerte utile en simulation. La remplacer trop vite par 0 peut masquer un reset manquant ou une branche non couverte.
Les familles d'opérateurs
| Famille | Exemples | Résultat |
|---|---|---|
| arithmétique | +, -, * | calcul sur des nombres |
| bit à bit | &, ` | , ^, ~` |
| logique | &&, ` | |
| comparaison | <, >=, ==, != | résultat sur un bit |
| réduction | &bus, ` | bus, ^bus` |
| décalage | <<, >> | déplacement des bits |
& et && ne sont pas interchangeables. a & b travaille bit par bit ; a && b teste si les opérandes représentent une condition vraie.
Tailles et nombres signés
La largeur du résultat dépend de la largeur des opérandes et du contexte. Une retenue peut donc être perdue :
wire [7:0] i_a;
wire [7:0] i_b;
wire [8:0] o_sum;
assign o_sum = {1'b0, i_a} + {1'b0, i_b};Les opérandes sont étendus à 9 bits avant l'addition. La retenue finale peut alors être conservée.
Pour les calculs signés, déclarer les objets avec signed et vérifier chaque extension. Mélanger un vecteur signé et un vecteur non signé peut donner un résultat surprenant.
Exemple complet
module word_tools (
input wire [7:0] i_word,
input wire signed [7:0] i_delta,
output wire [3:0] o_high_nibble,
output wire o_odd_parity,
output wire signed [8:0] o_delta_ext,
output wire [15:0] o_repeated
);
assign o_high_nibble = i_word[7:4];
assign o_odd_parity = ^i_word;
assign o_delta_ext = {i_delta[7], i_delta};
assign o_repeated = {
La réduction XOR vaut 1 lorsque i_word contient un nombre impair de bits à 1. L'extension de i_delta recopie son bit de signe.
À retenir
- Donner une taille aux constantes évite beaucoup d'ambiguïtés.
- Une sélection de partie conserve exactement les bits demandés.
&travaille bit par bit, alors que&&forme une condition.- Une addition doit être élargie avant le calcul si la retenue est utile.
- Les calculs signés demandent des déclarations et des extensions cohérentes.
📝 Tester mes connaissances - Quiz du chapitre