アクセラレータ カードのクロックの処理方法は、複数のプラットフォーム クロックとクロック周波数をサポートするように進化しています。カーネルには、任意の数の独立したクロックとエッジ揃いのクロックを含めることができ、プラットフォームには、ユーザー制御下で異なるクロック周波数で動作する複数のカーネルを含めることができます。プラットフォームには、スケーラブル クロックと固定クロックを含めることができます。
- スケーラブル クロック
-
Alveo™ プラットフォームには、すべての XRT 管理のカーネルを駆動する ID 0 の周波数スケーラブルなカーネル クロックが含まれます。XRT では、xclbin ファイルを読み込むと、そのメタデータに従って、このクロックのクロック周波数を設定できます。また、Alveo プラットフォームには ID 1 の 2 つ目のスケーラブル クロックが含まれ、xclbin のメタデータに基づいて XRT で制御することもできます。スケーラブル クロックに接続するオプションを指定する必要はありませんが、Vitis コンパイラの一般オプション で説明されるように、
--kernel_frequency
コマンドを使用すると、v++
リンク中にクロック周波数を指定できます。たとえば、v++
リンカーは自動的にカーネル クロックap_clk
をクロック ID 0 に、ap_clk2
をクロック ID 1 に接続します。ヒント: Vitis HLS は複数のクロックを持つカーネルを生成しないため、実際にはap_clk2
は最初 RTL カーネルに含まれます。 - 固定クロック
-
XRT では、制御できない任意の数の派生固定クロックを生成できます。
v++
リンカーは、ユーザーに --clock オプション を提供します。どのカーネル クロック ピンをどのクロックに接続するか指定したり、プラットフォームで定義されていないクロック周波数を定義したりできます。固定クロックは、エンベデッド プラットフォームおよび RTL カーネルによく使用されます。--clock
オプションを指定すると、v++
にスケーラブル クロックではなく、プラットフォームの固定クロックを使用するよう指示できます。HLS カーネルの場合、クロック ID 0 が常に使用されます。1 つのクロックを含む RTL カーネルでは、クロック ID 0 がデフォルトで使用されますが、別のクロックを選択することもできます。
スケーラブル クロックはクロック自体のスケーリングに使用できますが、固定クロックは、MMCM を追加して、プラットフォームで定義された周波数以外の周波数を生成するために使用されます。たとえば、クロック周波数を 60、200、および 450 に指定すると、Vitis が必要なクロックを生成するために必要なすべてのロジックが追加されます。
Vivado 配置配線ツールが周波数仕様を満たすことができない場合、スケーラブル クロックが使用されていれば、ツールはクロック周波数を達成可能な周波数にスケーリングできます (--kernel_frequency
)。固定クロックを使用する場合 (--clock
)、インプリメンテーションを実行し直して、周波数ターゲットを更新する必要があります。
platforminfo
コマンドを使用すると、ターゲット プラットフォームで使用可能なクロックを決定できます。たとえば、次のコマンドは、U250 プラットフォームの新しいシェルに関連する詳細情報を返します。platforminfo -v -p xilinx_u250_gen3x16_xdma_3_1_202020_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
Frequency: 250.000000
Name: ii_level1_wire_ulp_m_aclk_pcie_user_00
Pretty Name: PL 3
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 4.000000
Normalized Period: .004000
Status: fixed
Clock Index: 4
Frequency: 100.000000
Name: ii_level1_wire_ulp_m_aclk_freerun_ref_00
Pretty Name: PL 4
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 10.000000
Normalized Period: .010000
Status: fixed
次に、--clock オプション を使用して優先順位を上げるクロック管理の例をいくつか示します。
-
--clock
オプションがない場合は、スケーラブルなデフォルト クロックが適用されます。2 つクロックを使用するカーネルの場合、クロック ID 0 が ap_clk に割り当てられ、クロック ID 1 が ap_clk_2 に割り当てられます。 -
--clock.defaultId=<id>
を指定すると、プラットフォームのデフォルトが上書きされます。指定されたクロック <id> は、追加で--clock
オプションが指定されていない限り、すべての CU のすべてのピンの基準クロックとして使用されます。 -
--clock.defaultFreq=<Hz>
を指定すると、指定した周波数のクロックでプラットフォームのデフォルトが上書きされます。追加で--clock
オプションが指定されていない限り、デフォルト クロックはすべての CU のすべてのピンに割り当てられます。 -
--clock.id=<id>:<cu>
: 指定した CU のすべてのクロック ピンに指定の ID を割り当てます。 -
--clock.id=<id>:<cu>.<clk0>
: 指定した CU の指定したクロック ピンに指定の ID を割り当てます。
実際には、次のような考慮事項があります。スケーラブル クロックを使用すると、特定の周波数を達成したり、タイミングを満たすために必要に応じてクロックをスケーリングできるので、.xclbin ファイルを再生成しなくてもタイミングを達成しやすくなります。
異なるカーネルを異なるクロック レートで動作させる必要があるデザイン、たとえばタイミング クロージャやパフォーマンス ターゲットを満たす必要がある場合、固定クロックをターゲットとする --clock
指示子が必要です。同様に、複数のクロックを必要とする RTL カーネルには、通常 --clock
指示子が必要です。最も深刻なデザインの場合、達成可能な周波数ターゲットが何であるかを把握し、スケーラブルなクロック周波数を超える場合にこれら (固定クロック) を指定する必要があります (スケーリングにより、プラットフォームのデフォルト値を超えるスケーリング済みクロック周波数が増加することはありません)。