RTL カーネルには、プライマリ クロック (ap_clk
) とオプションのセカンダリ ブロック (ap_clk_2
) の 2 つの外部クロック インターフェイスを含めることができます。どちらのクロックも内部ロジックのクロッキングに使用できますが、すべての外部 RTL カーネル インターフェイスはプライマリ クロックを使用する必要があります。プライマリ クロックとセカンダリ クロックの両方で、独立した自動周波数スケーリングがサポートされます。
注記: 2020.2 リリース以降のエンベデッド プロセッサ プラットフォームまたは Alveo アクセラレータ カードをターゲットにする場合、クロック周波数の管理 で説明される手法を使用して、カーネル クロックをいくつでもハードウェア プラットフォームからクロック周波数にマッピングできます。
RTL カーネル内でさらにクロックが必要な場合は、Clocking Wizard IP または MMCM/PLL プリミティブなどの周波数シンセサイザーを RTL カーネル内にインスタンシエートできます。このため、RTL カーネルはプライマリ クロックだけを使用するか、プライマリ クロックとセカンダリ クロックの両方を使用するか、内部周波数シンセサイザーを使用してプライマリ クロックおよびセカンダリ クロックを使用できます。次は、これら 3 つの RTL カーネルのクロッキング手法を使用した場合の長所と短所を示しています。
- 1 つの入力クロック:
ap_clk
- 外部インターフェイスおよび内部カーネル ロジックは同じ周波数で実行されます。
- クロック乗せ換え (CDC) 問題はありません。
-
ap_clk
の周波数は、カーネルがタイミングを満たせるように自動的にスケールできます。
- 2 つの入力クロック:
ap_clk
およびap_clk_2
- カーネル ロジックはいずれかのクロック周波数で実行できます。
- 周波数を移動するには、RTL カーネルで適切な CDC 手法を使用する必要があります。
- カーネルがタイミングを満たすため、
ap_clk
およびap_clk_2
の両方が自動的に周波数を個別にスケールできます。
- カーネル内で周波数シンセサイザーを使用:
- クロックを生成するためにデバイス リソースが追加で必要です。
-
ap_clk
およびap_clk_2
(オプション) インターフェイスが必要です。 - 生成されたクロックの周波数は、CU ごとに別の周波数にできます。
- カーネル ロジックは使用可能なクロック周波数のいずれかで実行できます。
- 周波数を移動するために適切な CDC 手法が必要です。
RTL カーネルで周波数シンセサイザーを使用する場合は、次の制約に注意が必要です。
- RTL 外部インターフェイスは
ap_clk
でクロック供給されます。 - 周波数シンセサイザーには、RTL カーネルへの内部クロックとして使用する出力クロックを複数含めることができます。
- DRC エラーが起こらないように、Vivado 配置のクロック リソース配置に関する DRC をダウングレードする Tcl スクリプトを提供する必要があります。詳細は、
『Vivado Design Suite プロパティ リファレンス ガイド』 (UG912) の
CLOCK_DEDICATED_ROUTE
の説明を参照してください。次は、Tcl スクリプトに追加する必須の Tcl コマンドの例です。set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets pfm_top_i/static_region/base_clocking/clkwiz_kernel/inst/CLK_CORE_DRP_I/clk_inst/clk_out1
注記: この制約は、ターゲット プラットフォームのクロック構造に合わせて編集する必要があります。 -
--vivado オプション の説明のように、
v++ --vivado.prop
を使用して、手順 3 の Tcl スクリプトを指定し、最適化後に Vivado インプリメンテーションで使用されるようにします。次のオプションでは、Tcl スクリプトを最適化後に Vivado インプリメンテーションで使用されるように指定しています。--vivado.prop:run.impl_1.STEPS.OPT_DESIGN.TCL.POST={<PATH>/<Script_Name>.tcl}
- カーネル (RTL または HLS ベース) で使用可能な 2 つのグローバル クロック入力周波数を指定します。
v++ --kernel_frequency
オプションを使用して、カーネル入力クロック周波数が想定どおりになるようにします。たとえば、1 つのクロックを使用する場合は、次のように指定します。
2 つのクロックの場合、複数の周波数をクロック ID に基づいて指定できます。プライマリ クロックの ID は 0 で、セカンダリ クロックの ID は 1 です。v++ --kernel_frequency 250
v++ --kernel_frequency 0:250|1:500
ヒント: PLL または MMCM 出力クロックが RTL カーネルの演算前にロックされるようにします。RTL カーネルでロックされた信号を使用すると、クロックが正しく動作するようになります。
周波数シンセサイザーを RTL カーネルに追加した場合、生成したクロックが自動的にスケーラブルにはなりません。RTL がタイミング要件を満たしていないと、
v++
で次のようなエラーが表示されます。ERROR: [VPL-1] design did not meet timing - Design did not meet timing. One
or more unscalable system clocks did not meet their required target
frequency. Please try specifying a clock frequency lower than 300 MHz using
the '--kernel_frequency' switch for the next compilation. For all system
clocks, this design is using 0 nanoseconds as the threshold worst negative
slack (WNS) value. List of system clocks with timing failure.
この場合、内部クロック周波数を変更するか、タイミングを満たすようにカーネル ロジックを最適化する必要があります。