sequence的启动

参考:sequence启动的三种方式 - 猪肉白菜_125 - 博客园

sequence的启动

seq的start通过传递sqr句柄实现启动;

image

 但是这种方式将接口暴露在外,不被提倡。

启动以后,seq会调用uvm_do之类的宏向其传递的句柄开始发送事件给sqr;

而driver将通过TLM取得sqr接收的数据,并驱动到端口上。

UVM1.1中sequence的启动

对于UVM1.1来说,启动sequence可以通过default_sequence完成;

在顶层模块设置

 uvm_config_db#(uvm_object_wrapper)::set(this,
    "i_agt.sqr.main_phase",
    "default_sequence",
    my_sequence::type_id::get());

之后,在uvm_sequence这个基类中,有一个变量名为starting_phase,

它的类型是uvm_phase,sequencer在启动default_sequence时,会:

 task my_sequencer::main_phase(uvm_phase phase);
     seq.starting_phase = phase;
     seq.start(this); 
 endtask

之后即可通过判断starting_phase的状态决定 

starting_phase.raise_objection(this);和starting_phase.drop_objection(this);

class my_sequence extends uvm_sequence #(my_transaction);   
    my_transaction m_trans;  
    virtual task body();
        if(starting_phase != null)
            starting_phase.raise_objection(this);
        repeat (10) begin
            `uvm_do(m_trans)
        end
        #1000;
        if(starting_phase != null)
            starting_phase.drop_objection(this);
    endtask
    `uvm_object_utils(my_sequence)
endclass

uvm从1.1d到1.2再到IEEE1800.2,有了很多变化。尤其是从1.1d到1.2,在objection的使用上有了一些关键性变化。

在uvm进入到1.2后,starting_phase不在推荐使用。

更为重要的是,不仅仅是不再推荐,而且如果以default sequence的方式启动以后,

default sequence被启动以后,starting_phase依然会是null,如果沿用以前的代码,整个平台就起不来了

解决方法一:

添加:

starting_phase = get_starting_phase();

class my_sequence extends uvm_sequence#(my_transaction);
  `uvm_object_utils(my_sequence)

  virtual task body();
    // ── 1. 取到真正的 phase 句柄
    starting_phase = get_starting_phase();

    // ── 2. 用它来管理 objection
    if (starting_phase != null)
      starting_phase.raise_objection(this);

    // ── 3. 你的事务逻辑
    repeat (10) begin
      `uvm_do(m_trans)
    end
    #1000;

    // ── 4. 最后 drop objection
    if (starting_phase != null)
      starting_phase.drop_objection(this);
  endtask
endclass

  

解决方法二:

uvm_sequence_base::set_automatic_phase_objection

function my_sequence::new(string name="unnamed");
  super.new(name);
  set_automatic_phase_objection(1);
endfunction : new

执行顺序

start() is executed
  --! Objection is raised !--
  pre_start() is executed
  pre_body() is optionally executed
  body() is executed
  post_body() is optionally executed
  post_start() is executed
  --! Objection is dropped !--
start() unblocks

image

 

使用方法:

顶层 testbench 中设置 default_sequence(必须):

uvm_config_db#(uvm_object_wrapper)::set(this,
                                        "env.agent.sequencer.main_phase",
                                        "default_sequence",
                                        my_sequence::type_id::get());

告诉 sequencer 在某个 phase 自动启动哪个 sequence(否则需要自行在某个phase里写入,比如下面这种):

task my_sequencer::main_phase(uvm_phase phase);
    my_sequence seq;
    phase.raise_objection(this);
    seq = my_sequence::type_id::create("seq");
    seq.start(this); 
    phase.drop_objection(this);
endtask

  

新想法:

在UVM中使用sequence.start()还是设置default_sequence?有什么区别 - 知乎

SystemVerilog|UVM|Sequence这份干货太干了 - 腾讯云开发者社区-腾讯云

default_sequence的缺点:

-设置default_sequence是在run_phase()之外完成的。此外,更改default_sequence需要在run_phase()之外进行更改。

—没有机制来控制default_sequence何时开始,除了在特定阶段的开始。

-不能运行多个序列

-不能轻易地在同一个sequencer上运行额外的序列

-调试default_sequence可能是困难的,因为用户可能不知道default_sequence的存在。

- default_sequence不能被random()或其他配置

  结论:Sequence启动可以用start()方法,也可以用uvm_do宏,还可以用default_sequence。但建议用start(),不建议用default_sequence。

virtual task start (
  uvm_sequencer_base sequencer,
  uvm_sequence_base parent_sequence = null,   int this_priority = -1,
  bit call_pre_post = 1 )
执行该序列,并在序列完成时返回。
sequencer参数指定运行此序列的sequencer。
若parent_sequence为空,且未通过set_parent_sequence(参见14.1.2.8节)分配父序列,则此序列为根序列;
否则,它是parent_sequence的子序列。
当parent_sequence非空时,在执行此序列期间会调用父序列的pre_do(参见14.2.3.4节)、mid_do(参见14.2.3.5节)和post_do(参见14.2.3.7节)方法。 默认情况下,序列的优先级与其父序列优先级相同。若为根序列(即get_parent_sequence(参见14.1.2.7节)返回空),其默认优先级为100。
可通过this_priority的非负值修改优先级,数值越大优先级越高。 若call_pre_post设置为1(默认值),
则在调用序列主体(参见14.2.3.6节)前后,
会分别调用pre_body(参见14.2.3.3节)和post_body(参见14.2.3.8节)任务。

  

 

posted @ 2025-07-28 23:16  NoNounknow  阅读(77)  评论(0)    收藏  举报