practice_templates/deep_03/eda_spyglass_lint/README.md
深度实践 EDA 3-1: SpyGlass Lint 代码质量检查
📚 知识点
| 知识点 | 说明 |
|---|---|
| Lint 检查 | 静态代码分析,发现潜在问题 |
| SpyGlass | Synopsys 的 RTL 分析工具 |
| 常见 Lint 规则 | 锁存器、未连接信号、位宽不匹配等 |
| Lint Waiver | 对已知安全违规的豁免处理 |
| 编码规范 | 可综合、可维护的 RTL 编码标准 |
🎯 任务目标
任务 1: Lint 规则学习 (20 分)
阅读 docs/lint_rules.md 并回答:
- [ ] W_ 类规则是什么含义?
- [ ] E_ 类规则是什么含义?
- [ ] 列出 5 个最重要的 Lint 规则并解释
任务 2: 修复 Lint 违规 (40 分)
rtl/lint_exercise.sv 中包含 10 个常见 Lint 违规:
| 编号 | 违规类型 | 说明 |
|---|---|---|
| 1 | 锁存器推断 | 不完整的 case/if 语句 |
| 2 | 未使用信号 | 声明了但未使用的信号 |
| 3 | 未驱动信号 | 声明了但未赋值的信号 |
| 4 | 位宽不匹配 | 赋值两端位宽不一致 |
| 5 | 多驱动 | 同一信号在多处赋值 |
| 6 | always 敏感列表 | 敏感列表不完整 |
| 7 | 阻塞/非阻塞混用 | 时序逻辑中用了阻塞赋值 |
| 8 | 异步复位锁存 | 复位分支不完整 |
| 9 | 组合环路 | 组合逻辑形成回路 |
| 10 | 未初始化变量 | for 循环的 initial 值 |
任务 3: SpyGlass 运行实践 (20 分)
- [ ] 编写 SpyGlass 项目配置文件
- [ ] 运行 Lint 检查
- [ ] 分析 Lint 报告
- [ ] 编写 Waiver 文件
任务 4: 编码规范总结 (20 分)
- [ ] 总结 10 条 RTL 编码最佳实践
- [ ] 为每条规则提供正确和错误的代码示例
📁 文件结构
├── rtl/
│ └── lint_exercise.sv ← ⭐ 包含 10 个 Lint 违规
├── docs/
│ └── lint_rules.md ← Lint 规则说明
├── spyglass/
│ ├── spy_project.prj ← ⭐ TODO: SpyGlass 项目文件
│ └── waiver.swl ← ⭐ TODO: Waiver 文件
├── reports/
│ └── lint_fix_report.md ← ⭐ TODO: 修复报告
├── Makefile
└── README.md
📝 考核方式
| 考核项 | 分值 | 评估方法 |
|---|---|---|
| Lint 规则理解 | 20 分 | 回答问题 |
| 修复 10 个 Lint 违规 | 40 分 | 代码修复正确 |
| SpyGlass 运行 | 20 分 | 配置文件+运行+报告 |
| 编码规范总结 | 20 分 | 总结文档质量 |
| 合计 | 100 分 |
通过标准:≥ 60 分