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
분석
- uvm_sequencer:
- 요청 및 응답 타입(simple_item)으로 파라미터화합니다.
- uvm_sequencer_utils 매크로:
- 자동화된 시퀀서 관련 유틸리티를 제공합니다.
- 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
분석
- uvm_sequence_utils:
- 시퀀스와 시퀀서를 연결하며 관련 유틸리티를 자동 생성합니다.
- 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
분석
- uvm_sequence_library:
- 시퀀스의 그룹화를 통해 다양한 테스트 시나리오를 구현합니다.
- 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 테스트 환경에서 바로 사용할 수 있도록 설계되었으며, 실무에서도 쉽게 적용할 수 있는 예제를 제공합니다.
반응형
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 9. Directed-Test Style (v.s. UVM Style) (0) | 2024.12.01 |
---|---|
[UVM 1.1d] 7-3. UBus Verification Example (0) | 2024.12.01 |
[UVM 1.1d] 7-2. UBus Verification Example (0) | 2024.11.26 |
[UVM 1.1d] 7-1. UBus Verification Example (0) | 2024.11.24 |
[UVM 1.1d] 6-3. Advanced UVM Topics (UVM CLI) (0) | 2024.11.19 |
[UVM 1.1d] 6-2. Advanced UVM Topics (SEQ_LIB, Layering) (0) | 2024.11.13 |
댓글