본문 바로가기

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/

if else 와 case 차이점

 

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.