지노랩 /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:05

 

1. 개요

  • 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
를 바탕으로 작성된 글입니다.