3. 时序约束基础:建立时间与保持时间
聊到DDR时序约束,有两个概念绕不开——建立时间和保持时间。
说白了,这是数字电路最底层的两个规矩。芯片能不能稳定工作,全看它们。
我刚开始接触DDR的时候,觉得这东西就是背公式。后来踩了坑才明白,不理解这两个时间,时序约束根本做不下去。
3.1 什么是建立时间?
建立时间(Setup Time,简称Tsu),指的是在时钟有效沿到来之前,数据必须保持稳定的最短时间。
你想想看,寄存器内部不是瞬间完成采样的。它需要一点时间把数据“看清楚”。如果数据在时钟沿前还在跳变,寄存器就可能采到错误值。
核心定义:
- 建立时间:时钟沿之前,数据必须稳定。
- 如果数据变化太晚,就会发生建立时间违例。
我在项目中遇到过一种情况。DDR控制器输出到颗粒的地址信号,路径上加了太多缓冲器。结果数据到达时间晚了0.3ns,刚好违背了建立时间。那个版本流片回来,高温下频繁出错。嗯,后来改版才解决。
3.2 什么是保持时间?
保持时间(Hold Time,简称Th),是时钟有效沿之后,数据必须继续稳定的最短时间。
数据不是采样完就能立刻变。寄存器内部需要一点时间把数据“锁住”。如果数据在时钟沿后立刻变化,寄存器可能还没锁住,数据就跑了。
我个人的记忆方法:
建立时间看“迟到”,保持时间看“早退”。
数据来晚了→建立时间违例。
数据走早了→保持时间违例。
3.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 知识体系总览
3.9 避坑指南
最后,分享几个我踩过的坑:
- 别忽略时钟抖动。有时钟抖动的存在,实际建立时间裕量要比计算值多留出一些。我一般会留10%~20%的余量。
- 保持时间看最小延时。很多人只关注最大路径,忘了最小路径。DDR里,短路径恰恰是最容易违例的。
- 温度电压的影响。保持时间在低温高压下最容易出问题。因为芯片跑得快,数据路径延时更短。
- 仿真不能代替STA。仿真跑100万个随机向量,都不一定能命中最差的路径。官方静态时序分析工具才是正解。
我的习惯:
做DDR约束时,先单独检查每个颗粒的建立时间和保持时间。都过了,再检查整个系统的时序。这个顺序能帮我快速定位问题是出在芯片内部还是PCB上。
建立时间和保持时间,听起来简单。但真正做DDR时序约束时,每一步都离不开它们。理解透这两个概念,后面的内容会轻松很多。