时序收敛方法二:Fanout优化

一、前言

1.1 高扇出信号

​ ​在 FPGA 中,高扇出信号(High Fanout Signal) 是指一个信号驱动大量的负载(通常几十到数百甚至上千个)。常见的高扇出信号包括:全局复位 reset/enable、时钟使能信号 (CE)、总线控制信号、广播信号、同步清零、片选信号、某些顶层的地址/状态信号。

1.2 影响 ​

​ ​高扇出信号比低扇出信号的路径延时更大,时序收敛更难,可能无法满足高频设计,甚至导致工程布线失败。因此,对比高扇出信号的处理方法是时序收敛操作的必备技能。

二、示例设计

下面是一个寄存器sig_q输出驱动64个负载的简单例子,实际设计中高扇出都是单个信号驱动成千上万的负载,本处设置64只为方面说明

复制代码
module high_fanout #(   parameter N = 64)
(   
    input  wire clk,
    input  wire rst_n,
    input  wire in_sig,
    output wire [N-1:0] out_sig
);

    reg sig_q;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            sig_q <= 1'b0;
        else
            sig_q <= in_sig;
    end
    genvar i;
    generate
        for (i = 0; i < N; i = i + 1) begin : FAN
            assign out_sig[i] = sig_q;
        end
    endgenerate
endmodule

schematic如下图,红色方框内的为sig_q_reg,驱动着后面所有负载

三、高fanout优化方法

上述工程示例中,寄存器sig_q输出驱动了64个负载,下面结合各种优化场景进行示例说明优化的具体操作

3.1 max_fanout属性

在设计中对高fanout信号添加max_fanout属性,如下图对寄存器驱动的最大扇出为16

复制代码
(* max_fanout = 16 *)  reg sig_q;

schematic结果如下图,除了原设计中的寄存器sig_q_reg,软件还自动复制出了sig_q_reg_rep,sig_q_reg_rep_0,sig_q_reg_rep_1三个寄存器来分担驱动的负载

3.2 BUFG驱动

方法二是让驱动信号上BUFG,因为BUFG的驱动能力更强,延时小

复制代码
    assign n_sig_q=sig_q;
    // 使用 BUFG 全局缓冲
    BUFG u_bufg_ctrl (
        .I(n_sig_q),
        .O(n_bufg)
    );

schematic中sig_q_reg后经过了BUFG单元再驱动后面的负载

3.3 参数控制复制

对于高扇出信号,也可通过参数控制来设置复制寄存器的数量

复制代码
module high_fanout #(
    parameter N = 6
)(
    input  wire clk,
    input  wire rst_n,
    input  wire in_sig,
    output wire [N-1:0] out_sig
);

    (* DONT_TOUCH = "TRUE" *) reg [N-1:0] sig_q;
    wire n_sig_q;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            sig_q <= {N{1'b0}};         
        else 
           sig_q <= {N{in_sig}};
    end
assign out_sig = sig_q;
endmodule

看schematic结果,in_sig信号中每一位都由一个寄存器驱动

3.4 手动复制寄存器

相比与参数控制复制寄存器,手动复制寄存器的方式更加灵活,如下图设计增加一个寄存器,并且将负载out_sig1:0由一个寄存器驱动,out_sig6:2由另一个寄存器驱动

复制代码
module high_fanout #(  parameter N = 6)
(  
  input wire clk,
  input wire rst_n,
  input wire in_sig,
  output wire [N-1:0] out_sig
);

 (* DONT_TOUCH = "TRUE" *)  reg sig_q0;
 (* DONT_TOUCH = "TRUE" *)  reg sig_q1;

  always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
    begin
      sig_q0 <= 1'b0;
      sig_q1 <= 1'b0;
    end
    else
    begin
      sig_q0 <= in_sig;
      sig_q1 <= in_sig;
    end
  end

// 把 fanout 分给两个寄存器
assign out_sig[0] = sig_q0;
assign out_sig[1] = sig_q0;
assign out_sig[2] = sig_q1;
assign out_sig[3] = sig_q1;
assign out_sig[4] = sig_q1;
assign out_sig[5] = sig_q1;
endmodule

shematic图如下,和预期的一致

3.5 寄存器复制数量参考

根据设计经验,对于使用寄存器复制的数量可参照下图

相关推荐
1560820721919 小时前
关于AGC性能测试
fpga开发
威嵌神州1 天前
国产化加固计算机项目选型笔记|板卡、整机、平板与定制模块评估要点
笔记·fpga开发·电脑
泡泡糖的中文规格书1 天前
HDLbits 1.2 学习笔记
fpga开发·学习笔记·verilog
樱木花道長1 天前
AMD Ross 深度系列 5:实战演示 —— MATLAB 到 FPGA,edge-detection 边缘检测全流程
fpga开发
吉他英雄一里2 天前
FPGA--RAM
fpga开发
szxinmai主板定制专家2 天前
储能 EMS、微网控制器选型:RK3588、RK3576、RK3568+FPGA 怎么选?多网、多 CAN、EMC 设计权衡
人工智能·深度学习·机器学习·fpga开发·工业网关·rk3576·电力网关
XMAIPC_Robot2 天前
ARM+FPGA+AI船舶/工业自动化控制器EMC测试等级解析(IEC60533/IEC60945)
arm开发·人工智能·fpga开发·zynq·arm+fpga·rk3588+fpga
ALINX技术博客2 天前
ALINX 亮相 2026 工博会,聚焦 FPGA 行业应用场景
ai·fpga开发·射频工程
星夜离尘563 天前
FPGA 复位回归实验:双时钟停钟、释放中重入与消费端首拍自检
fpga开发
szxinmai主板定制专家3 天前
ZYNQ 数据采集方案踩坑总结:电力强电磁干扰、工业现场多协议适配优化
运维·人工智能·fpga开发·机器人·zynq