一、工厂的优点
因为在大多数时候验证工程师很多环境,这些环境很多在大体上是相似的,但又有一些方面有不同,因此就需要使用共通部分,而定制不同环境的独特部分,而UVM的factory机制提供了一个方法,可以更为方便在不改变环境结构层次的前提下的定制个环境的独特部分,即替换验证环境中已注册的类或者实例,这也就要求我们定义的类都要经过工厂来产生,在工厂注册。
二、使用工厂模式的步骤
1、注册
UVM提供了多个工厂机制的注册宏,下面给出一种我常用的注册宏。
`uvm_{component,object}_utils(class_type_name),
在工厂注册的类一般分为两大类型,即 uvm_componet 和 uvm_object。
例1 uvm_object类型:
class obj extends uvm_object;
`uvm_object_utlis(obj)
function new(string name='obj');
super.new(name);
$display($sfortmatf("%s is ceated",name));
endfunction:new
例2 uvm_componet类型:
class comp extends uvm_componet;
`uvm_componet_utlis(obj)
function new(string name='comp',uvm_componet parent=null);
super.new(name,parent);
$display($sfortmatf("%s is ceated",name));
endfunction:new
注:以上两个代码的注册宏和new()函数是范式,结构和参数都不可更改。
2、实例化对象
1)创建uvm_object类
com_type::type_id::creat(string name)
2)创建uvm_componet
com_type::type_id::creat(string name,uvm_componet parent)
注:
1、string_name为实例的类名,uvm_parent 为父类
2、如果直接使用new()来创建对象没有使用工厂来创建对象,使得不能用工厂带来的优势,UVM要求用工厂方式