본문 바로가기
Language/Verilog & SV

[Verilog] Case, Synopsys full case, Synopsys parallel case

by VIR&US 2025. 4. 8.
반응형

목차

    Syntax

    case_statement ::=
    case ( expression )
    case_item { case_item } endcase
    
    | casez ( expression )
    case_item { case_item } endcase
    
    | casex ( expression )
    case_item { case_item } endcase
    
    case_item ::=
    expression { , expression } : statement_or_null
    | default [ : ] statement_or_null

     

    • casez: 'z', '?' 포함
    • casex: 'x', 'z', '?' 포함
    • case statement에서 비교는 각 비트가 값 0, 1, x 및 z와 관련하여 정확히 일치해야 합니다.

    Case 구문은 등가적으로 if ..else if 구문으로 치환 가능하지만 명확히 같지 않습니다. 근본적으로 합성했을때 다르게 구성됩니다. 

    Synopsys full case

    • Verilog에서 //synopsys full_case 지시어는 모든 가능한 경우를 포함하도록 case 문을 지정하는 데 사용됩니다. 이는 잠재적인 래치(latch) 생성을 방지하기 위해 사용됩니다. 예를 들어, case 문에 모든 가능한 조건을 포함하지 않으면 래치가 생성될 수 있습니다. full_case 지시어는 이러한 상황을 피하기 위해 사용됩니다.
    • 이 지시어는 모든 가능한 상태를 포함한다고 가정하여 래치 생성을 방지합니다. 하지만, full_case 지시어를 사용할 때는 주의가 필요합니다. 잘못 사용하면 디자인의 기능이 변경될 수 있으며, 합성 후 시뮬레이션 결과가 달라질 수 있습니다. 따라서, 항상 default 조건을 추가하는 것이 좋은 방법입니다.

    Example

    Synopsys parallel case

    • Verilog에서 //synopsys parallel_case 지시어는 case 문 내의 모든 조건이 병렬로 평가되도록 지정합니다. 이는 우선순위 로직을 제거하여 하드웨어 자원을 절약하고, 병렬 평가를 통해 성능을 향상시킬 수 있습니다. 다시 말해, 이 지시어는 각 조건이 독립적으로 평가되도록 하여, 우선순위 로직이 생성되지 않도록 합니다.
    • 즉, 동시에 조건을 보기 때문에 반듯이 하나의 branch에서만 동작해야 합니다. 두개 이상의 branch가 동작해서는 안 됩니다.

    Example

     

    위 두 full_case와 parallel_case 지시어를 사용할 때는 주의가 필요합니다. 잘못 사용하면 시뮬레이션과 합성 결과가 다를 수 있습니다

    728x90
    반응형