3、输入输出延迟约束:输入延迟、输出延迟、外部延迟建模

各位同学,今天我们来聊聊时序约束里最绕不开的一个话题——输入输出延迟约束。

说实话,我刚入行那会儿,觉得时序约束就是写几个 create_clock 就完事了。直到有一次,我负责一个高速接口的设计,板级联调时死活跑不通。示波器一抓,数据采样总是不对。后来才发现,是输入延迟没设对,芯片内部采到的数据窗口完全偏了。嗯,从那以后,我再也不敢小看 set_input_delay 和 set_output_delay 了。

3.1 为什么需要输入输出延迟?

你想想看,芯片不是孤立存在的。它要跟外面的器件通信——可能是另一颗芯片,可能是FPGA,也可能是传感器。外部器件发送数据给我们的芯片时,数据相对于时钟是有延迟的。这个延迟,就是输入延迟。

反过来,我们的芯片输出数据给外部器件时,外部器件也有自己的建立时间和保持时间要求。这个约束,就是输出延迟。

说白了,输入输出延迟就是一座桥,把芯片内部的时序世界和外部器件的时序世界连接起来。

核心思想:输入延迟描述的是外部数据到达芯片引脚的时间,输出延迟描述的是外部器件对数据到达时间的要求。

3.2 输入延迟(set_input_delay)

set_input_delay 定义的是:相对于某个时钟,数据在芯片输入引脚上已经存在了多长时间。

我个人的习惯是,先搞清楚外部器件的时序参数。比如外部器件的数据输出延迟是 Tco,PCB走线延迟是 Tpcb,那么输入延迟大致就是 Tco + Tpcb。

语法很简单:

set_input_delay -clock clk -max 5.0 [get_ports data_in]
set_input_delay -clock clk -min 2.0 [get_ports data_in]

这里 -max 对应最坏情况(建立时间检查),-min 对应最好情况(保持时间检查)。

小技巧:我曾经在一个DDR接口项目中,发现输入延迟设得太紧,导致时序收敛不了。后来查了外部器件的datasheet,发现它的输出延迟有±0.5ns的抖动。我把这个抖动加进去,问题就解决了。所以,记得留点余量。

3.3 输出延迟(set_output_delay)

输出延迟描述的是:外部器件需要数据在输出引脚上提前多久准备好(相对于时钟沿)。

举个例子,外部器件的建立时间要求是 Tsu_ext,保持时间要求是 Th_ext,PCB走线延迟是 Tpcb,那么:

  • 输出最大延迟(对应建立时间):Tsu_ext + Tpcb
  • 输出最小延迟(对应保持时间):Th_ext - Tpcb(注意这里是减号)

命令格式:

set_output_delay -clock clk -max 4.0 [get_ports data_out]
set_output_delay -clock clk -min 1.0 [get_ports data_out]

注意:输出延迟的 -min 值如果设成负数,不要慌。这表示外部器件有负的保持时间要求,或者PCB走线延迟很大。我在一个SDRAM接口中就遇到过这种情况,保持时间检查反而成了瓶颈。

3.4 外部延迟建模

有时候,外部器件的时序关系比较复杂,光靠 set_input_delay 和 set_output_delay 不够用。这时候就需要外部延迟建模。

外部延迟建模,说白了就是把外部器件的时序行为抽象成一个虚拟的时序路径。常用的方法有:

  • 虚拟时钟法:创建一个跟外部器件同频同相的虚拟时钟,然后用 set_input_delay 或 set_output_delay 相对于这个虚拟时钟来约束。
  • 多周期路径法:如果外部器件是慢速的,数据需要多个时钟周期才能稳定,可以用 set_multicycle_path 来调整。
  • 异步接口法:对于异步接口,用 set_false_path 或 set_clock_groups 来处理。

我个人比较推荐虚拟时钟法,因为它最直观。比如:

create_clock -name vclk -period 10.0
set_input_delay -clock vclk -max 3.0 [get_ports data_in]

这样,工具就会把 data_in 相对于 vclk 的时序路径分析清楚。

3.5 知识体系总览

下面这张图,是我自己总结的输入输出延迟约束的完整逻辑。你看一遍,应该就能把整个章节串起来了。

输入输出延迟约束知识体系 输入延迟 输出延迟 外部延迟建模 Tco + Tpcb -max / -min 建立/保持检查 Tsu_ext + Tpcb Th_ext - Tpcb 外部器件要求 虚拟时钟法 多周期路径 异步接口处理 核心目标:让芯片内部时序与外部器件时序完美对齐 避免数据采样错误,确保板级通信可靠

3.6 避坑指南

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

  • 忘记加 -max 和 -min:如果不加,工具默认两个值一样。但实际电路中,最大和最小延迟往往不同。我曾经因为这个,保持时间检查一直报错,查了半天才发现是 -min 没设。
  • 时钟域搞混:输入输出延迟一定要指定正确的时钟。如果外部器件用的是下降沿采样,你却设成上升沿,那时序分析结果就是错的。
  • 忽略PCB走线延迟:很多人只看了外部器件的datasheet,忘了加PCB走线延迟。高速设计中,走线延迟可能占到总延迟的30%以上,不能忽略。

我的建议:刚开始做约束时,先画一张简单的时序图,把外部器件、PCB走线、芯片内部路径都标出来。然后对照着写约束,不容易出错。我到现在还保留着这个习惯。

好了,这一章的内容就到这里。输入输出延迟约束,说白了就是「知己知彼」——知道外部器件什么时候发数据,知道外部器件什么时候要数据。把这个搞清楚了,时序约束就成功了一半。

可可精品资料库