文档参考:
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等相关选项