知识点回顾:
工厂的意义:uvm工厂的存在就是为了更方便的替换验证环境中的实例或者已经注册的类型,同时工厂的注册机制带来了配置的灵活性。
创建:创建的方法可以通过new()函数进行,也可以通过create的方法
覆盖机制:可以通过类型名trans进行覆盖,factory提供了覆盖的特性,可以通过类型覆盖和实例名覆盖这两种方式。
1、工厂的注册、创建和覆盖机制
uvm的世界中只有两种注册方式,uvm_object_utils(T)和uvm_component_utils(T),所有的类都是来自于这两种。
运行UVM测试object_creat和component_creat代码,观察打印信息,检查t2/t3/t4和u2/u3/u4是否被创建。根据提示给了四中创建方法,第一种是直接创建,第二种是普遍使用的方法,第三种是利用工厂机制方法创建,第四个是使用预先定义的方法进行创建。
class object_create extends top;
trans t1, t2, t3, t4;
`uvm_component_utils(object_create)
function new(string name = "object_create", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
uvm_factory f = uvm_factory::get(); // get singleton factory
super.build_phase(phase);
t1 = new("t1"); // direct construction
t2 = trans::type_id::create("t2", this); // common method
void'($cast(t3,f.create_object_by_type(trans::get_type(), get_full_name(), "t3"))); // factory method
void'($cast(t4,create_object("trans", "t4"))); // pre-defined method inside component
endfunction
endclass
下面是参考别人的代码,区别是有没有`void和动态转换$cast,`void加不加的区别是会不会打印函数的返回值,$cast会进行类经检查,如果转换失败的话,会进行错误。$cast通常是向下类型转换,所以用的更多的是不同层次之间的转换,但是在父类和子类的转换之间,父类向子类转换称之为向下类型转换,子类向父类转换称之为向上类型转换,向上类型转换是安全的。这里没有涉及到父类到子类的转换,所以$cast可有可无。
f.create_object_by_type(trans::get_type, get_full_name,"t3");//factory method
create_object("trans","t4");// pre-defined method inside component
添加仿真命令、运行:
vsim -novopt -classdebug +UVM_TESTNAME=object_create work.factory_mechanism

t1被创建,剩下的三个是type [trans] ,这是因为uvm版本为1.2导致的,最新的版本会避免这个问题。
class component_create extends top;
unit u1, u2, u3, u4;
`uvm_component_utils(component_create)
function new(string name = "component_create", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
uvm_factory f = uvm_factory::get(); // get singleton factory
super.build_phase(phase);
u1 = new("u1"); // direct construction
u2 = unit::type_id::create("u2", this); // common method
void'($cast(u3,f.create_component_by_type(unit::get_type(), get_full_name(), "u3", this))); // factory method
void'($cast(u4,create_component("unit", "u4"))); // pre-defined method inside component
endfunction
endclass
vsim -novopt -classdebug +UVM_TESTNAME=component_create work.factory_mechanism

运行UVM测试对象object_override 和component_override 观察打印信息,检查t2/t3/t4和u2/u3/u4的类型是否被替换,再考虑为什么t1和u1没有被类型覆盖呢?
重复以上步骤,object_override 和component_override代码和运行结果如下:
class object_override extends object_create;
`uvm_component_utils(object_override)
function new(string name = "object_override", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
set_type_override_by_type(trans::get_type(), bad_trans::get_type());
super.build_phase(phase);
endfunction
endclass
vsim -novopt +UVM_TESTNAME=object_override work.factory_mechanism

class component_override extends component_create;
`uvm_component_utils(component_override)
function new(string name = "component_override",

最低0.47元/天 解锁文章
1019

被折叠的 条评论
为什么被折叠?



