类库地图(将可复用的部分标准化的保存在类库中,方便调用)
工厂机制:
注册、创建、覆盖(三要素)
主要用途:方便替代;
步骤:
一:(定义、注册、构建)//创建一个对象
1.在class中“定义”(对象名)
2.进行宏注册(分为component & object)(加入工厂机制/分类)
3.构建函数(一般包含继承)可多个(对象功能设定)
二:例化+工厂创建
1.定义句柄
2.对句柄进行工厂创建
class comp1 extends uvm_component;//1.定义
`uvm_component_utils(comp1)//2.注册
function new (string name = "comp1", uvm_component parent = null);//3.构建函数
super.new(name,parent);
endfunction:new
endclass
class obj1 extends uvm_object;//1.定义
`uvm_object_utils(obj1)//2.注册
function new(string name = "obj1");//3.构建函数
endfunction:new
endclass
//创建对象
comp1 c1,c2;
obj1 o1,o2;
initial begin
c1 = new("c1");
o1 = new("o1");
//建议使用下面方法创建对象
c2 = comp1::type_id::create("c2",null);
o2 = obj1::type_id::create("o2");
end
覆盖:
便利:无需修改原始代码、保持其封装性。
注意:
1.将类注册至工厂中,并将该类导入(import);
2.使用工厂创建对象;
3.新定义的类型必须继承于原类型(子类覆盖父类/需兼容),方法为虚方法;
4.覆盖要发生在创建之前;
module factory_override;
import uvm_pkg::*;
`include "uvm_macros.svh"
class comp1 extends uvm_component;
`uvm_component_utils(comp1)
function new(string name="comp1",uvm_component parent=null);
super.new(name,parent);
$display($sformatf("comp1::%s is created",name));
endfunction:new
virtual function void hello(string name);
$display($sformatf("comp1::%s said hello!",name));
endfunction
endclass
class comp2 extends comp1;
`uvm_component_utils(comp2)
function new(string name="comp2",uvm_component parent=null);
super.new(name,parent);
$display($sformatf("comp2::%s is created",name));
endfunction:new
function void hello(string name);
$display($sformatf("comp2::%s said hello!",name));
endfunction
endclass
comp1 c1,c2;
initial begin
comp1::type_id::set_type_override(comp2::get_type());
c1=new("c1");
c2=comp1::type_id::create("c2",null);
c1.hello("c1");
c2.hello("c2");
end
endmodule