Menu
Coddy logo textTech

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 los bits específicos de un valor, mientras que otros bits pueden ignorarse. Por ejemplo, en un codificador de prioridad, quieres encontrar el primer bit 1 independientemente de los otros bits.

Una sentencia case regular requeriría que enumeraras cada combinación posible de los bits "don't-care", lo cual es imposible para buses anchos.

<strong>casez</strong> y <strong>casex</strong> resuelven este problema al permitirte marcar ciertos bits como "don't care" usando ?, z o x.

Casez vs Casex vs Case regular

SentenciaBits "Don't-Care"Mejor para
caseNingunoCoincidencia exacta
casezz o ?Codificadores de prioridad (recomendado)
casexx, z o ?Evitar (oculta errores)
  • <strong>casez</strong> ignora los bits que son z o ? (recomendado)
  • <strong>casex</strong> también ignora los bits x — lo que puede ocultar errores de simulación

Siempre usa <strong>casez</strong>, no <strong>casex</strong>. casex fue creado primero, pero los ingenieros se dieron cuenta de que era peligroso porque ignora los valores x (que a menudo indican registros no inicializados o errores de simulación). casez fue introducido como una alternativa más segura.

Ejemplo

casez (data)
  4'b???1: out = 0;   // El bit 0 debe ser 1, los demás no importan
  4'b??1?: out = 1;   // El bit 1 debe ser 1, los demás no importan
  4'b?1??: out = 2;   // El bit 2 debe ser 1, los demás no importan
  4'b1???: out = 3;   // El bit 3 debe ser 1, los demás no importan
endcase

El ? significa "no importa" — ese bit puede ser 0, 1 o cualquier cosa.

challenge icon

Desafío

Qué hacer:

Añade la sentencia casez que falta para que este decodificador funcione.

Cómo funciona:

  • input = 4'b???1out = 4'b0001
  • input = 4'b??1?out = 4'b0010
  • input = 4'b?1??out = 4'b0100
  • input = 4'b1???out = 4'b1000
  • Default → out = 4'b0000

Hoja de referencia

casez permite la coincidencia de patrones con bits de "no importa" (don't-care) utilizando ? o z, lo cual es útil para codificadores de prioridad donde solo importan bits específicos.

SentenciaBits Don't-CareNotas
caseNingunoCoincidencia exacta
casezz o ?Recomendado
casexx, z, o ?Evitar — oculta errores

Prefiera siempre casez sobre casex. casex ignora los valores x, lo que puede enmascarar registros no inicializados o errores de simulación.

casez (data)
  4'b???1: out = 0;   // Bit0 debe ser 1, los demás no importan
  4'b??1?: out = 1;   // Bit1 debe ser 1, los demás no importan
  4'b?1??: out = 2;   // Bit2 debe ser 1, los demás no importan
  4'b1???: out = 3;   // Bit3 debe ser 1, los demás no importan
  default: out = 0;
endcase

El ? significa "no importa" — ese bit puede ser 0, 1, o cualquier cosa.

Pruébalo tú mismo

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: Agregar 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