Projects

[UVM] Reusable 검증 컴포넌트 생성하기: 3

arkrg 2026. 1. 20. 15:13

시나리오 생성 3.10

검증 컴포넌트 개발자는 검증환경 사용자가 테스트 작성을 쉽게 할 수 있도록 아래 사항을 준수하며 컴포넌트를 개발해야함

  • 테스트 컨트롤을 단순화하기 위한 노브를 데이터 아이쳄 클래스에 배치해야함
  • 재시용 가능한 검증가치가 있는 시퀀스 라이브러리를 생성
    검증자가 환경 내 시퀀서를 구성하여 환경에서 생성되는 패턴 제어
  • 새로운 트랜잭션 시퀀스 정의
  • 기존 시퀀스를 호출하는 새 시퀀스 정의
  • 드라이버를 수정할 수 있도록 노브 기본값을 덮어 씌우고 전반적인 env 동작 수정
  • 새로운 동작이나 시퀀스 활성화

시퀀스 선언하기

uvm_sequence를 직간접적으로 상속받아서 sequence들을 만들어야함

  1. uvm_sequence 상속하고 request 및 response 타입을 파라미터로 지정하기
  2. uvm_object_utils 매크로 사용해서 팩토리에 등록하기
  3. 생성한 시퀀스가 자신과 연결된 시퀀서 의 특정 기능에 접근하는 경우에는 코드를 추가하거나 uvm_declare_p_sequencer 매크로를 사용해서 원하는 시퀀서를 가리키는 시퀀서 포인터를 선언하고 설정해야한다
    ?> 무슨 코드를 추가하라는거지
  4. 시퀀스의 body 테스크를 구현해서 원하는 시나리오를 수행할 수 있게 하기

m_sequencer와 p_sequencer의 개념
둘다 시퀀스A를 수행하는 시퀀서인데 m_sequencer는 자동으로 잡힘(시퀀스가 시작할때 UVM이 시퀀서의 포인터를 m_seuqncer에 담음)
m_sequencer는 base sequencer 타입으로 모든 시퀀서 타입을 캐스팅 할 수 있고 시퀀서의 공통 기능에 접근할 수 있게 함
p_sequencer는 지정해야만 설정되고 설정되어있으면 시퀀서의 내부 함수나 변수에 접근 할 수 있음 시퀀스가 시퀀서 상태를 보고 수행되야 할 때 사용하지만 당연히 시퀀서 타입이 지정되니까 의존도가 높아진다

m_sequencer 사용처

  • uvm_confg_db에서 값 꺼내올때
    시퀀스는 컴포넌트가 아니기 때문에 자신의 경로(this)가 없다 대신 자신을 돌리는 시퀀서의 위치를 기준으로 설정값을 가져와야함
    task body();
    int debug_level;
    // 나를 실행하는 시퀀서(m_sequencer)에 설정된 'DB_LEVEL' 값을 가져오기
    if (!uvm_config_db#(int)::get(m_sequencer, "", "DB_LEVEL", debug_level)) begin
      debug_level = 0;
    end
    endtask
  • 계층 경로 및 이름 확인 (get_full_name())
    디버깅을 위해 현재 시퀀스가 어느 에이전트 소속인지 출력할 때
    this.get_full_name()을 하면 시퀀스 이름 나오고 m_sequencer.get_full_name()을 하면 uvm_test_top.env.my_agt.sqr 처럼 전체 경로 나옴
  • Response 핸들링 (get_response)
    드라이버가 처리한 결과를 시퀀스가 다시 받아올 때, 내부적으로 어느 시퀀서로부터 응답을 기다릴지 지정하는 용도로 쓰임
    // 드라이버로부터 응답(Response)을 명시적으로 가져올 때
    get_response(rsp, m_sequencer);
  • 시퀀스 내부에서 다른 시퀀스를 시작할 때 (start)
    부모 시퀀스가 자식 시퀀스를 실행할 때, "너도 내가 돌아가고 있는 이 시퀀서 위에서 돌아가라"라고 지정해 줄 때 사용
    child_seq.start(m_sequencer); // 현재 시퀀서와 동일한 곳에서 자식 시퀀스 실행

시퀀스와 시퀀스아이템 보내기

시퀀스는 다음을 정의할 수 있다

  • DUT에 보내지는 데이터 아이템 스트림
  • 인터페이스에서 수행될 동작 스트림
    DUT나 인터페이스에 적용할 신호 생성하기 이외에도 사용되 수 있다

    시퀀스와 시퀀스 아이템의 기본적인 흐름

    시퀀스 아이템 보내기: 시퀀스의 body()create() (팩토리를 통해 수행), 아이템에서 start_item() 호출 랜덤화(옵션) 아이템에서 finish_item() 호출해야 함

서브시퀀스 보내기: 부모 시퀀스의 body() 가 서브 시퀀스를 생성하고 랜덤화(옵션)한 뒤, 서브 시퀀스의 start()메서드를 호출한다. 만약 실행된 아이쳄에 연관된 response가 있으면 부모 시퀀스는 get_response() 를 호출 할 수 있다

시퀀스 시작하기

시퀀스 아이템과 시퀀스 덮어쓰기

--
이 포스팅은 Accellera의 'Universal Verification Methodology (UVM) 1.2 User's Guide' 내용을 바탕으로 학습하며 정리한 글입니다

'Projects' 카테고리의 다른 글

RVVI기반 RISC-V CPU 검증 환경 구축  (0) 2026.01.08
해야댐  (2) 2025.09.22