지노랩 /JinoLab
[UVM] 3.10.3 Sequencer에서 Sequence 실행하기 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.10.3 Sequencer에서 Sequence 실행하기
지노랩/JinoLab 2025. 3. 19. 13:051. 개요
- Sequencer는 기본적으로 어떠한 시퀀스도 실행하지 않음.
- start() 메서드를 호출하여 시퀀스를 실행해야 함.
- 사용자가 직접 start()를 호출하거나, uvm_config_db를 이용하여 특정 phase에서 자동으로 실행되도록 설정할 수 있음.
2. Sequencer에서 Sequence 실행하기
(1) 직접 start() 호출
- 사용자가 원하는 시점에 특정 시퀀스를 실행할 때 사용.
예제: 직접 start() 호출하여 Sequence 실행
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_env env; // 환경 인스턴스 생성
function new(string name = "my_test", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this); // 환경 인스턴스 생성
endfunction
task run_phase(uvm_phase phase);
simple_seq_do seq; // 실행할 시퀀스 객체
phase.raise_objection(this); // 시뮬레이션 종료 방지
seq = simple_seq_do::type_id::create("seq"); // 시퀀스 생성
seq.start(env.agent.sequencer); // 시퀀서에서 시퀀스 실행
phase.drop_objection(this); // 시뮬레이션 종료 허용
endtask
endclass
설명
- Sequencer에서 start() 메서드를 호출하여 simple_seq_do 실행.
- phase.raise_objection(this); → 테스트가 끝나지 않도록 objection을 올림.
- phase.drop_objection(this); → 실행이 끝난 후 objection을 내림.
3. 특정 Phase에서 자동 실행
(1) uvm_config_db를 이용한 자동 실행
- 특정 phase에서 시퀀스가 자동으로 실행되도록 설정할 수 있음.
예제: 특정 phase에서 자동 실행 설정
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_env env;
function new(string name = "my_test", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this);
// 특정 phase에서 simple_seq_do 실행
uvm_config_db#(uvm_object_wrapper)::set(this, "env.agent.sequencer.main_phase",
"default_sequence", simple_seq_do::type_id::get());
endfunction
endclass
설명
- uvm_config_db#(uvm_object_wrapper)::set(...)을 이용해 특정 phase에서 실행할 시퀀스를 설정.
- "default_sequence" 값을 simple_seq_do::type_id::get()으로 설정하면 main_phase에서 자동 실행됨.
4. start() vs. uvm_config_db 설정
방법 실행 시점 코드 적용 방식 유연성
| start() 직접 호출 | 사용자가 원하는 시점 | run_phase에서 seq.start() 실행 | 시퀀스를 필요할 때 실행 가능 |
| uvm_config_db 설정 | 특정 phase에서 자동 실행 | uvm_config_db::set() 사용 | 환경 설정만으로 실행 가능 |
3.10.3.1 수동 실행 (Manual Starting)
1. 개요
- 사용자는 직접 시퀀스 인스턴스를 생성하고, 랜덤화한 후 start()를 호출하여 실행할 수 있음.
- 이 방식은 특정 조건에서 시퀀스를 실행하거나, 시퀀스 실행 시점을 제어할 때 유용함.
- 테스트 환경에서 특정한 트리거(trigger) 이벤트가 발생할 때만 실행되도록 설정 가능.
2. 수동으로 시퀀스 실행하는 방법
(1) start()를 이용한 기본적인 실행
- 시퀀스를 명시적으로 생성하고 실행하는 가장 기본적인 방법.
예제: start()를 사용하여 수동으로 시퀀스 실행
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_env env;
function new(string name = "my_test", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this); // 환경 생성
endfunction
task run_phase(uvm_phase phase);
simple_seq_do seq; // 실행할 시퀀스 객체
phase.raise_objection(this); // 테스트 종료 방지
seq = simple_seq_do::type_id::create("seq"); // 시퀀스 인스턴스 생성
seq.randomize(); // 랜덤화 수행
seq.start(env.agent.sequencer); // 시퀀서를 통해 실행
phase.drop_objection(this); // 실행 종료 후 objection 해제
endtask
endclass
설명
- seq = simple_seq_do::type_id::create("seq"); → 시퀀스 객체를 생성.
- seq.randomize(); → 시퀀스 랜덤화 수행.
- seq.start(env.agent.sequencer); → 시퀀서에서 실행.
- 테스트가 끝나지 않도록 phase.raise_objection(this);을 사용하고, 실행 완료 후 phase.drop_objection(this);을 호출하여 종료.
3. 조건부 실행
(1) 특정 이벤트 발생 시 실행
- 특정한 신호가 변경될 때만 시퀀스를 실행하도록 설정할 수도 있음.
예제: 특정 이벤트가 발생할 때 시퀀스 실행
task run_phase(uvm_phase phase);
simple_seq_do seq;
phase.raise_objection(this);
seq = simple_seq_do::type_id::create("seq");
seq.randomize();
// 특정 조건이 만족될 때 실행
wait (env.dut_if.busy == 0);
seq.start(env.agent.sequencer);
phase.drop_objection(this);
endtask
설명
- wait (env.dut_if.busy == 0); → DUT의 busy 신호가 0이 될 때까지 기다린 후 실행.
- 이 방식은 DUT의 특정 상태에 따라 시퀀스를 실행해야 할 경우 유용함.
4. start() 사용 시 유의할 점
고려 사항 설명
| 시퀀서가 필요함 | start() 메서드는 반드시 sequencer에서 실행되어야 함 |
| 랜덤화 여부 | randomize();를 호출하여 데이터 값을 생성할 수 있음 |
| 타이밍 제어 가능 | 특정 이벤트 발생 시 실행 가능 |
| 다중 실행 가능 | 하나의 테스트에서 여러 개의 시퀀스를 연속 실행 가능 |
3.10.3.2 자동화된 단계 기반 시퀀스 실행 (Automated Phase-Based Starting)
1. 개요
- UVM에서는 특정 실행 단계(phase)에서 자동으로 시퀀스를 시작할 수 있음.
- 각 런타임 실행 단계(run-time phase)가 시작될 때, 시퀀서(sequencer)는 해당 단계에 맞는 설정된 시퀀스가 있는지 확인하고 자동으로 실행.
- 이 방식은 수동으로 start()를 호출하지 않고도 특정 단계에서 시퀀스를 실행할 수 있도록 함.
- 주로 테스트(test) 코드에서 설정됨.
2. 자동화된 시퀀스 실행 설정 방법
(1) uvm_config_db를 이용한 설정
- 특정 시퀀서를 지정하여, 실행 단계에서 특정 시퀀스를 자동으로 실행하도록 설정 가능.
- uvm_config_db#(uvm_object_wrapper)::set()을 사용하여 설정.
예제: 특정 실행 단계에서 자동으로 시퀀스 실행
uvm_config_db#(uvm_object_wrapper)::set(this,
".ubus_example_tb0.ubus0.masters[0].sequencer.main_phase",
"default_sequence",
loop_read_modify_write_seq::type_id::get());
설명
- "default_sequence" 설정을 통해 main_phase에서 자동으로 실행될 시퀀스를 지정.
- loop_read_modify_write_seq::type_id::get() → 실행할 시퀀스 유형을 지정.
(2) 특정 시퀀스 인스턴스를 생성하여 실행
- uvm_config_db에 특정 시퀀스 인스턴스를 저장하면, 해당 시퀀스가 실행될 때 자동으로 사용됨.
- 이 방식의 장점은 시퀀스를 실행 전에 랜덤화(randomization)하거나 특정 값을 설정할 수 있다는 점.
예제: 특정 시퀀스 인스턴스를 만들어 실행 단계에서 실행
// 특정 시퀀스 인스턴스를 생성
lrmw_seq = loop_read_modify_write_seq::type_id::create("lrmw", get_full_name());
// 필요하면 시퀀스 파라미터 설정
lrmw_seq.randomize();
// 생성된 시퀀스 인스턴스를 실행 단계에서 실행하도록 설정
uvm_config_db#(uvm_sequence_base)::set(this,
".ubus_example_tb0.ubus0.masters[0].sequencer.main_phase",
"default_sequence", lrmw_seq);
설명
- loop_read_modify_write_seq::type_id::create("lrmw", get_full_name());
- 특정 시퀀스 인스턴스를 생성.
- lrmw_seq.randomize();
- 시퀀스 인스턴스를 실행 전에 랜덤화.
- uvm_config_db#(uvm_sequence_base)::set()
- 생성된 시퀀스 인스턴스를 main_phase에서 자동 실행하도록 설정.
3. uvm_config_db를 이용한 자동 실행 방식과 수동 실행 방식 비교
방식 설명 사용 예
| 수동 실행 (start()) | start()를 명시적으로 호출하여 시퀀스를 실행 | 특정 이벤트가 발생할 때만 실행하고 싶을 때 |
| 자동 실행 (uvm_config_db) | 특정 실행 단계에서 자동으로 시퀀스를 실행 | 테스트 단계에서 시퀀스를 자동 실행하고 싶을 때 |
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.11 테스트 종료 관리 (Managing End of Test) (0) | 2025.03.20 |
|---|---|
| [UVM] 3.10.4 시퀀스 아이템 및 시퀀스 오버라이딩 (Overriding Sequence Items and Sequences) (0) | 2025.03.20 |
| [UVM] 3.10.2 서브시퀀스 및 시퀀스 아이템 전송 (Sending Subsequences and Sequence Items) (0) | 2025.03.19 |
| [UVM] 3.10.1 사용자 정의 시퀀스 선언 (Declaring User-Defined Sequences) (0) | 2025.03.18 |
| [UVM] 3.10 시나리오 생성 활성화 (Enabling Scenario Creation) (0) | 2025.03.18 |