seq挂载到sequencer的方式以及set_sequencer的介绍

一、在UVM验证环境中,将sequence挂载到指定的sequencer上有以下几种主要方法:

1. 使用start()方法直接启动

这是最直接的方法,在test或component中直接调用sequence的start()方法并指定目标sequencer。

my_sequence seq = my_sequence::type_id::create("seq");
seq.start(p_sequencer); // p_sequencer是目标sequencer的引用

2. 使用default_sequence配置

通过UVM配置机制在build_phase中设置default_sequence:

// 在test的build_phase中
uvm_config_db#(uvm_object_wrapper)::set(
  this, 
  "env.agent.sequencer.main_phase", 
  "default_sequence", 
  my_sequence::get_type()
);

3. 使用uvm_sequence::start_item()/finish_item()

start_item()与start()之间的区别是:start_item()是针对transaction,start()是针对sequence

virtual task body();
  my_transaction tr;                         //步骤1 声明句柄
  tr = my_transaction::type_id::create("tr");//步骤2 创建对象
  start_item(tr, p_sequencer);               //步骤3 指定目标sequencer
  // 随机化或设置tr                           //步骤4 随机化
  finish_item(tr);
endtask

4. 使用uvm_do/uvm_send宏

在sequence中使用uvm_do_onuvm_do_on_with宏:

virtual task body();
  my_transaction tr;
  `uvm_do_on(tr, p_sequencer) // 指定目标sequencer
endtask
virtual task body();
  my_transaction tr;
  tr = my_transaction::type_id::create("tr");//该行也可以使用`uvm_create(tr)代替
  // 配置tr
  `uvm_send_on(tr, p_sequencer) // 指定目标sequencer
endtask

//*****关于宏的更多使用可以参考其他博文*****//

二、set_sequencer算是一种启动方式吗?

答:set_sequencer 是另一种将Sequence与Sequencer关联的重要方式,但它与前面介绍的方法有显著区别,通常作为前置步骤而非直接启动方式。

典型使用场景如下:

1. 手动设置Sequencer(较少用)

my_sequence seq = my_sequence::type_id::create("seq");
seq.set_sequencer(target_sequencer);  // 先设置sequencer
seq.start(null);                     // 然后可以不带参数启动

2. Virtual Sequence的标准用法

virtual task body();
  sub_seq = sub_sequence::type_id::create("sub_seq");
  sub_seq.set_sequencer(p_target_sequencer); // 显式设置
  sub_seq.start(null);
endtask

与其他方法的对比

方法特点
start(sequencer)直接启动并自动调用set_sequencer
set_sequencer只设置关联关系不启动,需后续显式调用start()
default_sequence通过配置机制自动完成sequencer分配
uvm_do_on宏展开后内部会调用set_sequencer

为什么需要这个方法?

  1. 前置配置需求:某些场景需要在启动前先配置好sequencer引用

  2. virtual sequence场景:协调多个子sequence时需要显式指定不同sequencer

  3. sequence重用:同一个sequence实例可能需要重定向到不同sequencer

注意事项

  1. 直接调用set_sequencer后仍需调用start()才会实际执行

  2. 如果已经通过start(sequencer)启动,则不需要显式调用

  3. 该方法会同时自动设置sequence的parent sequence关系

总结来说,set_sequencer是挂载机制的基础API,虽然不单独作为完整的挂载方案,但它是大多数挂载方法内部实现的关键步骤。在virtual sequence等复杂场景中,显式调用这个方法是非常必要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值