Casex And Casez
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 56 de 90.
Às vezes, você só se importa com bits específicos em um valor, enquanto outros bits podem ser ignorados. Por exemplo, em um codificador de prioridade, você quer encontrar o primeiro bit 1, independentemente dos outros bits.
Uma instrução case comum exigiria que você listasse todas as combinações possíveis dos bits don't-care, o que é impossível para barramentos largos.
<strong>casez</strong> e <strong>casex</strong> resolvem esse problema permitindo que você marque certos bits como "não importam" usando ?, z ou x.
Casez vs Casex vs Case regular
| Statement | Bits indiferentes | Melhor para |
|---|---|---|
case | Nenhum | Correspondência exata |
casez | z ou ? | Codificadores de prioridade (recomendado) |
casex | x, z ou ? | Evite (oculta bugs) |
<strong>casez</strong>ignora bits que sãozou?(recomendado)<strong>casex</strong>também ignora bitsx, o que pode ocultar erros de simulação
Sempre use <strong>casez</strong>, não <strong>casex</strong>. casex foi criado primeiro, mas os engenheiros perceberam que ele era perigoso porque ignora valores x (que frequentemente indicam registradores não inicializados ou erros de simulação). casez foi introduzido como uma alternativa mais segura.
Exemplo
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
endcaseO ? significa "não importa". Esse bit pode ser 0, 1 ou qualquer outra coisa.
Desafio
O que fazer:
Adicione a instrução casez ausente para fazer este decoder funcionar.
Como 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- Padrão →
out = 4'b0000
Experimente você mesmo
module decoder (
input [3:0] in,
output reg [3:0] out
);
always @(*) begin
// TODO: Adicionar a declaração 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operators 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 LogicPratique por conta própria: Compilador de Verilog online