Case 문
Coddy Verilog 여정의 기초 섹션에 포함된 레슨. 90개 중 55번째.
case 문은 하나의 표현식 값에 따라 여러 가지 동작 중 하나를 선택할 수 있게 해 줍니다. 같은 변수를 여러 값과 비교할 때 여러 개의 if-else 문을 사용하는 것보다 더 깔끔한 대안입니다.
case 문은 표현식을 값 목록과 비교하고 일치하는 블록을 실행합니다. 여러 갈래로 분기하는 것과 같습니다.
구문:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcase조합 case 문에는 항상 default를 포함하는 것이 좋습니다. default가 없으면 sel이 어떤 case 항목에도 나열되지 않은 값을 갖는 경우 out이 할당되지 않고 이전 값을 유지합니다. 0과 1 비트만으로 이루어진 sel 값에 해당하는 분기가 없으면, 합성 과정에서 순수 조합 논리 대신 의도하지 않은 메모리(래치)가 만들어집니다. sel에 X 또는 Z가 있어도 시뮬레이션에서 out은 변하지 않지만, 래치가 만들어지지는 않습니다.
간단한 예제
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을 작성합니다(더 짧은 값은 0으로 채워집니다) |
default는 선택 사항이지만 권장됩니다 | 매핑되지 않은 값을 처리합니다 |
default가 없으면 매핑되지 않은 값으로 인해 래치가 발생합니다 | 조합 논리에서 |
Case와 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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: 온라인 Verilog 컴파일러