第二章:STA基础理论——建立时间与保持时间,时序路径的四大类型
各位同学,今天我们来聊聊STA最核心的两个概念——建立时间和保持时间。说实话,我刚入行那会儿,觉得这两个概念背下来就行了。直到有一次,我负责的一个28nm芯片在量产测试时发现大批量失效,排查了整整两周,最后发现就是保持时间违例。嗯,从那以后,我再也不敢小看这两个基础概念了。
2.1 建立时间与保持时间——触发器的“脾气”
每个触发器都有它的“脾气”。你给它时钟沿,它不会立刻乖乖地采样数据。它需要数据在时钟沿到来之前稳定一段时间,这叫建立时间(Setup Time);在时钟沿之后还得再稳定一段时间,这叫保持时间(Hold Time)。
核心定义:
- 建立时间(Tsu):数据在时钟有效沿之前必须保持稳定的最短时间。
- 保持时间(Th):数据在时钟有效沿之后必须保持稳定的最短时间。
说白了,触发器就像个“挑剔”的采样器。数据来得太早或太晚,它都会采错。我习惯把建立时间比作“提前到场”,保持时间比作“不要早退”。
2.2 建立时间违例与保持时间违例
为什么会违例?我们来看两个场景。
建立时间违例
数据路径太长,或者组合逻辑太多,导致数据到达触发器的时间晚于时钟沿。这时候,触发器采到的可能是上一个周期的旧数据,或者干脆是毛刺。
避坑指南:我曾经在一个高速设计中,发现一条路径的建立时间总是差0.1ns。查了半天,发现是综合工具把一条关键路径的buffer插多了。后来我手动调整了逻辑级数,问题就解决了。记住,建立时间违例通常靠降低频率或优化路径来解决。
保持时间违例
数据路径太短,或者时钟偏斜太大,导致数据在时钟沿之后变化太快,触发器还没来得及锁存。保持时间违例比建立时间违例更“阴险”——它通常不会在仿真中暴露,只有在芯片回来后才会出现。
注意:保持时间违例不能通过降低频率来解决!你想想看,频率再低,数据变化的速度不变,该违例还是违例。唯一的办法是插入buffer,增加数据路径的延迟。
2.3 时序路径的四大类型
STA把芯片里的所有路径分成四类。我刚开始学的时候觉得分类很烦,后来发现,这四类路径的约束方法和分析思路完全不同。搞清楚了,时序收敛就成功了一半。
下面这张图是我自己画的,帮你快速理解这四类路径的关系:
类型1:reg2reg(寄存器到寄存器)
这是最常见的路径,也是STA分析的核心。数据从一个触发器的输出,经过组合逻辑,到达另一个触发器的输入。
分析公式:
建立时间检查:Tclk + Tskew - Tcq - Tlogic - Tsu >= 0
保持时间检查:Tcq + Tlogic - Th - Tskew >= 0
其中Tclk是时钟周期,Tcq是触发器的时钟到输出延迟,Tlogic是组合逻辑延迟,Tsu是建立时间,Th是保持时间,Tskew是时钟偏斜。
我个人习惯在项目初期先跑一遍reg2reg的时序,因为这部分路径占了芯片的80%以上。如果reg2reg都过不了,那其他路径基本不用看了。
类型2:reg2out(寄存器到输出端口)
数据从触发器输出,经过组合逻辑,直接送到芯片的输出引脚。这种路径的约束通常由外部芯片的时序要求决定。
实战经验:我曾经做过一个DDR接口的芯片,reg2out路径的约束特别严格。因为外部DDR颗粒要求数据在时钟沿之后0.5ns内必须有效。我花了整整一周调整输出驱动强度和路径延迟,才把时序收敛下来。
类型3:in2reg(输入端口到寄存器)
数据从芯片的输入引脚进来,经过组合逻辑,到达第一个触发器的输入端。这种路径的约束通常由前级芯片的时序决定。
你想想看,输入信号什么时候到达,取决于前级芯片的时钟和数据关系。所以STA工具需要你提供输入延迟(input delay)的约束。
类型4:in2out(输入端口到输出端口)
这是纯组合逻辑路径,数据从输入引脚直接经过组合逻辑送到输出引脚,中间没有寄存器。这种路径在STA中比较特殊,因为它没有时钟沿来“采样”,所以约束方式也不同。
注意:in2out路径在STA中通常用最大延迟和最小延迟来约束,而不是建立时间和保持时间。我见过不少新手把in2out路径的约束搞混,结果芯片回来后发现输出信号毛刺严重。
2.4 四大路径的约束方法总结
| 路径类型 | 起点 | 终点 | 约束方式 | 常见问题 |
|---|---|---|---|---|
| reg2reg | 触发器时钟端 | 触发器数据端 | 时钟周期约束 | 建立时间违例(路径太长) |
| reg2out | 触发器时钟端 | 输出端口 | 输出延迟约束(set_output_delay) | 输出信号过慢或过快 |
| in2reg | 输入端口 | 触发器数据端 | 输入延迟约束(set_input_delay) | 输入信号到达时间不满足 |
| in2out | 输入端口 | 输出端口 | 最大/最小延迟约束(set_max_delay/set_min_delay) | 组合逻辑延迟过大或过小 |
2.5 我的个人建议
说了这么多,最后分享几个我自己的习惯:
- 先跑reg2reg,再跑其他:reg2reg是STA的“基本盘”,这部分过了,其他路径才有意义。
- 保持时间违例要尽早处理:建立时间违例后期还能通过降频来补救,保持时间违例一旦流片,就是硬伤。
- in2out路径别忽略:虽然in2out路径在数字芯片中不多见,但一旦出现,往往是最难收敛的。我建议在综合阶段就加上最大延迟约束。
- 多画时序图:遇到复杂的时序问题,别急着改代码。拿张纸画个时序图,数据什么时候到、时钟什么时候来,一目了然。
好了,这一章的内容就到这里。建立时间和保持时间是STA的基石,四大路径类型是STA的分析框架。把这些基础打牢了,后面讲时序约束和优化方法时,你就能轻松跟上。