ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

数字芯片时序设计实战:从建立/保持时间违例到STA签核全解析

2026/8/8 22:58:44 拓冰建站 浏览量
数字芯片时序设计实战:从建立/保持时间违例到STA签核全解析

1. 从一道“简单”的时序题说起:为什么我的设计跑不快?

最近在带新人做数字芯片设计验证,发现一个挺有意思的现象。很多刚入行的朋友,对RTL编码、仿真验证这些上手很快,但一碰到“时序”问题,尤其是静态时序分析(STA)相关的概念,就容易犯迷糊。他们往往能写出功能正确的代码,但综合出来的电路要么跑不到目标频率,要么在布局布线后出现一堆时序违例,最后不得不返工,非常影响项目进度。

我记得有一次,一个同事拿着一个简单的触发器链设计来找我,说综合报告显示建立时间(Setup Time)违例了,但他觉得自己的逻辑很简单,不应该有问题。他给的例子大致是这样的:一个时钟驱动了三级寄存器,寄存器之间就是直接连线。他的疑问很典型:“这不就是三个D触发器串起来吗?时钟周期给够了,为什么还会违例?”

这个问题看似简单,却触及了STA最核心的几个概念:时钟定义、时序路径、以及延迟的计算。如果连这个基础场景都理不清,面对更复杂的时钟域交叉、多周期路径、虚假路径时,就更无从下手了。所以,我觉得有必要结合一些具体的“例题”,把STA里那些书本上看着枯燥、但实际工作中天天要打交道的概念,用咱们工程师的大白话捋清楚。这篇文章,我就打算用几个从易到难的场景,拆解STA到底在看什么,以及我们该怎么看。

2. 基本功拆解:一条时序路径的“体检报告”到底说了啥?

静态时序分析,顾名思义,就是在不跑仿真、不给激励的情况下,纯粹基于网表、单元库和时序约束,对电路中所有可能的时序路径进行检查,看它们是否满足建立时间和保持时间的要求。它的输出就是一份“体检报告”,告诉你哪条路径“不健康”(违例)。要读懂这份报告,首先得明白它检查的“路径”是什么,以及评判标准“建立/保持时间”又是怎么用的。

2.1 核心概念:时序路径的起点与终点

一条完整的时序路径,必须包含四个要素:

  1. 起点:时序路径开始的地方。通常是时钟端口(触发器的CK端)或输入端口
  2. 终点:时序路径结束的地方。通常是数据端口(触发器的D端)或输出端口
  3. 时钟:控制起点和终点的时钟信号。对于寄存器到寄存器的路径,起点和终点通常由同一个时钟或有时序关系的时钟控制。
  4. 组合逻辑:位于起点和终点之间的所有逻辑门和连线。

最常见的路径是寄存器到寄存器的路径。我们就以最开始那个三级触发器链为例,看看工具是怎么分析其中从第一级寄存器(FF1)到第二级寄存器(FF2)这条路径的。

CLK --->| FF1 |--->[组合逻辑]--->| FF2 | |____| |____| D1 D2

(这里假设组合逻辑就是一段线网,实际上可能包含缓冲器)

  • 起点:时钟CLK到达FF1的CK端(更精确地说,是CLK的跳变启动FF1的Q端变化)。
  • 终点:FF2的D端(数据必须在CLK跳变前稳定在D端)。
  • 时钟:同一个CLK。
  • 组合逻辑:FF1的Q端到FF2的D端之间的连线(及可能的缓冲)。

2.2 评判标准:建立时间与保持时间的“时间窗”

这是时序检查的黄金法则。每个时序元件(主要是触发器)都有两个关键参数:

  • 建立时间(Tsu):在时钟有效沿(如上升沿)到来之前,数据输入端(D)必须保持稳定的最短时间。
  • 保持时间(Th):在时钟有效沿到来之后,数据输入端(D)必须继续保持不变的最短时间。

你可以把时钟沿想象成一扇正在关闭的门,数据是你要送进去的快递。

  • 建立时间要求你在门关上前,提前至少Tsu时间把快递递到门口并拿稳。
  • 保持时间要求你在门关上后,手还要在门口保持至少Th时间,确保快递不会被门夹到或弹出来。

对于一条路径,STA工具会进行两种检查:

  1. 建立时间检查:确保数据从起点出发后,经过路径上的所有延迟,能提前足够早地到达终点,满足终点的Tsu。
  2. 保持时间检查:确保数据从起点出发后,经过路径上的所有延迟,不会太快到达终点,以至于“冲掉”了前一个时钟周期的数据,破坏了终点的Th。

2.3 延迟的构成:数据来晚了,怪谁?

路径上的延迟是导致违例的直接原因。延迟主要分两部分:

  • 单元延迟(Cell Delay):逻辑门(与门、或门、触发器等)本身的延迟。这取决于单元的驱动能力、输入信号转换时间、输出负载等因素。单元库(.lib文件)里以查找表的形式提供了各种条件下的延迟值。
  • 线延迟(Net Delay / Wire Delay):信号在金属连线上传输的延迟。在综合阶段,线延迟通常根据扇出和连线长度模型估算;在布局布线后,则根据实际的物理布线长度和RC参数精确计算。

回到那个三级触发器链的例子。假设时钟周期是10ns,CLK到FF1 CK端的延迟(时钟延迟)是1ns,FF1的CK到Q延迟(触发器内部延迟)是0.5ns,FF1 Q到FF2 D的线延迟是8ns,CLK到FF2 CK端的延迟是1.2ns,FF2的建立时间Tsu是0.3ns。

那么,数据到达FF2 D端的时间 = 时钟源延迟 + FF1的CK->Q延迟 + 路径线延迟 = 1ns + 0.5ns + 8ns = 9.5ns。 时钟到达FF2 CK端的时间 = 时钟源延迟 + FF2的时钟延迟 = 1ns + 1.2ns = 2.2ns(相对于时钟源)。建立时间检查要求:数据到达时间 ≤ 时钟到达时间 + 时钟周期 - Tsu。 即:9.5ns ≤ 2.2ns + 10ns - 0.3ns = 11.9ns。这个条件是满足的,有2.4ns的裕量(Slack)。

但是,如果线延迟不是8ns而是9ns呢?数据到达时间就变成了10.5ns,大于要求的11.9ns,就会产生-1.4ns的建立时间违例。这就是为什么“看起来简单”的路径也会违例——线延迟可能远超你的想象,尤其是在工艺节点较小、布线拥挤或驱动能力不足的情况下。

注意:在实际项目中,我们经常会遇到时钟树还没构建时的“理想时钟”情况,以及布局布线后的“传播时钟”情况。理想时钟下,工具假设时钟瞬间到达所有寄存器,延迟为0或很小,此时违例可能不多。一旦进行时钟树综合(CTS),时钟网络被插入缓冲器,时钟到各寄存器的延迟变得各不相同且不可忽略,很多隐藏的时序问题就会暴露出来。所以,中期和后期的时序签核至关重要。

3. 实战场景一:如何解决这道“简单”的建立时间违例题?

我们深入分析一下同事遇到的那个问题。假设目标时钟周期是2ns(频率500MHz),在布局布线后,工具报告了从FF1到FF2的路径存在建立时间违例,裕量(Slack)为-0.2ns。报告摘要可能类似这样:

Path Group: CLK Path Type: max (Setup) Endpoint: FF2/D (rising edge-triggered flip-flop) Beginpoint: FF1/CP (rising edge-triggered flip-flop) Launch Clock: CLK rising Latch Clock: CLK rising Required Time: 1.85ns Arrival Time: 2.05ns Slack: -0.20ns (VIOLATED)

这份报告告诉我们,数据到达比要求的时间晚了0.2ns。我们的任务是找出这0.2ns的延迟是从哪里“偷走”的,并把它“抢回来”。

3.1 分解延迟,定位瓶颈

我们需要查看详细的时序报告,它会列出路径上每一个节点的延迟贡献。一个简化的分解可能如下:

延迟项延迟值说明
时钟路径延迟 (Launch)0.6ns从时钟源到FF1/CK的延迟
FF1 CK->Q 延迟0.15ns触发器内部传播延迟
组合逻辑/线延迟1.3ns从FF1/Q到FF2/D的所有延迟
数据到达时间总和2.05ns0.6 + 0.15 + 1.3
时钟路径延迟 (Latch)0.55ns从时钟源到FF2/CK的延迟
时钟周期2.0ns
FF2 建立时间 (Tsu)0.1ns
要求到达时间1.85ns0.55 + 2.0 - 0.1
时序裕量 (Slack)-0.20ns1.85 - 2.05

从表格可以清晰看出,组合逻辑/线延迟(1.3ns)是最大的贡献者,占总数据路径延迟的绝大部分。时钟路径延迟也有影响,但两者相差不大(0.6ns vs 0.55ns),这不是主要矛盾。

3.2 解决方案与选型理由

面对建立时间违例,我们有一系列从设计到物理实现的优化手段,选择哪种取决于违例程度、设计阶段和面积功耗预算。

方案A:优化组合逻辑(首选)既然瓶颈在组合逻辑/连线,最直接的方法是减少这部分延迟。

  • 操作:检查FF1和FF2之间的网表。如果中间有复杂的逻辑,尝试逻辑优化(Logic Flattening)、重定时(Retiming)或插入流水线。如果只是长连线,可以:
    1. 插入缓冲器(Buffer Insertion):在长连线上插入一个或多个缓冲器,将长线分段驱动,减少每段线的RC延迟和末端单元的输入电容负载。这是后端工具(如ICC2/Innovus)的常用优化手段。
    2. 增大驱动器的尺寸:将FF1的输出驱动器换成一个驱动能力更强的单元,使其能更快地对负载电容(包括连线和FF2的输入电容)充电。
  • 理由:这是从根源上解决问题,效果直接。优化组合逻辑还能降低动态功耗。在设计的早期(RTL或综合阶段)就应考虑逻辑划分,避免过长的组合路径。

方案B:调整时钟树(谨慎使用)通过调整时钟路径延迟来“创造”更多时间。

  • 操作:让数据发射端(FF1)的时钟来得稍晚一些(增加Launch Clock Latency),或者让数据捕获端(FF2)的时钟来得稍早一些(减少Latch Clock Latency)。这可以通过在时钟树上插入延迟单元(Delay Cell)或调整时钟缓冲器的大小/位置来实现。
  • 理由:这相当于人为地改变了时钟相位关系。这种方法需要极其谨慎,因为它会影响所有共享该时钟路径的寄存器,可能解决了一条路径的违例,却导致其他路径出现保持时间违例或新的建立时间违例。通常只在少数关键路径、且其他方法无效时,由后端工程师在时钟树综合(CTS)阶段进行微调。

方案C:降低时钟频率(最后手段)

  • 操作:如果设计允许,将时钟周期从2ns放宽到2.2ns或更大。
  • 理由:这是最简单的办法,但意味着性能下降。在项目初期确定时钟目标时,需要留有一定的时序裕量(比如10%-20%),以应对后端实现的延迟不确定性。如果签核时裕量不足,可能需要重新评估性能指标。

针对本例,由于是简单的触发器链,逻辑无法再优化,所以**方案A中的“插入缓冲器”或“增大驱动器”**是最可行的。我们可以让后端工具尝试这些优化,并关注是否会引起其他问题(如拥塞、功耗增加)。

实操心得:看时序报告时,一定要养成先看“最差裕量路径(Worst Slack Path)”的习惯,并重点分析其数据路径延迟时钟路径延迟的构成。如果数据路径延迟占比过高(比如超过周期的70%),那优化重点就在逻辑和连线上;如果时钟偏差(Clock Skew,即Launch和Latch时钟延迟之差)很大且为负值(捕获时钟比发射时钟早到很多),那可能是时钟树没做好,需要检查CTS策略。另外,不要只盯着一条路径修,工具修复一条路径可能会恶化相邻路径,修复后要做增量时序分析(Incremental STA)确认整体效果。

4. 实战场景二:当保持时间违例来袭——数据来得“太快”也是错

解决了建立时间问题,我们经常会遇到另一个“孪生兄弟”——保持时间违例。如果说建立时间违例是担心数据“迟到”,那么保持时间违例就是担心数据“早退”。它发生在同一个时钟沿,检查的是当前周期发射的数据,不能太快到达而覆盖了前一个周期还需要被锁存的数据。

让我们构造一个场景:一个时钟分频电路,用触发器实现2分频。按道理,Q输出每周期翻转一次,似乎很安全。但在某些条件下,它也可能出现保持时间违例。

CLK --->| FF |----> Q (反馈回 D) |___|

假设时钟周期为2ns。在时钟上升沿,FF捕获D端的数据,经过CK->Q延迟(假设0.1ns),Q端输出新值。这个新值通过一根非常短、延迟几乎为0的连线,直接反馈到了D端。那么,在同一个时钟上升沿之后,D端的数据几乎立刻就改变了。

保持时间检查关注的是:前一个时钟周期(n-1周期)发射的数据,在n周期的时钟沿之后,必须在D端保持稳定至少Th时间。 在这个例子里,n-1周期发射的数据(即上一个Q值)在n周期时钟沿后,D端几乎瞬间就被n周期新产生的Q值覆盖了。如果触发器的保持时间Th大于这个“瞬间”(比如Th=0.05ns,而数据变化在0.01ns内发生),那么就会发生保持时间违例。工具会报告:数据在时钟沿后,保持稳定的时间不足Th。

4.1 为什么会出现保持时间违例?

保持时间违例的根本原因是数据路径延迟太短。常见于:

  1. 直接反馈路径:如上例,Q到D的路径极短。
  2. 时钟偏差(Clock Skew)不利:如果捕获触发器的时钟比发射触发器的时钟晚到很多(大的正Skew),对于发射触发器来说,数据在下一个周期很早就发出了,但对于捕获触发器,它的时钟还没到,当前周期的数据需要保持更久,这加剧了保持时间压力。注意,时钟偏差对建立时间和保持时间的影响是相反的:正Skew有利于建立时间(给数据更多时间传输),但不利于保持时间(要求前一个数据保持更久)。
  3. 工艺角(Corner)变化:在芯片制造中,晶体管速度会因工艺、电压、温度(PVT)变化而不同。我们通常在“最坏情况(Worst Case,慢速)”下检查建立时间(因为延迟大,容易迟到),在“最好情况(Best Case,快速)”下检查保持时间(因为延迟小,数据到得快,容易早退)。在Best Case下,单元和连线延迟最小,数据跑得飞快,最容易引发保持时间违例。

4.2 修复保持时间违例的“刹车”艺术

修复保持时间违例的思路与建立时间相反:我们需要给数据路径“增加延迟”,让数据慢点到达。

方案A:插入延迟单元(Delay Cell / Buffer)

  • 操作:在数据路径上,插入一个或多个专用的延迟单元(本质上是几个串联的反相器或缓冲器)。这些单元几乎没有逻辑功能,主要作用就是引入固定的传播延迟。
  • 理由:这是最直接、最常用的方法。后端工具在修复保持时间违例时,会自动在数据路径上插入这些“刹车片”。需要注意的是,插入的延迟单元会增加面积和功耗,也可能对建立时间产生微小影响(因为路径总延迟增加了),但通常影响很小。

方案B:调整时钟树(利用时钟偏差)

  • 操作:与修复建立时间相反,我们可以尝试减小捕获路径的时钟延迟增加发射路径的时钟延迟,从而减小正Skew或制造负Skew,让捕获时钟相对更早到来,缩短数据需要保持的时间窗口。
  • 理由:这同样需要全局考量,因为调整时钟树是牵一发而动全身的。通常由时钟树综合工具在优化时钟偏差时一并考虑。

方案C:更换速度更慢的单元

  • 操作:将路径上的某个逻辑门(或触发器)替换为驱动能力更弱、延迟更大的同类单元。
  • 理由:增加单元延迟。但这可能不是最优选择,因为它会影响该单元驱动其他路径的性能,且可选单元有限。

对于分频器例子,标准的做法就是在反馈路径(Q到D)上插入一个小的缓冲器链,人为增加一点延迟,确保在时钟沿后,D端的数据能稳定足够长的时间以满足Th。

注意事项:保持时间违例是必须修复的,否则电路功能在硅片上会直接出错。而建立时间违例可能只意味着电路最高工作频率达不到预期,在低频下或许还能工作。修复保持时间违例所增加的延迟,通常不会恶化建立时间,因为在最坏工艺角下,这些插入的延迟单元本身的延迟也会变大。修复工作一般在布局布线后,进行签核(Sign-off)STA时重点处理。工具通常提供“修复保持时间违例”的选项,可以自动插入延迟单元。

5. 进阶挑战:多周期路径与虚假路径——告诉工具“别瞎算”

在实际设计中,并非所有路径都需要在一个时钟周期内完成。有些逻辑运算本来就需要多个时钟周期,比如一个复杂的乘法器。如果我们不告诉STA工具这个特殊情况,工具会傻傻地按单周期去检查,结果肯定是疯狂的建立时间违例。这时就需要用到**多周期路径(Multicycle Path, MCP)**约束。

5.1 多周期路径(MCP)约束详解

假设我们有一个32位乘法器,其流水线设计使得结果在3个时钟周期后才有效。从乘法器输入寄存器(FF_A)到结果输出寄存器(FF_B)的路径,就是一个典型的多周期路径。

如果不加约束,工具认为数据从FF_A发出后,必须在下一个CLK上升沿前到达FF_B的D端。这显然不可能,会导致巨大的违例。

我们需要使用SDC(Synopsys Design Constraints)命令来告诉工具:

set_multicycle_path 3 -setup -from [get_pins FF_A/CP] -to [get_pins FF_B/D] set_multicycle_path 2 -hold -from [get_pins FF_A/CP] -to [get_pins FF_B/D]
  • -setup 3:告诉工具,建立时间检查的周期数放宽到3。即数据从FF_A发出后,可以在第3个时钟沿(而不是第1个)之前到达FF_B。这样,允许的路径延迟时间就变成了3 * Tclk - Tsu
  • -hold 2:这是与多周期建立时间约束配套的保持时间约束。它的含义是,保持时间检查的参考点要向前移动(n-1)个周期。对于3周期建立时间路径,默认的保持时间检查会非常严格(检查数据是否在第一个时钟沿后就改变了)。设置-hold 2意味着保持时间检查参考的是发射沿前第2个周期的沿,这更符合多周期路径的实际行为:确保在FF_B捕获数据时,来自FF_A的正确数据(即3个周期前发射的那个)已经稳定,而不会被中间周期发射的错误数据干扰。

理解关键:多周期路径约束的本质是重新定义发射沿和捕获沿的关系。默认是发射沿为n,捕获沿为n+1。-setup N把捕获沿改为 n+N。-hold N把保持时间检查的发射沿改为 n-N。

5.2 虚假路径(False Path)约束:彻底“无视”某些路径

比多周期路径更“彻底”的是虚假路径。它指的是那些在电路实际正常工作模式下,信号永远不会传播的路径,或者其时序要求不需要检查的路径。常见的例子包括:

  • 测试逻辑路径:扫描链(Scan Chain)上的路径,只在测试模式下使用,功能模式下无效。
  • 跨时钟域路径:两个完全异步的时钟域之间的数据路径。它们的时序无法用同步时钟的周期来衡量,需要通过同步器(如两级触发器)来处理,其同步器之前的路径应设为虚假路径。
  • 上电复位路径:只在上电或复位时生效的路径。
  • 故意忽略的路径:某些具有特殊设计保证的路径。

设置虚假路径的命令很简单:

set_false_path -from [get_clocks CLK_A] -to [get_clocks CLK_B]

这条命令告诉STA工具,所有从CLK_A时钟域出发,到CLK_B时钟域结束的路径,都不需要进行时序分析。

使用虚假路径的陷阱必须绝对确信这条路径在功能上确实无需时序检查。如果误设了虚假路径,可能导致真正的时序问题被掩盖,造成芯片流片后失效。例如,如果两个时钟域实际上是相关的(比如同源但分频),它们之间的路径就需要用set_clock_groupsset_max_delay来约束,而不是简单地设为虚假路径。

经验之谈:约束(SDC)是STA的灵魂,也是最容易出错的地方。多周期路径和虚假路径的约束尤其需要谨慎。我的建议是:

  1. 充分理解设计意图:和架构师、设计工程师确认哪些路径是多周期的,周期数是多少。
  2. 约束文档化:为每一条非常规约束(MCP, False Path)添加注释,说明原因。
  3. 交叉验证:约束写完后,用STA工具报告检查被约束的路径是否按预期被排除或放宽了检查。同时,也要检查是否无意中约束了不该约束的路径。
  4. 同步器路径处理:对于异步时钟域交叉(CDC)路径,标准的做法是将同步器第一级触发器的D端路径设为虚假路径(因为亚稳态无法用时序保证),而同步器内部(两级触发器之间)及其后的路径仍需进行严格的时序检查,以确保同步器本身的可靠性。

6. 从理论到签核:一个完整STA流程的踩坑实录

理解了概念和单一场景的解决方法,我们还需要把它们串起来,放到一个真实的项目流程中去看。这里我分享一次从综合后到布局布线后时序签核的经历,其中遇到的坑很有代表性。

项目背景:一个中等规模的数字处理模块,目标频率300MHz(周期3.33ns),采用28nm工艺。综合后(使用理想时钟)的时序报告看起来很美,建立时间裕量有0.8ns。但进入布局布线阶段后,问题开始涌现。

第一坑:理想时钟 vs. 传播时钟综合阶段,我们通常使用set_ideal_networkset_clock_latency设定一个理想的时钟延迟(比如0.1ns)。这时时钟树不存在,时钟偏差(Skew)也为0或很小。时序报告乐观。 布局布线后,工具进行了时钟树综合(CTS),生成了真实的时钟网络。这时,时钟到各个寄存器的延迟各不相同,可能从0.3ns到0.8ns不等,时钟偏差也出现了。我们使用set_propagated_clock将时钟设置为传播模式,工具根据实际布线计算时钟延迟。问题:切换后,原先裕量0.8ns的路径,因为捕获时钟延迟增加(比如从0.1ns变成0.7ns),导致要求时间提前,裕量可能直接变成-0.2ns。许多路径的建立时间违例暴露出来。教训:综合阶段不能过于乐观。可以在SDC中给时钟网络设置一个合理的估计延迟和偏差(例如set_clock_latency 0.5 [get_clocks CLK];set_clock_uncertainty 0.2 [get_clocks CLK]),让综合工具在优化逻辑时就把这部分“预算”考虑进去,这样综合出的网表更接近后端实际情况。

第二坑:互连延迟模型的偏差综合阶段,线延迟是根据扇出和单元位置估算的(Wire Load Model)。这个模型在模块较小、布局规整时还算准确,但当模块变大或布局稀疏/拥挤时,估算误差很大。 布局布线后,工具根据实际的金属层、布线长度、宽度、间距计算精确的RC参数,从而得到更真实的线延迟。问题:一条在综合阶段报告延迟为0.5ns的net,在布局布线后实际延迟可能达到1.2ns,直接导致建立时间违例。教训:对于高性能设计,不能依赖粗糙的线负载模型。应该在综合后尽快进行物理综合带有布局信息的综合,让工具基于初步的布局位置来估算线延迟,准确性会高很多。

第三坑:修复保持时间违例引发的连锁反应布局布线后,工具自动修复了大量保持时间违例,主要方法是在数据路径上插入延迟单元(Buffer)。问题:这些插入的Buffer增加了数据路径的延迟,虽然解决了保持时间问题,但轻微恶化了某些边际路径的建立时间。同时,新增的Buffer占用了额外的布线资源,可能加剧局部拥塞(Congestion),而拥塞又会导致绕线变长,线延迟进一步增加,形成恶性循环。教训

  1. 修复时序违例要有全局观。修复一条路径后,必须做增量时序分析,看是否影响了其他路径。
  2. 关注拥塞报告。高拥塞区域是时序的“重灾区”。可能需要通过调整布局、优化模块形状、增加布线通道等手段来缓解拥塞。
  3. 保持时间修复可以分步进行。先修复最严重的违例,然后重新评估建立时间和拥塞,再决定下一步修复策略。

第四坑:不同工艺角(Corner)下的时序闭合我们通常在WC(Worst-Case)工艺角(慢速晶体管,高电压,低温?不对,通常是高温)下检查建立时间,在BC(Best-Case)工艺角(快速晶体管,低电压,低温)下检查保持时间。但芯片需要同时在多种条件下工作。问题:在WC Corner下修复了建立时间违例的优化(比如增大驱动器、插入Buffer),在BC Corner下可能会因为延迟变小而不足以修复保持时间违例,甚至可能因为插入的Buffer导致新的保持时间问题。反之亦然。教训:必须进行多角多模(MCMM)分析。工具需要同时加载多个工艺角、电压、温度(PVT)条件下的单元库和RC参数文件,并在一次运行中检查所有场景下的时序。最终的签核(Sign-off)必须保证在所有指定的工艺角下,建立时间和保持时间都满足要求(裕量为正)。这常常需要在不同Corner之间进行折衷优化。

最终签核:经过几轮迭代优化——包括调整布局、优化时钟树、手动指导关键路径布线、微调约束——我们最终在WC(SS, 0.9V, 125C)和BC(FF, 1.1V, -40C)两个关键工艺角下,都实现了正的建立时间和保持时间裕量(>0.05ns),完成了时序闭合。

这个过程让我深刻体会到,STA不是一个孤立的分析步骤,而是贯穿整个物理实现流程的、与逻辑设计、布局、布线、功耗分析紧密互动的活动。每一个决策都可能产生连锁反应。作为设计者或验证者,我们不仅要会看报告,更要理解数据背后的物理意义,以及工具优化策略的局限性,这样才能在出现问题时,做出最有效的干预。