做FPGA开发的同学,十有八九都被时序约束折磨过。代码写得好好的,仿真也没问题,一跑综合实现就报一堆setup/hold violation,改来改去就是收敛不了。按我的经验,这时候与其继续盲目调参数,不如静下心来检查一下自己的约束是不是从根子上就写错了。
今天咱们就聊聊那些导致时序约束不收敛的常见问题,手把手帮你排坑。

时钟路径分析示意
时钟约束:你真的定义对了吗
说起来,时钟约束应该是最基础的东西,但偏偏出问题最多的也是这里。很多人习惯性地只约束主时钟,忽略了衍生时钟。什么叫衍生时钟?比如你用MMCM/PLL输出的时钟、用BUFG/BUFR处理的时钟,这些都是由主时钟派生出来的。Vivado不会自动帮你识别它们,必须显式声明。
有个坑特别容易踩:定义了MMCM输出时钟,但忘了把它的输入输出关系通过generated_clock关联起来。这样时序引擎就不知道这两个时钟之间的相位关系,分析的时候自然会出错。
还有个更隐蔽的问题——时钟的抖动(Jitter)和不确定性(Uncertainty)。默认值往往偏乐观,你要是直接用,没准在更严苛的条件下就崩了。建议大家在约束文件里显式设置合理的抖动值,别完全依赖工具的默认值。

FPGA IO时序分析
IO约束:别忘了外部世界的存在
很多新手只关注内部时序,对IO约束不上心。问题是,你的芯片不是孤立存在的,它要和外面的器件通信。外部器件的时序特性你得考虑进去。
set_input_delay和set_output_delay这两个约束,参数选择特别讲究。你得知道上游器件的时钟周期、输出数据Valid窗口,下游器件的Setup/Hold要求。很多时候报timing violation,不是内部逻辑太慢,而是IO约束设得太宽松或者太严格。
有个小技巧分享给大家:不确定外部器件参数的时候,可以先按50%时钟周期来估算,然后根据实际测试结果微调。比一上来就随便写个数字强多了。

时钟域交叉(CDC)路径分析
跨时钟域:最容易出问题的边界地带
跨时钟域问题堪称FPGA设计的"癌症",处理不好轻则时序不收敛,重则功能异常。常见的问题是对CDC路径要么完全不约束,要么约束得一塌糊涂。
完全不约束的情况比较少见,毕竟综合工具会报警告。但约束不当就很普遍了。最典型的错误是用set_false_path一刀切,把所有跨时钟域路径都设成false path。问题是,不是所有CDC路径都能安全地用false path,有些关键路径必须保证正确的时序关系。
正确做法是分门别类处理:慢时钟到快时钟的采样路径可以用set_false_path或set_max_delay;快时钟到慢时钟的握手路径往往需要set_false_path加额外的时序裕量;而异步复位这类路径,set_false_path才是正解。
有意思的是,很多人知道CDC同步器的重要性,但在约束层面却忽略了对同步器本身打拍级数的考虑。同步器链本身的路径也是有时序要求的,别漏掉了。

时序约束综合分析
时序例外:用错了比不用更糟糕
set_max_delay、set_multicycle_path这些时序例外约束,用好了能救命,用错了就是埋雷。我见过最离谱的案例是,有人为了"提高"时序收敛,把整个设计的所有路径都设了很宽松的max_delay。结果呢?工具在优化的时候完全失去了方向,性能反而更差了。
时序例外约束有几条黄金法则:第一,约束范围尽量精准,用最具体的路径表达式,别动不动就-through * -to *;第二,多周期路径要确认清楚是setup还是hold语境下的多周期;第三,用完记得清理,别让过期的约束继续生效。
还有个容易忽略的地方:set_case_analysis这个约束。它用来固定某些信号的值,但很多人设完之后忘了这个约束会影响整条路径的时序分析,有时候时序不收敛的根源就在这里。
复位设计:被忽视的隐形成本
复位信号看起来不起眼,但它对时序的影响可能是致命的。全局异步复位会让工具在布局布线的时候很为难,因为复位信号要连到设计里的每一个寄存器,负载极大。
我建议能不用复位就不用复位,Xilinx 7系列以后的器件,上电初始值都是确定的,很多场景完全可以用初始化代替复位。如果非要用复位,优先选择高扇出的同步复位,并且通过set_property ASYNC_REG标记CDC路径上的寄存器。
关于复位的时序约束,有个细节很多人不知道:set_false_path -from [get_async_pins]这种写法已经过时了,正确做法是通过综合属性来控制。
总结:约束是个系统工程
按我的经验,时序约束不收敛,80%的问题出在约束本身,20%才需要调综合实现策略。与其一味地加pipeline、加buffer,不如先把自己的约束文件过一遍。
几个自查清单送给大家:时钟定义是否完整?IO约束参数是否有依据?CDC路径是否分类处理?时序例外是否精准且不过期?复位策略是否合理?
时序约束这东西,入门容易精通难。但只要理解了工具的分析逻辑,约束写对做好收敛,其实也没那么玄乎。希望今天的分享对大家有帮助,有问题欢迎留言交流。
-
FPGA
+关注
关注
1664文章
22513浏览量
639627 -
仿真
+关注
关注
55文章
4540浏览量
138707 -
时序约束
+关注
关注
1文章
121浏览量
14008
原文标题:时序约束怎么设都不收敛,到底哪里错了
文章出处:【微信号:FPGA研究院,微信公众号:FPGA研究院】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
FPGA时序约束的几种方法
FPGA时序约束的几种方法
multisim仿真错误不收敛
FPGA中的时序约束设计
深入了解时序约束以及如何利用时序约束实现FPGA 设计的最优结果
FPGA时序约束的6种方法详细讲解
Abaqus橡胶仿真不收敛问题的排查方法
唠一唠解决FPGA约束中时序不收敛的问题
聊聊那些导致时序约束不收敛的常见问题
评论