Menu
Coddy logo textTech

Sentencia Case

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

La sentencia case permite elegir entre muchas acciones diferentes basándose en el valor de una sola expresión. Es una alternativa más limpia a múltiples sentencias if-else al comparar la misma variable con muchos valores diferentes.

La sentencia case compara una expresión con una lista de valores y ejecuta el bloque correspondiente. Es como una ramificación de múltiples vías.

Sintaxis:

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

Se recomienda encarecidamente incluir siempre <strong>default</strong> en una sentencia <strong>case</strong> combinacional. Sin default, si sel toma un valor inesperado (como X o Z), out no será asignado y retendrá (latch) su valor anterior. Esto crea memoria no deseada (un latch) en lugar de lógica combinacional pura.

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 recibe a. Si sel es 01, out recibe b. Si sel es 10, out recibe c.

De lo contrario, out obtiene 0.

Múltiples sentencias por caso

Utilice begin y end para múltiples sentencias:

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
Todos los valores de case deben ser únicosSin valores duplicados
Los valores deben coincidir con el ancho de bits2'b01 no 1'b1
default es opcional pero recomendadoCaptura valores no mapeados
Sin default, los valores no mapeados causan latchesEn lógica combinacional

Case vs If-Else

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

Desafío

Completa la sentencia Case

Qué hacer:

Añade la sentencia case que falta para que este multiplexor funcione.

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

Hoja de referencia

La sentencia case selecciona entre múltiples acciones basándose en una única expresión — una alternativa más limpia a los if-else encadenados.

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

Para múltiples sentencias por rama, utilice begin/end:

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

Incluya siempre default en la lógica combinacional. Sin él, los valores que no coinciden (por ejemplo, X, Z) hacen que la salida conserve su valor anterior, creando un latch no deseado.

Reglas clave:

  • Todos los valores del case deben ser únicos
  • Los valores deben coincidir con el ancho de bits de la expresión (por ejemplo, 2'b01, no 1'b1)
  • Utilice case para una variable frente a muchos valores; utilice if-else para condiciones complejas o de rango

Pruébalo tú mismo

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Agregar 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