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

🏃 操作步骤

  1. 阅读 UART 协议: 空闲高→起始位(低)→8数据位(LSB先)→停止位(高)
  2. 阅读 buggy 代码: 仔细分析每一行
  3. 编译运行: make run_buggy 查看错误
  4. 查看波形: make wave 在 Verdi 中分析
  5. 逐个修复: 每修复一个 Bug 运行一次仿真
  6. 验证: 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)