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

news2024/9/22 13:44:50

一、状态模式

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

在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

 

 

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

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

相关文章

pip install 遇到ValueError: check_hostname requires server_hostname的解决办法

我需要下载Cython来将py编译成c,结果在pip install的时候报错这个: ERROR: Exception: Traceback (most recent call last):File "F:\Anaconda3\envs\DouyinLive32\lib\site-packages\pip\_internal\cli\base_command.py", line 173, in _mai…

《人类群星闪耀时》

人类群星闪耀时,历史的舞台上,你未尝不是其中一颗。 【拜占庭的沦陷】具备决断力、创新力、执行力的领导者起到关键作用。 【享德尔的复活】人的心力一旦强大,便可创造非凡之事。 【一夜天才】闪耀的星离不开黑夜的衬托。所谓的英雄&#x…

HarmonyOS Developer之生成二维码

qrcode 生成并显示二维码 属性 样式 创建qrcode组件 在pages/index目录下的hml文件中创建一个qrcode组件 HTML <!-- xxx.hml--> <div class"container"><qrcode value"Hello"></qrcode> </div>CSS /* xxx.css */ .cont…

uniapp 微信小程序生成水印图片

效果 源码 <template><view style"overflow: hidden;"><camera device-position"back" flash"auto" class"camera"><cover-view class"text-white padding water-mark"><cover-view class"…

基于JAVA的社团管理系统的设计与实现

TOC springboot270基于JAVA的社团管理系统的设计与实现 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供…

html+css 实现hover 边框彩色按钮

前言:哈喽,大家好,今天给大家分享html+css 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 一、效果二、原理解析1.这是一个,hover后按钮边框==变彩色==的效果。每个按钮都是1个but…

matlab关于结构体的创建

网上搜了很多结构体的创建&#xff0c;都是什么student.name student.age,或者struct. 自己摸索了一下&#xff0c;根据你想要创建结构体的格式可以划分以下两类 clear all clcdata [1, 2, 2, 1;2, 1, 1, 3;4, 3, 2, 2];data1 [0, 2, 2, 1;0, 1, 1, 3;4, 3, 0, 2;4, 3, 0, 2…

解锁企业数字化转型的终极指南:《数字时代的敏捷架构》深度解读

在当前数字化浪潮的冲击下&#xff0c;企业面临着前所未有的挑战与机遇。为了解决这一难题&#xff0c;The Open Group 和 AZone 联手推出了《数字时代的敏捷架构》&#xff0c;《数字时代的敏捷架构》汇集了全球顶尖专家的智慧和经验&#xff0c;是企业数字化转型的必读之作。…

【IEEE独立出版】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 会议时间&#xff1a;2024年11月1日-3日 会议地点&#xff1a;中国-南京…

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘、移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…

函数递归那些事

什么是递归 递归就是函数自己调用自己&#xff0c;而递归的本质其实是一种解决问题的方法。 递归的思想 递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似&#xff0c;但规模较小的子问题&#xff0c;直到子问题不能被拆分&#xff0…

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

MySQL9.0安装教程

软件介绍 MySQL是一个关系型数据库管理系统&#xff0c;是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件之一。 软件下载 https://pan.qu…

预报名管理系统--论文pf

TOC springboot374预报名管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

UI设计:蒸汽波风格页面有啥特征,应用哪些场景?

一、什么是蒸汽波风格 蒸汽波风格&#xff08;Steampunk&#xff09;是一种将19世纪工业时代的技术和想象力与未来科技相结合的艺术和文化流派。它通常描绘了一个类似维多利亚时代的世界&#xff0c;其中蒸汽动力是主要能源&#xff0c;机械装置和复杂的齿轮系统被广泛应用。 …

C#商城源码与.NET技术在电商领域的应用_OctShop

在当今互联网化商业的浪潮中&#xff0c;网上商城成为了企业拓展市场、提升竞争力的重要手段。而 C# 商城源码和.NET 相关的技术在构建高效、稳定、安全的网上商城中发挥着关键作用。OctShop将深入探讨 C# 商城源码、.NET 商城源码、C# 网上商城以及.NET Core 商城源码的特点、…

JavaScript基础(34)_BOM介绍、BOM对象

BOM 浏览器对象模型&#xff0c;BOM可以使我们通过JS来操作浏览器。在BOM中为我们提供了一组对象&#xff0c;用来完成对浏览器的操作。 BOM对象 Window&#xff1a;代表整个浏览器的窗口&#xff0c;同时window也是网页中的全局对象。Navigator&#xff1a;代表当前浏览器的…

VS2022实用调试技巧超详解

文章目录 1. 什么是 bug2. 什么是调试(debug)3. Debug和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5. 监视和内存观察5.1 监视5.2 内存 6. 调试举例17. 调试举例29. 编程常见错误归类9. 1 编译型错误9.2 链接型错误9. 3 运行时错误 本文章以VS2022为例讲解调试功能&am…

Linux内核分析(调度类和调度实体)

文章目录 前言一、调度类1. stop_sched_class2. dl_sched_class3. rt_sched_class4. fair_sched_class5. idle_sched_class总结 二、调度类中的操作函数三、调度实体 前言 调度是操作系统内核的一个关键职责&#xff0c;它涉及到如何合理分配CPU时间给不同的进程或线程。在Lin…

SpringBoot依赖之Spring Data Redis 一 String类型

Spring Data Redis(一) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Re…