시나리오 생성 3.10
검증 컴포넌트 개발자는 검증환경 사용자가 테스트 작성을 쉽게 할 수 있도록 아래 사항을 준수하며 컴포넌트를 개발해야함
- 테스트 컨트롤을 단순화하기 위한 노브를 데이터 아이쳄 클래스에 배치해야함
- 재시용 가능한 검증가치가 있는 시퀀스 라이브러리를 생성
검증자가 환경 내 시퀀서를 구성하여 환경에서 생성되는 패턴 제어 - 새로운 트랜잭션 시퀀스 정의
- 기존 시퀀스를 호출하는 새 시퀀스 정의
- 드라이버를 수정할 수 있도록 노브 기본값을 덮어 씌우고 전반적인 env 동작 수정
- 새로운 동작이나 시퀀스 활성화
시퀀스 선언하기
uvm_sequence를 직간접적으로 상속받아서 sequence들을 만들어야함
- uvm_sequence 상속하고 request 및 response 타입을 파라미터로 지정하기
- uvm_object_utils 매크로 사용해서 팩토리에 등록하기
- 생성한 시퀀스가 자신과 연결된 시퀀서 의 특정 기능에 접근하는 경우에는 코드를 추가하거나 uvm_declare_p_sequencer 매크로를 사용해서 원하는 시퀀서를 가리키는 시퀀서 포인터를 선언하고 설정해야한다
?> 무슨 코드를 추가하라는거지 - 시퀀스의 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 |