设计模式在芯片验证中的应用——备忘录

1. 前言

软件设计模式定义了一组类和它们之间的关系,它们相互作用用以解决软件开发过程中面临的常见问题。由于验证工程师所做工作的重要部分包括使用面向对象语言(如SystemVerilog)进行编码,因此许多遇到的挑战都适合应用特定的设计模式来解决。将它们应用到代码中,有助于代码的可重用性和可维护性,从而提高了整体代码质量。本文介绍备忘录(亦称: 快照、Snapshot、Memento)在验证环境中的使用,来对设计逻辑中实现的特性进行建模。

2. 备忘录

备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。在软件开发环境中,它在应用程序中提供了撤销机制,促进了数据的隐藏,并且不违背封装原则。在验证环境中,它可以用来对需要“恢复的场景”进行建模。举个例子,如下图所示,比如Arm CPU运行在状态pstate1下,这时候突然来了个中断导致它切换到状态pstate2,中断可能嵌套,继续切换到状态pstate3、pstate4、pstate5等等,中断处理结束后,需要返回到之前的运行状态。因此在中断切换状态时需要保存当前的CPU状态信息,这样才能在中断处理完成后,根据历史保存的CPU状态信息切换回来。备忘录模式提供了很好的建模方式。

备忘录模式提供了三个主要组件:

Memento:表示要保存和恢复的内容的容器类,在上图示例中Memento类包含pstate的状态和相应的get/set方法。

Originator:使用Memento类来保存当前的状态。它类似于这里CPU的角色。

Caretaker:请求Originator保存状态,且它直到所有保存的状态,并且可以请求恢复到历史的某个状态。

下图使用UML类图提供了上述三者之间的图形化关系,如何看懂UML类图大家可以自行搜索下资料。

3. 参考代码

CPU处理中断进入和返回状态的参考代码如下:

typedef struct packed {bit [3:0] nzcv;bit [1:0] currentel;bit       tco;
} pstate_t;class memento extends uvm_object;`uvm_object_utils (memento)local pstate_t pstate;function new (string name = "memento");super.new(name);endfunction : newfunction void set_pstate(pstate_t _pstate);this.pstate = _pstate;endfunction : set_pstatefunction pstate_t get_pstate();return pstate;endfunction : get_pstateendclass : mementoclass originator extends uvm_object;`uvm_object_utils (originator)local pstate_t pstate;function new (string name = "originator");super.new(name);endfunction : newfunction void change();pstate = $random();endfunction : changefunction memento create_snapshot();memento m_memento = memento::type_id::create("m_memento");m_memento.set_pstate(pstate);`uvm_info("[snapshot pstate:]", $psprintf("nzcv:'b%b, currentel:'b%b, tco:'b%b", pstate.nzcv, pstate.currentel, pstate.tco), UVM_LOW)return m_memento;endfunctionfunction void restore (memento _snapshot);pstate = _snapshot.get_pstate();`uvm_info("[restore pstate:]", $psprintf("nzcv:'b%b, currentel:'b%b, tco:'b%b", pstate.nzcv, pstate.currentel, pstate.tco), UVM_LOW)endfunction : restoreendclass : originatorclass caretaker extends uvm_object;`uvm_object_utils (caretaker)local memento    memento_q[$];local originator m_orig;function new (string name = "caretaker");super.new(name);endfunction : newfunction void set_originator(originator _m_orig);m_orig = _m_orig;endfunction : set_originatorfunction void dosomething();memento_q.push_back(m_orig.create_snapshot);m_orig.change();endfunction : dosomethingfunction void undo(int unsigned _index);if (_index > memento_q.size() || memento_q.size() == 0 ) $fatal;m_orig.restore(memento_q[_index]);endfunction : undoendclass : caretaker

模拟测试代码如下:

class monitor;function void test();caretaker  m_caretaker  = caretaker::type_id::create("m_caretaker");originator m_originator = originator::type_id::create("m_originator");m_caretaker.set_originator(m_originator);m_caretaker.dosomething(); // snapshot0m_caretaker.dosomething(); // snapshot1m_caretaker.dosomething(); // snapshot2m_caretaker.dosomething(); // snapshot3m_caretaker.undo(1);m_caretaker.dosomething(); // snapshot4m_caretaker.undo(3);endfunction : testendclass : monitor

输出仿真结果如下:

[[snapshot pstate:]] nzcv:'b0000, currentel:'b00, tco:'b0
[[snapshot pstate:]] nzcv:'b0100, currentel:'b10, tco:'b0
[[snapshot pstate:]] nzcv:'b0000, currentel:'b00, tco:'b1
[[snapshot pstate:]] nzcv:'b0001, currentel:'b00, tco:'b1
[[restore pstate:]] nzcv:'b0100, currentel:'b10, tco:'b0
[[snapshot pstate:]] nzcv:'b0100, currentel:'b10, tco:'b0
[[restore pstate:]] nzcv:'b0001, currentel:'b00, tco:'b1

在提供的示例中,保存和恢复动作是由中断进入和中断退出事件触发的。在UVM中,事件由监视器(monitor)发出的,该监视器观察中断接口并使用Memento设计模式。该例子支持保存和恢复多个CPU状态。遇到中断时,caretaker的do_something()函数在开始时就把当前的pstate存储到memento里,然后进行其它的中断处理动作,相当于备份了历史状态。如果中断结束了,caretaker的undo()函数可以指定返回到哪个历史状态。

下次给大家分享下设计模式中责任链模式(Chain of Responsibility)在芯片验证中的应用。

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

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

相关文章

SCCM部署时遇到的问题:无法连接到SQL Server

根据提示信息逐一排除以下问题: 1、确保SQL服务器名称是否正确。 2、确保TCP1433和4022端口有没有被防火墙屏蔽。 3、站点服务器帐号加入SQLServer的sysadmin角色成员里 、确保SQL实例没有使用动态端口,可参考: Configure SQL Server to…

贪心 Leetcode 763 划分字母区间

划分字母区间 Leetcode 763 学习记录自代码随想录 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返…

重新启动vue-shop-maseter主支任务

以下是命令行,cmd任务管理程序进程中… 这部分是部分源码,用H5编辑器写的 等待慢慢启动重启中。。。。 然而没有反应,不知道为什么? 花里胡哨的,更加没看懂了。 我这暴脾气,气得我直接一顿乱敲 要怎…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择?地域是指云服务器所在物理数据中心的位置,地域选择就近选择,访客距离地域所在城市越近网络延迟越低,速度就越快;可用区是指同一个地域下,网络和电力相互独立的区域&#…

iostat命令详解

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 iostat是一个使用频率较高的命令,主要用来统计和输出CPU和磁盘IO信息。它的安装很简单: # yum -y insta…

【PyQt】16-剪切板的使用

文章目录 前言一、代码疑惑快捷键 二、现象2.1 复制粘贴文本复制粘贴 2.2 复制粘贴图片复制粘贴 2.3 复制粘贴网页 总结 前言 1、剪切板的使用 2、pycharm的编译快捷键 3、类的属性和普通变量的关系 4、pyqt应该养成的编程习惯-体现在代码里了,自己看看。 一、代码…

PyTorch搭建LeNet测试集实现

搭建神经网络请看PyTorch搭建LeNet神经网络-CSDN博客 实现训练集请看PyTorch搭建LeNet训练集详细实现-CSDN博客 测试集比较简单,直接上代码。 代码实现 # 导包 不必多说 import torch import torchvision.transforms as transforms from PIL import Image from …

Python函数嵌套与参数你学会了吗

如何在函数中调用其他函数,以及如何定义和使用函数参数。函数嵌套可以调用其他函数,参数列表用于封装函数中的未知数据,参数在函数调用时被替换。形参和实参数量需一致,但名字可以相同。 1.函数嵌套 一个函数中可以调用别的函数 …

分布式搜索引擎-elasticsearch基础

分布式搜索引擎-elasticsearch基础 1、什么是elasticsearch? elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK&a…

个人博客系列-后端项目-用户验证(5)

介绍 创建系统管理app,用于管理系统的用户,角色,权限,登录等功能,项目中将使用django-rest_framework进行用户认证和权限解析。这里将完成用户认证 用户验证 rest_framework.authentication模块中的认证类&#xff…

【C++】priority_queue和仿函数

priority_queue翻译过来就是优先队列,其实就是我们数据结构中的堆。堆这个东西之前也说过,它分为大根堆和小根堆,它的底层是一个类似数组的连续的空间,逻辑结构是一个完全二叉树,这个完全二叉树如果是小根堆的话父亲小…

Vue-03

Vue指令 v-bind 作用:动态设置html的标签属性(src url title…) 语法:v-bind:属性名"表达式" 举例代码如下: 实现效果如下: 案例:图片切换 实现代码如下: 实现的效果…

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同? 3、为什么MySQL选用Redis作为缓存? 4、详细聊聊你对Redis各种数据类型的了解? 5、Redis中五种基本数据类型的底层数据结构是什么样的? Redis线程模型…

好物周刊#43:设计素材下载

https://yuque.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. frp 一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c…

大华IPC网络摄像机如何保存视频

一、背景 通常网络相机(IPC)不会自带存储功能,需要接入录像机(NVR)进行保存。 其中NVR也分软件存储及硬件存储,这里不提,这边单独说FTP存储 二、配置前提 要配置FTP存储需要:①网络…

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型,可以绘制动漫、3D、科幻、真实等类型的图片。 …

【开源物联网平台】FastBee认证方式和MQTT主题设计

🌈 个人主页:帐篷Li 🔥 系列专栏:FastBee物联网开源项目 💪🏻 专注于简单,易用,可拓展,低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…

Unity 动画(旧版-新版)

旧版 旧版-动画组件:Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…

C语言学习--摩尔投票算法

目录 1.引入 2.摩尔投票算法 3.具体步骤 3.1抵消阶段 3.2检验过程 4.代码实现 5.总结 1.引入 今天做题看到一个解题思路真的看不懂&#xff0c;一艘才知道是这个算法。 int majorityElement(int* nums, int numsSize) { int notenums[0]; int count1; for(int i1;i<n…