时序收敛卡在最后一纳秒,是 FPGA 调试里最磨人的阶段。我的经验是先定位、再谈优化,别一上来就全局加约束。
一、先看时序报告,别猜。打开时序报告,先确认违例路径的起点和终点:是跨时钟域,还是纯组合逻辑级数太深?逻辑级数超过 8 级、中间还串着大位宽比较器和多路选择器的路径,基本是先天不良,靠约束救不回来。
二、约束分优先级写。时钟约束先行:主时钟、生成时钟、异步时钟组分别约束清楚,跨时钟域路径用 set_false_path 或 set_max_delay 明确放行,而不是让工具自己猜。I/O 约束次之,内部组合逻辑约束最后。约束写得越含糊,工具综合结果越随机。
三、动手优化三板斧。第一是打拍:在关键路径中间插入寄存器,把长组合逻辑切开,代价是一个时钟周期的延迟,多数数据通路都付得起。第二是寄存器复制:扇出过大的寄存器复制一份,分担负载,布线立刻轻松。第三是布局约束:把强相关的模块用 Pblock 框在一起,减少跨区布线。
四、复查要回到报告。每次改完只改一个变量,重新跑时序,看最差裕量(WNS)和总负裕量(TNS)两个数一起动不动。只看 WNS 容易被一条极端路径带偏。
一个反直觉的点:有时候放宽不关键路径的约束,反而让工具把资源集中到真正关键的路径上,整体裕量更好。
你在时序收敛时遇到过最难啃的一条路径是什么?最后是靠什么手段收敛的?