7.10 UBus Agent Monitor
역할
- 트랜잭션 감시: DUT와의 신호 상호작용을 모니터링하며, 이를 ubus_transfer 객체로 변환.
- 데이터 전달: 생성된 트랜잭션 데이터를 analysis_port를 통해 다른 컴포넌트(예: Scoreboard)에 전달.
- 체크 및 커버리지: 프로토콜 체크와 커버리지 수집 기능을 제공합니다.
예제 코드
class ubus_agent_monitor extends uvm_monitor;
`uvm_component_utils(ubus_agent_monitor)
virtual ubus_if vif;
uvm_analysis_port#(ubus_transfer) analysis_port;
function new(string name, uvm_component parent);
super.new(name, parent);
analysis_port = new("analysis_port", this);
endfunction
virtual function void build_phase(uvm_phase phase);
if (!uvm_config_db#(virtual ubus_if)::get(this, "", "vif", vif)) begin
`uvm_fatal("NOVIF", "Virtual interface must be set.");
end
endfunction
virtual task run_phase(uvm_phase phase);
forever begin
ubus_transfer trans = new();
trans.addr = vif.addr;
trans.data = vif.data;
trans.write = vif.write;
analysis_port.write(trans);
@(posedge vif.clk); // 클럭 동기화
end
endtask
endclass
체크 및 커버리지 예제
- 체크: UBus의 크기 필드를 검증하는 assertion.
- 커버리지: UBus 트랜잭션 필드의 커버리지를 수집하는 covergroup.
systemverilog
function void check_transfer_size();
assert(trans_collected.size == 1 ||
trans_collected.size == 2 ||
trans_collected.size == 4 ||
trans_collected.size == 8)
else $error("Invalid transfer size!");
endfunction
covergroup cov_trans_beat @(posedge vif.clk);
beat_addr : coverpoint trans_collected.addr;
beat_data : coverpoint trans_collected.data;
beat_wait : coverpoint trans_collected.wait_state {
bins wait_states[] = { [0:3] };
}
endgroup
7.11 UBus Bus Monitor
역할
- 버스 활동 감시: UBus 신호 인터페이스를 감시하고 ubus_transfer 트랜잭션을 수집.
- 알림 포트: 상태 변경 및 수집된 트랜잭션을 state_port와 item_collected_port를 통해 전달.
주요 기능
- 버스 상태 감지: 상태 변경 사항(RST_START, ACTIVE 등)을 감지하여 TLM 포트를 통해 전달.
- 슬레이브 응답 확인: 수집된 주소를 바탕으로 적절한 슬레이브가 응답했는지 확인.
체크 및 커버리지 활성화 코드
systemverilog
코드 복사
uvm_config_db#(bit)::set(this, "ubus0.monitor", "checks_enable", 1); uvm_config_db#(bit)::set(this, "ubus0.monitor", "coverage_enable", 1);
Assertion 예제
systemverilog
always @(posedge sig_clock) begin
assertAddrUnknown: assert property (
disable iff(!checks_enable)
(sig_grant |-> ! $isunknown(sig_addr)))
else $error("ERR_ADDR_XZ: Address went to X or Z during Address Phase");
end
7.12 UBus Interface
역할
UBus Interface는 DUT와 UVM 테스트벤치를 연결하는 가상 인터페이스로, 신호 정의와 클럭 생성 등의 기능을 제공합니다.
예제 코드
systemverilog
interface ubus_if(input logic clk);
logic [31:0] addr;
logic [31:0] data;
logic write, read, reset;
endinterface
Assertions in Interface
- 주소 검증: Address Phase 중 주소 신호의 유효성을 확인합니다.
systemverilog
always @(posedge sig_clock) begin
assertAddrValid: assert property (
disable iff(!checks_enable)
(sig_grant |-> ! $isunknown(sig_addr)))
else $error("Invalid address during Address Phase");
end
요약
- UBus Agent Monitor:
- 트랜잭션 수집 및 전달.
- 프로토콜 체크와 커버리지 수집.
- UBus Bus Monitor:
- 버스 상태 감시 및 슬레이브 응답 확인.
- 상태와 데이터의 변경 사항을 알림 포트로 전달.
- UBus Interface:
- DUT와 테스트벤치를 연결하는 가상 인터페이스.
- 물리적 신호의 유효성을 검증하기 위한 Assertion 포함.
위의 구성 요소들은 UBus 검증 환경에서 중요한 역할을 수행하며, 확장성과 재사용성을 높이는 데 기여합니다.
반응형
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 9. Directed-Test Style (v.s. UVM Style) (0) | 2024.12.01 |
---|---|
[UVM 1.1d] 8. UVM Sequence Library (1) | 2024.12.01 |
[UVM 1.1d] 7-2. UBus Verification Example (0) | 2024.11.26 |
[UVM 1.1d] 7-1. UBus Verification Example (0) | 2024.11.24 |
[UVM 1.1d] 6-3. Advanced UVM Topics (UVM CLI) (0) | 2024.11.19 |
[UVM 1.1d] 6-2. Advanced UVM Topics (SEQ_LIB, Layering) (0) | 2024.11.13 |
댓글