4、静态时序分析(STA)准备:SDC约束检查、时序库检查、工作条件设置、片上波动设置

静态时序分析,说白了就是给芯片做一次「体检」。你得确保所有路径都能在规定时间内跑完。我见过太多项目,前端仿真跑得飞起,一到 STA 就崩了。为什么?因为准备工作没做好。

今天咱们就聊聊 STA 准备阶段的四个核心动作。嗯,这步做扎实了,后面签收才能安心。

4.1 SDC 约束检查——别让约束「漏风」

SDC 是 STA 的灵魂。约束写错了,分析结果就是废纸。我个人习惯,拿到 SDC 后先做三件事:

  • 语法检查:用工具自带的 check_sdc 命令扫一遍。别小看这个,我遇到过有人把 set_max_delay 写成了 set_max_delay 10 但忘了指定端口,结果工具默默忽略了整条约束。
  • 完整性检查:所有输入端口有没有 set_input_delay?所有输出端口有没有 set_output_delay?时钟有没有 create_clock?
  • 一致性检查:同一个时钟域下,不能出现矛盾的约束。比如你既设了 set_max_delay 5 又设了 set_min_delay 8,那工具会疯掉的。

核心命令示例:

# 检查 SDC 语法
check_sdc -verbose

# 报告未约束的路径
report_analysis_coverage -status untested

# 检查时钟定义
report_clock -skew -groups

我的经验:我曾经在一个项目中,因为漏掉了某个异步时钟域的 set_false_path,导致 STA 报出上千条违例。后来花了整整两天才排查出来。所以,我建议你在 SDC 里加一个 report_analysis_coverage,看看有多少路径是「未约束」的。这个数字应该接近 0%。

4.2 时序库检查——库文件是「尺子」

时序库(.lib)定义了每个标准单元的延迟、功耗、转换时间等参数。库文件有问题,STA 就是空中楼阁。

检查什么?我列个清单:

  • 库版本一致性:所有库文件必须来自同一个工艺版本。混用不同版本的库,延迟数据会打架。
  • PVT 条件覆盖:你至少需要三个库:最差条件(WC)、典型条件(TC)、最好条件(BC)。有些项目还会加一个「最差功耗」条件。
  • 库的 K 值检查:每个单元的延迟公式里,K 值(斜率因子)不能是 0 或负数。我见过一个库,因为工艺角文件损坏,所有单元的 rise_transition 都变成了 0,结果 STA 报出来的延迟全是 0。
检查项 检查方法 常见问题
库版本 report_lib -version 混用不同工艺版本
PVT 覆盖 检查 .lib 文件中的 operating_conditions 缺少最差条件库
K 值 report_lib -k_factor K 值为 0 或负数
功耗模型 report_lib -power 漏了内部功耗数据

注意:库文件检查最好在项目初期就做。等到综合完成后再发现库有问题,那返工量就大了。我曾经因为库文件里少了一个 wire_load 模型,导致后端布线后的时序完全对不上。嗯,那次教训挺深刻的。

4.3 工作条件设置——别让芯片「水土不服」

工作条件包括温度、电压、工艺角。你想想看,芯片在 0°C 和 125°C 下的表现能一样吗?

设置工作条件时,我一般遵循这个原则:

  • 建立时间检查:用最差条件(慢工艺、低电压、高温)。因为这时候单元延迟最大,路径最容易违例。
  • 保持时间检查:用最好条件(快工艺、高电压、低温)。因为这时候单元延迟最小,数据可能跑得太快,导致保持时间违例。
  • 功耗分析:用典型条件。功耗分析不需要太悲观,典型值就够了。

设置示例:

# 设置最差条件(建立时间检查)
set_operating_conditions -max_library "wc.lib" \
                         -max "worst_case" \
                         -min_library "bc.lib" \
                         -min "best_case"

# 设置片上波动(OCV)
set_timing_derate -early 0.9
set_timing_derate -late 1.1

我的建议:别把所有路径都设成同一个 derate 值。时钟路径和数据路径的 derate 应该分开设置。时钟路径的 derate 通常比数据路径更宽松一些,因为时钟树是平衡的。我一般设时钟路径 derate 为 1.05,数据路径为 1.1。

4.4 片上波动设置——别忽视「局部差异」

片上波动(OCV)是什么?说白了,就是同一颗芯片上,不同位置的晶体管性能不一样。为什么?因为工艺制造过程中,掺杂浓度、氧化层厚度、光刻对准都会有微小差异。

OCV 设置的核心是 derate 因子。你想想看,如果所有路径都用同一个延迟值,那结果肯定不准。所以我们要给路径加一个「安全系数」。

设置 OCV 时,我关注三个维度:

  • 全局 OCV:整个芯片范围内的波动。通常设 10%~15%。
  • 局部 OCV:同一区域内的波动。通常设 5%~8%。
  • 时钟 OCV:时钟树上的波动。这个要特别小心,因为时钟路径的偏差会直接影响时序裕量。

OCV 设置示例:

# 设置全局 OCV
set_timing_derate -early 0.85 -late 1.15

# 设置时钟路径 OCV
set_timing_derate -early 0.90 -late 1.10 -clock

# 设置数据路径 OCV
set_timing_derate -early 0.85 -late 1.15 -data

避坑指南:我曾经在一个 7nm 项目中,因为 OCV 设得太激进(derate 设了 1.2),导致 STA 报出大量违例。后来发现,其实那些路径根本没问题,是 OCV 设置太保守了。所以,OCV 的 derate 值最好跟工艺厂确认一下。不同工艺节点,OCV 的典型值差别很大。28nm 以下,OCV 效应会更明显。

知识体系总览

下面这张图,帮你理清 STA 准备的四个核心模块。它们之间是环环相扣的:

STA 准备阶段知识体系 SDC 约束检查 语法检查 完整性检查 一致性检查 时序库检查 版本一致性 PVT 条件覆盖 K 值检查 工作条件设置 建立时间:最差条件 保持时间:最好条件 功耗:典型条件 片上波动设置 全局 OCV 局部 OCV 时钟 OCV 四个模块环环相扣,缺一不可 约束 → 库 → 条件 → OCV → 签核 做好这四步,STA 才能真实反映芯片的时序表现

好了,STA 准备的四个核心动作就聊到这儿。记住,准备工作做得越细,后面签核就越顺利。别等到跑完 STA 才发现约束漏了、库文件错了,那可就晚了。