practice_templates/deep_02/debug_rtl_uart/README.md
深度实践 Debug 2-1: UART 模块 Bug 猎人 🐛
📚 背景
UART (通用异步收发器) 是最基础的串行通信接口。本练习中,一个"初级工程师"实现的 UART 发送器包含 8 个 Bug,你需要逐一找出并修复。
🎯 任务目标
rtl/uart_tx_buggy.sv 包含一个 UART 发送器实现,其中隐藏了 8 个 Bug:
| Bug 编号 | 难度 | 类型 | 提示 |
|---|---|---|---|
| Bug #1 | ⭐ | 复位值错误 | 空闲时 TX 线应该是高电平 |
| Bug #2 | ⭐ | 状态机转移错误 | 起始位后应该进入数据位 |
| Bug #3 | ⭐⭐ | 位序错误 | UART 先发 LSB 还是 MSB? |
| Bug #4 | ⭐⭐ | 计数器错误 | 波特率分频器的终值 |
| Bug #5 | ⭐⭐ | 数据位计数错误 | 8 个数据位,计数从 0 开始 |
| Bug #6 | ⭐⭐⭐ | 停止位缺失 | 停止位时间不够 |
| Bug #7 | ⭐⭐⭐ | 时序竞争 | busy 信号的释放时机 |
| Bug #8 | ⭐⭐⭐ | 边界条件 | 连续发送时数据采样点 |
📁 文件结构
├── rtl/
│ ├── uart_tx_buggy.sv ← ⭐ 包含 8 个 Bug,需要修复
│ └── uart_tx_golden.sv ← 参考正确实现(修复后对照)
├── tb/
│ └── tb_uart_tx.sv ← 自动化测试平台
├── Makefile
└── README.md
🏃 操作步骤
- 阅读 UART 协议: 空闲高→起始位(低)→8数据位(LSB先)→停止位(高)
- 阅读 buggy 代码: 仔细分析每一行
- 编译运行:
make run_buggy查看错误 - 查看波形:
make wave在 Verdi 中分析 - 逐个修复: 每修复一个 Bug 运行一次仿真
- 验证:
make run确认 "ALL 8 BUGS FIXED"
✅ 验收标准
- 所有 8 个 Bug 被修复
make run_buggy输出 "ALL TESTS PASSED"- 提交修复说明文档
📝 考核方式
| 考核项 | 分值 | 说明 |
|---|---|---|
| 找到并修复 Bug 1-2 | 15 分 | 简单 Bug |
| 找到并修复 Bug 3-5 | 30 分 | 中等 Bug |
| 找到并修复 Bug 6-8 | 35 分 | 困难 Bug |
| 修复说明文档 | 20 分 | 每个 Bug 的原因和修复方法 |
| 合计 | 100 分 |
通过标准:≥ 60 分 (至少修复 5 个 Bug)