지노랩 /JinoLab

[UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers) 본문

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

[UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers)

지노랩/JinoLab 2025. 3. 14. 13:42

3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers)

3.5.5.1 개요

  • seq_item_port는 UVM의 uvm_driver 클래스에 내장된 양방향 포트로, 다양한 TLM 메서드를 제공함.
  • 일반적으로 seq_item_port를 통해 시퀀서에서 트랜잭션을 요청하고 응답을 제공함.
  • 드라이버가 uvm_driver에서 직접 상속되지 않더라도 seq_item_port와 상호작용이 가능.
  • TLM 방식의 트랜잭션 요청 및 응답을 처리하는 주요 메서드는 get(), peek(), put()이 있음.

3.5.5.2 주요 TLM 메서드

  1. peek()
    • 블로킹(blocking) 방식의 메서드로, 시퀀서에서 다음 트랜잭션을 미리 확인할 수 있음.
    • 트랜잭션을 가져오긴 하지만, 시퀀서를 계속 진행시키지는 않음.
    • 예제 코드:
      peek(req);
      // 트랜잭션 req를 확인한 후, 별도 처리를 수행
      
    • 주의점: peek()는 블로킹 방식이므로 새로운 트랜잭션이 올 때까지 실행이 멈출 수 있음.
  2. get()
    • 블로킹(blocking) 방식의 메서드로, 트랜잭션을 가져오면서 시퀀서를 다음 단계로 진행시킴.
    • 일반적으로 peek()와 함께 사용됨.
    • 예제 코드:
      get(req);
      // 트랜잭션 req를 가져와 실행
      
    • get()을 호출하면 시퀀서가 다음 트랜잭션을 생성할 수 있음.
  3. put()
    • 응답 데이터를 시퀀서로 전달하는 메서드.
    • 시퀀서가 get_response()를 호출하여 응답을 받을 수 있도록 함.
    • 예제 코드:
      seq_item_port.put(rsp);
      
    • put()을 호출하면 시퀀서가 해당 응답을 처리할 수 있음.

3.5.5.3 트랜잭션 처리 흐름

  • TLM 기반 드라이버에서 트랜잭션을 처리하는 순서:
    1. 시퀀서에서 트랜잭션을 미리 확인 (peek())
    2. 트랜잭션을 가져옴 (get())
    3. DUT에 트랜잭션을 적용하고 응답 생성
    4. 응답을 시퀀서로 반환 (put())
    5. 또는 analysis_port를 사용하여 응답 전달 (rsp_port.write(rsp))

3.5.5.4 예제 코드

다음은 TLM 기반 드라이버의 기본적인 동작 예제이다.

class simple_driver extends uvm_component;
    `uvm_component_utils(simple_driver)

    simple_item req;
    simple_item rsp;
    virtual dut_if vif;
    uvm_seq_item_pull_port #(simple_item) seq_item_port;

    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction

    task run_phase(uvm_phase phase);
        forever begin
            // 트랜잭션을 미리 확인
            seq_item_port.peek(req);

            // 트랜잭션을 가져와 실행
            seq_item_port.get(req);
            drive_transaction(req);

            // 응답 트랜잭션 생성
            rsp = new req;
            rsp.data = process_data(req.data);
            rsp.set_id_info(req);

            // 응답을 시퀀서로 반환
            seq_item_port.put(rsp);

            // 분석 포트를 통해 응답 전달 가능
            rsp_port.write(rsp);
        end
    endtask
endclass

3.5.5.5 주요 특징

  • peek(req)를 사용하여 트랜잭션을 미리 확인 가능.
  • get(req)를 호출하면 트랜잭션을 가져오면서 시퀀서가 진행됨.
  • put(rsp)를 사용하여 응답을 시퀀서로 전달.
  • rsp_port.write(rsp)를 사용하면 응답 데이터를 분석 포트를 통해 전달 가능.
  • peek()는 블로킹 방식이므로 트랜잭션이 생성될 때까지 실행이 멈출 수 있음.

3.5.5.6 요약

  • TLM 기반 드라이버는 seq_item_port를 사용하여 시퀀서와 통신.
  • 트랜잭션을 확인(peek()), 가져옴(get()), 응답을 전달(put())하는 방식으로 동작.
  • 트랜잭션을 바로 처리하지 않고 대기할 수도 있으며, 분석 포트를 활용할 수도 있음.
  • 블로킹 방식의 peek()는 실행이 멈출 수 있으므로 주의해야 함.
  • put()를 사용하면 응답을 시퀀서로 전달할 수 있음.

 

 

 


 

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