Menu
CoddyTech

Casex et Casez

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

Parfois, seuls certains bits précis d’une valeur vous intéressent, tandis que les autres peuvent être ignorés. Par exemple, dans un encodeur de priorité, vous voulez trouver le premier bit 1, quels que soient les autres bits.

Une instruction case classique vous obligerait à énumérer toutes les combinaisons possibles des bits indifférents, ce qui est impossible pour les bus larges.

casez et casex résolvent ce problème en vous permettant de marquer certains bits comme « indifférents » à l’aide de ?, z ou x.

casez vs casex vs case ordinaire

InstructionBits indifférentsIdéal pour
caseAucunCorrespondance exacte
casezz ou ?Encodeurs de priorité (recommandé)
casexx, z ou ?À éviter (masque les bogues)
  • casez ignore les bits qui sont z ou ? (recommandé)
  • casex ignore également les bits x, ce qui peut masquer des erreurs de simulation

Utilisez toujours casez, pas casex. casex est dangereux, car il ignore les valeurs x (qui indiquent souvent des registres non initialisés ou des erreurs de simulation). casez est l’alternative la plus sûre, car il ne traite pas x comme une valeur indifférente.

Exemple

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
endcase

Le ? signifie « peu importe ». Ce bit peut être 0, 1 ou n’importe quoi.

challenge icon

Défi

À faire :

Ajoute l'instruction casez manquante pour faire fonctionner ce décodeur.

Fonctionnement :

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 4'b1??? → out = 4'b1000
  • Par défaut → out = 4'b0000

Essayez vous-même

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: Ajouter une instruction casez
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  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