Menu
Coddy logo textTech

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

StatementBits indiferentesMelhor para
caseNenhumCorrespondência exata
casezz ou ?Codificadores de prioridade (recomendado)
casexx, z ou ?Evite (oculta bugs)
  • <strong>casez</strong> ignora bits que são z ou ? (recomendado)
  • <strong>casex</strong> também ignora bits x, 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
endcase

O ? significa "não importa". Esse bit pode ser 0, 1 ou qualquer outra coisa.

challenge icon

Desafio

O que fazer:

Adicione a instrução casez ausente para fazer este decoder funcionar.

Como 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
  • 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
  
endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online