RTL カーネル

FPGA バイナリのビルド プロセス で説明したように、Vitis コア開発キットのハードウェア カーネルはそれぞれ別々にザイリンクス オブジェクト ファイル (.xo) にコンパイルされます。これらのファイルをアプリケーション プロジェクトにまとめると、FPGA 実行ファイル (xclbin) にリンクでき、Vivado Design Suite から既存の RTL IP をパッケージして Vitis アプリケーション アクセラレーション開発フローで使用できるようになります。

ハードウェア エンジニアの中には、既存の RTL IP (Vivado® IP インテグレーター ベース デザインを含む) を既に持っていたり、RTL にカーネルをインプリメントして Vivado ツールを使用して開発する方を好む方も多くいます。Vitis コア開発キットではパッケージされた RTL デザインを使用できるようになっていますが、アクセラレーションされたアプリケーション開発フローおよびランタイム ライブラリ内で使用するには、ソフトウェアおよびハードウェア要件に従う必要があります。

RTL カーネルの要件

RTL デザインは、インターフェイスとソフトウェア要件の両方を満たしていないと、Vitis IDE 内で RTL カーネルとして使用できません。

これらの要件を満たすため、元の RTL デザインを追加または変更する必要があることもあります。次のセクションで、これについて説明します。

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

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 ビット アドレスが必要です。
  • グローバル メモリ空間の分割は RTL カーネル開発者が実行します。グローバル メモリの各パーティションがカーネル引数になります。各パーティションのメモリ オフセットは、AXI4-Lite スレーブ インターフェイスを介して制御レジスタ プログラマブルによって設定されます。
  • AXI4 マスターには WRAP または FIXED タイプのバーストは使用できませんし、サイズが満たないバーストも使用できません。つまり、AxSIZE は AXI データ バスの幅に一致している必要があります。
  • これらの要件を満たさないユーザー ロジックまたは RTL コードは、ラップしておくかブリッジさせて、これらの要件を満たすようにする必要があります。

カーネルのソフトウェア要件

RTL カーネルには、C/C++ および OpenCL カーネルと同じソフトウェア インターフェイス モデルがあります。RTL カーネルは、ホスト プログラムでは void 戻り値、ポインター引数、およびスカラー引数を持つ関数として認識されます。

Vitis コア開発キットの実行モデルでは、次が検出されます。

  • スカラー引数は、AXI4-Lite スレーブ インターフェイスを介してカーネルに直接書き込まれます。
  • ポインター引数はホスト プログラムとメモリ間で転送され、RTL カーネルは 1 つまたは複数の AXI4 メモリ マップド インターフェイスを介してメモリにデータを読み出し/書き込みします。
  • カーネルは AXI4-Lite スレーブ インターフェイスを使用した制御レジスタ (次を参照) を介してホスト プログラムで制御されます。

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

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

表 2. アドレス マップ
アドレス 名前 説明
0x0 制御 カーネル ステータスを制御および示します。
0x4 グローバル割り込みイネーブル ホストへの割り込みをイネーブルにします。
0x8 IP 割り込みイネーブル 割り込みの生成に使用する IP で生成された信号を制御します。
0xC IP 割り込みステータス 割り込みステータスを示します。
0x10 Kernel arguments たとえば、スカラーおよびグローバル メモリ引数を含有。
表 3. Control (0x0)
ビット 名前 説明
0 ap_start カーネルがデータ処理を開始するとアサート。ap_done がアサートされたハンドシェイクでクリア。
1 ap_done カーネルが処理を終了するとアサート。読み出しでクリア。
2 ap_idle カーネルがアイドルになるとアサート。
31:3 予約済み 予約済み
注記: ホストは通常オフセット 0 の制御レジスタに 0x00000001 を書き込みます。これは、ビット 0 をセットし、ビット 1 および 2 をクリアし、完了信号を 1 になるまでポーリングします。

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

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

割り込み

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

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

interrupt ポートを RTL カーネルに追加する場合、この情報を含めて kernel.xml ファイルをアップデートする必要があります。kernel.xml は、RTL カーネル ウィザードを使用すると自動的に生成されます。RTL Kernel ウィザードは、デフォルトで interrupt という名前の 1 つの割り込みポートを作成し、制御レジスタ ブロックに割り込みロジックを作成します。これは RTL カーネル用に生成された Verilog コードと関連する component.xml および kernel.xml ファイルにも記述されます。

RTL カーネルの開発フロー

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

  1. RTL ブロックを標準的な Vivado IP としてパッケージします。
  2. RTL カーネルの XML 記述ファイルを作成します。
  3. RTL カーネルをザイリンクス オブジェクト (.xo) ファイルにパッケージします。
パッケージされた RTL カーネルはザイリンクス オブジェクト ファイルとして配布され、.xo という拡張子が付きます。このファイルは、Vivado IP オブジェクト (ソース ファイルを含む) および関連付けられたカーネル XML ファイルを含むコンテナーです。.xo ファイルは、ほかのカーネルと組み合わせわせたり、ターゲット プラットフォームとリンクしたり、ハードウェアまたはハードウェア エミュレーション フロー用にビルドできます。
ヒント: RTL カーネルは、そのカーネル用の 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 バースト タイプは使用されず、サイズの満たない (サブサイズ) バーストも使用されないということです。
  • ap_clk および ap_clk_2 は、クロック インターフェイスとしてパッケージする必要があります (ap_clk_2 は、RTL カーネルに 2 つのクロックがある場合にのみ必要です)。
  • ap_rst_n および ap_rst_n_2 は、アクティブ Low のリセット インターフェイスとしてパッケージする必要があります (RTL カーネルにリセットが含まれる場合)。
  • ap_clk は、AXI4-LiteAXI4、および AXI4-Stream インターフェイスすべてと関連付けてパッケージする必要があります。

RTL カーネルが IP インテグレーター用に正しくパッケージされていることをテストするには、パッケージ済みのカーネル IP を IP インテグレーターでブロック デザインにインスタンシエートしてみます。ツールの詳細は、『Vivado Design Suite ユーザー ガイド: IP インテグレーターを使用した IP サブシステムの設計』 (UG994) を参照してください。

カーネル IP には、上記で説明したようなさまざまなインターフェイスが表示されるはずです。IP をキャンバスで確認します。AXI インターフェイスのプロパティは、キャンバスでインターフェイスを選択すると表示されます。[Block Interface Properties] ウィンドウで Properties タブをクリックし、CONFIG という表エントリを展開表示します。インターフェイスが読み出し専用または書き込み専用の場合は、未使用の AXI チャネルは削除され、READ_WRITE_MODE が読み出し専用または書き込み専用に設定されます。

重要: 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>

カーネル記述 XML ファイルの作成

kernel.xml という XML カーネル記述ファイルは、Vitis アプリケーション アクセラレーション開発フローで使用できるように、RTL カーネルごとに作成される必要があります。このレジスタ マップおよびポートなどのカーネル属性を指定する kernel.xml ファイルは、ランタイムおよび Vitis フローで必要となります。次は kernel.xml ファイルの例です。

<?xml version="1.0" encoding="UTF-8"?>
<root versionMajor="1" versionMinor="6">
  <kernel name="vitis_kernel_wizard_0" language="ip_c" 
      vlnv="mycompany.com:kernel:vitis_kernel_wizard_0:1.0" 
      attributes="" preferredWorkGroupSizeMultiple="0" workGroupSize="1" interrupt="true">
    <ports>
      <port name="s_axi_control" mode="slave" range="0x1000" dataWidth="32" portType="addressable" base="0x0"/>
      <port name="m00_axi" mode="master" range="0xFFFFFFFFFFFFFFFF" dataWidth="512" portType="addressable" 
         base="0x0"/>
    </ports>
    <args>
      <arg name="axi00_ptr0" addressQualifier="1" id="0" port="m00_axi" size="0x8" offset="0x010" type="int*" 
         hostOffset="0x0" hostSize="0x8"/> 
    </args>
  </kernel>
</root>
注記: RTL カーネルのインターフェイス仕様を指定する kernel.xml ファイルは、RTL Kernel ウィザードを使用すると自動的に作成されます。詳細は、RTL Kernel ウィザード を参照してください。

次の表では、kernel.xml のフォーマットの詳細を説明します。

表 7. カーネル XML ファイルの内容
タグ 属性 説明
<root> versionMajor 現在のリリースの Vitis ソフトウェア プラットフォームでは 1 に設定しますソフトウェア プラットフォーム。
versionMinor 現在のリリースの Vitis ソフトウェア プラットフォームでは 6 に設定しますソフトウェア プラットフォーム。
<kernel> name カーネル名
language RTL カーネルの場合は常に ip_c に設定します。
vlnv IP の component.xml にあるベンダー、ライブラリ、名前、バージョン属性と一致している必要があります。たとえば、component.xml には次のタグがあります。

<spirit:vendor>xilinx.com</spirit:vendor>

<spirit:library>hls</spirit:library>

<spirit:name>test_sincos</spirit:name>

<spirit:version>1.0</spirit:version>

カーネル XML の vlnv 属性は xilinx.com:hls:test_sincos:1.0 に設定する必要があります。

attributes 予約されています。空の文字列 ("") に設定します。
preferredWorkGroupSizeMultiple 予約されています。0 に設定します。
workGroupSize 予約されています。1 に設定します。
interrupt 割り込みがある場合は true (interrupt="true") に設定し、それ以外の場合は削除します。
hwControlProtocol RTL カーネルの制御プロトコルを指定します。
  • ap_ctrl_hs: RTL カーネルのデフォルトの制御プロトコル。
  • ap_ctrl_chain: データフローをサポートするチェーン接続されたカーネルの制御プロトコル。ap_continue が制御レジスタに追加され、ap_done/ap_continue 終了承認信号がイネーブルになります。
  • ap_ctrl_none: 開始も終了もする必要のない継続して動作するカーネルに適用される制御プロトコル (none)。詳細は、フリーランニング カーネルを参照してください。
<port> name

ポート名を指定します。

重要: AXI4-Lite インターフェイスには、S_AXI_CONTROL という名前を付ける必要があります。
mode

少なくとも AXI4 マスター ポートが 1 つ、AXI4-Lite スレーブ コントロールポートが 1 つ必要です。

カーネル間でデータをストリームする場合は、AXI4-Stream ポートを指定できます。

  • AXI4 マスター ポートの場合は master に設定します。
  • AXI4 スレーブ ポートの場合は slave に設定します。
  • AXI4-Stream マスター ポートの場合は write_only に設定します。
  • AXI4-Stream スレーブ ポートの場合は read_only に設定します。
range ポートのアドレス空間の範囲です。
dataWidth ポートを通過するデータ幅で、デフォルト値は 32 ビットです。
portType ポートがアドレス指定可能か、またはストリーミングかを指定します。
  • AXI4 マスターおよびスレーブ ポートの場合は addressable に設定します。
  • AXI4-Stream ポートの場合は stream に設定します。
base AXI4 マスターおよびスレーブ ポートの場合は 0x0 に設定します。このタグは AXI4-Stream ポートには適用されません。
<args> name カーネル ソフトウェア引数の名前を指定します。
addressQualifier 有効値:
  • 0: スカラー カーネル入力引数
  • 1: グローバル メモリ
  • 2: ローカル メモリ
  • 3: 定数メモリ
  • 4: パイプ
id AXI4 マスターおよびスレーブ ポートのみに適用されます。ID は連続している必要があります。これはカーネル引数の順番を決めるのに使用されます。

AXI4-Stream ポートには適用されません。

port arg が接続されるポート名を指定します。
size 引数のサイズをバイトで指定します。デフォルトは 4 バイトです。
offset レジスタ メモリ アドレスを示します。
type 引数の C データ型です。たとえば uint*int*float* などを指定します。
hostOffset 予約されています。0x0 に設定します。
hostSize 引数のサイズです。デフォルトは 4 バイトです。
memSize

AXI4-Stream ポートの場合、作成される FIFO の深さは memSize で設定されます。

ヒント: AXI4 ポートには適用されません。
次のタグは、AXI4-Stream ポートの追加タグを指定します。これらは、AXI4 ポートには適用されません。
<pipe> 計算ユニットの各パイプに、データ バッファリング用の FIFO がコンパイラにより挿入されます。pipe タグは FIFO のコンフィギュレーションを決めます。
name AXI4-Stream ポート用に挿入された FIFO の名前を指定します。同じ計算ユニットで使用されているすべてのパイプの中で、この名前が重複しないように指定する必要があります。
width FIFO の幅をバイトで指定します。たとえば、32 ビットの FIFO では 0x4 を指定します。
depth FIFO の深さをワード数で指定します。
linkage 常に internal に設定します。
<connection> connection タグは、カーネルからパイプ用に挿入された FIFO まで、または FIFO からカーネルまでのハードウェアでの実際の接続を指定します。
srcInst 接続のソース インスタンスを指定します。
srcPort 接続のソース インスタンスのポートを指定します。
dstInst 接続のデスティネーション インスタンスを指定します。
dstPort 接続のデスティネーション インスタンスのポートを指定します。

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

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

次の例では、test_sincos および関連する kernel.xml ファイルが test.xo という名前のオブジェクト ファイルにパッケージしています。package_xo コマンドは、Vivado ツール内から実行されます。

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

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

RTL Kernel ウィザード

RTL Kernel ウィザードを使用すると、Vitis コンパイラで使用可能なカーネル オブジェクト (.xo) に RTL IP をパッケージするのに必要な手順の一部を自動化できます。RTL Kernel ウィザードでは、次が実行されます。

  • RTL カーネルのインターフェイス要件を指定するプロセスを順を追って表示し、入力された情報に基づいて最上位 RTL ラッパーを生成します。
  • 最上位ラッパーに含まれる制御ロジックおよびレジスタ ファイルなどの AXI4-Lite インターフェイス モジュールを自動的に生成します。
  • 最上位ラッパーにサンプルのカーネル IP モジュールを含めて、ユーザーの RTL IP とラッパー間の接続に問題がないことを確認したら、その RTL IP デザインと置き換えられるようにします。
  • ウィザードからのカーネル仕様と一致する kernel.xml を自動的に作成します。
  • 生成された RTL カーネル ラッパーに対して単純なシミュレーション テストベンチを生成します。
  • RTL カーネルを実行してデバッグするためのサンプルのホスト プログラムを生成します。

RTL Kernel ウィザードは、Vitis IDE または Vivado IDE からアクセスできます。どちらの場合もサンプル デザインを含む Vivado プロジェクトが作成され、ユーザーの RTL カーネルを定義するテンプレートとして使用できます。

VADD という単純な RTL IP 加算器を含むサンプル デザインを使用すると、ユーザーの RTL IP を生成された最上位ラッパーにマップするプロセスを理解できます。接続には、クロック、リセット、s_axilite 制御インターフェイス、m_axi インターフェイス、およびオプションで axis ストリーミング インターフェイスが含まれます。

ウィザードでは、生成された RTL カーネル ラッパーの単純なテストベンチと、サンプル RTL カーネルを実行するためのサンプル ホスト コードも生成されます。このサンプル テストベンチとホスト コードは、ユーザーの RTL IP デザインをテストできるように変更する必要があります。

RTL Kernel ウィザードの起動

RTL Kernel ウィザードは、Vitis IDE または Vivado IDE から起動できます。

ヒント: Vitis IDE からウィザードを実行すると、生成された RTL カーネルとサンプル ホスト コードが現在のアプリケーション プロジェクトに自動的にインポートされます。

RTL Kernel ウィザードを Vitis IDE 内から起動するには、アプリケーション プロジェクトを開いて Xilinx > RTL Kernel Wizard をクリックします。GUI の使用方法の詳細は、Vitis IDE の使用 を参照してください。

RTL Kernel ウィザードを Vivado から起動するには、次の手順に従います。

  1. 新しい Vivado プロジェクトを作成して、ボードを選択する際にターゲット プラットフォームを選択します。
  2. Flow Navigator で IP catalog をクリックします。
  3. IP カタログの検索ボックスに「RTL Kernel」と入力します。
  4. RTL Kernel Wizard をダブルクリックしてウィザードを起動します。

RTL Kernel ウィザードの使用

RTL Kernel ウィザードでは、RTL カーネルを定義するプロセスが複数の手順に分割され、各ページで順にカーネルを設定できるようになっています。ウィザードには、次のようなページが含まれます。

  1. [General Settings] ページ
  2. [Scalars] ページ
  3. [Global Memory] ページ
  4. [Streaming Interfaces] ページ
  5. [Summary] ページ

ページ間は Next および Back をクリックして移動します。

カーネルを最終確認し、カーネル仕様に基づいてプロジェクトを作成するには、[Summary] ページで OK をクリックします。

[General Settings] ページ

次の図に、RTL Kernel ウィザードの [General Settings] ページを示します。

1: RTL Kernel ウィザードの [General Settings] ページ

次は、RTL カーネル ウィザードの [General Settings] ページを示しています。

[Kernel Identification]
[Kernel name]
カーネル名。IP、最上位モジュール、カーネル、C/C++ 論理モデルの名前を指定します。この名前は C および Verilog の命名規則に従う必要があります。Vivado IP インテグレーターの命名規則にも従う必要もあるので、アンダースコア (_) を英数字の間以外には使用できません。
[Kernel vendor]
ベンダーの名前。『Vivado Design Suite ユーザー ガイド: IP を使用した設計』 (UG896) で説明されている VLNV (Vendor/Library/Name/Version) に使用されます。
[Kernel library]
ライブラリの名前。VLNV で使用されます。同じ識別子の規則に従う必要があります。
[Kernel options]
[Kernel type]
RTL Kernel ウィザードでは、現在のところ RTL とブロック デザインの 2 つのカーネル タイプがサポートされています。
[RTL]
RTL タイプのカーネルは、Verilog 制御レジスタ モジュールを含む Verilog RTL 最上位モジュールと、最上位モジュール内の Verilog カーネル サンプルで構成されます。
[Block Design]
ブロック デザイン タイプのカーネルでも Verilog 最上位モジュールが含まれますが、最上位モジュール内に IP インテグレーター ブロック図がインスタンシエートされます。ブロック デザインは、制御レジスタをエミュレートするため、ブロック RAM 交換メモリを使用する MicroBlaze™ サブシステムから構成されます。カーネルの制御目的で MicroBlaze の使用方法を示すため、サンプルの MicroBlaze ソフトウェアがプロジェクトと共に配布されています。
[Kernel control interface]
RTL カーネルに使用可能な制御インターフェイスには、ap_ctrl_hsap_ctrl_chain、および ap_ctrl_none の 3 種類があります。カーネル記述 XML ファイルの作成 に説明するように、<kernel> タグの hwControlProtocol が定義されます。
[Clock and Reset options]
[Number of clocks]
カーネルで使用されるクロックの数を設定します。RTL カーネルには、ap_clk というプライマリ クロックが 1 つと、ap_rst_n というオプションのリセットが含まれます。カーネルのすべての AXI インターフェイスは、このクロックを使用して駆動されます。
Number of clocks を 2 に設定すると、セカンダリ クロックおよびオプションリセットが提供され、カーネル内部で使用できるようになります。セカンダリ クロックおよびリセットはそれぞれ ap_clk_2ap_rst_n_2 という名前です。このセカンダリ クロックは、プライマリ クロックから独立しており、個別の周波数スケーリングがサポートされます。セカンダリ クロックは、プライマリ クロックが供給される AXI4 インターフェイスよりも早いまたは遅いレートでカーネル クロックを実行する必要がある場合に便利です。
重要: 複数のクロックを使用して設計する場合は、どのクロック周波数が使用されている場合でもデータの完全性が確立されているようにするために、正しいクロック乗せ換えテクニックを使用してください。詳細は、『UltraFast 設計手法ガイド (Vivado Design Suite 用)』 (UG949) を参照してください。
[Has reset]
カーネルに最上位リセット入力ポートを含めるかどうかを指定しします。リセットを含めないようにすると、大型デザインで配線の密集を緩和できる場合があります。デザインで通常リセットを持つレジスタには、正しくするため適切な初期値を指定する必要があります。このオプションをオンにすると、各クロックにリセット ポートが含められます。ブロック デザイン タイプのカーネルには、リセット入力が必要です。

[Scalars] ページ

スカラー引数は、情報の制御タイプをカーネルに渡すために使用されます。スカラー引数をホストから読み出すことはできません。指定した各引数に対して、ソフトウェアからハードウェアに引数を渡すための制御レジスタが作成されます。次の図を参照してください。

2: RTL カーネル ウィザードの [Scalars] ページ
[Number of scalar kernel input arguments]
カーネルに渡すスカラー入力引数の数を指定します。指定した各数値に対して、引数名および引数タイプをカスタマイズする行が表示されます。スカラーの最小値要件はありません。ウィザードに使用可能な最大値は 64 です。

スカラー入力引数の定義は次のとおりです。

[Argument name]
生成された Verilog 制御レジスタ モジュールで出力信号として使用される引数名です。各引数に ID 値が割り当てられます。この ID 値はホスト ソフトウェアからの引数にアクセスするために使用されます。ID 値引数は、このウィザードのサマリ ページに表示されます。互換性を最大限にするため、引数名はカーネル名と同じ識別規則に従います。
[Argument type]
引数のデータ型 (ビット幅) を指定します。これは、生成される RTL カーネル モジュールのレジスタの幅に影響します。指定可能なデータ型は、「6.1.1 Built-in Scalar Data Types」セクションの「OpenCL C Specification Version 2.0」で指定されているもののみです。この仕様には、データ型ごとに関連するビット幅が示されています。RTL ウィザードでは、引数タイプに関係なく、レジスタ マップのすべてのスカラーに対して 64 ビットを予約します。引数タイプが 32 ビット以下の場合、RTL ウィザードは 64 ビットのうちの上位 32 ビットを予約済みのアドレス位置に設定します。データ型のビット幅が 32 ビットを超える場合は、制御レジスタへの書き込み操作が 2 つ必要になります。

[Global Memory] ページ

3: [Global Memory] ページ

グローバル メモリは、カーネルから AXI4 マスター インターフェイスを介してアクセスされます。各 AXI4 インターフェイスの動作は独立しており、各 AXI4 インターフェイスを 1 つまたは複数のメモリ コントローラーに接続して DDR4 などのオフチップ メモリに接続できます。グローバル メモリは、主にホストとカーネルの間で大型のデータ セットを送受信するため使用され、カーネル間のデータ転送用にも使用できます。最適なパフォーマンスを得るためにこれらのインターフェイスを設計する方法は、AXI4 インターフェイスのメモリ パフォーマンスの最適化を参照してください。

ヒント: RTL Kernel ウィザードは、各インターフェイスごとに最上位ラッパー内にサンプルの AXI マスター ロジックを生成するので、開始点として使用できますが、使用しない場合は破棄できます。
AXI マスター インターフェイスの数
カーネルに存在するインターフェイスの数を指定します。最大は 16 インターフェイスです。各インターフェイスに対し、インターフェイス名、データ幅、関連の引数の数を指定できます。各インターフェイスには、すべての読み出しおよび書き込みチャネルが含まれます。RTL Kernel ウィザードで付けられるデフォルト名は m00_axi および m01_axi です。変更しない場合は、カーネル ポートのグローバル メモリへのマップ に示すように、インターフェイスをグローバル メモリに割り当てある際にこれらの名前を使用する必要があります。
[AXI master definition] (表の列)
[Interface name]
インターフェイスの名前を指定します。互換性を最大限にするため、引数名はカーネル名と同じ識別規則に従います。
[Width (bytes)]
AXI データ チャネルのデータ幅を指定します。ザイリンクスでは、この幅をメモリ コントローラーの AXI4 スレーブ インターフェイスのネイティブ データ幅に一致させることをお勧めしています。メモリ コントローラーのスレーブ インターフェイスは通常 64 バイト (512 ビット) 幅です。
[Number of arguments]
このインターフェイスに関連付ける引数の数を指定します。各引数は、カーネルからアクセス可能なグローバル メモリへのデータ ポインターを表します。
[Argument definition]
[Interface]
AXI インターフェイスの名前を指定します。この値は表で定義されるインターフェイスからコピーされるので、ここでは変更できません。
[Argument name]
関数プロトタイプ シグネチャに表示されるように、ポインター引数の名前を指定します。各引数に ID 値が割り当てられます。ホスト アプリケーション に示すように、この ID 値はホスト ソフトウェアからの引数にアクセスするために使用されます。ID 値引数は、このウィザードのサマリ ページに表示されます。互換性を最大限にするため、引数名はカーネル名と同じ識別規則に従います。この引数名は、生成された RTL カーネルの制御レジスタ モジュールで出力信号として使用されます。

[Streaming Interfaces] ページ

[Streaming Interfaces] ページでは、カーネルの AXI4-Stream インターフェイスを設定できます。ストリーミング インターフェイスは、一部のプラットフォームでのみ使用可能なので、選択したプラットフォームでストリーミングがサポートされない場合、このページは表示されません。ストリーミング インターフェイスは、ホストからカーネルおよびカーネルからホストへの直接通信されるほか、ストリーミング接続 に示すように、継続して動作するカーネルにも使用されます。

4: [Streaming Interfaces] ページ


[Number of AXI4-Stream interfaces]
カーネルに存在する AXI4-Stream インターフェイスの数を指定します。最大 32 のインターフェイスをカーネルごとにイネーブルにできます。ザイリンクスでは、インターフェイス数をできるだけ少なくして、使用されるエリア量を削減することをお勧めしています。
[Name]
インターフェイスの名前を指定します。互換性を最大限にするため、引数名はカーネル名と同じ識別規則に従います。
[Mode]
インターフェイスがマスターかスレーブかを指定します。AXI4-Stream スレーブ インターフェイスは読み出し専用インターフェイスで、RTL カーネルはホスト プログラムからの clWriteStream API を使用してデータを送信できます。AXI4-Stream マスター インターフェイスは書き込み専用インターフェイスで、ホスト プログラムは clReadStream API を使用してデータをインターフェイスから受信できます。
[Width (bytes)]
AXI4-Stream インターフェイスの TDATA 幅 (バイト) を指定します。このインターフェイス幅は、2 のべき乗で 1 ~ 64 バイトに制限されます。

ストリーム インターフェイスは AXI4-Stream プロトコルの TDATA/TKEEP/TLAST 信号を使用します。ストリーム トランザクションには、一連の転送が含まれ、最後の転送は TLAST 信号がアサートされて終了します。ストリーム転送は、次に従っている必要があります。

  • AXI4-Stream 転送は TVALID/TREADY が両方ともアサートされると発生します。
  • TDATA は 8、16、32、64、128、256、または 512 ビット幅である必要があります。
  • TKEEP (毎バイト) は TLAST が 0 の場合はすべて 1 である必要があります。
  • TKEEPTLAST が 1 の場合に不揃いな尾部の信号を送信するのに使用できます。たとえば、4 バイト インターフェイスの場合、TKEEP0b00010b00110b01110b1111 のいずれかにしかならず、それぞれ 1 バイト、2 バイト、3 バイト、4 バイトのサイズを指定します。
  • TKEEP は (TLAST が 1 の場合ですら) すべて 0 にはできません。
  • TLAST はパケットの最後にアサートされる必要があります。
  • TREADY 入力/TVALID 出力はカーネルが開始しない場合は Low にして、転送を失わないようにする必要があります。

[Summary] ページ

このセクションでは、前のページで選択したオプションから作成される RTL カーネル IP の VLNV、ソフトウェア関数プロトタイプ、ハードウェア制御レジスタのサマリが表示されます。関数プロトタイプは、カーネル呼び出しが C 関数であるとしたらどのようになるのかを示します。カーネル呼び出し用にカーネル引数を設定する方法の生成されたホスト コード例を参照してください。レジスタ マップは、ホスト ソフトウェア ID、引数名、ハードウェア レジスタ オフセット、タイプ、および関連インターフェイスの関係を示します。カーネルを生成する前に、このページで設定が正しいことを確認してください。

5: RTL Kernel ウィザードの [Summary] ページ

OK をクリックすると、RTL カーネルの最上位ラッパー、VADD 一時 RTL カーネル IP、kernel.xml ファイル、シミュレーション テストベンチ、およびサンプルの host.cpp コードが生成されます。これらのファイルが作成されると、RTL Kernel ウィザードは Vivado Design Suite にプロジェクトを開くので、カーネル開発をそこで完成させます。

Vivado IDE での RTL カーネル プロジェクトの使用

Vitis IDE から RTL Kernel ウィザードを開始した場合は、[Summary] ページで OK をクリックすると、サンプルの IP プロジェクトが Vivado Design Suite で開き、RTL カーネル コードを終了できるようになります。

Vivado IP カタログから RTL Kernel ウィザードを開始した場合は、[Summary] ページで OK をクリックすると、RTL Kernel Wizard IP が現在のプロジェクトにインスタンシエートされます。この後、次の手順に従ってください。

  1. [Generate Output Products] ダイアログ ボックスが表示されたら、Skip をクリックして閉じます。
  2. [Sources] ウィンドウに追加された <kernel_name>.xci ファイルを右クリックし、Open IP Example Design をクリックします。
  3. [Open Example Design] ダイアログ ボックスで Example project directory を指定するか、デフォルト値のまま OK をクリックします。
    ヒント: サンプル プロジェクトが RTL カーネル IP 用に作成されます。このサンプル IP プロジェクトは Vitis IDE から RTL Kernel ウィザードを開始した場合に作成されるサンプル プロジェクトと同じもので、これを使用してカーネルの開発を完了します。
  4. この段階で、RTL Kernel ウィザードを起動した元の Vivado プロジェクトを閉じることができます。

カーネル オプションに選択した Kernel Type によって、サンプル IP プロジェクトに RTL タイプのカーネル プロジェクト で説明するように Verilog サンプルと制御レジスタを含む最上位 RTL カーネル ファイルが含まれるか、ブロック デザイン タイプのカーネル プロジェクト で説明するようにインスタンシエートされた IP インテグレーター ブロック デザインが含まれるかが決まります。最上位 Verilog ファイルには、必要な入力/出力信号およびパラメーターが含まれています。これらの最上位ポートはカーネル仕様ファイル (kernel.xml) と同じになります。RTL コードまたはブロック デザインと統合すると、RTL カーネルを完成できます。

最上位ファイルで定義されている AXI4 インターフェイスには、効率的でスループットの大きいインターフェイスの生成に必要な AXI4 信号の最低限のセットが含まれています。信号が存在しない場合は、残りの AXI システムに接続される際に、最適化されたデフォルト値が使用されます。これらの最適化されたデフォルト値を使用すると、システムで不要な AXI 機能を省略できるので、エリアが節約され、複雑性も軽減されます。RTL コードまたはブロック デザインに除外した AXI 信号が含まれる場合は、これらの信号を最上位 RTL カーネル ファイルのポートに追加すると、IP パッケージャーで適切に処理されます。

その後、カーネルの内容をカスタマイズし、その内容をザイリンクス オブジェクト (xo) ファイルにパッケージします。

RTL タイプのカーネル プロジェクト

RTL タイプのカーネルは、制御レジスタおよび Vadd サブモジュールのサンプル デザインで構成される最上位 Verilog デザインが含まれます。次の図に、2 つの AXI4 マスター インターフェイスを含む最上位デザインを示します。制御レジスタ モジュールを変更する場合は、このモジュールと Vivado カーネル プロジェクトの imports ディレクトリにある kernel.xml ファイルとの一致が保持されるようにしてください。サンプル ブロック カスタム ロジックに置き換えるか、デザインの開始点として使用できます。

6: カーネル タイプ RTL の最上位


次の図に示す Vadd サンプル ブロックは、単純な加算器関数、AXI4 読み出しマスター、および AXI4 書き込みマスターで構成されています。定義されている AXI4 インターフェイスそれぞれに、個別のサンプル加算器コードがあります。各インターフェイスに最初に関連付けられている引数は、サンプルのデータ ポインターとして使用されます。各サンプルは 16 KB のデータを読み出し、32 ビットの「1 を足す」演算を実行し、16 KB のデータを元の位置に書き込みます (読み出しアドレスと書き込みアドレスは同じ)。

7: カーネル タイプ RTL の例


次の表では、カーネルの Vivado プロジェクトのルートにある重要なファイルについて説明します。<kernel_name> は RTL Kernel ウィザードで指定したカーネルの名前になります。

表 8. RTL カーネル ウィザードのソース ファイルとテストベンチ ファイル
ファイル名 説明 配布されるカーネル タイプ
<kernel_name>_ex.xpr Vivado プロジェクト ファイル All
imports ディレクトリ
<kernel_name>.v カーネル最上位モジュール All
<kernel_name>_control_s_axi.v RTL 制御レジスタ モジュール RTL
<kernel_name>_example.sv RTL サンプル ブロック RTL
<kernel_name>_example_vadd.sv RTL サンプル AXI4 ベクター加算ブロック RTL
<kernel_name>_example_axi_read_master.sv RTL サンプル AXI4 読み出しマスター RTL
<kernel_name>_example_axi_write_master.sv RTL サンプル AXI4 書き込みマスター RTL
<kernel_name>_example_adder.sv RTL サンプル AXI4-Stream 加算ブロック RTL
<kernel_name>_example_counter.sv RTL サンプル カウンター RTL
<kernel_name>_exdes_tb_basic.sv シミュレーション テストベンチ All
<kernel_name>_cmodel.cpp ソフトウェア エミュレーション用のソフトウェア C モデル サンプル。 All
<kernel_name>_ooc.xdc アウト オブ コンテキスト ザイリンクス制約ファイル All
<kernel_name>_user.xdc カーネル ユーザー制約用のザイリンクス制約ファイル。 All
kernel.xml カーネル記述ファイル All
package_kernel.tcl カーネル パッケージ スクリプトのプロシージャ定義 All
post_synth_impl.tcl Tcl インプリメンテーション後ファイル All
exports ディレクトリ
src/host_example.cpp ホスト コード例 All
makefile makefile サンプル All

ブロック デザイン タイプのカーネル プロジェクト

ブロック デザイン タイプのカーネルには、サンプル プロジェクトの最上位に IP インテグレーター ブロック デザイン (.bd) が含まれます。制御レジスタのサンプリングおよびカーネルのフローの制御には、MicroBlaze プロセッサ サブシステムが使用されます。MicroBlaze プロセッサ システムでは、レジスタ ファイルの代わりに、ホストとカーネル間の交換メモリにブロック RAM が使用されます。

8: ブロック デザイン タイプのカーネル

カーネル実行の制御方法を示すサンプルとして、各 AXI インターフェイスに対して DMA および数学演算のサブブロックが作成されます。このサンプルでは、AXI DataMover IP の制御に MicroBlaze AXI4-Stream インターフェイスが使用され、RTL カーネル タイプのものと同じサンプルが作成されます。また、MicroBlaze コアの ELF ファイルをコンパイルおよびリンクするための Vitis IDE プロジェクトも含まれています。この ELF ファイルは Vivado カーネル プロジェクトに読み込まれ、MicroBlaze 命令メモリに直接初期化されます。

MicroBlaze プロセッサ プログラムを変更するには、次の手順に従います。

  1. デザインがアップデートされている場合は、ハードウェアをエクスポートする必要がある場合があります。このオプションにアクセスするには、File > Export > Export Hardware をクリックします。[Export Hardware] ダイアログ ボックスが表示されたら、OK をクリックします。
  2. これで、コア開発キット アプリケーションを起動できるようになります。メイン メニューから Tools > Launch Vitis をクリックします。
  3. Vitis IDE が表示されたら、[Welcome] タブの右側にある X ボタンをクリックしてこのダイアログ ボックスを閉じます。既に読み込まれている Vitis IDE プロジェクトが表示されます。
  4. [Project Explorer] ビューの <Kernel Name>_control/src セクションの下にソース ファイルがあります。必要に応じてこれらのファイルを変更します。
  5. アップデートが終了したら、Project > Build All > Check for errors/warnings and resolve if necessary をクリックしてソースをコンパイルします。ELF ファイルは自動的に IDE でアップデートされます。
  6. 必要であれば、アップデートされたプログラムをテストおよびデバッグするため、シミュレーションを実行します。

シミュレーション テストベンチ

サンプル IP プロジェクトをシミュレーションするために、SystemVerilog テストベンチが生成されます。このテストベンチは RTL カーネルが正しく動作するかどうかを確かめるためのものです。add one 演算を検証するためのチェッカー機能も自動的に含まれます。

この生成されたテストベンチは、カーネル機能を検証する開始点として使用できます。制御レジスタの書き込み/読み出し操作を実行し、カーネルを複数回実行して、簡単なリセット テストも実行します。また、AXI の問題、リセット問題、複数回繰り返したときのバグ、カーネル機能のデバッグにも便利です。ハードウェア エミュレーションと比較すると、ハードウェアのコーナー ケースをより厳しくテストしますが、ホスト コードとカーネルのやり取りはテストしません。

シミュレーションを実行するには GUI の左側で Vivado Flow Navigator > Run Simulation をクリックし、Run Behavioral Simulation をクリックします。ビヘイビアー シミュレーションが予測どおりに機能している場合は、合成後の論理シミュレーションを実行し、合成結果がビヘイビアー モデルと一致していることを確認できます。

アウト オブ コンテキスト合成

Vivado カーネル プロジェクトは、アウト オブ コンテキスト (OOC) モードで合成およびインプリメンテーションを実行するよう設定されています。そのため、デザインのザイリンクス デザイン制約 (XDC) ファイルで合成のデフォルト クロック周波数が指定されています。

RTL カーネルは、それを package_xo コマンドでパッケージする前に合成する必要があります。カーネルがエラーなしに合成されるかどうかを判断するため、合成を実行すると有益です。合成を実行すると、リソース使用率をおよび演算周波数の見積もりも取得できます。RTL を前もって合成しておかないと、v++ リンク プロセス中にエラーが発生し、原因をデバッグしにくくなります。

OOC 合成を実行するには、Vivado Flow Navigator > Synthesis から Run Synthesis をクリックします。

合成済み出力は、RTL ソースではなく、ネットリスト ソースを使用して RTL カーネルをパッケージするためにも使用できます。

重要: ブロック デザイン タイプのカーネルは、package_xo コマンドを使用してネットリストとしてパッケージする必要があります。

ソフトウェア モデルおよびホスト コード例

サンプルの add one の C++ ソフトウェア モデル (<kernel_name>_cmodel.cpp) は、./imports ディレクトリに含まれています。このソフトウェア モデルも、カーネルの関数をモデル化するために変更でき、package_xo を実行すると、カーネル ソース ファイルに含まれ、そのカーネルのソフトウェア エミュレーションがイネーブルになります。ハードウェア エミュレーションおよびシステム ビルドでは、常にカーネルの RTL 記述が使用されます。

./exports/src ディレクトリには、host_example.cpp という名前のホスト プログラムの例が含まれています。ホスト プログラムには、プログラムへの引数としてバイナリ コンテナーを指定します。これで、ホスト コードで init 関数の一部としてバイナリが読み込まれます。ホスト コードはカーネルのインスタンシエーション、バッファーの割り当て、カーネルの引数設定、カーネルの実行、サンプルの add one 関数の結果値の収集およびその確認を実行します。

ホスト プログラムおよびカーネル コードのアプリケーションでの使用方法については、Vitis IDE プロジェクトの作成 を参照してください。

RTL カーネルの生成

カーネルが設計されて、Vivado IDE のサンプルの IP プロジェクトでテストされたら、最後に RTL カーネル オブジェクト ファイル (.xo) を生成して、Vitis コンパイラで使用されるようにします。

Vivado Flow Navigator > Project Manager から Generate RTL Kernel コマンドをクリックします。[Generate RTL Kernel] ダイアログ ボックスに 3 つのパッケージ オプションが表示されます。

  • ソースのみのカーネル パッケージを選択すると、RTL デザイン ソースを直接使用してカーネルがパッケージされます。
  • 合成済みのカーネル パッケージを選択すると、RTL デザイン ソースと合成済みのキャッシュされた出力を含めてカーネルがパッケージされます。合成済みのキャッシュされた出力を使用すると、フローの後の方で再合成する必要はありません。ターゲット プラットフォームを変更すると、パッケージされたカーネルで合成済みのキャッシュされた出力が使用されなくなり、RTL デザイン ソースだけが使用されるようになります。
  • ネットリスト (デザイン チェックポイント (DCP)) ベースのカーネル パッケージを選択すると、カーネルの合成済み出力により生成されたネットリストを使用して、カーネルがブラック ボックスとしてパッケージされます。必要であれば、この出力は暗号化可能です。ターゲットのプラットフォームを変更した場合、カーネルが新しいデバイスにターゲットを変更できなくなる可能性があるので、ソースから生成し直す必要があります。デザインにブロック デザインが含まれている場合は、ネットリスト (DCP) ベースのカーネル パッケージ オプションのみが選択可能です。

また、すべてのカーネル パッケージング タイプで、ソフトウェア エミュレーションで使用可能なソフトウェア モデルを使用してパッケージするオプションもあります。ソフトウェア モデルに複数のファイルが含まれている場合は、ソース ファイル リストのファイル名をスペースで区切るか、GUI を使用して、CTRL キーを押しながら複数のファイルを選択します。

OK をクリックすると、カーネル出力ファイルが生成されます。あらかじめ合成済みのカーネルまたはネットリストのカーネル オプションを選択している場合は、合成を実行できます。合成が前に実行されている場合は、古くてもそのときの出力が使用されます。カーネル ザイリンクス オブジェクト (.xo) ファイルは、Vivado カーネル プロジェクトの exports ディレクトリに生成されます。

この時点で、Vivado カーネル プロジェクトを閉じることができます。Vivado カーネル プロジェクトを Vitis IDE から起動した場合、host_example.cpp という名前のサンプル ホスト コードおよびカーネル ザイリンクス オブジェクト (.xo) ファイルが自動的に Vitis IDE のアプリケーション プロジェクトの ./src フォルダーにインポートされます。

ウィザードで生成した既存 RTL カーネルの変更

既存の RTL カーネルは、Vitis IDE で使用中のアプリケーション プロジェクトの ./src フォルダーから選択すると変更できます。[Project Explorer] ビューで .xo ファイルを右クリックし、RTL Kernel Wizard をクリックします。Vitis IDE は、選択した RTL カーネルの Vivado プロジェクトを開こうとします。

ヒント: Vitis IDE が Vivado プロジェクトを見つけられない場合は、エラー メッセージが表示され、RTL カーネルは編集できません。

既存の RTL カーネルを編集する 2 つのオプションを表示するダイアログ ボックスが表示されます。Edit Existing Kernel Contents を選択すると、Vivado プロジェクトが開き、カーネル コンテンツを変更して生成し直すことができます。Re-customize Existing Kernel Interfaces を選択すると、RTL Kernel ウィザードが開きます。Kernel Name 以外のオプションは変更可能で、前の Vivado プロジェクトが置き換えられます。

重要: アップデートした RTL カーネル プロジェクトを作成すると、前の Vivado プロジェクトのファイルおよび変更はすべて失われます。

RTL カーネルの推奨事項

RTL Kernel ウィザードで Vitis コア開発キットで使用する RTL デザインのパッケージを実行できますが、RTL カーネルの設計時には『UltraFast 設計手法ガイド (Vivado Design Suite 用)』 (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 カーネル インターフェイスはプライマリ クロックを使用する必要があります。プライマリ クロックとセカンダリ クロックの両方で、独立した自動周波数スケーリングがサポートされます。

RTL カーネル内でさらにクロックが必要な場合は、Clocking Wizard IP または MMCM/PLL プリミティブなどの周波数シンセサイザーを RTL カーネル内にインスタンシエートできます。このため、RTL カーネルはプライマリ クロックだけを使用するか、プライマリ クロックとセカンダリ クロックの両方を使用するか、内部周波数シンセサイザーを使用してプライマリ クロックおよびセカンダリ クロックを使用できます。次は、これら 3 つの RTL カーネルのクロッキング手法を使用した場合の長所と短所を示しています。

  • 1 つの入力クロック: ap_clk
    • 外部インターフェイスおよび内部カーネル ロジックは同じ周波数で実行されます。
    • クロック乗せ換え (CDC) 問題はありません。
    • ap_clk の周波数は、カーネルがタイミングを満たせるように自動的にスケールできます。
  • 2 つの入力クロック: ap_clk および ap_clk_2
    • カーネル ロジックはいずれかのクロック周波数で実行できます。
    • 周波数を移動するために適切な 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 ベースのテストベンチが含まれています。
  • ハードウェア エミュレーション フローでは、ハードウェアで実際の AXI トラフィックで可能なプロトコル信号伝送条件の範囲を正確に表すことができないので、論理検証には使用しないでください。ハードウェア エミュレーションは、ホスト コードのソフトウェア インテグレーションをテストしたり、複数カーネル間の通信を確認したりするために使用します。