Maîtriser le Flux de Contrôle Verilog : IF-ELSE, Case, Boucles et Plus
Le comportement matériel ne peut être implémenté sans instructions conditionnelles et autres moyens de contrôler le flux de logique. Verilog dispose d'un ensemble de blocs et mécanismes de contrôle de flux pour y parvenir.
if-else-if
Cet énoncé conditionnel est utilisé pour décider si certaines instructions doivent être exécutées ou non. Cela ressemble beaucoup aux instructions if-else-if en C. Si l'expression s'évalue à vrai, la première instruction sera exécutée. Si l'expression s'évalue à faux et s'il existe une partie else, cette partie sera exécutée.
// instruction if sans partie else
if (expression) [instruction]
// instruction if avec une partie else
if (expression) [instruction] else [instruction]
// if else pour plusieurs instructions doit être
// enclôt entre "begin" et "end"
if (expression) begin [instructions multiples] end else begin [instructions multiples] end
// instruction if-else-if
if (expression) [instruction] else if (expression) [instruction] else [instruction]
La partie else d'un if-else est optionnelle et peut causer une confusion si un else est omis dans une séquence if imbriquée. Pour éviter cette confusion, il est plus facile d'associer toujours le else au if précédent qui n'a pas de else. Une autre façon est d'enclore les instructions dans un bloc begin-end. La dernière partie else gère le cas "aucun des précédents" ou cas par défaut où aucune des autres conditions n'a été satisfaite.
Cliquez ici pour en savoir plus sur if-else-if
Les boucles fournissent un moyen d'exécuter une ou plusieurs instructions dans un bloc une ou plusieurs fois. Il existe quatre types d'instructions de boucle en Verilog.
Boucle forever
Cela exécute continuellement les instructions dans le bloc.
forever [instruction]
forever begin [instructions multiples] end
Exemple
module my_design;
initial begin
forever begin
$display ("Ceci s'affichera pour toujours, la simulation peut bloquer ...");
end
end
endmodule
Journal de Simulation
ncsim> run This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... ... This will be printed forever, simulation can hang ... Result reached the maximum of 5000 lines. Killing process.
Boucle repeat
Cela exécute les instructions un nombre fixe de fois. Si l'expression s'évalue à X ou Z, elle sera traitée comme zéro et ne sera pas exécutée du tout.
repeat ([nombre_de_fois]) begin [instructions] end
repeat ([nombre_de_fois]) @ ([quelque_evenement]) begin [instructions] end
Exemple
module my_design;
initial begin
repeat(4) begin
$display("Ceci est une nouvelle itération ...");
end
end
endmodule
Journal de Simulation
ncsim> run This is a new iteration ... This is a new iteration ... This is a new iteration ... This is a new iteration ... ncsim: *W,RNQUIE: Simulation is complete.
Boucle while
Cela exécute les instructions aussi longtemps qu'une expression est vraie et sort une fois que la condition devient fausse. Si la condition est fausse dès le début, les instructions ne seront pas exécutées du tout.
while (expression) begin [instructions] end
Exemple
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Itération#%0d", i);
i = i - 1;
end
end
endmodule
Journal de Simulation
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
Boucle for
for (affectation_initiale; condition; incrément_variable) begin [instructions] end
Cela contrôle les instructions en utilisant un processus en trois étapes :
- Initialiser une variable de compteur de boucle
- Évaluer l'expression, généralement impliquant la variable de compteur de boucle
- Incrémenter la variable de compteur de boucle pour qu'à un moment ultérieur l'expression devienne fausse et que la boucle se termine.
Exemple
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Boucle #%0d", i);
end
end
endmodule
Journal de Simulation
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Cliquez ici pour en savoir plus sur les boucles for.
Verilog
- Expressions, instructions et blocs C# : Guide complet avec exemples pratiques
- Comprendre les expressions, instructions et blocs en Java
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser le Flux de Contrôle Verilog : IF-ELSE, Case, Boucles et Plus
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation