Fanout,即扇出,指模块直接调用的下级模块的个数,若是这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛。所以,
在写代码时应尽可能避免高扇出的状况。可是,在某些特殊状况下,受到总体结构设计的须要或者没法修改代码的限制,则须要经过其它优化手段解
决高扇出带来的问题。如下就介绍三个这样的方法:
如图1所示为转置型FIR滤波器中的关键路径时序报告,在一些转置型结构FIR滤波器中,输入数据的扇出较大,在图1中所示为11,所以net
delay高达1.231ns。如图2所示,输入数据驱动了11个DSP48E1。在没有优化状况下,该设计的fmax为
206.016MHz。
寄存器复制是解决高扇出问题最经常使用的方法之一,经过复制几个相同的寄存器来分担由原先一个寄存器驱动全部模块的任务,继而达到减少扇出的目的。经过简单修改代码,如图3所示,复制了4个寄存器:din_d0、din_d一、din_d二、din_d3,din_d、din_d0、din_d一、din_d2分别驱动2个DSP48E1,din_d3驱动3个DSP48E1。其中在代码中为防止综合器优化相同寄存器,在对应信号上加入了(* EQUIVALENT_REGISTER _REMOVAL="NO"*)属性避免被优化。
综合实现后获得时序报告如图4所示,该数据路径上输入数据fanout减为2,对应net delay也减少到了0.57ns。获得设计如图5所示,与期
望的相同,复制了4个寄存器来分担fanout。通过寄存器优化后获得fmax:252.143MHz。
在代码中能够设置信号属性,将对应信号的max_fanout属性设置成一个合理的值,当实际的设计中该信号的fanout超过了这个值, 综合器就会自动对该信号采用优化手段,经常使用的手段其实就是寄存器复制。属性设置以下代码所示: (* max_fanout ="3"*)regsigned[15:0] din_d; 将din_d信号的max_fanout属性设置成3,通过综合实现后,获得时序报告如图6所示,其中fanout只有2,相应的net delay也只有0.61ns,自动优化效果还不错。结构如图7所示,其中din_d_12_一、 din_d_12_二、din_d_12_3是综合器优化后自动添加,即实现了寄存器复制功能。通过设置max_fanout属性优化后获得fmax:257.135MHz。
一般BUFG是用于全局时钟的资源,能够解决信号由于高扇出产生的问题。可是其通常用于时钟或者复位之类扇出超级大的信号,此类信号涉
及的逻辑遍及整个芯片,而BUFG能够从全局的角度优化布线。并且一块FPGA芯片中BUFG资源也有限,在7k325tffg900上也仅有32个,若是用于
普通讯号的高扇出优化也不大现实。所以,在时钟上使用BUFG是必须的,可是若是设计中遇到某些复位信号因高扇出产生的时序问题时,能够在
此信号上使用BUFG来优化。
综上,在遇到信号高扇出时,对于普通讯号可采用寄存器复制或者设置max_fanout属性优化;而对于复位信号,可加入BUFG优化。
原文链接:https://www.cnblogs.com/lantingyu/p/10782789.html
网友评论