目录
二、UVM工厂机制
1、工厂机制概述
工厂机制最重要的意义就是在不改变源代码的情况下,重写子类以替换验证环境中的实例或者已经注册的类型,便于产品的迭代以及验证环境的复用性。这里的实例或者类型替代,称做覆盖(override),进行override的双方需要满足工厂注册(registration)和多态(polymorphism)的要求,即重写的类型与被覆盖的类型要有派生关系,注意component和object之间互相不能覆盖。
在整个仿真中,factory有且只有一个,保证了所有类都注册在一个工厂当中。通过工厂注册,利用工厂完成对象的创建。所有类的实例都是由工厂产生,因此可以灵活替换其中的实例或类型,实现对环境内部组件类型或者实例的覆盖。
2、工厂机制运用
2.1一般来说运用工厂机制的步骤分为以下几步:
1.将类注册到工厂;
2.例化前设置覆盖对象和类型(可选);
3.创建对象;
将类注册到工厂:
`uvm_component_utils()//将component注册到工厂
`uvm_component_utils_begin()
`uvm_component_utils_end//包含field_automatic机制
`uvm_object_utils()//将object注册到工厂
`uvm_object_utils_begin()
`uvm_object_utils_end//包含field_automatic机制
设置覆盖对象和类型:
//替换整个平台下所有类型,uvm_object_wrapper通过type_name::get_type()获取
set_type_override_by_type(uvm_object_wrapper original_type,uvm_object_wrapper override_type,bit replace=1);//replace=1表示是否重复覆盖,可缺省,默认为1
//指替换指定路径下的类型,第一个为相对路径
set_inst_override_by_type(string relative_inst_path,uvm_object_wrapper original_type,uvm_object_wrapper override_type);//指定路径下替换类型
//通过type的字符串进行类型替换
set_type_override_by_name(string original_type,string override_type,bit replace=1);//字符串替代
//通过type的字符串替换指定路径下的类型
set_inst_override_by_name(string relative_inst_path,string original_type,string override_type);
创建对象(实例):
//在build_phase中创建component对象
comp_type_name::type_id::create(string name,uvm_component parent);
//创建object对象
object_type_name::type_id::create(string name);
2.2系统存在一个uvm_factory类型的全局变量factory,在任何位置可以调用factory中的重载函数:
1)在initial中使用:
initial begin
factory.set_type_override_by_type(old_mon::get_type(),new_mon::get_type());
end
2)在component中使用:
factory.set_type_override_by_type(old_mon::get_type(),new_mon::get_type());
如要进行覆盖(override),需要在创建对象之前设置覆盖对象和类型。
2.3可以通过仿真选项打开类型覆盖功能:
<sim command> +uvm_set_inst_override=<req_type>,<override_type>,<full_inst_path>
<sim command> +uvm_set_type_override=<req_type>,<override_type>[,<replace>]
分别对应set_inst_override_by_name和set_type_override_by_name:
1)实例重载:
<sim command> +uvm_set_inst_override="old_mon,new_mon,uvm_test_top.env.o_agt.mon"
2)类型重载:
<sim command> +uvm_set_type_override="old_mon,new_mon"