Verilog 기초 문법과 관련된 것도 하나씩 정리해 보자. 오늘은 case 문이다.
if 문과는 다르게 병력적으로 우선순위 없이 생긴다는 장점이 있다.
반드시 우선순위가 필요하다면 if else 문을 사용해야 하며, 같은 조건에서 mux 하는 로직 같은 경우에는 case 문을 활용하면 된다.
아래 문법과 예제는 다음 사이트에서 참고하였다.
https://vlsiverify.com/verilog/case-statement/
Case 문법
기본 문법은 다음과 같다.
case(<expression>)
<case_item1>:
<case_item2>:
<case_item3>:
<case_item4>: begin
...
...
end
default:
endcase
사실 예제로 보는 게 가장 낫다.
Case 예제
module case_example;
reg [2:0] data;
always @(data) begin
case(data)
3'h2: $display("value of data is 2");
3'h4: $display("value of data is 4");
3'h5: $display("value of data is 5");
default: $display("default statement is executed for data = %0d", data);
endcase
end
initial begin
repeat(10) begin
data = $random;
#1;
end
end
endmodule
결과는 다음과 같다.
value of data is 4
default statement is executed for data = 1
default statement is executed for data = 3
value of data is 5
value of data is 2
default statement is executed for data = 1
value of data is 5
default 문이 없어도 된다. 모든 else 조건이 필요하다면 반드시 넣도록 하고
사실 합성을 위해서도 넣는 것이 좋다.
모든 조건이 클리어 한것이 로직 설계의 기본이라고 할 수 있다. 애매한 거를 싫어해요
예제 하나더 from https://nandland.com/case-statement-2/
module case_statement ();
reg r_VAL_1 = 1'b0;
reg r_VAL_2 = 1'b0;
reg r_VAL_3 = 1'b0;
reg [3:0] r_RESULT = 4'b0000;
// Uses r_VAL_1, r_VAL_2, and r_VAL_3 together to drive a case statement
// This always block is synthesizable
always @(*)
begin
case ({r_VAL_1, r_VAL_2, r_VAL_3})
3'b000 : r_RESULT <= 0;
3'b001 : r_RESULT <= 1;
3'b010 : r_RESULT <= 2;
default : r_RESULT <= 9;
endcase
end
// *Initial* is never synthesizable. Test code only!
initial begin
r_VAL_1 <= 1'b0;
r_VAL_2 <= 1'b0;
r_VAL_3 <= 1'b0;
#100;
r_VAL_2 <= 1'b0;
r_VAL_3 <= 1'b1;
#100;
r_VAL_2 <= 1'b1;
r_VAL_3 <= 1'b0;
#100;
r_VAL_2 <= 1'b1;
r_VAL_3 <= 1'b1;
#100;
#1000000;
end
endmodule // case_statement
case 문에 bit 별로 결합해서 사용도 가능하다.
예제에 주석달린것 처럼 initial 문은 합성되는 것은 아니고 모델심, ncsim 같은 시뮬레이터에서 도는 코드들이다.
if vs case
2가지 구문의 차이점은 아래글을 참고하세요
https://www.kevnugent.com/2020/10/22/verilog-blogpost_002/
'IT > ASIC | FPGA' 카테고리의 다른 글
Verilog - RGMII 샘플 코드 - 북마크 (0) | 2024.02.15 |
---|---|
Verilog - Assignment 할당 구문 - blocking, non-blocking (0) | 2024.02.15 |
Xilinx Vivado - 다운로드 및 설치 (1) | 2024.02.13 |
Verilog - flatten array - 2차원 배열 1차원으로 변환 (1) | 2024.02.05 |
Xilinx Vivado - FPGA 에 bit 생성해서 올리기 - 보드 테스트 (1) | 2024.02.02 |