第二章:STA基础回顾——建立时间与保持时间、setup/hold violation、时序路径分类

各位同学,咱们今天聊聊STA的基础。说实话,很多工程师干了三五年,对setup和hold的理解还是停留在“大概知道”的层面。但你要知道,流片回来的芯片能不能跑,STA是最后一道防线。我见过太多项目,因为一个hold violation没修干净,芯片直接废掉。

好,咱们正式开始。

2.1 建立时间与保持时间——芯片的“心跳”规则

先问大家一个问题:为什么寄存器要有setup和hold的要求?

说白了,寄存器就是个“采样器”。它要在时钟沿到来的时候,把D端的数据正确抓进去。但数据不是瞬间稳定的,它需要时间。

  • 建立时间(Setup Time):数据在时钟沿到来之前,必须保持稳定的最短时间。
  • 保持时间(Hold Time):数据在时钟沿到来之后,必须保持稳定的最短时间。

我打个比方。你拍照的时候,模特得先摆好姿势(setup),拍完之后也不能马上动(hold)。如果模特动早了或者动晚了,照片就糊了。芯片也是一样,数据“糊了”就是误采样。

重要概念:Setup和hold是寄存器的物理特性,不是我们“设计”出来的。工艺库里的每个寄存器,都标明了setup和hold的值。你改不了,只能遵守。

我在项目中遇到过一件事。有个同事为了省面积,用了最小尺寸的寄存器。结果时序分析发现,hold margin全是负的。为什么?因为小尺寸寄存器的hold时间反而更大。嗯,这里要注意:面积和时序,永远是trade-off。

2.2 Setup/Hold Violation——时序收敛的“死敌”

什么是violation?就是时序没满足。咱们分两类说。

2.2.1 Setup Violation(建立时间违例)

setup violation的意思是:数据来得太慢了。时钟沿都到了,数据还没准备好。

公式很简单:

数据到达时间 > 数据要求时间 - setup时间

说白了,就是路径太长了。组合逻辑太多,线太长,或者cell驱动能力不够。

怎么修?我个人的习惯是:

  • 先看是不是线太长——插buffer或者换驱动能力强的cell
  • 再看是不是逻辑级数太多——重写RTL,或者用retiming
  • 最后考虑降频——但这是下下策

我的经验:我曾经修一个setup violation,折腾了两周。最后发现是综合的时候约束写错了,false path没设对。所以,先检查约束,再动手修。别上来就改电路。

2.2.2 Hold Violation(保持时间违例)

hold violation的意思是:数据变得太快了。时钟沿刚过,数据就变了,寄存器没来得及锁住。

公式:

数据保持时间 < hold时间

hold violation在布局布线中特别常见。尤其是时钟树综合之后,时钟偏斜(skew)会导致hold问题。

怎么修?我建议:

  • 插delay cell——让数据路径变慢
  • 加buffer——增加路径延迟
  • 调整时钟树——减少skew

避坑指南:我曾经修hold violation,插了一堆delay cell。结果setup又崩了。为什么?因为delay cell也增加了setup路径的延迟。所以,修hold的时候一定要看setup的余量。hold和setup是跷跷板,你得平衡。

2.3 时序路径分类——STA的“地图”

STA不是漫无目的地检查。它把芯片里的所有路径分成四类。你想想看,知道了分类,你才知道问题出在哪。

路径类型 起点 终点 典型场景
输入到寄存器 输入端口 寄存器D端 片外信号进入芯片
寄存器到寄存器 寄存器Q端 寄存器D端 核心逻辑路径
寄存器到输出 寄存器Q端 输出端口 数据输出到片外
输入到输出 输入端口 输出端口 纯组合逻辑路径

这四类路径,STA工具会分别检查setup和hold。你想想看,最常出问题的是哪一类?

没错,寄存器到寄存器。因为这类路径最长,组合逻辑最多。我做过一个项目,90%的violation都出在reg-to-reg路径上。

2.3.1 输入到寄存器路径

这类路径的起点是芯片的输入引脚。数据从片外进来,经过一些组合逻辑,到达寄存器的D端。

约束的时候,你需要告诉工具:片外信号什么时候到?这就是input delay。我见过有人把input delay设成0,结果时序分析全是假的。嗯,这里要注意:input delay要跟片外芯片的规格对齐。

2.3.2 寄存器到寄存器路径

这是STA的核心。两个寄存器之间,经过组合逻辑。STA会检查:

  • setup:数据能不能在一个时钟周期内传过去
  • hold:数据会不会被下一个时钟沿“冲掉”

我个人习惯,先看setup。因为setup violation通常意味着逻辑太深,需要大改。hold violation反而好修,插几个buffer就行。

2.3.3 寄存器到输出路径

数据从寄存器出来,经过输出端口到片外。约束的时候要设output delay,告诉工具片外芯片什么时候需要数据。

我曾经犯过一个错:output delay设得太紧,导致工具疯狂插buffer,面积暴涨。后来发现,片外芯片其实没那么快。所以,output delay要跟后端沟通,别自己瞎猜。

2.3.4 输入到输出路径

纯组合逻辑路径。没有寄存器,数据从输入直接到输出。这类路径在STA里相对简单,但要注意:如果路径太长,一个时钟周期可能不够。

小技巧:对于输入到输出路径,我建议加一级寄存器。这样可以把组合路径打断,时序好修很多。当然,这会增加一个时钟周期的延迟,看你的设计能不能接受。

2.4 小结

好,咱们回顾一下今天的内容:

  • setup和hold是寄存器的物理特性,你改不了,只能满足
  • setup violation是数据来晚了,hold violation是数据变快了
  • 时序路径分四类,reg-to-reg是最核心的

下一章,咱们会深入讲时钟树综合。时钟树做不好,时序全是白搭。到时候我会分享一个我踩过的坑——时钟skew导致hold violation,修了整整三天。

今天就到这儿。有问题随时问我。