第二章: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,修了整整三天。
今天就到这儿。有问题随时问我。