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 三类检查与 RTL 冻结判定关系 Lint 检查 单时钟域 · 代码质量 • 位宽不匹配 / 隐式锁存 • 组合环 / 多驱动 • 未驱动 / 未使用信号 • case 缺 default / 敏感列表 CDC 检查 跨时钟域 · 同步结构 • 单比特:两级触发器同步 • 多比特:握手 / 异步FIFO • 脉冲:展宽 / toggle 同步 • 同步链深度 / 缺少同步 RDC 检查 跨复位域 · 释放竞争 • 异步复位同步释放 • 复位域边界识别 • 跨复位域路径同步 • 复位释放竞争风险 违例分类与评审 结构性违例 / 需人工确认 / 误报 是否全部关闭 或已批准豁免? RTL 冻结 生成交付清单 返回修复 重新运行检查

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 标签、日期、责任人 与仓库标签一致
建议把 SpyGlass 运行脚本、约束文件和报告一起纳入版本管理,并在 CI 中设置门禁:Lint 违例数超过阈值或 CDC 结构性违例不为零时,阻止 RTL 冻结标签生成。
常见误区:把 CDC 报告中的“需人工确认”直接当成通过。实际上这类条目往往隐藏着真实的跨域风险,必须逐条给出同步方案或豁免理由,否则冻结基线不可信。

当 Lint、CDC、RDC 三类检查全部收敛,约束与设计一致,交付清单逐项校验通过,RTL 才具备冻结条件。冻结后的 RTL 应打上明确标签,后续任何修改都必须走变更评审,并重新触发对应检查,确保交付基线始终可追溯、可复现。