数字验证:一文弄懂UVM的factory机制

news2024/9/21 16:48:42
        如果我们用SystemVerilog构建验证平台,构建好了之后,想改变平台中的某个组件,例如将driver改成driver_new,我们需要重新定义一下driver_new,当然也可以直接从driver继承。但是我们还需要在driver对象例化的地方将driver drv; 改成driver_new drv;,如果需要多个组件的更新、以及多次的平台复用,那代码量巨大,而且每次改变都要深入平台内部,非常繁琐。基于上述问题,UVM提出的factory机制通过将拓展类在工厂注册,可实现环境内部组件的创建与对象的重载。
        factory机制主要针对构成验证环境层次的uvm_component及其子类,以及构成环境配置属性和数据传输的uvm_object及其子类。

1. 注册  

        使用factory机制的第一步首先需要将类注册到工厂。这个factory是整个全局仿真中存在且唯一的"机构”,所有被注册的类才能使用factory机制。这很好理解,想要使用工厂机制,你首先得在工厂中注册这个类。

        一些注册示例:

`uvm_component_utils(my_agent)		//component注册macro
`uvm_component_utils_begin(my_agent)//注册factory的同时,可注册field automation
//...
`uvm_component_utils_end

`uvm_component_param_utils(my_driver)	//参数化的component注册,例class my_driver #(int width = 32) extends uvm_driver;
`uvm_component_utils_param_begin(my_driver)	//注册factory的同时,可注册field automation
//...
`uvm_component_utils_param_end

`uvm_object_utils(my_transaction)		//object注册macro
`uvm_object_utils_begin(my_transaction)		//注册factory的同时,可注册field automation
//...
`uvm_object_utils_end

`uvm_object_param_utils(my_sequence)	//参数化的object注册,例class my_sequence #(int width = 32) extends uvm_sequence;
`uvm_object_utils_param_begin(my_sequence)	//注册factory的同时,可注册field automation
//...
`uvm_object_utils_param_end

        注册只需要遵照范式,使用utils宏对相应对象完成注册,注意不要弄错component和object。

2. 创建

        完成了注册之后还要进行创建,即实例化对象,所有注册到factory的类均可通过factory独特的方式实例化对象。但factory的独特方式,实际上也是调用了new函数,也是先创建句柄再赋予对象。

class my_agent extends uvm_agent;
	`uvm_component_utils(my_agent)		//注册
	function new(string name, uvm_component parent);
		super.new(name,parent);
	endfunction
	//...
endclass
my_agent agt;						//创建my_agent句柄
agt = my_agent::type_id::create("agt", env);//factory独特且最常用的例化方式,创建了my_agent实例并返回句柄,本质还是调用的my_agent::new(name,parent);

class my_sequence extends uvm_sequence;
	`uvm_object_utils(my_sequence)		//注册
	function new(string name);		    //object不属于uvm层次结构,不需要parent
		super.new(name);
	endfunction
	//...
endclass
my_sequence seq;			//创建my_sequence句柄
seq = my_sequence::type_id::create("seq");//factory独特且最常用的例化方式

        建议使用create的方式创建,便于后续可能进行的重载等操作。

3. 重载

        重载的意思就是覆盖、替换。对于UVM中的factory机制,可实现factory机制中创建函数的重载,即将父类的创建函数重载成子类的创建函数。前提是必须将父类和子类均在factory中注册,必须使用factory的例化方式,这也显示了factory机制的优点。

class bird extends uvm_object;
	`uvm_object_utils(bird);
	//...
endclass

class parrot extends bird;
	`uvm_object_utils(parrot);
	//...
endclass
function void my_case0::build_phase(uvm_phase phase);	
	bird bird_inst;
	parrot parrot_inst;
	bird_inst = new("bird_inst");	//bird句柄指向了名叫"bird_inst"的bird对象,注意UVM中不允许这样例化!!
	parrot_inst = new("parrot_inst");	//parrot句柄指向了名叫"parrot_inst"的parrot对象,UVM中不允许这样例化!!
	bird_inst = parrot_inst;	//bird句柄指向了名叫"parrot_inst"的parrot对象,SV的多态
	//...
endfunction

function void my_case1::build_phase(uvm_phase phase);	
	bird bird_inst;
	parrot parrot_inst;
	set_type_override_by_type(bird::get_type(),parrot::get_type());	//将父类bird重载成子类parrot
	bird_inst = bird::type_id::create("bird_inst"); /此处返回的是名叫"bird_inst"的parrot实例!但bird_inst依旧是bird句柄
	parrot_inst = parrot::type_id::create("parrot_inst ");
	//...
endfunction

        注意,原验证环境都是通过父类句柄实现方法的,重载之后父类句柄指向的是子类对象,此时只有父类中为virtual型,且在子类中被重新实现的方法,原验证环境才会使用子类中的该方法。

        并且,component和object之间不能重载

3.1 连续重载

        如有需要,我们可以将父类的创建函数重载成子类的创建函数,还可将子类的创建函数继续重载成孙类的创建函数,以此类推。

class big_parrot extends parrot;
	`uvm_object_utils(big_parrot);
	//...
endclass
function void my_case1::build_phase(uvm_phase phase);						
	bird bird_inst;
	parrot parrot_inst;
	big_parrot big_parrot_inst;
	set_type_override("bird","parrot");
	set_type_override("parrot","big_parrot");			
	bird_inst = bird::type_id::create("bird_inst"); 	//bird句柄指向的是"bird_inst"的big_parrot实例
	parrot_inst = parrot::type_id::create("parrot_inst"); 	//parrot句柄指向的是"parrot_inst"的big_parrot实例!
	//...
endfunction

3.2 重载的意义

        factory机制的重载具有这些特点: 

        顶层修改时,非常方便,无需修改原始代码,继而保证了原有代码的封装性,安全性;

        新的替换类型必须与被替换类型相兼容,否则稍后的句柄赋值将失败,所以需要使用继承。

        具体来说,当使用create创建对象时,工厂会检查原有类型是否要被覆盖。如果是,它会创建一个新类型的对象;如果不是,它会创建一个原有类型的对象。在覆盖时可以选择是类型覆盖或是实例覆盖:类型覆盖是UVM层次结构下的所有原有类型都被覆盖类型所替换,对应语句为set_type_override();实例覆盖是指某些位置中原有类型会被覆盖类型所替换,对应语句为set_inst_override()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP同城派送多区域运营配送小程序源码

🚚💨「同城派送多区域运营小程序」——让每一份需求快速触达!🌈🚀 🔥 开篇燃爆:同城生活新风尚,一键速达不是梦! Hey小伙伴们,你还在为找不到合适的同城服务…

WEB渗透Win提权篇-PowerUp

提权工具合集包(免费分享): 夸克网盘分享 往期文章 WEB渗透Win提权篇-提权工具合集-CSDN博客 WEB渗透Win提权篇-RDP&Firewall-CSDN博客 WEB渗透Win提权篇-MSSQL-CSDN博客 WEB渗透Win提权篇-MYSQL-udf-CSDN博客 WEB渗透Win提权篇-Acc…

02-03:原理图与PCB交互以及快速模块化

1原理图与PCB交互 ①在PCB界面,点击工具, 勾选交叉选择模式 ②过滤器只选择元器件 2.按页快速模块化 配合F9快捷键

运放阻抗和噪声(同相放大器的输入/输出阻抗 + 电压跟随器阻抗 + 噪声 +信噪比)

2024-8-27,星期一,21:03,天气:阴雨,心情:晴。培训终于结束啦,开始轮岗了,看了两天PPT,加油加油,继续学习。 今天继续学习第六章运算放大器,主要学…

修改SpringBoot项目中MyBatis的mapper.xml文件的位置

由于MyBatis默认的mapper.xml的扫描位置是resource文件下,但是不可能整个项目的mapper.xml文件都放在resource下,如果文件较少还行,但是如果文件比较多,虽然有插件可以点击跳转,但是每次都这样也太麻烦了,所…

浙商之源——龙游商帮丨龙游商帮的具象文化符号之建筑篇

编撰者:袁勇 [三门源村] 三门源村位于浙江省龙游县石佛乡北部,距县城约28公里。因为进出村庄要经过三道屏障,且穿村而过的溪水又为塔石溪的源头,故称三门源。三门源群山环绕,仅有南面与金衢盆地相接,一泓溪…

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能 指令(字符串)订阅功能代码测试 指令(字符串)订阅功能 为了通过键盘触发mavros 的不同功能,需要实现一个订阅字符串的功能 该…

【嵌入式开发之网络编程】Socket套接字及TCP、UDP通信的实现

Socket套接字 现有计算机网络体系结构有三种划分形式:OSI七层协议、TCP/IP四层协议结构、五层协议结构。具体介绍参考:【嵌入式开发之网络编程】网络分层、OSI七层模型、TCP/IP及五层体系结构 网络的体系结构 (Network Architecture) 是计算机网络的各…

MySQL索引(二)

MySQL索引(二) 文章目录 MySQL索引(二)MySQL有哪些索引?MySQL的主键是聚簇索引吗?聚簇索引和非聚簇索引的区别什么是覆盖索引什么是回表主键问题 外键约束什么是外键什么是外键约束外键带来的问题 联合索引最左匹配原则如何建立联合索引索引下推 学习地址…

适合 Spring Boot 3.0x的Redis 分布式锁

Spring Boot 中的 Redis 分布式锁 在分布式系统中,多个进程同时访问共享资源时,很容易出现并发问题。为了避免这些问题,我们可以使用分布式锁来保证共享资源的独占性。Redis 是一款非常流行的分布式缓存,它也提供了分布式锁的功能…

Ai+若依(页面调整--去除若依的各种痕迹,采用自己的):【07篇】

页面调整 如果使用若依框架项目做为脚手架,那么我们肯定需要在页面显示中,符合自己公司或者项目的标识才行,需要更换的地方很多,我们依次来解决它 浏览器标签页logo标识、标题 系统页面中的logo标识、标题 去除源码地址 & 文档地址 主题风格和菜单图标 登录名称及背景…

Java GIS开发工具包-GeoTools浅谈

目录 前言 一、关于Geotools 1、GeoTools简介 2、官方仓库 3、使用Geotools的一些项目 二、Geotools架构 1、功能架构 2、Geotools支持的数据格式 三、Geotools科研热点 1、知网信息 2、百度学术 四、总结 前言 地理信息,智联万物。地理信息在我们的生活中…

《机器学习》—— OpenCV 对图片的各种操作(均值、方框、高斯、中值滤波处理)

文章目录 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理2、给图像边缘增加边框3、对图片进行阈值化操作 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理 均值滤波 cv2.blur是 OpenCV 库中的一个函数,用于对图像进行均值模糊处理。这个函数通…

【Mysql】通过Keepalived搭建mysql双主高可用集群

一、环境信息 主机名ip操作系统mysql版本VIP(虚拟ip)hadoop01192.168.10.200centos7_x865.7192.168.10.253hadoop03192.168.10.202centos7_x865.7 二、mysql集群搭建 两台节点,如果未部署mysql服务,部署文档请看【Mysql】mysql…

前端自动导入依赖

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

C++——string类(1)

### string是C中的一种类&#xff0c;在标准库中的&#xff1b;可以直接对字符串进行一系列操作。 string类类型的构造 1、无参构造&#xff1a; string(); 定义string对象的时候不给值&#xff0c;这个string类的对象里面没有字符&#xff1b; #include<iostream> #in…

VsCode中Jupyter找不到内核的问题

问题描述 之前可以选择内核&#xff08;可能要先 “Python: 选择解释器”&#xff0c;也可能不用&#xff09;&#xff0c;并且是自己检测到 conda 环境中的 Python。 但是后来会突然找不到内核&#xff0c;点击选择内核&#xff0c;会在空白下加载很久&#xff0c;无果。 这…

MIPI联盟D-PHYv1.2规范阅读笔记二之物理层接口协议PPI

本文阅读自eetop.cn_mipi_D-PHY_specification_v1-2.pdf Logical PHY-Protocol Interface Description&#xff08;PHY物理层协议接口描述PPI&#xff09; PHY物理层协议接口被用于连接物理层和通信栈与更高层协议栈之间建立联系。 表 31 定义了物理层协议接口&#xff08;P…

day10JS-this的使用规则

1. this情况总结 开启严格模式&#xff1a; "use strict"; //开启严格模式 1.全局&#xff1a;非严格this--->window &#xff0c;严格 this--->window。 2.普通函数执行&#xff1a;函数名() 非严格this-->window &#xff0c;严格 this--->undefined…

全新的大语言模型Grok-2,最新测评!!

埃隆马斯克再次引发轰动&#xff0c;他旗下的xAI公司推出了全新的大语言模型Grok-2&#xff01; 最新的Grok-2测试版已经发布&#xff0c;用户可以在&#x1d54f;平台上体验小版本的Grok-2 mini。 马斯克还通过一种谜语般的方式揭开了困扰大模型社区一个多月的谜团&#xff1a…