关于Vivado综合属性:MAX_FANOUT

高扇出信号可能会因为布线拥塞而导致时序问题,常用的方法是通过寄存器复制以降低扇出,这可通过综合属性MAX_FANOUT实现。

MAX_FANOUT可应用于RTL代码中,也可以应用于XDC中,如下图所示。此外,MAX_FANOUT优先级高于-fanout_limit,且可作用于控制信号。
 


在使用MAX_FANOUT时可能会出现MAX_FANOUT不生效,可能的原因之一是其作用对象与负载不在同一层次,如下图所示。触发器在inst_0模块中,inst_0与inst_1在同一层次,但负载在inst_1下的三个模块inst_10、inst_11和inst_12中。
 


此时,一个可行的方法是将触发器搬移到相应的层次下再用MAX_FANOUT,如下图所示。
 


这里就不得不提到-flatten_hierarchy对MAX_FANOUT的影响。如下表所示。
 


MAX_FANOUT可作用于Xilinx IP内部信号,但未必会生效。这是因为IP本身会有一些保护属性,使得层次保留,造成触发器与负载不在同一层次下。此时,可使用如下方法。
 


另外,当MAX_FANOUT作用于bus中的某一位时,如下图所示,会造成其他位对应的寄存器也被复制。在这里rx_data_reg[0]~rx_data_reg[3]均被复制,这可能是不期望的。
 


为此,可采用如下方法。创建临时信号,将要使用MAX_FANOUT的信号和不使用MAX_FANOUT的信号隔离。
 


在RTL代码中使用MAX_FANOUT。
 


或在XDC中使用MAX_FANOUT。
 


通常,复制后的寄存器名字带有字符串rep。例如:
uart_rx_i0/uart_rx_ctl_i0/rx_data_reg[3]_rep
uart_rx_i0/uart_rx_ctl_i0/rx_data_reg[3]_rep__0
据此,可帮助查找已复制的寄存器。
结论
-MAX_FANOUT可有效帮助降低扇出,但需要确保待复制寄存器与负载在同一层次下
-对于IP,MAX_FANOUT未必生效,此时可借助phys_opt_design中的选项达到复制目的

------------------------------------------

关于set_max_fanout的准确理解和说明

在DC 的ug中说“the tool ensures the total loads connected to the input ports is small enough to keep the fanout no more the maximu value;”

很多人不能理解为什么set_max_fanout命令为什么是约束 input ports的而不是output,原因如下: ug中关于该命令的更详细的说明如下: ... compile attempts to ensure that the sum of the fanout_load attributes for input pins on nets driven by the specified ports or all nets in the specified design is less than the given value. 也就是说set_max_fanout约束了 由 input port 驱动的net(以及design内部所有nets)上所有相连 的input pin的fanout_load值的总和,而该fanout_load值由lib库中的default_fanout_load定义,这个值一般都为“1”。 由此大家可以简单理解为set_max_fanout约束了某条net上驱动的所有cell的个数的总和,而这条net可以由input port驱动, 也可以使内部的任何一条net; 这也是为什么set_max_fanout命令不是用来约束output ports,因为一个输出端口可能会连有很多条net; 而DC是根据net单独进行分析的; output port的约束使用set_fanout_load命令来约束的,现在一般用set_load命令代替; 注意这里set_fanout_load和lib库中default_fanout_load的值是没有关系的; 不知道这次解释清楚了没有,有兴趣的可以站内进行交流

------------------------------------

set_max_fanoutSets the max_fanout attribute to a specified value on specified input ports and/ordesigns.

set_fanout_load:Sets the fanout_load attribute to a specified value on specified output ports of the current design.
 

应该这样理解set_max_fanout设置在input上,是通知DC该Cell上一级Cell的output max_fanout是N,则该级选用的Cell的input的load不能大于N。
set_fanout_load设置在output上的N,是通知DC该Cell下一级的Cell的input的load是N,则选取该Cell时它的max_fanout要大于(N+已知load)。

set_fanout_load 几乎不用了,就用set_max_fanout 设下DRC limit就行了

猜你喜欢

转载自blog.csdn.net/jerwey/article/details/83379742