지노랩 /JinoLab

[UVM] 3.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer) 본문

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

[UVM] 3.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer)

지노랩/JinoLab 2025. 3. 14. 12:40

3.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer)

3.5.4.1 개요

  • 일부 시퀀스에서는 생성된 값이 이전에 생성된 데이터의 응답(response)에 따라 달라질 수 있음.
  • 기본적으로, 드라이버와 시퀀서 사이에서 전달되는 데이터 아이템은 참조(reference)로 전달됨.
    • 즉, 드라이버에서 데이터 아이템을 수정하면 시퀀서에서도 그 변경 사항이 보임.
  • 그러나, 데이터가 값(value)으로 복사되어 전달되는 경우, 드라이버에서 처리한 응답을 시퀀서로 직접 돌려줘야 함.
  • 이를 위해 여러 가지 방법이 제공됨.

3.5.4.2 응답(response) 반환 방법

응답을 시퀀서로 반환하는 방법은 다음 세 가지가 있음.

  1. item_done() 메서드의 인자 사용
    • item_done()은 기본적으로 트랜잭션을 완료했다고 알리는 역할을 하는데, 응답 데이터를 인자로 전달하여 시퀀서로 반환할 수도 있음.
    seq_item_port.item_done(rsp);
    
    • rsp는 응답 데이터이며, 이를 시퀀서로 직접 전달함.
  2. put_response() 메서드 사용
    • put_response()는 응답을 시퀀서의 응답 큐(response queue)에 삽입하는 메서드.
    seq_item_port.put_response(rsp);
    
    • 주의할 점: put_response()는 블로킹(blocking) 방식으로 동작하므로, 시퀀스에서 get_response()를 호출해야 함.
    seq_item_port.get_response(rsp);
    
    • get_response()를 호출하지 않으면 put_response()가 블로킹되어 다음 동작으로 진행되지 않음.
  3. UVM 드라이버의 내장 분석 포트(analysis port) 사용
    • UVM 드라이버에는 기본적으로 rsp_port라는 분석 포트가 포함될 수 있음.
    • 이를 통해 응답 데이터를 분석 컴포넌트(예: 스코어보드, 커버리지 수집기)로 직접 전송할 수도 있음.
    rsp_port.write(rsp);
    
    • 분석 포트는 시퀀서뿐만 아니라 스코어보드(scoreboard)나 기타 분석 컴포넌트로도 데이터를 전달할 수 있는 장점이 있음.

3.5.4.3 응답의 ID 설정

  • 응답을 제공하기 전에, 반드시 응답 데이터의 시퀀스 ID 및 트랜잭션 ID를 요청(request) 트랜잭션과 동일하게 설정해야 함.
  • 이를 위해 set_id_info() 메서드를 사용함.
rsp.set_id_info(req);
  • 위 코드에서 req는 요청 트랜잭션, rsp는 응답 트랜잭션이다.
  • 이 과정을 생략하면, 응답 데이터가 올바른 요청 트랜잭션과 매칭되지 않을 가능성이 있음.

3.5.4.4 예제 코드

다음은 응답 데이터를 시퀀서로 반환하는 드라이버 예제이다.

class simple_driver extends uvm_driver #(simple_item);
    `uvm_component_utils(simple_driver)

    simple_item req;
    simple_item rsp;
    virtual dut_if vif;

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

    task run_phase(uvm_phase phase);
        forever begin
            seq_item_port.get_next_item(req);  // 시퀀서에서 요청 트랜잭션 가져오기
            drive_transaction(req);  // 트랜잭션 실행

            // 응답 데이터 생성
            rsp = new req;
            rsp.data = process_data(req.data);  // 데이터 처리
            rsp.set_id_info(req);  // 요청 트랜잭션 ID 설정

            // 방법 1: item_done()에 응답을 전달
            seq_item_port.item_done(rsp);

            // 방법 2: put_response() 사용
            seq_item_port.put_response(rsp);

            // 방법 3: 분석 포트를 이용한 응답 전달
            rsp_port.write(rsp);
        end
    endtask
endclass
  • get_next_item(req)를 호출하여 시퀀서에서 요청 데이터를 가져옴.
  • drive_transaction(req)를 실행하여 요청 트랜잭션을 DUT에 적용.
  • 응답 트랜잭션 rsp를 생성하고, 요청 트랜잭션의 ID를 복사 (set_id_info(req)).
  • item_done(rsp), put_response(rsp), rsp_port.write(rsp)를 통해 응답을 전달할 수 있음.

3.5.4.5 요약

  • UVM에서는 기본적으로 트랜잭션이 참조(reference)로 전달되지만, 값(value)으로 전달되는 경우 드라이버가 응답을 명시적으로 반환해야 함.
  • 응답을 반환하는 방법은 세 가지가 있음:
    1. item_done(rsp)를 사용하여 응답을 즉시 반환.
    2. put_response(rsp)를 사용하여 시퀀서의 응답 큐에 삽입.
    3. rsp_port.write(rsp)를 사용하여 분석 포트를 통해 응답을 전송.
  • 응답을 제공하기 전에 반드시 set_id_info(req)를 호출하여 요청과 응답의 ID를 일치시켜야 함.
  • put_response()는 블로킹(blocking) 방식이므로, 시퀀서에서 get_response()를 반드시 호출해야 함.

 

 

 


 

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