반응형
4.8 가상 시퀀스 (Virtual Sequences)
**가상 시퀀스(Virtual Sequence)**는 여러 시퀀서를 동시에 제어하고 조정할 수 있는 시퀀스입니다. 이를 통해 복잡한 시스템 수준 테스트를 보다 효율적으로 작성할 수 있습니다. 가상 시퀀스는 복수의 시퀀서를 조정하여, 병렬로 시퀀스를 실행하거나 다양한 시퀀스를 한꺼번에 관리할 수 있습니다.
가상 시퀀스 예제 코드
가상 시퀀스를 작성하고 환경에 설정하는 방법은 아래와 같습니다.
class my_virtual_sequence extends uvm_sequence#(uvm_sequence_item);
`uvm_object_utils(my_virtual_sequence)
my_sequencer seqr1;
my_sequencer seqr2;
function new(string name = "my_virtual_sequence");
super.new(name);
endfunction
virtual task body();
my_sequence seq1;
my_sequence seq2;
// 각 시퀀서에 대한 시퀀스 실행
seq1 = my_sequence::type_id::create("seq1");
seq2 = my_sequence::type_id::create("seq2");
// 시퀀서1에 시퀀스 실행
seqr1.start(seq1);
// 시퀀서2에 시퀀스 실행
seqr2.start(seq2);
endtask
endclass
가상 시퀀스를 환경에 설정하기
환경에서 가상 시퀀스를 설정하고 실행하기 위해선, 가상 시퀀서와 시퀀서를 연결해야 합니다.
class my_env extends uvm_env;
my_sequencer seqr1;
my_sequencer seqr2;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
seqr1 = my_sequencer::type_id::create("seqr1", this);
seqr2 = my_sequencer::type_id::create("seqr2", this);
endfunction
endclass
class my_test extends uvm_test;
`uvm_component_utils(my_test)
function new(string name = "my_test");
super.new(name);
endfunction
virtual task run_phase(uvm_phase phase);
my_virtual_sequence vseq;
my_env env;
// 환경 및 가상 시퀀스 설정
env = my_env::type_id::create("env", this);
vseq = my_virtual_sequence::type_id::create("vseq");
// 가상 시퀀스에 시퀀서를 전달
vseq.seqr1 = env.seqr1;
vseq.seqr2 = env.seqr2;
// 가상 시퀀스 실행
vseq.start(null);
endtask
endclass
4.9 Scoreboard 연결
Scoreboard는 DUT의 출력과 예상된 결과를 비교하여 검증의 정확성을 확인하는 컴포넌트입니다. Scoreboard는 monitor와 연결되어 트랜잭션을 수집하고 비교합니다.
Scoreboard 연결 예제 코드
class my_scoreboard extends uvm_scoreboard;
`uvm_component_utils(my_scoreboard)
uvm_analysis_port_imp#(my_transaction) item_collected_export;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
virtual function void write(my_transaction t);
`uvm_info("SCOREBOARD", $sformatf("Comparing transaction: %0h", t), UVM_LOW)
// 트랜잭션 비교 로직
endfunction
endclass
class my_env extends uvm_env;
my_monitor monitor;
my_scoreboard scoreboard;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
monitor = my_monitor::type_id::create("monitor", this);
scoreboard = my_scoreboard::type_id::create("scoreboard", this);
// 모니터와 스코어보드 연결
monitor.item_collected_port.connect(scoreboard.item_collected_export);
endfunction
endclass
이 예시에서 monitor가 수집한 트랜잭션을 scoreboard로 전달하고, scoreboard는 이를 검증하여 예상 결과와 비교합니다.
4.10 모니터에서 Scoreboard로 데이터 전달
모니터는 DUT의 출력을 감시하고, 트랜잭션을 수집하여 scoreboard에 전달합니다.
class my_monitor extends uvm_monitor;
uvm_analysis_port#(my_transaction) item_collected_port;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
item_collected_port = new("item_collected_port", this);
endfunction
task run_phase(uvm_phase phase);
my_transaction t;
forever begin
// DUT의 신호 수집 및 트랜잭션 생성
item_collected_port.write(t); // 스코어보드로 트랜잭션 전달
end
endtask
endclass
4.11 마무리
이 장에서는 가상 시퀀스 작성 및 환경에서의 설정 방법, 그리고 scoreboard와 monitor 간의 연결을 다루었습니다. 가상 시퀀스는 복잡한 시나리오에서 여러 시퀀서를 조정하는 데 필수적이며, scoreboard는 결과를 비교하여 설계 검증을 수행하는 중요한 역할을 합니다.
반응형
'지식 공유 > UVM' 카테고리의 다른 글
[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 |
[UVM 1.1d] 4-1. Reusable UVM Component (0) | 2024.09.29 |
[UVM 1.1d] UVM Sequence Macro (uvm_do/uvm_do_with) (0) | 2024.09.29 |
[UVM 1.1d] 3-2. UVM Components (1) | 2024.09.26 |
댓글