본문 바로가기

보통 쓰기 동작은 예제가 너무 많아서 쉽게 되는데, 되려 read 즉 DUT Interface 에서 데이터를 받아서 Driver 이런 곳에서 확인하는 것에 대한 예제가 잘 안보이네.

우리 AI를 이용해서 열심히 답을 내보니, 좋은 결과를 보여주네. 핵심은

seq_item_port.put_response(item);

예로 살펴보자. AXI 인터페이스를 사용하는 경우, 읽기 트랜잭션에서 데이터를 받아 sequence_item의 데이터 필드에 넘겨주는 기능을 구현하고자 할 때, 몇 가지 추가적인 단계가 필요합니다. 이 과정은 드라이버가 데이터를 받고 해당 데이터를 관련 sequence_item에 저장하여, 이후의 검증 단계 또는 점수 계산(scoreboarding)에서 사용할 수 있도록 하는 것을 포함합니다.

읽기 트랜잭션에서 데이터 반환 구현

drive_item 태스크 내에서 읽기 트랜잭션을 처리하는 부분을 수정하여, 인터페이스에서 읽은 데이터를 sequence_item 객체의 데이터 필드에 저장하고, 이를 UVM 테스트벤치의 다른 컴포넌트와 공유할 수 있도록 합니다.

virtual task drive_item(my_sequence_item item);
    @(posedge vif.clock);
    if (item.read) {
        vif.araddr <= item.addr;
        vif.arvalid <= 1;
        wait (vif.arready);
        @(posedge vif.clock);
        vif.arvalid <= 0;
        wait (vif.rvalid);
        @(posedge vif.clock);
        item.data = vif.rdata;  // Store the read data back to the sequence item
        vif.rready <= 1;
        @(posedge vif.clock);
        `uvm_info("DRIVER", $sformatf("Read addr: %0h, received data: %0h", item.addr, item.data), UVM_HIGH);
        vif.rready <= 0;
        // Notify the sequencer that the item has been updated with the received data
        seq_item_port.put_response(item);
    } else {
        vif.awaddr <= item.addr;
        vif.awvalid <= 1;
        wait (vif.awready);
        @(posedge vif.clock);
        vif.awvalid <= 0;
        vif.wdata <= item.data;
        vif.wvalid <= 1;
        wait (vif.wready);
        @(posedge vif.clock);
        vif.wvalid <= 0;
        // Wait for B channel response
        wait (vif.bvalid);
        vif.bready <= 1;
        @(posedge vif.clock);
        `uvm_info("DRIVER", $sformatf("Write complete at addr: %0h, data: %0h", item.addr, item.data), UVM_HIGH);
        vif.bready <= 0;
    }
endtask: drive_item

변경 사항 설명

  1. 데이터 저장: 읽기 동작을 수행한 후, 인터페이스에서 반환된 데이터(rdata)를 sequence_itemdata 필드에 저장합니다.
  2. 응답 처리: 데이터를 받은 후, sequence_item을 업데이트하고, put_response() 메서드를 호출하여 이 정보를 시퀀서에 통지합니다. 이는 시퀀스 또는 스코어보드에서 해당 데이터를 사용할 수 있게 합니다.

주의 사항

  • 이 구현은 my_sequence_itemdata 필드가 존재하고, 이 필드가 public 또는 수정 가능하다고 가정합니다.
  • put_response()는 UVM에서 응답 처리를 관리하는 표준 방식입니다. 이를 사용하여 드라이버에서 시퀀스나 스코어보드로 데이터를 전달할 수 있습니다.

이와 같은 수정을 통해 드라이버는 AXI 읽기 트랜잭션에서 받은 데이터를 sequence_item을 통해 테스트벤치의 다른 부분과 공유할 수 있게 됩니다. 이는 데이터의 흐름을 관리하고, 테스트의 검증 과정에서 필요한 데이터 접근성을 향상시키는 데 도움을 줍니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.