高位合成インターフェイス合成の概要 【 Xilinx Vitis HLS】

アイキャッチ

この記事はXilinxの Vitis HLSユーザーガイド(UG1399(v2021.1)) の「第4章 Vitis HLSプロセスの概要」と「第17章 インターフェイスの定義」を参考にして書いています。

インターフェースについて

Vitis HLSで作成するデザインの最上位関数の引数は、インターフェースおよびポートとして合成されます。インターフェースは、複数の信号をグループ化したものです。

インターフェースで使用するプロトコルはVitis HLSツールが自動で決定するほか、ユーザーが手動で割り当てることもできます。

以下の要素によってインターフェースが定義されます。

  • 最上位関数のデータ型および方向
  • ターゲットフロー
  • デフォルトのインターフェースコンフィギュレーション (config_interfaceで指定)
  • INTERFACEプラグマまたは指示子

最後のINTERFACEプラグマまたは指示子は、ユーザーが手動でプロトコルを割り当てるための方法です。

インターフェースの3つの要素

  1. 入出力チャンネルを定義
  2. ポートプロトコルを定義
  3. 実行制御機構(実行制御スキーム)を定義

入出力チャンネル

HLSによって合成するデザインの入出力チャンネル(ポート)を決める

ポートプロトコル

チャンネルで使用するプロトコルを指定する

インターフェースの要素(チャンネル、プロトコル)

制御スキーム

デザインブロックがどのように動作するかを指定する。順次実行で動作するかパイプライン実行で動作するかなど。

インターフェースの要素(制御スキーム)

ターゲットフローの概要と選択

HLSでデザインを正しく動作させるためには、インターフェースの選択と設定がポイントとなります。Vitisツールでターゲットフローを選択できることで、インターフェースの選択・設定の手順が簡素化されています。

Vitis HLSではターゲットフローを2つのフローから選択できます。ツールのデフォルトはVivado IPフローです。

フロー比較

Vivado IPフロー
(デフォルト)
Vitisカーネルフロー
ターゲットRLT IPファイル
・Vivado Design Suite
・IPカタログ
・IPIブロックデザイン
アクセラレーション用カーネルオブジェクト(.xo)
インターフェース関数の引数ごとに割り当て
(指示子での指定も可)
AXI規格
(指示子でパラメータ調整可)
自由度高い低い (制約が多い)
デフォルト実行モード順次実行パイプライン化された処理

インターフェースと実行モードについては後の章で記述

Vivado IPフロー

Vitis HLSのデフォルトフローです

  • 柔軟性が高い(制約は少ない)
    → ユーザーにとっての選択肢は増えるが、IPの統合や管理もユーザーが責任を持つ
  • 生成したRTL IPファイルは次のデザインの使用する
    → Vivado Design Suite、IPカタログ、IPインテグレーター(IPI)のブロックデザイン
  • 関数引数のタイプによってインターフェースが決まる (指示子やプラグマで変更可能)
    → 次の表のとおり

Vitisカーネルフロー

  • 制約が多い
  • アクセラレーションフロー用であり、カーネルオブジェクト(.xo)が生成される
  • インターフェースはAXI規格のものが生成される (指示子やプラグマでパラメータ調整が可能)

フローの指定方法

プロジェクト作成時に選択する。

Vitis HLS プロジェクト作成

または、次のコマンドでターゲットとするフローを選択できる。

open_solution -flow_target [vitis | vivado]

Vitis HLSのインタラクティブモードでコマンドが使用可能。

Vitis HLS インタラクティブモード

フローの比較

インターフェースの型

インターフェースは3つの型(パラダイム)をサポートしています。各フローでデザインが外部と通信するための異なるプロトコルがサポートされています。

Vivado IPフローVitisカーネルフロー
メモリap_memory, BRAM, m_axim_axi
ストリームap_fifo, axisaxis
レジスタap_none, ap_hs, ap_ack, ap_ovld, ap_vld, x_axilites_axilite
  • m_axi:AXI4メモリマップド
  • axis:AXI4-Stream
  • s_axilite:AXI4-Lite

m_axi, axis, s_axilite はAXI4インターフェースで、VitisカーネルフローはAXI4インターフェースのみをサポートします。Vivado IPフローではAXI4以外のプロトコルも選択できます。

デフォルトのインターフェース

Vivado IPフロー

C引数タイプサポートされる型デフォルトの型入力出力入出力
スカラー変数 (値渡し)レジスタレジスタap_noneN/AN/A
配列メモリ、ストリームメモリap_memoryap_memoryap_memory
ポインタメモリ、ストリーム、レジスタレジスタap_noneap_vldap_ovld
参照レジスタレジスタap_noneap_vldap_vld
hls::streamストリームストリームap_fifoap_fifoN/A

ap_none や ap_memory などの詳細は別記事を作成予定です。

Vitisカーネルフロー

C引数タイプインターフェースプロトコル
スカラー変数 (値渡し)レジスタs_axilite (AXI4-Lite)
配列メモリm_axi (AXI4メモリマップド)
配列へのポインタメモリm_axi
スカラーへのポインタレジスタs_axilite
参照レジスタs_axilite
hls::streamストリームaxis (AXI4-Stream)

VitisカーネルフローはAXI4インターフェースのみ

実行モード

各フローのデフォルト実行モードは次のとおり。実行モードはブロックレベルの制御プロトコルとして指定されています。

Vivado IPフロー

  • 順次実行・・・次のタスク開始前に、前のタスクを完了しておく必要がある
  • ap_ctrl_hs ブロック制御プロトコルで指定

Vitisカーネルフロー

  • パイプライン実行・・・カーネルの準備ができたらすぐに次の処理が可能で、オーバーラップ実行ができる → スループットが向上する
  • ap_ctrl_chain ブロック制御プロトコルで指定

制御プロトコルについて

インターフェースの制御はポートレベル制御とブロックレベル制御の2階層あります。

ポートレベル制御は(ブロック内の)ポート間の関係を定義し、ブロックレベル制御は他のブロックとの関係を定義します。

詳細は別記事を作成予定です。

参考資料

スポンサーリンク