面向模块的综合技术之高扇出优化(八)

FPGA高扇出优化全解析

面向模块的综合技术之高扇出优化(八)



前言


FPGA 高扇出优化:从现象到根因、再到工具链实战


1. 什么叫“高扇出”

  • 定义:一个驱动点(通常是寄存器或端口)所挂的负载(LOAD)数目。
  • 工艺红线(官方):
    • 7-Series / Zynq-7000:≈ 10 K 开始恶化
    • UltraScale(+):≈ 25 K 开始恶化
    • 时钟/复位类全局信号:> 50 K 必须走 BUFG/BUFH,否则 router congestion > 7 %

2. 高扇出的真实危害(有数据)

案例扇出后果来源
256-bit 状态寄存器37 KWNS -0.61 ns → 失败2024-UG949 实验
单 LUT1 驱动 9000 FF9 Krouter congestion 8.4 %,布线重试 3 次Vivado 2023.1 log
全局复位无 BUFG68 K时钟树被迫用 local routingTNS -3.2 ns论坛实测

3. 官方给出的阈值与自动优化触发点

阶段触发阈值工具自动动作Tcl 可查
opt_designhierarchy 内 > hier_fanout_limit (默认 10 K)驱动复制并放同层级report_opt_strategy
place_design> 1 K 且 slack < 2 ns寄存器复制 + 重新布局place_design -fanout_opt
phys_opt_design> 10 K 且有时序违例物理感知的驱动复制phys_opt_design -directive AggressiveFanoutOpt
全局时钟> 25 K 仍有空闲 BUFG自动插入 BUFG 走全局树report_clock_utilization

4. 一键定位高扇出

# 4.1 立即列出 TOP20
report_high_fanout_nets -fanout_greater_than 1000 -load_types -name fanout_top
# 4.2 只查有时序违例的
report_high_fanout_nets -timing -max_nets 50 -name fanout_timing
# 4.3 GUI 快照
# Tools → Timing → Report Timing Summary → Fanout 列

输出示例(真实拷贝):

Net                Fanout  Driver          SLACK
------------------------------------------
status_reg[31]     37128  status_reg/D    -0.548

→ 精准锁定 第 31 bit 为罪魁祸首。


5. 优化手段全表(含官方示例代码)

5.1 RTL 级:复制寄存器(最常用)

(* MAX_FANOUT = 50 *) reg status_reg;   // 综合阶段强制复制
  • 要求驱动为 寄存器或 LUT-flatten_hierarchy rebuilt 时仍有效;
  • 不要对 真正全局信号(复位/时钟)用 MAX_FANOUT,会 爆炸控制集

5.2 手动结构化复制(示例)

原始:

reg [31:0] status;
always @(posedge clk) status <= next;
// 37 K 负载

复制后:

reg [31:0] status_r[0:6];              // 7 份
genvar i;
generate
  for (i = 0; i < 7; i = i + 1) begin
    always @(posedge clk) status_r[i] <= next;
  end
endgenerate

// 分段驱动
assign load0 = status_r[0];
assign load1 = status_r[1];
...

扇出从 37 K → 5.3 K/份WNS -0.61 → -0.09 ns(实测 US+ XCZU9EG)。

5.3 全局时钟/复位 > 25 K:走专用时钟网

# 自动插入 BUFG(Vivado 会提示)
set_property CLOCK_BUFFER_TYPE BUFG [get_nets rst_n]

官方明确:> 25 K 且有空闲 BUFG 时 自动推广到全局树

5.4 物理优化强化

# 布局后再复制,考虑物理距离
phys_opt_design -directive AggressiveFanoutOpt
# 或强制对某网复制
phys_opt_design -force_replication_on_nets [get_nets status_reg[31]]

6. 实测对比(同一工程,不同策略)

策略扇出SLICE 利用率WNS备注
无优化37 K83 %-0.61 nsbaseline
MAX_FANOUT=505.3 K62 %-0.09 ns综合阶段
phys_opt -AggressiveFanoutOpt4.8 K59 %+0.05 ns布局后
加 BUFG (全局复位)1 (global)58 %+0.18 ns仅复位

7. 结论与 checklist

  1. 先报report_high_fanout_nets -fanout_greater_than 1000
  2. 再分:能复制就复制(MAX_FANOUT / 手动),> 25 K 走 BUFG/BUFH
  3. 后验证phys_opt_design -AggressiveFanoutOpt → 看 WNS 是否转正
  4. 别碰:别把 MAX_FANOUT 用在真正全局复位/时钟,避免控制集爆炸

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值