Menu
CoddyTech

Casex y Casez

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 56 de 90.

A veces solo te interesan bits específicos de un valor, mientras que puedes ignorar los demás. Por ejemplo, en un codificador de prioridad, quieres encontrar el primer bit 1, independientemente de los demás bits.

Una instrucción case normal te exigiría enumerar todas las combinaciones posibles de los bits indiferentes, lo cual es imposible para buses anchos.

casez y casex resuelven este problema al permitirte marcar ciertos bits como «no importa» usando ?, z o x.

Casez vs. Casex vs. case normal

InstrucciónBits indiferentesIdeal para
caseNingunoCoincidencias exactas
casezz o ?Codificadores de prioridad (recomendado)
casexx, z o ?Evítalo (oculta errores)
  • casez ignora los bits que son z o ? (recomendado)
  • casex también ignora los bits x, lo que puede ocultar errores de simulación

Usa siempre casez, no casex. casex es peligroso porque ignora los valores x (que a menudo indican registros sin inicializar o errores de simulación). casez es la alternativa más segura porque no trata x como un valor indiferente.

Ejemplo

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 «no importa». Ese bit puede ser 0, 1 o cualquier valor.

challenge icon

Desafío

Qué hacer:

Agrega la instrucción casez que falta para que este decodificador funcione.

Cómo funciona:

  • 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
  • Predeterminado → out = 4'b0000

Pruébalo tú mismo

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: Añadir una sentencia 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online