从UFDM角度讲,优化高扇出net应尽可能在设计初期完成,而且,在设计初期也较容易去做。高扇出net带来的显著问题是由于负载过多,导致某些路径的线延迟过大,从而出现时序违例;有时还会造成布线拥塞。
首先,要找到这些高扇出的net。这需要打开综合后或者Implementation任意阶段的DCP。执行如下命令:
这里,选项-load_types是可选的,其目的是显示net的类型,例如,是复位/置位还是时钟使能,如下图所示。
此外,这个命令还提供了一个选项-slr,这是针对SSI这类多die器件,可以显示每个die中高扇出的net。该命令显示出的高扇出net,我们需要关注这几个方面:
(1)Driver Type是什么?如果是LUT,那么是否可以替换为FF,因为工具仅支持寄存器复制
(2)判定高扇出是否构成时序收敛的瓶颈,这需要结合时序报告一起来检查
(3)该net是全局的还是局部的?比如,是全局时钟使能信号还是某些DSP或BRAM的使能信号
(4)对于多die器件,还要看这些net是否跨die
在综合阶段降低扇出
在综合阶段可以通过属性MAX_FANOUT降低扇出,但使用该属性时要谨慎一些。对于全局复位或全局使能信号,并不建议使用该属性,这会造成大量的寄存器复制,而且有些复制并不是最优的。通常,建议对局部高扇出net使用该属性,同时确保时序违例确实是因为高扇出引起的。这时要注意,有时扇出为50就被认为扇出高了,而有时扇出为500仍被认为是合理的,可接受的,这是从时序角度考虑的。另外,report_qor_suggestions命令会给出一些建议,有时这些建议就包括通过MAX_FANOUT降低扇出。所以,如果不明确到底把扇出讲到多少,可直接使用report_qor_suggestions给的结果。(MAX_FANOUT的具体使用方法可参考ug902)。
对于全局复位信号,可采用如下图(图片来源:Figure 3-19, ug949, V2019.1)所示的复位树方式降低扇出。这里要注意,对于等效寄存器要使用KEEP属性以防止综合时被优化掉。
扇出的高低可参考如下表格进行初步判定,表格来源:Figure 3-1, ug949, V2019.1。
在opt_design阶段降低扇出
opt_design阶段提供了一个选项-hier_fanout_limit,这是一种模块级别的优化扇出的方法。其目的是对于某个层级,如果发现某个net的扇出超过指定数值,则对其进行寄存器复制,以使最终的扇出小于等于该指定数值,同时,复制的寄存器和该net也在同一层次。该选项的使用方法如下图所示。
在place_design阶段降低扇出
首先要针对Vivado的版本查一下place_design有没有这样两个选项之一:-fanout_opt和-no_fanout_opt。最新版本中,有选项-no_fanout_opt,表明默认情形下,place_design会做扇出优化,如果不希望工具做此类优化,可添加选项-no_fanout_opt;之前的版本中可能会有选项-fanout_opt,如果需要做扇出优化就必须把这个选项添加进来。无论是-fanout_opt还是-no_fanout_opt都可以和-directive结合使用。
在phys_opt_design阶段降低扇出
phys_opt_design的很多Directive都可进行扇出优化。除此之外,选项-force_replication_on_nets还可以对指定的net进行复制。