第三节:输入延迟约束——set_input_delay 命令详解

输入延迟约束,说白了就是告诉工具:数据从芯片外部进来,到底花了多长时间?

我刚开始做时序约束时,总觉得这步很简单。直到有一次,一个项目在综合后时序报告一片飘红,排查了三天才发现——输入延迟设错了。嗯,从那以后,我对 set_input_delay 就格外上心。

3.1 什么是输入延迟?

数据从外部芯片(比如 FPGA 或上一级芯片)的时钟沿开始,到进入我们当前芯片的输入引脚,这中间经历的时间,就是输入延迟。

你想想看,数据不是瞬间到达的。它要经过 PCB 走线、封装、IO buffer,还有上一级芯片的输出延迟。这些加起来,就是我们要约束的输入延迟。

核心公式:

输入延迟 = 外部芯片输出延迟 + PCB 走线延迟 + 封装延迟

3.2 set_input_delay 命令格式

命令其实不复杂,但参数要搞清楚。我习惯这样写:

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

这里有几个关键点:

  • -clock:指定参考时钟。可以是设计中的时钟,也可以是虚拟时钟
  • -max:最大输入延迟,用于 setup 检查
  • -min:最小输入延迟,用于 hold 检查
  • get_ports:指定输入端口

我的习惯:每次写约束时,我都会把 -max 和 -min 成对写出。只写一个的话,工具会默认另一个为 0,这往往过于乐观,容易导致流片后出问题。

3.3 最大输入延迟 vs 最小输入延迟

为什么要分最大和最小?说白了,这是为了覆盖两种不同的时序检查场景。

参数 用途 检查类型 数据路径
-max 最晚到达时间 setup(建立时间) 最慢路径
-min 最早到达时间 hold(保持时间) 最快路径

我曾经在一个项目中,只设置了 -max 没设 -min。结果 hold 时序全红了。为什么?因为数据来得太快,比时钟还快,hold 就保不住了。所以这两个参数,缺一不可。

3.4 参考时钟与虚拟时钟

这里有个容易混淆的点:参考时钟到底用哪个?

情况一:使用设计中的真实时钟

如果输入数据与芯片内部的某个时钟同步,直接用那个时钟即可:

create_clock -name clk_sys -period 10 [get_ports clk_sys]
set_input_delay -clock clk_sys -max 4.5 [get_ports data_in]

情况二:使用虚拟时钟

如果输入数据来自外部独立的时钟源,或者数据与内部时钟不同源,我建议用虚拟时钟。虚拟时钟不连到任何物理端口,只是作为一个参考点:

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

注意:虚拟时钟的周期要跟实际数据速率匹配。我曾经见过有人把 100MHz 的数据用 50MHz 的虚拟时钟去约束,结果时序分析完全不对。这个坑,我踩过。

3.5 输入延迟的典型值怎么定?

很多新手会问:输入延迟到底设多少?

我的经验是,先看接口协议。比如:

  • DDR 接口:输入延迟通常是时钟周期的 30%~50%
  • SPI 接口:要看从设备的输出延迟参数
  • 自定义并行总线:根据 PCB 走线长度估算,每英寸约 0.15ns

如果实在拿不准,我建议先设一个保守值,比如时钟周期的 60%。等后端布局布线后,再根据实际时序报告微调。

3.6 知识体系图

下面这张图,是我梳理的输入延迟约束的核心逻辑:

输入延迟约束知识体系 set_input_delay 参数:-max / -min 参数:-clock 参数:get_ports 真实时钟 虚拟时钟 setup 检查(-max) hold 检查(-min) 接口协议参数 PCB 走线估算 核心命令 命令参数 时钟类型 检查类型 取值依据

3.7 避坑指南

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

  • 不要忘记 -add_delay:如果同一个端口有多个输入延迟约束(比如不同模式),记得加 -add_delay 参数,否则后面的会覆盖前面的
  • 虚拟时钟的周期要合理:虚拟时钟的周期决定了时序分析的基准,设错了全盘皆输
  • 输入延迟不能超过时钟周期:如果输入延迟大于一个时钟周期,说明数据跨周期了,这时候要用多周期约束

一句话总结:输入延迟约束,就是告诉工具数据什么时候到。设得太紧,工具会过度优化,浪费面积和功耗;设得太松,流片后可能跑不到目标频率。这个度,要靠经验和反复迭代来把握。

好了,输入延迟约束就讲到这里。记住,约束不是一次搞定的,要结合综合后的时序报告不断调整。下一节我们讲输出延迟约束,思路其实很类似,但方向反过来了。

可可精品资料库