2. RTL交付与质量检查
RTL交付不是把代码提交到仓库就结束,而是要让下游综合、DFT、验证团队拿到一份“可被信任”的RTL。所谓可被信任,至少包含三层含义:语法与可综合性没有低级错误,跨时钟域与复位域的结构风险已被识别并处理,交付物本身完整、可追溯、可复现。SpyGlass正是Synopsys流程中承担这一职责的主力静态检查工具,它把Lint、CDC、RDC三类检查统一在同一套读入、约束、分析与报告框架下。
三类检查各自解决什么问题
Lint面向单时钟域内的代码质量与可综合性。它关注位宽不匹配、隐式锁存器、组合环、未驱动/未使用信号、多驱动、大小写混淆、敏感列表不完整、case语句缺少default等。Lint的价值在于“早”,这些问题在仿真中往往被掩盖,却会在综合或后端阶段以难以定位的形式爆发。
CDC(Clock Domain Crossing)面向跨时钟域信号。核心判断是:一个信号从时钟A域进入时钟B域时,是否经过正确的同步结构。单比特控制信号通常用两级触发器同步;多比特数据总线需要握手、异步FIFO或格雷码;脉冲信号需要脉冲展宽或toggle同步。SpyGlass CDC会识别同步器、检查同步链深度、报告缺少同步的跨域路径,并区分“结构性违例”和“需人工确认的潜在风险”。
RDC(Reset Domain Crossing)面向复位域。当信号从一个复位域进入另一个复位域,且两者复位释放时刻不同,就可能出现复位释放竞争,导致目标寄存器采样到不确定值。RDC检查关注异步复位同步释放结构、复位域边界、以及跨复位域路径是否存在同步处理。
SpyGlass 的实际运行方式
SpyGlass 的典型调用不是“点一个按钮”,而是围绕工程文件、约束文件和目标规则集展开。一个可复现的最小流程如下:
# 1. 准备工程文件
spyglass -project top.prj -goal lint/lint_rtl -batch
# 2. 读入 RTL 与约束
read_file -type verilog ./rtl/top.v
read_file -type sgdc ./constraints/top.sgdc
# 3. 指定顶层与规则集
set_option top top
current_goal lint/lint_rtl
# 4. 运行并输出报告
run_goal
write_report -goal lint/lint_rtl -output ./reports/lint.rpt
其中 .sgdc 约束文件是 CDC/RDC 检查的关键。它需要声明时钟、复位、同步器结构、以及哪些跨域路径是“有意为之”的。例如:
clock -name clk_core -period 2.0
clock -name clk_io -period 8.0
reset -name rst_n_core -value 0
reset -name rst_n_io -value 0
sync -name sync_2ff -type double_ff -cells {u_sync/*}
如果约束缺失或写错,CDC 会把大量正常同步路径报成违例,或者把真正的风险路径漏掉。因此约束评审本身应作为 RTL 冻结前的一个独立检查项。
RTL 冻结标准
RTL 冻结不是“代码不再改”,而是“代码达到可交付基线”。建议冻结标准至少包含以下可判定条件:
- Lint 目标规则集全部通过,或剩余违例均有书面豁免理由并经评审确认。
- CDC 结构性违例为零;需人工确认项已逐条评审,结论记录在案。
- RDC 跨复位域路径已识别,异步复位同步释放结构完整。
- 所有时钟、复位、同步器约束与设计一致,约束文件纳入版本管理。
- RTL 代码通过综合可读性检查,无不可综合结构。
- 交付清单中的每一项均已生成并校验。
RTL 交付清单示例
交付清单的作用是让下游团队“按单验收”。以下是一份可直接参考的清单结构:
| 类别 | 交付物 | 格式/说明 | 校验方式 |
|---|---|---|---|
| RTL 源码 | top.v 及子模块 | Verilog/SystemVerilog | 编译通过、版本标签一致 |
| 约束文件 | top.sgdc | SpyGlass 约束 | 时钟/复位/同步器声明完整 |
| Lint 报告 | lint.rpt | 文本报告 | 违例清零或已豁免 |
| CDC 报告 | cdc.rpt | 文本报告 | 结构性违例为零 |
| RDC 报告 | rdc.rpt | 文本报告 | 跨复位域路径已评审 |
| 豁免记录 | waiver.log | 逐条说明 | 评审人签字/日期 |
| 版本信息 | release_note.txt | 标签、日期、责任人 | 与仓库标签一致 |
当 Lint、CDC、RDC 三类检查全部收敛,约束与设计一致,交付清单逐项校验通过,RTL 才具备冻结条件。冻结后的 RTL 应打上明确标签,后续任何修改都必须走变更评审,并重新触发对应检查,确保交付基线始终可追溯、可复现。