現在の合成プロセスで直面した問題について記録します。
現在の設計には、多数のDesignWare IPが使用されており、浮動小数点除算器、浮動小数点加減算器、浮動小数点乗算器、浮動小数点平方根計算器、浮動小数点比較器など、各32個ずつ含まれています。これらを直接合成すると、各大きな計算ユニットが個別にマッピングされるため、合成全体に非常に長い時間がかかります(数日間かかる可能性があります)。
その原因は、DesignWare IPが複数回インスタンス化されていても、合成時にはそれぞれの環境が異なるものとして扱われ、個別にマッピングと最適化が行われるためです。したがって、解決策は単純です。まず使用するDesignWare IPを個別に網羅的に合成し、網羅的に合成されたものをトップレベルのモジュールで再合成する(同時に、合成済みの網羅をさらに最適化しないようにモジュールにset_dont_touch属性を設定する必要があります。実践の結果、この属性を設定しないと時間が依然として非常に長くなることが判明しました)。
DesignWare IPを個別に合成する際には、設計時に呼び出しを容易にするためにその外部にラッパーを追加し、後続の合成が通過できるように比較的厳しいタイミング制約を設定します。
ここでは浮動小数点除算器の一例を示します:
// 浮動小数点除算器
module my_fp_divider (
input wire [31:0] operand_a,
input wire [31:0] operand_b,
output wire [31:0] result
);
parameter mantissa_bits = 23;
parameter exponent_bits = 8;
parameter ieee_compliance = 0;
DW_fp_div # (
mantissa_bits,
exponent_bits,
ieee_compliance
) u_my_fp_div (
.a(operand_a),
.b(operand_b),
.rnd(3'b000),
.z(result),
.status()
);
endmodule
目標は400MHz、つまり2.5ns周期で動作することです。制約時に適宜厳しく設定し、最終的に1.37nsの最大組み合わせ遅延を達成しました。
その後、網羅を生成します。
トップレベルのモジュールを合成する際には、このファイルを直接読み込むだけです。
さらに、このモジュールに対してset_dont_touchを設定する必要があります。私はこれをsdcファイルに記述し、set_dont_touch [get_references u_xxxx/u_xxxx/my_fp_divider*]で完了しました。ここで注意が必要なのは、get_referencesコマンドは設計の階層に従って実行されなければならず、すべてのmy_fp_dividerのインスタンスを見つけることができるようにすることです。
これで階層化合成の設定はすべて完了です。合成を再度実行すると、合成速度が大幅に向上し、元の数日かかる時間から約20分で終了するようになりました。
この考え方は、網羅の形式で統合する必要がある他のIPにも適用できます。階層化合成は、全体の合成時間を短縮し、マシンのリソース要件を減らすのにも役立ちます。非常に役立つテクニックです。
コメントセクションの指摘によると、bottom-upの合成フローは.ddc形式で管理することもできます。これにより、.v網羅を使用する場合と比べていくつかの相対的な利点があります。主な利点は、.ddcが実際には.v網羅と.sdcタイミング情報の両方を含んでいることです。
.ddcのエクスポート方法は次のとおりです:write -f ddc -hier -output $output_path/${design_name}_post_dc.ddc。設計を書き出した後、トップレベルのモジュールはread_ddcコマンドを介して直接取り込むことができ、filelist.fを修正して.v網羅を取り込む必要がなくなります:
read_ddc ../../lib/dw_ip/my_fp_add_sub.ddc
read_ddc ../../lib/dw_ip/my_fp_comp.ddc
read_ddc ../../lib/dw_ip/my_fp_div.ddc
read_ddc ../../lib/dw_ip/my_fp_mul.ddc
read_ddc ../../lib/dw_ip/my_fp_sqrt.ddc
これはより優れた階層化合成方法です。