UVM은 부품을 조립해서 거대한 기계를 만드는 과정입니다. 가장 작은 단위부터 최상위까지 3단계로 나뉩니다.
Agent (에이전트): 특정 인터페이스(예: AXI4-Lite) 하나를 전담하는 통신 부서입니다.
Environment (Env / 환경): 전체 검증 환경의 물리적인 뼈대입니다.
Test (테스트): 이 모든 걸 총괄하는 최상위 지휘관입니다.
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 하나만 쓰는 것이 현업의 절대적인 표준이자 권장 사항입니다.
시뮬레이터는 언제 테스트를 끝내야 할지 스스로 알지 못합니다.
raise_objection: 테스트 시작 시 "나 지금 할 일 있으니까 시뮬레이션 끝내지 마!"라고 UVM에 알리는 잠금장치입니다.
drop_objection: 준비한 Sequence(시나리오)를 다 쏘고 나면 잠금을 해제하여 시뮬레이션이 깔끔하게 종료되도록 합니다.