(body()函数被sequence的 start()函数调用,也可以理解成 start()函数的执行) sequence的挂载:uvm_sequence不属于component,没有phase概念,需要挂载在一个sequencer上,在这个sequencer的phase中被调用(default_sequence的情形),同时uvm_sequence可以操作所挂载的sequencer的成员变量( *比如在sequence中使用sequencer中的寄存器...
uvm_do更多的是用在一个父sequence对子sequence的启动上:父sequence的do函数会被执行,同时不需要执行子sequence的pre_body()和post_body()。 之所以建议用start(),是因为宏尽管便利,但会隐藏掉一些必要的信息,比如不了解uvm_do宏展开的工程师,他就不知道...
uvm_sequence_base parent_sequence =null,intthis_priority = -1,bitcall_pre_post =1); 第一个参数必须设置,其他的都有默认值,当parent_seq中的一个函数调用seq.start()时这个sequence将会进入body()方法中,执行的顺序如下: seq.pre_start(); seq.pre_body();// 如果参数call_pre_post==1parent_seq....
sequence.strat(sequencer,parent_sequence,优先级) ,第一个参数是需要挂载的sequencer;第二个是parent_sequence,一般传入this或者不传入;第三个是优先级;第四个call_pre_post默认为1,则自动执行pre_body/ post_body()函数 start 执行 pre_start,body等函数。此时就完成了sequence的启动过程。 所有sequence都要在seq...
sequence基础 1. 如果将激励放在driver的main_phase中,是可行的,但是如果要对激励作修改,那么扩展性较差,所以我们将激励改为放在sequence中去写。 driver就负责驱动激励就好了,而具体是什么样的激励,应该由sequence去完成。 2. 当定义完一个sequence后,可以使用start任务将其启动。
直接启动:my_seq.start(sequencer); uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", case0_sequence::type_id::get()); uvm_config_db#(uvm_sequence_base)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", cseq); ...
UVM中sequence的启动分为显示启动和隐式启动两种方式。 显式启动(直接启动)——调用start()方法启动。 隐式启动 ——使用uvm_config_db机制配置default_sequence启动。 //sequence的显式启动//该方法提起和落下objection,通过phase.raise_objection(this)/phase.drop_objection(this)my_sequence seq = my_se...
pre_do是一个任务,在start_item中被调用,是start_item返回前执行的最后一行代码,在它执行完成后才开始对transaction进行随机化。pre_do有一个1bit参数,用于表明uvm_do是对一个transaction还是一个sequence进行操作(详见下一节sequence的嵌套)。 mid_do是一个函数,在finish_item最开始被调用,在执行完此函数后才会进...
在start_phase_sequence(xxx)函数里会先使用uvm_config_db获取到default sequence,然后在最后会调用seq....
再来看uvm_do宏,展开之后最终还是调用的start函数。区别在于有两个参数设置,parent_sequence参数配置成了this,call_pre_post参数配置成了0。uvm_do更多的是用在一个父sequence对子sequence的启动上:父sequence的do函数会被执行,同时不需要执行子sequence的pre_body()和post_body()。