1. 时序基础概念:建立时间、保持时间、时钟周期、时序路径的定义与物理意义
各位同学,咱们今天聊聊时序分析里最基础、也最绕不开的几个概念。说实话,我刚入行那会儿,觉得这些东西背下来就行了。直到有一次,一个项目在 sign-off 阶段死活过不了,我才真正体会到——这些概念不是用来背的,是用来理解芯片怎么工作的。
1.1 时钟周期:芯片的心跳
时钟周期,说白了就是时钟信号一个高电平加一个低电平的总时长。比如 1GHz 的时钟,周期就是 1ns。你想想看,芯片里所有逻辑门都在这个节拍下跳舞。
我个人习惯把时钟周期想象成「一个节拍的长度」。每个节拍内,数据要从一个触发器跑到下一个触发器,还得留出余量。如果跑不到,那就出问题了。
核心公式:
T_clk ≥ T_clk2q + T_logic + T_setup + T_skew
其中:
- T_clk:时钟周期
- T_clk2q:触发器输出延迟
- T_logic:组合逻辑延迟
- T_setup:建立时间
- T_skew:时钟偏斜
我在项目中遇到过,有人把时钟周期设得很紧,结果后仿发现时序违例一大堆。嗯,这里要注意:时钟周期不是你想设多少就设多少,得看你的逻辑深度和工艺库。
1.2 建立时间:数据要提前到
建立时间(setup time)是指,在时钟有效沿到来之前,数据必须稳定到达的时间窗口。为什么要有这个?因为触发器内部需要时间把数据「锁住」。
我曾经在一个 28nm 的项目里,发现一条路径的建立时间违例了 50ps。查了半天,原来是一个多级 MUX 的延迟太大了。后来我加了一级流水线,问题就解决了。
避坑指南:
我曾经以为建立时间只跟触发器本身有关。后来发现,时钟偏斜(clock skew)也会影响建立时间。如果时钟到达目的触发器的路径比源触发器长,那建立时间裕度就会变小。这个坑我踩过,大家注意。
1.3 保持时间:数据不能跑太快
保持时间(hold time)是建立时间的「反面」。它要求时钟有效沿之后,数据还要稳定一段时间。为什么?因为触发器内部需要时间把数据「写入」存储节点。
你想想看,如果数据在时钟沿之后立刻变化,那触发器可能锁到错误的值。保持时间违例通常发生在短路径上——数据跑得太快了。
| 概念 | 检查方向 | 常见原因 |
|---|---|---|
| 建立时间 | 数据到达太晚 | 逻辑太深、负载太大 |
| 保持时间 | 数据变化太快 | 路径太短、时钟偏斜 |
我记得有一次,一个保持时间违例查了三天。最后发现是时钟树综合时,某个分支的 buffer 插多了,导致时钟偏斜过大。嗯,保持时间违例比建立时间更难修,因为它往往需要加 buffer 来延迟数据路径。
1.4 时序路径:数据的旅行路线
时序路径,就是数据从起点到终点的完整路线。常见的路径类型有四种:
- 输入到寄存器:从芯片引脚到内部触发器
- 寄存器到寄存器:从一个触发器到另一个触发器
- 寄存器到输出:从内部触发器到芯片引脚
- 输入到输出:从芯片引脚到芯片引脚(纯组合路径)
我个人习惯把时序路径想象成「快递路线」。数据是包裹,触发器是驿站,组合逻辑是山路。包裹必须在规定时间内送到下一个驿站,否则就超时了。
注意:
寄存器到寄存器的路径是最常见的,也是 STA 分析的重点。但不要忽略 IO 路径,很多芯片的瓶颈其实在 IO 上。
1.5 知识体系结构图
下面这张图展示了本章的核心逻辑关系:
1.6 实际项目中的体会
说了这么多理论,我分享一点实际经验。在项目中,建立时间和保持时间往往是「跷跷板」的关系。你修了建立时间,可能让保持时间变差;你修了保持时间,又可能让建立时间变差。
我个人习惯的做法是:先保证建立时间满足,再处理保持时间。因为建立时间违例通常意味着逻辑太深,需要改架构;而保持时间违例往往可以通过加 buffer 来修,代价相对小一些。
小技巧:
在综合阶段,我会把建立时间的约束设得比实际要求紧 10% 左右。这样给后端留点余量,避免后面修起来手忙脚乱。这个习惯我用了好多年,挺管用的。
好了,这一章的内容就到这里。时序基础概念是 STA 的根基,理解透了,后面分析违例原因时才能得心应手。