지노랩 /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:021. 개요
- 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
를 바탕으로 작성된 글입니다.