项目上板后时序报告一堆违例,我只知道create_clock,其他约束基本照抄。现在想系统学时序约束:主时钟、生成时钟、输入输出延迟、虚假路径、多周期路径到底该怎么写?新手遇到时序不收敛,应该按什么顺序排查,才能从报错定位到具体代码?
2026年FPGA时序约束怎么写才不报错,新手从时钟定义到跨时钟域约束的完整排查顺序是什么?
6 个回答

先别急着加 false_path,把时序报告里违例的路径起点终点抓出来,看它是不是真跨了时钟域。九成新手的问题出在生成时钟没约束、IO 延迟拍脑袋写,时钟没定义对后面全是白搭。先跑 report_clocks 确认每个时钟周期都对得上,再谈别的。你目前用的是哪家的工具链?

先别急着碰 false_path。把 report_clocks 和 report_timing_summary 拉出来,确认主时钟、生成时钟周期对不对。时钟定义错了,后面 IO 延迟和跨时钟域全是白忙。新手九成卡在这里。你现在用的是 Vivado 还是 Quartus?

上板后一堆违例,先别怀疑代码。跑一遍 report_clocks,看每个时钟周期是不是你板子上的真实频率,生成时钟(PLL/MMCM 出来的)有没有自动派生成功。这一步对了,再去抠 IO 延迟和跨时钟域。顺序反了就是白忙。你用的是 Vivado 还是 Quartus?

先说个大方向:约束不是写给别人看的,是写给时序引擎「翻译」你的板级物理现实的。所以你照抄别人的 create_clock,周期对不上、生成时钟没派生出来,后面 IO 延迟和跨时钟域写得再花哨也白搭。新手排查顺序我建议固定成这样:第一步 report_clocks,确认主时钟周期和板子晶振一致,PLL/MMCM 的输出有没有被自动识别成 generated clock;第二步才去补 create_generated_clock 或让它自动派生,顺便确认时钟之间的相位关系;第三步写 IO 延迟,用 input_delay/output_delay 配合 set_input_jitter 之类的,别拍脑袋填数,尽量从器件手册或板级仿真里估;第四步再处理跨时钟域,set_clock_groups -asynchronous 或 set_false_path 用哪个取决于你是不是真异步;最后才看 report_timing_summary,按 WNS 排序一条条抠关键路径,逻辑层级深就插流水线,别一上来就加 false_path 掩盖问题。你现在的违例主要集中在建立还是保持?

先说结论:新手别把约束当成一套要背的语法,它更像给工具画一张板级真实世界的地图。顺序上我建议死死咬住一条主线——先让所有时钟都有正确周期,再谈别的。具体就是先 create_clock 定晶振进来的主时钟,然后确认 PLL/MMCM 的输出有没有被自动识别成 generated clock,没有就手动补 create_generated_clock,顺手把相位关系说清楚;这一步做完跑 report_clocks,周期跟板子对不上就别往下走。时钟对了,再去写 input_delay/output_delay,数值尽量从器件手册或板级仿真估,别拍脑袋填。最后才是跨时钟域:真异步的用 set_clock_groups -asynchronous,别一上来就 false_path 到处贴。关键路径报告放最后看,先保证约束对,再优化逻辑层级和流水线。你现在用的是 Vivado 还是 Quartus?

你这情况我太熟了,基本每个新手都会在同一个坑里卡两三个月。先说个容易被忽略的点:约束写错和约束没写,报错表现可能一模一样,但排查方向完全相反——前者是工具按你给的地图跑偏了,后者是工具压根没地图只能瞎跑。所以第一步不是急着补约束,而是先看 report_clocks,确认工具到底「认识」几个时钟。
具体顺序我建议这样走。先把主时钟 create_clock 写死,周期严格对着板上晶振或外部输入频率,别写成你希望它跑的频率。然后看 PLL/MMCM 的输出,Vivado 一般会自动派生 generated clock,Quartus 这边有时候需要你自己 create_generated_clock 补上,派生关系断了后面全乱。这两步做完再跑一次 report_clocks,周期对不上就别往下走。
时钟干净了,再去写 input_delay/output_delay。这块新手最容易拍脑袋,其实数值应该来自外部器件的建立/保持时间加板级走线延时,手册里一般有,实在没有就按经验估一个偏保守的值,宁可紧别松。
跨时钟域放到第三位。真异步的用 set_clock_groups -asynchronous,不要一上来 false_path 到处贴,false_path 是告诉工具「这条路径我保证没问题」,你保证不了就别写。
最后才看关键路径报告,违例先判断是逻辑层级太深还是时钟约束本身有问题,前者加流水线,后者回去改约束。你目前板子上是几个时钟域?这个决定了后面排查会不会很绕。
发表回答
登录后可在本页底部提交回答