uvm设计分析——factory
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的更多相关文章
- UVM的factory机制
在UVM中使用工厂模式基本上分为三个步骤: 1. 注册 当定义一个类的时候,它的类型必须要注册,UVM已经提供了专用的宏. `uvm_component_utils(class_type_name) ...
- UVM中factory机制的使用
UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...
- uvm设计分析——reg
项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...
- uvm设计分析——field automation
uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...
- uvm设计分析——tlm
tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...
- uvm设计分析——callback
uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...
- uvm设计分析——report
uvm_report实现中的类图,如下: 1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fata ...
- UVM/OVM中的factory【zz】
原文地址:http://bbs.eetop.cn/viewthread.php?tid=452518&extra=&authorid=828160&page=1 在新的项目中再 ...
- UVM中的factory机制实现
首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...
随机推荐
- Ubuntu启动时a start job is running for dev-disk-by延时解决
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- dp的斜率优化
对于刷题量我觉得肯定是刷的越多越好(当然这是对时间有很多的人来说. 但是在我看来我的确适合刷题较多的那一类人,应为我对知识的应用能力并不强.这两天学习的内容是dp的斜率优化.当然我是不太会的. 这个博 ...
- 《HTTP - 状态码》
推荐一首歌 - 那吾克热<儿子娃娃> 非常喜欢前奏 1:状态码的作用? - 职责是当客户端发起请求时候,描述请求返回结果.根据状态码,客户端可以知道服务端是正确处理了请求,还是返回了错误. ...
- MIPS 指令集开源了
去年年底我们报导过 MIPS 指令集将于今年第一季度开源的消息,现在 MIPS 官方已经正式将其释出. MIPS 是一种精简指令集(Reduced Instruction Set Computer,R ...
- 洛谷P3247 最小公倍数 [HNOI2016] 分块+并查集
正解:分块+并查集 解题报告: 传送门! 真的好神仙昂QAQ,,,完全想不出来,,,还是太菜了QAQ 首先还是要说下,这题可以用K-D Tree乱搞过去(数据结构是个好东西昂,,,要多学学QAQ),但 ...
- byte数组存储到mysql
public int AddVeinMessage(byte[] data)//插入数据库 { using (BCSSqlConnection = new MySqlConnection(strCon ...
- 什么是HDFS
HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用硬件集群上,是管理网络中跨多台计算机存储 ...
- redis缓存和mysql数据库同步
附redis关于缓存雪崩和缓存穿透,热点key 穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法: 持久层查询不到就缓存空结果,查询时先判断缓存 ...
- android仿支付宝输入车牌号
这个是iOS的效果图,差异不大,楼主主攻OC,见谅 需要用到的xml文件 需要用到的类 number_or_letters.xml <?xml version="1.0" e ...
- JS中函数表达式与函数声明的区别
hello,沐晴又来更新啦,今天呢,跟大家讲讲让人头疼的函数表达式和函数声明,反正我当初看那本高级程序的时候,是没怎么看太透,哈哈.我是个比较重基础的人,跟我一起探讨函数表达式和函数声明的世界吧. 首 ...