Instruction Case
Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 55 sur 90.
L'instruction case vous permet de choisir entre plusieurs actions différentes en fonction de la valeur d'une seule expression. C'est une alternative plus propre à plusieurs instructions if-else lors de la comparaison de la même variable à de nombreuses valeurs différentes.
L'instruction case compare une expression à une liste de valeurs et exécute le bloc correspondant. C'est comme un branchement multidirectionnel.
Syntaxe :
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseIl est fortement recommandé de toujours inclure <strong>default</strong> dans une instruction <strong>case</strong> combinatoire. Sans default, si sel prend une valeur inattendue (comme X ou Z), out ne sera pas assigné et va mémoriser (latch) sa valeur précédente. Cela crée une mémoire non intentionnelle (un latch) au lieu d'une logique combinatoire pure.
Exemple simple
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseSi sel est 00, out reçoit a. Si sel est 01, out reçoit b. Si sel est 10, out reçoit c.
Sinon, out reçoit 0.
Plusieurs instructions par cas
Utilisez begin et end pour plusieurs instructions :
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseRègles importantes
| Règle | Explication |
|---|---|
| Toutes les valeurs de cas doivent être uniques | Pas de valeurs en double |
| Les valeurs doivent correspondre à la largeur de bits | 2'b01 et non 1'b1 |
default est facultatif mais recommandé | Capture les valeurs non mappées |
Sans default, les valeurs non mappées provoquent des verrous (latches) | Dans la logique combinatoire |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Idéal pour | Une seule variable, plusieurs valeurs | Conditions complexes |
| Lisibilité | Très claire | Peut devenir complexe |
| Exemple | Multiplexeur, décodeur | Comparateur, vérifications de plage |
Défi
Complétez l'instruction Case
Ce qu'il faut faire :
Ajoutez l'instruction case manquante pour faire fonctionner ce multiplexeur.
Comment ça fonctionne :
- Quand
select = 2'b00,result = in0 - Quand
select = 2'b01,result = in1 - Quand
select = 2'b10,result = in2 - Quand
select = 2'b11,result = in3
Aide-mémoire
L'instruction case permet de choisir entre plusieurs actions basées sur une seule expression — une alternative plus propre aux if-else enchaînés.
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcasePour plusieurs instructions par branche, utilisez begin/end :
case (sel)
2'b00: out = a;
2'b01: begin
out = b;
flag = 1;
end
default: out = 0;
endcaseIncluez toujours default dans la logique combinatoire. Sans cela, les valeurs non correspondantes (par exemple, X, Z) font que la sortie conserve sa valeur précédente, créant un latch involontaire.
Règles clés :
- Toutes les valeurs de cas doivent être uniques
- Les valeurs doivent correspondre à la largeur de bits de l'expression (par exemple,
2'b01, et non1'b1) - Utilisez
casepour une seule variable par rapport à plusieurs valeurs ; utilisezif-elsepour des conditions complexes ou des plages de valeurs
Essayez vous-même
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Ajouter l'instruction case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1Introduction
Qu'est-ce que VerilogHardware vs SoftwareNiveaux d'abstraction de conceptionVotre premier moduleCommentaires4Opérateurs - Partie 1
Opérateurs arithmétiquesOpérateur moduloOpérateurs de comparaisonRécapitulatif - Mathématiques simplesOpérateurs bit à bit7Assignation et portes logiques
Assignation continueAssignation avec opérateursPrimitives de portes intégréesPortes AND OR NOTPortes XOR XNORRécapitulatif - Circuit à portes logiques10Prise de décision
Instruction IfIf - ElseRécapitulatif - Comparateur simpleInstruction CaseCasex et CasezRécapitulatif - Conception d'ALU2Types de données
Type WireType RegEntiers et RéelsVecteursTableauxParamètresRécapitulatif - Déclarer des signaux5Opérateurs - Partie 2
Opérateurs logiquesOpérateurs de réductionOpérateurs de décalageOpérateur de concaténationOpérateur conditionnelRécapitulatif - Défi sur les opérateurs11Boucles
Boucle ForBoucle WhileBoucle RépéterBoucle InfinieInstruction DisableRécapitulatif - Modèles de boucles3Système de numération
Représentation binaireNombres avec tailleNombres sans tailleNombres négatifsValeurs spéciales X et ZRécapitulatif - Formats de nombres6Modules
Structure d'un modulePorts d'entrée et de sortiePorts InoutInstanciation de moduleMappage de ports par nomMappage de ports par ordreRécapitulatif - Créer un module9Blocs procéduraux
Bloc AlwaysBloc InitialListe de sensibilitéAffectation bloquanteAffectation non bloquanteRécapitulatif - Always vs Initial12Projet Multiplexeur
Conception d'un Mux 2 vers 1Conception d'un Mux 4 vers 115Contrôleur de feux de circulation
Définition des étatsLogique de la machine à états