[UVM 1.1d] 4-2. Reusable UVM Component
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 4-2. Reusable UVM Component

by 긍수저 2024. 10. 10.
반응형

4.8 가상 시퀀스 (Virtual Sequences)

**가상 시퀀스(Virtual Sequence)**는 여러 시퀀서를 동시에 제어하고 조정할 수 있는 시퀀스입니다. 이를 통해 복잡한 시스템 수준 테스트를 보다 효율적으로 작성할 수 있습니다. 가상 시퀀스는 복수의 시퀀서를 조정하여, 병렬로 시퀀스를 실행하거나 다양한 시퀀스를 한꺼번에 관리할 수 있습니다.

가상 시퀀스 예제 코드

가상 시퀀스를 작성하고 환경에 설정하는 방법은 아래와 같습니다.

class my_virtual_sequence extends uvm_sequence#(uvm_sequence_item);
  `uvm_object_utils(my_virtual_sequence)

  my_sequencer seqr1;
  my_sequencer seqr2;

  function new(string name = "my_virtual_sequence");
    super.new(name);
  endfunction

  virtual task body();
    my_sequence seq1;
    my_sequence seq2;

    // 각 시퀀서에 대한 시퀀스 실행
    seq1 = my_sequence::type_id::create("seq1");
    seq2 = my_sequence::type_id::create("seq2");

    // 시퀀서1에 시퀀스 실행
    seqr1.start(seq1);

    // 시퀀서2에 시퀀스 실행
    seqr2.start(seq2);
  endtask
endclass

가상 시퀀스를 환경에 설정하기

환경에서 가상 시퀀스를 설정하고 실행하기 위해선, 가상 시퀀서와 시퀀서를 연결해야 합니다.

class my_env extends uvm_env;
  my_sequencer seqr1;
  my_sequencer seqr2;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    seqr1 = my_sequencer::type_id::create("seqr1", this);
    seqr2 = my_sequencer::type_id::create("seqr2", this);
  endfunction
endclass

class my_test extends uvm_test;
  `uvm_component_utils(my_test)

  function new(string name = "my_test");
    super.new(name);
  endfunction

  virtual task run_phase(uvm_phase phase);
    my_virtual_sequence vseq;
    my_env env;

    // 환경 및 가상 시퀀스 설정
    env = my_env::type_id::create("env", this);
    vseq = my_virtual_sequence::type_id::create("vseq");

    // 가상 시퀀스에 시퀀서를 전달
    vseq.seqr1 = env.seqr1;
    vseq.seqr2 = env.seqr2;

    // 가상 시퀀스 실행
    vseq.start(null);
  endtask
endclass

 


4.9 Scoreboard 연결

Scoreboard는 DUT의 출력과 예상된 결과를 비교하여 검증의 정확성을 확인하는 컴포넌트입니다. Scoreboard는 monitor와 연결되어 트랜잭션을 수집하고 비교합니다.

Scoreboard 연결 예제 코드

class my_scoreboard extends uvm_scoreboard;
  `uvm_component_utils(my_scoreboard)

  uvm_analysis_port_imp#(my_transaction) item_collected_export;

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

  virtual function void write(my_transaction t);
    `uvm_info("SCOREBOARD", $sformatf("Comparing transaction: %0h", t), UVM_LOW)
    // 트랜잭션 비교 로직
  endfunction
endclass

class my_env extends uvm_env;
  my_monitor monitor;
  my_scoreboard scoreboard;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    monitor = my_monitor::type_id::create("monitor", this);
    scoreboard = my_scoreboard::type_id::create("scoreboard", this);

    // 모니터와 스코어보드 연결
    monitor.item_collected_port.connect(scoreboard.item_collected_export);
  endfunction
endclass

이 예시에서 monitor가 수집한 트랜잭션을 scoreboard로 전달하고, scoreboard는 이를 검증하여 예상 결과와 비교합니다.


4.10 모니터에서 Scoreboard로 데이터 전달

모니터는 DUT의 출력을 감시하고, 트랜잭션을 수집하여 scoreboard에 전달합니다.

class my_monitor extends uvm_monitor;
  uvm_analysis_port#(my_transaction) item_collected_port;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    item_collected_port = new("item_collected_port", this);
  endfunction

  task run_phase(uvm_phase phase);
    my_transaction t;
    forever begin
      // DUT의 신호 수집 및 트랜잭션 생성
      item_collected_port.write(t); // 스코어보드로 트랜잭션 전달
    end
  endtask
endclass

4.11 마무리

이 장에서는 가상 시퀀스 작성 및 환경에서의 설정 방법, 그리고 scoreboard와 monitor 간의 연결을 다루었습니다. 가상 시퀀스는 복잡한 시나리오에서 여러 시퀀서를 조정하는 데 필수적이며, scoreboard는 결과를 비교하여 설계 검증을 수행하는 중요한 역할을 합니다.

반응형

댓글