UVM 공부법

Seungyun Lee·2026년 2월 24일

UVM

목록 보기
2/14

"강의 보면서 타자 연습하는 느낌", 이거 UVM을 처음 배우는 전 세계 모든 엔지니어들이 100% 똑같이 겪는 통과의례입니다! 너무나 정상적인 반응이고, 오히려 그 답답함을 느끼셨다는 것 자체가 "단순 타이핑을 넘어 구조를 이해하고 싶다"는 훌륭한 엔지니어의 시각을 갖추셨다는 증거입니다.

질문하신 "구조를 먼저 파악하고 하나씩 타이핑하는 게 좋을까?"에 대한 대답은 "무조건, 절대적으로 그렇다"입니다.

현업 DV(Design Verification) 엔지니어로서 성공적으로 인턴십을 뚫고 실무에 적응하기 위한 가장 현실적이고 확실한 UVM 공부법 4단계를 정리해 드릴게요.


실무형 UVM 공부법 4단계

1. 껍데기(Boilerplate)는 당당하게 "복붙" 하세요.

UVM은 진입장벽의 80%가 쓸데없이 긴 문법(Boilerplate)입니다.

uvm_component_utils, function new, super.build_phase(phase)...

현업 엔지니어들도 이거 매번 빈 화면에서 타이핑하지 않습니다. 회사에 있는 템플릿을 복사해 오거나, 에디터 자동완성 기능을 씁니다.

타자 연습은 과감히 건너뛰세요. 뼈대 파일(_env.sv, _agent.sv)은 이전 프로젝트나 템플릿에서 통째로 복사해 오고, 이름만 Replace All로 바꾸는 게 훨씬 스마트한 방식입니다.

2. 빈 종이에 "블록도"를 먼저 그리고 시작하세요. (가장 중요!)

강의를 볼 때 에디터 창부터 열지 마세요. A4 용지나 태블릿을 꺼내서 방금 우리가 했던 것처럼 박스와 화살표를 먼저 그리세요.

"아, 이 APB 통신을 검증하려면 Test 상자 안에 Env가 있고, 그 안에 APB Agent가 있어야겠네."

"Agent 안에는 Driver, Monitor, Sequencer가 들어가야지."

이 구조가 머릿속에 완벽히 그려진 상태에서 코드를 보면, 수백 줄의 코드가 그저 "내가 그린 박스를 구현하는 과정"으로 보이기 시작합니다.

3. 진짜 집중해서 타이핑해야 할 "알맹이"는 따로 있습니다.

껍데기를 복붙했다면, 엔지니어님의 뇌를 100% 가동해서 직접 고민하고 짜야 하는 핵심 로직은 딱 3군데뿐입니다. 여기만 집중해서 파고드세요.

Sequence (대본): DUT를 극한으로 괴롭히기 위해 어떤 랜덤 데이터를 어떻게 조합해서 쏠 것인가?

Driver의 run_phase: 시퀀서가 준 데이터를 받아서, 물리적인 APB 클럭과 핀 타이밍에 맞춰 어떻게 Wiggling(0과 1로 흔들기) 할 것인가?

Scoreboard (채점기): 모니터가 물어온 결과를 보고, 이게 정답인지 오답인지 어떻게 똑똑하게 비교(Queue, Predictor 활용)할 것인가?

4. 내 프로젝트(RTL)에 직접 씌워보세요. (취업의 치트키)

강의에 나오는 예제(Adder, Memory 등)는 UVM 문법을 익히는 용도일 뿐입니다. 타자 연습에서 벗어나는 가장 빠른 길은 "내가 직접 짠 하드웨어를 내가 직접 UVM으로 부숴보는 것"입니다.

기존에 직접 설계하셨던 UART/SPI 다중 프로토콜 가속기나 CNN 가속기 코드를 꺼내오세요.

그리고 방금 강의에서 배운 UVM 뼈대를 그 가속기에 연결해 보세요.

"어? 내 가속기는 APB 버스를 쓰는데, 그럼 APB Driver는 어떻게 짜야 하지?"라는 진짜 고민이 시작될 때, UVM 실력이 수직 상승합니다.


마인드셋 세팅
UVM은 '코딩 언어'라기보다는 거대한 '물류 회사 시스템'에 가깝습니다.
문법(SystemVerilog)을 외우려 하지 마시고, "택배 상자(Item)가 대본(Sequence)에서 출발해 일꾼(Driver)을 거쳐 물리적 핀(Interface)으로 나가는 배송 경로"를 추적하는 데 집중하세요.


1. 절대 외울 필요 없는 것들 (버리세요!)

현업에서도 기존 코드를 복붙(Copy & Paste)하거나 템플릿을 쓰는 부분입니다. 머릿속에서 과감히 비우세요.

  • UVM 매크로 및 보일러플레이트 코드: uvm_component_utils, uvm_object_utils, new 함수 선언 방법, 팩토리 등록 문법 등. (그냥 "이걸 써야 UVM 시스템에 등록된다" 정도만 아시면 됩니다.)

  • 포트 연결 문법: port.connect(export) 같은 정확한 타이핑 문법.

  • 설정 파일(Config)의 잡다한 변수들: 앞서 만든 has_checks, stuck_threshold 같은 변수 이름들.

2. 반드시 '이해'하고 넘어가야 할 아키텍처 (면접 단골 질문)

코드를 외우는 게 아니라, "왜 이렇게 설계했는가(Why)"를 입으로 설명할 수 있어야 합니다.

  • 데이터의 흐름 (Life of a Transaction): 대본(Sequence)에서 만들어진 빈 상자(Item)가 ➔ 조감독(Sequencer)을 거쳐 ➔ 일꾼(Driver)의 손에 들어가 ➔ 칩(DUT)의 핀으로 쏘아지고 ➔ 그걸 CCTV(Monitor)가 다시 주워 담아 ➔ 채점기(Coverage/Scoreboard)로 보내는 전체 사이클을 백지 위에 그림으로 그릴 수 있어야 합니다.

  • Driver vs Monitor의 차이점: Driver는 왜 논블로킹(<=)을 쓰고 능동적인지, Monitor는 왜 블로킹(=)을 쓰고 수동적으로 훔쳐보기만 하는지.

  • 객체 지향(OOP)의 활용: 리셋 처리(reset_handler)를 할 때 왜 가상 함수(virtual)와 다형성($cast)을 써서 코드를 짰는지. (C++이나 Java 면접에서도 똑같이 물어보는 핵심입니다.)

3. 무조건 '암기'해야 할 핵심 문법

DV 엔지니어의 기본기이자, 숨 쉬듯 자연스럽게 튀어나와야 하는 문법들입니다.

  • UVM Phase의 순서: build_phase (부품 만들기) ➔ connect_phase (선 연결하기) ➔ run_phase (시간 흐르며 진짜 동작하기). 이 3가지 순서는 절대 헷갈리면 안 됩니다.

  • SVA (SystemVerilog Assertions) 기본 연산자:

    • |-> (같은 클럭에 검사) vs |=> (다음 클럭에 검사)의 차이.

    • $stable (값 유지), $isunknown (쓰레기 값 확인), $past (과거 값 확인)의 쓰임새.

  • Covergroup의 기본: coverpoint (단일 검사), cross (교차 검사)가 각각 어떤 장부를 만드는지.


추천하는 실전 복습 플랜 3단계

그냥 코드를 눈으로 다시 읽는 것은 수면제나 다름없습니다. 다음과 같이 능동적으로 뜯어보세요.

1. 백지 복습 (Block Diagram 그리기):

아이패드나 이면지를 꺼내고, 파일 23개를 열지 않은 상태에서 방금 전 제가 그려드렸던 '에이전트 조직도'와 '선 연결(Port)'을 직접 그려보세요. 막히는 부분이 바로 본인이 구조를 놓치고 있는 지점입니다.

2. 코드 망가뜨려 보기 (Negative Testing):

진짜 동작을 이해하려면 고장을 내보는 게 최고입니다.

cfs_apb_driver.sv에 들어가서 PENABLE 타이밍을 일부러 한 클럭 늦춰보세요. 그리고 시뮬레이션을 돌렸을 때 우리가 만든 cfs_apb_if.sv의 SVA가 진짜로 빨간색 에러를 내뿜는지 확인해 보세요.

3. 흐름 따라가기 (Trace):

가장 중요한 통신 규약(Protocol) 부분인 cfs_apb_driver의 drive_item 태스크와 cfs_apb_monitor의 collect_transaction 태스크 두 개를 나란히 띄워놓고, 클럭이 뛸 때마다 두 녀석이 어떻게 다르게 움직이는지 한 줄씩 따라가 보세요.

profile
RTL, FPGA Engineer

0개의 댓글