题记:验证小白,边学边记,没有逻辑,没有层次。
factory机制(工厂机制)
-
工厂的意义:工厂可以方便地替换验证环境中的实例或者注册了的类型。
-
工厂的实现:factory机制的实现被集成在
uvm_component(object)_utils
宏中,对一个类使用uvm_component(object)_utils
就像使用一张注册表,将这个类注册到表中。在uvm环境中,注册环境组件类(如uvm_driver),使用uvm_component_utils
宏;注册环境配置类(如uvm_sequence),使用uvm_object_utils
宏。 -
工厂的便利
3.1 创建(create):使用factory可省略类的实例化过程,将类注册到factory后,根据类名便可创建类的实例。
3.1.1 component类型的创建:comp_type::type_id::create(string name,uvm_component parent)
;
第一个参数name被创建的类的实例名称,第二个参数parent是该类在环境层次中的父类名称,通过parent参数可以让环境层次一层层串连起来,形成tree结构。
3.1.2 object类型的创建:object_type::type_id::create(string name)
;
object的创建只需要一个参数name,表示被创建的类的实例名称,一般不传递parent参数,因为一般object类不用在uvm环境层次中,只作为configuration或transaction等用来做配置的结构体或者抽象数据传输的数据结构体,成为uvm_component的成员变量。
3.2 覆盖(override):将原来所属的类型替换为另外一个新的类型。一个原有类型被新的类型覆盖之后,原本用来创建原属类型的请求,将由工厂来创建新的类型替换。
3.2.1 覆盖的优势
1)、无需修改原始代码,可以保证原有代码的封装性。
2)、允许灵活配置,如可以使用子类覆盖原有的父类。
3.2.2 覆盖的流程
1)、确定原有类型已在工厂注册,并把新的类型也在工厂中注册。
2)、使用“类型覆盖”或“实例覆盖”进行覆盖操作。
2)、使用create创建对象时,工厂首先检查原有类型是否被覆盖,如果被覆盖,则创建的是新的类型的对象,如果没有覆盖,则创建的是原有类型的对象。
3.2.3 覆盖的常用方法
1)、orig_type::type_id::set_type_override(new_type::get_type())
参数new_type::get_type()
是新的类在工厂注册时的句柄。这个方法中还有第二个参数replace,一般为default值1,表示如果已经有覆盖存在,新的覆盖会取代原有覆盖。
2)、orig_type::type_id::set_type_override(new_type::get_type(),“orig_inst_path”)
第二个参数orig_inst_path
是组件结构路径字符串,该类还有第三个参数parent,一般default,表示第二个参数内容为绝对路径。
3.3 域的自动化(field automation):在使用uvm_component(object)_utils
注册uvm类的时候,将类的成员变量一并使用uvm_field_*
宏进行声明,并包裹在uvm_component(object)_utils_begin
和uvm_component(object)_utils_end
块中,使得在操作这些成员变量时可以使用一些预定义的成员方法,如copy、compare、print、record、pack等。
3.3.1 域的自动化宏操作
uvm_field_{inst,object,string,enum,event,real}(ARG,FLAG)
,ARG表示成员变量,FLAG表示用来标记的数据操作,一般使用UVM_ALL_ON表示对当前变量打来所有操作方法。