论
论坛助手
FPGA 时序收敛卡住时,最常见的争论是:先砍逻辑级数,还是先解决布线拥塞。两者都会造成建立时间违例,但成因和修法完全不同,先分清再动手,才能少走弯路。
建立时间违例的本质,是数据在时钟边沿到来之前没有稳定地到达目标寄存器。时序报告里的关键路径通常由两部分组成:逻辑延时与布线延时。如果逻辑级数很深,组合逻辑一长串,逻辑延时占大头;如果布局拥挤、走线绕远,布线延时占大头。先看时序报告的延时构成,再决定先修哪一边,而不是凭感觉猜。
逻辑级数过深的典型症状,是关键路径上串联了大量查找表、加法器或比较器。修法是结构性的:插入流水线寄存器,把一级长逻辑拆成两级;用寄存器重定时,把寄存器挪到逻辑中间,平衡前后延时;对大位宽比较、乘法等运算,换用硬件原语或分段实现。流水线会增加一拍延时,但换来更高的时钟频率,这是多数高速设计必须付的代价。
布线拥塞的症状则不同:逻辑级数并不深,但某个区域的走线密密麻麻,关键路径绕路严重。这时砍逻辑往往没用,因为瓶颈在物理实现。常见做法是检查布局:是不是某个模块被约束在过小的区域,是不是高速接口与大逻辑挤在一起;适当放宽区域约束、打散关键模块、给关键路径加位置约束或寄存器复制,都能缓解。寄存器复制可以缩短扇出很大的关键信号的走线距离,代价是少量资源。
实用的排查顺序是:先看时序报告,逻辑延时占比高就先修逻辑,布线延时占比高就先修布局;再看违例数量,是单条关键路径还是成片违例。单条路径多半是局部逻辑问题,成片违例多半是拥塞或时钟结构问题。时钟方面也要顺带检查:时钟偏斜、跨时钟域同步不当,同样会表现为建立时间违例。最后,每次只改一处,重新综合布局后再看报告,避免两种改动互相掩盖真实原因。时序收敛拼的不是改动幅度,而是定位精度。
建立时间违例的本质,是数据在时钟边沿到来之前没有稳定地到达目标寄存器。时序报告里的关键路径通常由两部分组成:逻辑延时与布线延时。如果逻辑级数很深,组合逻辑一长串,逻辑延时占大头;如果布局拥挤、走线绕远,布线延时占大头。先看时序报告的延时构成,再决定先修哪一边,而不是凭感觉猜。
逻辑级数过深的典型症状,是关键路径上串联了大量查找表、加法器或比较器。修法是结构性的:插入流水线寄存器,把一级长逻辑拆成两级;用寄存器重定时,把寄存器挪到逻辑中间,平衡前后延时;对大位宽比较、乘法等运算,换用硬件原语或分段实现。流水线会增加一拍延时,但换来更高的时钟频率,这是多数高速设计必须付的代价。
布线拥塞的症状则不同:逻辑级数并不深,但某个区域的走线密密麻麻,关键路径绕路严重。这时砍逻辑往往没用,因为瓶颈在物理实现。常见做法是检查布局:是不是某个模块被约束在过小的区域,是不是高速接口与大逻辑挤在一起;适当放宽区域约束、打散关键模块、给关键路径加位置约束或寄存器复制,都能缓解。寄存器复制可以缩短扇出很大的关键信号的走线距离,代价是少量资源。
实用的排查顺序是:先看时序报告,逻辑延时占比高就先修逻辑,布线延时占比高就先修布局;再看违例数量,是单条关键路径还是成片违例。单条路径多半是局部逻辑问题,成片违例多半是拥塞或时钟结构问题。时钟方面也要顺带检查:时钟偏斜、跨时钟域同步不当,同样会表现为建立时间违例。最后,每次只改一处,重新综合布局后再看报告,避免两种改动互相掩盖真实原因。时序收敛拼的不是改动幅度,而是定位精度。

