从名字上面就知道,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实现的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/>

UVM基础之---------uvm factory机制base的更多相关文章

  1. UVM基础之-------uvm factory机制override<博>

    override功能是UVM中一个比较重要的功能,这个功能也是在factory里面实现的,我们会在env或者具体的case中使用override功能. class case_x extends bas ...

  2. UVM基础之---------uvm factory机制register

    factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...

  3. UVM基础之------uvm phases机制

    代码的书写顺序会影响代码的实现,在不同的时间做不同的事情,这是UVM phase的设计哲学,UVM phase提供了一个通用的TB phase 解决方案.支持显示的隐式的同步方案,运行时刻的线程控制和 ...

  4. UVM基础之---------uvm report 机制分析

    uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_repor ...

  5. UVM基础之-------uvm report机制的使用

    后面的例子我会继续补充: 1. 因为uvm默认定义的message格式比较长,非常不利于debug过程中的分析使用,一般情况下,开始使用uvm,都要利用uvm_report_server重新定义mes ...

  6. UVM/OVM中的factory【zz】

    原文地址:http://bbs.eetop.cn/viewthread.php?tid=452518&extra=&authorid=828160&page=1 在新的项目中再 ...

  7. UVM的factory机制

    在UVM中使用工厂模式基本上分为三个步骤: 1. 注册 当定义一个类的时候,它的类型必须要注册,UVM已经提供了专用的宏. `uvm_component_utils(class_type_name) ...

  8. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  9. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...

随机推荐

  1. openWrt 安装管理界面luci中文包

    openWrt15安装管理界面luci中文包   如果刚刷的openwrt15没有中文界面,用ssh连接路由后用opkg安装     root@bang-bang-tang:~# opkg insta ...

  2. Spring PropertyPlaceholderConfigure 载入配置文件

    在開始这篇博客的主题之前,我们先来了解一下Spring配置文件以及包括的相关内容. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2 ...

  3. C#——await与async实现多线程异步编程

    曾经,我们也许用过Thread.在主线程运行的时候.新开还有一个新线程,来运行新方法. 今天看别人发给我的一段代码的时候发现了一个不认识的await,可是又感觉非常熟悉的样子,感觉是线程那块儿的东西, ...

  4. Qt实现Windows远程控制

    实现方式为server端+client. server端为一个进程.client为图形界面程序. client连接时设置server端的Ip地址,以及须要显示的长度和宽度(不能超过相应server端显 ...

  5. AE After Effect 如何替换和修改素材

    替换素材:如图所示,相框外的人是成双成对的,相框里面的却只有一个人,我们想要把这个素材替换成两个人的.我们鼠标放到视频预览框的任何一个元素上面底部都会提示这是什么素材.比如我放到一个人的上面,则该人物 ...

  6. cout 堆栈,operator&lt;&lt; 运算符重载输出问题

    在C++中cout的输出流其中,有一些问题非常easy出错,就比方以下这道简单程序.看似简单.但却是一个值得深思的问题~~ #include <iostream> using namesp ...

  7. andriod socket开发问题小结

    andriod socket开发问题小结 个人信息:就读于燕大本科软件project专业 眼下大四; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构 ...

  8. SP2-0734: 未知的命令开头 &quot;imp scott/...&quot; - 忽略了剩余的行。

    Oracle数据导入报错:SP2-0734: 未知的命令开头 "imp scott/..." - 忽略了剩余的行. 原因:进入sqlplus里是不能运行imp的(sqlplus不认 ...

  9. [swift实战入门]手把手教你编写2048(一)

    苹果设备越来越普及,拿着个手机就想捣鼓点啥,于是乎就有了这个系列,会一步一步教大家学习swift编程,学会自己做一个自己的app,github地址:https://github.com/scarlet ...

  10. SSH-struts2的异常处理

    在学习j2se的时候学习过利用java的exception类去处理异常.在struts2框架中也提供了对于异常的处理.简单说就是当Action发生异常时.能够在struts2.xml文件里进行配置,将 ...