在当今复杂的电子设计领域,高扇出信号线(HFN)问题成为了众多开发者面临的挑战之一。高扇出信号线指的是具有大量负载的信号线,这类信号线在实际应用中可能会引发一系列问题,严重影响设计的性能和稳定性。
高扇出信号线会占用大量的布线资源,极有可能导致布线拥塞。由于负载分散的原因,信号线的延迟也会进一步增大,从而使得在高扇出信号线上满足时序要求变得十分困难。例如,从图 1 所示的违例达 0.978 ns 的时序路径中可以看出,高扇出信号线 Net A 由 LUT 驱动,造成了 2.418 ns 的延迟。因此,对高扇出信号线进行优化,是解决此类时序路径问题的关键所在。

在设计过程中,准确识别高扇出信号线是进行优化的步。开发者可以使用 report_high_fanout_nets 命令来识别设计中的非时钟高扇出信号线。该命令具备多个选项,可用于打印有关高扇出信号线的详细信息,包括驱动程序信息、时序信息(-timing)和负载位置信息(-slr)。如果设计中存在导致 QoR 问题的高扇出信号线,建议在实现的中间步骤转储该。


另外,还可以采用以下表达式来查询高扇出信号线:
set fanout [expr {[get_property FLAT_PIN_COUNT [get_nets $Net_A] -1 }]
在设计的不同实现阶段,有多种因素会影响高扇出信号线的优化。如图 4 所示,DON'T_TOUCH 属性、KEEP HIERARCHY 属性和 MARK_DEBUG 属性会阻止执行任何 HFN 优化。其他属性如 MAX_FANOUT、CLOCK_BUFFER_TYPE 和 MAX_FANOUT_MODE 等,也都会对 HFN 优化产生影响。

在综合期间,MAX_FANOUT 属性可用于强制复制寄存器。该属性用于控制寄存器复制的时机,当某条信号线的扇出大于 MAX_FANOUT 值时,就会考虑对该寄存器进行复制。不过需要注意的是,无论时序如何,该属性都会被应用,所以必须谨慎使用。过量使用该属性可能会因过度复制而导致更多问题,尤其是当 HFN 位于寄存器控制信号上时。因此,建议在综合期间慎用该属性,可使用命令 set_property MAX_FANOUT [get_nets -hier] 。同时,不建议在驱动程序与负载之间设置额外的组合逻辑,因为这可能会妨碍某些复制优化操作。此外,DONT_TOUCH、KEEP_HIERARCHY 和 MARK_DEBUG 等属性可能会阻碍有益的复制操作。如需了解这些属性的更多详情,请参阅 UG901:https://docs.amd.com/r/en-US/ug901-vivado-synthesis/KEEP_HIERARCHY 。
例如,如果某条信号线的 MAX_FANOUT 属性设为 3,那么该信号线的驱动程序必须复制 2 次,如图 5 所示。同样,若有一个源,其中有 10,000 个负载分布在整个设计中,将 MAX_FANOUT 设为 1,000 来限制扇出,工具会将该源复制 10 次,并为每个复制的源分配 1,000 个负载。

在逻辑优化(opt_design)期间,有多种间接方式可用于控制高扇出信号线。
- BUFG 插入:默认情况下,在逻辑优化中,会在满足某些要求的高扇出控制信号线上插入 BUFG 或 BUFG_FABRIC 时钟缓冲器(在 Versal 架构中)。这是一种非常有效的方法,因为全局时钟布线资源可以减少互连结构布线上的拥塞,从而有助于缓解时序问题。不过,非时钟信号线的扇出必须大于 25k 才符合此条件。并且,使用 BUFG 插入时,工具较为保守,对于 Ultrascale+/Versal,限制是 24 个 BUFG(此限制不包括 BUFG_GT)。
- 用户指定的 BUFG 插入:如果信号线没有插入 BUFG,开发者可以通过 CLOCK_BUFFER_TYPE 属性强制执行 BUFG 插入。工具会为指定的信号线添加 BUFG/BUFG_FABRIC,并且不会将其计入先前提及的限值 24,前提是有走线可用。

- BUFG 负载拆分:在某些情况下,插入 BUFG 的过程中会拆分时钟网络,使其分别驱动组合负载与时序负载。发生拆分时,时序负载由 BUFG 驱动,组合负载则由原始驱动程序来驱动。无论是 opt_design 插入的 BUFG 还是用户插入的 BUFG,都会发生此拆分操作。当 BUFG 输出信号线驱动组合负载与非时钟时序负载(例如,高扇出复位)时,预计会发生负载拆分。
- 层级复制:用户还可以通过工具使用 -hier_fanout_limit 选项,根据高扇出信号线的逻辑层级来复制该信号线的驱动程序。工具会在层级内查找,如果发现驱动程序所驱动负载超出指定限值,就会复制驱动程序。这有助于缓解高扇出信号线所导致的拥塞,但这是一种基于规则的复制,无法感知时序,因此建议谨慎使用。需要注意的是,为 -hier_fanout_limit 选项指定的限值为 512。例如,当 -hier_fanout_limit 设为 1000 时,对于扇出为 60,000 的信号线(如图 6 所示),HFN 驱动程序会复制 59 次,每次复制的驱动程序都会驱动 1000 个负载,可使用命令 opt_design -hier_fanout_limit 1000 来实现。

了解对某个设计要素进行了哪些优化是很有帮助的。OPT_MODIFIED 属性会明示对设计要素执行了哪些优化(按优化的执行顺序),同样,OPT_SKIPPED 会显示设计要素上跳过了哪些优化。在某些情况下,DONT_TOUCH 或类似属性可能阻止优化。建议搜索日志,查找有关跳过某一项优化的具体原因的更多信息。与前述属性类似,PHYS_OPT_MODIFIED 与 PHYS_OPT_SKIPPED 是用于物理优化的等效属性。如果在 opt_design 中因使用 hier_fanout_limit 选项而导致复制驱动程序,会发现 OPT_MODIFIED 属性与 HIER_FANOUT_LIMIT 相等,如图 7 所示。
