设计模式在芯片验证中的应用——模板方法
一、模板方法
模板方法(Template Method)设计模式是一种行为设计模式, 它在父类中定义了一个功能的框架, 允许子类在不修改结构的情况下重写功能的特定步骤。也就是模板方法定义了一组有序执行的操作,将一些步骤的实现留给子类,同时保持整体功能结构。该技术通常也用于为主要操作提供预处理和后处理的钩子(hook)。
UVM库用了很多模板方法,比如uvm_sequence里的pre_body()和post_body()就是body()方法的钩子,在分别允许用户在body()执行之前和之后做一些其它处理。
模板方法设计模式主要包括以下几个组件:
- 抽象类 (AbstractClass):会声明完成一个功能所需各个步骤的方法, 以及依次调用它们实际步骤。 功能步骤可以被声明为抽象类型, 也可以提供一些默认实现。另外也可以提供一些放在主要功能步骤之前或之后的可选步骤方法(钩子),这些方法为子类提供额外的功能扩展点。
- 具体类 (ConcreteClass):可以重写所有步骤实现, 但不能重写模板方法自身执行各个步骤方法的顺序。
我们以UVM中的monitor来举个模板方法应用的例子,利用模板方法可以扩展monitor主要功能,而且不容易误破坏monitor主功能。在base monitor组件中定义了非virtual的collect_transactions()模板方法,并提供了空的pre_collect()和post_ collect ()钩子方法。在继承的子monitor中,通过实现pre_ collect ()和post_ collect ()的具体内容,来提供了特定项目需求的操作。然后使用UVM factory方法将子monitor的对象去替换base monitor的对象。
下图为模板方法设计模式在monitor中应用的UML类图。

二、参考代码
monitor的模板方法设计模式参考代码如下:
class base_monitor extends uvm_monitor;`uvm_component_utils (base_monitor)function new(string name = " base_monitor ", uvm_component parent=null);super.new(name, parent);endfunction : newtask collect_transactions();pre_collect();collect();post_collect();endtask : collect_transactionsvirtual task pre_collect();`uvm_info("PRE_COLLECT", "EMPTY method", UVM_LOW)endtask : pre_collecttask collect();`uvm_info("COLLECT", "collect begin", UVM_LOW)`uvm_info("COLLECT", "collect end", UVM_LOW)endtask : collectvirtual task post_collect();`uvm_info("POST_COLLECT", "EMPTY method", UVM_LOW)endtask : post_collectendclass : base_monitor
模板方法设计模式-具有空钩子的base monitor
class son_monitor extends base_monitor;`uvm_component_utils (son_monitor)function new(string name = " son_monitor ", uvm_component parent=null);super.new(name, parent);endfunction : newvirtual task pre_collect();`uvm_info("PRE_COLLECT", "PRE: collect item", UVM_LOW)endtask : pre_collectvirtual task post_collect();`uvm_info("POST_COLLECT", "POST: collect item", UVM_LOW)endtask : post_collectendclass : son_monitor
模板方法设计模式-带有实现钩子的son monitor
模拟测试代码如下:
// Use UVM factory overrde in the uvm_env
set_type_override_by_type(base_monitor::get_type(), son_monitor::get_type(), 'b0);
输出仿真日志如下:
| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] EMPTY method| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect begin| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [POST_COLLECT] EMPTY method
模板方法设计模式-带有空钩子的base monitor的输出结果
| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] PRE: collect item| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect begin| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end| # UVM_INFO @ 0.000ns: uvm_test_top.env.agent.mon_h [POST_COLLECT] POST: collect item
模板方法设计模式-带有实现钩子的子monitor的输出结果
输出仿真文件显示了模板方法模式的效果。在前者中,消息由具有空pre_collect()和post_collect()钩子的base monitor生成。在后一种情况下,将使用子monitor的实例,并使用已实现的钩子,这些钩子可用于特定于项目的处理,且无需修改base monitor的代码。子monitor主要的collect()方法继承自base monitor,因此两种情况下保持一致。模板方法collect_transactions()确保钩子会在主函数collect()之前和之后合适的地方被调用了。
模板方法的通常使用方式就是定义一个基本的抽象类,并且指定哪些抽象方法需要再子类中实现。模板方法的主要缺点就是,如果父类和子类都实现了复杂的功能,调试起来将非常麻烦。

相关文章:
设计模式在芯片验证中的应用——模板方法
一、模板方法 模板方法(Template Method)设计模式是一种行为设计模式, 它在父类中定义了一个功能的框架, 允许子类在不修改结构的情况下重写功能的特定步骤。也就是模板方法定义了一组有序执行的操作,将一些步骤的实现留给子类,同…...
Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一个用于可视化的工具,它可以帮助你分析Webpack打包后的输出文件,查看哪些模块占用了最多的空间,从而进行优化。 2500G计算机入门到高级架构师开发资料超级大礼包免费送! 首先,你需要安装W…...
Java后端开发学习历程
1、JavaWeb------------------------>19天 2、SSMSpringBoot------------->12天 3、瑞吉外卖项目------------------>15天 4、JavaSE-------------------------->25天 总耗时71天(2024.03.11——2024.05.26两个半月),Java后端…...
CentOS 7 socat命令端口转发
场景 开发排查问题需配置远程调试,但配置调试的服务器不支持外网访问,于是就考虑到用端口转发的方式让开发进行远程调试,转发工具比如有:rinetd等等,意外看到使用socat做转发更简单方便,下面就记录一下 命令简介 socat 是一个功能强大的网络工具,可以在两个连接的数据…...
vue全局修改设置滚动条样式
vue全局修改设置滚动条样式 具体代码: ::-webkit-scrollbar{ /*滚动条整体样式*/width: 6px; /*高宽分别对应横竖滚动条的尺寸*/height: 1px; } ::-webkit-scrollbar-thumb{ /*滚动条里面小方块*/border-radius: 5px;background: #cfcbcb; } ::-webkit-scrollbar-…...
✨聚梦AI绘图插件-for photoshop(基于ComfyUI) 内测版V0.1发布
🎈背景 photoshop本身是有AI生成能力的,不过限于种种原因,国内使用很不方便。 photoshop也是有AI插件的,不过大多安装起来比较复杂,或者,干脆就会收费。 所以我们做了一个免费的AI插件,期望能…...
java “错误:编码GBK 的不可映射字符”
环境:JDK-17 本机编码:utf-8 代码编码:GBK 错误:java “错误:编码GBK 的不可映射字符” 解决1:记事本打开java源文件,另存为选择ANSI编码 解决2:复制代码再将编码格式改为utf-8,…...
前端 JS 经典:Web 性能指标
什么是性能指标:Web Performance Metrics 翻译成 Web 性能指标,一般和时间有关系,在短时间内做更多有意义的事情。 一个站点表现得好与不好,标准在于用户体验,而用户体验好不好,有一套 RAIL 模型来衡量。这…...
SVN创建分支,分支合并,切换分支。通俗易懂
1、首先在svnbucket.com远程仓库上创建项目,这里我创建了个测试demo: 2、先把svn仓库的项目检出到自己的文件夹,我这里是demo001文件夹,此时并没有创建truck, branches, tags这三个目录: 3、 在demo001文件夹里新建tru…...
【编译原理复习笔记】中间语言
中间语言 中间语言的特点和作用 (1)独立于机器 (2)复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示:抽象语法树,有向无环图 三地址代…...
linux笔记6--shell相关
文章目录 1. 查看当前的shell类型2. ps -f命令3. 父子shell4. 分号在命令里的作用问题:环境变量echo: 5. sleep和jobssleep:jobs:例子:&: 6. 外部命令和内建命令图解外部命令type命令 7. history命令8. alias命令9. 推荐 1. 查看当前的sh…...
链表-线性表的链式表示
链表-线性表的链式表示 #mermaid-svg-ozpXrKnNCyYdqHvN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-icon{fill:#552222;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-text{fill:#552222;stro…...
GNU/Linux - 时区设置
CST China Standard Time 北京时间/中国标准时间 在时区划分上,属东八区,比协调世界时早 8 小时,记为 UTC8 GMT Greenwich Mean Time 格林威治标准时间 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定…...
红队攻防渗透技术实战流程:云安全之云原生安全:内核漏洞和版本漏洞
红队云攻防实战 1. 云原生安全 -Docker安全-容器逃逸-版本漏洞1.1 容器逃逸-版本漏洞-runC容器逃逸1.2 实战案例-版本漏洞-runC容器逃逸1.3 容器逃逸-版本漏洞-containerd逃逸1.4 实战案例-版本漏洞-containerd逃逸1.5 Docker安全-容器逃逸-CDK自动化1.6 Docker安全-容器逃逸-c…...
spring状态机实战
一、什么是状态机 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,是一种概念性机器,它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。状态…...
Ubuntu系统上安装NVIDIA驱动【笔记】
Ubuntu上安装NVIDIA驱动,您可以按照以下步骤操作: 首先,您需要配置软件源(根据情况配置,否则影响更新和下载速度)。 接下来,您可以按照上一条回答中的步骤来安装新的NVIDIA驱动。首先ÿ…...
生成式AI导论2024-李宏毅
生成式AI导论2024-李宏毅 第0讲: 课程说明第1讲:生成式AI是什么第2講:今日的生成式人工智慧厲害在哪裡?從「工具」變為「工具人」 第0讲: 课程说明 生成式AI的入门课程 第1讲:生成式AI是什么 生成式人…...
跨平台之用VisualStudio开发APK嵌入OpenCV(三)
本篇将包含以下内容: 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门,我们直接使用真机进行调试,一方面运行速度远高于模拟器,另一方面模拟器使用的…...
渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP
概述 为什么要隐藏IP 在拿下了目标机之后,目标机在内网里面,使用msf或者CS时,用自己的VPS做服务器的话,导致很容易被溯源。 域名上线原理 当我们访问域名时会经过域名解析 域名解析就是域名到IP地址的转换过程,那么…...
vue.js对接海康威视摄像头web开发包
一、登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…...
Python 3.7 + XGBoost 多分类实战:从数据清洗到SHAP模型解释的保姆级教程
Python 3.7 XGBoost 多分类实战:从数据清洗到SHAP模型解释的保姆级教程在机器学习领域,XGBoost因其出色的性能和可解释性成为众多数据科学家的首选工具。本文将带您完整走过多分类任务的全流程,从原始数据到可解释的预测模型,每个…...
从Gamma函数到泊松分布:一个概率论中的含参量积分实用案例解析
Gamma函数与泊松分布:概率论中的数学之美 在数据科学和机器学习的实践中,概率分布构成了建模的基石。当我们深入探究这些分布背后的数学原理时,Gamma函数以其优雅的性质和广泛的应用脱颖而出。它不仅连接了离散与连续概率世界,更在…...
适合地产人用的中介房源管理系统
在房产经纪行业,房源管理与客源管理是经纪人日常工作的核心,直接影响业务效率与成交转化。选择一套适配行业需求的中介房源管理系统,能帮助中介团队规范流程、降低运营成本、大幅提升业绩。今天我们以客观视角,详细解析全房源系统…...
ShrinkBox后门攻击:如何让自动驾驶模型“看错”距离,威胁ML-ADAS安全
1. 项目概述在自动驾驶和高级驾驶辅助系统(ADAS)领域,基于机器学习的目标检测模型,如YOLO系列,已成为感知环境、实现碰撞预警的核心组件。这些模型通过实时识别和定位道路上的车辆、行人等目标,为后续的距离…...
Elden Ring帧率解锁终极指南:从60帧到144+的完整教程
Elden Ring帧率解锁终极指南:从60帧到144的完整教程 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_mirrors/el/Elden…...
利用FTDI芯片MPSSE模式构建Arduino兼容开发环境
1. 项目概述:当FTDI芯片遇上Arduino生态如果你手头有一些闲置的FTDI USB转串口模块,比如常见的FT232R、FT2232H,或者像我一样,从某个旧设备上拆下来一块FT2232C的老古董,除了用来给单片机烧录程序或者做串口调试&#…...
基于TESS光变曲线与深度学习的O型星物理参数预测研究
1. 项目概述与核心挑战在恒星天体物理研究中,大质量O型星扮演着至关重要的角色。它们不仅是宇宙中光度最高的天体之一,其强烈的辐射、恒星风和最终的超新星爆发,更是驱动星系化学演化和能量注入星际介质的关键引擎。然而,深入理解…...
基于LSTM自编码器的家用电器功耗异常检测系统构建指南
1. 项目概述:从能耗洞察到智能干预我们每天都在和各种家用电器打交道,从清晨唤醒你的咖啡机,到深夜还在默默工作的路由器。你有没有想过,这些看似微不足道的设备,其背后隐藏的能耗模式,其实大有文章&#x…...
别再纠结了!给激光焊接新手讲透单模和多模激光到底怎么选(附M²因子解读)
激光焊接设备选型指南:单模与多模激光的实战抉择 当你第一次站在激光焊接设备采购的十字路口,面对"单模"和"多模"这两个专业术语时,那种迷茫感我深有体会。五年前,我作为产线技术负责人,需要为汽车…...
CentOS 8/Stream 8系统DNF换源后,安装软件还是慢?试试这几个排查命令和优化技巧
CentOS 8/Stream 8系统DNF换源后安装缓慢的深度排查与优化指南当你已经按照教程将CentOS 8/Stream 8的DNF源切换为国内镜像,却发现软件安装速度依然不尽如人意时,这种体验确实令人沮丧。作为长期使用CentOS系统的技术专家,我完全理解这种&quo…...
