지노랩 /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:403.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer)
3.5.4.1 개요
- 일부 시퀀스에서는 생성된 값이 이전에 생성된 데이터의 응답(response)에 따라 달라질 수 있음.
- 기본적으로, 드라이버와 시퀀서 사이에서 전달되는 데이터 아이템은 참조(reference)로 전달됨.
- 즉, 드라이버에서 데이터 아이템을 수정하면 시퀀서에서도 그 변경 사항이 보임.
- 그러나, 데이터가 값(value)으로 복사되어 전달되는 경우, 드라이버에서 처리한 응답을 시퀀서로 직접 돌려줘야 함.
- 이를 위해 여러 가지 방법이 제공됨.
3.5.4.2 응답(response) 반환 방법
응답을 시퀀서로 반환하는 방법은 다음 세 가지가 있음.
- item_done() 메서드의 인자 사용
- item_done()은 기본적으로 트랜잭션을 완료했다고 알리는 역할을 하는데, 응답 데이터를 인자로 전달하여 시퀀서로 반환할 수도 있음.
seq_item_port.item_done(rsp);- rsp는 응답 데이터이며, 이를 시퀀서로 직접 전달함.
- 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()가 블로킹되어 다음 동작으로 진행되지 않음.
- 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)으로 전달되는 경우 드라이버가 응답을 명시적으로 반환해야 함.
- 응답을 반환하는 방법은 세 가지가 있음:
- item_done(rsp)를 사용하여 응답을 즉시 반환.
- put_response(rsp)를 사용하여 시퀀서의 응답 큐에 삽입.
- rsp_port.write(rsp)를 사용하여 분석 포트를 통해 응답을 전송.
- 응답을 제공하기 전에 반드시 set_id_info(req)를 호출하여 요청과 응답의 ID를 일치시켜야 함.
- put_response()는 블로킹(blocking) 방식이므로, 시퀀서에서 get_response()를 반드시 호출해야 함.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.6 모니터(Monitor) 생성 (0) | 2025.03.15 |
|---|---|
| [UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers) (0) | 2025.03.14 |
| [UVM] 3.5.3 연속적인 난수 트랜잭션 가져오기 (Fetching Consecutive Randomized Items) (0) | 2025.03.13 |
| [UVM] 3.5.2 난수 생성된 아이템 확인 (Querying for the Randomized Item) (0) | 2025.03.13 |
| [UVM] 3.5.1 기본적인 시퀀서와 드라이버의 상호작용 (0) | 2025.03.12 |