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

一、模板方法

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

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

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

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

相关文章

把自己的垃圾代码发布到官方中央仓库

参考博客:将组件发布到maven中央仓库-CSDN博客 感谢这位博主。但是他的步骤有漏缺,相对进行补充 访问管理页面 网址:Maven Central 新注册账号,或者使用github快捷登录,建议使用github快捷登录 添加命名空间 注意&…

连接mysql的java代码

要在Java中连接MySQL数据库,你需要以下几个步骤: 导入MySQL JDBC驱动:在项目中添加MySQL JDBC驱动的依赖。如果你使用的是Maven,可以在pom.xml中添加依赖;如果使用的是Gradle,可以在build.gradle中添加依赖;如果不使用构建工具,需要手动下载驱动并添加到项目中。 编写J…

【Linux】进程通信实战 —— 进程池项目

送给大家一句话: 没有一颗星,会因为追求梦想而受伤,当你真心渴望某样东西时,整个宇宙都会来帮忙。 – 保罗・戈埃罗 《牧羊少年奇幻之旅》 🏕️🏕️🏕️🏕️🏕️🏕️ &a…

flink cdc mysql整理与总结

文章目录 一、业务中常见的需要数据同步的场景CDC是什么FlinkCDC是什么CDC原理为什么是FlinkCDC业务场景flink cdc对应flink的版本 二、模拟案例1.阿里云flink sql2.开源flink sql(单机模式)flink 安装安装mysql3.flink datastream 三、总结 提示:以下是本篇文章正文…

mac中文件夹怎么显示.git隐藏文件

1. 打开终端应用程序,然后进入到包含.git文件夹的目录,可以使用以下命令来显示隐藏文件和文件夹: defaults write com.apple.finder AppleShowAllFiles YES 2. 然后重启 Finder: killall Finder

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 …

工具方法 - 如何在网上找资料

在查询USB相关的技术资料时,官网的文档中心里找到个spec的记录,但下载链接没有。然后在Google上搜索: fileytpe:pdf my_keyword 只找到一个收费的文档下载网站,这让我不开心。 于是在Yandex上搜了下,找到了两个网站可以…

香橙派AIpro使用SSH远程登录

香橙派AIpro可以连接HDMI显示器使用,也可以远程登录。这里采用MobaXterm软件远程登录开发板。 首先要使得控制电脑和香橙派开发板连接到同一个局域网,两者的IP地址能够ping通。在Windows 下可以使用MobaXterm 远程登录开发板,首先新建一个ss…

属于程序员的浪漫,一颗会跳动的心!!!

绘制一颗会跳动的心❤ 嘿嘿 可以说是程序员的专属浪漫了吧,就像点燃一颗LED灯一样?(我瞎说的啊,大家别当真,我很菜的!!!!) 程序就在下面啦,然…

hive结合Hbase实现实时数据处理和批量分析

问题背景 Hive主要设计为一个用于大数据集的批处理查询引擎,并不是为实时查询或实时数据更新而设计的。它主要用于执行数据摘要、查询和分析。因此,Hive本身不支持实时数据更新或实时查询,它更适合用于对大量数据进行批量处理和分析。 分析…

Java8Stream

目录 什么是Stream? IO流: Java8Stream: 什么是流? stream图解 获取流 集合类,使用 Collection 接口下的 stream() 代码 数组类,使用 Arrays 中的 stream() 方法 代码 stream,使用 Stream 中的…

重生之 SpringBoot3 入门保姆级学习(02、打包部署)

重生之 SpringBoot3 入门保姆级学习(02、打包部署) 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…

自学动态规划—— 一和零

一和零 474. 一和零 - 力扣(LeetCode) 其实遇到这种还好说,我宁愿遇见这种,也不想遇见那些奇奇怪怪递推公式的题目。 这里其实相当背包要满足两个条件,所以我们可以将dp开成二维的,之后的操作&#xff0…

Kubernetes(K8S) 集群环境搭建指南

Kubernetes(简称K8s)是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。K8S环境搭建过程比较复杂,涉及到非常多组件安装和系统配置,本文将会详细介绍如何在服务器上搭建好Kubernetes集群环境。 在学习…

C语言---求一个整数存储在内存中的二进制中1的个数--3种方法

//编写代码实现:求一个整数存储在内存中的二进制中1的个数 //第一种写法 /*int count_bit_one(unsigned int n) {int count 0;while (n )//除到最后余数是0,那么这个循环就结束了{//这个题就是可以想成求15的二进制的过程//每次都除以2,余数…

跟小伙伴们说一下

因为很忙,有一段时间没有更新了,这次先把菜鸟教程停更一下,因为自己要查缺补漏一些细节问题,而且为了方便大家0基础也想学C语言,这里打算给大家开一个免费专栏,这里大家就可以好好学习啦,哪怕0基…

面试题·栈和队列的相互实现·详解

A. 用队列实现栈 用队列实现栈 实现代码如下 看着是队列,其实实际实现更接近数组模拟 typedef struct {int* queue1; // 第一个队列int* queue2; // 第二个队列int size; // 栈的大小int front1, rear1, front2, rear2; // 两个队列的首尾指针 } MyS…

图像处理ASIC设计方法 笔记25 红外成像技术:未来视觉的革命

在当今科技飞速发展的时代,红外成像技术以其独特的优势,在医疗、工业检测等多个领域扮演着越来越重要的角色。本章节(P146 第7章红外焦平面非均匀性校正SoC)将深入探讨红外成像系统中的关键技术——非均匀性校正SoC,以及它如何推动红外成像技术迈向新的高度。 红外成像系统…

6.Redis之String命令

1.String类型基本介绍 redis 所有的 key 都是字符串, value 的类型是存在差异的~~ 一般来说,redis 遇到乱码问题的概率更小~~ Redis 中的字符串,直接就是按照二进制数据的方式存储的. (不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文…