UVM 1

Seungyun Lee·2026년 4월 6일

UVM

목록 보기
6/12

1. UVM Testbench Hierarchy (컴포넌트 계층 구조)

UVM은 부품을 조립해서 거대한 기계를 만드는 과정입니다. 가장 작은 단위부터 최상위까지 3단계로 나뉩니다.

Agent (에이전트): 특정 인터페이스(예: AXI4-Lite) 하나를 전담하는 통신 부서입니다.

  • 구성 요소: Sequencer (대본 전달), Driver (핀 신호 조작), Monitor (버스 관찰).
  • Active vs Passive: 자극을 직접 주입할 때는 Active 모드(모두 켬)로 설정하고, 남이 쏘는 걸 구경만 할 때는 Passive 모드(Monitor만 켬)로 설정합니다.
  • 반드시 Virtual Interface를 전달받아 실제 설계(DUT)와 연결되어야 합니다.

Environment (Env / 환경): 전체 검증 환경의 물리적인 뼈대입니다.

  • 여러 개의 Agent들과, 데이터를 비교하는 Scoreboard, 통계를 내는 Coverage Collector를 생성(Instantiate)하고 서로 연결해 줍니다.
  • Tom의 경고: Env 내부에서 자극(Sequence)을 직접 실행하지 마세요. 나중에 디버깅이 심각하게 꼬입니다. 자극은 오직 Test에서 쏴야 합니다.

Test (테스트): 이 모든 걸 총괄하는 최상위 지휘관입니다.

  • Env를 생성하고, UVM Factory와 Configuration Database (uvm_config_db)를 사용해 내부 부품을 입맛대로 교체합니다.
  • Base Test & Extended Test: 보통 공통 설정(Virtual Interface 연결 등)을 담당하는 Base Test를 하나 짜두고, 이를 상속(extends)받아 시나리오별로 다양한 테스트(Extended Tests)를 찍어내는 방식을 사용합니다.

2. UVM Phasing Mechanism (실행 순서)

UVM은 중구난방으로 코드가 도는 걸 막기 위해, 모든 컴포넌트가 동시에 동일한 단계(Phase)를 밟도록 통제합니다.

  • build_phase (Top-down): 위(Test)에서 아래(Agent)로 내려가며 컴포넌트들을 메모리에 생성(create)하고, 설정 정보(config)를 전달합니다.

  • connect_phase (Bottom-up): 생성된 컴포넌트들의 포트(Analysis Port)와 인터페이스들을 물리적으로 연결합니다.

  • run_phase: 유일하게 시간(Time)을 소비하는 Task입니다. 여기서 실제 클럭(Clock)이 뛰고, 우리가 짠 0과 1의 시나리오가 돌아갑니다.

Tom의 핵심 팁: UVM에는 main_phase, reset_phase 같은 부가적인 Runtime Phase들이 있지만, 절대 쓰지 마세요. 무조건 run_phase 하나만 쓰는 것이 현업의 절대적인 표준이자 권장 사항입니다.

3. Execution & Objections (시뮬레이션 통제)

시뮬레이터는 언제 테스트를 끝내야 할지 스스로 알지 못합니다.

  • raise_objection: 테스트 시작 시 "나 지금 할 일 있으니까 시뮬레이션 끝내지 마!"라고 UVM에 알리는 잠금장치입니다.

  • drop_objection: 준비한 Sequence(시나리오)를 다 쏘고 나면 잠금을 해제하여 시뮬레이션이 깔끔하게 종료되도록 합니다.

profile
Design Verification engineer

0개의 댓글