지노랩 /JinoLab

[UVM] 3.8 에이전트(Agent) 생성 본문

UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl

[UVM] 3.8 에이전트(Agent) 생성

지노랩/JinoLab 2025. 3. 16. 12:00

3.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 에이전트의 주요 기능

  1. 하위 컴포넌트(Driver, Monitor, Sequencer) 인스턴스화 및 연결
    • 에이전트 내부에서 드라이버, 모니터, 시퀀서를 생성하고 연결.
    • UVM Factory를 사용하여 동적으로 객체를 생성.
  2. 에이전트의 동작 모드 지원
    • Active 모드: 드라이버를 포함하여 DUT와의 인터페이스를 직접 제어.
    • Passive 모드: 모니터만 활성화하여 신호를 감시(관찰자 역할).
  3. 검증 환경 내에서의 역할 제공
    • 마스터(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
를 바탕으로 작성된 글입니다.