UVM-工厂机制(factory)

1.工厂模式概述

工厂模式的主要解决的问题是,将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。

  • UVM工厂的存在就是为了更方便地替换验证环境中的实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性。
  • 实例或类型替代,在UVM中称作覆盖,而被用来替换的对象或者类型,应该满足注册和多态的要求。
  • uvm_component类构成了验证环境的层次,uvm_object类构成构成环境的属性和数据传输,这两种类是进出工厂的主要模具和生产对象。
  • 对象由工厂生产是利用工厂生产模具可灵活替代的好处,在不修改原有验证环境层次和验证包的同时,实现对环境内部组件类型或者对象的覆盖

2.创建(create)

2.1 定义->注册->构建 缺一不可

  • component 构建函数 function new (string name = " name", uvm_component parent = null)
    创建对象comp_type::type_id::create(string name,uvm_component parent);
  • object 构建函数 function new (string name = “name”)
    object_type::type_id::create(string name);
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

2.2 什么是宏

在上面两种类comp1和obj1的注册中,分别使用了UVM宏
uvm_component_utils 和 `uvm_object_utils

  • 使用宏将类注册到factory中,factory是独有的,即有且只有一个,这保证了所有类的注册都在一个“机构”中

3.覆盖方法

覆盖机制可以将其原来所属类型替换为另一个新类型
在覆盖之后,原本用来创建原型类型的请求,将由工厂来创建新的替换类型

  • 无需修改原始代码,继而保证了原有代码的封装性

  • 新的替换类型必须与被替换类型相兼容,否则稍后的句柄赋值将失败,所以使用继承

  • 做顶层修改时,非常方便
    当使用create()来创建对象时:

  • 工厂会检查,是否原有类型被覆盖

  • 如果是,它会创建一个新类型的对象

  • 如果不是,它会创建一个原有类型的对象
    覆盖发生时,可以使用“类型覆盖”或者“实例覆盖”:

  • 类型覆盖指,UVM层次结构下的所有原有类型都被覆盖类型所替换

  • 实例覆盖,指某些位置中原有类型会被覆盖类型所替换
    set_type_override()

static function void set_type_override(uvm_object_wrapper override_type, bit replace = 1);
//调用
origin_type::type_id::set_type_override(new_type::get_type())

set_inst_override()

static function void set_inst_override(uvm_object_wrapper override_type,string inst_path,uvm_componnent parent = null);
//调用
origin_type::type_id::set_inst_override(new_type::get_type(),"orig_inst_path");
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM工厂机制是一种用于创建和管理UVM组件和对象的机制。它通过使用UVM工厂类(uvm_factory)来实现。\[1\]该工厂类是一个独特的对象,用于注册和创建UVM组件和对象。在UVM中,组件和对象的注册是通过使用宏来实现的,分别是uvm_component_utils和`uvm_object_utils。\[2\]这些宏将组件和对象注册到工厂中,以便在需要时可以通过工厂来创建它们。 使用UVM工厂机制创建组件和对象有两种方法。一种是通过继承uvm_component类或uvm_object类,并在类内重载方法来实现。这种方法本质上是借用工厂对象来创建组件和对象。\[1\]另一种方法是直接使用工厂方法来创建组件和对象。这需要使用全局唯一的uvm_factory类对象factory来调用工厂方法,并使用$cast进行类型转换。\[3\] 总之,UVM工厂机制提供了一种方便的方式来注册和创建UVM组件和对象,使得它们可以在需要时动态地创建和使用。 #### 引用[.reference_title] - *1* *3* [UVMfactory 机制](https://blog.csdn.net/Starry__/article/details/122930959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [UVM-工厂机制(factory)](https://blog.csdn.net/sinat_41774721/article/details/121763596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值