practice_templates/deep_02/debug_rtl_fsm/README.md
深度实践 Debug 2-2: FSM 状态机 Bug 猎人 🐛
📚 背景
本练习包含一个 SPI Master 控制器的状态机实现,其中隐藏了 6 个 Bug。
SPI 是四线同步串行通信协议:SCLK、MOSI、MISO、CS_N。
🎯 任务目标
rtl/spi_master_buggy.sv 包含 6 个 Bug:
| Bug 编号 | 难度 | 类型 | 提示 |
|---|---|---|---|
| Bug #1 | ⭐ | CS_N 极性错误 | CS_N 是低有效 |
| Bug #2 | ⭐⭐ | SCLK 相位错误 | CPOL/CPHA 配置 |
| Bug #3 | ⭐⭐ | 数据移位方向 | MSB first |
| Bug #4 | ⭐⭐ | MISO 采样时机 | 在 SCLK 哪个沿采样? |
| Bug #5 | ⭐⭐⭐ | 状态机死锁 | 某些条件下无法退出 |
| Bug #6 | ⭐⭐⭐ | CS_N 释放时序 | 最后一个 SCLK 后 CS 释放过早 |
📁 文件结构
├── rtl/
│ ├── spi_master_buggy.sv ← ⭐ 包含 6 个 Bug
│ └── spi_master_golden.sv ← 参考正确实现
├── tb/
│ └── tb_spi_master.sv ← 自动化测试平台
├── Makefile
└── README.md
🏃 操作步骤
- 学习 SPI 协议: CPOL=0, CPHA=0 模式的时序
- 阅读 buggy 代码: 分析状态机转移和数据路径
- 编译运行:
make run查看错误 - 用波形调试: 重点关注 SCLK/MOSI/MISO/CS 的时序关系
- 逐个修复: 每修复一个 Bug 重新仿真
📝 考核方式
| 考核项 | 分值 | 说明 |
|---|---|---|
| 找到 Bug 1-2 | 20 分 | 简单/中等 Bug |
| 找到 Bug 3-4 | 30 分 | 中等 Bug |
| 找到 Bug 5-6 | 30 分 | 困难 Bug |
| 修复说明文档 | 20 分 | Bug 原因分析 + 修复方法 |
| 合计 | 100 分 |
通过标准:≥ 60 分