プラットフォームのクロックの処理方法は、複数のプラットフォーム クロックとクロック周波数をサポートするように進化しています。カーネルには、任意の数の独立したクロックとエッジ揃いのクロックを含めることができ、プラットフォームには、ユーザー制御下で異なるクロック周波数で動作する複数のカーネルを含めることができます。プラットフォームには、さまざまなクロック (プロセッサ、PL、および AI エンジン クロック) が含まれます。次の表に、各クロックについて説明します。
クロック | 説明 |
---|---|
AI エンジン | プラットフォームの AI エンジン IP で設定できます。 |
Processor | プラットフォームの CIPS IP で設定できます。 |
プログラマブル ロジック (PL) | 複数のクロックを含めることができ、プラットフォームで設定できます。 |
NoC | デバイスによって異なり、プラットフォームの CIPS および NoC IP で設定できます。 |
|
プラットフォームには、スケーラブル クロックと固定クロックを含めることができます。
- スケーラブル クロック
-
AMD Alveo™ プラットフォームには、すべての XRT 管理のカーネルを駆動する ID (または Index) 0 の周波数スケーラブルなカーネル クロックが含まれます。XRT では、xclbin ファイルを読み込むと、そのメタデータに従って、このクロックのクロック周波数を設定できます。また、Alveo プラットフォームには ID 1 の 2 つ目のスケーラブル クロックが含まれ、xclbin のメタデータに基づいて制御することもできます。スケーラブル クロックに接続するオプションを指定する必要はありませんが、v++ の一般オプション で説明されるように、
--freqhz
または--kernel_frequency
オプションを使用すると、v++
リンク中にクロック周波数を指定できます。v++
リンカーは自動的にカーネル クロックap_clk
をクロック ID 0 に、ap_clk2
をクロック ID 1 に接続します。ヒント: HLS コンパイラは複数のクロックを持つカーネルを生成しないため、実際にはap_clk2
は最初 RTL カーネルに含まれます。 - 固定クロック
-
固定クロックは、AMD Alveo™ プラットフォームと、Versal デバイスまたは Zynq MPSoC を使用するエンベデッド プラットフォームの両方で使用されます。固定クロックは、通常 RTL カーネルでも使用されます。
スケーラブル クロックは、
v++
コマンドで指定されたクロックとデザインのタイミング要件を満たすように XRT によりスケーリングされます。固定クロックは、デザインに追加された MMCM を使用し、プラットフォームで定義された固定周波数以外の周波数を生成します。たとえば、クロック周波数を 60、200、および 450 に指定すると、Vitis コンパイラが使用可能な固定クロックから必要なクロックを生成するのに必要なすべてのロジックを追加します。--freqhz
オプションを使用して、デザインのクロック周波数を指定します。--clock オプション は、特定のプラットフォーム クロックへの PL カーネル接続を指定したり、プラットフォーム上の固定クロックから生成されるクロック周波数を指定するためにも使用できます。--clock
オプションを指定すると、v++
にスケーラブル クロックではなく、プラットフォームの固定クロックを使用するよう指示できます。HLS カーネルの場合、クロック ID 0 が常に使用されます。1 つのクロックを含む RTL カーネルでは、クロック ID 0 がデフォルトで使用されますが、別のクロックを選択することもできます。
Vivado 配置配線ツールが周波数仕様を満たすことができない場合、スケーラブル クロックが使用されていれば、ツールはクロック周波数を達成可能な周波数にスケーリングできます (--kernel_frequency
)。ただし、固定クロックを使用する場合 (--clock
)、インプリメンテーションを実行し直して、周波数ターゲットを更新する必要があります。
platforminfo
コマンドを使用すると、ターゲット プラットフォームで使用可能なクロックを決定できます。たとえば、次のコマンドは、指定されたプラットフォームに関する詳細情報を返し、出力ファイルに書き出します。platforminfo -v -p xilinx_u250_gen3x16_xdma_4_1_202210_1 -o pfmClocks.txt
=================
Clock Information
=================
Default Clock Index: 0
Default Clock Frequency: 300.000000
Default Clock Pretty Name: PL 0
Clock Index: 0
Frequency: 300.000000
Name: ss_ucs_aclk_kernel_00
Pretty Name: PL 0
Inst Ref: ss_ucs
Comp Ref: shell_ucs_subsystem
Period: 3.333333
Normalized Period: .003333
Status: scalable
Clock Index: 1
Frequency: 500.000000
Name: ss_ucs_aclk_kernel_01
Pretty Name: PL 1
Inst Ref: ss_ucs
Comp Ref: shell_ucs_subsystem
Period: 2.000000
Normalized Period: .002000
Status: scalable
Clock Index: 2
Frequency: 50.000000
Name: ii_level1_wire_ulp_m_aclk_ctrl_00
Pretty Name: PL 2
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 20.000000
Normalized Period: .020000
Status: fixed
Clock Index: 3
...
実際には、次のような考慮事項があります。スケーラブル クロックを使用すると、特定の周波数を達成したり、タイミングを満たすために必要に応じてクロックをスケーリングできるので、.xclbin ファイルを再生成しなくてもタイミングを達成しやすくなります。ただし、スケーリングによってクロック周波数がプラットフォーム周波数より高くなることはありません。固定クロックは、タイミング クロージャやパフォーマンス ターゲットを満たすため、異なるカーネルを異なる周波数で動作させる必要があるデザインに使用できます。最も本格的なデザインの場合、ある時点で達成可能な周波数ターゲットが何であるかを把握し、スケーラブルなクロック周波数を超える場合に固定クロックを指定する必要があります。
Versal デバイスの場合、v++
--link
および v++ --package
コマンドに --platform
を使用する代わりに、--part
オプションを使用できます。--part
を使用すると、ツールがデバイスで使用するためのベース デザインを生成します。これは、通常、完全なプラットフォーム仕様の開発を待つ間に使用できます。ただし、v++ リンカーが生成したベース プラットフォーム デザインは PLRAM のみを使用しているため、ターゲット上で Linux アプリケーションを実行するのには向いていません。