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
| Anweisung | Don't-Care-Bits | Am besten für |
|---|---|---|
case | Keine | Exakte Übereinstimmung |
casez | z oder ? | Prioritäts-Encoder (empfohlen) |
casex | x, z oder ? | Vermeiden (versteckt Fehler) |
<strong>casez</strong>ignoriert Bits, diezoder?sind (empfohlen)<strong>casex</strong>ignoriert auchx-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
endcaseDas ? bedeutet "don't care" – dieses Bit kann 0, 1 oder irgendetwas sein.
Aufgabe
Was zu tun ist:
Füge die fehlende casez-Anweisung hinzu, damit dieser Decoder funktioniert.
Wie es funktioniert:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 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
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen