Menu
CoddyTech

Sentencia Case

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 55 de 90.

La sentencia case te permite elegir entre muchas acciones diferentes en función del valor de una sola expresión. Es una alternativa más clara que usar varias sentencias if-else para comparar la misma variable con muchos valores diferentes.

La instrucción case compara una expresión con una lista de valores y ejecuta el bloque coincidente. Es como una bifurcación de varias vías.

Sintaxis:

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

Se recomienda encarecidamente incluir siempre default en una instrucción combinacional case. Sin default, si sel toma un valor que no aparece en ningún elemento de caso, no se asigna out y conserva su valor anterior. Cuando un valor de sel formado únicamente por bits 0 y 1 no tiene una rama, la síntesis crea una memoria no deseada (un latch) en lugar de lógica puramente combinacional. Una X o una Z en sel también deja out sin cambios en la simulación, pero no crea un latch.

Ejemplo sencillo

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

Si sel es 00, out obtiene a. Si sel es 01, out obtiene b. Si sel es 10, out obtiene c.

De lo contrario, out obtiene 0.

Múltiples instrucciones por caso

Usa begin y end para varias instrucciones:

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

Reglas importantes

ReglaExplicación
Los valores de caso deben ser únicosSi hay duplicados, solo se ejecuta la primera rama coincidente
Los valores deben coincidir con el ancho de bitsEscribe 2'b01, no 1'b1 (un valor más corto se rellena con ceros)
default es opcional, pero recomendableDetecta los valores sin asignar
Sin default, los valores sin asignar provocan latchesEn la lógica combinacional

Case frente a If-Else

 CaseIf-Else
Ideal paraUna variable, muchos valoresCondiciones complejas
LegibilidadMuy claroPuede volverse complicado
EjemploMultiplexor, decodificadorComparador, comprobaciones de rango
challenge icon

Desafío

Completa la instrucción case

Qué hacer:

Añade la instrucción case que falta para que funcione este multiplexor.

Cómo funciona:

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

Pruébalo tú mismo

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Añade una sentencia case
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online