UVM 工厂(factory)机制

目录

二、UVM工厂机制

1、工厂机制概述

2、工厂机制运用


二、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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值