4. 建立时间与保持时间:时序裕量的基本概念

这一讲,我们来聊聊数字电路里最基础、也最要命的概念——建立时间 (Setup Time) 和保持时间 (Hold Time)。

说白了,它们就是触发器这个"小盒子"对数据信号提出的两个时间要求。你想想看,如果数据不能在正确的时间窗口内稳定下来,系统就会出问题。我刚开始做硬件时,就因为没搞懂这两个概念,折腾了好几个通宵。

4.1 为何需要建立时间与保持时间

触发器内部是靠锁存器结构工作的。时钟沿来临时,它需要一小段时间来"看清楚"输入数据。如果数据变化得太靠近时钟沿,触发器就可能进入亚稳态,也就是输出不确定是0还是1。

建立时间 (tsu):时钟有效沿到来之前,数据必须保持稳定的最小时间。

保持时间 (th):时钟有效沿到来之后,数据必须保持稳定的最小时间。

这两个时间都是触发器的固有属性,由工艺决定。你在芯片数据手册里都能找到它们的数值。

参数 方向 含义
tsu (建立时间) 时钟沿前 数据需提前到达并稳定
th (保持时间) 时钟沿后 数据需继续稳定一段时间

关键理解:建立时间和保持时间加在一起,构成了数据在时钟沿附近的"禁入区"。数据边沿绝不能落在这个窗口里,否则触发器会"犹豫不决"。

4.2 建立时间裕量公式推导

好,我们来手推一下建立时间裕量 (Setup Slack) 的公式。这是时序分析的灵魂。

考虑一个最简单的路径:从第一个触发器的时钟端,到第二个触发器的数据输入端。我们需要保证数据能在第二个触发器采样之前稳定下来。

数据从第一个触发器的时钟端,到第二个触发器数据输入端的传输延迟,我们称为数据路径延迟 (Tdata)。它包含:

  • Tco:触发器从时钟沿到数据输出的内部延迟
  • Tlogic:组合逻辑的传播延迟
  • Troute:走线延迟

数据的启动时间 (Launch Edge) 是一个时钟沿。采样时间 (Capture Edge) 是下一个时钟沿。对于同步电路,两个时钟沿之间的时间差就是一个时钟周期 (Tclk)。

数据必须在采样时钟沿到来之前,提前一个建立时间 (tsu) 就稳定下来。所以,数据实际到达的时间必须满足:

Tdata ≤ Tclk - tsu

如果再加上时钟偏移 (Clock Skew, Tskew) 的影响,也就是两个触发器的时钟到达时间有差异,公式会变得更全面:

Tdata + Tskew ≤ Tclk - tsu

两边移项,就得到了建立时间裕量:

Setup Slack = Tclk - (Tdata + tsu + Tskew)

裕量必须大于0,时序才满足。如果裕量是负数,那就说明时序违例了。

警告:我曾经在一个项目中,忽略了时钟偏移 (Tskew) 的影响。结果裕量算出来刚刚好,实际板卡却偶尔出现数据错误。排查了两天才发现,是时钟树不平衡导致了Tskew过大。从那以后,我设计时一定会留出至少10%~20%的裕量余量。

4.3 保持时间裕量公式

保持时间裕量 (Hold Slack) 的推导思路类似,但考察的是数据在时钟沿之后的行为。

数据在采样时钟沿到来之后,不能变化得太快。它必须继续稳定一段保持时间 (th)。数据路径的最小延迟 (Tdata_min) 必须足够长,才能保证数据不会过早地穿过并破坏上一拍的数据。

保持时间裕量的核心公式:

Hold Slack = Tdata_min - th + Tskew

注意,这里的Tdata_min是数据路径的最小可能延迟(比如考虑PVT下的最快情况)。同样,裕量必须大于0。

我建议你记住一个口诀:建立时间看最慢路径,保持时间看最快路径。因为建立时间担心数据到得太晚,保持时间担心数据到得太早。

时序检查 关注点 路径延迟选择
建立时间 数据是否能及时到达 最大延迟路径
保持时间 数据是否会过早消失 最小延迟路径

4.4 时序裕量计算的直观理解

让我用一张SVG图来展示整个时序分析的流程。这张图是我自己画的,你一看就明白。

时序裕量计算流程 1. 时钟周期 Tclk 2. 数据路径 Tdata 3. 时钟偏移 Tskew 4. 计算总需求:Treq_su = Tclk - tsu + Tskew 5. 比较:Tdata 与 Treq_su Setup Slack > 0 ✅ 通过 Setup Slack < 0 ❌ 违例 裕量 = 实际到达时间 - 最晚允许到达时间

我的小技巧:每次做RGMII接口的时序分析时,我都会先列出所有路径的Tdata和tsu参数,然后一个一个地套公式算裕量。这样做虽然繁琐,但能避免漏掉某个关键路径。我习惯建立一个Excel表格,自动计算所有路径的裕量,然后找出最差的那条。

记住,时序裕量不是越大越好。裕量过大可能意味着设计过于保守,成本高、性能低。但裕量太小则风险高。一个经验值是:对于100MHz以下的电路,保持10%的裕量就够了;对于高频电路(比如RGMII的125MHz),我建议留出15%~20%的裕量。

好了,这一讲的核心就是建立时间和保持时间这两个概念,以及它们的裕量计算公式。你搞懂了这两个公式,后面的RGMII特定案例分析就会轻松很多。