Virtual sequence 和test 启动的关系

来源:互联网 发布:生物数据分析软件 编辑:程序博客网 时间:2024/06/15 19:59

这是一个UVM的基本结构问题。

sequecne的启动

先理解一个sequence 的启动机制吧。白书第二章有讲解。
对于一个sequence,在环境中的任意一处实际调用sequence.start就可以启动啦。
但是一般会在前后加上raise/drop_objection().

objection机制

这就是,objection机制了,在程序进入到某一个phase时,UVM会收集这个phase 所有的objection,并且实时监测是否objection被drop,一旦所有objection都被drop,则当前phase会关闭。
这一机制的用途是,当你在环境中某一个phase添加一些耗费时间的代码时,一定要rasie/drop_objsection.,不然这些耗时操作会被略去。
所以,一般只有会在sequence中用raise与drop,因为一般只有他们会有些耗时操作。
偶尔在driver或者monitor中要用的话就也要注意啦。

default 方式启动

除了手动使用start方式启动sequence外,更加常见的是default sequence方式启动,default方式也有两种,可见P165(区别在于creat sequence的地方不同罢了)

uvm_config_db#(uvm_object_warapper)::set(this,                                        "env.i_agent.sqr.mian_pahse",                                        "default_sequence",                                        case0_sequence::type_id::get()                                            )

run_test()

如果我们在环境中某处(不是test中)用start调用这一sequence,那么这个sequnce在每次仿真中都会执行,显然,这不是我们想要的结果。
通过test开启case的常见方式为,通过命令UVM_TESTNAME=my_case1这种方式传递参数,最后调用相应的case。
我们采用的方式多是,在case中定义sequence的启动(default_sequecne,在哪个sequencer中,在哪个phase)从而实现一种动态调用sequence。这样的话我们我们每次想调用哪个sequence或者那就个sequence的组合形式(应该是可以的,但是,必须啊哟保证不同的sequence是由相同的sequencer发送的),就可以直接通过不同额UVM_TESTNAME参数动态实现啦

virtual sequence

为了实现多了不同的驱动agent之间,发送的sequence之间的先后顺序关系,我们采用了virtual sequence 来管理不同sequence之间的关系,
virtual sequence通过uvm_do的宏(或者start)来启动sequence
而virtual sequence人就只是个容器了,存放给你sequencer的句柄的申明啦。

virtual 中的raise/drop_object 用法

uvm_do宏不提供starting_phase的传递功能
???starting_phase 实在那个阶段呢??

原创粉丝点击