-
FIFO的类型有两种,一种是上节介绍的uvm_tlm_analysis_fifo,另外一种是uvm_tlm_fifo。这两者的唯一差别在于前者有一个analysis_export端口,并且有一个write函数,而后者没有。(P308)
-
uvm_component及其派生类变量的实例化,只能在build_phase完成,假如在其他phase实例化一个uvm_component,那么系统会报错。如果是uvm_object的实例化,则可以在任何phase完成,当然也包括build_phase了。(P322)
-
UVM phase的执行顺序:1)对于整个环境而言,会先执行完所有组件的build_pahse,再依次执行各组件的connect_phase,run_phase... 2)对于各平行的组件,如i_agent和scoreboard,先执行谁的build_phase,执行顺序是按照字典序的,这里的字典序的排序依据new时指定的名字,如i_agent在new时指定的名字为aaa,而scoreboard的名字为bbb,那么将会先执行i_agent的build_phase,3)对于像driver和scoreboard这种非平行组件,若是i_agent的build_phase先执行,则会继续执行其子组件driver,monitor等的build_phase,然后在执行scoreboard的build_phase,反之,则会先执行scoreboard,再执行driver。(P331)
-
task main_phase(uvm_phase phase),参数phase的作用是什么?因为要便于在任何component的main_phase中都能raise_objection,而要raise_objection则必须通过phase.raise_objection来完成,所以必须将phase作为参数传递到main_phase等任务中。(P360)
-
uvm_do系列宏是产生transaction的地方,具体做的工作如下代码:(P421)
tr = new("tr");
start_item(tr);
assert(tr.randomize() with {tr.pload.size() == 200;});
finish_item(tr);
6. uvm_do系列宏中,其第一个参数除了可以是transaction的指针外,还可以是某个sequence的指针。当第一个参数是transaction时,它调用此sequence的start任务。注意sequence可以嵌套sequence,sequence可以重用,这个功能非常强大。(P428)
7. 多sequence的同步控制:1)如果是简单的2个或者3个sequence的同步控制,可以通过使用全局的事件event完成;2)对于复杂sequence的同步,最好的方式就是使用virtual sequence。从字面上理解,即虚拟的sequence。虚拟的意思就是它根本就不发送transaction,它只是控制其他的sequence,起统一调度的作用。为了使用virtual sequence,一般需要一个virtual sequencer。virtual sequencer里面包含指向其他真实sequencer的指针。
8. 定义的component、object为什么要注册?
注册是把一个直接或者间接派生自 uvm_component/object的类注册到 factory中,只有注册到factory中,才能使用factory机制。
9. factory机制的重载(set_type/inst_override_by_type)是有前提的,并不是任意的类都可以互相重载,必须满足以下几个条件:(P614)
-
注册:无论是重载的类还是被重载的,都要在定义时注册到factory机制中。
-
工厂机制实例化:被重载的类在实例化时,要使用factory机制式的实例化方式,而不能使用传统的new方式
-
重载的类要与被重载的类有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。
-
component与object之间互相不能重载。
10. uvm_root的print_topology函数,可以显示出整棵UVM树的拓扑结构,由于UVM树在build_phase执行完成后才完全建立完成,因此,这个函数应该在build_phase之后调用,可以把其放在所有测试用例的基类base_test中。
uvm_top.print_topology();
11. starting_phase是什么?作用是什么?
starting_phase是sequence中的一个变量,uvm_phase类型。sequencer自动将phase传给req变量的startiing_phase。(req指向sequencer发送的sequence), starting_phase用来在sequence中控制验证平台的关闭,只有将此要运行的sequence作为sequencer的某动态运行phase的default_sequence时,其starting_phase才不为null。
if ( starting_phase != null )
starting_phase.raise_objection(this)