第四节:输入延迟约束——set_input_delay详解,系统同步与源同步接口的区别

各位同学,今天我们来聊聊输入延迟约束。这个话题,说白了就是告诉工具:数据从芯片外部进来,到底花了多长时间?

我刚开始做时序约束那会儿,总觉得set_input_delay随便设个值就行。直到有一次,一个DDR接口的读路径老是报hold violation,查了三天才发现是输入延迟设反了。嗯,从那以后,我对这个命令就格外上心。

4.1 set_input_delay 到底在描述什么?

先看一个最简单的场景。外部芯片发送数据,经过PCB走线,到达我们FPGA的输入引脚。这个过程中,数据相对于时钟的延迟,就是我们要约束的输入延迟。

公式其实很简单:

set_input_delay -clock clk -max 2.5 [get_ports data_in]
set_input_delay -clock clk -min 1.0 [get_ports data_in]

这里的-max和-min,分别对应最大延迟和最小延迟。最大延迟用于setup检查,最小延迟用于hold检查。我个人习惯把这两个值分开写,这样后期调试时一目了然。

核心理解:输入延迟 = 外部器件Tco + PCB走线延迟。这个值越大,留给内部逻辑的setup时间就越少。

4.2 系统同步 vs 源同步——本质区别在哪?

很多同学分不清这两种接口。我打个比方:

  • 系统同步:时钟和数据来自同一个源头,但时钟是广播式的。就像全班同学听同一个铃声上下课。
  • 源同步:时钟和数据绑定在一起传输。就像每个学生有自己的闹钟,各听各的。

你想想看,这两种情况下的输入延迟约束,能一样吗?

4.2.1 系统同步接口的约束

系统同步接口中,时钟是全局的。外部器件在时钟上升沿输出数据,数据经过PCB到达FPGA。这时候,输入延迟的计算要考虑时钟偏斜。

# 系统同步示例:时钟周期10ns,外部Tco最大3ns,PCB走线1ns
set_input_delay -clock sys_clk -max 4.0 [get_ports data_in]
set_input_delay -clock sys_clk -min 1.0 [get_ports data_in]

这里-max = 3 + 1 = 4ns。为什么?因为数据最晚的情况是Tco最大加上PCB延迟最大。

我曾经踩过的坑:系统同步接口中,时钟偏斜会直接影响输入延迟。如果时钟树不平衡,你设的输入延迟可能完全不准确。建议先做时钟树综合,再反标时钟延迟。

4.2.2 源同步接口的约束

源同步接口就不同了。时钟和数据一起从外部芯片发出,它们经历了相同的PCB走线。这时候,我们关心的是数据相对于时钟的相位关系。

常见的源同步接口有:DDR、SDRAM、SPI等。约束方式也分两种:

  • 中心对齐:时钟边沿在数据眼图中间
  • 边沿对齐:时钟边沿与数据边沿对齐
# 源同步示例:DDR接口,数据在时钟上升和下降沿都采样
# 假设数据有效窗口为±0.5ns
set_input_delay -clock ddr_clk -max 0.5 [get_ports dq]
set_input_delay -clock ddr_clk -min -0.5 [get_ports dq]
set_input_delay -clock ddr_clk -max 0.5 [get_ports dq] -clock_fall -add_delay
set_input_delay -clock ddr_clk -min -0.5 [get_ports dq] -clock_fall -add_delay

注意这里用了-clock_fall和-add_delay。为什么?因为DDR在上升沿和下降沿都采样数据,两个边沿都要约束。

我的个人经验:源同步接口的输入延迟,很多时候是负值。别慌,负值不代表数据在时钟之前到达,而是表示数据相对于时钟的相位关系。我曾经见过新手把负值改成正值,结果时序全乱了。

4.3 两种接口的对比表格

对比项 系统同步 源同步
时钟来源 独立时钟源 与数据同源
时钟偏斜影响 大,需考虑 小,可忽略
输入延迟典型值 正数(2~5ns) 可正可负(±1ns)
约束复杂度 较低 较高,需考虑双沿
常见接口 异步SRAM、GPIO DDR、SPI、QSPI

4.4 实战中的避坑指南

说了这么多理论,来点实际的。我总结了几条经验:

  1. 先确认接口类型。拿到一个设计,第一件事就是看时钟和数据的关系。别上来就设值。
  2. max和min都要设。有些人只设max不设min,结果hold违例一堆。我建议两个都设,哪怕min设0也行。
  3. 源同步接口注意-add_delay。如果时钟有多个边沿,不加-add_delay会覆盖之前的约束。
  4. 系统同步接口注意时钟偏斜。如果时钟树还没做,可以先设一个保守值,后期再优化。

一句话总结:系统同步看延迟,源同步看相对相位。搞清楚了这一点,输入延迟约束就成功了一半。

4.5 知识体系结构图

下面这张图,我画了输入延迟约束的完整知识体系。你可以把它当作一个检查清单:

输入延迟约束知识体系 set_input_delay 系统同步接口 源同步接口 时钟偏斜影响大 Tco + PCB延迟 max/min均为正 时钟偏斜可忽略 相对相位关系 max/min可正可负 需-add_delay 核心:系统同步看延迟,源同步看相对相位

好了,这一节的内容就到这里。输入延迟约束看似简单,但实际项目中很容易出错。我建议你拿到一个新接口时,先画个时序图,把数据窗口和时钟边沿标清楚,再动手写约束。

可可精品资料库