Menu
Coddy logo textTech

Case 문

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 55번째.

case 문을 사용하면 단일 표현식의 값에 따라 여러 가지 다른 동작 중에서 선택할 수 있습니다. 동일한 변수를 여러 다른 값과 비교할 때 여러 개의 if-else 문을 사용하는 것보다 더 깔끔한 대안입니다.

case 문은 표현식을 값 목록과 비교하고 일치하는 블록을 실행합니다. 이것은 다중 분기(multi-way branch)와 같습니다.

구문:

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

조합(combinational) case 문에는 항상 default를 포함하는 것이 강력히 권장됩니다. default가 없으면, sel이 예상치 못한 값(예: X 또는 Z)을 가질 때, out에 값이 할당되지 않고 이전 값을 래치(latch)하게 됩니다. 이는 순수 조합 논리 대신 의도하지 않은 메모리(래치)를 생성하게 됩니다.

간단한 예제

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

만약 sel00이면 outa를 가집니다. 만약 sel01이면 outb를 가집니다. 만약 sel10이면 outc를 가집니다.

그렇지 않으면, out0이 됩니다.

케이스별 다중 문 처리

여러 문장을 사용하려면 beginend를 사용하세요:

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

중요 규칙

규칙설명
모든 case 값은 고유해야 합니다중복된 값 없음
값은 비트 폭과 일치해야 합니다2'b01이며 1'b1이 아님
default는 선택 사항이지만 권장됩니다매핑되지 않은 값을 처리합니다
default가 없으면 매핑되지 않은 값으로 인해 래치(latch)가 발생합니다조합 논리 회로에서

Case vs If-Else

 CaseIf-Else
가장 적합한 용도하나의 변수, 여러 값복잡한 조건
가독성매우 명확함지저분해질 수 있음
예시멀티플렉서, 디코더비교기, 범위 체크
challenge icon

챌린지

Case 문 완성하기

수행할 작업:

이 멀티플렉서가 작동하도록 누락된 case 문을 추가하세요.

작동 원리:

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

치트 시트

case 문은 단일 표현식을 기반으로 여러 동작 중에서 하나를 선택합니다. 이는 체인으로 연결된 if-else 문에 대한 더 깔끔한 대안입니다.

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

분기당 여러 문을 사용하려면 begin/end를 사용하세요:

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

조합 논리(combinational logic)에서는 항상 default를 포함하세요. 이것이 없으면 일치하지 않는 값(예: X, Z)으로 인해 출력이 이전 값을 유지하게 되어, 의도하지 않은 래치(latch)가 생성됩니다.

주요 규칙:

  • 모든 case 값은 고유해야 합니다.
  • 값은 표현식의 비트 폭(bit width)과 일치해야 합니다 (예: 1'b1이 아닌 2'b01).
  • 하나의 변수 대 여러 값을 비교할 때는 case를 사용하고, 복잡하거나 범위 조건인 경우에는 if-else를 사용하세요.

직접 해보기

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: case 문 추가
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
endmodule
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨