天天看点

静态时序分析之时序收敛技巧(Xilinx FPGA)

文档参考:

ug903:vivado-using-constraints.pdf

ug945:vivado-using-constraints-tutorial.pdf

ug949:vivado-design-methodology.pdf

1、 代码风格

推荐使用Xilinx language templates的代码块,这里的代码能够综合出正确且结构简洁的电路,包括移位寄存器,乘法,复数乘法,FIR滤波器等,凡是涉及到的模块尽量使用官方写法。

模块的输出最好是使用寄存器输出,有助于降低路径延时帮助时序收敛。

如果并不需要优先级,尽量将If语句转化为case语句。

2、时序改善

2.1、建立时间问题

Xilinx的时序报告中的Data Path Delay主要分为logic delay + route delay,一般各占比50%左右表示最优,若建立时间违例且占比严重不均匀,则需要进行优化。

logic delay主要由逻辑级数太大或者扇出太大导致。

一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能容纳的logic level是不同的。

逻辑级数太大解决方法:重定时(Retiming),典型的重定时方法就是流水线,将过于冗长的组合逻辑增加寄存器进行打拍。

High Fanout指的是扇出,同样和器件、设计频率等有关。

扇出太大解决方法:降低扇出最好不要在综合设置中指定,过低的扇出限制会造成设计堵塞反而不利于时序收敛,最好的方法是根据设计中时序最差路径的扇出进行针对性的优化。如果是寄存器的输出扇出很大,可以使用max_fanout属性标记寄存器声明,也可以手动复制寄存器。

route delay主要由布线延迟导致,可以通过位置约束进行优化,或者通过第3节中的工程设置得到改善。

2.1、保持时间问题

保持时间问题的问题往往是异步处理的问题,比如信号的跨时钟域。

对于一个信号的跨时钟域问题,一般使用双寄存器法。为了降低MTBF(Mean Time Between Failures,平均无障碍时间),这两个寄存器最好位于同一个slice中。可以使用tcl语言指定,如:

set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]

也可以直接在代码中指定:

(* ASYNC_REG = "TRUE" *) (* keep = "true" *)reg sync0_reg, sysnc1_reg;

也可以参考代码模板使用XPM模板进行处理。

信号的跨时钟域还可以使用FIFO或者握手的方法。

3、工程设置

通过指定不同的Synthesis和Implementation策略,还有使能Post-place Phys Opt Design和Post-route Phys Opt Design等相关选项