内部时序全绿,FPGA接口为何仍采错?
内部寄存器路径收敛,不代表外部器件Tco、板级延时和时钟偏斜已经进入分析
FPGA内部时序报告只覆盖被正确建模的路径。若没有为接口设置输入、输出最大和最小延时,工具看不到外部器件Tco、PCB走线、板级时钟偏斜以及对端建立保持要求;报告全绿也可能只是外部路径没有被完整约束。
综合、布局布线都通过,最差slack还是正数,板上接口却偶发采错。降频后好一点,换温度或换一块板又复现。很多人继续优化内部逻辑,却没有问一句:时序报告里的起点和终点,是否真的跨过了FPGA引脚并包含外部器件?
内部寄存器到寄存器路径收敛,只能证明工具看见的内部关系满足要求。同步接口还包含外部器件Tco、板级数据延时、时钟走线偏斜和对端建立保持时间;少了input delay或output delay,所谓“全绿”很可能只是工具没看见板外那一段。
把FPGA当成一个完整器件
输入数据从引脚进入,经过IO和内部路径到达第一级寄存器;时钟也从引脚经过独立路径到达寄存器。输出方向则从内部寄存器出发,经过IO到达引脚。器件内部的这些延时共同构成FPGA的外部时序表现。
图1 FPGA系统参数与外部器件输入模型
如果约束只写create_clock,工具知道时钟周期,却不知道数据在板外何时到达。接口仍可能显示“没有违例”,因为真正的外部到达窗口根本没被描述。
系统同步接口常用板级或外部时钟作为参考,必要时建立virtual clock表示对端看到的时钟。若直接把内部PLL时钟拿来约束外部器件,可能把真实板级偏斜藏在工具看不到的地方。
input delay里到底装了什么?
外部器件在发射时钟沿之后,经过自身Tco才推出有效数据;数据再经过PCB走线到FPGA引脚。与此同时,发射时钟和采样时钟到两颗器件的走线并不完全相同,这个差值形成板级clock skew。
最大输入延时主要约束建立时间,最小输入延时主要约束保持时间。只写-max、不写-min,工具可能通过增加或减少内部延时修好一边,却把另一边推向违例。
图2 外部器件到FPGA的建立与保持时间关系
最小延时有时会写成负数,这不一定是错误。它表达的是相对于参考采样边沿,数据最早到达的位置;符号必须从时序图推导,不能因为“延时应该为正”就强行取绝对值。
完整的输入约束必须同时告诉工具数据最晚和最早可能何时到达。
输出方向同样不能只看Tco
FPGA输出数据经过内部寄存器和IO到达引脚,再沿PCB走线抵达外部器件。对端需要在采样时钟前后保留建立与保持窗口,板级时钟偏斜会改变可用裕量。
因此output delay的最大、最小值应从对端器件数据手册、两条板级路径和时钟关系推导,而不是照抄一个正数。源同步、系统同步和反相采样的符号方向还可能不同,必须先画时序图。
图3 FPGA输出模型与对端采样时序
源同步接口还要明确数据和随路时钟是在同一边沿发射、相反边沿发射,还是通过相移采样。不同关系会改变可用窗口,不能把一套系统同步公式原样套到DDR或源同步总线上。
· 器件参数:使用对端Tco、Tsu、Th的最差值。
· 板级路径:数据与时钟分别计算最小和最大延时。
· 采样边沿:确认同沿、异沿和时钟反相关系。
报告全绿之后再查三件事第一,确认所有接口端口都被约束覆盖,没有unconstrained path。第二,用报告查看实际launch edge、latch edge和输入输出延时符号。第三,把布局后的板长、层别和器件数据手册角落值带回计算。
图4 同步IO实例中的输入输出延时约束
验证时保持逻辑不变,只改变一组input delay或output delay为真实最差范围,观察工具是否重新摆放IO寄存器、插入延时或暴露hold问题。若约束一改报告就大幅变化,原来的“全绿”并不可靠。
1. 画接口时序图标出外部器件、PCB和FPGA三段。
2. 写max与min建立和保持两侧都要覆盖。
3. 查未约束路径确认报告没有遗漏端口。
别让报告只剩一个slack数字检查报告时不要只看最差slack数字。还要看工具选择了哪个时钟边沿、外部延时是否被计入、IO寄存器是否落在IO单元,以及hold修复是否插入了意外延时。
结论内部时序全绿,接口仍采错,最值得怀疑的不是工具失灵,而是工具并不知道板外发生了什么。时序分析只会验证你描述给它的世界。
把外部Tco、板级数据与时钟延时、对端Tsu/Th写进一张图,再翻译成input/output delay,板上偶发错误才有机会在出板前被报告出来。
你现在的接口约束同时写了-min和-max吗?

扫码关注










































