Casex e casez
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 56 di 90.
A volte ti interessano solo bit specifici di un valore, mentre gli altri bit possono essere ignorati. Per esempio, in un codificatore di priorità, vuoi trovare il primo bit 1, indipendentemente dagli altri bit.
Un'istruzione case normale richiederebbe di elencare ogni combinazione possibile dei bit indifferenti, il che è impossibile per i bus ampi.
<strong>casez</strong> e <strong>casex</strong> risolvono questo problema consentendoti di contrassegnare determinati bit come "indifferenti" usando ?, z o x.
Casez vs Casex vs case regolare
| Istruzione | Bit indifferenti | Ideale per |
|---|---|---|
case | Nessuno | Corrispondenza esatta |
casez | z o ? | Codificatori di priorità (consigliato) |
casex | x, z o ? | Da evitare (nasconde i bug) |
<strong>casez</strong>ignora i bit che sonozo?(consigliato)<strong>casex</strong>ignora anche i bitx, il che può nascondere errori di simulazione
Usa sempre <strong>casez</strong>, non <strong>casex</strong>. casex è stato creato per primo, ma gli ingegneri si sono resi conto che era pericoloso perché ignora i valori x (che spesso indicano registri non inizializzati o errori di simulazione). casez è stato introdotto come alternativa più sicura.
Esempio
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? significa "non importa". Quel bit può essere 0, 1 o qualsiasi altra cosa.
Sfida
Cosa fare:
Aggiungi l'istruzione casez mancante per far funzionare questo decoder.
Come funziona:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 4'b1???→out = 4'b1000- Predefinito →
out = 4'b0000
Provalo tu
module decoder (
input [3:0] in,
output reg [3:0] out
);
always @(*) begin
// TODO: Aggiungi un'istruzione casez
// 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
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online