ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Verilog : assert와 assert property 활용하기
    Tech/Verilog 2012. 5. 18. 15:49

    Verilog는 하드웨어 개발을 위한 프로그래밍 언어라, 실제 하드웨어 합성(synthesis)을 위해서는 C/C++ 등 일반 프로그래밍 언어와 다른 점이 많다. 하지만, 시뮬레이션을 위해 보다 더 프로그래밍 언어적 요소가 많이 추가되어 왔으며, 특히 SystemVerilog에 이르러서는 2가지 타입의 assert 명령어가 지원되어 테스트벤치 작성에 많이 활용된다.

    • Immediate type (assert)
    • Concurrent type (assert property)

    1.Immediate Type Assertions

    먼저, Immediate type에 대해서 알아보자. 이 타입은 우리가 프로그래밍을 할 때 흔히 사용하는 일반적인 assert와 동일하다. Simulation 수행 중 assert문에 도달하게 되면 즉시(immediate) 해당 조건을 비교한 뒤, 에러를 출력한다. 보통은 “must be true”, 항상 참이어야하는 조건을 선언하고, 해당 조건이 만족하지 않았을 때 에러를 출력하는 식으로 많이 활용한다.

    if (A==B) // 단순히 A가 B와 같은지를 비교
    assert (A==B) // A와 B가 같지 않다면, 에러를 발생한다. 
    

    if와 같이 주어진 조건의 true/false를 비교하는 동일한 역할을 수행한다. 따라서, if와 마찬가지로 assert에서도 조건문 비교 이후에 true/false에 따른 분기문을 작성할 수 있다. true일 경우 수행할 부분은 assert 문 바로 뒤에, false일 경우 수행할 부분은 else 뒤에 써주면 된다. if와 동일하다.

    assert (A==B) $display("Pass");
    else $fatal("Stop"); 
    

    assert는 일반적으로 True가 되는 조건을 선언하므로, true일 때 딱히 할 말이 없을 수도 있다. (당연히 그래야하므로) 그럴 때에는 바로 else를 써주어도 된다.

    assert (A==B) else $fatal("Stop! A is not equal to B"); 
    

    assert는 주로 에러 메시지를 출력하는 $fatal, $error, $warning 등의 명령어와 함께 많이 사용되지만, 변수를 업데이트 한다던가 하는 등 if와 동일하게 사용해도 된다.

    2. Concurrent Assertions

    Read와 Write 신호는 동시에 set되면 안된다.는 제한 조건이 있다고 해보자. assert를 사용하면 이러한 제한 조건을 잘 만족하며 시뮬레이션이 진행되는지 아래와 같이 작성하여 테스트 할 수 있다.

    assert (!(Read && Write));  
    

    그런데, 이런 제한 조건이라면 어떻게 표시해야 할까?

    Acknowledge 신호는 Request가 set된 이 후로, 2 cycle 이내에 set되어야 한다.

    위와 같이 시간 정보가 포함된다면 assert로 처리하기가 난감하다. 이럴 때 사용하는 것이 concurrent assertion이다. immediate assert는 assert문에서 즉시 true/false를 평가하는 반면, concurrent assert에서는 timing 정보까지 포함하여 테스트가 가능하다. 즉, 위 조건에 대한 테스트는 아래와 같이 작성할 수 있다.

    assert property (@(posedge clk) Request |-> ##[1:2] Acknowledge);
    

    이 때, 새로 보이는 연산자가 있다. 비슷하게 생긴 녀석으로 |=>도 있는데 차이점은 아래와 같다.

    A |-> B; // A1이 참이라면, B1도 같은 시점(at the same clock)에서 비교한다.
    A |=> B; // A1이 참이라면, B1은 다음 시점(on the next clock)에서 비교한다.
    

    위에서 사용된 ##[1:2] 는 verilog에서 딜레이를 주는 #와 비슷한 방식으로, 1 cycle or 2 cycle 뒤에 Acknowledge 신호가 true인지 살펴보겠다는 의미다. 예를 들어, ##[1:200] 이라고 선언한다면, 이 다음단을 1 cycle - 200 cycle 사이에서 평가하겠다는 뜻이다.

    Verilog가 업그레이드되어가며 가장 많이 발전한 부분이 바로 이런 테스트벤치를 작성하고 평가하는 부분이다. 간단한 로직을 합성해서 이용한다면 Verilog 기본 문법만 알아도 충분하겠지만, 큰 규모의 합성가능한 RTL을 설계하고 테스트한다면 최신 Verilog 기술에 항상 주의를 기울여야 한다. 검증 시간을 획기적으로 단축할 수 있다.

    댓글

Copyright 2022 JY