지노랩 /JinoLab
[UVM] 3.5.2 난수 생성된 아이템 확인 (Querying for the Randomized Item) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.5.2 난수 생성된 아이템 확인 (Querying for the Randomized Item)
지노랩/JinoLab 2025. 3. 13. 12:313.5.2 난수 생성된 아이템 확인 (Querying for the Randomized Item)
3.5.2.1 개요
- UVM에서 드라이버(Driver)는 시퀀서(Sequencer)에서 트랜잭션을 가져와 실행하는 역할을 한다.
- 기본적으로 get_next_item()을 사용하면 트랜잭션이 생성될 때까지 블로킹(blocking)됨.
- 그러나, try_next_item()을 사용하면 블로킹되지 않고 즉시 반환되므로, 실행할 트랜잭션이 없을 때도 추가적인 동작을 수행할 수 있음.
- 이를 활용하면, 의미 있는 트랜잭션이 없을 때 "idle" 상태의 트랜잭션을 실행할 수 있음.
3.5.2.2 try_next_item()을 이용한 실행 흐름
- try_next_item()은 get_next_item()과 다르게 즉시 반환됨.
- 만약 트랜잭션이 없으면 null을 반환하므로, 이를 체크하여 적절한 동작을 수행할 수 있음.
- 이를 활용하면 트랜잭션이 없는 경우에도 드라이버가 특정 동작(예: IDLE 트랜잭션 실행)을 수행할 수 있음.
3.5.2.3 run_phase() 구현 예제
기존 get_next_item()을 사용한 코드 대신 try_next_item()을 사용하여 IDLE 트랜잭션을 추가로 실행하는 코드를 작성할 수 있다.
task run_phase(uvm_phase phase);
forever begin
// 시퀀서에서 다음 트랜잭션을 시도 (블로킹 없음)
seq_item_port.try_next_item(s_item);
if (s_item == null) begin
// 실행할 트랜잭션이 없으면, IDLE 트랜잭션을 실행
send_idle_transaction();
end else begin
// 트랜잭션이 있으면 실행
drive_item(s_item);
// 실행 완료 후 시퀀서에 완료 신호 전송
seq_item_port.item_done();
end
end
endtask : run_phase
3.5.2.4 코드 설명
- seq_item_port.try_next_item(s_item);
- 트랜잭션을 요청하지만, 트랜잭션이 없으면 null을 반환.
- get_next_item()과 달리 블로킹되지 않고 즉시 반환됨.
- if (s_item == null) { send_idle_transaction(); }
- 트랜잭션이 없을 경우 IDLE 트랜잭션을 생성하여 실행.
- 예를 들어, 프로토콜에 따라 특정 주기로 "NOP(No Operation)" 명령을 보낼 수도 있음.
- else { drive_item(s_item); seq_item_port.item_done(); }
- 유효한 트랜잭션이 있으면 drive_item(s_item);을 실행.
- 트랜잭션 실행 후, item_done();을 호출하여 시퀀서에 완료 신호를 보냄.
3.5.2.5 IDLE 트랜잭션 구현 예제
아래 코드는 IDLE 트랜잭션을 실행하는 send_idle_transaction()을 추가한 예제이다.
task send_idle_transaction();
`uvm_info("DRIVER", "Sending IDLE transaction", UVM_MEDIUM)
vif.addr <= 0;
vif.data <= 0;
vif.write_enable <= 0;
#10; // IDLE 사이클 대기
endtask : send_idle_transaction
- IDLE 트랜잭션을 실행하여 특정 기간 동안 DUT에 유휴(IDLE) 상태를 유지.
- 예제에서는 addr과 data를 0으로 설정하고, write_enable을 0으로 유지한 채 10 사이클 동안 대기.
✅ 3.5.2 요약
- try_next_item()은 get_next_item()과 달리 블로킹되지 않고 즉시 반환됨.
- 시퀀서에서 트랜잭션이 없으면 null을 반환하므로, 이를 체크하여 IDLE 트랜잭션을 실행할 수 있음.
- IDLE 트랜잭션은 특정 주기로 "NOP" 신호를 보내거나, DUT가 대기 상태에서 동작하도록 유도하는 용도로 활용됨.
- 이를 통해 UVM 환경에서 보다 현실적인 테스트벤치를 구현할 수 있음.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [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 |
| [UVM] 3.5.1 기본적인 시퀀서와 드라이버의 상호작용 (0) | 2025.03.12 |
| [UVM] 3.5 드라이버와 시퀀서 연결 (0) | 2025.03.12 |
| [UVM] 3.4 시퀀서(Sequencer) 생성 (0) | 2025.03.11 |