4、握手接口的setup/hold时间计算:输入延迟约束、输出延迟约束、内部路径延迟计算、最差情况分析

握手接口的时序分析,说白了就是算清楚信号从发出到被采到,中间到底花了多少时间。我刚开始做这块的时候,总觉得不就是个建立时间和保持时间嘛,算算就完了。结果有一次项目里,接口死活跑不到目标频率,查了三天才发现是输入延迟约束写错了。嗯,从那以后我再也不敢小看这个环节了。

4.1 输入延迟约束——信号从外面进来,你得知道它走了多远

输入延迟,指的是外部器件发出的数据,到达我们芯片输入引脚所花的时间。这个时间包括外部器件的时钟到输出延迟(Tco),加上PCB走线的延迟。

我个人习惯把输入延迟分成两类:

  • 最大输入延迟:用于建立时间检查。数据来得越晚,留给内部逻辑建立的时间就越少。
  • 最小输入延迟:用于保持时间检查。数据来得太早,可能会冲掉上一个数据。

举个例子,假设外部器件的数据输出延迟是 2ns 到 5ns,PCB走线延迟是 0.5ns。那么:

最大输入延迟 = 5ns + 0.5ns = 5.5ns
最小输入延迟 = 2ns + 0.5ns = 2.5ns

在SDC约束里,我们这么写:

set_input_delay -clock clk -max 5.5 [get_ports data_in]
set_input_delay -clock clk -min 2.5 [get_ports data_in]
我的小技巧: 如果拿不准外部器件的延迟,可以留点余量。我一般会在计算值上加 10% 的裕量,毕竟PCB走线长度有时候会估算不准。

4.2 输出延迟约束——信号送出去,外面的人能不能接住

输出延迟正好反过来。它描述的是我们芯片输出数据后,外部器件需要多长时间才能稳定采到数据。说白了,就是给外部器件留够建立时间和保持时间。

输出延迟也分两种:

  • 最大输出延迟:对应外部器件的建立时间要求。我们的数据必须在外设的建立时间之前到达。
  • 最小输出延迟:对应外部器件的保持时间要求。数据变化后,必须稳定保持一段时间。

假设外部器件的建立时间是 1ns,保持时间是 0.5ns,PCB走线延迟 0.3ns:

最大输出延迟 = 外部器件建立时间 + PCB走线延迟 = 1ns + 0.3ns = 1.3ns
最小输出延迟 = 外部器件保持时间 - PCB走线延迟 = 0.5ns - 0.3ns = 0.2ns

SDC约束写法:

set_output_delay -clock clk -max 1.3 [get_ports data_out]
set_output_delay -clock clk -min 0.2 [get_ports data_out]
注意: 输出延迟的 min 值有可能是负数!我曾经遇到过保持时间不够的情况,就是因为 PCB 走线太长,导致数据变化太快,外部器件来不及保持。这时候就得在内部加延迟单元。

4.3 内部路径延迟计算——芯片内部到底在磨蹭什么

内部路径延迟,就是信号从输入寄存器到输出寄存器,中间经过的组合逻辑和走线所花的时间。这部分是我们可以控制的,也是优化的重点。

内部路径延迟主要由三部分组成:

  1. 时钟偏斜(Clock Skew):时钟到达不同寄存器的时差。正偏斜有助于建立时间,但会伤害保持时间。
  2. 组合逻辑延迟:就是那些与门、或门、多路选择器等等的延迟。你想想看,逻辑级数越多,延迟越大。
  3. 走线延迟:随着工艺越来越先进,走线延迟占比越来越高。在 7nm 以下,走线延迟甚至能占到总延迟的 60% 以上。

计算建立时间裕量时,公式是这样的:

建立时间裕量 = 时钟周期 + 时钟偏斜 - 寄存器Tco - 组合逻辑延迟 - 走线延迟 - 建立时间

保持时间裕量则简单一些:

保持时间裕量 = 寄存器Tco + 组合逻辑延迟 + 走线延迟 - 时钟偏斜 - 保持时间

关键点: 建立时间和保持时间是一对矛盾体。你想让建立时间更宽松,就得减少组合逻辑,但这样保持时间可能变差。我在项目中经常需要反复权衡,有时候甚至要手动插入延迟单元来修复保持时间违例。

4.4 最差情况分析——别只盯着典型值

芯片设计里有个铁律:只看典型值会死得很惨。为什么?因为芯片在不同工艺角、不同温度、不同电压下,延迟会差很多。

我一般会检查以下几个最差情况:

场景 条件 影响
最慢工艺角(SS) 低温、低压 延迟最大,建立时间最差
最快工艺角(FF) 高温、高压 延迟最小,保持时间最差
典型工艺角(TT) 常温、常压 用于功能验证

在实际项目中,我还会额外考虑:

  • 时钟抖动(Jitter):时钟边沿的不确定性,一般会吃掉 50ps 到 200ps 的时序预算。
  • IR Drop:电源压降会导致局部延迟变大。我曾经在一个项目中,因为 IR Drop 太大,导致某个模块的建立时间差了 300ps,最后不得不加了一级流水线。
  • 串扰(Crosstalk):相邻信号线的耦合效应,可能让延迟变大或变小。嗯,这个在先进工艺下越来越头疼。

4.5 知识体系总览

下面这张图是我自己总结的握手接口时序分析框架,你可以对照着看:

握手接口时序分析知识体系 输入延迟约束 内部路径延迟 输出延迟约束 最大输入延迟(建立) 最小输入延迟(保持) 时钟偏斜 组合逻辑延迟 走线延迟 最大输出延迟(建立) 最小输出延迟(保持) 最差情况分析(PVT + 抖动 + IR Drop) 建立时间裕量 ≥ 0 且 保持时间裕量 ≥ 0

你看,整个时序分析其实就围绕三个环节:输入怎么进来、内部怎么处理、输出怎么出去。最后汇到最差情况分析,确保在所有条件下,建立时间和保持时间都有正裕量。

避坑指南: 我曾经在一个项目中,只做了典型工艺角的时序分析,结果芯片在低温低压下直接罢工。后来老老实实把 SS、FF、TT 三个角都跑了一遍,才发现保持时间在 FF 角下差了 0.2ns。所以我的建议是——永远不要跳过最差情况分析。

好了,这一节的内容就到这里。握手接口的时序计算,说白了就是算清楚每一段路径的延迟,然后确保在最坏情况下也能满足时序要求。你只要把输入延迟、输出延迟、内部路径这三个环节理清楚,再结合最差情况分析,基本上就能搞定大部分握手接口的时序问题了。

可可精品资料库