Casex And 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 otros bits pueden ignorarse. Por ejemplo, en un codificador de prioridad, quieres encontrar el primer bit 1 independientemente de los demás bits.
Una instrucción case statement normal te exigiría enumerar todas las combinaciones posibles de los bits que no importan, lo cual es imposible para buses amplios.
<strong>casez</strong> y <strong>casex</strong> resuelven este problema al permitirte marcar ciertos bits como «no importa» usando ?, z o x.
Casez vs Casex vs Case normal
| statement | Bits que no importan | 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
Always usa <strong>casez</strong>, no <strong>casex</strong>. casex se creó 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 se introdujo como una alternativa más segura.
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
endcaseEl símbolo ? significa «no importa». Ese bit puede ser 0, 1 o cualquier otra cosa.
Desafío
Qué hacer:
Add la instrucción casez que falta para que este decoder 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
Pruébalo tú mismo
module decoder (
input [3:0] in,
output reg [3:0] out
);
always @(*) begin
// TODO: Añadir 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ño4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPractica por tu cuenta: Compilador de Verilog online