Menu
Coddy logo textTech

Casex und Casez

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 56 von 90.

Manchmal interessieren Sie sich nur für bestimmte Bits in einem Wert, während andere Bits ignoriert werden können. In einem Prioritäts-Encoder möchten Sie beispielsweise das erste 1-Bit finden, unabhängig von den anderen Bits.

Ein reguläres case-Statement würde verlangen, dass Sie jede mögliche Kombination der Don't-Care-Bits auflisten — was bei breiten Bussen unmöglich ist.

<strong>casez</strong> und <strong>casex</strong> lösen dieses Problem, indem sie Ihnen erlauben, bestimmte Bits mit ?, z oder x als "don't care" zu markieren.

Casez vs Casex vs Regular Case

AnweisungDon't-Care-BitsAm besten für
caseKeineExakte Übereinstimmung
casezz oder ?Prioritäts-Encoder (empfohlen)
casexx, z oder ?Vermeiden (versteckt Fehler)
  • <strong>casez</strong> ignoriert Bits, die z oder ? sind (empfohlen)
  • <strong>casex</strong> ignoriert auch x-Bits — was Simulationsfehler verbergen kann

Verwenden Sie immer <strong>casez</strong>, nicht <strong>casex</strong>. casex wurde zuerst erstellt, aber Ingenieure erkannten, dass es gefährlich war, da es x-Werte ignoriert (welche oft auf nicht initialisierte Register oder Simulationsfehler hinweisen). casez wurde als sicherere Alternative eingeführt.

Beispiel

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

Das ? bedeutet "don't care" – dieses Bit kann 0, 1 oder irgendetwas sein.

challenge icon

Aufgabe

Was zu tun ist:

Füge die fehlende casez-Anweisung hinzu, damit dieser Decoder funktioniert.

Wie es funktioniert:

  • input = 4'b???1out = 4'b0001
  • input = 4'b??1?out = 4'b0010
  • input = 4'b?1??out = 4'b0100
  • input = 4'b1???out = 4'b1000
  • Standard (Default) → out = 4'b0000

Probier es selbst

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: casez-Anweisung hinzufügen
    // 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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen