Menu
CoddyTech

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 possono essere ignorati. Per esempio, in un codificatore di priorità, vuoi trovare il primo bit 1 indipendentemente dagli altri bit.

Un'istruzione case ordinaria richiederebbe di elencare ogni possibile combinazione dei bit indifferenti, cosa impossibile per bus ampi.

casez e casex risolvono questo problema consentendoti di contrassegnare determinati bit come "indifferenti" usando ?, z o x.

Casez vs Casex vs case normale

IstruzioneBit indifferentiIdeale per
caseNessunoCorrispondenza esatta
casezz o ?Codificatori di priorità (consigliato)
casexx, z o ?Da evitare (nasconde i bug)
  • casez ignora i bit che sono z o ? (consigliato)
  • casex ignora anche i bit x, che possono nascondere errori di simulazione

Usa sempre casez, non casex. casex è pericoloso perché ignora i valori x (che spesso indicano registri non inizializzati o errori di simulazione). casez è l'alternativa più sicura perché non tratta x come un valore indifferente.

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 "indifferente". Quel bit può essere 0, 1 o qualsiasi altro valore.

challenge icon

Sfida

Cosa fare:

Aggiungi l'istruzione casez mancante per far funzionare questo decodificatore.

Come funziona:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 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 l'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
  
endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online