지노랩 /JinoLab
[UVM] 3.8 에이전트(Agent) 생성 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.8 에이전트(Agent) 생성
지노랩/JinoLab 2025. 3. 16. 12:003.8 에이전트(Agent) 생성
3.8.1 개요

에이전트(agent)는 드라이버(driver), 모니터(monitor), 시퀀서(sequencer)를 하나의 단위로 구성하여 검증 환경을 모듈화하는 역할을 함.
- TLM(Transaction-Level Modeling) 연결을 통해 하위 컴포넌트들을 연결.
- 설정 정보 및 기타 파라미터를 포함하여 보다 유연한 환경 구성 가능.
- 버스 기반 환경에서 마스터(master), 슬레이브(slave), 아비터(arbiter)와 같은 특정 역할을 수행하는 컴포넌트를 모델링할 수 있음.
3.8.2 에이전트의 역할
- 드라이버: 시퀀서에서 데이터를 받아 DUT(Device Under Test)에 전송.
- 모니터: DUT에서 발생하는 트랜잭션을 감지하고 분석.
- 시퀀서: 드라이버에 전달할 트랜잭션을 생성.
- 에이전트: 위의 세 가지 요소를 한데 묶어 관리하는 상위 계층 구조를 제공.
3.8.3 에이전트의 주요 기능
- 하위 컴포넌트(Driver, Monitor, Sequencer) 인스턴스화 및 연결
- 에이전트 내부에서 드라이버, 모니터, 시퀀서를 생성하고 연결.
- UVM Factory를 사용하여 동적으로 객체를 생성.
- 에이전트의 동작 모드 지원
- Active 모드: 드라이버를 포함하여 DUT와의 인터페이스를 직접 제어.
- Passive 모드: 모니터만 활성화하여 신호를 감시(관찰자 역할).
- 검증 환경 내에서의 역할 제공
- 마스터(Master) 에이전트: DUT에 명령을 보내는 역할.
- 슬레이브(Slave) 에이전트: 명령을 수신하고 응답하는 역할.
- 아비터(Arbiter) 에이전트: 여러 마스터 간의 충돌을 관리.
3.8.4 에이전트 구현 예제
class my_agent extends uvm_agent;
// 에이전트 내부에 포함할 구성 요소들 선언
my_driver drv;
my_monitor mon;
my_sequencer seq;
// UVM 자동화 매크로
`uvm_component_utils(my_agent)
// 생성자
function new(string name = "my_agent", uvm_component parent);
super.new(name, parent);
endfunction
// 빌드 단계에서 하위 컴포넌트 생성
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
drv = my_driver::type_id::create("drv", this);
mon = my_monitor::type_id::create("mon", this);
seq = my_sequencer::type_id::create("seq", this);
endfunction
// 연결 단계에서 드라이버와 시퀀서를 연결
virtual function void connect_phase(uvm_phase phase);
drv.seq_item_port.connect(seq.seq_item_export);
endfunction
endclass
코드 설명
- 라인 1: uvm_agent를 상속하여 my_agent 클래스를 정의.
- 라인 3-5: 드라이버, 모니터, 시퀀서를 선언.
- 라인 7: uvm_component_utils() 매크로를 사용하여 UVM Factory에 등록.
- 라인 10-12: 생성자에서 super.new(name, parent)를 호출하여 부모 클래스 초기화.
- 라인 15-20: build_phase()에서 하위 컴포넌트(드라이버, 모니터, 시퀀서)를 생성.
- 라인 23-25: connect_phase()에서 드라이버와 시퀀서를 연결.
3.8.5 에이전트의 동작 모드
UVM에서는 에이전트를 능동(Active) 또는 수동(Passive) 모드로 설정할 수 있음.
(1) Active 모드
- DUT와의 직접적인 인터페이스를 가지며 드라이버가 활성화됨.
- 테스트 중에 DUT로 데이터를 전송하는 역할 수행.
(2) Passive 모드
- 드라이버 없이 모니터만 활성화하여 신호를 감시(관찰자 역할).
- DUT의 동작을 분석하거나 커버리지를 수집할 때 사용.
구현 예제
class my_agent extends uvm_agent;
my_driver drv;
my_monitor mon;
my_sequencer seq;
uvm_active_passive_enum is_active = UVM_ACTIVE; // 기본값 Active
`uvm_component_utils(my_agent)
function new(string name = "my_agent", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if (is_active == UVM_ACTIVE)
drv = my_driver::type_id::create("drv", this);
mon = my_monitor::type_id::create("mon", this);
seq = my_sequencer::type_id::create("seq", this);
endfunction
virtual function void connect_phase(uvm_phase phase);
if (is_active == UVM_ACTIVE)
drv.seq_item_port.connect(seq.seq_item_export);
endfunction
endclass
설명
- is_active 변수를 사용하여 능동(Active) 또는 수동(Passive) 모드를 선택할 수 있도록 구현.
- build_phase()에서 is_active == UVM_ACTIVE일 때만 드라이버를 생성.
- connect_phase()에서도 Active 모드일 때만 드라이버를 시퀀서와 연결.
3.8.6 정리
| 역할 | 설명 |
| 에이전트(Agent) | 드라이버, 모니터, 시퀀서를 하나로 묶어 검증 환경을 구성 |
| 드라이버(Driver) | 시퀀서에서 데이터를 받아 DUT로 전송 |
| 모니터(Monitor) | DUT에서 발생하는 트랜잭션을 감지하고 분석 |
| 시퀀서(Sequencer) | 드라이버에 전달할 트랜잭션을 생성 |
| Active 모드 | 드라이버를 포함하여 DUT와 직접 인터페이스 |
| Passive 모드 | 모니터만 활성화하여 DUT의 동작을 감시 |
UVM에서 에이전트는 검증 환경을 체계적으로 구성하고 모듈화하는 중요한 요소이며,
능동(Active) 또는 수동(Passive) 모드로 동작하여 다양한 검증 요구사항을 충족할 수 있음.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.8.2 컴포넌트 연결 (Connecting Components) (0) | 2025.03.17 |
|---|---|
| [UVM] 3.8.1 에이전트의 동작 모드 (Operating Modes) (0) | 2025.03.16 |
| [UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components) (0) | 2025.03.15 |
| [UVM] 3.6 모니터(Monitor) 생성 (0) | 2025.03.15 |
| [UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers) (0) | 2025.03.14 |