case 문은 주어진 표현식이 리스트의 다른 표현식 중 하나와 일치하는지 검사하고 그에 따라 분기합니다. 일반적으로 멀티플렉서를 구현하는 데 사용됩니다. 조건이 많으면 if-else 구조는 적합하지 않으며, 멀티플렉서 대신 우선순위 인코더로 합성될 수 있습니다.
문법
Verilog case 문은 case 키워드로 시작하고 endcase 키워드로 끝납니다. 괄호 안의 표현식은 정확히 한 번 평가되며, 작성된 순서대로 대안 리스트와 비교되어 일치하는 대안의 문장들이 실행됩니다. 여러 문장 블록은 begin과 end로 묶어야 합니다.
// 'expression'은 항목(item 1,2,3,4) 중 하나와 일치해야 함
case (<expression>)
case_item1 : <single statement>
case_item2, case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
어떤 case 항목도 주어진 표현식과 일치하지 않으면 default 항목의 문장이 실행됩니다. default 문은 선택 사항이며, case 문에서 하나만 가질 수 있습니다. Case 문은 중첩될 수 있습니다.
default 문이 없고 어떤 항목도 표현식과 일치하지 않으면 아무 작업도 하지 않고 case 블록을 빠져나갑니다.
예제
아래 설계 모듈은 2비트 선택 신호를 사용하여 세 개의 3비트 입력 중 하나를 out 출력 신호로 라우팅합니다. case 문을 사용하여 sel 값에 따라 올바른 입력을 출력에 할당합니다. sel이 2비트 신호이므로 22 가지 조합(0~3)을 가집니다. default 문은 sel이 3일 때 출력을 0으로 설정하는 데 도움이 됩니다.
module my_mux (
input [2:0] a, b, c, // 세 개의 3비트 입력
input [1:0] sel, // a, b, c 중 선택하는 2비트 선택 신호
output reg [2:0] out // 출력 3비트 신호
);
// a, b, c, sel 중 어느 하나라도 값이 변경되면 이 always 블록 실행
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // sel=0이면 출력은 a
2'b01 : out = b; // sel=1이면 출력은 b
2'b10 : out = c; // sel=2이면 출력은 c
default : out = 0; // 그 외 경우 out은 항상 0
endcase
end
endmodule