在做一个大一点的FPGA项目,用了不少DSP和BRAM,在布局布线后时序总是很难收敛到要求的频率。常用的加寄存器、重定时、逻辑复制都试了,效果有限。想请教有经验的工程师,还有哪些更深入的优化策略?比如利用UltraScale+的特定资源,或者从综合约束上做文章?
做FPGA开发,经常遇到时序违例,除了加流水线、优化逻辑、降频率,还有哪些高级的时序收敛技巧?
提问
回答 3

除了常规方法,可以试试从布局布线约束入手。比如用 Pblock 把关键路径模块框起来,限制它只能在特定区域布局,减少布线延迟。对于 UltraScale+ 这类器件,还可以用 CLOCK_DELAY_GROUP 来平衡时钟偏斜,或者对高扇出网线手动插入 BUFGCE 来改善时钟质量。
另外,综合阶段用 flatten_hierarchy 设为 rebuilt 有时能让工具更自由地优化,但要注意可能增加编译时间。如果用了 IP,检查一下是不是生成了跨时钟域隔离逻辑,那东西有时会偷偷插入同步器导致时序变差。

我遇到过类似问题,后来发现是 RAM 输出路径太慢。你可以试试把大的 RAM 拆成多个小 RAM 并行读,然后用 MUX 选择,这样相当于用面积换速度。对于 DSP 链,检查一下是不是工具自动推断的流水线不够,可以手动在代码里加几级寄存器把长组合逻辑打断。
还有一个偏方:在布局布线时用 phys_opt_design 命令,加上 -directive Explore 或者 AggressiveExplore,让它多试几种布局策略。虽然跑得慢,但有时能奇迹般地把 setup time 压下去。注意先做好增量编译的 checkpoint,免得白跑。

从约束角度说,很多人没设好 multicycle path 和 false path。比如两个时钟域之间交互的数据,如果允许几个周期内稳定就行,设成多周期路径能大大减轻时序压力。还有那些上电后只配置一次的寄存器,可以直接设 false path。
对于 UltraScale+,可以用 SLR 间流水线:如果设计跨了多个 SLR,在边界插寄存器能减少长距离布线延迟。另外,检查一下有没有用上专用的 CARRY8 资源做快速进位链,综合属性 ( use_carry_chain = "yes" ) 可以提示工具。最后,如果频率实在压不动,考虑用器件速度等级更高的型号,虽然贵点但省时间。
发表回答
登录后可在本页底部提交回答
