지노랩 /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:31

3.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 코드 설명

  1. seq_item_port.try_next_item(s_item);
    • 트랜잭션을 요청하지만, 트랜잭션이 없으면 null을 반환.
    • get_next_item()과 달리 블로킹되지 않고 즉시 반환됨.
  2. if (s_item == null) { send_idle_transaction(); }
    • 트랜잭션이 없을 경우 IDLE 트랜잭션을 생성하여 실행.
    • 예를 들어, 프로토콜에 따라 특정 주기로 "NOP(No Operation)" 명령을 보낼 수도 있음.
  3. 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
를 바탕으로 작성된 글입니다.