3. 时序约束基础:建立时间与保持时间

聊到DDR时序约束,有两个概念绕不开——建立时间和保持时间。

说白了,这是数字电路最底层的两个规矩。芯片能不能稳定工作,全看它们。

我刚开始接触DDR的时候,觉得这东西就是背公式。后来踩了坑才明白,不理解这两个时间,时序约束根本做不下去。

3.1 什么是建立时间?

建立时间(Setup Time,简称Tsu),指的是在时钟有效沿到来之前,数据必须保持稳定的最短时间。

你想想看,寄存器内部不是瞬间完成采样的。它需要一点时间把数据“看清楚”。如果数据在时钟沿前还在跳变,寄存器就可能采到错误值。

核心定义:

  • 建立时间:时钟沿之前,数据必须稳定。
  • 如果数据变化太晚,就会发生建立时间违例。

我在项目中遇到过一种情况。DDR控制器输出到颗粒的地址信号,路径上加了太多缓冲器。结果数据到达时间晚了0.3ns,刚好违背了建立时间。那个版本流片回来,高温下频繁出错。嗯,后来改版才解决。

3.2 什么是保持时间?

保持时间(Hold Time,简称Th),是时钟有效沿之后,数据必须继续稳定的最短时间。

数据不是采样完就能立刻变。寄存器内部需要一点时间把数据“锁住”。如果数据在时钟沿后立刻变化,寄存器可能还没锁住,数据就跑了。

我个人的记忆方法:

建立时间看“迟到”,保持时间看“早退”。

数据来晚了→建立时间违例。

数据走早了→保持时间违例。

3.3 时序路径的基本模型

每条时序路径,都可以简化成三个部分:

  1. 起点寄存器:发出数据。
  2. 组合逻辑:数据经过的连线+门电路。
  3. 终点寄存器:接收数据。

建立时间和保持时间的检查,就是围绕这条路径来算的。

举个例子,DDR的读写数据路径,起点可能是控制器内部的触发器,终点是DDR颗粒的输入引脚。中间经过PCB走线、端接电阻、颗粒封装——这些都算在路径延时里。

3.4 建立时间裕量计算

不用急着记公式。咱们先理清逻辑。

数据从起点出发,经过组合逻辑,到达终点。它必须在下一个时钟沿之前,提前Tsu时间稳定下来。

计算时,我习惯这么想:

  • 数据实际到达时间 = 时钟发射沿 + 时钟到起点延时 + 数据路径延时
  • 数据要求到达时间 = 时钟捕获沿 + 时钟到终点延时 - Tsu
  • 建立时间裕量 = 要求时间 - 实际时间

裕量必须大于0,否则违例。

注意:

我曾经见过新手把时钟捕获沿算错。DDR里读写用不同的时钟相位,捕获沿可能是时钟的上升沿,也可能是下降沿。千万别默认都是上升沿。

3.5 保持时间裕量计算

保持时间检查的是同一个时钟沿——数据不能被时钟沿“冲走”。

  • 数据实际结束时间 = 时钟发射沿 + 时钟到起点延时 + 数据路径最短延时
  • 数据要求结束时间 = 时钟捕获沿 + 时钟到终点延时 + Th
  • 保持时间裕量 = 实际时间 - 要求时间

注意一个关键点:保持时间检查用的是最小延时。数据路径越短,越容易发生保持时间违例。

3.6 建立时间与保持时间的矛盾

这是个经典问题。你会发现,优化建立时间往往会让保持时间变差,反过来也一样。

优化方向 对建立时间影响 对保持时间影响
增加数据路径延时 变差(数据来得更晚) 变好(数据走得更晚)
减少数据路径延时 变好(数据来得更早) 变差(数据走得更早)
提高时钟频率 变差(周期缩短) 不变
增加时钟偏斜(有用偏斜) 可改善或恶化(视方向而定) 可改善或恶化(视方向而定)

我在调DDR读路径时遇到过这种取舍。为了满足建立时间,我把数据路径上的缓冲器砍掉了几级。结果保持时间出了问题。幸好DDR颗粒有可选的内建延时,我通过配置寄存器加了一点点保持时间裕量才解决。

实战经验:

设计前期,优先确保建立时间。因为建立时间通常跟频率有关,而保持时间可以通过后端工具插入缓冲器来修复。

但DDR里,保持时间同样不能忽视。高速接口路径很短,保持时间违例可能出现在最直接的路径上。

3.7 DDR中的特殊性

DDR和普通逻辑不一样。

普通逻辑里,时钟沿到了,数据就采一次。DDR呢,一个时钟周期内采两次——上升沿和下降沿。

这就意味着:

  • 建立时间和保持时间的检查次数翻倍。
  • 数据选通信号DQS与时钟的关系变得更复杂。
  • 读操作时,DDR颗粒自己产生DQS,这个DQS和数据的相位关系需要精确约束。

说白了,DDR的时序约束,本质上就是把每个信号的建立时间和保持时间都算清楚,然后告诉工具:“你按这个标准来检查”。

3.8 知识体系总览

时序约束基础:建立时间与保持时间 建立时间(Tsu) 保持时间(Th) 互补关系 时序路径三要素 起点寄存器 组合逻辑 终点寄存器 建立时间裕量 Tsetup_slack = T_req - T_arr 保持时间裕量 Thold_slack = T_arr - T_req DDR特殊性 双沿采样 · DQS数据选通 · 读写路径分离 核心原则:每条路径的建立时间和保持时间裕量都必须 ≥ 0

3.9 避坑指南

最后,分享几个我踩过的坑:

  • 别忽略时钟抖动。有时钟抖动的存在,实际建立时间裕量要比计算值多留出一些。我一般会留10%~20%的余量。
  • 保持时间看最小延时。很多人只关注最大路径,忘了最小路径。DDR里,短路径恰恰是最容易违例的。
  • 温度电压的影响。保持时间在低温高压下最容易出问题。因为芯片跑得快,数据路径延时更短。
  • 仿真不能代替STA。仿真跑100万个随机向量,都不一定能命中最差的路径。官方静态时序分析工具才是正解。

我的习惯:

做DDR约束时,先单独检查每个颗粒的建立时间和保持时间。都过了,再检查整个系统的时序。这个顺序能帮我快速定位问题是出在芯片内部还是PCB上。

建立时间和保持时间,听起来简单。但真正做DDR时序约束时,每一步都离不开它们。理解透这两个概念,后面的内容会轻松很多。