Menu
Coddy logo textTech

Casex und Casez

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

Manchmal sind nur bestimmte Bits in einem Wert von Bedeutung, während andere Bits ignoriert werden können. Zum Beispiel möchten Sie in einem Prioritäts-Encoder das erste 1-Bit finden, unabhängig von den anderen Bits.

Eine reguläre case-Anweisung würde von Ihnen verlangen, jede mögliche Kombination der Don't-Care-Bits aufzulisten — was bei breiten Bussen unmöglich ist.

<strong>casez</strong> und <strong>casex</strong> lösen dieses Problem, indem sie es Ihnen ermöglichen, bestimmte Bits unter Verwendung von ?, z oder x als „don't care“ zu markieren.

Casez vs. Casex vs. reguläres Case

AnweisungDon't-Care-BitsBestens geeignet für
caseKeineExakte Übereinstimmung
casezz oder ?Prioritäts-Encoder (empfohlen)
casexx, z oder ?Vermeiden (verbirgt Bugs)
  • <strong>casez</strong> ignoriert Bits, die z oder ? sind (empfohlen)
  • <strong>casex</strong> ignoriert ebenfalls 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 ist, da es x-Werte ignoriert (die oft auf nicht initialisierte Register oder Simulationsfehler hinweisen). casez wurde als sicherere Alternative eingeführt.

Beispiel

casez (data)
  4'b???1: out = 0;   // Bit0 muss 1 sein, andere sind egal
  4'b??1?: out = 1;   // Bit1 muss 1 sein, andere sind egal
  4'b?1??: out = 2;   // Bit2 muss 1 sein, andere sind egal
  4'b1???: out = 3;   // Bit3 muss 1 sein, andere sind egal
endcase

Das ? bedeutet „egal“ – dieses Bit kann 0, 1 oder beliebig sein.

challenge icon

Aufgabe

Was zu tun ist:

Fügen Sie 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
  • Default → out = 4'b0000

Spickzettel

casez ermöglicht den Mustervergleich mit Don't-Care-Bits unter Verwendung von ? oder z, was nützlich für Prioritäts-Encoder ist, bei denen nur bestimmte Bits von Bedeutung sind.

AnweisungDon't-Care-BitsAnmerkungen
caseKeineExakte Übereinstimmung
casezz oder ?Empfohlen
casexx, z, oder ?Vermeiden — verbirgt Fehler

Bevorzugen Sie immer casez gegenüber casex. casex ignoriert x-Werte, was nicht initialisierte Register oder Simulationsfehler maskieren kann.

casez (data)
  4'b???1: out = 0;   // Bit0 muss 1 sein, andere sind egal
  4'b??1?: out = 1;   // Bit1 muss 1 sein, andere sind egal
  4'b?1??: out = 2;   // Bit2 muss 1 sein, andere sind egal
  4'b1???: out = 3;   // Bit3 muss 1 sein, andere sind egal
  default: out = 0;
endcase

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

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