プラットフォーム クロックの識別 - 2022.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 日本語

アクセラレータ カードのクロックの処理方法は、複数のプラットフォーム クロックとクロック周波数をサポートするように進化しています。カーネルには、任意の数の独立したクロックとエッジ揃いのクロックを含めることができ、プラットフォームには、ユーザー制御下で異なるクロック周波数で動作する複数のカーネルを含めることができます。プラットフォームには、スケーラブル クロックと固定クロックを含めることができます。

スケーラブル クロック

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 が必要なクロックを生成するために必要なすべてのロジックが追加されます。

ヒント: 1 つのカーネルに固定クロックとスケーラブル クロックを混在させることはできませんが、1 つの .xclbin ファイル内では異なるカーネル間で混在させることができます。

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 指示子が必要です。最も深刻なデザインの場合、達成可能な周波数ターゲットが何であるかを把握し、スケーラブルなクロック周波数を超える場合にこれら (固定クロック) を指定する必要があります (スケーリングにより、プラットフォームのデフォルト値を超えるスケーリング済みクロック周波数が増加することはありません)。