UVM基础之---------uvm factory机制base

摘要:
从名称可以看出,uvm_Factory用于制作uvm_对象和组件。在模拟过程中,只有一个工厂实例。当用户请求实例化对象或组件时,工厂将根据其配置确定要创建的对象类型,即naskthat类型的代理,以创建该类型的实例,并将其返回给用户。uvm中整个工厂的结构如下。在介绍UVM实现的工厂机制之前,让我们自己实现一个简单的工厂。我们为什么实施工厂机制?直接通过factory.create_component_by_name()函数创建对象,返回类型必须通过向下转换分配给实际的具体类型。包装器中的静态create()函数将通过调用工厂中的create函数来创建对象。
从名字上面就知道,uvm_factory用来制造uvm_objects和component。在一个仿真过程中,只有一个factory的例化存在

用户定义的object和component types通过typedef或者宏在factory中注册,factory产生和保存轻量级的代理(proxy):
  1.  uvm_object_registry #(T,Tname) for objects 
  2.  uvm_component_registry #(T,Tname) for components
每个代理只知道如何创建自己所代表的object或者component的一个例化,而且这对memory 使用也是很有效率的。

当用户请求一个object或者component的例化, the factory will determine what type of object to create based on its configuration, then ask that type’s proxy to create an instance of the type, which is returned to the user. uvm中整个factory的结构如下。
UVM基础之---------uvm factory机制base第1张

在介绍UVM实现的factory机制之前,我们先自己实现一个简单的factory,考虑下为什么要实现factory机制?

OVM Cookbook中对OVM中的工厂模式进行了详细的介绍,其中使用了一个toy factory的例子来阐述工厂模式的实现原理,让读者的理解更加深入。
 
几个重要的概念需要强调一下:
 
1. 单例模式实现的重点:
 
将构造函数申明为私有成员函数,防止外部调用构造函数来创建对象
申明一个类型为本身的静态对象句柄,通过静态函数来创建唯一的一个对象,并将其赋值给此对象句柄。此对象句柄就可以作为访问此单例的一个窗口,也可以用静态函数返回值来访问此单例的对象句柄。
2. 工厂中可以互相overide的类型必须来自于同一个基类
 
由于工厂中保存的是对象的关联数组,在有些编程语言中也叫做字典(python中好像就这么称呼),此关联数组的关键字(key)是对象句柄。而关联数组要求关键字必须是同一个类型,所以overrige的类型必须从属于同一个基类,以保证他们是同一个类型。
对每一个类,都生成一个wrapper类,此wrapper类也是一个单例,其对象被静态创建,这个对象一旦被创建,其对象句柄就是唯一的(因为只有一个对象实例)。因此很容易定位此对象句柄,从而通过这个句柄来访问关联数组。
3. 静态函数,静态变量
 
静态函数和静态变量不会和具体的对象实例相关联,实在运行时初始化阶段被创建的,某一种类型只有唯一的一套。因此可以通过类型修饰符"::"访问,而非静态函数和变量是不能用类型修饰符进行访问的。比如OVM Cookbook中实例04-07中:
将 h = family_base::type_id::create();语句换成如下语句:
 
h = family_base::type_id::create_object();
 
就会报错,因为create_object()并不是静态函数。不能通过类型修饰符访问。(使用create_object创建对象是不能实现类型重载的,在这里只是用来演示用)
 
静态函数是静态创建的,那么他也只能访问类型的静态变量和静态函数,因为其他变量并没有被创建。
4. OVM除了提供以对象句柄作为关键字的关联数组来实现工厂,同时也提供了以字符串作为关键字的关联数组来实现工厂。
 
+OVM_TESTNAME="testcase1" 这种命令行参数中,字符串工厂比较实用,仅此而已
字符串工厂实现更简单,不需要引入wrapper类。直接通过factory.create_component_by_name()函数来创建对象,返回类型必须通过向下转型(downcast)来赋值到实际的具体类型。
字符串工厂并没有类型检查,没有对象句柄方式安全。
5  wrapper的设计思想
 
wrapper#(T)是单例的,因此外部不能调用其构造函数,只能通过get_type()来得到其唯一的一个静态对象
get_type()除了用来生成wrapper类的唯一对象,同时还将自身注册到factory工厂中的关联数组中,注册也就是给关联数组增加一个元素,其关键字就是此wrapper#(T)的唯一静态对象的句柄。
wrapper# (T)必须提供一个函数来生成类型T的对象,此函数就是create_object(), 类型T的对象实际中可能有多个,因此create_object()不同的调用将返回不同的类型T的对象,此函数不需要是静态的,此函数仅仅被工厂中的关 联数组的值(关联数组的值就是具体的对象句柄)来调用。
wrapper#(T)必须提供一个静态函数,通过类型方式进行调用,也就是create()函数。wrapper中的静态create()函数将通过调用工厂中的create函数来创建对象。
来源: <http://electron64.blog.163.com/blog/static/10603397020110106130965/>


来自为知笔记(Wiz)


免责声明:文章转载自《UVM基础之---------uvm factory机制base》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32 LED闪烁 初学笔记MyEclipse 2016 Stable 1.0破解教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java常见异常

算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityExceptio...

类的加载过程(类的生命周期)详解

3.1. 概述 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 其中,验证、准备、解析3个部分统称为链接(Linking) 从程序中类的使用过程看 大厂面试题 蚂蚁金服...

vue官网总结

1.Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:2.在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。 所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)3.只有当实例被创建时就已经存在于 data 中的属性才是响应式的,vm.b = 不会触发视图的...

句柄

句柄是一个序号, 它不是一个内存地址。 它用于管理Windows内核对象,比如用户打开一个文件,Windows即会建立一个文件内核对象,所谓内核对象就是一块内存结构,里面有文件路径,文件大小,当前文件指针等等信息。Windows系统会打开很多的文件,因此就有很多的文件内核对象,同样Windows系统还会建立其它的类型的很多很多的内核对象。如何管理这么多的内...

C# 数据类型

C#的数据类型可以分为3类:数值类型,引用类型,指针类型.指针类型仅在不安全代码中使用.值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型.引用类型包括类类型,接口类型,代表类型和数组类型.值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的变量把它们的引用存储在对象中.对于引用类型的变量,完全有可能让两个不同的变量引用同一...

ECMA Script 6_唯一容器 Set_映射容器 Map

唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”, NaN 等于自身 它类似于精确相等运算符(===),而 精确相等运算符 认为NaN...