インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック

ID 683353
日付 10/04/2021
Public
ドキュメント目次

4.1.2. ステップ2:パイプライン・ステージを追加し、非同期リセットを削除する

この最初の最適化ステップでは、Fast Forwardが提案するデザインロケーションに5レベルのパイプライン・レジスターを追加し、デザインモジュールに存在する非同期リセットを削除します。 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デザインの入力( word0word1、およびword2バス)に5レベルのパイプラインが追加され、dff_3_pipeモジュールに5レベルのパイプラインが追加されます。次の手順は、これらの変更の結果を示しています。
  4. 変更を実装するには、すべてのデザイン変更を保存し、コンパイルダッシュボードのCompile Designをクリックします。
  5. コンパイル後、 Clkクロックドメインのコンパイル結果をFast Forward Detailsレポートでもう一度表示します。

    このレポートは、RTLの変更がデザインのBase Performance fMAXに与える影響を示しています。デザイン性能が495 MHzに向上しました。

    このレポートは、非同期レジスターをさらに削除し、パイプライン・レジスターを追加し、ショートパスとロングパスの最適化制限に対処することにより、パフォーマンスをさらに向上できることを示しています。次の手順では、デザインRTLでのこれらの推奨事項の実装について説明します。

    注: 前の手順を完了する代わりに、これらの変更が既に含まれているMedian_filter_<version>/Step_1/median.qpfプロジェクトファイルを開いてコンパイルし、結果を確認できます。