• 検索結果がありません。

Vitis 高位合成ユーザー ガイド

N/A
N/A
Protected

Academic year: 2021

シェア "Vitis 高位合成ユーザー ガイド"

Copied!
461
0
0

読み込み中.... (全文を見る)

全文

(1)

UG1399 (v2020.1) 2020 年 6 月 24 日

この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資 料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報 につきましては、必ず最新英語版をご参照ください。

(2)

改訂履歴

次の表に、この文書の改訂履歴を示します。 セクション 改訂内容 2020 年 6 月 24 日 バージョン 2020.1 Vitis カーネル フローのイネーブル 編集上の変更。 資料全体 図およびページ構成をクリーンアップ。 2020 年 6 月 3 日 バージョン 2020.1 初版。 なし

(3)

改訂履歴

第 1 章: Vitis HLS の使用

...5 Vitis HLS の概要... 5 Vitis HLS の起動...10 Vitis HLS プロセスの概要... 14 新規 Vitis HLS プロジェクトの作成... 15 C シミュレーションを使用したコードの検証...34 コードの合成...45 合成結果の解析... 48 HLS プロジェクトの最適化... 56 Vitis HLS での C/RTL 協調シミュレーション... 64 RTL デザインのエクスポート...77 コマンド ラインからの Vitis HLS の実行...81

第 2 章: Vitis HLS のプログラム

... 84 Vitis HLS コーディング スタイル...84 インターフェイス合成の管理...156 Vitis HLS での最適化手法... 194

第 3 章: コマンド リファレンス

...259 vitis_hls コマンド...259 プロジェクト コマンド...259 コンフィギュレーション コマンド... 277 最適化指示子...288 HLS プラグマ... 319

第 4 章: AXI4-Lite スレーブの C ドライバーのリファレンス

... 360 XDut_Initialize... 362 XDut_CfgInitialize... 362 XDut_LookupConfig... 363 XDut_Release...363 XDut_Start...363 XDut_IsDone...364 XDut_IsIdle... 364 XDut_IsReady... 364 XDut_Continue... 365 XDut_EnableAutoRestart... 365 XDut_DisableAutoRestart... 365

(4)

XDut_Get_ARG...367 XDut_Get_ARG_vld... 367 XDut_Get_ARG_ack... 367 XDut_Get_ARG_BaseAddress...368 XDut_Get_ARG_HighAddress...368 XDut_Get_ARG_TotalBytes... 368 XDut_Get_ARG_BitWidth... 369 XDut_Get_ARG_Depth...369 XDut_Write_ARG_Words...370 XDut_Read_ARG_Words... 370 XDut_Write_ARG_Bytes...371 XDut_Read_ARG_Bytes... 371 XDut_InterruptGlobalEnable...372 XDut_InterruptGlobalDisable...372 XDut_InterruptEnable... 372 XDut_InterruptDisable... 373 XDut_InterruptClear...373 XDut_InterruptGetEnabled...373 XDut_InterruptGetStatus...374

第 5 章: Vitis HLS ライブラリ リファレンス

... 375 任意精度型ライブラリ...375 Vitis HLS math ライブラリ... 420 HLS ストリーム ライブラリ... 429 HLS IP ライブラリ... 437

付録 A: その他のリソースおよび法的通知

...459 ザイリンクス リソース...459 Documentation Navigator およびデザイン ハブ... 459 参考資料... 459 お読みください: 重要な法的通知...460

(5)

第 1 章

Vitis HLS の使用

Vitis HLS の概要

Vitis™ HLS は、Vitis アプリケーション アクセラレーション開発フローで C/C++ 関数をハードウェア カーネルとして インプリメンテーションするプロセスを簡単に実行できるようにするために開発されたツールで、C/C++ コードを FPGA デザイン用の RTL IP を開発するためにも使用できます。 Vitis アプリケーション アクセラレーション フローでは、C/C++ コードをプログラマブル ロジックにインプリメント して最適化するのに必要なコード変更の多くが Vitis HLS により自動化され、短いレイテンシ、高スループットを達 成できます。ユーザーの関数引数用に正しいインターフェイスを生成し、コード内でループおよび関数をパイプライ ン処理するのに必要なプラグマを推論することが、アプリケーション アクセラレーション フローでの Vitis HLS の基 本です。 Vitis HLS では、コードのカスタマイズもサポートされており、異なるインターフェイス規格をインプリメントした り、デザイン目標を達成するために特定の最適化を適用したりできます。 Vitis HLS のデザイン フローは次のとおりです。 1. C/C++ アルゴリズムをコンパイル、シミュレーション、およびデバッグ。 2. レポートを確認して、デザインを解析および最適化。 3. C アルゴリズムを RTL デザインに合成。 4. RTL 協調シミュレーションを使用して RTL インプリメンテーションを検証。 5. RTL インプリメンテーションをコンパイル済みオブジェクト ファイル (.xo) にコンパイルまたは RTL IP にエク スポート。

基本的な高位合成

ザイリンクス Vitis HLS は、プログラマブル ロジックでアクセラレーションするために、C または C++ 関数を RTL コ ードに合成するツールです。Vitis HLS は、Vitis コア開発キットとアプリケーション アクセラレーション デザイン フ ローに緊密に統合されています。 高位合成 (HLS) 設計手法を使用する利点は、次のとおりです。 • C レベルでアルゴリズムを開発および検証し、ハードウェア インプリメンテーションの詳細から抽象化されたレ ベルで設計。 • C シミュレーションを使用してデザインを検証し、通常の RTL デザインよりもすばやくイテレーション。 • 最適化プラグマを使用して C 合成プロセスを制御し、高パフォーマンスのインプリメンテーションを作成。 • C ソース コードおよびプラグマから複数のデザイン ソリューションを作成して、デザイン空間を試し、最適なソ リューションを特定。

(6)

• C ソースをすばやく再コンパイルし、さまざまなプラットフォームおよびハードウェア デバイスをターゲット。 HLS には、次の段階が含まれます。 1. スケジューリング: 各クロック サイクルでどの演算を実行するかを次に基づいて決定します。 • 演算の依存が満たされ、使用可能になるタイミング。 • クロック サイクルの長さまたはクロック周波数。 • 演算が終了するまでにかかる時間 (ターゲット デバイスで定義)。 • 使用可能なリソースの割り当て。 • ユーザー指定の最適化指示子。 ヒント: クロック周期が長ければ、1 つのクロック サイクルでより多くの演算を実行できます。高速なデバイスがタ ーゲットの場合、すべての演算を 1 クロックで完了できることもあります。クロック周期が短い場合、または低速 のデバイスがターゲットの場合は、HLS で演算が複数のクロック サイクルでスケジューリングされます。演算によ っては、マルチサイクル リソースとしてインプリメントする必要のあるものもあります。 2. バインディング: スケジューリングされた各演算をインプリメントするハードウェア リソースを決定し、加算、 乗算、シフトなどの演算子を特定の RTL インプリメンテーションにマップします。たとえば乗算 (mult) は、組 み合わせまたはパイプライン RTL 乗算器としてインプリメントできます。 3. 制御ロジックの抽出: 定義されたスケジュールに基づいて、RTL デザインで演算を順序付ける有限ステート マシ ン (FSM) を作成します。

スケジューリングおよびバインディングの例

次の図に、このコード例のスケジューリングおよびバインディングの 例を示します。

int foo(char x, char a, char b, char c) {

char y;

y = x*a+b+c;

return y;

}

(7)

図 1: スケジューリングおよびバインディングの 例

Target Binding

Phase

DSP AddSub

Initial Binding

Phase

Scheduling

Phase

X14220-052220

Clock Cycle

a x + 1 2 3

*

b c + y Mul AddSub AddSub この例のスケジューリング段階では、次の演算が各クロック サイクルで発生するようにスケジューリングされます。 • 1 番目のクロック サイクル: 乗算と 1 回目の加算 • 2 番目のクロック サイクル: 2 番目のクロック サイクルで最初の加算の結果が使用可能な場合は、2 回目の加算を 実行して出力を生成 注記: 図の 1 番目と 2 番目のクロック サイクルの間にある正方形は、内部レジスタに変数が格納されることを示して います。この例では、高位合成で加算の出力が 1 クロック サイクルでレジスタに入力されることだけが必要です。1 番目のサイクルで x、a、b データ ポートが読み出され、2 番目のサイクルで c データ ポートが読み出されて y 出力 が生成されます。 最終的なハードウェア インプリメンテーションでは、最上位関数への引数が I/O (入力および出力) ポートとしてイン プリメントされます。この例では、引数は単純なデータ ポートです。各入力変数は char 型なので、入力データ ポー トはすべて 8 ビット幅です。関数 return は 32 ビットの int 型なので、出力データ ポートは 32 ビット幅です。 重要: ハードウェアに C コードをインプリメントする利点は、すべての演算をより少ないクロック数で完了できるこ とです。この例の場合、演算は 2 クロック サイクルだけで完了します。CPU では、このような単純なコード例で も、完了するのにさらに多くのクロック サイクルが必要です。 この例の初期バインディング段階では、乗算が組み合わせ乗算器 (Mul) を使用してインプリメントされ、両方の加算 が組み合わせ加減算器 (AddSub) を使用してインプリメントされています。 ターゲット バインディング段階では、乗算器と加算演算の 1 つが DSP モジュール リソースを使用してインプリメン トされています。アプリケーションには多数のバイナリ乗算器およびアキュムレータを使用するものもありますが、 これらは専用の DSP リソースにインプリメントするのが最適です。DSP モジュールは、FPGA アーキテクチャで使用 可能な計算ブロックで、高パフォーマンスと効率的なインプリメンテーションの理想的なバランスを達成します。

(8)

制御ロジックの抽出と I/O ポートのインプリメント例

次の図に、ここに示すコード例の制御ロジックの抽出と I/O ポートのインプリメンテーションを示します。

void foo(int in[3], char a, char b, char c, int out[3]) {

int x,y;

for(int i = 0; i < 3; i++) {

x = in[i];

y = a*x + b + c;

out[i] = y;

}

}

図 2: 制御ロジックの抽出と I/O ポートのインプリメンテーションの例 Clock b c a in_data + +

*

out_ce out_we out_addr in_addr in_ce x y

Finite State Machine (FSM)

C0 C1 C2 C3 x3 + X14218 out_data このコード例では前の例と同じ演算が実行されますが、演算が for ループ内で実行され、関数引数のうちの 2 つが配 列である点が異なります。結果のデザインでは、コードがスケジューリングされたときに for ループ内のロジックが 3 回実行されます。高位合成では C コードから制御ロジックが自動的に抽出され、RTL デザインでこれらの演算を順 序付ける有限ステート マシン (FSM) が作成されます。最終的な RTL デザインでは、最上位関数の引数がポートとし てインプリメントされます。char 型のスカラー変数は標準の 8 ビット データ バス ポートにマップされます。in および out などの配列引数には、データ コレクション全体が含まれます。

高位合成では、配列はデフォルトでブロック RAM に合成されますが、FIFO、分散 RAM、個別のレジスタなどに合成 することも可能です。最上位関数で配列を引数として使用すると、ブロック RAM が最上位関数外にあると想定され、 データ ポート、アドレス ポート、必要なチップ イネーブルまたはライト イネーブル信号など、デザイン外のブロッ ク RAM にアクセスするためのポートが自動的に作成されます。

(9)

FSM では、データをいつレジスタに格納するかと、I/O 制御信号のステートが制御されます。FSM は C0 ステートで 開始し、次のクロックで C1 ステートに遷移し、その後 C2 ステート、C3 ステートに遷移します。そして C1 (および C2、C3) を 3 回反復してから、C0 ステートに戻ります。 注記: これは、C コードの for ループの制御構造と類似しています。ステートの完全なシーケンスでは、C0、{C1, C2, C3}、{C1, C2, C3}、{C1, C2, C3} の後、C0 に戻ります。 b と c の加算が必要なのは 1 回だけなので、この演算は for ループ外に出され、C0 ステートに挿入されます。この加 算結果は、C3 ステートに遷移するたびに再利用されます。 デザインでは in のデータが読み出され、x に格納されます。FSM の C1 で最初の要素のアドレスが生成されます。 また、C1 ステートでは、C1、C2、C3 ステートを何回反復する必要があるのかを知るために、加算器がインクリメン トされます。C2 ステートでは、ブロック RAM から in のデータが返され、変数 x として格納されます。 計算に必要なその他の値が a ポートから読み出され、最初の y 出力が生成されます。FSM で正しいアドレスと制御 信号が生成され、この値がブロック外に格納されます。この後デザインは C1 ステートに戻り、配列/ブロック RAM の in から次の値が読み出されます。このプロセスは、すべての出力が書き込まれるまで継続されます。そして C0 ス テートに戻り、b と c の次の値が読み出されて、プロセスが再度実行されます。

パフォーマンス メトリクスの例

次の図に、前の例のコードの実行 (各クロック サイクルのステート、読み出し、計算、書き込みなど) をサイクルごと に示します。 図 3: レイテンシと開始間隔の例 b + C0 C1 C2 C3 C1 C2 C3 C1 C2 C3 C0 Read B

and C Addrin[0] Readin[0] out[0]Calc. Addrin[1] Readin[1] out[1]Calc. Addrin[2] Readin[2] out[2]Calc. Read Band C

c Addr x=Data a Addr x=Data a Addr x=Data a b c

* + * + * + +

Y[0] Y[1] Y[2]

Function Latency = 9

Function Initiation Interval = 10

Loop Iteration Latency = 3

Loop Iteration Interval = 3

Loop Latency = 9

(10)

この例のパフォーマンス メトリクスは次のとおりです。 • レイテンシ: すべての値を出力するのに 9 クロック サイクルかかります。 注記: 出力が配列の場合、レイテンシは配列の最後の出力値までで計測されます。 • 開始間隔 (II): II は 10 なので、関数が新しい入力データのセットの読み出しを開始してから次のセットのプロセス を開始するまでに 10 クロック サイクルかかります。 注記: 1 つの関数の実行を完了するのにかかる時間は、1 トランザクションと呼ばれます。この例では、関数が次 のトランザクション用のデータを受信できるまでに 11 クロック サイクルかかります。 • ループの反復レイテンシ: 各ループ反復のレイテンシは 3 クロック サイクルです。 • ループ II: 開始間隔は 3 です。 • ループ レイテンシ: レイテンシは 9 クロック サイクルです。

チュートリアルおよびサンプル

Vitis HLS の使用方法を短時間で習得するためのチュートリアルおよびサンプル アプリケーションが次の場所から提 供されています。 • Vitis HLS チュートリアル (https://github.com/Xilinx/HLS-Tiny-Tutorials/tree/2020.1): 適切な設計プラクティス、コ ーディング ガイドライン、一般的なアプリケーションのデザイン パターンなどのコード例が多数含まれ、アプリ ケーションのパフォーマンスを最大限にするために重要な最適化手法が示されています。すべての例には、コー ド例を使用するための README.md ファイルおよび run_hls.tcl スクリプトが含まれています。

• Vitis アクセラレーション例リポジトリ (https://github.com/Xilinx/Vitis_Accel_Examples): Vitis ツールおよびプラ ットフォームのさまざまな機能を紹介する例が含まれます。Vitis アプリケーション アクセラレーション開発フ ロー用のホスト コードおよびカーネル プログラムに関する特定の状況が機能する小型の例で示されます。これ らの例のカーネル コードは、Vitis HLS で直接コンパイルできます。 • Vitis アプリケーション アクセラレーション開発フロー チュートリアル (https://github.com/Xilinx/Vitis-Tutorials): Vitis HLS をスタンドアロン アプリケーションとして使用する方法や Vitis ボトムアップ デザイン フローで使用 する方法を含め、ツール フローおよびアプリケーション開発に関する特定の概念を理解するためのチュートリア ルが多数含まれます。

Vitis HLS の起動

Vitis™ HLS を起動するには、環境の設定 に説明されているように、ツールを実行する環境を設定する必要がありま す。これには、ツールに必要な環境変数およびパスを設定します。

Linux プラットフォームまたは Windows コマンド プロンプトで Vitis HLS を起動するには、次を実行します。

$ vitis_hls

ヒント: Windows デスクトップでアプリケーションをダブルクリックして Vitis HLS を起動することもできます。

(11)

図 4: Vitis HLS の GUI の Welcome ページ

[Project] には、次のオプションがあります。

• [Create Project]: 新しいプロジェクトを作成するウィザードを開きます。詳細は、新規 Vitis HLS プロジェクトの作 成を参照してください。

• [Open Project]: 既存のプロジェクトを開きます。

• [Clone Examples]: GitHub リポジトリからサンプル プロジェクトをクローンし、ローカル コピーを作成します。 チュートリアルおよびサンプルを参照してください。

• [Open Recent]: 既にプロジェクトを作成した場合は、このオプションが使用できるようになり、最近変更した既存 のプロジェクトが表示されるようになります。

[Resources] には、ツールの使用方法を学ぶのに役立つ資料およびチュートリアルへのリンクがあります。

既に Vitis HLS でプロジェクトを作成している場合は、[Open Recent] の下にリストされている最近開いたプロジェク トから選択できます。

(12)

環境の設定

Vitis HLS は、Vitis 統合ソフトウェア プラットフォームの一部としてインストールされます。ツールのインストール の詳細は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) の Vitis 開発環境のインストールおよびライ センス を参照してください。

Vitis ソフトウェア プラットフォームの構成要素をインストールしたら、settings64.sh bash スクリプトまたは settings64.csh スクリプトを実行して、特定のコマンド シェルで Vitis HLS を実行できるよう動作環境を設定す る必要があります。

#setup XILINX_VITIS and XILINX_VIVADO variables

source <Vitis_install_path>/settings64.sh

ヒント: Vitis 統合ソフトウェア プラットフォームには、ザイリンクス ランタイム (XRT) およびハードウェア プラッ トフォームをインストールおよび設定する必要もありますが、これらは Vitis HLS の使用には必要ありません。

GUI の概要

Vitis HLS を使用する主なコマンド ボタンは、ツールバーに含まれます。現在実行可能なコマンド以外は、淡色表示 されます。たとえば、合成は C/RTL 協調シミュレーションが実行されるよりも前に実行される必要があるので、 [C/RTL co-simulation] ツールバー ボタンは、合成が終了するまで淡色表示になります。 図 5: Vitis HLS のツールバー ボタン

Project Management Operations Analysis Perspectives

X24045-052620

図の「Project Management」 (プロジェクト管理) グループのボタンを左から順に説明します。 • [Create New Project]: New Project ウィザードを開きます。

• [Project Settings]: 現在のプロジェクト設定を変更できます。 • [New Solution]: [New Solution] ダイアログ ボックスを開きます。 • [Solution Settings]: 現在のソリューション設定を変更できます。

ツールバーの「Operation」 (ツール操作) グループのボタンを左から順に説明します。 • [Index C Source]: C ソースのアノテーションを 更新します。

• [Run C Simulation]: [C Simulation] ダイアログ ボックスを開きます。 • [C Synthesis]: Vitis HLS で C ソース コードを RTL に合成します。 • [Run C/RTL Cosimulation]: RTL 出力を検証します。

• [Export RTL]: RTL を必要な IP 出力形式でパッケージします。

ツールバーの「Analysis」 (デザイン解析) グループのボタンを左から順に説明します。

(13)

• [Compare Reports]: 異なるソリューションのレポートを比較します。 ツールバーの各ボタンには、それに対応するメニュー コマンドがあります。Vitis HLS の GUI には、次の 3 つのパー スペクティブがあります。パースペクティブを 選択すると、ビューが選択したタスクに適した表示に切り替わります。 • [Debug] パースペクティブでは C デバッガーが開きます。 • [Synthesis] パースペクティブはデフォルトのパースペクティブで 、合成を実行するウィンドウが含まれます。 • [Analysis] パースペクティブは 、合成終了後にデザインを詳細に解析するために使用します。このパースペクティ ブには、合成レポートよりも詳細な情報が含まれます。 パースペクティブは 、ボタンでいつでも切り替えることができます。

GUI のカスタマイズ

Vitis HLS の GUI のデフォルト設定では、一部の情報が表示されなかったり、デザインに適さない設定であったりす ることがあります。このセクションでは、次の機能のカスタマイズ方法を説明します。 • [Console] ビューのバッファー サイズ。 • 主な動作。 [Console] ビューのカスタマイズ [Console] ビューには、合成および検証などの操作中のメッセージがすべて表示されます。 このビューのデフォルトのバッファー サイズは 80,000 文字ですが、これを変更するか、またはすべてのメッセージ が表示されるように制限を解除できます。これは、[Window] → [Preferences] → [Run/Debug] → [Console] から設定で きます。 主な動作のカスタマイズ

Vivado HLS の GUI の動作をカスタマイズするには、[Windows] → [Preferences] をクリックしてオプションを設定し ます。

たとえば、キーの組み合わせ [Ctrl] + [Tab] を使用すると、デフォルトでは情報エリアのアクティブ ビューがソース コ ードとヘッダー ファイルの間で切り替わります。[Ctrl] + [Tab] をもう一度押すと、アクティブなタブが再び切り替わ ります。

• [Preferences] ダイアログ ボックスの左側のペインで [General] → [Keys] をクリックすると、[Command] 列の [Toggle Source/Header] が選択できるようになり、[Unbind Command] キーを使用して [Ctrl] + [Tab] の組み合わせ を削除できます。

• [Command] 列で [Next Tab] を選択し、[Binding] ダイアログ ボックスにカーソルを置いて [Ctrl] キーを押しながら [Tab] キーを押すと、[Ctrl] + [Tab] キーを押したときに次のタブがアクティブになるよう設定できます。

次の検索結果を示すホット キーは、Microsoft Visual Studio スキームを使用してインプリメントできます。[Window]  → [Preference] → [General] → [Keys] で [Default] スキームを [Microsoft Visual Studio] スキームに変更します。 [Preferences] ダイアログ ボックスの左側のペインでさまざまな項目を選択することにより、GUI 環境を詳細にカスタ マイズでき、生産性を向上できます。

(14)

Vitis HLS プロセスの概要

Vitis HLS はプロジェクト ベースです。プロジェクトにはそれぞれ 1 セットの C コードが含まれ、複数のソリューシ ョンを含めることができます。各ソリューションに異なる制約および最適化指示子を設定できます。Vitis HLS の GUI で、各ソリューションの結果を解析および比較できます。 次に、典型的なデザイン フローでの合成、最適化、解析の手順を示します。 1. 新しい Vitis HLS プロジェクトを作成します。 2. C シミュレーションを使用してコードを検証します。 3. 高位合成を実行して RTL 結果を作成します。 4. レイテンシ、開始間隔 (II)、およびスループットを確認して結果を解析します。 5. 最適化を実行し、必要に応じて繰り返します。 6. C/RTL 協調シミュレーションを使用して結果を検証します。 Vitis HLS は、デフォルトのツール設定、デザイン制約、および指定した最適化プラグマまたは指示子に基づいてソリ ューションをインプリメントします。最適化指示子を使用すると、内部ロジックと I/O ポートのインプリメンテーシ ョンを変更および制御して、ツールのデフォルト動作を変更できます。 C/C++ コードは次のように合成されます。 • 最上位関数の引数は、Vitis HLS により自動的に RTL I/O ポート インターフェイスに合成されます。インターフェ イス合成の管理 で説明するように、ツールが作成するデフォルト インターフェイスは、ターゲット フロー、関数 引数のデータ型と方向、デフォルトのインターフェイス モード、インターフェイスを手動で定義したユーザー指 定の INTERFACE プラグマまたは指示子などによって作成されます。 • 最上位 C/C++ 関数のサブ関数は RTL デザインの階層のブロックに合成されます。 ○ 最終的な RTL デザインには、元の最上位 C 関数階層と 1 対 1 で対応するモジュールまたはエンティティの 階 層が含まれます。 ○ Vitis HLS は、パフォーマンスを向上するため、必要に応じて、サブ関数を上位の関数または最上位関数に自動 的にインライン展開します。 ○ この自動インライン機能は、サブ関数に INLINE プラグマを使用するか、ソリューションで set_directive_inline を使用して、OFF に設定するとオフにできます。 ○ デフォルトでは、C サブ関数を呼び出すごとに RTL モジュールの同じインスタンスが使用されます。ただし、 ALLOCATION プラグマを指定するか、set_directive_allocation をソリューションで使用すると、RTL モジュールの複数のインスタンスをインプリメントしてパフォーマンスを改善できます。 • C 関数のループは、パフォーマンスを向上するため、デフォルトでは展開されず、パイプライン処理されます。 ○ Vitis HLS ツールでは、最上位ループをパイプライン処理するために入れ子のループを展開する場合と同様に、 ソリューションのパフォーマンスが向上しなければループは展開されません。ループが展開されない場合、合 成でそのループの 1 反復に対してロジックが作成され、RTL デザインでループの各反復に対してこのロジック が順に実行されます。ループが展開されると、ループのすべての 反復を並列実行できますが、より多くのデバ イス リソースが消費されます。 ○ ループは、UNROLL プラグマまたは set_directive_unroll コマンドを使用して手動で展開できます。 ○ ループは、有限ステート マシンの細粒度インプリメンテーション (ループ パイプライン) またはより粗い粒度 のハンドシェイク ベースのインプリメンテーション (データフロー) を使用して、パイプライン処理することも できます。

(15)

• コード内の配列は、最終的な FPGA デザインではブロック RAM、LUT RAM、または UltraRAM に合成されます。 ○ 配列が最上位関数インターフェイスに含まれる場合、高位合成ではその配列がデザイン外のブロック RAM に アクセスするポートとしてインプリメントされます。 ○ このデフォルト割り当ては、使用されるメモリ タイプを設定するか、ARRAY_PARTITION または ARRAY_RESHAPE プラグマ、あるいは関連する set_directive_array コマンドを使用して読み出し/書き 込み転送を設定することにより変更できます。 重要: Vitis HLS では、プラグマまたは指示子を特定のスコープ (関数/ループ/領域) に指定すると、前述のツールのデ フォルト動作を変更できます。この場合、現在のスコープでプラグマやコンフィギュレーションを 指定すると、反 復数の少ないループの自動パイプラインなどのデフォルト動作が適用されないことがあります。 合成後にさまざまなレポートで結果を解析して、結果の品質を確認します。結果を解析したら、プロジェクトにソリ ューションを追加して、さまざまな制約および最適化指示子を指定し、合成してその結果を解析します。異なるソリ ューションの結果を比較すると、どの制約または指示子が有益であるかがわかります。このプロセスは、デザインが 必要なパフォーマンス特性になるまで繰り返すことができます。複数のソリューションを使用することで、前のソリ ューションは保持したままで開発を進めることができます。

新規 Vitis HLS プロジェクトの作成

新規プロジェクトを作成するには、Welcome ページで [Create New Project] リンクをクリックするか、[File] → [New Project] メニュー コマンドをクリックします。これにより、次の図に示す New Vitis HLS Project ウィザードが開きま す。

(16)

図 6: New Vitis HLS Project ウィザード 次の手順に従って新規 Vitis HLS プロジェクトを作成します。 1. プロジェクト名を指定します。この名前は、プロジェクト ファイルおよびフォルダーが保存されるディレクトリ 名としても使用されます。 2. プロジェクトの保存ディレクトリを指定します。 重要: Windows オペレーティング システムではパスの長さが 255 文字までに制限されており、これが Vitis ツール に影響する可能性があります。この問題を回避するには、プロジェクトの作成、新規ファイルの追加を実行する際 に、ディレクトリの場所および名前をできるだけ短くしてください。

3. [Next] をクリックして [Add//Remove Files] ページに進みます。

(17)

図 7: [Add/Remove Files] ページ

4. [Add Files] をクリックし、プロジェクトに追加するソース コード ファイルを選択します。

[Add Files] ボタンまたは add_files Tcl コマンドを使用してプロジェクトにヘッダー ファイル (拡張子 .h) を 追加しないでください。Vitis HLS では、次のディレクトリがコンパイル検索パスに自動的に追加されます。 • Vitis HLS のプロジェクト ディレクトリが含まれる作業ディレクトリ。

• プロジェクトに追加された C/C++ ファイルを含むディレクトリ。

これらのディレクトリに含まれるヘッダー ファイルは、コンパイル中に自動的にプロジェクトに追加されます。 [Edit CFLAGS] 関数を使用してほかのインクルード パスを指定することもできます。

5. オプションで [New File] をクリックして、プロジェクトに追加する新しいソース ファイルを作成します。[File Browser] ダイアログ ボックスが表示されるので、作成するファイルの名前と場所を指定します。

ヒント: 新しいファイルを新規プロジェクト用に作成されるディレクトリに保存する場合は、プロジェクトを作成し た後に作成するようにしてください。

6. ファイルを選択し、[Edit CFLAGS] または [Edit CSIMFLAGS] をクリックすると、コンパイラ フラグまたはシミュ レーション フラグを追加するダイアログ ボックスが表示されます。

(18)

次の図に、CFLAGS の例を示します。 図 8: [Edit CFLAGS] ダイアログ ボックス コンパイラ フラグは、gcc または g++ の標準コンパイラ オプションです。オプションのリストは、GNU コンパ イラ コレクション (GCC) のウェブサイト (http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html) を参照して ください。次に CFLAGS の例をいくつか示します。 • [-I/source/header_files]: 関連するヘッダー ファイルへの検索パスを指定します。ファイルへの絶対パスまた は相対パスで指定します。 重要: 相対パスは、プロジェクト ディレクトリではなく、作業ディレクトリに対して指定する必要があります。 • [-DMACRO_1]: コンパイル中にマクロ MACRO_1 を定義します。 • [-fnested-functions]: 入れ子の関数を含むデザインに必要な指示子を定義します。 ヒント: $::env(MY_ENV_VAR) を使用すると、CFLAGS で環境変数を指定できます。たとえば、コンパイルに $MY_ENV_VAR/include というディレクトリを含めるには、-I$::env(MY_ENV_VAR)/include を指定しま す。 7. [Remove] をクリックすると、不要なファイルまたは間違って追加してしまったファイルをプロジェクトから削除 できます。

8. [Top Function] フィールドの横にある [Browse] ボタンをクリックし、追加したファイルに含まれる関数およびサ ブ関数をリストします。

次の図に示す [Select Top Function] ダイアログ ボックスが表示されます。このダイアログ ボックスには、追加し たファイルに含まれる関数がリストされ、HLS 合成で最上位とする関数を指定できます。

(19)

図 9: [Select Top Function] ダイアログ ボックス

ヒント: プロジェクトにファイルを追加していない場合は、最上位関数の名前を入力できます。ファイルを追加して いる場合は、使用可能な関数から選択できます。

9. ファイルを追加して最上位関数を指定したら、[Add/Remove Files] ページで [Next] をクリックします。 テストベンチを追加/削除する [Add/Remove Files] ページでは、テストベンチおよびほかの必要なファイルを追 加できます。

(20)

図 10: テストベンチの追加/削除

10. C ソース ファイルと同様に、[Add Files] をクリックしてテストベンチを追加します。コンパイラ オプションを含 めるには、[Edit CFLAGS] または [Edit CSIMFLAGS] をクリックします。

11. C ソース ファイルと共に、テストベンチで読み込まれるすべてのファイルをプロジェクトに追加する必要があり ます。上の図の例では、テストベンチで入力スティミュラスを供給する in.dat ファイルと、予測結果を含む out.golden.dat ファイルが読み込まれます。テストベンチがこれらのファイルにアクセスするので、これら もプロジェクトに追加する必要があります。 ヒント: テストベンチ ファイルがディレクトリにある場合は、個々のファイルを追加する代わりに、[Add Folder] を クリックしてでディレクトリ全体を追加できます。 12. プロジェクトにテストベンチを追加することは必須ではありません。[Next] をクリックして次に進みます。 プロジェクトのソリューションを設定する [Solution Configuration] ページが表示されます。

(21)

図 11: [Solution Configuration] ページ 13. プロジェクトの特定の設定における指示子、結果、およびレポートを格納するソリューションの名前を指定しま す。プロジェクト設定の異なる複数のソリューションを使用して、最適なソリューションをすばやく見つけるこ とができます。 14. クロック周期を ns で指定するか、周波数を MHz (150 MHz など) で指定します。詳細は、クロック周波数の指定 を参照してください。 15. クロックのばらつきを指定します。合成で使用されるクロック周期は、クロック周期からクロックのばらつきを 引いた値になります。Vitis HLS では、内部モデルを使用して各デバイスの演算の遅延が見積もられます。 [Uncertainty] に入力するクロックのばらつきの値では、RTL 合成、配置配線によるネット遅延の増加を考慮に入 れた制御可能な差分を指定できます。ns で指定するか、クロック周期のパーセントで指定します。デフォルトの クロックのばらつきは、クロック周期の 12.5% です。

16. 参照ボタン ([…]) をクリックして [Device Selection Dialog] ダイアログ ボックスを開き、ターゲット デバイスを選 択します。

(22)

図 12: [Device Selection] ダイアログ ボックス

[Device Selection Dialog] ダイアログ ボックスでは、プロジェクトのデバイスをパーツまたはボード (Alveo™ デ ータセンター アクセラレータ カードなど) として選択できます。[Search] フィールドに検索文字列を入力してフ ィルターできます。

17. [Flow Target] ドロップダウン リストから [Vitis Kernel Flow Target] を選択すると、Vitis カーネル フローのイネー ブル に説明されているようにプロジェクトが設定され、合成済みプロジェクトからのコンパイル済みザイリンク ス オブジェクト ファイル (.xo) がイネーブルになります。Vitis アプリケーション アクセラレーション開発フロ ー用のカーネルを開発するのに Vitis HLS を使用する場合は、この設定を使用する必要があります。

(23)

図 13: Vitis HLS での新規プロジェクトの GUI Vitis HLS の GUI のデフォルト パースペクティブには 、次の 4 つのエリアが含まれます。 • 左側の [Explorer] エリアでは、プロジェクト階層を表示できます。この階層はディスクのプロジェクト ディレク トリと同じです。 • 中央の情報エリアには、ファイルが表示されます。ファイルを開くには、[Explorer] ビューでダブルクリックしま す。 • 右側の補足エリアには、情報エリアで開いたファイルに関する情報が表示されます。 • 下部のコンソール エリアには、Vitis HLS を実行したときの出力が表示されます。

Vitis カーネル フローのイネーブル

新規 Vitis HLS プロジェクトの作成 で説明するように [Solution Settings] ダイアログ ボックスで [Vitis Kernel Flow Target] を選択すると、Vitis HLS により、Vitis アプリケーション アクセラレーション フロー用のコンパイル済みカー ネル オブジェクト (.xo) が生成されるようになります。 このフローは、open_solution コマンドの -flow_target オプションを使用して設定します。ソリューションを 開くと、指定のフロー ターゲット (この場合は Vitis アプリケーション アクセラレーション フロー) 用に設定されてい ます。これは、高位合成で開発された RTL IP は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) のカ ーネル プロパティ で説明されているように、Vitis ツールおよびザイリンクス ランタイム (XRT) で定義されているカ ーネル要件を満たす必要があります。

(24)

最初のシミュレーションまたは合成の実行後、ソリューションの script.tcl ファイルがアップデートされ、次の 2 つの新しいコンフィギュレーション コマンドが追加されます。

config_rtl -register_reset_num=3

および

config_interface -default_slave_interface=s_axilite -m_axi_latency=64 \

-m_axi_alignment_byte_size=64 -m_axi_max_widen_bitwidth=512

config_rtl コマンドは、Vitis HLS で生成される RTL コードの特定、特に Vitis アプリケーション アクセラレーション 開発フローに必要なリセットの特性を定義します。 config_interface コマンドは、ツールで割り当てられるデフォルトのインターフェイス プロトコルの特性を設定しま す。コードにインターフェイス プラグマがない場合は、次のインターフェイス プロトコルが適用されます。 • スカラー引数、グローバル変数、配列の制御信号、およびソフトウェア関数の戻り値には、AXI4-Lite インターフ ェイス (s_axilite) が割り当てられます。 • C/C++ 関数のポインター引数には、AXI4 マスター インターフェイス (m_axi) が割り当てられます。 • Vitis HLS では、メモリ アクセスをまとめてスループット帯域幅を最大にし、レイテンシを最短にするため、可能 な場合はバースト トランザクションが自動的に推論されます。

• hls::stream 型を使用してソフトウェア関数引数を定義すると、AXI4-Stream (axis) ポートが使用されます。 INTERFACE プラグマまたは set_directive_interface コマンドを使用すると、関数引数にインターフェイス仕 様を手動で割り当てることができます。この方法を使用すると、デフォルト インターフェイスの設定を変更して、-bundle を使用して関数引数を AXI インターフェイスにまとめたり、-max_read/write_burst_length を使用し てバースト トランザクションを管理したりできます。

ソースの操作

(25)

図 14: Vitis HLS のデザイン フロー

Test

Bench

Constraints/

Directives

Vitis HLS

C Simulation

C Synthesis

RTL

Adapter

Verilog

VHDL

RTL Simulation

Packaged IP

Vivado

Design

Suite

System

Generator

Xilinx

Platform

Studio

X14309-061720

C, C++

Vitis HLS の入力ファイルには、次のものがあります。 • C および C++11/C++14 で記述された C 関数。Vitis HLS への主な入力です。この関数には、サブ関数の階層を含 めることができます。 • RTL ブラック ボックスの内容を含む C 関数 (RTL ブラック ボックスの追加を参照)。 • クロック周期、クロックのばらつき、およびデバイス ターゲットを指定するデザイン制約。 • 合成プロセスで特定の動作または最適化をインプリメントする指示子 (オプション)。 • 合成前に C 関数をシミュレーションし、C/RTL 協調シミュレーションを使用して RTL 出力を検証するのに必要な C テストベンチおよび関連ファイル。 C 入力ファイル、指示子、および制約は、Vitis HLS グラフィカル ユーザー インターフェイス (GUI) を使用してプロ ジェクトに追加するか、または コマンド ラインからの Vitis HLS の実行 に説明されているようにコマンド プロンプ トから Tcl コマンドを使用して追加できます。また、Tcl スクリプトを作成してバッチ モードでコマンドを実行するこ ともできます。 Vitis HLS の出力には、次が使用されます。 • コンパイル済みオブジェクト ファイル (.xo)。

(26)

この出力から、Vitis アプリケーション アクセラレーション開発フローで使用するためのコンパイル済みハードウ ェア関数を作成できます。この出力は、Vitis HLS が Vitis ツール フローからコンパイル プロセスの一部として呼 び出されたとき、またはボトムアップ フローでスタンドアロン ツールとして起動したときに生成されます。 • ハードウェア記述言語 (HDL) 形式の RTL インプリメンテーション ファイル。

これは Vitis HLS からの主な出力です。このフローにより、Vitis ツール フローで C/C++ コードをハードウェア デ ザインのソースとして使用できるようになります。RTL IP は、Vitis HLS で Verilog (IEEE 1364-2001) および VHDL (IEEE 1076-2000) 標準で生成でき、Vivado Design Suite を使用してザイリンクス デバイスに合成およびイ ンプリメントできます。

• レポート ファイル。

シミュレーション、合成、C/RTL 協調シミュレーション、および出力生成の結果として生成されたレポート。

C/C++ 関数のコード記述

コーディング スタイル

C プログラムでは、最上位関数は main() と呼ばれます。Vitis HLS デザイン フローでは、合成で main() の下のサ ブ関数を最上位関数として指定できます。最上位関数 main() は合成できません。次はその他の規則です。 • 合成で最上位関数として選択できる関数は 1 つだけです。 • 最上位関数を合成すると、その下の階層にある関数も合成されます。 • 最上位関数の下位階層にない関数を合成するには、関数を合成用に 1 つの最上位関数に統合する必要があります。 C/C++ 言語サポート Vitis HLS では、C コンパイル/シミュレーションに次の規格がサポートされています。 • ANSI-C (GCC 4.6) • C++ (G++ 4.6)

Vitis HLS では多くの C および C++ 言語コンストラクトと、float 型および double 型も含めた各言語のすべてのネイ ティブ データ型がサポートされていますが、合成では次のコンストラクトはサポートされていません。 • ダイナミック メモリ割り当て: FPGA には決まったリソース セットがあるので、メモリ リソースの動的な作成と 解放はサポートされません。 • オペレーティング システム (OS) の操作: FPGA に入出力されるすべてのデータは、入力ポートから読み出される か、出力ポートに書き込まれる必要があります。ファイルの読み出し/書き込みのような OS 操作または時間や日 付のような OS クエリはサポートされません。これらの操作は、ホスト アプリケーションまたはテストベンチで 実行され、そのデータが関数引数として関数に渡されます。 サポートされる C コンストラクトとサポートされない C コンストラクトの詳細と主なコンストラクトの例は、Vitis HLS コーディング スタイルを参照してください。

Git リポジトリからのソース ファイルの取得

プロジェクトにソース ファイルを追加する場合、Vitis HLS に統合されている GitHub リポジトリの表示を使用すると 便利です。ユーザー独自のリポジトリを使用する際にこの機能を使用すると、プロジェクトのソース コードを管理し たり、外部リポジトリにリンクしてファイルをダウンロードしたりできます。

(27)

ヒント: このビューが開いていない場合は、[Window] → [Preference] をクリックし、[Preferences] ダイアログ ボッ クスの [Run/Debug] → [View Management] ページでイネーブルにできます。

次の手順を使用してリポジトリをクローンします。

1. [Clone a Git Repository] をクリックします。次の図に示す Clone Git Repository ウィザードが開きます。 図 15: Clone Git Repository ウィザード

2. このウィザードの [Source Git Repository] ページに https://github.com/Xilinx/HLS-Tiny-Tutorials/tree/2020.1 と 入力します。

チュートリアルおよびサンプル に説明されている Vitis HLS チュートリアル リポジトリが設定されます。[Next] をクリックします。

3. [Branch Selection] ページで、リポジトリの [master] ブランチまたは別の適切なブランチを選択します。[Next] を クリックします。

4. [Local Destination] ページの [Destination Directory] でリポジトリをクローンするディレクトリを指定します。 [Next] をクリックします。

Vitis HLS チュートリアル リポジトリからのサンプルがリストされます。これで、これらのファイルをプロジェクト のソース ファイルとして使用できるようになります。プロジェクトを管理しやすくするため、既存のローカル リポ ジトリを Vitis HLS に追加したり、新しいリポジトリを作成したりできます。

(28)

Vitis HLS でのライブラリの使用

Vitis HLS ライブラリ Vitis HLS に含まれる基本的な C ライブラリを使用すると、一般的なハードウェア デザイン コンストラクトおよび関 数を C で簡単に記述して RTL に合成できます。Vitis HLS には次の C ライブラリが含まれます。 • 任意精度型ライブラリ: 任意精度型を使用すると、C コードで標準 C または C++ データ型よりもビット幅の狭い 変数を使用することにより、パフォーマンスを向上してハードウェアでのエリアを削減できます。 • Vitis HLS math ライブラリ: RTL への合成およびザイリンクス デバイスへのインプリメンテーションのための標 準数学演算を指定します。 • HLS ストリーム ライブラリ: ストリーミング データ構造をモデリングおよびコンパイルします。 これらの C ライブラリをデザインで使用するには、コードのライブラリ ヘッダー ファイルを含めます。これらのヘ ッダー ファイルは、Vitis HLS のインストール ディレクトリ内の include ディレクトリにあります。 重要: Vitis HLS C ライブラリのヘッダー ファイルは、デザインを Vitis HLS で使用する場合はインクルード パスに含 める必要はありません。ライブラリ ヘッダー ファイルへのパスは、自動的に追加されます。 Vitis ライブラリ Vitis HLS で使用可能な Vitis アクセラレーション ライブラリには、算術演算、統計、線形代数、DSP などの一般的な 関数用のものだけでなく、ビジョンおよび画像処理、数理ファイナンス、データベースおよびデータ分析、データ圧 縮などのドメイン特化アプリケーション用のものがあります。ライブラリは、https://github.com/Xilinx/Vitis_Libraries からダウンロードして使用できます。 Vitis ライブラリには、ザイリンクス デバイスへのインプリメンテーション用に最適化された関数およびコンストラク トが含まれます。これらのライブラリを使用すると、高い結果の品質 (QoR) を達成できるようになり、合成結果がリ ソースを最適に使用したパフォーマンスの優れたデザインにになります。ライブラリは C および C++ で提供されて いるので、最上位関数に組み込んで、合成前に論理的に問題ないかどうかをシミュレーションで検証できます。

ヘッダー ファイル問題の解決

デフォルトの Vitis HLS の GUI では、すべてのコード参照を解決するために、すべてのヘッダー ファイルが解析され ます。次の図に示すように、未解決の参照は GUI でハイライトされます。

(29)

図 16: C ファイルのインデックス • 左側のサイドバー: 未解決の参照のソース コードの行番号がハイライトされます。 • 右側のサイドバー: 未解決の参照がファイル内でマークされます。 未解決の参照は、ヘッダー ファイル (拡張子は .h または .hpp) で定義されたコードを解決できない場合に発生します。 未定義の参照の主な原因は、次のとおりです。 • コードが最近ファイルに追加された。 コードが新しい場合、ヘッダー ファイルが保存されていることを確認します。ヘッダー ファイルを保存すると、 Vitis HLS でヘッダー ファイルに自動的にインデックスが付けられ、コード参照がアップデートされます。 • ヘッダー ファイルが検索パスに含まれない。 #include 文を使用して C コードにヘッダー ファイルが含まれるようにし、ヘッダー ファイルがソースの C フ ァイルと同じディレクトリに含まれるか、ヘッダー ファイルのディレクトリが検索パスに含まれるようにします。 ヒント: ソース ファイルの検索パスを追加するには、新規 Vitis HLS プロジェクトの作成 に説明するように、 [Project] → [Project Settings] をクリックして [Synthesis] または [Simulation] をクリックし、ソース ファイルの [Edit CFLAGs] ボタンを使用します。

(30)

Vitis HLS ですべてのヘッダー ファイルが自動的に解析されるようにします。[Project] → [Project Settings] をクリ ックして [Project Settings] ダイアログ ボックスを開きます。[General] をクリックし、[Disable Parsing All Header Files] がオフになっていることを確認します。

ヒント: Vitis HLS ですべての C ファイルにインデックスが付けられるように手動で指定するには、[Index C files] ツ ールバー ボタン をクリックします。

ソース コードのコメント表示の解決

言語環境によっては、英語以外の言語のコメントが文字化けすることがあります。これは、次の手順で修正できます。 1. [Explorer] ビューでプロジェクトを右クリックし、[Properties] をクリックします。

2. ダイアログ ボックスの左側の [Resource] セクションを選択します。

3. [Text file encoding] で [Other] をオンにし、ドロップダウン リストから適切なエンコードを選択します。 4. [Apply and Close] をクリックして変更を確定します。

コンフィギュレーション オプションの設定

プロジェクトおよびソリューションを作成したら、コンフィギュレーション設定コマンド config_xxx を使用して、 Vitis HLS ツールのデフォルト設定を指定できます。これらのコマンドの詳細は、コンフィギュレーション コマンド を参照してください。これらのコマンドを設定するには、[Solution] → [Solution Settings] をクリックします。現在ア クティブなソリューションの [Solution Settings] ダイアログ ボックスが開きます。 ヒント: 追加のソリューションの作成 に説明されているようにプロジェクトに複数のソリューションを作成してい る場合は、[Explorer] ビューでソリューションを右クリックして [Set Active Solution] コマンドをクリックすると、 そのソリューションをアクティブにできます。また、特定のソリューションを右クリックして [Solution Settings] を クリックすると、そのソリューションの [Solution Settings] ダイアログ ボックスを開くことができます。

(31)

図 17: [Solution Settings] ダイアログ ボックス [Solutions Setting] ダイアログ ボックスには、次の設定があります。 • [General]: Vitis HLS ツールに通常適用される現在のソリューションのコンフィギュレーション コマンドを表示し ます。現在のソリューションのコンフィギュレーション設定を追加 ([Add] ボタン)、削除 ([Remove] ボタン)、編集 ([Edit] ボタン) できます。 • [Synthesis]: 合成設定は、新規 Vitis HLS プロジェクトの作成で説明するように、プロジェクトを作成したときに 定義されます。 • [Cosimulation]: Vitis HLS での C/RTL 協調シミュレーション に説明されている C/RTL 協調シミュレーション機能 を制御します。 • [Export]: RTL デザインのエクスポート に説明されている Vitis HLS で生成される出力を制御します。

[General] 設定ページで [Add] をクリックすると、次に示す [Add Command] ダイアログ ボックスが開きます。このダ イアログ ボックスでは、[Command] でコマンドを指定し、[Parameters] で現在のソリューションに追加するそのコマ ンドのパラメーターを指定します。リストされるコマンドは、ソリューションに追加されていない使用可能な コンフ ィギュレーション コマンド です。表示されるパラメーターは、選択したコマンドのオプションです。

[Help] をクリックすると、選択したコマンドに関する情報が表示されます。 [OK] をクリックして現在のソリューションにコマンドを追加します。

(32)

図 18: [Add Command] ダイアログ ボックス

クロック周波数の指定

C および C++ デザインでは、クロックは 1 つしかサポートされず、デザイン内のすべての関数に同じクロックが適用 されます。 クロック周期 (ns) を指定するには、[Solutions] → [Solutions Setting] をクリックします。デフォルトのクロック周期は 10 ns です。Vitis HLS では、クロックのばらつきの概念を使用して、ユーザー定義のタイミング マージンが提供され ています。デザインのクロックのばらつきも、[Solutions Setting] ダイアログ ボックスで指定できます。クロックの ばらつきを指定しない場合、デフォルトではクロック周期の 27% に設定されます。 ヒント: クロック周期は create_clock Tcl コマンド、クロックのばらつきは set_clock_uncertainty Tcl コマンドを使用 しても設定できます。

(33)

Vitis HLS では、クロック周波数とデバイス ターゲット情報を使用して演算のタイミングが見積もられますが、最終 的なコンポーネント配置およびネット配線は判断できません。配置配線は、出力 RTL の論理合成で実行されるからで す。そのため、Vitis HLS では正確な遅延は判断できません。 Vitis HLS では、次の図に示すようにクロック周期からクロックのばらつきを差し引いて、合成に使用されるクロック 周期が計算されます。 図 19: クロック周期とマージン クロック周期 Vivado HLS で使用される 効率的なクロック周期 クロックのばらつき 論理合成および 配置配線のマージン X14263-061318 これにより、ユーザー指定のマージンが使用されて、論理合成や配置配線などのダウンストリーム プロセスで操作を 完了するのに十分なタイミング マージンが供給されます。FPGA のほとんどのリソースが使用されている場合、セル の配置とセルを接続するためのネットの配線が理想的なものにならないことがあり、タイミング遅延が予想外に大き くなってしまうことがあります。このような場合、タイミング マージンを増加すると、Vitis HLS で各クロック サイ クルにパックされるロジックが多くなりすぎるデザインは作成されなくなり、配置配線が理想的なものでない場合で も、RTL 合成でタイミングを満たすことができるようになります。 Vitis HLS では、すべての制約 (タイミング、スループット、レイテンシ) を満たすことが試みられますが、制約を満た すことができない場合でも、Vitis HLS で常に RTL デザインが出力されます。 クロック周期により推論されたタイミング制約を満たすことができない場合、Vitis HLS で次のような SCHED-644 と いうメッセージが表示され、達成可能な最良のパフォーマンスのデザインが出力されます。

@W [SCHED-644] Max operation delay (<operation_name> 2.39ns) exceeds the

effective

cycle time

Vitis HLS では、特定のパスのタイミング要件が満たされない場合でも、それ以外のすべてのパスではタイミングが達 成されます。これにより、ダウンストリームの論理合成でエラーのあったパスに対して、より高い最適化レベルを使 用したり、特別な処理を実行することで、タイミングを満たすことができるかどうかを評価できます。 重要: Vitis HLS でデザインが出力されても、すべてのパフォーマンス制約が満たされているとは限らないので、合成 後に制約レポートを参照して、すべての制約が満たされたかどうかを確認することが重要です。デザイン レポート の [Performance Estimates] セクションを確認してください。 合成が終了すると、デザイン レポートが階層の各関数ごとに生成され、ソリューションのレポート フォルダーから 表示できます。デザイン全体のワースト ケース タイミングは、各関数レポートにレポートされます。階層の各レポ ートをすべて参照する必要はありません。 タイミング違反が最適化やダウンストリーム プロセスで修正できないほど大きい場合は、より高速のテクノロジをタ ーゲットする前に、レイテンシの指定方法およびインプリメンテーション コアを指定する方法を見直してみてくださ い。

(34)

C シミュレーションを使用したコードの検証

Vitis HLS フローでの検証には、大きく分けて 2 つのプロセスが含まれます。 • C プログラムが正しく必要な機能をインプリメントするかどうかを確認する合成前の検証。 • 生成後の RTL コードが問題なく動作するかどうかを確認する合成後の検証。 どちらのプロセスもシミュレーション (「C シミュレーション」および「C/RTL 協調シミュレーション」) と呼ばれま す。 合成前に、合成する関数を C シミュレーションを使用したテストベンチで検証する必要があります。C テストベンチ には、Vitis HLS プロジェクトで合成される関数を呼び出す最上位関数 main() が含まれます。テストベンチには、そ の他の関数を含めることもできます。理想的なテストベンチには、次のような特徴があります。 • テストベンチにはセルフチェック機能があり、合成される関数からの結果が正しいかどうかを検証する。 • 結果が正しい場合はテストベンチから main() に値 0 を返し、正しくない場合は 0 以外の値を返す。

Vitis HLS の GUI で [Run C Simulation] ツールバー ボタン をクリックすると、次の図に示す [C Simulation Dialog] ダイアログ ボックスが開きます。

図 20: [C Simulation Dialog] ダイアログ ボックス

(35)

• [Launch Debugger]: C コードをコンパイルし、[Debug] パースペクティブを 開きます。[Debug] パースペクティブ から左上の [Synthesis] パースペクティブ ボタンをクリックすると、合成表示に戻ります。 • [Build Only]: ソース コードとテストベンチをコンパイルしますが、シミュレーションは実行しません。このオプ ションは、コンパイル プロセスをテストして、シミュレーション前にビルドに関する問題を解決するために使用 します。コマンド シェルからシミュレーションを実行可能な csim.exe ファイルが生成されます。 • [Clean Build]: コードをコンパイルする前に既存の実行ファイルおよびオブジェクト ファイルをプロジェクトから 削除します。 • [Optimizing Compile]: デフォルトではデザインはデバッグ情報をイネーブルにした状態でコンパイルされ、そのコ ンパイルを解析およびデバッグできるようになっています。[Optimizing Compile] オプションを使用すると、デザ インをコンパイルする際により高いレベルの最適化エフォートが使用されますが、デバッガーで必要とされる情 報は追加されません。これにより、コンパイル時間は増加する可能性がありますが、シミュレーション実行時間 は削減されます。

ヒント: [Launch Debugger] と [Optimizing Compile] オプションを同時に使用することはできません。[C Simulation Dialog] ダイアログ ボックスでいずれかをオンにすると、もう一方がオフになります。

• [Enable Pre-Synthesis Control Flow Viewer]: [Pre-Synthesis Control Flow] ビュー に説明する合成前の制御フロー レポートを生成します。

• [Input Arguments]: テストベンチの main() 関数で必要となる入力を指定します。

• [Do not show this dialog box again]: [C Simulation Dialog] ダイアログ ボックスが表示されなくなります。 ヒント: [Project] → [Project Settings] をクリックし、[Simulation settings] を選択すると、[C Simulation Dialog] ダイ アログ ボックスを再び表示されるようになります。

ダイアログ ボックスで [OK] をクリックすると、C コードがコンパイルされて、C シミュレーションが実行されます。 シミュレーションの実行中、コンソールにテストベンチからの printf 文が表示されます。シミュレーションが問題 なく完了すると、コンソールに次のメッセージが表示されます。

INFO: [SIM 211-1] CSim done with 0 errors.

INFO: [SIM 211-3] *************** CSIM finish ***************

Finished C simulation.

シミュレーションが正常に実行されなかった場合は、エラーが返されます。

@E Simulation failed: Function 'main' returns nonzero value '1'.

ERROR: [SIM 211-100] 'csim_design' failed: nonzero return value.

INFO: [SIM 211-3] *************** CSIM finish ***************

[Launch Debugger] オプションを選択すると、自動的に [Debug] パースペクティブに 切り替わり、次の図に示すよう なデバッグ環境が開きます。シミュレーションが開始し、コードをステップ実行して関数を確認およびデバッグでき ます。これは完全なデバッグ環境で、コードをステップインおよびステップオーバーしたり、ブレークポイントを指 定したり、コードで変数の値を設定したりできます。

(36)

図 21: C デバッグ環境 ヒント: [Synthesis] パースペクティブ ボタンをクリックすると、標準の合成ウィンドウに戻ります。

テストベンチの記述

Vitis HLS デザイン フローを使用する場合、適切に記述されていない C 関数を合成して、インプリメンテーションの 詳細を解析して関数が正しく機能しない原因をつきとめるのは時間の無駄です。そのため、高位合成の最初の手順は、 適切に記述されたテストベンチを使用してシミュレーションを実行し、RTL コードを生成する前に C 関数が正しいこ とを検証することです。適切なテストベンチを記述すると、C 関数を RTL シミュレーションよりも短時間で実行でき るので、生産性が上がります。C を使用してアルゴリズムを開発して合成前に検証する方が、RTL コードを開発して デバッグするよりもはるかに高速です。 Vitis HLS ではこのテストベンチを使用して、C シミュレーションがコンパイルされて実行されます。コンパイルする 際に [Launch Debugger] オプションをオンにすると、C デバッグ環境を開いて、C シミュレーションを詳細に解析で きます。Vitis HLS では、Vitis HLS での C/RTL 協調シミュレーションに説明されているように、このテストベンチを 使用して合成の RTL 出力が検証されます。 テストベンチには、main() 関数と、必要なサブ関数が含まれます。これらのサブ関数は、Vitis HLS での合成に指定 されている最上位関数に含まれません。main 関数は、スティミュラスを供給して合成用の関数を呼び出し、その出力 を消費して検証することにより、合成用の最上位関数が正しく機能するかどうかを検証します。

図 4: Vitis HLS の GUI の Welcome ページ
図 9: [Select Top Function] ダイアログ ボックス
図 10: テストベンチの追加/削除
図 11: [Solution Configuration] ページ 13. プロジェクトの特定の設定における指示子、結果、およびレポートを格納するソリューションの名前を指定しま す。プロジェクト設定の異なる複数のソリューションを使用して、最適なソリューションをすばやく見つけるこ とができます。 14
+7

参照

関連したドキュメント

This device has been designed to comply with applicable requirements for exposure to radio waves, based on scientific guidelines that include margins intended to assure the safety

メイン プログラムウィンドウでの作業 [スタート] → [すべてのプログラム] → [Acronis] → [PrivacyExpert] → [Acronis Pricacy Expert

・蹴り糸の高さを 40cm 以上に設定する ことで、ウリ坊 ※ やタヌキ等の中型動物

 Rule F 42は、GISC がその目的を達成し、GISC の会員となるか会員の

□ ゼミに関することですが、ゼ ミシンポの説明ではプレゼ ンの練習を主にするとのこ とで、教授もプレゼンの練習

地点と KAAT の共同制作作品。平成 29 年、地点「忘れる日本人」で鮮烈な KAAT デビューを飾った作家、松原俊太郎による 新作を上演する。.. 9

液位「高高」側 ※1 の信号によ り警報が発生することを確 認する。. 液位「高高」側 ※1