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
| Sentencia | Bits "Don't-Care" | Mejor para |
|---|---|---|
case | Ninguno | Coincidencia exacta |
casez | z o ? | Codificadores de prioridad (recomendado) |
casex | x, z o ? | Evitar (oculta errores) |
<strong>casez</strong>ignora los bits que sonzo?(recomendado)<strong>casex</strong>también ignora los bitsx— 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
endcaseEl ? significa "no importa" — ese bit puede ser 0, 1 o cualquier cosa.
Desafío
Qué hacer:
Añade la sentencia casez que falta para que este decodificador funcione.
Cómo funciona:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 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.
| Sentencia | Bits Don't-Care | Notas |
|---|---|---|
case | Ninguno | Coincidencia exacta |
casez | z o ? | Recomendado |
casex | x, 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;
endcaseEl ? 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
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo