当前位置: 首页 > news >正文

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

一、状态模式

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

在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 : stateclass concrete_state1 extends state;function int process1(fsm_context cnxt);$display("concrete_state1 : process1");if ( cnxt.change_state ) beginconcrete_state2 state2 = new();$display("concrete_state1 change to concrete_state2");cnxt.st = state2;endendfunction : process1function int process2(fsm_context cnxt);$display("concrete_state1 : process2");if ( cnxt.change_state ) beginconcrete_state2 state2 = new();$display("concrete_state1 change to concrete_state2");cnxt.st = state2;endendfunction : process2endclass : concrete_state1class concrete_state2 extends state;function int process1(fsm_context cnxt);$display("concrete_state2 : process1");if ( cnxt.change_state ) beginconcrete_state1 state1 = new();$display("concrete_state2 change to concrete_state1");cnxt.st = state1;endendfunction : process1function int process2(fsm_context cnxt);$display("concrete_state2 : process2");if ( cnxt.change_state ) beginconcrete_state1 state1 = new();$display("concrete_state2 change to concrete_state1");cnxt.st = state1;endendfunction : process2endclass : concrete_state2class fsm_context;state st;function bit change_state();return 1; // for simplicityendfunction : change_statefunction void process_req1 (/*interface signals*/);st.process1(this /*, interface signals*/);endfunction : process_req1function void process_req2 (/*interface signals*/);st.process2(this /*, interface signals*/);endfunction : process_req2endclass : 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

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VS Code开发C#(.NET)之快速入门
  • 大数据技术——实战项目:广告数仓(第八部分)FineBI实战
  • C语言 ——— 学习并使用malloc和free函数
  • OSI七层网络模型 /TCP/IP五层模型以及封装分用的详细讲解
  • 最近网友问晚上失眠的问题
  • 【vue3|第22期】Vite + Vue3:vite配置文件
  • 重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉
  • 声明式事务及编程式事务
  • 数据在内存中的存储(了解大小端字节序浮点数在内存中存储)详细~
  • zabbix实战-磁盘空间告警
  • 华为鸿蒙Core Vision Kit 骨骼检测技术
  • 构建第一个Spring项目
  • 黑神话悟空什么配置可以玩?什么样的游戏本配置可以畅玩《黑神话:悟空》?黑神话悟空电脑配置推荐
  • WEB之文件上传
  • 华为M60首次降价,消费回暖能延续?
  • php的引用
  • [deviceone开发]-do_Webview的基本示例
  • C++11: atomic 头文件
  • java8-模拟hadoop
  • Java比较器对数组,集合排序
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python 反序列化安全问题(二)
  • Python学习之路16-使用API
  • redis学习笔记(三):列表、集合、有序集合
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue 个人积累(使用工具,组件)
  • 检测对象或数组
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • NLPIR智能语义技术让大数据挖掘更简单
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • zabbix3.2监控linux磁盘IO
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​虚拟化系列介绍(十)
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #stm32整理(一)flash读写
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (八)Spring源码解析:Spring MVC
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)mysql使用Navicat 导出和导入数据库
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net core 的缓存方案
  • .net framework4与其client profile版本的区别
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • /bin/rm: 参数列表过长"的解决办法
  • ::
  • @Conditional注解详解
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [.NET]桃源网络硬盘 v7.4
  • [].slice.call()将类数组转化为真正的数组