Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
L'affectation de valeurs sur des nets et des variables est appelée affectation. Il existe trois formes de base :
- Procédurale
- Continue
- Procédurale continue
Valeurs LHS autorisées
Une affectation comporte deux parties : le côté droit (RHS) et le côté gauche (LHS), séparés par un symbole égal (=) ou un symbole inférieur-égal (<=).
| Type d'affectation | Côté gauche (LHS) |
|---|---|
| Procédurale |
|
| Continue |
|
| Procédurale continue |
|
Le RHS peut contenir toute expression qui s'évalue à une valeur finale, tandis que le LHS indique un net ou une variable qui reçoit la valeur du RHS.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk est sur le LHS et le not de clk forme le RHS
always #10 clk = ~clk;
// y est le LHS et la constante 1 est le RHS
assign y = 1;
// f est le LHS, et l'expression de a,b,d,e forme le RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z est le LHS, et l'expression de a,b,c,d forme le RHS
z <= a + b + c + d;
end
initial begin
// Les noms de variables à gauche forment le LHS tandis que 0 est le RHS
a <= 0;
b <= 0;
c <= 0;
d <= 0;
e <= 0;
clk <= 0;
end
endmodule
Affectation Procédurale
Les affectations procédurales se produisent au sein de procédures telles que always, initial, task et function, et servent à placer des valeurs sur des variables. La variable conserve la valeur jusqu'à la prochaine affectation à la même variable.
La valeur est placée sur la variable lorsque la simulation exécute cette instruction à un moment donné pendant le temps de simulation. Cela peut être contrôlé et modifié comme souhaité grâce à des instructions de contrôle de flux telles que if-else-if, case et les mécanismes de boucle.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk) count++;
Affectation lors de la déclaration de variable
Une valeur initiale peut être placée sur une variable au moment de sa déclaration comme illustré ci-dessous. L'affectation n'a pas de durée et conserve la valeur jusqu'à la prochaine affectation à la même variable. Notez que les affectations de déclaration de variable sur un tableau ne sont pas autorisées.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678;
// data aura dead_cafe du temps 0 au temps 20
// Au temps 20, data recevra 12345678
end
endmodule
reg [3:0] a = 4'b4; // est équivalent à
reg [3:0] a;
initial a = 4'b4;
Si la variable est initialisée lors de la déclaration et au temps 0 dans un bloc initial comme montré ci-dessous, l'ordre d'évaluation n'est pas garanti, et peut avoir soit 8'h05 soit 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illégal
integer i = 0, j; // déclare deux entiers i,j et i est assigné 0
real r2 = 4.5, r3 = 8; // déclare deux réels r2,r3 et sont assignés 4.5, 8 respectivement
time startTime = 40; // déclare une variable time avec valeur initiale 40
Les blocs procéduraux et affectations seront traités plus en détail dans une section ultérieure.
Affectation Continue
Cliquez ici pour un exemple de simulation pas à pas !
Ceci est utilisé pour affecter des valeurs sur des nets scalaires et vectoriels et se produit chaque fois qu'il y a un changement dans le RHS. Cela fournit un moyen de modéliser la logique combinatoire sans spécifier une interconnexion de portes et facilite le pilotage du net avec des expressions logiques.
// Modèle exemple d'une porte ET
wire a, b, c;
assign a = b & c;
Chaque fois que b ou c change de valeur, l'expression entière du RHS sera évaluée et a sera mis à jour avec la nouvelle valeur.
Affectation lors de la déclaration de net
Cela permet de placer une affectation continue sur la même instruction qui déclare le net. Notez que comme un net ne peut être déclaré qu'une seule fois, une seule affectation de déclaration est possible pour un net.
wire penable = 1;
Affectation Procédurale Continue
Ce sont des instructions procédurales qui permettent d'affecter continuellement des expressions à des nets ou des variables et sont de deux types :
assign...deassignforce...release
assign deassign
Cela remplace toutes les affectations procédurales à une variable et est désactivé en utilisant le même signal avec deassign. La valeur de la variable restera la même jusqu'à ce qu'elle reçoive une nouvelle valeur par une affectation procédurale ou procédurale continue. Le LHS d'une instruction assign ne peut pas être une sélection de bit, de partie ou une référence de tableau mais peut être une variable ou une concaténation de variables.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
force release
Ces instructions sont similaires aux instructions assign - deassign mais peuvent également être appliquées aux nets et variables. Le LHS peut être une sélection de bit d'un net, une sélection de partie d'un net, une variable ou un net mais ne peut pas être la référence à un tableau et une sélection de bit/partie d'une variable. L'instruction force remplacera toutes les autres affectations faites à la variable jusqu'à ce qu'elle soit libérée en utilisant le mot-clé release.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage
- Comprendre et Afficher les Timescales Verilog à Toute Portée
- Maîtriser les entrées/sorties de fichiers en Verilog : Ouvrir, Lire, Écrire et Fermer