RTL カーネル

Vitis アプリケーション アクセラレーション開発フローでは、C++ ソース コードをザイリンクス オブジェクト (XO) ファイルにコンパイルして、ターゲット プラットフォームとリンクして FPGA 実行ファイル (XCLBIN) にできます。Vivado® Design Suite からの RTL IP も、Vivado IP パッケージング ガイドラインおよび Vitis コンパイラの要件に準拠している限り、XCLBIN にリンク可能な XO ファイルとしてパッケージ化できます。これらの要件については、次に説明します。

RTL カーネルの要件

RTL モジュールは、インターフェイスとソフトウェア要件の両方を満たしていないと、Vitis ツール内で RTL カーネルとして使用できません。カーネル プロパティの詳細は、カーネル プロパティ を参照してください。

RTL モジュールまたは Vivado IP パッケージを修正して、次のセクションで説明するカーネル要件を満たす必要があることもあります。

カーネルのインターフェイス要件

Vitis コード開発キットの実行モデルの要件を満たすには、RTL カーネルが カーネル プロパティ の要件に従っている必要があります。RTL カーネルには、カーネル ロジックにクロックを提供するために、少なくとも 1 つのクロック インターフェイス ポートが必要です。次の表に、さまざまなインターフェイスの要件を示します。

重要: ポート名を厳密に同じに記述する必要がある場合もあります。
表 1. RTL カーネルおよびポート要件
ポートまたはインターフェイス 説明 コメント
ap_clk プライマリ クロック入力ポート
  • 必須のポート。
  • 名前を厳密に同じにする必要があります。
ap_clk_2 セカンダリ クロック入力ポート
  • オプションのポート。
  • 名前を厳密に同じにする必要があります。
ap_rst_n プライマリ アクティブ Low リセット入力ポート
  • オプションのポート。
  • 名前を厳密に同じにする必要があります。
  • この信号はタイミングを改善するために内部でパイプライン処理しておく必要があります。
  • この信号は ap_clk クロック ドメインで同期リセットにより駆動されます。
ap_rst_n_2 オプションのセカンダリ アクティブ Low のリセット入力
  • オプションのポート。
  • 名前を厳密に同じにする必要があります。
  • この信号はタイミングを改善するために内部でパイプライン処理しておく必要があります。
  • この信号は ap_clk_2 クロック ドメインで同期リセットにより駆動されます。
interrupt アクティブ High の割り込み。
  • オプションのポート。
  • 名前を厳密に同じにする必要があります。
s_axi_control 唯一の AXI4-Lite スレーブ制御インターフェイス
  • 必須のポート*
  • 名前は exact (大文字/小文字の区別あり) にする必要があります。
注記: * ポートは通常必須ですが、フリーランニング カーネル などの例外もあます。
AXI4_MASTER グローバルメモリにアクセスするための 1 つ以上の AXI4 マスター インターフェイス
  • オプションのポート。
  • AXI4 マスター インターフェイスには 64 ビット アドレスが必要です (Zynq-7000 デバイスの場合は 32 ビット)。
  • グローバル メモリ空間の分割は RTL カーネル開発者が実行します。グローバル メモリの各パーティションがカーネル引数になります。各パーティションのメモリ オフセットは、AXI4-Lite スレーブ インターフェイスを介して制御レジスタ プログラマブルによって設定されます。
  • AXI4 マスターには WRAP または FIXED タイプのバーストは使用できませんし、サイズが満たないバーストも使用できません。つまり、AxSIZE は AXI データ バスの幅に一致している必要があります。
  • これらの要件を満たさないユーザー ロジックまたは RTL コードは、ラップまたはブリッジして、これらの要件を満たすようにする必要があります。
AXI4_STREAM カーネル間やホストアプリケーションとカーネル間で一方向のデータを転送するための 1 つまたは複数の AXI4-Stream インターフェイスです。
  • オプションのポート。
  • 双方向ポートには使用できません。
  • Vivado Design Suite の STREAM インターフェイス テンプレートを使用します。
  • インターフェイス要件の詳細については、『Vitis 高位合成ユーザー ガイド』 (UG1399: 英語版日本語版) の「AXI4-Streamインターフェイス」を参照してください。

カーネルの制御

次の表に、カーネルを Vitis ツールと XRT 内で使用できるようにするのに必要なレジスタ マップを示します。制御レジスタは ap_ctrl_hs および ap_ctrl_chain 実行モデルを指定する RTL カーネルに必要ですが、割り込み関連のレジスタは割り込みを含むデザインにのみ必要です。すべてのユーザー定義のレジスタは、0x10 で開始する必要があります。これより下位の位置は予約されています。

RTL デザインに別の実行モデルがある場合は、デザインがこの方法で実行できるようにそれを適用する必要があります。

ヒント: ap_ctrl_none を指定するカーネルは、次に示す制御レジスタを必要としません。
表 2. レジスタ アドレス マップ
オフセット 名前 説明
0x0 制御 カーネル ステータスを制御および示します。
0x4 グローバル割り込みイネーブル ホストへの割り込みをイネーブルにします。
0x8 IP 割り込みイネーブル 割り込みの生成に使用する IP で生成された信号を制御します。
0xC IP 割り込みステータス 割り込みステータスを示します。
0x10 カーネル引数 スカラーおよびグローバル メモリ引数などを含みます。

次の表は、制御レジスタ (offset 0x0) を介してアクセスされる制御信号を示しています。使用可能な信号は、XRT の資料の「サポートされるカーネル実行モデル」で説明されるように、さまざまな制御プロトコルで使用されます。たとえば、シーケンシャル実行モードの ap_ctrl_hs の場合、ホストは通常オフセット 0 の制御レジスタに 0x00000001 を書き込みます。これにより、ビット 0 がセットされ、ビット 1 および 2 がクリアされ、ap_done 信号の読み出しが 1 になるまでポーリングされます。

表 3. 制御レジスタ信号
ビット 名前 説明
0 ap_start カーネルがデータ処理を開始するとアサートされます。ap_done がアサートされたハンドシェイクでクリア。
1 ap_done カーネルが処理を終了するとアサートされます。読み出しでクリアされます。
2 ap_idle カーネルがアイドルになるとアサートされます。
3 ap_ready カーネルが新しいデータを受け入れる準備ができたときにアサートされます。
4 ap_continue カーネルが実行され続けるように XRT によってアサートされます。
31:5 予約済み 予約済み

制御レジスタまたはその信号は、カーネル実行モード (ap_ctrl_hs または ap_ctrl_chain) によって決定されます。

ヒント: フリーランニング カーネル で説明するように、カーネル実行モードが ap_ctrl_none の場合、制御レジスタは必要ありません。

次の割り込み関連のレジスタは、カーネルに割り込みがある場合にのみ必要です。

表 4. グローバル割り込みイネーブル (0x4)
ビット 名前 説明
0 グローバル割り込みイネーブル IP 割り込みイネーブル ビットと共にアサートされると、割り込みがイネーブルになります。
31:1 予約済み 予約済み
表 5. IP 割り込みイネーブル (0x8)
ビット 名前 説明
0 割り込みイネーブル グローバル割り込みイネーブル ビットと共にアサートされると、割り込みがイネーブルになります。
31:1 予約済み 予約済み
表 6. IP 割り込みステータス (0xC)
ビット 名前 説明
0 割り込みステータス 書き込みでトグルされます。
31:1 予約済み 予約済み

割り込み

RTL カーネルには、1 つの割り込みがある interrupt 割り込みポートをオプションで含めることができます。ポート名は interrupt にして、アクティブ High にする必要があります。これは、制御レジスタ ブロックでグローバル割り込みイネーブル (GIE) および割り込みイネーブル レジスタ (IER) ビットの両方がアサートされるとイネーブルになります。

デフォルトでは、IER が内部 ap_done 信号を使用して、割り込みをトリガーします。さらに、割り込みは IP 割り込みステータス レジスタのビット 0 に 1 が書き込まれた場合にのみクリアされます。

このロジックは、RTL カーネル用の Verilog コードと、関連する component.xml および kernel.xml ファイルにも記述されます。kernel.xml ファイルは kernel.xo に含まれ、package_xo コマンドまたは RTL Kernel ウィザードを使用すると自動的に生成されます。

RTL カーネルの開発フロー

このセクションでは、Vitis コア開発キット用に RTL カーネルを作成する 2 段階の手順を説明します。

  1. RTL ブロックを標準的な Vivado IP としてパッケージします。
  2. RTL カーネルをザイリンクス オブジェクト (XO) ファイルにパッケージします。

パッケージされた XOファイルは、Vivado IP オブジェクト (ソース ファイルを含む) および関連付けられたカーネル XML ファイルを含むコンテナーです。Vitis コンパイラを使用すると、XO ファイルをほかのカーネルと組み合わせわせたり、ターゲット プラットフォームとリンクしたり、ハードウェアまたはハードウェア エミュレーション フロー用にビルドしたりできます。

重要: RTL カーネルは、RTL カーネルからの XO ファイルの作成 で説明するように、そのカーネル用の C モデルを提供しない限り、ソフトウェア エミュレーションには使用できません。

RTL コードを Vivado IP としてパッケージ

RTL カーネルは、IP インテグレーターで使用可能な Vivado IP としてパッケージする必要があります。Vivado ツールの IP パッケージの詳細は、『Vivado Design Suite ユーザー ガイド: カスタム IP の作成とパッケージ』 (UG1118) を参照してください。

RTL カーネルに必要なインターフェイスは、次のようにパッケージする必要があります。

  • AXI4-Lite インターフェイスは、S_AXI_CONTROL という名前でパッケージする必要がありますが、その AXI ポートには異なる名前を指定できます。
  • メモリ マップド AXI4 インターフェイスは、64 ビット アドレス サポートの AXI4 マスター エンドポイントとしてパッケージする必要があります。
    注記: ザイリンクスでは、AXI4 インターフェイスは AXI メタ データ HAS_BURST=0 および SUPPORTS_NARROW_BURST=0 を含めてパッケージすることをお勧めします。これらのプロパティは、IP レベルの bd.tcl ファイルで設定できます。これは、WRAP および FIXED バースト タイプは使用されず、サイズの満たない (サブサイズ) バーストも使用されないということです。
  • AXI4-Stream インターフェイスをインプリメントすることもできます。
  • ap_clk および ap_clk_2 は、クロック インターフェイスとしてパッケージする必要があります。ap_clk_2 は、RTL カーネルに 2 つのクロックがある場合にのみ必要です。
  • ap_rst_n および ap_rst_n_2 は、アクティブ Low のリセット インターフェイスとしてパッケージする必要があります (RTL カーネルにリセットが含まれる場合)。
  • ap_clk は、AXI4-LiteAXI4AXI4-Stream インターフェイスすべてのほか、カーネル上のすべてのリセット信号 (ap_rst_n) に関連付けられている必要があります。

IP をパッケージするには、次の手順に従います。

  1. 新規 IP を作成してパッケージします。
    1. RTL ソース ファイルを追加した Vivado プロジェクトで、ToolsCreate and Package New IP をクリックします。
    2. Package your current project をオンにして Next をクリックします。

      IP のデフォルト ディレクトリを選択するか、または別のディレクトリを選択できます。

    3. Finish をクリックして Package IP ウィンドウを開きます。
  2. クロックを AXI インターフェイスに関連付けます。

    Package IP ウィンドウの Ports and Interfaces セクションで、ap_clkAXI4 インターフェイスおよび必要であればリセット信号と関連付けることができます。

    1. インターフェイスを右クリックし、Associate Clocks をクリックします。

      Associate Clocks ダイアログ ボックスが表示されます。ap_clk と場合によって ap_clk_2 がリストされています。

    2. ap_clk を選択して OK をクリックし、インターフェイスに関連付けます。
    3. この手順を繰り返して ap_clk を各 AXI インターフェイスおよびリセットに関連付けます。
  3. 制御レジスタおよびオフセットを追加します。

    カーネルの制御 で説明されているように、カーネルには制御レジスタが必要です。次の表に、必要なレジスタを示します。

    表 7. アドレス マップ
    レジスタ名 説明 アドレス オフセット サイズ
    CTRL 制御信号。
    重要: CTRL レジスタおよび <kernel_args> は、すべてのカーネルに必要です。割り込み関連のレジスタは、割り込みを使用するデザインにのみ必要です。
    0x000 32
    GIER グローバル割り込みイネーブル レジスタ。ホストへの割り込みをイネーブルにします。 0x004 32
    IP_IER IP 割り込みイネーブル レジスタ。割り込みを生成するのに使用する IP 生成信号を制御します。 0x008 32
    IP_ISR IP 割り込みステータス レジスタ。割り込みステータスを示します。 0x00C 32
    <kernel_args> ソフトウェア関数インターフェイスでの必要に応じて、各カーネル引数に個別のエントリが含まれます。すべてのユーザー定義のレジスタは、0x10 で開始する必要があります。これより下位の位置は予約されています。 0x010 32/64

    スカラー引数は 32 ビット幅で、m_axi および axis インターフェイスは 64 ビット幅です。

    1. この表に説明されているアドレスを作成するには、Package IP ウィンドウで Addressing and Memory セクションを選択します。Address Blocks を右クリックし、Add Register をクリックします。

      開いた Add Register ダイアログ ボックスで、上記の表にリストされているいずれかのレジスタの名前を入力します。

    2. 手順を繰り返して必要なすべてのレジスタを追加します。
      これで、Addressing and Memory セクションに Registers 表が作成されます。この表を編集して、各レジスタに説明 (Description)、アドレス オフセット (Address Offset)、およびサイズ (Size) を追加できます。Registers 表は、次の図に示すようになります。

    3. 表で各ポインター引数のレジスタを右クリックし、Add Register Parameter をクリックします。開いたダイアログ ボックスに ASSOCIATED_BUSIF という名前を入力し、OK をクリックします。

      これにより、レジスタと AXI4 インターフェイスの関連性を定義できます。追加したパラメーターの値フィールドに、定義する引数に割り当てる m_axi インターフェイスの名前を入力します。上記の例では、引数 Am00_axi を使用し、引数 Bm01_axi を使用します。

  4. IP に必要なプロパティを追加します。
    IP には、コアに追加可能ないくつかの標準プロパティが必要です。これには、Vivado の [Tcl Console] ウィンドウで次のコマンドを使用するのが最も簡単です。
    
    set_property sdx_kernel true [ipx::current_core]
    set_property sdx_kernel_type rtl [ipx::current_core]
    
  5. これで、IP をパッケージする準備ができました。
    1. Package IP ウィンドウの Review and Package セクションを選択し、Summary and After Packaging セクションを確認して、必要な変更を加えます。
      重要: IP アーカイブ ファイルの生成をイネーブルにする必要があります。After Packaging セクションに An archive will not be generated. (アーカイブは生成されません) と表示されている場合は、Edit packaging settings リンクをクリックして Create archive of IP をイネーブルにする必要があります。
    2. 準備ができたら、Package IP をクリックします。

      Vivado ツールでカーネル IP がパッケージされ、問題なく終了したことを示すダイアログ ボックスが表示されます。RTL カーネルからの XO ファイルの作成 に説明されているように、package_xo コマンドを使用してカーネルをパッケージします。

  6. RTL カーネルが IP インテグレーター用に正しくパッケージされていることをテストするには、パッケージ済みのカーネル IP を IP インテグレーターでブロック デザインにインスタンシエートしてみます。ツールの詳細は、『Vivado Design Suite ユーザー ガイド: IP インテグレーターを使用した IP サブシステムの設計』 (UG994) を参照してください。
  7. カーネル IP には、上記で説明したようなさまざまなインターフェイスが表示されるはずです。IP をキャンバスで確認します。AXI インターフェイスのプロパティは、キャンバスでインターフェイスを選択すると表示されます。Block Interface Properties ウィンドウで Properties タブをクリックし、CONFIG という表エントリを展開表示します。インターフェイスが読み出し専用または書き込み専用の場合は、未使用の AXI チャネルは削除され、READ_WRITE_MODE が読み出し専用または書き込み専用に設定されます。
  8. RTL カーネルの制約がクロックなどのスタティック エリアにある制約を参照している場合、RTL カーネルの制約ファイルの処理順序を late に設定して、RTL カーネル制約が正しく適用されるようにする必要があります。

    処理順序を late に設定するには、次の 2 つの方法があります。

    1. 制約が .ttcl ファイルで指定されている場合は、次のように <: setFileProcessingOrder "late" :> をファイルの .ttcl 前文セクションに追加します。
      <: set ComponentName [getComponentNameString] :>
      <: setOutputDirectory "./" :>
      <: setFileName $ComponentName :>
      <: setFileExtension ".xdc" :>
      <: setFileProcessingOrder "late" :>
      
    2. 制約が .xdc ファイルで定義されている場合、component.xml に次に示す <spirit:define> から始まる 4 行を追加します。component.xml のこの 4 行は .xdc ファイルの呼び出されるエリアの次に記述する必要があります。次の例では、my_ip_constraint.xdc ファイルを呼び出し、その後に定義した late 処理順序を指定しています。
      <spirit:file>
              <spirit:name>ttcl/my_ip_constraint.xdc</spirit:name>
              <spirit:userFileType>ttcl</spirit:userFileType>
              <spirit:userFileType>USED_IN_implementation</spirit:userFileType>
              <spirit:userFileType>USED_IN_synthesis</spirit:userFileType>
              <spirit:define>
                   <spirit:name>processing_order</spirit:name>
                   <spirit:value>late</spirit:value>
              </spirit:define>
      </spirit:file>

RTL カーネルからの XO ファイルの作成

最終段階では、カーネルを Vitis コア開発キットで使用できるように、RTL IP をザイリンクス オブジェクト ファイル (XO) にパッケージします。これには、Vivado Design Suite で Tcl コマンドの package_xo を使用します。

IP をパッケージしたら、Vivado ツールから package_xo コマンドを実行します。package_xo コマンドは、IP からの component.xml ファイルを使用して、可能な場合は必要な kernel.xml を作成します。Vivado ツールは、すべてのものが揃っていることを判断するため package_xo の前処理としてデザイン ルール チェックを実行し、IP を処理して XO ファイルを作成するか、問題が存在する場合はそれを示すエラーが返されます。

次の例では、指定された IP ディレクトリにある test_sincos という名前の RTL カーネル IP を、test.xo という名前のオブジェクト ファイルにパッケージし、必要な kernel.xml ファイルを作成し、ap_ctrl_chain プロトコルを使用します。

package_xo -xo_path ./test.xo -kernel_name test_sincos \
-ctrl_protocol ap_ctrl_chain -ip_directory ./ip/

package_xo コマンドの出力は test.xo ファイルで、アプリケーションのビルドおよび実行 で説明すようにソース ファイルとして v++ --link コマンドに追加したり、Vitis IDE の使用 で説明するようにアプリケーション プロジェクトに追加できます。

RTL カーネルの XML ファイル に説明されている要件で指定されているように、IP の kernel.xml ファイルが必要な場合があります。-kernel_xml オプションを使用すると、package_xo コマンドにファイルを指定できます。この場合、package_xo コマンドで指定された kernel.xml が使用されます。次の例に、このコマンドを示します。

package_xo -xo_path ./test.xo -kernel_name test_sincos \
-kernel_xml ./src/kernel.xml -ip_directory ./ip/

ソフトウェア エミュレーション中に RTL カーネルを使用するには、カーネルに C モデルを提供する必要があります。C モデルのハードウェアでコンパイルされる関数プロトタイプは、RTL カーネルで使用されているのと同じインターフェイスである必要があります。ただし、C モデルは HLS ツールで合成可能になっている必要はありません。

package_xo -kernel_files オプションを使用すると、パッケージされた RTL カーネルに C モデルを追加できます。

package_xo -xo_path ./test.xo -kernel_name test_sincos -kernel_xml ./src/kernel.xml \
-ip_directory ./ip/ -kernel_files ./imports/sincos_cmodel.cpp 

package_xo コマンドは、C モデル ファイルを XO 内の cpu_sources でパッケージ化します。次の C モデル ファイルの末尾が自動的に認識されます。

  • .cl = OpenCL
  • .c、.cpp、.cxx = C/C++

RTL カーネルの推奨事項

RTL Kernel ウィザードで Vitis コア開発キットで使用する RTL デザインのパッケージを実行できますが、RTL カーネルの設計時には『ザイリンクス FPGA および SoC 用 UltraFast 設計手法ガイド』 (UG949) の推奨事項に従う必要があります。

カーネルを設計する際は、インターフェイスおよびパッケージの要件に従うことに加え、次のパフォーマンス要件も念頭に置いておく必要があります。

AXI4 インターフェイスのメモリ パフォーマンスの最適化

AXI4 インターフェイスは通常、プラットフォームの DDR メモリ コントローラーに接続されます。

注記: 周波数およびリソース使用率を最適にするには、メモリ コントローラーごとに 1 つのインターフェイスを使用することを推奨します。

メモリ コントローラーからベスト パフォーマンスを得るには、次の AXI インターフェイス動作を推奨します。

  • ネイティブのメモリ コントローラーの AXI データ幅と一致する AXI データ幅を使用します。通常は 512 ビットです。
  • WRAPFIXED、またはサブサイズのバーストを使用しないでください。
  • できる限り大型のバースト転送を使用してください (最高 4 KB までの AXI4 プロトコル)。
  • ディアサートされた書き込みストローブは使用しないようにします。ディアサートされたストローブは、読み出し-変更-書き込み操作を実行するため、DDR メモリ コントローラーにエラー訂正コード (ECC) ロジックを作成します。
  • パイプライン処理された AXI トランザクションを使用します。
  • AXI インターフェイスが 1 つの DDR コントローラーにのみ接続されている場合は、スレッドの使用を避けます。
  • カーネルにフルの書き込みトランザクション (ノンブロッキング書き込み要求) を転送する機能がない場合は、書き込みアドレス コマンドの生成を避けます。
  • カーネルにバック プレッシャーのない読み出しデータ (ノンブロッキング読み出し要求) すべてを受信する機能がない場合は、読み出しアドレス コマンドの生成を避けます。
  • 読み出し専用または書き込み専用インターフェイスが必要な場合は、プロジェクトをカーネルにパッケージする前に、未使用チャネルのポートを最上位 RTL ファイルでコメントアウトできます。
  • 複数のスレッドを使用すると、カーネルとメモリ コントローラーの間のインフラストラクチャ IP により多くのリソースが必要になります。

RTL カーネルでのクロックの管理

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 カーネルで周波数シンセサイザーを使用する場合は、次の制約に注意が必要です。

  1. RTL 外部インターフェイスは ap_clk でクロック供給されます。
  2. 周波数シンセサイザーには、RTL カーネルへの内部クロックとして使用する出力クロックを複数含めることができます。
  3. 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
    注記: この制約は、ターゲット プラットフォームのクロック構造に合わせて編集する必要があります。
  4. --vivado オプション の説明のように、v++ --vivado.prop を使用して、手順 3 の Tcl スクリプトを指定し、最適化後に Vivado インプリメンテーションで使用されるようにします。次のオプションでは、Tcl スクリプトを最適化後に Vivado インプリメンテーションで使用されるように指定しています。
    --vivado.prop:run.impl_1.STEPS.OPT_DESIGN.TCL.POST={<PATH>/<Script_Name>.tcl}
  5. カーネル (RTL または HLS ベース) で使用可能な 2 つのグローバル クロック入力周波数を指定します。v++ --kernel_frequency オプションを使用して、カーネル入力クロック周波数が想定どおりになるようにします。たとえば、1 つのクロックを使用する場合は、次のように指定します。
    v++ --kernel_frequency 250
    2 つのクロックの場合、複数の周波数をクロック ID に基づいて指定できます。プライマリ クロックの ID は 0 で、セカンダリ クロックの ID は 1 です。
    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.

この場合、内部クロック周波数を変更するか、タイミングを満たすようにカーネル ロジックを最適化する必要があります。

QoR (結果の品質) に関する注意事項

タイミングおよびエリアの結果を改善するには次の推奨事項に従ってください。

  • すべてのリセット入力をパイプライン処理し、ファンアウトの大きなネットを避けるため、内部でリセットを分配します。
  • 必要な制御ロジックのフリップフロップのみをリセットします。
  • できる限り、入力および出力信号にレジスタを付けるようにしてください。
  • 特に複数のカーネルがインスタンシエートされる場合は、確実にフィットするように、ターゲット プラットフォームのエリアに比例してカーネルのサイズを検討します。
  • スタックド シリコン インターフェイス (SSI) テクノロジがプラットフォームには使用されていることに注意してください。これらのデバイスには複数のダイがあり、ダイ間をまたぐロジックはフリップフロップからフリップフロップへのタイミング パスである必要があります。

デバッグおよび検証での注意事項

  • RTL カーネルは、検証コンポーネント、ランダム化、プロトコル チェッカーなどのアドバンス検証手法を使用して、独自のテストベンチで検証する必要があります。Vivado IP カタログに含まれる AXI Verification IP (VIP) を使用すると、AXI インターフェイスを検証するのに役立ちます。RTL カーネルのサンプル デザインには、サンプル スティミュラス ファイルを含む AXI VIP ベースのテストベンチが含まれています。
  • ハードウェア エミュレーションは、ホスト コードのソフトウェア インテグレーションをテストしたり、複数カーネル間の通信を確認したりするために使用します。