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만약 sel이 00이면 out은 a를 가집니다. 만약 sel이 01이면 out은 b를 가집니다. 만약 sel이 10이면 out은 c를 가집니다.
그렇지 않으면, out은 0이 됩니다.
케이스별 다중 문 처리
여러 문장을 사용하려면 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 값은 고유해야 합니다 | 중복된 값 없음 |
| 값은 비트 폭과 일치해야 합니다 | 2'b01이며 1'b1이 아님 |
default는 선택 사항이지만 권장됩니다 | 매핑되지 않은 값을 처리합니다 |
default가 없으면 매핑되지 않은 값으로 인해 래치(latch)가 발생합니다 | 조합 논리 회로에서 |
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
치트 시트
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.