Case 문
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 55번째.
case 문을 사용하면 단일 표현식의 값을 기반으로 여러 다른 동작 중에서 선택할 수 있습니다. 동일한 변수를 여러 다른 값과 비교할 때 여러 개의 if-else 문을 사용하는 것보다 훨씬 깔끔한 대안입니다.
case 문은 식(expression)을 값 목록과 비교하여 일치하는 블록을 실행합니다. 다방향 분기(multi-way branch)와 같습니다.
구문:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcase조합 논리 <strong>case</strong> 문에는 <strong>default</strong>를 항상 포함하는 것이 강력히 권장됩니다. default가 없으면, sel이 예상치 못한 값(예: X 또는 Z)을 가질 때 out에 값이 할당되지 않아 이전 값을 래치(latch)하게 됩니다. 이는 순수 조합 논리 대신 의도치 않은 메모리(래치)를 생성하게 됩니다.
간단한 예제
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcasesel이 00이면 out은 a를 받습니다. sel이 01이면 out은 b를 받습니다. sel이 10이면 out은 c를 받습니다.
그렇지 않으면, out은 0을 얻습니다.
Case당 여러 문장 실행
여러 문장을 실행하려면 begin과 end를 사용합니다:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcase중요 규칙
| 규칙 | 설명 |
|---|---|
| Case 값은 고유해야 합니다 | 중복되는 경우 첫 번째로 일치하는 분기만 실행됩니다 |
| 값은 비트 너비와 일치해야 합니다 | 1'b1이 아닌 2'b01 |
default는 선택 사항이지만 권장됩니다 | 매핑되지 않은 값을 처리합니다 |
default가 없으면 매핑되지 않은 값으로 인해 래치가 발생합니다 | 조합 논리에서 |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| 적합한 용도 | 단일 변수, 다양한 값 | 복잡한 조건 |
| 가독성 | 매우 명확함 | 지저분해질 수 있음 |
| 예시 | 멀티플렉서, 디코더 | 비교기, 범위 검사 |
챌린지
Case 문 완료하기
작업 내용:
이 멀티플렉서가 작동하도록 누락된 case 문을 추가하세요.
작동 방식:
select = 2'b00일 때,result = in0select = 2'b01일 때,result = in1select = 2'b10일 때,result = in2select = 2'b11일 때,result = in3
직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.