设计模式在芯片验证中的应用——状态

一、状态模式

状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

在RTL中可能存在复杂的有限状态机FSM,在任何一个特定状态中, RTL的行为都不相同, 且可从一个状态切换到另一个状态。 不过, 根据当前状态, RTL可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。

为了对RTL FSM进行建模,状态设计模式建议将每个状态的行为抽象成一个类,状态之间的切换相当于就是类对象的切换。主要可包括以下几个组件:

  • Context:它并不会自行实现所有行为, 而是会保存一个指向表示当前状态的状态对象的引用, 且将所有与状态相关的工作委派给该对象。
  • State:所有状态类的基类,所有状态类都必须遵循同样的接口, 而且context必须仅通过state提供的接口函数与这些对象进行交互。
  • Concrete States:会自行实现特定于状态的方法。 为了避免多个状态中包含相似代码, 你可以提供一个封装有部分通用行为的中间抽象类。状态对象可存储对于上下文对象的反向引用。 状态可以通过该引用从上下文处获取所需信息, 并且能触发状态转移。

 

下图为状态设计模式在FSM中应用的一个UML类图。

de6e2ed6960c4b66ab6a121c54e614f1.png

 

二、参考代码

状态设计模式的参考代码如下:

typedef class fsm_context;
typedef class concrete_state1;
typedef class concrete_state2;

virtual class state;
    pure virtual function int process1(fsm_context cnxt);
    pure virtual function int process2(fsm_context cnxt);
endclass : state

class concrete_state1 extends state;
    function int process1(fsm_context cnxt);
        $display("concrete_state1 : process1");
        if ( cnxt.change_state ) begin
            concrete_state2 state2 = new();
            $display("concrete_state1 change to concrete_state2");
            cnxt.st = state2;
        end
    endfunction : process1

    function int process2(fsm_context cnxt);
        $display("concrete_state1 : process2");
        if ( cnxt.change_state ) begin
            concrete_state2 state2 = new();
            $display("concrete_state1 change to concrete_state2");
            cnxt.st = state2;
        end
    endfunction : process2

endclass : concrete_state1

class concrete_state2 extends state;
    function int process1(fsm_context cnxt);
        $display("concrete_state2 : process1");
        if ( cnxt.change_state ) begin
            concrete_state1 state1 = new();
            $display("concrete_state2 change to concrete_state1");
            cnxt.st = state1;
        end
    endfunction : process1

    function int process2(fsm_context cnxt);
        $display("concrete_state2 : process2");
        if ( cnxt.change_state ) begin
            concrete_state1 state1 = new();
            $display("concrete_state2 change to concrete_state1");
            cnxt.st = state1;
        end
    endfunction : process2

endclass : concrete_state2



class fsm_context;

    state st;

    function bit change_state();
        return 1; // for simplicity
    endfunction : change_state

    function void process_req1 (/*interface signals*/);
        st.process1(this /*, interface signals*/);
    endfunction : process_req1

    function void process_req2 (/*interface signals*/);
        st.process2(this /*, interface signals*/);
    endfunction : process_req2

endclass : fsm_context

 

模拟测试代码如下:

fsm_context fsm_st = new();
fsm_st.st = concrete_state1::new();
fsm_st.process_req1();
fsm_st.process_req2();

 

使用Questasim仿真输出日志如下:

 | # concrete_state1 : process1
 | # concrete_state1 change to concrete_state2
 | # concrete_state2 : process2
 | # concrete_state2 change to concrete_state1

 

a7e3361591954200862584609ebf9e16.jpeg

 

 

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

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

相关文章

【前缀和算法】--- 一维和二维前缀和模板

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…

【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用

文章目录 局域网 LAN广域网 WAN网络中的重要概念IP 地址端口号 认识协议协议分层是什么OSI 七层网络模型TCP/IP 五层网络模型(或四层)物理层传输层网络层数据链表层应用层网络设备所在分层 封装和分用[站在发送方视角](封装)[站在…

邮票孔拼版制作方法

邮票孔拼版制作方法 拼版后的局部图:(中间用连接桥的方式,此方式能最少程度上减少残留) 2)拼版后的效果图 3)邮票孔拼版规则: 拼板与板间距1.2MM或者1.6MM 等邮票孔:8个0.55MM的孔,孔间距0.2MM加两排,邮票孔伸到…

linux服务 学习

服务(Service) 在Linux操作系统中,服务(Service)是一个基本概念,它通常指的是运行在后台的、持续提供特定功能或资源给系统内部组件或者网络上的客户端程序。 这些服务是系统正常运行和提供各种功能的关键…

【三维重建汇总】NeRF和GS重建中,如何排除干扰物?(提升质量)

汇总最近NeRF与GS提升质量的论文 文章目录 前言一、NeRF On-the-go:利用不确定性落地真实世界(CVPR24)摘要1.DINOv2特征的不确定性预测2.NeRF中干扰物去除的不确定性3.优化4. Dilated Patch 扩大采样5.实验结果 二、Pixel-GS:像素感知的梯度密…

关于nginx标准配置参数介绍

标准配置参数: user root;#配置用户或者组,默认为nobody worker_processes 4;#允许生成的进程数,默认为1 项目中nginx.conf配置文件 user root; worker_processes 4; //最大的进程数,要看服务器的内核是多少核的&#xff0…

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑,提示如下,但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…

解决k8s分布式集群,子节点加入到主节点失败的问题

1.问题情况 Master主节点在 使用 kubeadm init 成功进行初始化后,如下所示 Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/k…

【Qt】 常用控件QLCDNumber

常用控件QLCDNumber QLCDNumber是一个专门用来显示数字的控件,类似于“老式计算机”的效果。 QLCDNumber的属性 属性说明 intValue QLCDNumber 显⽰的数字值(int). value QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, i…

玩转单例模式

目录 1. 饿汉式 2. 懒汉式 3. volatile解决指令重排序 4. 反射破坏单例模式 5. 枚举实现单例模式 6. 枚举实现单例模式的好处 7. 尝试反射破坏枚举 8. CAS实现单例模式 所谓单例模式,就是是某个类的实例对象只能被创建一次,单例模式有多种实现方…

【安全工具推荐-Search_Viewer资产测绘】

目录 一、工具介绍 二、工具配置 三、传送门 一、工具介绍 Search_Viewer,集Fofa、Hunter鹰图、Shodan、360 quake、Zoomeye 钟馗之眼、censys 为一体的空间测绘gui图形界面化工具,支持一键采集爬取和导出fofa、shodan等数据,方便快捷查看…

批发供应系统:提升效率与竞争力的关键

在当今复杂多变的商业环境中,批发供应系统作为连接生产商、分销商与零售商的重要纽带,其效率与智能化水平直接决定了供应链的运作效率与市场竞争力。随着信息技术的飞速发展,尤其是大数据、云计算、人工智能(AI)及物联…

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现(一) 本系统是简易的宠物收养系统,为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现(组件导航使用) 官方文档:组…

Qt系列之数据库(三)补充篇

一、数据库删除操作: 基本语法 DELETE FROM table_name WHERE [condition]; DELETE FROM ---- 关键字 table_name ---- 表名 WHERE ---- 条件的关键字 [condition] --- 条件表达式在这里插入代码片具体使用: QString sqlDelete QString("DELETE…

落地 DevOps,探索高效研发运营一体化解决方案

前言与概述 伴随着企业业务的快速发展,为了支撑业务发展,提高 IT 对业务的支撑能力建设。在研发工程协同方面,希望加强代码管理,实现持续构建、自动化测试、自动化部署、自动化运维,同时加强产品的安全和质量管理&…

ggplot阶截断坐标轴-gggap

目录 gggap包安装 功能查询 简单版使用代码 复杂版使用代码 gggap包安装 CRAN: Package gggap (-project.org) 手动下载安装 功能查询 > ?gggap > ?gggapDefine Segments in y-Axis for ggplot2 Description Easy-to-define segments in y-axis for ggplot2. …

React+Vis.js(05):节点的点击事件

文章目录 需求实现思路抽屉实现完整代码需求 双击节点,弹出右侧的“抽屉”,显示节点的详细信息 实现思路 vis.network提供了一个doubleClick事件,代码如下: network.on(doubleClick, function (properties) {// console.log(nodes);let id = properties

【数据结构】PTA 带头结点的链式表操作集 C语言

本题要求实现带头结点的链式表操作集。 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下: typedef struc…

STM32第十二节(中级篇):串口通信(第一节)——功能框图讲解

前言 我们在51单片机中就已经学习过了串口通信的相关知识点,那么我们现在在32单片机上进一步学习通信的原理。我们主要讲解串口功能框图以及串口初始化结构体以及固件库讲解。 STM32第十二节(中级篇):串口通信(第一节…

漏洞扫描的重要性,如何做好漏洞扫描服务

随着互联网技术的飞速发展,网络安全问题已成为不容忽视的重大挑战。其中,系统漏洞威胁作为最常见且严重的安全危险之一,对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…