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ón | Bits indiferentes | Ideal para |
|---|---|---|
case | Ninguno | Coincidencias exactas |
casez | z o ? | Codificadores de prioridad (recomendado) |
casex | x, z o ? | Evítalo (oculta errores) |
casezignora los bits que sonzo?(recomendado)casextambién ignora los bitsx, 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.
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'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 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
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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: 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 condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un móduloPractica por tu cuenta: Compilador de Verilog online