面向模块的综合技术之高扇出优化(八)
文章目录
前言
FPGA 高扇出优化:从现象到根因、再到工具链实战
1. 什么叫“高扇出”
- 定义:一个驱动点(通常是寄存器或端口)所挂的负载(LOAD)数目。
- 工艺红线(官方):
- 7-Series / Zynq-7000:≈ 10 K 开始恶化
- UltraScale(+):≈ 25 K 开始恶化
- 时钟/复位类全局信号:> 50 K 必须走 BUFG/BUFH,否则 router congestion > 7 %。
2. 高扇出的真实危害(有数据)
| 案例 | 扇出 | 后果 | 来源 |
|---|---|---|---|
| 256-bit 状态寄存器 | 37 K | WNS -0.61 ns → 失败 | 2024-UG949 实验 |
| 单 LUT1 驱动 9000 FF | 9 K | router congestion 8.4 %,布线重试 3 次 | Vivado 2023.1 log |
| 全局复位无 BUFG | 68 K | 时钟树被迫用 local routing,TNS -3.2 ns | 论坛实测 |
3. 官方给出的阈值与自动优化触发点
| 阶段 | 触发阈值 | 工具自动动作 | Tcl 可查 |
|---|---|---|---|
opt_design | hierarchy 内 > 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 K | 83 % | -0.61 ns | baseline |
MAX_FANOUT=50 | 5.3 K | 62 % | -0.09 ns | 综合阶段 |
phys_opt -AggressiveFanoutOpt | 4.8 K | 59 % | +0.05 ns | 布局后 |
| 加 BUFG (全局复位) | 1 (global) | 58 % | +0.18 ns | 仅复位 |
7. 结论与 checklist
- 先报:
report_high_fanout_nets -fanout_greater_than 1000 - 再分:能复制就复制(
MAX_FANOUT/ 手动),> 25 K 走 BUFG/BUFH - 后验证:
phys_opt_design -AggressiveFanoutOpt→ 看 WNS 是否转正 - 别碰:别把
MAX_FANOUT用在真正全局复位/时钟,避免控制集爆炸

FPGA高扇出优化全解析
800

被折叠的 条评论
为什么被折叠?



