sequence首先是从driver中剥夺了产生激励的功能,目的是增强可扩展性,添加新的需求代码时就不需要重新编写main_phase了。
解决办法就是:引入了sequence 机制,在解决的过程中还使用了factory机制、config机制。使用sequence机制之后,在不同的测试用例中,将不同的sequence设置 成sequencer的main_phase的default_sequence。当sequencer执行到main_phase时,发现有default_sequence,那么它就启动sequence 。
sequence的启动与执行
直接启动:start();
default_sequence启动:两种方法调用start任务

sequence宏
start()
使用场景:将sequence挂载到sequencer上的应用。
uvm_sequence::start(uvm_sequencer_base sequencer,
uvm_sequence_base parent_sequence=null
ini this_priority=-1,bit call_pre_post=1)
这个方法中,应该首先指明sequencer的句柄,如果这个sequence是顶部的sequence(没有上层嵌套他),那么可以省略对第二个parent_sequence的指定。
第三个参数的系统默认值是-1,会使得这个sequence会继承parent_sequence的优先值级,如果是顶部的sequence,会自动设置为100,也可以自己设置优先级数值。
第四个参数值一般使用默认值,这样uvm_sequence::pre_body()和uvm_sequence::post_body会在uvm_sequence::body()前后执行。
start_item()和finish_item()
使用场景:将item挂载到sequencer上的应用
uvm_sequence::start_item(uvm_sequencer_item item, ini this_priority=-1,
uvm_sequence_base sequence=null);
uvm_sequence::finish_item(uvm_sequencer_item item, ini this_priority=-1);
uvm_sequence::start_item中第三个参数需要用户注意是否将item和parent sequence挂载到不同的sequencer上面去。
使用item挂载到sequencer上的方法,需要创建item,还需要完成item的随机化,创建的方法;uvm_object::create()或者uvm_sequence::creat_item()
一个完整的item传送到driver有以下步骤:
1:创建item
2:通过start_item()方法获取的sequencer的授权许可,然后执行parent sequencer的方法pre_do();
3:对item进行随机化处理
4:通过finish_item()方法对随机化后的item进行mid_do()(也是parent sequence的方法 ),调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来完成item的发送以及sequence和driver的握手,最后在执行post_do()。
需要注意的是sequence和item的自身优先级,可以决定什么时候可以获得sequencer的授权。parent sequence的虚方法pre_do()、mid_do()、post_do()都是发生在发送item的过程中间。
以上两种方法的区别:
首先是挂载对象的不同,然后start()过程中,默认情况下或执行sequence的pre_body()和post_body(call_pre_post=0决定),但是并不是一定会执行。
start()方法执行顺序图:

start_item()/finish_item执行顺序图:

发送序列相关宏


本文探讨了UVM中的sequence机制、工厂和配置机制,重点讲解了sequence的启动与执行、item挂载、sequencer仲裁、锁定和有效性,以及virtualsequence的使用、嵌套和同步。通过实例展示了如何在实际验证环境中连接sequencer和virtualsequencer,以及如何利用这些技术进行sequence的高效管理与协调。


最低0.47元/天 解锁文章
179

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



