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]
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]
4.3 内部路径延迟计算——芯片内部到底在磨蹭什么
内部路径延迟,就是信号从输入寄存器到输出寄存器,中间经过的组合逻辑和走线所花的时间。这部分是我们可以控制的,也是优化的重点。
内部路径延迟主要由三部分组成:
- 时钟偏斜(Clock Skew):时钟到达不同寄存器的时差。正偏斜有助于建立时间,但会伤害保持时间。
- 组合逻辑延迟:就是那些与门、或门、多路选择器等等的延迟。你想想看,逻辑级数越多,延迟越大。
- 走线延迟:随着工艺越来越先进,走线延迟占比越来越高。在 7nm 以下,走线延迟甚至能占到总延迟的 60% 以上。
计算建立时间裕量时,公式是这样的:
建立时间裕量 = 时钟周期 + 时钟偏斜 - 寄存器Tco - 组合逻辑延迟 - 走线延迟 - 建立时间
保持时间裕量则简单一些:
保持时间裕量 = 寄存器Tco + 组合逻辑延迟 + 走线延迟 - 时钟偏斜 - 保持时间
关键点: 建立时间和保持时间是一对矛盾体。你想让建立时间更宽松,就得减少组合逻辑,但这样保持时间可能变差。我在项目中经常需要反复权衡,有时候甚至要手动插入延迟单元来修复保持时间违例。
4.4 最差情况分析——别只盯着典型值
芯片设计里有个铁律:只看典型值会死得很惨。为什么?因为芯片在不同工艺角、不同温度、不同电压下,延迟会差很多。
我一般会检查以下几个最差情况:
| 场景 | 条件 | 影响 |
|---|---|---|
| 最慢工艺角(SS) | 低温、低压 | 延迟最大,建立时间最差 |
| 最快工艺角(FF) | 高温、高压 | 延迟最小,保持时间最差 |
| 典型工艺角(TT) | 常温、常压 | 用于功能验证 |
在实际项目中,我还会额外考虑:
- 时钟抖动(Jitter):时钟边沿的不确定性,一般会吃掉 50ps 到 200ps 的时序预算。
- IR Drop:电源压降会导致局部延迟变大。我曾经在一个项目中,因为 IR Drop 太大,导致某个模块的建立时间差了 300ps,最后不得不加了一级流水线。
- 串扰(Crosstalk):相邻信号线的耦合效应,可能让延迟变大或变小。嗯,这个在先进工艺下越来越头疼。
4.5 知识体系总览
下面这张图是我自己总结的握手接口时序分析框架,你可以对照着看:
你看,整个时序分析其实就围绕三个环节:输入怎么进来、内部怎么处理、输出怎么出去。最后汇到最差情况分析,确保在所有条件下,建立时间和保持时间都有正裕量。
好了,这一节的内容就到这里。握手接口的时序计算,说白了就是算清楚每一段路径的延迟,然后确保在最坏情况下也能满足时序要求。你只要把输入延迟、输出延迟、内部路径这三个环节理清楚,再结合最差情况分析,基本上就能搞定大部分握手接口的时序问题了。
可可精品资料库