高扇出信号可能会因为布线拥塞而导致时序问题,常用的方法是通过寄存器复制以降低扇出,这可通过综合属性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中的选项达到复制目的