1. 状态机基础:什么是状态机、状态机的分类(Moore与Mealy)、状态转移图的基本元素

大家好,我是老李。做数字验证十几年了,状态机这东西,几乎天天打交道。今天咱们就来聊聊状态机的基础。别小看它,很多复杂的功能验证,最后都绕不开状态机。

1.1 什么是状态机?

说白了,状态机就是一个“有记忆”的逻辑电路。它不光看当前的输入,还得记住自己现在在哪个“状态”里。然后根据当前状态和输入,决定下一步去哪。

我打个比方。你想想看,一个自动售货机。你投了5块钱,它记住你投了5块。你再投5块,它知道你现在有10块了。这就是状态。它不会因为你投了两次5块就给你两瓶水,因为它记住了“当前余额”这个状态。

在数字电路里,状态机由两部分组成:

  • 状态寄存器:用来存当前状态,说白了就是一堆触发器
  • 组合逻辑:决定下一个状态是什么,以及输出什么

核心要点:状态机的本质是“时序逻辑 + 组合逻辑”的组合。时序逻辑负责记忆,组合逻辑负责决策。

1.2 状态机的分类:Moore 与 Mealy

这里有个经典问题:Moore 和 Mealy 到底有啥区别?我刚开始学的时候也迷糊过。

Moore 型状态机:输出只取决于当前状态。也就是说,只要状态不变,输出就不变。输入变了?没关系,只要没触发状态跳转,输出就稳如老狗。

Mealy 型状态机:输出取决于当前状态 和 当前输入。输入一变,输出可能立刻跟着变,哪怕状态还没跳转。

我在项目中遇到过一件事。有一次做串口协议解析,用了 Moore 机。结果发现输出总是慢一个时钟周期。后来改成 Mealy 机,输出对输入的响应就快多了。嗯,这里要注意,Mealy 机虽然响应快,但容易出毛刺,因为组合逻辑直接输出。

特性 Moore 型 Mealy 型
输出依赖 仅当前状态 当前状态 + 当前输入
输出时序 与时钟同步,稳定 可能异步变化,有毛刺风险
状态数量 通常较多 通常较少
响应速度 慢一拍 快,组合逻辑直出
典型应用 控制逻辑、安全关键系统 高速数据通路、协议解析

我的建议:如果你对时序要求严格,怕毛刺,用 Moore。如果你追求响应速度,并且能处理好毛刺问题,用 Mealy。我个人习惯是:控制路径用 Moore,数据路径用 Mealy。

1.3 状态转移图的基本元素

画状态转移图,是验证工程师的基本功。你想想看,没有图,光看代码,状态机长啥样根本看不出来。

一个标准的状态转移图,包含这几个元素:

  • 圆圈/椭圆:代表一个状态。里面写上状态名,比如 IDLE、READ、DONE。
  • 箭头:代表状态之间的转移方向。
  • 箭头上的标签:写清楚转移条件。Moore 机通常只写条件,Mealy 机还会写上输出。
  • 起始状态:一般用一个小箭头指向初始状态,或者用双圈表示。

我曾经吃过一次亏。有个同事画的状态图,箭头上的条件写得模棱两可。结果验证的时候,发现有一条路径根本走不到。后来我养成了一个习惯:画完图之后,自己手动走一遍所有路径,确保每个状态都能到达,每个条件都覆盖到。

避坑指南:我曾经因为状态转移图上的条件写成了“a & b”,但代码里实际是“a | b”,导致验证漏掉了一个关键场景。所以,图上的条件一定要和代码严格对应,最好用形式化的写法。

1.4 知识体系总览

下面这张图,是我自己总结的状态机基础知识的框架。你可以把它当作一个地图,后面我们讲的所有内容,都会落在这张图的某个节点上。

状态机基础知识体系 状态机定义 状态机分类 Moore 型 输出仅取决于当前状态 状态多,输出稳定 Mealy 型 输出取决于状态+输入 状态少,响应快 状态转移图 圆圈=状态,箭头=转移 标签=条件/输出 基本元素 状态(圆圈) | 转移(箭头) | 条件(标签) | 起始状态(双圈/箭头) 核心:每个状态可达,每个条件可覆盖

这张图把今天讲的内容串起来了。从状态机的定义出发,分成了 Moore 和 Mealy 两大流派,然后落到状态转移图的画法上。后面我们讲功能覆盖验证的时候,会反复用到这张图里的概念。

总结一下:状态机就是“有记忆的逻辑”。Moore 输出看状态,Mealy 输出看状态加输入。画状态转移图时,状态、箭头、条件,一个都不能少。记住这三条,基础就算打牢了。

可可精品资料库