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 知识体系结构图

下面这张图展示了本章的核心逻辑关系:

时序分析基础 时钟周期 建立时间 保持时间 时序路径 频率决定性能 约束逻辑深度 数据提前到达 受时钟偏斜影响 数据稳定保持 短路径易违例 reg-to-reg IO路径 共同决定芯片能否正常工作

1.6 实际项目中的体会

说了这么多理论,我分享一点实际经验。在项目中,建立时间和保持时间往往是「跷跷板」的关系。你修了建立时间,可能让保持时间变差;你修了保持时间,又可能让建立时间变差。

我个人习惯的做法是:先保证建立时间满足,再处理保持时间。因为建立时间违例通常意味着逻辑太深,需要改架构;而保持时间违例往往可以通过加 buffer 来修,代价相对小一些。

小技巧:

在综合阶段,我会把建立时间的约束设得比实际要求紧 10% 左右。这样给后端留点余量,避免后面修起来手忙脚乱。这个习惯我用了好多年,挺管用的。

好了,这一章的内容就到这里。时序基础概念是 STA 的根基,理解透了,后面分析违例原因时才能得心应手。

可可精品资料库