UVM Factory机制基础

一、Factory概念理解:

       1.  在UVM的世界里,Factory机制被用于创建对象,并且能够通过配置来实现例化时,对对象类型的重载(override)。

        2. Factory,翻译过来就是工厂。在现实生活中,工厂一般用于制造和生产活动。那么同样的,在UVM的世界中,工厂则用于对象(object)的“制造和生产”,这也是这套机制被叫做Factory的原因。

        3. 工厂模式的主要思想:是定义一个用于创建对象的接口,让子类去决定说最后要实例化的到底是哪一个类,以实现松耦合的面向对象设计。

二、Factory使用方法:

        1. 注册(Registry):开局上来就注册

        `uvm_object_utils(class_name) //非参数化object类

        `uvm_component_utils(class_name)  //非参数化component类

        `uvm_object_param_utils(class_name #(arg1,arg2)) //参数化object类

        `uvm_component_param_utils(class_name #(arg1, arg2)) //参数化component类

        2. 实例化(Create):类型代理type_id的方法create

   static function T create (string name="", uvm_component parent=null, string contxt="");//第一个参数是对象的名字,第二个参数和第三个参数共同指定了新创建的对象在UVM层次中的关系。不过在实际使用中contxt通常留空,因为只要指定了parent,contxt在函数内部会被设置为parent.get_full_name()。

           type_id是一个类型的重命名,例化对象的时候调用关系就变成了:    

class_name::type_id::create("object_name", this) //实例化

        create执行过程:它被调用之后会首先找到UVM全局唯一的工厂(default_factory),通过工厂来找到应该被例化的类型(比如有被override的情况)的类型代理type_id,最后才利用该类型代理来创建一个对象并返回 。

        3. 重载(Override): 

        重载是Factory机制的重要功能,或者说,如果没有该功能,Factory机制会显得“一无是处”。   

        子类完全重载父类行为:打个比方,当我想要实例化driver_a的时候,我会在验证环境中使用driver_a::type_id::create来实例化;之后我们对driver_a进行了扩展,有了新的类driver_a_sub extends driver_a,为了将driver_a都替换成driver_a_sub又不想去修改验证环境的代码,这个时候Factory机制就可以派上用场了。

         类重载方法:

             1. 利用全局工厂(default_factory):在TestBench的任意组件中,包括TB的initial语法块中,都可以调用factory的重载方法。常用的使用方法包括:

factory::set_inst_override_by_type(old_class::get_type(), new_class::get_type(), "full.inst.path");
factory::set_inst_override_by_name("old_type_name", "new_type_name", "full.inst.path");
factory::set_type_override_by_type(old_class::get_type(), new_class::get_type());
factory::set_type_override_by_name("old_type_name", "new_type_name");

  其中,set_type_*方法是直接全局重载,set_inst_*可以在第三个参数中指定被重载的组件层次;*_by_type方法是直接指定哪个类型被哪个类型重载,*_by_name方法则会首先通过类型名(type_name)来映射到类型代理,这个方法不太建议使用,因为对于参数化类来说,使用宏注册之后不会有type_name成员,需要手动去实现这一套东西。

                2.  通过被重载类的类型代理(type_id):该方式只能在object/component系的函数中使用,相对会受限一些。component代理的重载方法会比object代理的重载方法多一个参数parent,用于指定UVM层级关系。常用的使用方法如下:

object_class::type_id::set_inst_override(new_class::get_type(), "full.inst.path");
component_class::type_id::set_inst_override(new_class::get_type(), "full.inst.path", this);
old_class::type_id::set_type_override(new_class::get_type());

                3.  通过被重载类的类型代理:这种方式用到的函数名跟通过全局工厂所用的函数名一样,函数参数也一样,区别在于参数顺序有所不同。

        重载示例:

        

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值