最近在准备FPGA校招,发现很多公司面试都会问时序约束。我看了很多教程,但set_input_delay和set_output_delay的具体计算还是搞不清楚,特别是涉及到外部芯片的Tco和Tsu时,到底该参考什么公式?面试官说我之前项目里的约束太松,导致时序余量不够。有没有大佬能详细讲讲这两个约束的实际推导过程,最好结合具体例子,比如DDR接口或者SPI通信场景。
2026年FPGA校招,Vivado时序约束中set_input_delay和set_output_delay到底怎么算?面试官说我的约束太松了
10 个回答

面试官说你太松,其实核心就一句话:你把外部器件的 Tco 或者 Tsu 当成了你的约束值,但没把 PCB 走线延迟和时钟偏斜算进去。拿 set_input_delay 举例,公式是 T_delay_max = Tco_max + T_pcb_max,而最小值是 Tco_min + T_pcb_min。很多人只记得加 Tco,却漏了 PCB 走线长度带来的那几百皮秒。面试官要看的不是你会背公式,而是你能不能结合实际场景给出一个合理的余量——比如对 100MHz 的 SPI,外部器件 Tco 是 3ns,PCB 走线估 0.5ns,那你约束 3.5ns 就比直接写 3ns 更可信。另外一个小技巧:如果你不确定外部器件的参数,可以先用保守值(比如把 Tco 加倍),然后跑时序分析看哪些路径紧张,再反推调整。追问一句:你面试时提到的是哪种外部接口?不同协议对 input_delay 的参考时钟相位要求差别很大。

我换一个角度,不从公式本身讲,而是说你怎么让面试官觉得你懂。set_input_delay 和 set_output_delay 的本质是告诉 Vivado:数据相对于时钟在芯片边界上是什么关系。很多学生一上来就查数据手册,然后照搬 Tco 和 Tsu,但面试官问的是你为什么要选那个值。比如 DDR 接口,数据是双沿采样,你的 set_input_delay 必须针对上升沿和下降沿分别约束,而且要考虑 DQS 相对于时钟的相位偏移。更常见的坑是,你把 set_output_delay 的 min 和 max 搞反了——对于输出,max 对应的是外部器件的建立时间要求,所以公式是 T_output_delay_max = T_su_ext + T_pcb_max;min 对应的是保持时间,T_output_delay_min = T_hold_ext – T_pcb_min。我建议你用一个实际项目去跑一遍:选一个 50MHz 的 SPI Flash 读操作,查它的 datasheet 找出 Tco 和 Tsu,再估一个 0.2ns 的 PCB 延迟,然后写两行约束,跑 report_timing 看看 slack。面试官最在意的是你愿不愿意动手验证,而不是纸上谈兵。如果你能把那个 report 截图给面试官看,并指出哪条路径是瓶颈,那基本就稳了。你目前是在准备哪个方向的面试?通信还是图像?不同场景下外部器件的 timing 参数差异很大。

公式记不住没关系,你只要记住:input_delay 是外部器件把数据送到你的 FPGA 引脚时,数据相对于时钟的延迟;output_delay 是 FPGA 把数据送出去后,外部器件需要多少建立和保持时间。太松就是你把延迟估小了,实际路径跑不满。拿个 SPI 例子跑一遍就懂了。

你现在的困境其实很典型——不是公式不会背,而是缺一个「从芯片到芯片」的完整信号路径图。面试官说你松,通常不是因为你没加Tco,而是因为你没把时钟源到FPGA的偏斜、PCB走线延迟、以及外部器件内部时钟到数据的相位关系统一画出来。我自己带实习生时发现,只要拿一张纸把整个路径画成时序图,标出每个节点(源时钟、FPGA内部时钟、FPGA IO、PCB走线、外部芯片时钟、外部芯片数据输出),然后手动数一遍数据从哪个沿出发、在哪个沿被捕获,约束值自然就出来了。
举个例子,SPI主从通信,你FPGA做Master,从机是MCP3204 ADC。数据手册说从机在SCK上升沿采样,但输出数据是在下降沿之后Tco(典型5ns)才有效。那set_input_delay到底怎么设?你要先想:FPGA内部时钟是100MHz,SCK由FPGA生成,但SCK经过IO输出和PCB走线到从机有延迟T_pcb_clk;从机内部时钟到数据输出又有Tco;数据再走PCB回来T_pcb_data。那么数据到达FPGA引脚时,相对于FPGA内部时钟沿的延迟就是T_pcb_clk + Tco + T_pcb_data。这个值就是set_input_delay -max。而-min要考虑保持时间,用最小值Tco_min + T_pcb_min。
很多教程直接让你查手册里的Tco,但忽略了PCB走线,这就是松的根源。面试官真正想听的,是你有没有意识到PCB延迟和时钟偏斜的存在,以及你如何根据实际板级信息(比如走线长度估算延迟)来修正约束。另外一个小建议:面试时别只背公式,主动问面试官「这个场景的时钟频率和PCB走线长度大概是多少」,能体现出你有工程意识。你目前做项目时有没有实际量过PCB走线长度?还是全靠估算?
追问一句:你用的外部器件数据手册里,Tco和Tsu通常给出的是典型值还是最大最小值?如果是典型值,你一般怎么转换成约束?

我换一个更直接的判断方法。面试官说你松,你回去把约束文件里的set_input_delay -max和-min同时减掉500ps,然后看时序报告里最紧的路径还有多少余量。如果余量从正变负,说明你原来的约束确实太松;如果余量还是正的,那说明你原来松得离谱。这个方法虽然粗暴,但能帮你快速定位问题——很多时候你只是少加了PCB走线和时钟偏斜,加起来也就两三百皮秒。另外,面试官问的时候,你只要说「我参考了外部器件的Tco,并额外考虑了PCB走线的3-5cm长度对应的约200ps延迟」,他就知道你不是只会抄公式的人。

公式记不住?那就记住一句话:input_delay是数据从外部芯片出发到FPGA引脚这段路花了多长时间,output_delay是FPGA数据出去后外部芯片需要多长时间才能正确抓取。面试官说你松,大概率是你把外部芯片的Tco当成了全部,忘了算路上走的PCB延迟和时钟歪斜。下次直接反问他:您能告诉我这个场景的PCB走线长度吗?

面试官说你松,大概率是你只算了外部芯片的Tco,忘了把PCB走线延迟和时钟偏斜加进去。拿SPI来说,从机在SCK下降沿之后Tco才出数据,那你set_input_delay至少得是Tco_max加上两三厘米走线对应的两三百皮秒,否则约束就是虚的。追问一句:你用的外部器件数据手册里Tco给的是典型值还是最大值?

个人感觉你被面试官说松,根源在于没把约束当成一个「从芯片到芯片」的闭环去算。我给你一个面试官想听的推导顺序:先画出时钟源到FPGA、再到外部芯片的路径,标出每个节点的延迟;然后确定数据相对于时钟的发射沿和捕获沿——比如DDR接口,DQS和时钟的相位关系决定了你的set_input_delay是正还是负。很多教程直接给公式,但面试官更想听你说「我参考了外部器件的Tco,同时额外加了PCB走线3cm对应约200ps的延迟,以及时钟偏斜约100ps,最后留了10%余量」。你可以拿一个具体的ADC或DAC数据手册跑一遍,把每一步的数值写出来,面试时直接说这个例子,他就不觉得你松了。

不扯公式了,我给你一个能直接用在面试里的检查清单,针对面试官说你松的场景。第一,你有没有区分max和min?set_input_delay的max对应外部数据最晚到达,你要用Tco_max加最大PCB延迟;min对应最早到达,用Tco_min加最小PCB延迟。很多人只写一个值,面试官一眼就觉得你套公式但没理解。第二,你有没有考虑时钟抖动和PLL输出偏斜?Vivado里默认不自动算这些,你得在约束里手动补上。第三,一个常见坑是:你FPGA做Master时,SCK是从FPGA内部PLL分出来的,那set_output_delay的参考时钟是SCK还是系统时钟?如果选错了,约束值会差一个时钟周期。我自己带项目时发现,SPI从机输出数据的场景最容易栽跟头——从机在下降沿后Tco才出数据,但FPGA在上升沿采样,那你set_input_delay实际上要保证数据在上升沿前稳定,所以约束值要算上整个时钟半周期减去Tco。建议你拿一个实际项目,比如ADS1115或MCP3204,把数据手册的时序图截下来,手动标出每个数值,跑一次Vivado时序报告,比看十篇教程都有用。追问一句:你面试时被问的是哪个具体接口?DDR还是SPI?不同接口的约束思路差别挺大。

面试官说你松,其实很多时候不是你不会算Tco和Tsu,而是你忘了把时钟树本身的偏差算进去。我给你一个实际项目里踩过的坑:我做一块板子,FPGA用内部PLL输出50MHz给外部ADC做采样时钟,ADC的数据在时钟上升沿之后Tco_max=6ns才出来。我按公式 set_input_delay -max = Tco_max + PCB走线延迟,大概算了6.2ns,觉得挺严了。结果Vivado时序报告里那条路径的setup slack是负的。我查了半天发现,问题出在我给ADC的时钟是从FPGA一个普通IO输出的,那个IO到PLL的clock path延迟有1.2ns,而FPGA内部采样用的时钟是PLL直接输出的,clock latency只有0.3ns。这两个时钟到达时间差了将近1ns,但我set_input_delay里根本没考虑这个差。后来我在约束里加了set_clock_groups和set_input_delay的-reference_pin,把时钟偏斜补进去,slack才变正。所以面试官说你松,很可能是因为你的约束只算了外部路径,没把FPGA内部两个时钟域之间的偏移算清楚。你下次回答时,可以主动问一句:面试官你好,这个场景里FPGA内部给外部芯片的时钟是通过哪个引脚输出的?和采样时钟是不是同一个PLL分出来的?这样一听就不是背公式的。
发表回答
登录后可在本页底部提交回答