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 输出看状态加输入。画状态转移图时,状态、箭头、条件,一个都不能少。记住这三条,基础就算打牢了。