Main Content

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

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

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

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

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

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

この例では、Xilinx® Vivado® 2020.2 での Zynq® UltraScale+(TM) デバイス (xazu11eg-ffvf1517-1-i) に対する配置配線後の静的タイミング解析の結果を使用して、有効になっているマルチサイクル パス制約の影響を示します。HDL Coder で生成される制約ファイルの形式は、Xilinx Vivado では XDC、Xilinx ISE では UCF、Altera Quartus II では SDC です。

この例では、hdlcoder_multi_cycle_path_constraints モデルのクリティカル パスには、加算器のチェーンをもつ直接型 FIR フィルターが含まれています。このフィルターの入力データ レートは 2 MHz ですが、この設計の目標は、高周波数を必要とする他の IP と統合できるように可能な限り速く実行することです。まず、TargetFrequency を 130 に設定して、タイミングの最適化なしの 130 MHz クロック周波数を設定します。Random Number ブロックの [サンプル時間].5e-6 (2 MHz) に設定して実際のハードウェア レートでモデル化するので、TreatRatesAsHardwareRates を有効にして、ターゲット周波数を満たすために必要なオーバーサンプリング値を HDL Coder が計算できるようにします。

load_system('hdlcoder_multi_cycle_path_constraints');
open_system('hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
hdlset_param('hdlcoder_multi_cycle_path_constraints','TargetFrequency',130);
hdlset_param('hdlcoder_multi_cycle_path_constraints','TreatRatesAsHardwareRates','on');
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'...
### Working 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'.
### Working on... <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlcoder_multi_cycle_path_constraints' ....
### Copying DUT to the generated model....
### 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 = 5e-07.
### Begin VHDL Code Generation for 'Subsystem_tc'.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Code Generation for 'Subsystem_tc' completed.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.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/Bdoc23b_2395265_1880818/tp5ff861ea/hdlcoder-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 4 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 のデータ レートで実行される遅延で囲まれています。TreatRatesAsHardwareRates を有効にして設定されたオーバーサンプリング値のため、この設計では複数のクロック サイクルでのデータの伝播が許容されます。HDL Coder では、間のパスを制約でマルチサイクル パスとして定義できるように、これらの遅延のような遅いクロック要素でマルチサイクル領域を囲む必要があります。MulticyclePathConstraints を有効にすると、HDL Coder で HDL コードの生成時に追加のファイルが生成されます。

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

ターゲット周波数を 300 MHz に増やして、クロック レートを上げます。

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'...
### Working 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'.
### Working on... <a href="matlab:configset.internal.open('hdlcoder_multi_cycle_path_constraints', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlcoder_multi_cycle_path_constraints' ....
### Copying DUT to the generated model....
### 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 = 5e-07.
### Begin VHDL Code Generation for 'Subsystem_tc'.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Code Generation for 'Subsystem_tc' completed.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.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/Bdoc23b_2395265_1880818/tp5ff861ea/hdlcoder-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 4 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 reglist1 [get_cells -of [filter [all_fanout -flat -endpoints_only $enbregnet] IS_ENABLE]]
5     set_multicycle_path 150 -setup -from $reglist1 -to $reglist1 -quiet
6     set_multicycle_path 149 -hold -from $reglist1 -to $reglist1 -quiet
7     
8     # Multicycle constraints for clock enable: Subsystem_tc.u1_d150_o1
9     set enbregcell [get_cells -hier -filter {mcp_info=="Subsystem_tc.u1_d150_o1"}]
10    set enbregnet [get_nets -of_objects [get_pins -of_objects $enbregcell -filter {DIRECTION == OUT}]]
11    set reglist2 [get_cells -of [filter [all_fanout -flat -endpoints_only $enbregnet] IS_ENABLE]]
12    set_multicycle_path 150 -setup -from $reglist2 -to $reglist2 -quiet
13    set_multicycle_path 149 -hold -from $reglist2 -to $reglist2 -quiet
14    
15    # Multicycle constraints from clock enable: Subsystem_tc.u1_d150_o1 to clock enable: Subsystem_tc.u1_d150_o0
16    set_multicycle_path 149 -setup -from $reglist2 -to $reglist1 -quiet
17    set_multicycle_path 149 -hold -from $reglist2 -to $reglist1 -quiet
18    
19    # Multicycle constraints from clock enable: Subsystem_tc.u1_d150_o0 to clock enable: Subsystem_tc.u1_d150_o1
20    set_multicycle_path 151 -setup -from $reglist1 -to $reglist2 -quiet
21    set_multicycle_path 149 -hold -from $reglist1 -to $reglist2 -quiet
22    

これらの制約では、最初に 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 コードは前の結果と同じになります。ただし、マルチサイクル パス制約により、この設計を FPGA において 300 MHz で実行できるようになります。

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

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