Intel® Hyperflex™ 体系结构高性能设计手册

ID 683353
日期 10/04/2021
Public
文档目录

4.1.2. 步骤2:添加流水线级和移除异步复位

第一个优化步骤在Fast Forward建议的设计位置添加了五个级别的流水线寄存器,并删除了设计模块中存在的异步复位。在ALM之间的互连上添加额外的流水线级可以消除一些长的布线延迟。此优化步骤将fMAX性能提高到Fast Forward估计的水平。

添加流水线级并从设计中移除异步复位:

  1. 打开Median_filter_<version>/Step_1/rtl/hyper_pipe.sv。此文件定义了一个可参数化的hyper_pipe流水线组件,您可以在任何设计中轻松使用此组件。以下是此组件的代码,包括可参数化的宽度(WIDTH)和深度(NUM_PIPES):
    module hyper_pipe #(
    	parameter WIDTH = 1,
    	parameter NUM_PIPES = 1)
    (
    input clk,
    input [WIDTH-1:0] din,
    output [WIDTH-1:0] dout);
    
    reg [WIDTH-1:0] hp [NUM_PIPES-1:0];
    
    genvar i;
    generate
      if (NUM_PIPES == 0) begin
        assign dout = din;
      end
      else begin
        always @ (posedge clk) 
          hp[0] <= din;
          for (i=1;i < NUM_PIPES;i++) begin : hregs
            always @ ( posedge clk) begin
              hp[i] <= hp[i-1];
            end
          end
        assign dout = hp[NUM_PIPES-1];
      end
    endgenerate
    endmodule
  2. 使用可参数化的模块在Fast Forward建议的位置添加一些级别的流水线级。下面的实例显示了如何在dff_3_pipe模块的q输出之前添加延迟:
    . . .
    
    hyper_pipe #( 
    	.WIDTH (DATA_WIDTH),
    	.NUM_PIPES(4)
    ) hp_d0 (
    	.clk(clk),
    	.din(d0),
    	.dout(q0_int)
    );
    . . .
    always @(posedge clk)
    begin : register_bank_3u
        if(~rst_n) begin
            q0 <= {DATA_WIDTH{1'b0}};
            q1 <= {DATA_WIDTH{1'b0}};
            q2 <= {DATA_WIDTH{1'b0}};
        end else begin
    		  q0 <= q0_int;
    		  q1 <= q1_int;
    		  q2 <= q2_int;
        end
    end
  3. 通过将寄存器更改为同步寄存器就可以移除dff_3_pipe模块中的异步复位,如下所示。请参考复位策略来了解有效复位实现的一般示例。
    always @(posedge clk or negedge rst_n) // Asynchronous reset
    begin : register_bank_3u
        if(~rst_n) begin
            q0 <= {DATA_WIDTH{1'b0}};
            q1 <= {DATA_WIDTH{1'b0}};
            q2 <= {DATA_WIDTH{1'b0}};
        end else begin
            q0_reg <= d0;
            q1_reg <= d1;
            q2_reg <= d2;
    		  q0 <= q0_reg;
    		  q1 <= q1_reg;
    		  q2 <= q2_reg;
        end
    end
    
    always @(posedge clk)
    begin : register_bank_3u
        if(~rst_n_int) begin  // Synchronous reset
            q0 <= {DATA_WIDTH{1'b0}};
            q1 <= {DATA_WIDTH{1'b0}};
            q2 <= {DATA_WIDTH{1'b0}};
        end else begin
    		  q0 <= q0_int;
    		  q1 <= q1_int;
    		  q2 <= q2_int;
        end
    end
    这些RTL变更将五级流水线添加到median_wrapper设计的输入(word0word1word2总线),并将五级流水线添加到dff_3_pipe模块。下面步骤显示了这些变更的结果。
  4. 要实现这些变更,保存全部设计变更,然后点击Compilation Dashboard上的Compile Design
  5. 编译之后,再次查看Fast Forward Details报告中的Clk时钟域的编译结果。

    报告显示了RTL变更对设计Base Performance fMAX的影响。设计性能现在提升到495 MHz。

    该报告指出,通过移除更多的异步寄存器,添加更多的流水线寄存器以及解决短路径和长路径的优化限制可以进一步提高性能。以下步骤描述了在设计RTL中这些建议的实现。

    注: 作为完成上述步骤的替代方法,您可以打开并编译Median_filter_<version>/Step_1/median.qpf工程文件(此文件已包含这些变更),然后观察结果。