DESIGN TRACK · 第 16 章

综合与静态时序分析

把 RTL 映射成标准单元,并证明每条时序路径都能按时工作

建议用时:8-12 小时本章目标:使用目标工艺库完成综合,理解面积与关键路径报告,并写出覆盖全部时钟和 I/O 的 SDC 约束。

综合到底做了什么

综合工具把 RTL、工艺库和约束转换为门级网表。相同 RTL 在不同频率、工艺角和优化目标下可能得到完全不同的电路。综合前先检查 elaboration 后的层次、参数和推断存储类型,再看 unmapped cells、latch、多驱动、未连接端口。报告中的面积通常是库单元面积之和,不等于最终芯片尺寸。

read_liberty -lib sky130_fd_sc_hd__tt_025C_1v80.lib
read_verilog stream_accel.v
hierarchy -check -top stream_accel
synth -top stream_accel
dfflibmap -liberty sky130_fd_sc_hd__tt_025C_1v80.lib
abc -liberty sky130_fd_sc_hd__tt_025C_1v80.lib
write_verilog netlist/stream_accel.v

这是 Yosys 风格的最小流程。实际项目还要保留版本、库角、命令脚本和日志,使结果可重现。

约束是设计意图,不是工具参数

STA 需要知道时钟周期、波形、输入到达时间、输出所需时间、时钟不确定度和例外路径。缺少约束的路径不会神奇地满足时序,只是没有被检查。100 MHz 对应 10 ns 周期,但不能把 10 ns 全给组合逻辑;时钟不确定度、插入延迟和片外接口都会消耗预算。

create_clock -name core_clk -period 10.0 [get_ports clk]
set_clock_uncertainty 0.20 [get_clocks core_clk]
set_input_delay  1.50 -clock core_clk [get_ports {in_* start_pulse}]
set_output_delay 1.50 -clock core_clk [get_ports {out_* busy irq}]
set_false_path -from [get_ports rst_n]

false path 和 multicycle path 必须有结构依据与评审记录。用例外“修掉”负 slack 会让真实故障进入硅片。

读懂 setup、hold 与关键路径

setup 检查数据是否在下一个采样沿之前足够早到达;hold 检查数据是否在当前采样沿后保持足够久。setup 违例可以通过降低频率、减少逻辑级数、流水线或选用更快单元解决。hold 与周期基本无关,通常通过插入延迟单元修复。正 slack 表示余量,负 slack 表示违例。

本项目的关键路径可能穿过 40 位加法器。若 100 MHz 不满足,优先确认约束和报告路径,再决定降低目标、使用分段累加或加流水级。任何流水线修改都会改变延迟和控制,必须回到规格与验证环境。

本章交付物

  • 可重现的综合脚本、门级网表、面积和单元统计。
  • SDC 文件,覆盖率报告中无 unconstrained endpoint。
  • 最慢 10 条 setup 路径与最紧 10 条 hold 路径的解释。
  • RTL 仿真与门级等价性或门级冒烟验证结果。
通过标准:目标工艺角下 WNS/TNS 非负;没有未约束端点,没有未经解释的 latch、black box 或时序例外。

工具与延伸资料

← 第 15 章:验证:证明 RTL 做对了