본문 바로가기

HDL/UVM

[UVM] virtual sequencer를 사용하는 목적

반응형

UVM(유니버설 검증 방법론)에서 sequencer는 일련의 트랜잭션을 생성하고, 이를 특정 driver로 보내는 역할을 수행한다. 각각의 트랜잭션은 데이터 패킷이나 버스 명령 등을 나타낼 수 있다. sequencer는 테스트 시나리오의 중요한 부분을 구성하며, driver가 수행하는 트랜잭션의 순서를 제어하고 실행 시간을 조절한다.

Sequencer는 다음 두 가지 주요 메서드로 구성된다:

start_item: 이 메서드는 새로운 트랜잭션을 시작한다. 이 메서드는 일반적으로 트랜잭션을 생성하고, 필요한 모든 데이터를 채우며, 이를 시작할 준비를 한다.

finish_item: 이 메서드는 트랜잭션의 완료를 알린다. 이 메서드는 일반적으로 트랜잭션을 driver로 전송하고, driver가 트랜잭션을 수행할 수 있도록 sequencer를 알린다.

이런 식으로 sequencer는 트랜잭션의 생성, 설정, 전송을 제어하며, 테스트 시나리오의 중요한 요소를 구성한다.

또한, virtual sequencer는 여러 sequencer를 한 곳에서 관리하고 제어하는 기능을 제공한다. 각 sequencer는 다른 driver에 트랜잭션을 보낼 수 있다. 따라서, 여러 driver가 서로 다른 시간에 서로 다른 트랜잭션을 실행하도록 하려면, 각각의 sequencer를 개별적으로 제어하는 대신 virtual sequencer를 사용할 수 있다. virtual sequencer는 sequencer의 묶음을 한 곳에서 제어할 수 있도록 한다.

예를 들어, 시스템에 여러 인터페이스가 있는 경우 (예: AXI, APB, SPI 등), 각 인터페이스는 자체 sequencer를 가질 수 있다. 특정 시퀀스에서는 이러한 인터페이스들 사이에 동기화를 유지하면서 다른 인터페이스에 트랜잭션을 보내야 할 수 있다. 이러한 상황에서는 하나의 virtual sequencer를 사용하여 모든 인터페이스 sequencer를 동시에 제어하고 동기화할 수 있다. 이 방법을 통해 검증 환경의 복잡성을 관리하고 테스트 시나리오를 쉽게 제어할 수 있다.

 

먼저 두 개의 서로 다른 sequencer와 이들을 관리하는 virtual sequencer를 가정한다. 이 예제에서는 간단한 트랜잭션만 사용한다.

class my_transaction extends uvm_sequence_item;
  `uvm_object_utils(my_transaction)

  // Transaction members and methods go here.
endclass

class sequencer1 extends uvm_sequencer #(my_transaction);
  `uvm_component_utils(sequencer1)

  // Sequencer implementation goes here.
endclass

class sequencer2 extends uvm_sequencer #(my_transaction);
  `uvm_component_utils(sequencer2)

  // Sequencer implementation goes here.
endclass

class my_virtual_sequencer extends uvm_sequencer #(my_transaction);
  `uvm_component_utils(my_virtual_sequencer)

  sequencer1 seq1;
  sequencer2 seq2;

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

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    seq1 = sequencer1::type_id::create("seq1", this);
    seq2 = sequencer2::type_id::create("seq2", this);
  endfunction
endclass

 

위 코드에서 my_virtual_sequencer는 두 개의 서로 다른 sequencer (seq1과 seq2)를 포함하고 있습니다. 이 두 sequencer는 build_phase에서 생성되며, 이후에는 my_virtual_sequencer 내에서 제어됩니다.

이런 식으로 virtual sequencer를 사용하면 여러 서로 다른 sequencer를 한 곳에서 관리하고 제어할 수 있으며, 이는 테스트 시나리오의 복잡성을 줄이는 데 도움이 됩니다. 이러한 접근 방식은 서로 다른 버스 인터페이스 또는 통신 프로토콜을 동시에 제어해야 하는 복잡한 시스템에서 특히 유용합니다.



 

참조 : 

http://www.learnuvmverification.com/index.php/2016/02/23/how-virtual-sequence-works-part-1/

반응형

'HDL > UVM' 카테고리의 다른 글

[UVM] uvm_config_db 관련  (0) 2023.09.15
[UVM] Agent  (0) 2023.07.19
[UVM] Drivers  (0) 2023.07.18
UVM Tests (테스트 시나리오)  (0) 2019.12.24