6.4 Sequence Library (seq_lib)
Sequence Library는 다양한 시퀀스를 수집하여 검증 환경에서 재사용 가능하게 모아두는 시퀀스 집합체입니다. seq_lib는 검증 환경에서 특정 프로토콜이나 인터페이스를 검증하기 위한 시퀀스를 조직적으로 관리하고, 각 시퀀스를 필요에 따라 호출하여 사용할 수 있도록 합니다.
Sequence Library의 주요 기능
- 시퀀스 관리: 자주 사용하는 시퀀스를 미리 라이브러리로 등록하여 관리하고, 각 시퀀스를 쉽게 호출해 사용할 수 있습니다.
- 재사용성 향상: 다양한 시퀀스를 라이브러리 형태로 저장하여 검증 환경 내에서 일관성 있게 사용할 수 있습니다.
- 유연성 제공: 검증 요구사항에 따라 시퀀스를 추가하거나 교체할 수 있어, 검증 환경의 유연성이 높아집니다.
6.5 Protocol & Sequence Layering
Protocol & Sequence Layering은 상위 시퀀스가 여러 하위 시퀀스를 Layering하여 서로 다른 uvm_sequence_item을 사용하는 시퀀스들을 제어하는 방식입니다. Layering을 통해 복잡한 프로토콜을 효율적으로 관리하고 제어할 수 있습니다.
Protocol Layering의 주요 목적
- 다양한 프로토콜 계층 관리: 서로 다른 유형의 시퀀스와 uvm_sequence_item을 통합해 상위 프로토콜을 검증합니다.
- 유연한 제어: Layering을 통해 상위 시퀀스가 여러 하위 시퀀스를 쉽게 제어할 수 있어 복잡한 테스트 시나리오를 구현할 수 있습니다.
- Virtual Sequencer 활용: 서로 다른 시퀀스를 Layering할 때, 가상 시퀀서(Virtual Sequencer)를 사용해 유연하게 제어할 수 있습니다.
서로 다른 uvm_sequence_item을 사용하는 Sequence Layering
Layering된 시퀀스는 상위 시퀀스에서 각각 다른 시퀀스 아이템을 생성하고 실행합니다.
// 상위 시퀀스 정의
class top_sequence extends uvm_sequence#(top_sequence_item);
`uvm_object_utils(top_sequence)
virtual task body();
lower_sequence seq_a;
lower_sequence_b seq_b;
top_sequence_item item_a;
top_sequence_item item_b;
// 하위 시퀀스 A 실행
seq_a = lower_sequence::type_id::create("seq_a");
item_a = top_sequence_item::type_id::create("item_a");
start_item(item_a);
seq_a.start(null); // seq_a의 시퀀스를 실행하여 특정 동작 수행
// 하위 시퀀스 B 실행
seq_b = lower_sequence_b::type_id::create("seq_b");
item_b = top_sequence_item::type_id::create("item_b");
start_item(item_b);
seq_b.start(null); // seq_b의 시퀀스를 실행하여 특정 동작 수행
endtask
endclass
위 예제는 상위 시퀀스가 두 개의 하위 시퀀스(seq_a와 seq_b)를 실행하여 서로 다른 uvm_sequence_item을 사용하는 시퀀스 Layering을 보여줍니다. 상위 시퀀스는 하위 시퀀스를 관리하고 이를 통해 전체 Layering을 수행합니다.
Virtual Sequencer 기반의 General Layering 예제
Virtual Sequencer는 여러 하위 시퀀서를 제어하여 복잡한 Layering 구조를 간단하게 관리할 수 있게 해줍니다. 다음은 Virtual Sequencer를 활용한 일반적인 Layering 예제입니다.
Virtual Sequencer 정의
class my_virtual_sequencer extends uvm_sequencer;
`uvm_component_utils(my_virtual_sequencer)
my_sequencer_a sequencer_a;
my_sequencer_b sequencer_b;
function new(string name, uvm_component parent = null);
super.new(name, parent);
endfunction
endclass
Virtual Sequence 정의
Virtual Sequence는 my_virtual_sequencer 내의 여러 하위 시퀀서를 제어하여 서로 다른 시퀀스를 Layering할 수 있습니다.
class layered_sequence extends uvm_sequence#(layered_sequence_item);
`uvm_object_utils(layered_sequence)
my_virtual_sequencer p_sequencer;
function new(string name = "layered_sequence");
super.new(name);
endfunction
virtual task body();
// 첫 번째 하위 시퀀서 실행
lower_sequence seq_a;
seq_a = lower_sequence::type_id::create("seq_a");
seq_a.start(p_sequencer.sequencer_a);
// 두 번째 하위 시퀀서 실행
lower_sequence_b seq_b;
seq_b = lower_sequence_b::type_id::create("seq_b");
seq_b.start(p_sequencer.sequencer_b);
endtask
endclass
Test 클래스에서 Virtual Sequence 실행
class layered_test extends uvm_test;
`uvm_component_utils(layered_test)
virtual task run_phase(uvm_phase phase);
my_virtual_sequencer vseq;
layered_sequence lseq;
vseq = my_virtual_sequencer::type_id::create("vseq", this);
lseq = layered_sequence::type_id::create("lseq");
lseq.p_sequencer = vseq;
lseq.start(vseq);
endtask
endclass
이 예제에서는 **layered_sequence**가 두 개의 하위 시퀀서(sequencer_a와 sequencer_b)를 제어하여 상위 프로토콜을 구현하는 방법을 보여줍니다. run_phase에서 가상 시퀀서와 가상 시퀀스를 설정하고 실행하여 Layering 구조를 테스트합니다.
결론
Sequence Layering은 복잡한 프로토콜 계층을 관리하는 데 유용하며, 서로 다른 uvm_sequence_item을 사용하는 시퀀스 간의 Layering을 통해 다양한 시나리오를 효율적으로 검증할 수 있습니다. Virtual Sequencer는 이러한 Layering 구조를 간단하게 구성하는 데 도움을 주며, 상위 시퀀스가 여러 하위 시퀀스를 조정하여 복잡한 테스트 시나리오를 구현할 수 있게 합니다.
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 6-3. Advanced UVM Topics (UVM CLI) (0) | 2024.11.19 |
---|---|
[UVM 1.1d] 6-1. Advanced UVM Topics (Factory, Callback) (0) | 2024.11.12 |
[UVM 1.1d] 5-4. Register Model (Register Abstraction Layer) (0) | 2024.10.20 |
[UVM 1.1d] 5-3. Register Model (Register Abstraction Layer) (0) | 2024.10.20 |
[UVM 1.1d] 5-2. Register Model (Register Abstraction Layer) (0) | 2024.10.15 |
[UVM 1.1d] 5-1. Register Model (Register Abstraction Layer) (0) | 2024.10.15 |
댓글