지노랩 /JinoLab

[UVM] 3.11 테스트 종료 관리 (Managing End of Test) 본문

UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl

[UVM] 3.11 테스트 종료 관리 (Managing End of Test)

지노랩/JinoLab 2025. 3. 20. 13:02

 

1. 개요

  • UVM에서는 **테스트 종료를 효과적으로 관리하기 위해 "Objection Mechanism(이의 제기 메커니즘)"**을 제공.
  • 시뮬레이션 단계(phase)에는 내장된 Objection 객체가 있으며, 이를 통해 테스트 컴포넌트들이 종료 시점을 조율 가능.
  • 특정 동작이 완료되기 전에 phase가 종료되지 않도록 하기 위해 objection을 raise(증가)하고, 해당 동작이 끝나면 drop(감소)함.
  • 모든 Objection이 drop되면 해당 phase가 종료됨.

2. Objection을 사용한 테스트 종료 관리

(1) Objection의 필요성

  • 시뮬레이션에서 특정 에이전트(agent)는 테스트 목표가 달성될 때까지 run phase가 종료되지 않도록 해야 함.
  • 예를 들어, 마스터(master) 에이전트는 모든 read/write 작업이 끝날 때까지 테스트 종료를 막아야 하지만, 슬레이브(slave) 에이전트는 단순히 요청을 처리하기 때문에 종료를 제어할 필요가 없음.

3. Objection을 활용한 시퀀스 종료 관리 방식

UVM에서는 시퀀스를 실행할 때 Objection을 관리하는 세 가지 방법이 있음.

(1) Phase-Aware하지 않은 시퀀스 (Non-Phase Aware Sequences)

  • 테스트 코드에서 직접 phase objection을 제어하는 방식.
  • 시퀀스 자체는 phase를 인식하지 않으며, 호출자가 objection을 관리.
  • 시퀀스 실행 전 raise_objection()을 호출하고, 실행 완료 후 drop_objection()을 호출.

예제: Non-Phase Aware 시퀀스

class test extends uvm_test;
  task run_phase(uvm_phase phase);
    phase.raise_objection(this); // 시퀀스 실행 전 Objection 증가
    seq.start(seqr);             // 시퀀스 실행
    phase.drop_objection(this);  // 시퀀스 실행 후 Objection 감소
  endtask
endclass

설명

  • phase.raise_objection(this)를 호출하여 phase 종료를 방지.
  • 시퀀스 실행 완료 후 phase.drop_objection(this)를 호출하여 phase 종료를 허용.

(2) Phase-Aware 시퀀스 (Explicit Objection)

  • 시퀀스가 직접 phase를 인식하고 Objection을 명시적으로 제어하는 방식.
  • set_starting_phase()를 사용하여 phase 정보를 전달하고, 시퀀스 내부에서 raise_objection() 및 drop_objection()을 직접 호출.

예제: Explicit Objection을 사용하는 시퀀스

class test extends uvm_test;
  task run_phase (uvm_phase phase);
    seq.set_starting_phase(phase); // 시퀀스에 Phase 정보 전달
    seq.start(seqr);
  endtask
endclass

class seq extends uvm_sequence #(data_item);
  task body();
    uvm_phase p = get_starting_phase(); 
    if (p) p.raise_objection(this);  // Objection 증가
    // 시퀀스 실행 (예: DUT와의 트랜잭션)
    if (p) p.drop_objection(this);   // Objection 감소
  endtask
endclass

설명

  • set_starting_phase(phase)를 사용해 테스트가 시퀀스에 현재 Phase 정보를 전달.
  • 시퀀스 내에서 raise_objection()과 drop_objection()을 명시적으로 호출하여 테스트 진행 동안 Phase 종료를 방지.

(3) Phase-Aware 시퀀스 (Implicit Objection)

  • UVM에서 제공하는 자동 Objection 기능을 활용하여 사용자가 명시적으로 raise/drop을 호출할 필요 없음.
  • set_automatic_phase_objection(1)을 호출하면 UVM이 자동으로 phase objection을 관리.

예제: Implicit Objection을 사용하는 시퀀스

class test extends uvm_test;
  task run_phase (uvm_phase phase);
    seq.set_starting_phase(phase);
    seq.start(seqr);
  endtask
endclass

class seq extends uvm_sequence #(data_item);
  function new(string name = "seq");
    super.new(name);
    set_automatic_phase_objection(1); // 자동 Objection 활성화
  endfunction

  task body();
    // 시퀀스 실행 (자동으로 Objection 관리됨)
  endtask
endclass

설명

  • set_automatic_phase_objection(1)을 호출하면, UVM이 자동으로 raise_objection()과 drop_objection()을 실행.
  • 사용자는 명시적으로 Objection을 관리할 필요 없음.

4. Phase 종료를 위한 추가적인 기법

(1) phase_ready_to_end()을 활용한 Objection 재조정

  • 특정 상황에서는 Objection이 모두 drop되더라도 아직 처리 중인 트랜잭션이 남아있을 수 있음.
  • phase_ready_to_end() 메서드를 사용하면 현재 처리 중인 트랜잭션이 있는 경우 Objection을 다시 raise할 수 있음.

예제: phase_ready_to_end()를 활용한 종료 관리

class my_component extends uvm_component;
  task phase_ready_to_end(uvm_phase phase);
    if (some_transaction_in_flight) begin
      phase.raise_objection(this);
      #10ns; // 추가적인 트랜잭션 처리 시간 확보
      phase.drop_objection(this);
    end
  endtask
endclass

설명

  • phase_ready_to_end()에서 현재 처리 중인 트랜잭션이 있으면 Objection을 다시 raise하여 시간을 확보.

(2) Drain Time을 활용한 Phase 종료 지연

  • UVM에서는 Objection이 모두 drop된 후 즉시 Phase를 종료하지 않고, 일정한 "Drain Time"을 설정하여 종료를 지연 가능.
  • Drain Time을 사용하면, 마지막 트랜잭션이 완료될 시간을 확보할 수 있음.

예제: Drain Time 설정

phase.phase_done.set_drain_time(this, 100ns);

설명

  • Phase 종료 전에 100ns 동안 대기.
  • 이 동안 Objection이 다시 raise되면 Phase 종료가 취소됨.

5. 요약

기법  설명  장점  단점
Non-Phase Aware 시퀀스 Objection을 테스트 코드에서 직접 관리 간단한 구현 여러 곳에서 Objection을 관리해야 함
Explicit Objection (Phase Aware 시퀀스) 시퀀스에서 raise_objection() 및 drop_objection()을 명시적으로 호출 유연한 Objection 관리 가능 명시적으로 raise/drop을 호출해야 함
Implicit Objection (자동 Objection 처리) set_automatic_phase_objection(1)을 사용하여 자동 Objection 관리 사용이 간편 미세한 Objection 관리가 어려움
phase_ready_to_end() 사용 Phase 종료 전에 추가적인 트랜잭션 처리를 보장 즉각적인 대응 가능 Objection 관리 복잡성 증가
Drain Time 설정 일정 시간 동안 Phase 종료를 지연 트랜잭션 완료 시간 확보 일정 시간 이후에도 트랜잭션이 있을 경우 문제 발생

6. 결론

  • UVM에서는 Objection을 활용하여 테스트 종료를 세밀하게 제어 가능.
  • 기본적인 테스트 종료 관리는 raise/drop Objection을 활용하여 수행.
  • 상황에 따라 phase_ready_to_end()나 Drain Time을 사용하여 추가적인 처리 시간을 확보 가능.
  • 자동 Objection(set_automatic_phase_objection(1))을 사용하면 Objection을 쉽게 관리 가능.

 

 

 


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.