[UVM 1.1d] 3-1. UVM Components
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 3-1. UVM Components

by 긍수저 2024. 9. 25.

3-1장: 재사용 가능한 검증 Component 개발

UVM(Universal Verification Methodology)에서는 재사용 가능한 검증 Component를 효율적으로 개발하는 것이 중요합니다. 각 컴포넌트는 데이터 항목(Transaction), 드라이버(Driver), 시퀀서(Sequencer), 모니터(Monitor), 에이전트(Agent), 환경(Environment) 등의 요소로 구성되어 있습니다. 이들은 각각 고유한 역할과 목적을 가지며, 통합하여 강력한 검증 환경을 제공합니다.

1. 데이터 항목 (Transaction)

목적: 데이터 항목은 설계 검증에서 DUT(Device Under Test)로 전달되는 정보를 표현하는 객체입니다. 트랜잭션은 네트워크 패킷, 버스 트랜잭션, 명령어 등으로 구성될 수 있습니다. 트랜잭션 클래스는 UVM에서 랜덤화 및 제약 조건을 적용할 수 있어 다양한 테스트 케이스를 생성하는 데 적합합니다.

특징:

  • 설계된 프로토콜이나 데이터의 특성에 맞춰 데이터를 표현
  • SystemVerilog의 제약 조건을 통해 랜덤화 가능

예시 코드:

class ethernet_pkt extends uvm_sequence_item;
  rand bit [47:0] dst_mac;
  rand bit [47:0] src_mac;
  rand bit [15:0] eth_type;
  rand bit [31:0] payload;
  
  constraint c_eth_type { eth_type == 16'h0800; } // IPv4 only
endclass

2. 드라이버 (Driver)

목적: 드라이버는 트랜잭션 데이터를 BFM(Bus Functional Model) 방식으로 처리하여 DUT에 전달하는 역할을 합니다. 드라이버는 시퀀서로부터 데이터를 받아 DUT에 신호를 전달합니다.

특징:

  • 트랜잭션을 실제 신호로 변환하여 DUT와 통신
  • 반복적 작업을 처리하고, 설계된 타이밍에 맞춰 신호를 주입

예시 코드:


class ethernet_driver extends uvm_driver#(ethernet_pkt);
  virtual task run_phase(uvm_phase phase);
    ethernet_pkt pkt;
    forever begin
      seq_item_port.get_next_item(pkt); // 시퀀서로부터 트랜잭션 수신
      drive_packet(pkt); // DUT로 패킷 전송
      seq_item_port.item_done(); // 완료 신호
    end
  endtask
  
  virtual task drive_packet(ethernet_pkt pkt);
    // 패킷의 각 필드를 DUT로 전송하는 로직
  endtask
endclass

3. 시퀀서 (Sequencer)

목적: 시퀀서는 드라이버에게 전달할 트랜잭션의 순서를 제어합니다. 시퀀서는 다양한 트랜잭션을 랜덤하게 생성하거나 미리 정의된 시나리오에 따라 트랜잭션을 제공할 수 있습니다.

특징:

  • 트랜잭션의 랜덤화를 제어하고, 다양한 테스트 시나리오를 지원
  • 시퀀스 간 시간 제어데이터 흐름 조정

예시 코드:

class ethernet_sequencer extends uvm_sequencer#(ethernet_pkt);
  // 시퀀스 제어 로직
endclass

4. 모니터 (Monitor)

목적: 모니터는 수동적으로 신호를 감시하며, DUT에서 발생하는 트랜잭션을 관찰하고 기록합니다. 검증 환경에서 체크 및 커버리지 수집을 담당하며, 자가 검증 역할을 수행합니다.

특징:

  • DUT 신호를 감시하고 트랜잭션을 수집
  • 프로토콜 준수 여부 검사커버리지 수집
  • 드라이버와는 달리 신호를 구동하지 않고, 감시 및 기록에 중점을 둠

예시 코드:

class ethernet_monitor extends uvm_monitor;
  virtual task run_phase(uvm_phase phase);
    forever begin
      // DUT에서 신호 수집 및 트랜잭션 변환
    end
  endtask
endclass

5. 에이전트 (Agent)

목적: 에이전트는 드라이버, 시퀀서, 모니터 등을 하나로 묶은 컴포넌트 집합체입니다. DUT와의 인터페이스를 설정하고, 트랜잭션을 주고받으며 검증을 수행합니다.

특징:

  • 액티브 또는 패시브 모드로 동작
  • 트랜잭션의 생성, 처리, 감시를 위한 모든 컴포넌트 포함
  • 재사용성을 높여 다양한 검증 시나리오에서 유연하게 활용 가능

예시 코드:

class ethernet_agent extends uvm_agent;
  ethernet_driver driver;
  ethernet_sequencer sequencer;
  ethernet_monitor monitor;

  function new(string name, uvm_component parent);
    super.new(name, parent);
    driver = ethernet_driver::type_id::create("driver", this);
    sequencer = ethernet_sequencer::type_id::create("sequencer", this);
    monitor = ethernet_monitor::type_id::create("monitor", this);
  endfunction
endclass

6. 환경 (Environment)

목적: 환경은 에이전트를 포함한 다양한 검증 컴포넌트를 통합하여 상위 검증 환경을 구성합니다. 환경은 전체 시스템을 검증하는 데 필요한 에이전트 및 다른 컴포넌트들을 조율하고 통합합니다.

특징:

  • 다수의 에이전트를 포함하여 전체 시스템 검증 가능
  • 확장 가능하며, 다른 검증 환경에서도 쉽게 재사용 가능
  • 시뮬레이션 시 DUT와 상호작용하는 전체 검증 구조 관리

예시 코드:

class ethernet_env extends uvm_env;
  ethernet_agent agent;

  function new(string name, uvm_component parent);
    super.new(name, parent);
    agent = ethernet_agent::type_id::create("agent", this);
  endfunction
endclass

결론

UVM에서는 각 검증 컴포넌트의 역할이 명확하게 정의되어 있으며, 이를 통해 재사용 가능한 검증 환경을 쉽게 구축할 수 있습니다. 트랜잭션 데이터의 생성, 전송, 감시를 책임지는 다양한 컴포넌트가 상호작용하여 복잡한 검증 시나리오를 효율적으로 수행할 수 있습니다. 시퀀서, 드라이버, 모니터, 에이전트, 환경 등 각 요소는 시스템의 유연성과 재사용성을 극대화하는 데 기여합니다.

반응형

댓글