Casex und Casez
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 56 von 90.
Manchmal interessieren dich nur bestimmte Bits eines Werts, während andere Bits ignoriert werden können. In einem Prioritätsencoder möchtest du zum Beispiel das erste Bit 1 finden, unabhängig von den anderen Bits.
Eine normale case-Anweisung würde erfordern, dass du jede mögliche Kombination der Don't-Care-Bits auflistest, was bei breiten Bussen unmöglich ist.
casez und casex lösen dieses Problem, indem du bestimmte Bits mit ?, z oder x als „egal“ markieren kannst.
casez vs. casex vs. reguläres case
| Anweisung | Bits ohne Bedeutung | Am besten geeignet für |
|---|---|---|
case | Keine | Exakte Übereinstimmung |
casez | z oder ? | Prioritätsencoder (empfohlen) |
casex | x, z oder ? | Vermeiden (verschleiert Fehler) |
casezignoriert Bits, diezoder?sind (empfohlen)casexignoriert auchx-Bits, wodurch Simulationsfehler verborgen werden können
Verwende immer casez, nicht casex. casex ist gefährlich, weil es x-Werte ignoriert (die oft auf nicht initialisierte Register oder Simulationsfehler hinweisen). casez ist die sicherere Alternative, weil es x nicht als „Don't-Care“-Wert behandelt.
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? bedeutet „egal“. Dieses Bit kann 0, 1 oder irgendetwas sein.
Aufgabe
Was zu tun ist:
Füge die fehlende casez-Anweisung hinzu, damit dieser Decoder funktioniert.
So funktioniert es:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 4'b1???→out = 4'b1000- Standardfall →
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. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler