Menu
Coddy logo textTech

Casex And Casez

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

Manchmal interessieren dich nur bestimmte Bits in einem Wert, während andere Bits ignoriert werden können. Zum Beispiel möchtest du in einem Prioritätsencoder das erste 1-Bit finden, unabhängig von den anderen Bits.

Eine reguläre case-statement würde von dir 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 dir erlauben, bestimmte Bits mithilfe von ?, z oder x als „irrelevant“ zu kennzeichnen.

Casez vs Casex vs regulärer Case

StatementDon't-Care-BitsAm besten geeignet für
caseKeineExakte Übereinstimmung
casezz oder ?Prioritätskodierer (empfohlen)
casexx, z oder ?Vermeiden (verbirgt Fehler)
  • <strong>casez</strong> ignoriert Bits, die z oder ? sind (empfohlen)
  • <strong>casex</strong> ignoriert außerdem x-Bits, wodurch Simulationsfehler verborgen werden können

Verwende immer <strong>casez</strong>, nicht <strong>casex</strong>. casex wurde zuerst erstellt, aber Ingenieure erkannten, dass es gefährlich war, weil es x-Werte ignoriert (die häufig 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 „egal“. 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.

So funktioniert es:

  • 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

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

Übe selbstständig: Online-Verilog-Compiler