优化布线拥塞
Note:文章内容以 Xilinx 系列 FPGA 进行讲解
随着设计规模的增大和复杂度的提升,布线拥塞成为常见的问题,尤其是在用UltraScale FPGA或UltraScale + FPGA时,布线拥塞往往成为时序收敛的瓶颈,也成为编译时间过长的“罪魁祸首”。
1、布线拥塞的三种类型
如上图所示,布线拥塞主要分为三种类型:全局拥塞、短线拥塞、长线拥塞。在UltraScale FPGA中,短线拥塞更常见;而在UltraScale + FPGA中,长线拥塞更常见。
2、拥塞报告分析
利用拥塞报告,我们可以确定当前设计中的拥塞是何种拥塞,具体Tcl命令如下所示:(建议在布局后生成拥塞报告)
拥塞报告由三部分构成,第一部分如下图所示:
该部分显示了拥塞的区域(Window列)、类型(Type列)、程度(Level列)。通过Type列可以查看拥塞类型,Global对应全局拥塞,Long对应长线拥塞,Short对应短线拥塞。不过如果设计没有出现拥塞,查看拥塞报告是没有Type列的。通过Level列可以查看拥塞程度,该数值越大,拥塞越严重。当拥塞程度为5时,表明布线会遇到一些困难;当拥塞程度为6时,表明布线会遇到很大困难;当拥塞程度为7时,表明几乎无法布线。
拥塞报告的第二部分显示了每个拥塞区域的资源利用率情况,结合拥塞类型可进一步判断哪类资源可能会增加,如下图所示:
拥塞报告的第三部分会显示前三个导致拥塞的设计单元,如下图所示:
有时,我们还需要借助设计复杂度报告查看模块之间的互连程度,可以利用如下Tcl命令,在获得拥塞报告的同时也获得设计复杂度报告,如下图所示:
在设计复杂度报告中,如下图所示,我们首先要关注的是Rent值(对应Rent列),当0.65 ≤ Rent值<0.85,且Total Instances列的对应值大于15000时,该模块与其他模块的互联程度就被认为比较重,而当Rent值大于0.85时,该模块与其他模块的互联程度就被认为过重,尤其是Total Instances列的对应值大于25000时。
3、改善布线拥塞的方法
方法一:利用设计流程改善布线拥塞
针对布线拥塞,Vivado在综合和布局布线阶段均提供了相应的策略。在综合阶段,策略Flow_AlternateRoutability可用于改善布线拥塞,如下图所示:
一旦将综合策略选为Flow_AlternateRoutability,相应的Settings里的其他一些选项也会随之变化,如下图所示:
-directive变为AlternateRoutability,-no_lc被勾选,这意味不再出现LUT整合;-shreg_min_size值更新为10,意味着深度小于10的移位寄存器将被综合为级联触发器,只有当深度大于或等于10时,工具才会将其映射为LUT。
此外,还可以采用更细粒度化的综合策略设置,这是因为Vivado支持模块化综合。如果已经探明某个模块是构成布线拥塞的“罪魁祸首”,那么就可以针对该模块设置综合策略。相应Tcl命令如下图所示:
这种方法相比全局设置是有好处的:
(1)避免所有的模块都无法使用LUT整合,导致LUT资源利用率上升;
(2)避免所有模块中的移位寄存器深度小于10的都无法映射为LUT,导致触发器的利用率上升。
从布局布线的角度而言,Vivado也提供了相应的策略以缓解布线拥塞,如下图所示:
对于UltraScale FPGA中出现的布线拥塞,使用①中的几种策略更为合适,不过其中带有SSI字符串的策略仅仅适用于SSI器件,不可将其应用于单die芯片。对于UltraScale+ FPGA中出现的布线拥塞,使用②中的两种策略更为合适。
方法二:利用约束缓解布线拥塞
我们既然知道拥塞的各种类型以及其产生的根本原因,那我们只要根据拥塞报告找到拥塞模块,进行对症下药即可。
例如,全局拥塞与LUT整合和触发器控制集有关,那么我们可以通过模块化综合技术针对拥塞模块设置这两个约束条件,如下图所示:
例如,短线拥塞与MUXF有关,可以采用如下Tcl约束阻止工具推断出MUXF,用LUT取而代之。
除了上面的几条Tcl约束外,还可以采用属性CELL_BLOAT_FACTOR缓解布线拥塞。该属性有3个可选值:LOW、MEDIUM、HIGH。该属性的使用方法如下图所示:
如果布线拥塞区域较小,就可以将该属性施加在位于拥塞区域内的主要模块上。该属性在布局阶段生效,通过增大模块内单元间的间距来降低拥塞程度。不过,如果设计已经消耗了大量的布线资源,那么不建议使用属性CELL_BLOAT_FACTOR。对于较大的模块,使用CELL_BLOAT_FACTOR会使工具将子模块放的较远(子模块间距较大)。
方法三:从代码层面降低布线拥塞程度
布线拥塞本质上跟设计本身的一些特征有密切的关系,而这些特征又和代码相关,所以在前期代码编写时最好遵守下面的一些策略:
(1)限制信号扇出数:高扇出网线会消耗大量的布线资源,容易引起长线拥塞。因此,在设计中对这类网线要格外关注,最好在综合阶段就能发现。通过设置最大扇出约束或使用寄存器复制等方法来降低信号的扇出数,从而减少布线资源的消耗。
(2)优化存储单元的使用:在可能的情况下,使用本地寄存器而不是全局寄存器,这样可以减少长距离的布线,从而减轻拥塞。对于基于SSI(Silicon Interconnect)器件的设计,要做好早期设计规划,使得跨die路径尽可能少,因为过多的跨 die 路径容易导致长线拥塞。
(3)并行化处理:如果设计允许,尝试将一些计算并行化,这可以减少单个路径上的布线负载。
(4)时钟设计:避免在设计中使用过多的全局信号和复杂的时钟树网络,这些都可能导致布线拥塞。确保所有异步时钟域之间有适当的同步,避免跨时钟域的信号成为瓶颈。
(5)合理分配资源:在设计中注意资源的均衡分配,避免某些资源过度集中而其他资源空闲的情况。
(6)模块化与层次化设计:通过模块化设计、层次化设计等方法来降低设计的复杂度,减少布线资源的消耗。
4、缓解布线拥塞的正确流程
我们可以从设计流程、约束和代码层面三个维度缓解布线拥塞,但哪种效果更明显,Vivado提供了一个非常好用的命令report_qor_suggestions,可以为我们提供些参考。就布线拥塞而言,建议针对布局生成的.dcp执行该命令。如果设计出现了布线拥塞,该命令通常会生成一些可缓解拥塞的建议。
所以,针对缓解布线拥塞的流程可以参考如下:
~End~