首页 > 其他分享 >uvm 工厂机制3问

uvm 工厂机制3问

时间:2023-09-25 10:46:25浏览次数:30  
标签:name Tname object 工厂 test uvm override 机制

UVM工厂机制3问

1、注册在干啥

注册时添加的uvm_object_utils(class_name)或者uvm_component_utils(class_name)展开后有一条m_uvm_object_registry_internal的宏,这个宏定义了一个uvm_object_registry #(T,Tname)的类型type_id。

img

定义了这个类型,那么在代码编译的时候就要编译uvm_object_registry#(T,Tname)这个类,在执行的时候,会提给static类型的变量赋值,由于this_type me这个变量是static的,所以程序运行的时候一上来就会执行后面的get()函数,get函数里边通过单例模式,对uvm_object_registery#(T,Tname)类型进行了注册。

img

uvm_component_registry和uvm_object_registry都是继承至uvm_object_wrapper。

img

在调用factory.register(uvm_object_wrapper obj)时,会把uvm_component_registry #(T,Tname)实例,添加到m_type_name[string]的关联数组表中。

img
img

当然这个过程中还添加了其他表,但主要是把uvm_component_register #(T,Tname),uvm_object_registry #(T,Tame)以父类uvm_object_wrapper的形式添加到了m_type_names表中。

2、run_test()/run_test("xxx")/xxx::type_id::create()是如何例化的

run_test

run_test()与run_test("xxx")的区别就是run_test()需要使用$value$plusargs()系统函数来获取命令行中UVM_TESTNAME的值作为test_name。

有了test_name,就调用create_component_by_name例化test_name对应的类型。

img

在create_component_by_name中调用find_override_by_name函数,通过test_name的名字查表(注册的时候将uvm_component_registry#(T,Tname)以uvm_object_wrapper[class_name]的形式存在m_type_names表中)得到uvm_object_wrapper的对象。

img

有了uvm_object_wrapper对象(其实子类是uvm_object_register#(T,Tname)或者uvm_component_register#(T,Tname))就可以调用uvm_object_wrapper #(T,Tname)的create_object()或者create_componet()产生需要的实例。因为uvm_object_register#(T,Tname)或者uvm_component_register#(T,Tname)类保存了注册类的类型T,所以可以通过new的方式例化注册类T。
img

create()

与2类似,都是查表得到uvm_object_wrapper对象,然后调用uvm_object_wrapper对象的create_component函数,生成实例

img

3、override是如何生效的

set_type_overrride_by_name()
set_type_override_by_type()
set_inst_override_by_name()
set_inst_override_by_type()

都是修改了uvm_factory中的表,然后在根据名字或者类型例化的对象的时候,通过find_override_by_type函数查表,选择最后override的uvm_object_wrapper对象返回,最后调用返回的uvm_object_wrapper对象例化对象。

注意:调用这4个overrider函数都是在build_phase或者build_phase之前调用否则,要overrride的类型对象都例化出来了再override就没有用了,如果在build_phase中override必须要注意,只能在树的高节点往低节点override,应为build_phase是自上而下执行的,由于test_case是最高的节点,在test_case中override下面任何一个类型都能生效,当然如果要override test_case中要例化的类型,要在例化之前override。

标签:name,Tname,object,工厂,test,uvm,override,机制
From: https://www.cnblogs.com/yuandonghua/p/17727384.html

相关文章

  • win32汇编-80386的内存分页机制
     读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可......
  • 工厂模式的三种姿态?
    在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具,用于创建对象实例的方式,可以帮助我们更好地组织代码和降低耦合性。在本文中,我将为大家详细介绍工厂模式的三种姿态,同时通过举例和代码演示来帮助大家更好地理解。工厂模式的三种姿态工厂模式是一种创建型设计模......
  • Kafka的消息存储机制
    前面咱们简单讲了K啊开发入门相关的概念、架构、特点以及安装启动。今天咱们来说一下它的消息存储机制。前言:Kafka通过将消息持久化到磁盘上的日志文件来实现高吞吐量的消息传递。这种存储机制使得Kafka能够处理大量的消息,并保证消息的可靠性。1、消息存储机制概述:1.1分区与副本:K......
  • Kafka的消息存储机制
    前面咱们简单讲了K啊开发入门相关的概念、架构、特点以及安装启动。今天咱们来说一下它的消息存储机制。前言:Kafka通过将消息持久化到磁盘上的日志文件来实现高吞吐量的消息传递。这种存储机制使得Kafka能够处理大量的消息,并保证消息的可靠性。1、消息存储机制概述:1.1分区......
  • 工厂方法模式
    工厂方法模式总体代码//MySpider.h#pragmaMySpider.honce#include<memory>usingnamespacestd;classMySpider{public: virtualvoidCrawl()=0;};classMySpiderFactory{public: virtualshared_ptr<MySpider>CreateMySpider()=0;};//MyTextIma......
  • 笔记 | 信号和槽机制
    什么是信号和槽?信号和槽是Qt框架中的两个关键元素,用于对象之间的通信。简而言之,信号是对象发出的事件或消息,而槽是用于响应信号的特殊成员函数。通过将信号与槽连接起来,可以在一个对象发出信号时自动调用另一个对象的槽函数。在Qt中,信号和槽是通过宏(Q_OBJECT和SIGNAL、SLOT)进行声明......
  • 2023数A题——WLAN网络信道接入机制建模
    A题——WLAN网络信道接入机制建模思路:该题主要考察的WLAN下退避机制建模仿真。资料获取问题1:假设AP发送包的载荷长度为1500Bytes(1Bytes=8bits),PHY头时长为13.6μs,MAC头为30Bytes,MAC头和有效载荷采用物理层速率455.8Mbps发送。AP之间的RSSI为-70dBm。大部分时候只有一个AP能够......
  • 工厂模式(正式)
    抽象工厂模式及示例模式的动机提供一种接口,用于创建一系列相关或相互依赖的对象抽象工厂模式通过引入抽象工厂接口,允许客户端代码通过工厂接口创建产品,而不需要关心具体的产品类;使得客户端代码可以与特定产品的具体类解耦,实现了抽象和实现的分离模式的实现抽象的......
  • MVCC机制
    MVCC机制在读已提交级别下生效的。为了避免加锁导致的读写冲突导致性能下降的另外一套事务隔离机制。MVCC需要提及以下概念行的隐藏字段trx_id:保存着对该条记录进行修改操作的事务idroll_ptr:指向历史版本的指针。(历史版本是指许多事务修改前的数据,类似链表的结构)read......
  • 工厂模式
    工作场景:编写一个给用户发送短信的程序传统写法#include<stdio.h>#include<string>enumNotifMessageType{WUDI,FEITIAN};classNotifMessage{public:intsendMessage(longlonguserId,std::string&msg,NotifMessageTypetype){s......