设计模式在芯片验证中的应用——模板方法

一、模板方法

模板方法(Template Method)设计模式是一种行为设计模式, 它在父类中定义了一个功能的框架, 允许子类在不修改结构的情况下重写功能的特定步骤。也就是模板方法定义了一组有序执行的操作,将一些步骤的实现留给子类,同时保持整体功能结构。该技术通常也用于为主要操作提供预处理和后处理的钩子(hook)。

UVM库用了很多模板方法,比如uvm_sequence里的pre_body()和post_body()就是body()方法的钩子,在分别允许用户在body()执行之前和之后做一些其它处理。

模板方法设计模式主要包括以下几个组件:

  • 抽象类 (Abstract­Class):会声明完成一个功能所需各个步骤的方法, 以及依次调用它们实际步骤。 功能步骤可以被声明为抽象类型, 也可以提供一些默认实现。另外也可以提供一些放在主要功能步骤之前或之后的可选步骤方法(钩子),这些方法为子类提供额外的功能扩展点。
  • 具体类 (Concrete­Class):可以重写所有步骤实现, 但不能重写模板方法自身执行各个步骤方法的顺序。

我们以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 : new

    task collect_transactions();
        pre_collect();
        collect();
        post_collect();
    endtask : collect_transactions

    virtual task pre_collect();
        `uvm_info("PRE_COLLECT", "EMPTY method", UVM_LOW)
    endtask : pre_collect

    task collect();
        `uvm_info("COLLECT", "collect begin", UVM_LOW)
        `uvm_info("COLLECT", "collect end", UVM_LOW)
    endtask : collect

    virtual task post_collect();
        `uvm_info("POST_COLLECT", "EMPTY method", UVM_LOW)
    endtask : post_collect

endclass : 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 : new

    virtual task pre_collect();
        `uvm_info("PRE_COLLECT", "PRE: collect item", UVM_LOW)
    endtask : pre_collect

    virtual task post_collect();
        `uvm_info("POST_COLLECT", "POST: collect item", UVM_LOW)
    endtask : post_collect

endclass : 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()之前和之后合适的地方被调用了。

模板方法的通常使用方式就是定义一个基本的抽象类,并且指定哪些抽象方法需要再子类中实现。模板方法的主要缺点就是,如果父类和子类都实现了复杂的功能,调试起来将非常麻烦。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6818 android 修改开机 logo, 编译脚本分析

问题: 客户需要去掉 android5.1 的开机logo. 说明: 对于Android5.1 来说,uboot 与kernel 的logo 是一个。 过程: 其实对于开机logo 的修改很简单,直接参考厂家手册就可以了。 这是 android4.4 的开机logo 的修改&…

Ps:消失点滤镜 - 导出 3D 信息

Ps菜单:滤镜/消失点 Filter/Vanishing Point 快捷键:Ctrl Alt V “消失点”滤镜的导出 Export功能允许用户将创建的 3D 信息(包括平面、纹理和测量)导出为兼容 CAD、建模、动画和特殊效果应用程序的格式。这使得 Photoshop 与其…

上位机图像处理和嵌入式模块部署(f103 mcu和Qt上位机联动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前我们写过一篇文章​​​​​​​,上面说的是如何利用串口对mcu进行控制,即如果利用串口实现mcu led灯的点亮和熄灭。输…

【开源】租房管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 租客屋主模块 房源信息模块 租客评价模块 房源订单模块 留言板模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的租房管理系统,分为管理后台和用户网页端,可以给管理员、租客和屋主角色使用&#xff0c…

深入JVM元空间以及弹性伸缩机制

个人博客 深入JVM元空间以及弹性伸缩机制 | iwts’s blog JVM内存模型中元空间所在位置 即在JVM运行时的内存模型。总体上有这样的图: 元空间 上面的图其实有点不太准。方法区本质上只是JVM的一个标准,不同JVM在不同版本下都可能有不同的实现&#x…

民国漫画杂志《时代漫画》第25期.PDF

时代漫画25.PDF: https://url03.ctfile.com/f/1779803-1248635084-fd4794?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

2024年上半年软件系统架构师考试【回忆版】

文章目录 考试时间考试地点综合知识案例分析1、微服务架构的优点和缺点2、质量属性的6个要素3、分布式锁 Redis的缺点4、MongoDB 存储矢量图的优势 论文回忆版论文一、论单元测试的设计与应用论文二、论大数据模型的设计与应用论文三、论模型驱动的架构设计及应用论文四、论云原…

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥(Bridge)5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机(电脑)上运行多个服务&…

kali基本扫描工具(自带)

免责声明:本文仅做技术交流与学习...请勿非法破坏... 详细用法: 命令 -h/百度/翻译 fping 用法 hostlist 文件里面为ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 输出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

ES 查询踩坑-全字段匹配

需求:name字段需要全匹配查询 name的映射 普通的must查询 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

数据结构--《二叉树》

二叉树 1、什么是二叉树 二叉树(Binar Tree)是n(n>0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树构成。 这里给张图,能更直观的感受二叉树&#xff1…

异步那些事01

首先我们肯定先说创建线程 1.继承Thread类 o定义一个类MyThread继承Thread类 o在MyThread类中重写run()方法 o创建MyThread类的对象 o启动线程 package Java.thread;public class first extends Thread{public void run(){for(int i0;i<50;i){System.out.println("我…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Vapor Mode:Vue.js 的速度与激情,代码界的闪电侠

大家好&#xff0c;我是宝哥。 在快速发展的网络开发世界中&#xff0c;创新的Vue.js团队给我们带来了Vapor Mode。这个新模式优化了Vue的核心渲染过程&#xff0c;帮助我们的应用程序像轻烟一样运行&#xff0c;开发者无需深入复杂的优化工作。 在这篇文章中&#xff0c;我们将…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读&#xff1a;详细分析ping的基本知识以及常见网络故障的诊断&#xff08;图文解析&#xff09; 1. 安装配置 针对Window的下载如下&#xff1a; 安装路径&#xff1a;tcping官网 下载tcping.exe&a…

【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 学生管理模块 教师管理模块 竞赛信息模块 竞赛报名模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的大学生竞赛管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、学生和教师角色使用&#xff0c;包括学…

STM32手写超频到128M函数

今天学习了野火的STM32教程学会了如何设置STM32的时钟频率&#xff0c;步骤比较详细&#xff0c;也很容易理解&#xff0c;就是视频教程不能跳着看&#xff0c;只能一节节的看&#xff0c;不然会知识不连贯&#xff0c;造成有些知识不理解&#xff0c;连续着看还是没有什么难度…

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi&#xff0c;文心一言&#xff0c;chatGPT等市面上主流的大模型&#xff0c;我们的大模型也支持同一个用户的多个会话&#xff0c;并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…