Menu
CoddyTech

Declaração Case

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 55 de 90.

A instrução case permite escolher entre muitas ações diferentes com base no valor de uma única expressão. Ela é uma alternativa mais organizada a várias instruções if-else ao comparar a mesma variável com muitos valores diferentes.

A instrução case compara uma expressão com uma lista de valores e executa o bloco correspondente. É como um desvio com várias opções.

Sintaxe:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

É altamente recomendável sempre incluir default em uma instrução combinacional case. Sem default, se sel assumir um valor que não esteja listado em nenhum item do case, out não será atribuído e manterá seu valor anterior. Quando um valor de sel composto apenas por bits 0 e 1 não tiver uma ramificação correspondente, a síntese criará uma memória não intencional (um latch) em vez de lógica puramente combinacional. Um X ou Z em sel também deixa out inalterado na simulação, mas não cria um latch.

Exemplo simples

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

Se sel for 00, out recebe a. Se sel for 01, out recebe b. Se sel for 10, out recebe c.

Caso contrário, out recebe 0.

Várias instruções por caso

Use begin e end para várias instruções:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

Regras importantes

RegraExplicação
Os valores dos casos devem ser únicosCom valores duplicados, apenas a primeira ramificação correspondente é executada
Os valores devem corresponder à largura de bitsEscreva 2'b01, não 1'b1 (um valor mais curto é preenchido com zeros)
default é opcional, mas recomendadoCaptura valores não mapeados
Sem default, valores não mapeados causam latchesEm lógica combinacional

Case vs If-Else

 CaseIf-Else
Ideal paraUma variável, muitos valoresCondições complexas
LegibilidadeMuito claroPode ficar confuso
ExemploMultiplexador, decodificadorComparador, verificações de intervalo
challenge icon

Desafio

Complete a instrução case

O que fazer:

Adicione a instrução case que está faltando para fazer este multiplexador funcionar.

Como funciona:

  • Quando select = 2'b00, result = in0
  • Quando select = 2'b01, result = in1
  • Quando select = 2'b10, result = in2
  • Quando select = 2'b11, result = in3

Experimente você mesmo

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Adicionar instrução case
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  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