最近在准备FPGA校招面试,发现时序约束这块几乎是必考题。我自学的时候只会在Vivado里点自动约束,真要手算set_input_delay和set_output_delay就懵了。面试官说系统时钟100MHz,外部芯片输出数据相对时钟有2ns的skew,让我算约束值,我完全不知道从哪下手。有没有大佬能讲讲这两个约束的实际计算思路?最好能结合一个具体的DDR或SPI接口例子,让我能理解原理而不是死记公式。
2026年了,FPGA面试被问时序约束,set_input_delay和set_output_delay到底怎么算?求一个能直接套用的方法
12 个回答

面试官问这个,其实不是要你背公式,而是看你能不能把时序路径讲清楚。你提到的公式没错,但死记很容易翻车。我给你个更稳的思路:先画图。把源寄存器、PCB走线、目的寄存器画出来,标上时钟到达时间和数据到达时间。set_input_delay是外部芯片发出数据到FPGA引脚这段路径的延迟,它等于Tco_max(外部芯片内部时钟到数据输出的延迟)加上PCB走线延迟,再减去时钟skew(时钟到达外部芯片和到达FPGA的时间差)。注意这里的skew是时钟到达外部芯片相对FPGA的延迟,如果外部芯片先收到时钟,skew为正,要减掉。set_output_delay则是FPGA输出数据到外部芯片,要满足外部芯片的建立时间,所以是Tsetup加上PCB走线延迟,skew的影响要看具体定义,通常也是减。我建议你拿SPI接口练手:假设主模式输出,系统时钟100MHz,外部从器件Tsetup=2ns,PCB走线0.5ns,那set_output_delay就是2.5ns。关键是理解余量:约束值越大,留给FPGA内部时序的余量越小,但外部要求必须满足。面试时能画出时序图、说出每个项的含义,比公式本身重要。另外,Vivado里的自动约束只是工具,你最好手动改一次,看时序报告怎么变化,这样理解才深。你现在的项目里有没有实际跑过某个接口的时序分析?

公式是死的,画个时序图就活了。set_input_delay就是数据比时钟晚到多久,set_output_delay就是数据得比时钟早多久准备好。面试官看你画图,比听你背公式加分。

我当年校招也被这个卡过,后来想明白一件事:时序约束的本质是告诉工具外部世界的时序要求,工具才能帮你在内部留出余量。你纠结的skew,其实是两个时钟沿之间的相对关系,别把它想太复杂。给你一个能直接套的流程,以SPI从模式接收为例。系统时钟100MHz,外部主机在时钟上升沿发出数据,PCB走线延迟1ns,主机内部Tco_max是2ns。那数据到达FPGA引脚的时间,相对FPGA时钟上升沿,就是Tco_max加走线延迟,再减去skew。这里skew是主机时钟到达FPGA和到达主机的时间差,假设PCB上时钟走线比数据走线短2ns,意味着FPGA先收到时钟,主机后收到,那数据到达FPGA相对时钟就早了2ns,所以set_input_delay = 2 + 1 – 2 = 1ns。意思是数据在时钟沿后1ns才稳定,工具就得保证FPGA内部寄存器的采样点在这个时间之后还能采到。如果你把skew方向搞反,算成5ns,工具会以为数据很晚才到,内部时序裕量可能就不够了。更关键的是,set_input_delay通常有max和min两个值,max对应建立时间,min对应保持时间,面试官如果追问,你要能说出min值怎么算——用Tco_min加走线延迟减skew。面试前建议把UG903里关于I/O约束的章节过一遍,不用全懂,但要把时序路径的四种基本关系(输入到寄存器、寄存器到输出等)画熟。我当年就是把DDR3读写的约束手算了一遍,虽然没完全跑通,但面试时能讲清楚每一步的物理意义,面试官就点头了。你手头有没有具体接口的数据手册?拿真实参数算一遍,比看十篇教程都管用。

先别急着背公式,你先想明白一件事:这两个约束其实是在替工具回答两个问题——数据什么时候来、数据什么时候走。set_input_delay是告诉工具,外部芯片把数据放到FPGA引脚上时,相对FPGA的采样时钟沿,数据稳定下来的时刻;set_output_delay是告诉工具,FPGA送出去的数据,相对外部芯片的采样时钟沿,得提前多久准备好。你面试里那个2ns skew,我猜面试官是想看你能不能分清skew的方向。我建议你拿SPI从模式接收举个完整例子:假设系统时钟100MHz,外部主机在时钟上升沿输出数据,主机内部Tco_max=2ns,PCB上数据线比时钟线长1ns(也就是数据多走1ns),时钟从主机到FPGA的skew是+1ns(FPGA比主机晚收到时钟)。那数据相对FPGA时钟沿的到达时间就是Tco_max加数据走线延迟再减skew,也就是2+1-1=2ns,所以set_input_delay=2ns。注意这里的skew是主机时钟到FPGA相对到主机的差值,如果FPGA晚收到时钟,意味着FPGA采样沿晚到,那数据相对这个晚到的沿就显得更早到了,所以要减。反过来如果FPGA早收到时钟,skew为负,你就要加。很多人死记公式,一遇到skew符号就翻车,根源就是没画图。你画一条时间轴,左边主机时钟沿,右边FPGA时钟沿,中间标出数据从主机内部Tco开始,经过PCB走线到达FPGA引脚的时间点,再对比FPGA采样沿的位置,就一目了然了。至于set_output_delay,拿FPGA输出给外部ADC举例,外部ADC要求数据在采样时钟沿前至少Tsetup=1ns稳定,PCB走线延迟0.5ns,那set_output_delay就是1+0.5=1.5ns,意思是FPGA内部数据输出相对外部时钟沿,得提前1.5ns准备好。这里不需要减skew,因为skew已经体现在外部芯片实际收到的时钟沿上,约束里直接按外部芯片的要求写就行。你在Vivado里写约束时,还要注意时钟定义和I/O delay的参考时钟是哪个,一般用虚拟时钟或主时钟,别搞混了。建议你拿一个实际的SPI接口工程,把外部芯片手册里的Tco、Tsetup、走线长度估算出来,手算一遍再跑时序报告,看slack是不是接近你预期的余量。这样面试时你就能说清楚每个数字的物理含义,而不是只背公式。你手头有具体的外部芯片型号吗?如果有,我可以帮你按手册里的参数推一遍。

其实你只需要记住一个核心:set_input_delay是数据相对FPGA采样沿晚到多久,set_output_delay是数据必须相对外部采样沿早多久准备好。skew的方向看时钟是早到还是晚到,画个图比背公式靠谱。拿SPI举例,外部主机Tco=2ns,走线1ns,FPGA时钟比主机晚到1ns,那输入延迟就是2+1-1=2ns。输出的话,比如外部ADC要求Tsetup=1ns,走线0.5ns,输出延迟就是1.5ns。面试时你画个时间轴,标出每个时间点,比念公式加分多了。回去找个DDR或SPI例子,手算一遍,再跑一次时序报告,你就通了。

其实你纠结的2ns skew,本质上是在问:外部芯片的时钟沿和FPGA的时钟沿,到底谁先到。我建议你换个角度想,别去背公式,而是把整个问题拆成两段来看。第一段是外部芯片内部,从时钟沿到数据从引脚出来的时间,这个就是Tco_max,比如2ns。第二段是PCB上数据线从外部芯片引脚到FPGA引脚的走线延迟,比如1ns。这两段加起来,是数据到达FPGA引脚的时刻。但问题是,FPGA内部采样用的时钟沿,和你假设的外部芯片时钟沿,不是同一个时刻,它们之间有个skew。如果FPGA的时钟比外部芯片晚到2ns,那就意味着FPGA采样沿在时间轴上往后挪了2ns,所以数据到达FPGA引脚的时刻,相对FPGA自己的采样沿,其实是2+1-2=1ns。这就是set_input_delay的含义:数据相对FPGA采样沿晚到了1ns。你把这个图画出来,比什么都管用。至于set_output_delay,方向反过来,是FPGA输出数据给外部芯片,外部芯片要求数据在它的采样沿之前Tsetup时间就稳定,比如1ns,再加上PCB走线0.5ns,所以set_output_delay=1.5ns。这里有个容易搞混的点:skew对输出约束的影响方向,取决于你是用哪个时钟沿做参考。我建议你拿SPI从模式接收去练,因为SPI的时钟和数据都是由主机产生的,你只需要考虑输入约束;输出约束可以拿SPI主机发送去练。练的时候别只看公式,每一步都问自己:这个时间点,数据相对于哪个时钟沿,是早还是晚。面试官其实就想看你能不能把这句话说清楚。你回去找个SPI例子,手算一遍,再在Vivado里跑个时序报告对照一下,基本就通了。顺便问一句,你准备的是数字前端还是FPGA验证岗?这两个方向对时序约束的考察深度不太一样。

个人感觉你缺的不是公式,是画图的习惯。set_input_delay就是问:数据到FPGA引脚时,比FPGA采样沿晚多久?把外部Tco、走线、skew三个时间点在图上标出来,加减自然就出来了。输出同理,就是数据要比外部采样沿早多久准备好。别背公式,拿SPI主发从收各画一遍,比看十遍教程有用。你那个2ns skew,画完图就知道是加还是减了。

其实面试官问这个,就是看你能不能把『数据相对时钟晚到还是早到』说清楚。set_input_delay 是数据比 FPGA 采样沿晚多久,等于外部 Tco 加走线减 skew;set_output_delay 是数据得比外部采样沿早多久,等于外部 Tsetup 加走线。别背公式,拿 SPI 主发从收画个时间轴,标上 2ns skew 是加是减自然就明白了。

我说个笨办法,但真能救急。你先把公式抄在纸上,但旁边必须画一条时间轴,左端是 FPGA 采样沿,右端是数据到达引脚的时刻。set_input_delay 就是这两个点之间的距离,带正负号。skew 是外部芯片时钟沿和 FPGA 时钟沿之间的差,如果外部时钟先到,等于数据相对 FPGA 沿提前了,那就要从总延迟里减掉;反过来就加。拿你面试那个题举例,外部 Tco 2ns、走线 1ns、skew 2ns,如果 FPGA 时钟晚到,那输入延迟就是 2+1-2=1ns。输出同理,只是把外部 Tsetup 和走线加起来,skew 的影响看你要满足哪个沿。画完一遍,再跑一次 Vivado 的 report_timing_summary,对着报告里的 slack 看自己算得对不对,比刷十道题都管用。

给你一个能直接套的流程,但先提醒一个坑:很多人把 Tskew 的符号搞反,是因为没搞清『谁先到』。定义上,Tskew 是外部芯片时钟到达时刻减去 FPGA 时钟到达时刻,正数就是外部先到。以 SPI 从模式接收为例,主机在上升沿发数据,Tco_max 2ns,PCB 数据线比时钟线长 0.5ns(也就是数据多走 0.5ns),时钟 skew 是 +1ns(主机比 FPGA 早 1ns 收到时钟)。那数据到达 FPGA 引脚的时刻,相对 FPGA 采样沿,就是 Tco_max + 走线差 – skew = 2 + 0.5 – 1 = 1.5ns,这就是 set_input_delay。意思是你告诉工具:数据在采样沿后 1.5ns 才稳定,所以内部寄存器必须留足建立时间。输出方向,比如 FPGA 给外部 ADC 发数据,ADC 要求 Tsetup 1ns,PCB 走线 0.8ns,那 set_output_delay = 1 + 0.8 = 1.8ns,告诉工具:外部器件在采样沿前 1.8ns 就要看到数据稳定。建议你练完 SPI 再练个 DDR 读,因为 DDR 有双边沿和 DQS 的相位关系,能帮你彻底把『沿对齐』的概念打通。另外面试时别只报数字,把图画出来,标上『这个 1.5ns 是数据相对 FPGA 沿的迟到时间』,面试官基本就放过你了。你目前是在准备笔试还是已经到面试环节了?这俩阶段复习侧重点不太一样。
发表回答
登录后可在本页底部提交回答