uvm的factory机制,通过实例一个static类型default factory,并且通过宏将所有例化extend出来的object,component

    register到该factory的内部变量中;所以有了可以override的条件;

    register通过注册一个proxy,该proxy是一个参数化的class,实现对被代理class的create;

    

uvm_component_registry,是对uvm_component的proxy基类,目标component通过定义一个参数化的extend class,来将所有的component各自代理;

    type_id表示新的自己的proxy class的类型;被包含在目标component中;

参数化的uvm_component_registry中,实现了几个static function:

    1)get function,拿到某个registry的static实例;

    2)create function,调用factory的create方法,比class自己内部实现强大一些,可以实现override功能;

    3)create_component function,实现component new的具体函数;被factory调用;

uvm_object_registry与uvm_component_registry类似;但是create_component变为了create_object;

    其中都定义了两个override的static function,任何component或者object都可以通过type_id来进行调用;

    1)set_type_override;

    2)set_inst_override;

uvm_factory,主要是对内部的几个queue进行变量的搜索以及更新,调用registry的create_xx进行object的new;

    

变量var:m_types,m_type_names,分别是对registry后的对象的name和object的保存queue;

      m_type_override,保存通过方法set_type_override_by_type/name添加的信息;

      m_inst_override_queues,保存通过方法set_inst_override_by_type添加的信息,

        和部分inst_override_by_name添加的信息;

      m_wildcard_override_queues,保存通过方法inst_override_by_name添加的name中有通配符"*","?"的name;

        当然name也是没有进行registry的;original name有通配符;

      m_inst_override_name_queues,保存通过方法inst_override_by_name添加的不进行register的name的信息;

        也不包含通配符;用处没看到

      m_override_info,保存当前迭代override时的,各个override信息,防止死锁。

function:set_xx_override,多次override时,是否要进行replace,需要最后一个参数bit为0,进行指定。

      create_object_by_xx,这是object调用的;自动进行override的搜索;

      create_component_by_xx,这是component调用的,自动进行override的搜索;

      find_override_by_xx,一般是内部调用,也可以外部使用;

      find函数,先查找inst类型的override,在查找具体的type_override;

  这些function,都不是static类型的,因为factory本身是static,任何class都可以拿到,继而调用这些function;

      所以也不需要设计为static类型;

factory还有一个最重要的function;register,该funtion在registry调用create函数的时候,自动调用;

    register函数,会对内部的m_wildcard_inst_override和m_inst_override_name_queue进行检查,

      如果新注册的object的name在这两个queue中,会删除相应的queue,而添加到m_inst_override queue中;

macros:object和component的宏是不一样的,因为所调用的proxy是不同的,一个component_registry,另一个object_registry;

object部分的macros:1)uvm_object_utils;调用begin,,,,end块的宏;

            2)uvm_object_param_utils;调用begin,,,,end块的宏;

            3)uvm_object_utils_begin;1)进行type_id的声明

                       2)实现function,get_type()和get_object_type;

                       3)实现create函数,调用new函数,object必须声明此函数

                       4)实现get_type_name函数,

                          5)调用field_automation的宏

            4)uvm_object_param_utils_begin;相比较与uvm_object_utils_begin,只是缺少get_type_name的宏;

                        因为参数化的class,name是不确定的;

            5)uvm_object_utils_end;

component部分的macros:1)uvm_component_utils;1)进行type_id的声明;

                           2)实现function,get_type()和get_object_type;

                           3)实现get_type_name函数;

                2)uvm_component_param_utils;只是实现register,不实现get_type_name;

              3)uvm_component_utils_begin;调用component_utils和field_automation宏;

                4)uvm_component_param_utils_begin:调用param_utils和field_automation宏;

              5)uvm_component_utils_end;

使用中object调用override有两种方式,一般在top上进行override;

    1)在component或者object内部通过type_id调用

    2)通过factory来进行调用

      

component,可以直接在函数中调用;component内部也有该函数的定义,间接调用的factory;一般在top上进行override;

      

      

使用factory 产生object,可以使用type_id或者factory本身的create_object/component命令;

uvm设计分析——factory的更多相关文章

  1. UVM的factory机制

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

  2. UVM中factory机制的使用

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

  3. uvm设计分析——reg

    项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...

  4. uvm设计分析——field automation

    uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...

  5. uvm设计分析——tlm

    tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...

  6. uvm设计分析——callback

    uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...

  7. uvm设计分析——report

    uvm_report实现中的类图,如下: 1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fata ...

  8. UVM/OVM中的factory【zz】

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

  9. UVM中的factory机制实现

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

随机推荐

  1. 原码,补码,反码的概念及Java中使用那种存储方式

    原码,补码,反码的概念及Java中使用那种存储方式: 原码:原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示 补码:机器数的补码可由原码得到.如果机器 ...

  2. AIX动态增加SWAP空间

    增加SWAP交换页空间 查看SWAP,使用lsps –a命令查看,默认安装SWAP是512M,例如: # lsps -a              Page Space      Physical V ...

  3. java Scanner和Random的Demo

    import java.util.Scanner;//导入包 import java.util.Random; public class ScannerDemo{ public static void ...

  4. Nginx安装、配置虚拟主机、反向代理、负载均衡

    1.   nginx安装 下载nginx: 官方网站: http://nginx.org/ 使用的版本是1.8.0版本. Nginx提供的源码. 1.1. 要求的安装环境 1.需要安装gcc的环境.y ...

  5. Docker 容器(六)

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体.容器可以被创建.启动.停止.删除.暂停等. 容器的实质是 ...

  6. dedecms如何去除后台登陆验证码

    用dedecms批量建站一般直接把文件打包复制,然后导入数据库,一个新网站就好了,但有时后台一直无法登录,提示验证码错误.那我们就想怎么把验证码关闭,现在就给大家解决织梦去掉后台登陆验证码.我们知道d ...

  7. 如何修改帝国cms文章点击量默认值和成倍增加

    我们在帝国cms发布完文章,在不点击的情况下,“点击量”默认显示为0,请问有什么方法,修改关注默认值吗?这个可以在增加信息时,“特殊属性”标签里修改点击量,如下图 有朋友问有没其他好的方法快速增加.成 ...

  8. 张小龙2018PRO版微信公开课演讲全文 透露2018微信全新计划

    大家好!我是张小龙.欢迎大家来到微信公开课. 刚刚出现的是我打游戏的画面,被大家看到了,那个不是我最好的水平,因为有点紧张,我最高分曾打到6000多分.当然我是练习了很久了,并不是我比大家更厉害,而是 ...

  9. Linux系统启动排错实验集合

    Centos6系统启动流程 1. post  加电自检  检查硬件环境 2. 选择一个硬件类型引导启动           mbr 446字节   grub  stage1 3. 加载boot分区的文 ...

  10. 20165236 2017-2018-2 《Java程序设计》结对编程练习_四则运算

    20165236 2017-2018-2 <Java程序设计>结对编程练习_四则运算 结对小组:叶佺.郭金涛 一.需求分析: 1.能随机生成n道四则运算题目,n由使用者输入: 2.支持多种 ...