一、在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_on或uvm_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 |
为什么需要这个方法?
-
前置配置需求:某些场景需要在启动前先配置好sequencer引用
-
virtual sequence场景:协调多个子sequence时需要显式指定不同sequencer
-
sequence重用:同一个sequence实例可能需要重定向到不同sequencer
注意事项
-
直接调用
set_sequencer后仍需调用start()才会实际执行 -
如果已经通过
start(sequencer)启动,则不需要显式调用 -
该方法会同时自动设置sequence的parent sequence关系
总结来说,set_sequencer是挂载机制的基础API,虽然不单独作为完整的挂载方案,但它是大多数挂载方法内部实现的关键步骤。在virtual sequence等复杂场景中,显式调用这个方法是非常必要的。
3136

被折叠的 条评论
为什么被折叠?



