지노랩 /JinoLab
[UVM] 3.6 모니터(Monitor) 생성 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.6 모니터(Monitor) 생성
지노랩/JinoLab 2025. 3. 15. 12:473.6 모니터(Monitor) 생성
3.6.1 개요
- 모니터(Monitor)는 버스에서 신호 정보를 추출하고 이를 이벤트, 데이터, 상태 정보로 변환하는 역할을 수행.
- 변환된 정보는 TLM 인터페이스 및 채널을 통해 다른 컴포넌트와 테스트 코드에서 사용할 수 있도록 제공.
- 모니터는 드라이버(Driver) 등 다른 컴포넌트가 유지하는 상태 정보에 의존하면 안 되며, 요청 ID(request-specific ID)를 사용해 트랜잭션 ID를 설정할 수도 있음.
- 기본적으로 모든 검증 환경에서 필요한 필수 모니터링 기능만 수행해야 함.
- 프로토콜 체크(protocol checking) 및 커버리지 수집(coverage collection) 기능을 포함할 수 있음.
- 프로토콜 체크는 설정 가능해야 하며 필요에 따라 활성화/비활성화할 수 있어야 함.
- 추가적인 고수준 기능(예: Scoreboard)은 별도의 컴포넌트로 구현해야 함.
- 추상적인 모델을 검증하거나 핀-레벨 기능을 가속화하려면, 신호 레벨 정보 추출, 커버리지 수집, 프로토콜 체크, 트랜잭션 레벨 활동을 분리하여 처리해야 함.
- 분석 포트(Analysis Port)를 사용하여 서브 모니터 간 통신을 가능하게 할 수 있음.
3.6.2 모니터 예제
아래는 기본적인 모니터 구현 예제로, 주요 기능은 다음과 같음.
- 버스 인터페이스(xmi)를 통해 버스 정보를 수집.
- 수집된 데이터를 이용하여 커버리지 수집 및 데이터 검증 수행.
- 수집된 데이터를 분석 포트(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 동작 방식
- 트랜잭션 수집
- run_phase()에서 collect_transactions() 실행.
- 무한 루프를 돌면서 신호(sig_clock)를 감지하고 데이터를 수집.
- 수집된 데이터를 trans_collected 변수에 저장.
- 데이터 체크 및 커버리지 수집
- checks_enable이 활성화되면 perform_transfer_checks() 실행.
- coverage_enable이 활성화되면 perform_transfer_coverage() 실행.
- 분석 포트를 통해 데이터 전달
- 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
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.8 에이전트(Agent) 생성 (0) | 2025.03.16 |
|---|---|
| [UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components) (0) | 2025.03.15 |
| [UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers) (0) | 2025.03.14 |
| [UVM] 3.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer) (0) | 2025.03.14 |
| [UVM] 3.5.3 연속적인 난수 트랜잭션 가져오기 (Fetching Consecutive Randomized Items) (0) | 2025.03.13 |