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图来展示整个时序分析的流程。这张图是我自己画的,你一看就明白。
我的小技巧:每次做RGMII接口的时序分析时,我都会先列出所有路径的Tdata和tsu参数,然后一个一个地套公式算裕量。这样做虽然繁琐,但能避免漏掉某个关键路径。我习惯建立一个Excel表格,自动计算所有路径的裕量,然后找出最差的那条。
记住,时序裕量不是越大越好。裕量过大可能意味着设计过于保守,成本高、性能低。但裕量太小则风险高。一个经验值是:对于100MHz以下的电路,保持10%的裕量就够了;对于高频电路(比如RGMII的125MHz),我建议留出15%~20%的裕量。
好了,这一讲的核心就是建立时间和保持时间这两个概念,以及它们的裕量计算公式。你搞懂了这两个公式,后面的RGMII特定案例分析就会轻松很多。