[UVM 1.1d] 8. UVM Sequence Library
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 8. UVM Sequence Library

by 긍수저 2024. 12. 1.

1. Sequencer 생성

Sequencer는 Stimulus Data를 생성하여 Driver로 전달하는 역할을 합니다. 기본적으로 uvm_sequencer 클래스를 상속받아 커스터마이징합니다.

주요 코드 예제

systemverilog
class simple_sequencer extends uvm_sequencer #(simple_item);
  `uvm_sequencer_utils(simple_sequencer)

  // 생성자
  function new (string name="simple_sequencer", uvm_component parent);
    super.new(name, parent);
    `uvm_update_sequence_lib_and_item(simple_item)
  endfunction
endclass

분석

  1. uvm_sequencer:
    • 요청 및 응답 타입(simple_item)으로 파라미터화합니다.
  2. uvm_sequencer_utils 매크로:
    • 자동화된 시퀀서 관련 유틸리티를 제공합니다.
  3. uvm_update_sequence_lib_and_item 매크로:
    • 시퀀스와 데이터 아이템을 연결하여 시퀀서가 처리할 수 있도록 설정합니다.

2. 사용자 정의 시퀀스 생성

시퀀스는 DUT에 전달될 데이터 및 동작을 정의합니다. 기본적으로 uvm_sequence 클래스를 상속받아 작성합니다.

주요 코드 예제

systemverilog
class simple_seq_do extends uvm_sequence #(simple_item);
  rand int count;
  constraint c1 { count > 0; count < 50; }

  // 생성자
  function new(string name="simple_seq_do");
    super.new(name);
  endfunction

  `uvm_sequence_utils(simple_seq_do, simple_sequencer)

  // 시퀀스 동작 정의
  virtual task body();
    repeat(count) begin
      `uvm_do(req)
    end
  endtask
endclass

분석

  1. uvm_sequence_utils:
    • 시퀀스와 시퀀서를 연결하며 관련 유틸리티를 자동 생성합니다.
  2. body 메서드:
    • 시퀀스의 주요 동작을 정의하며, DUT로 전송할 트랜잭션 생성 및 제약 조건을 설정합니다.

3. Sequence Library 구성

Sequence Library는 다양한 시퀀스를 그룹화하여 재사용성을 높이는 데 사용됩니다. 라이브러리 생성 시 uvm_sequence_library를 확장합니다.

주요 코드 예제

class my_seq_lib extends uvm_sequence_library #(my_item);
  `uvm_object_utils(my_seq_lib)
  `uvm_sequence_library_utils(my_seq_lib)

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

시퀀스 추가 예제

class my_seq1 extends my_seq;
  `uvm_object_utils(my_seq1)
  `uvm_add_to_seq_lib(my_seq1, my_seq_lib)
endclass

분석

  1. uvm_sequence_library:
    • 시퀀스의 그룹화를 통해 다양한 테스트 시나리오를 구현합니다.
  2. uvm_add_to_seq_lib:
    • 시퀀스를 라이브러리에 추가하여 필요 시 호출할 수 있도록 설정합니다.

4. Sequence Library 실행 모드

라이브러리는 여러 실행 모드를 제공합니다.

주요 실행 모드

  • UVM_SEQ_LIB_RAND: 랜덤한 시퀀스를 실행.
  • UVM_SEQ_LIB_RANDC: 중복 없이 랜덤 실행.
  • UVM_SEQ_LIB_ITEM: 단일 아이템 실행.
  • UVM_SEQ_LIB_USER: 사용자 정의 select_sequence() 메서드로 실행.

실행 모드 설정 예제

uvm_config_db#(uvm_sequence_lib_mode)::set(this, "", 
                                           "default_sequence.selection_mode", 
                                           UVM_SEQ_LIB_RAND);

5. 기본 시퀀스 설정

Sequencer는 기본적으로 uvm_random_sequence를 실행합니다. 이를 사용자 정의 시퀀스로 변경할 수 있습니다.

설정 코드 예제

set_config_string("*.master0.sequencer", "default_sequence", "simple_seq_do");

6. 중첩 시퀀스

중첩 시퀀스를 활용하여 복잡한 시나리오를 구현할 수 있습니다.

주요 코드 예제

systemverilog
class rand_retry_seq extends uvm_sequence #(uart_frame);
  retry_seq retry_sequence;

  `uvm_sequence_utils(rand_retry_seq, uart_tx_sequencer)

  task body();
    `uvm_do(req)
    `uvm_do_with(retry_sequence, { retry_sequence.pload inside {[0:31]}; })
    `uvm_do(req)
  endtask
endclass

분석

  • 중첩 호출: retry_sequence를 호출하여 기존 시퀀스의 동작을 재사용.
  • 제약 조건 추가: uvm_do_with를 활용해 인라인 제약을 설정.

7. 결론

  • Sequencer 및 Sequence 정의:
    • UVM의 유연성과 확장성을 활용해 다양한 시나리오를 설계 가능.
  • Sequence Library 활용:
    • 코드 재사용성을 높이고 테스트 개발 시간을 단축.
  • 실제 적용:
    • UVM의 기본 제공 도구와 매크로를 활용해 검증 환경에서 요구하는 다양한 테스트 시나리오를 쉽게 구현 가능.

위 코드는 UVM 테스트 환경에서 바로 사용할 수 있도록 설계되었으며, 실무에서도 쉽게 적용할 수 있는 예제를 제공합니다.

반응형

댓글