马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
Everybody,now,let me start my journey of skill highlights!
sequence --->>sequencer--->>driver 之间的通讯。首先是(顶层)sequence的启动,分多种方式,第一种是手动启动,即调用start()函数,但是书写位置可以在某一component(如sequencer,agent,env,test)的main_phase中。第二种是使用default_sequence,只需要在某个component(如sequencer,agent,env,test)的build_phase中设置如下代码(以test为例):
uvm_config_db#(uvm_object_wrapper)::set(
this,
"env.kernel.main_phase",
"defualt_sequence",
vsequence::type_id::get());
第三种仍然使用defualt_sequence,只是要先例化sequence,然后再设置如下代码
uvm_config_db#(vsequence)::set(
this,
"env.kernel.main_phase",
"defualt_sequence",
vsequence_t::type_id::get());
其中vsequence_t是vsequence的一个对象。
对于底层sequence,则可以在vsequence的body任务中使用`uvm_do系列宏和start.()。
进入到main_phase后,sequence被sequencer启动后则会调用sequence的body任务中(实际上会依次pre_body,body,post_body),最底层的sequence中使用的`uvm_do或者start_item和finish_item会通过sequencer等待driver的seq_item_port.item_done()的回应,然后跳出`uvm_do或者start_item和finish_item。
在最底层sequence中产生transaction的方式有`uvm_do()系列宏和start_item()、finish_itme(),其中`uvm_do实质上是包含了
tr=new("tr");
start_item(tr);
assert(tr.randomize()with{tr.pload.size()==100;});
finish_item(tr);
当然,start_item()和finish_item()被调用前tr要先被例化。嵌套sequence主要侧重于在同一个sequencer上启动不同的sequence,而vsequence也是嵌套的一种,但更侧重于在不同的sequencer中启动不同的sequence,以及他们之间同步。在上层sequence和vsequence中可以使用`uvm_do()系列宏产生下层sequence或者手动调用start.()启动sequence,但不能使用start_item()和finish_item(),因为它们的参数只能为transaction。
vsequence天然具有同步不同底层sequence的作用,同时我们也只在vsequence中raise_objection和drop_objection,而且也只需要在test的buil_phase中设置vsequence为vsequencer的defualt_sequence即可,不需要再分别设置底层sequence为底层sequencer的defualt_sequence。
|