Verilog : case문 사용시 full_case를 선언하여 자동으로 생성되는 latch logic을 막자

간단한 3-to–1 MUX 예제를 살펴보자.

module mux3to1 ( output reg y, input a,b,c, input [1:0] select );
  always @*
  begin
    case (select)
    2'b00: y = a;
    2'b01: y = b;
    2'b10: y = c;
    endcase
  end
endmodule

select는 2-bit input으로 가능한 경우의 수는 4가지가 있다. 하지만 위 case statement에서는 3가지 경우만 기술되어 있다. 2’b11에 대해서는 출력이 정의되어 있지 않은 상태다. 이 경우에는 해당 값이 기술되어 있지 않으므로 y 값이 이전과 동일하게 유지되어야 하는데, Design compiler에서는 이전 값을 유지하기 위해서 latch logic을 자동으로 삽입하게 된다! 일반적으로 Verilog를 이용해 합성으로 Combinational logic을 구성할 때는 CAD 툴의 한계 등으로 인해 Latch logic을 사용하지 않는다.

하지만 이렇게 기술되지 않은 case가 절대로(!) 발생하지 않을 자신이 있다면 Design Compiler가 자동으로 latch logic을 생성하지 못하도록 지시할 수가 있다. 이 때 사용하는 게 full_case다.

module mux3to1 ( output reg y, input a,b,c, input [1:0] select );
  always @*
  begin
    case (select) // synopsys full_case
    2'b00: y = a;
    2'b01: y = b;
    2'b10: y = c;
    endcase
  end
endmodule

주석으로 처리된 부분이 추가되었는데 무엇이 달라졌냐고? 주석은 compiler에서 무시되는 게 대부분이지만, Design Compiler는 Verilog source file에서 // synopsys 로 선언된 주석문은 특수 명령어로 인식하여 처리한다. // synopsys full_case 라고 하면, case statement의 처리문이 모든 경우의 수에 대해 처리되어 있지 않더라도, 자동으로 latch logic을 생성한다든가 하는 등의 automation 과정을 거치지 않는다.

즉, full_case progma가 선언되지 않았을 때 design compiler는 2’b11 에 대한 logic을 만들기위해서 latch logic을 삽입하지만 full_case progma가 선언되었다면 이 부분에 대한 optimization을 하지 않으므로 2’b11 입력에 대한 logic을 따로 준비하지 않는다.

이 때, 주의해야할 점은 simulation 상으로는 2’b11 입력에 대해 이전 값을 유지하도록 출력되겠지만, design compiler를 통해 제작된 실제 (synthesis implementation) 에서는 임의의 어떤 값이 출력되기 때문이다. 즉, simulation과 synthesis implementation 간의 차이가 발생하게 되므로 이 점에 유의해야한다.

  • 게스트 썸네일
    2012.06.23 18:52

    비밀댓글입니다

  • 게스트 썸네일
    ㄱㄷ
    2012.09.05 10:13 신고

    마지막에 default하나 선언해주는거랑 결과가 다른가요?

    • 게스트 썸네일
      2012.09.26 22:46 신고

      네 다릅니다. default로 선언하게되면 모든 condition이 커버됩니다.

  • 게스트 썸네일
    이병철
    2017.04.03 15:31 신고

    배워가면서 디자인을 하고 있는데 많은 도움 되었습니다.
    감사합니다~~