Main Content

マルチサイクル パス制約を使用した遅いパスのタイミングへの対応

この例では、設計でマルチサイクル パス制約を適用してタイミング要件を満たす方法を示します。マルチサイクル パス制約を使用すると、面積を抑え、合成実行時間を短縮できます。詳細については、イネーブルベースのマルチサイクル パス制約を使用してタイミング要件を満たすを参照してください。

はじめに

Simulink でモデル化される HDL コード生成用のアルゴリズムには、複数のサンプル レートが含まれることがあります。それらの複数のレートは、Simulink モデルの一部である場合もあれば、HDL Coder のオーバーサンプリングなどのオプションで導入される場合もあります。オーバーサンプリングが指定されている場合、生成された HDL コードが FPGA において通常よりも速いクロック レートで実行されます。この速いレートにより、追加の最適化が有効になります。

HDL Coder が単一のクロックを使用するように設定されている場合、遅延などのサンプル レートが異なるクロック要素をクロック イネーブルで制御するタイミング コントローラーが生成されます。これらのクロック イネーブルは単一のクロックと同期し、ベース クロックよりも数倍遅いレートで切り替わります。遅いクロック要素ペア間のデータ パスは、データの移動に複数のクロック サイクルを使用することからマルチサイクル パスと呼ばれます。ただし、この許容される遅延について、合成ツールで HDL コードから直接推定することはできません。ツールでは、データがサイクルごとに変化し、1 クロック サイクル以内に次のレジスタに移動しなければならないものと想定されます。合成ツールで過度のタイミング要件に対応しなければならなくなると、タイミングを満たせなくなることがあります。HDL Coder では、一連のデータ パスをマルチサイクル パスとして宣言し、それらのパスの実際のタイミングを下流の合成ツールに提供することで、目的のタイミング制約を満たす設計のプロセスを簡略化して高速化できます。

この例では、合成ツールで効率的なタイミング解析を行えるように、HDL Coder でマルチサイクル パス制約を生成してタイミング要件を指定する方法について説明します。

HDL Coder を使用したマルチサイクル制約の適用

この例では、Xilinx Vivado 2016.4 での Virtex7 デバイス (xc7v2000t、fhg1761、-1) に対する配置配線後の静的タイミング解析の結果を使用して、イネーブルベースのマルチサイクル パス制約の影響を示します。他の合成ツールやデバイスでも似たような動作になります。HDL Coder で生成される制約ファイルの形式は、Xilinx Vivado では XDC、Xilinx ISE では UCF、Altera Quartus II では SDC です。

hdlcoder_multi_cycle_path_constraints.slx の例について考えます。このモデルのクリティカル パスには、加算器のチェーンをもつ直接型 FIR フィルターが含まれています。このフィルターの入力データ速度は 2 MHz と指定されていますが、高周波数を必要とする他の IP と統合できるように、この設計を可能な限り速く実行します。まず、[オーバーサンプリング係数] を 65、[ターゲット周波数] を 130 に設定して、タイミングの最適化なしの 130 MHz クロック周波数を選択します。

bdclose('all');
load_system('hdlcoder_multi_cycle_path_constraints');
open_system('hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'Oversampling', 65);
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'TargetFrequency', 130);
set_param('hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');

これらの設定で HDL を生成し、生成されたモデルを調べます。生成されたモデルが実質的に元のモデルと同一であることに注目してください。

makehdl('hdlcoder_multi_cycle_path_constraints/Subsystem');
load_system('gm_hdlcoder_multi_cycle_path_constraints');
set_param('gm_hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');
open_system('gm_hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
### Generating HDL for 'hdlcoder_multi_cycle_path_constraints/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_multi_cycle_path_constraints', { 'HDL Code Generation' } )">hdlcoder_multi_cycle_path_constraints</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_multi_cycle_path_constraints'.
### Begin compilation of the model 'hdlcoder_multi_cycle_path_constraints'...
### Applying HDL optimizations on the model 'hdlcoder_multi_cycle_path_constraints'...
### <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_multi_cycle_path_constraints'.
### MESSAGE: The design requires 65 times faster clock with respect to the base rate = 2.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.vhd.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_multi_cycle_path_constraints' completed.
### Writing Vivado multicycle constraints XDC file <a href="matlab:edit('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc')">hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173141/tp63587ed4/ex62646573/hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_report.html
### HDL check for 'hdlcoder_multi_cycle_path_constraints' complete with 0 errors, 0 warnings, and 3 messages.
### HDL code generation complete.

生成された HDL は、130 MHz のクロックのタイミング要件を満たしていません。次のタイミング レポートの抜粋に示すように、タイミング要件は 7.692 ns (1/130 MHz) であり、負のスラックはこの要件のタイミング違反を示しています。タイミング レポートの表示内容は合成ツールによって異なる場合もありますが、この設計例からのクリティカル パスは変わりません。

次に、マルチサイクル パス制約を使用してタイミング要件を満たします。元のモデルを確認します。

open_system('hdlcoder_multi_cycle_path_constraints/Subsystem');

Dot Product サブシステムが目的の 2 MHz のデータ速度で実行される遅延で囲まれていることに注目してください。オーバーサンプリングを 65x と指定しているため、この設計では複数のクロック サイクルでのデータの伝播が許容されます。HDL Coder では、間のパスを制約でマルチサイクル パスとして定義できるように、これらの遅延のような遅いクロック要素でマルチサイクル領域を囲む必要があります。MulticyclePathConstraints を on にすると、HDL Coder で追加のファイルが生成されます。

hdlset_param('hdlcoder_multi_cycle_path_constraints', 'MulticyclePathConstraints', 'on');

さらに、ターゲット周波数を 300 MHz に増やすことができます。

hdlset_param('hdlcoder_multi_cycle_path_constraints', 'Oversampling', 150);
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'TargetFrequency', 300);

HDL とマルチサイクル パス制約を生成します。

makehdl('hdlcoder_multi_cycle_path_constraints/Subsystem');
### Generating HDL for 'hdlcoder_multi_cycle_path_constraints/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_multi_cycle_path_constraints', { 'HDL Code Generation' } )">hdlcoder_multi_cycle_path_constraints</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_multi_cycle_path_constraints'.
### Begin compilation of the model 'hdlcoder_multi_cycle_path_constraints'...
### Applying HDL optimizations on the model 'hdlcoder_multi_cycle_path_constraints'...
### <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_multi_cycle_path_constraints'.
### MESSAGE: The design requires 150 times faster clock with respect to the base rate = 2.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.vhd.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_multi_cycle_path_constraints' completed.
### Writing Vivado multicycle constraints XDC file <a href="matlab:edit('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc')">hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173141/tp63587ed4/ex62646573/hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_report.html
### HDL check for 'hdlcoder_multi_cycle_path_constraints' complete with 0 errors, 0 warnings, and 3 messages.
### HDL code generation complete.

生成された制約の XDC ファイルを調べます。

dbtype('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc');
1     # Multicycle constraints for clock enable: Subsystem_tc.u1_d150_o0
2     set enbregcell [get_cells -hier -filter {mcp_info=="Subsystem_tc.u1_d150_o0"}]
3     set enbregnet [get_nets -of_objects [get_pins -of_objects $enbregcell -filter {DIRECTION == OUT}]]
4     set reglist [get_cells -of [filter [all_fanout -flat -endpoints_only $enbregnet] IS_ENABLE]]
5     set_multicycle_path 150 -setup -from $reglist -to $reglist -quiet
6     set_multicycle_path 149 -hold  -from $reglist -to $reglist -quiet
7     

これらの制約では、最初に 2 MHz のクロック イネーブル信号で駆動されるフリップ フロップを探します。その後、それらのフリップ フロップの間のパスをマルチサイクル パスとして定義し、最大 150 サイクルまでデータを伝播できるように許容します。

生成されたモデルを調べます。

open_system('gm_hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
set_param('gm_hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');

イネーブルベースのマルチサイクル パス制約を生成しても HDL アーキテクチャは変わらないため、生成されたモデルと HDL コードは前の結果と同じになります。前の設計では、130 MHz の目的のタイミングを満たせませんでした。マルチサイクル パス制約を指定すると、この設計を FPGA において 300 MHz で実行できるようになります。

マルチサイクル パス制約に関する追加情報:

合成ツールでタイミング要件が認識されるようにするには、マルチサイクル パス制約が必要です。この情報は、生成された HDL コードからは推定できないため、Simulink モデルから抽出されます。マルチサイクル パス制約で、同じクロック イネーブルによって駆動されるクロック要素の間のパスを特定します。場合によっては、タイミング要件を満たせないこともあります。たとえば、入力と出力の両方が遅延で囲まれていない場合や 2 つの遅延のレートが異なる場合などは、データ パスがマルチサイクル パスとして認識されません。したがって、設計の特定の部分にマルチサイクル パス制約を使用する場合は、その領域のマルチサイクル パスがパイプラインを導入する最適化によって変更されないようにすることが重要です。これには、入出力パイプライン、クロック レート パイプライン、適応パイプラインによるリソース共有やストリーミング、パイプライン化された算術演算 (平方根または逆数のニュートン・ラフソン法や三角関数の CORDIC アルゴリズムなど)、浮動小数点 IP のマッピングが含まれます。