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

news/2024/9/23 6:00:04/

一、状态模式

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

在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

 

 


http://www.ppmy.cn/news/1510963.html

相关文章

比特猫连接仙宫云__教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、注册仙宫云账号2、开始部署GPU实例3、部署GPU计算容器4、选择镜像5、支付宝实名认证6、打开并复制WebUI7、复制WebUI网址8、停止计费 比特猫(bitcat)入口 提示&a…

说一下Android中的IdleHandler

IdleHandler 是 Android 中的一个接口,常用于在主线程空闲时执行一些低优先级的任务。 作用: 它提供了一种在主线程空闲时执行额外操作的机制,能够优化应用的性能和资源利用。 工作原理: 当主线程没有其他任务需要处理&#xff…

【Linux多线程】线程同步 与 生产者消费者模型(无锁化模型)

文章目录 1. Linux线程同步1.1 条件变量1.2 同步概念与竞态条件1.3 条件变量函数示例代码1:示例代码2 1.4 为什么 pthread_ cond_ wait 需要互斥量1.5 条件变量使用规范 2. 生产者消费者模型3. 读者 写者 问题3.1 读写锁3.2 读写锁的相关接口 4. 扩展:无锁化模型4.1…

浅谈企业数字化转型的认知、价值及策略

2024年作为不寻常的一年,企业的经营环境发生了显著变化,复杂、不确定、不可预测成为常态。在新常态下,野蛮生长模式转向更务实的精耕细作。 同时,在诸多不确定的因素中,数字化加速推进的趋势是确定无疑的。数字化以前…

声明serialVersionUID进行Serializable接口版本控制

本文目标:开发人员,在了解serialVersionUID作用的条件下,进行序列化相关类的定义操作,达到版本可控的程度。 文章目录 1 场景1.1 Apple类定义1.2 apple对象序列化并存入文件1.3 读取文件反序列化得到apple对象 2 要点2.1 类要实现…

JaCoCo 命令行界面 (CLI) 详细分析与总结

概述 JaCoCo 提供了一个命令行界面,允许用户在命令行中执行基本操作。命令行工具及其所有依赖项打包在 jacococli.jar 中,并随 JaCoCo 下载提供。执行这些工具需要 Java 1.5 或更高版本。 注意事项 虽然提供了 instrument 命令,但 JaCoCo …

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

vue前端可以完整的显示编辑子级部门,用户管理可以为用户分配角色和部门?

用户和角色是一对多的关系用户和部门是多对多得关系<template><div class="s"><!-- 操作按钮 --><div class="shang"><el-input v-model="searchText" placeholder="请输入搜索关键词" style="width:…