3. 时序基础:建立时间、保持时间与时序裕量
说到高速PCB设计,我脑子里最先蹦出来的永远是两个词:建立时间和保持时间。这俩家伙就像一对冤家,你伺候好了它们,信号就能稳稳当当传过去。伺候不好?数据错乱、系统崩溃,那都是常有的事。
今天咱们就把这俩概念彻底掰扯清楚。顺便聊聊它们怎么影响你的长度匹配策略。
3.1 建立时间(Setup Time)
建立时间,说白了就是数据必须在时钟有效沿到来之前,提前到达并稳定住的最小时间窗口。
你可以这么想:触发器的内部电路需要时间来“看到”并“锁定”这个数据。就像开枪之前你得先瞄准。如果你一边开枪一边瞄准,那子弹肯定打不准。
在芯片数据手册里,建立时间一般用 tsu 表示。比如一个芯片的 tsu = 1ns,那么数据必须在时钟沿到达前至少 1ns 就稳稳当当待在那儿。
关键点:建立时间违规,通常发生在数据走得太“慢”,或者时钟走得太“快”。
举个例子。我在第一次设计DDR3接口时,没仔细看颗粒的建立时间规格。结果跑起来总有几个bit出错。排查了半天,发现是数据线的蛇形绕线绕得太密,导致走线长度过长,信号延迟大了那么零点几纳秒。
小技巧:我习惯在做长度匹配时,把时钟线的长度作为基准。数据线要绕,就绕着时钟走。这样建立时间裕量会比较宽裕。
3.2 保持时间(Hold Time)
保持时间是建立时间的“镜像兄弟”。它要求数据在时钟有效沿到达之后,还要继续维持稳定一段时间。
为什么?因为触发器内部的“关门”动作需要时间。数据虽然已经进去了,但门还没完全关上,这时候数据如果变来变去,就会把错误的数据锁进去。
保持时间在手册里用 th 表示。比如 th = 0.5ns,意思就是时钟沿到达后的 0.5ns 内,数据不能变。
避坑指南:我曾经遇到过一块板子,保持时间总是违例。查来查去,居然是数据线走得太短了!信号到达得太快,时钟还没反应过来呢,数据就已经跑了。保持时间违规,往往跟“信号太快”有关。
你想想看,在DDR设计中,我们经常要让DQ和DQS做等长。如果DQ比DQS短太多,数据先到了,时钟后到,保持时间就可能不够。这就是为什么等长匹配不只是单纯“绕线”,而是要精确控制相对延时。
3.3 时序裕量(Timing Margin)
裕量,就是你把建立时间和保持时间都满足之后,剩下来的那点“富余”。
我习惯把裕量理解成“安全垫”。裕量越大,系统越稳定。尤其在高速下,温度、电压、制造工艺都会影响信号延时。有足够的裕量,才能保证板子在各种工况下都不出错。
裕量计算公式很简单:
建立裕量 = (时钟到达时间 - 数据到达时间) - 建立时间要求
保持裕量 = (数据到达时间 - 时钟到达时间的前一个沿) - 保持时间要求
如果裕量是负数,那就是时序违例。该减的就减,该加的就加。
举个例子:
| 参数 | 值 | 说明 |
|---|---|---|
| 时钟周期 | 10 ns | 100MHz |
| 数据路径延时 | 7 ns | 包括走线+芯片内部延时 |
| 时钟路径延时 | 6 ns | 时钟从源头到触发器的延时 |
| 建立时间要求 | 2 ns | 芯片手册规定 |
| 保持时间要求 | 1 ns | 芯片手册规定 |
计算建立裕量:
数据到达时间 = 时钟到达时间 + 7ns - 6ns = 时钟到达时间 + 1ns
建立裕量 = (时钟到达时间) - (数据到达时间) - 2ns
= 时钟到达时间 - (时钟到达时间 + 1ns) - 2ns
= -3ns
哎,一看就是违例。而且负得不少。这说明数据比时钟到得晚太多,建立时间不够用。
怎么解决?
- 缩短数据路径的走线(减少延时)。
- 或者给时钟路径增加延时(比如绕点蛇形线)。
- 或者在约束里调整时钟相位(如果芯片支持)。
核心原则:对建立时间敏感的路径,要尽量让数据先到,时钟后到。对保持时间敏感的路径,要防止数据到达得太快。
3.4 建立时间与保持时间的矛盾
有意思的是,建立时间和保持时间有时候是矛盾的。
你想让建立时间满足,就得让数据早到,或者让时钟晚到。但数据早到了呢?保持时间可能就出问题了——数据在时钟沿之后走得快,没撑够保持时间。
我把这种矛盾叫做“时序的跷跷板”。在实际项目中,你往往需要在两者之间取一个平衡。
个人经验:我一般会先满足保持时间,因为保持时间违例通常更致命。它会直接导致当前周期数据出错,而且不像建立时间可以通过降低频率来补救。保持时间违例,降到再低的频率也没用。
3.5 时钟抖动与偏移
实际电路不像教科书那么理想。时钟本身也有抖动(jitter)和偏移(skew)。
- 抖动(Jitter):时钟沿在时间轴上的随机波动。会直接吃掉你的建立裕量。
- 偏移(Skew):同一个时钟到达不同触发器的时间差异。会同时影响建立和保持时间。
在做时序分析时,我们通常要把抖动和偏移当作“负面的不确定性”,从裕量里扣掉。比如分析建立裕量时,我会把抖动直接减掉。
注意:时钟抖动是隐藏的杀手。我见过很多人只算了走线延时,没算时钟源的抖动,结果板子跑起来间歇性出错,查好几天才找到原因。
3.6 知识体系结构图
下面这张图,总结了我们刚刚聊到的核心概念和它们之间的关系。
3.7 实际项目中的操作步骤
讲完了理论,说说我在实际项目中怎么落地这些概念。
- 第一步:建时序模型。我会先画出数据路径和时钟路径的拓扑图,标出每一段的预估延时。
- 第二步:设约束。在原理图和PCB约束中,明确每对信号的建立时间和保持时间要求。EDA工具会根据这些约束来帮你做长度匹配。
- 第三步:仿真(可选)。如果信号速率很高(比如DDR4 2400以上),我会跑一下后仿真。看看在PVT(工艺、电压、温度)变化下,裕量还剩多少。
- 第四步:修改与迭代。根据仿真或实际测试结果,调整走线长度和拓扑。直到建立和保持时间都通过,并且留有一定的裕量。
总结一下:
- 建立时间:数据先到,时钟后到。怕数据太慢。
- 保持时间:数据不能走太快。怕数据太快。
- 裕量:就是安全垫。越大越好。
- 长度匹配:核心目的就是控制数据与时钟的相对延时,让建立和保持时间都满足。
这些概念,是你后面理解一切高速设计规则的基础。不管是DDR还是SerDes,都离不开它们。嗯,先记牢了。