Menu
CoddyTech

Instruction Case

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 55 sur 90.

L’instruction case permet de choisir parmi de nombreuses actions différentes en fonction de la valeur d’une seule expression. C’est une alternative plus claire à plusieurs instructions if-else lorsqu’on compare 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. Elle fonctionne comme une branche à plusieurs voies.

Syntaxe :

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

Il est fortement recommandé de toujours inclure default dans une instruction combinatoire case. Sans default, si sel prend une valeur qui ne figure dans aucun élément de case, out n’est pas affecté et conserve sa valeur précédente. Lorsqu’une valeur de sel composée uniquement de bits 0 et 1 ne correspond à aucune branche, la synthèse crée une mémoire non souhaitée (un verrou) au lieu d’une logique purement combinatoire. Un X ou un Z sur sel laisse également out inchangé en simulation, mais ne crée pas de verrou.

Exemple simple

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

Si sel vaut 00, out reçoit a. Si sel vaut 01, out reçoit b. Si sel vaut 10, out reçoit c.

Sinon, out vaut 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;
endcase

Règles importantes

RègleExplication
Les valeurs des cas doivent être uniquesEn cas de doublons, seule la première branche correspondante est exécutée
Les valeurs doivent correspondre à la largeur en bitsÉcris 2'b01, et non 1'b1 (une valeur plus courte est complétée par des zéros)
default est facultatif, mais recommandéIntercepte les valeurs non mappées
Sans default, les valeurs non mappées provoquent des verrousEn logique combinatoire

Case vs If-Else

 CaseIf-Else
Idéal pourUne variable, plusieurs valeursConditions complexes
LisibilitéTrès clairPeut devenir confus
ExempleMultiplexeur, décodeurComparateur, vérifications de plage
challenge icon

Défi

Compléter l’instruction case

À faire :

Ajoute l’instruction case manquante pour faire fonctionner ce multiplexeur.

Fonctionnement :

  • Lorsque select = 2'b00, result = in0
  • Lorsque select = 2'b01, result = in1
  • Lorsque select = 2'b10, result = in2
  • Lorsque select = 2'b11, result = in3

Essayez vous-même

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Ajouter une instruction case
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne