지노랩 /JinoLab

[UVM] 3.6 모니터(Monitor) 생성 본문

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

[UVM] 3.6 모니터(Monitor) 생성

지노랩/JinoLab 2025. 3. 15. 12:47

3.6 모니터(Monitor) 생성

3.6.1 개요

  • 모니터(Monitor)는 버스에서 신호 정보를 추출하고 이를 이벤트, 데이터, 상태 정보로 변환하는 역할을 수행.
  • 변환된 정보는 TLM 인터페이스 및 채널을 통해 다른 컴포넌트와 테스트 코드에서 사용할 수 있도록 제공.
  • 모니터는 드라이버(Driver) 등 다른 컴포넌트가 유지하는 상태 정보에 의존하면 안 되며, 요청 ID(request-specific ID)를 사용해 트랜잭션 ID를 설정할 수도 있음.
  • 기본적으로 모든 검증 환경에서 필요한 필수 모니터링 기능만 수행해야 함.
    • 프로토콜 체크(protocol checking) 및 커버리지 수집(coverage collection) 기능을 포함할 수 있음.
    • 프로토콜 체크는 설정 가능해야 하며 필요에 따라 활성화/비활성화할 수 있어야 함.
    • 추가적인 고수준 기능(예: Scoreboard)은 별도의 컴포넌트로 구현해야 함.
  • 추상적인 모델을 검증하거나 핀-레벨 기능을 가속화하려면, 신호 레벨 정보 추출, 커버리지 수집, 프로토콜 체크, 트랜잭션 레벨 활동을 분리하여 처리해야 함.
  • 분석 포트(Analysis Port)를 사용하여 서브 모니터 간 통신을 가능하게 할 수 있음.

3.6.2 모니터 예제

아래는 기본적인 모니터 구현 예제로, 주요 기능은 다음과 같음.

  1. 버스 인터페이스(xmi)를 통해 버스 정보를 수집.
  2. 수집된 데이터를 이용하여 커버리지 수집 및 데이터 검증 수행.
  3. 수집된 데이터를 분석 포트(item_collected_port)를 통해 다른 컴포넌트에 전달.

3.6.2.1 모니터 클래스

class master_monitor extends uvm_monitor;
    virtual bus_if xmi; // SystemVerilog 가상 인터페이스
    bit checks_enable = 1; // 체크 기능 활성화 여부
    bit coverage_enable = 1; // 커버리지 수집 활성화 여부

    uvm_analysis_port #(simple_item) item_collected_port; // 분석 포트
    event cov_transaction; // 커버리지 샘플링을 위한 이벤트
    protected simple_item trans_collected; // 수집된 트랜잭션

    // UVM 매크로 정의
    `uvm_component_utils_begin(master_monitor)
        `uvm_field_int(checks_enable, UVM_ALL_ON)
        `uvm_field_int(coverage_enable, UVM_ALL_ON)
    `uvm_component_utils_end

    // 커버리지 그룹 정의
    covergroup cov_trans @cov_transaction;
        option.per_instance = 1;
        // 커버리지 빈 추가 가능
    endgroup : cov_trans

    // 생성자
    function new (string name, uvm_component parent);
        super.new(name, parent);
        cov_trans = new();
        cov_trans.set_inst_name({get_full_name(), ".cov_trans"});
        trans_collected = new();
        item_collected_port = new("item_collected_port", this);
    endfunction : new

    // 실행 단계(run_phase)에서 트랜잭션 수집 시작
    virtual task run_phase(uvm_phase phase);
        collect_transactions();
    endtask : run

    // 트랜잭션 수집
    virtual protected task collect_transactions();
        forever begin
            @(posedge xmi.sig_clock);
            // 버스에서 데이터 수집하여 trans_collected에 저장
            if (checks_enable)
                perform_transfer_checks();
            if (coverage_enable)
                perform_transfer_coverage();
            // 분석 포트를 통해 다른 컴포넌트에 데이터 전달
            item_collected_port.write(trans_collected);
        end
    endtask : collect_transactions

    // 커버리지 샘플링 수행
    virtual protected function void perform_transfer_coverage();
        -> cov_transaction; // 커버리지 샘플링 이벤트 발생
    endfunction : perform_transfer_coverage

    // 데이터 체크 수행
    virtual protected function void perform_transfer_checks();
        // 트랜잭션 데이터 유효성 검사 수행
    endfunction : perform_transfer_checks

endclass : master_monitor

3.6.3 주요 기능 설명

3.6.3.1 버스 인터페이스를 통한 데이터 수집

  • virtual bus_if xmi;
    • **가상 인터페이스(Virtual Interface)**를 사용하여 버스에서 데이터를 수집함.

3.6.3.2 설정 가능한 기능

  • bit checks_enable = 1;
    • 데이터 체크 기능 활성화 여부를 설정.
  • bit coverage_enable = 1;
    • 커버리지 수집 활성화 여부를 설정.
  • uvm_config_int::set(this, “*.master0.monitor”, “checks_enable”, 0);
    • uvm_config_int::set()을 사용하여 테스트 환경에서 체크 기능을 동적으로 끄거나 켤 수 있음.

3.6.3.3 분석 포트(Analysis Port)

  • uvm_analysis_port #(simple_item) item_collected_port;
    • 수집된 데이터를 다른 컴포넌트로 전달하는 역할.
    • Scoreboard 또는 Coverage Collector와 연결될 수 있음.
  • 트랜잭션이 수집되면 분석 포트를 통해 데이터를 전달함:
    item_collected_port.write(trans_collected);
    

3.6.3.4 커버리지 샘플링

  • event cov_transaction;
    • 커버리지 샘플링 이벤트를 생성하여 커버리지 수집을 트리거.
  • covergroup cov_trans @cov_transaction;
    • 커버리지 그룹을 정의하여 특정 이벤트 발생 시 샘플링 수행.
  • perform_transfer_coverage() 함수에서 커버리지 샘플링 이벤트를 발생시킴:
    virtual protected function void perform_transfer_coverage();
        -> cov_transaction;
    endfunction
    

3.6.3.5 데이터 체크

  • perform_transfer_checks() 함수에서 데이터 체크 수행:
    virtual protected function void perform_transfer_checks();
        // 수집된 트랜잭션 데이터 유효성 검사 수행
    endfunction
    
  • 프로토콜 체크 등 추가적인 검사 로직을 포함할 수 있음.

3.6.4 동작 방식

  1. 트랜잭션 수집
    • run_phase()에서 collect_transactions() 실행.
    • 무한 루프를 돌면서 신호(sig_clock)를 감지하고 데이터를 수집.
    • 수집된 데이터를 trans_collected 변수에 저장.
  2. 데이터 체크 및 커버리지 수집
    • checks_enable이 활성화되면 perform_transfer_checks() 실행.
    • coverage_enable이 활성화되면 perform_transfer_coverage() 실행.
  3. 분석 포트를 통해 데이터 전달
    • item_collected_port.write(trans_collected); 실행하여 다른 컴포넌트로 데이터 전송.

3.6.5 정리

  • 모니터는 신호 수준 데이터(Signal-Level Data)를 추출하여 트랜잭션 데이터를 생성함.
  • 생성된 트랜잭션 데이터는 분석 포트를 통해 Scoreboard 또는 Coverage Collector로 전달됨.
  • 데이터 체크와 커버리지 수집 기능은 설정 가능하며, 필요에 따라 활성화/비활성화할 수 있음.
  • 프로토콜 체크 기능을 별도의 SystemVerilog Interface에서 구현할 수도 있음.

 

 

 


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.