新規 Vitis HLS プロジェクトの作成
新規プロジェクトを作成するには、Welcome ページで Create New Project リンクをクリックするか、 メニュー コマンドをクリックします。これにより、次の図に示す New Vitis HLS Project ウィザードが開きます。
次の手順に従って新規 Vitis HLS プロジェクトを作成します。
- プロジェクト名を指定します。この名前は、プロジェクト ファイルおよびフォルダーが保存されるディレクトリ名としても使用されます。
- プロジェクトの保存ディレクトリを指定します。重要: Windows オペレーティング システムではパスの長さが 255 文字までに制限されており、これが Vitis ツールに影響する可能性があります。この問題を回避するには、プロジェクトの作成、新規ファイルの追加を実行する際に、ディレクトリの場所および名前をできるだけ短くしてください。
- Next をクリックして [Add//Remove Files] ページに進みます。
Add/Remove Files ページでは、プロジェクトに C/C++ ソース ファイルを追加できます。
図 2: Add/Remove Files ページ - Add Files をクリックし、プロジェクトに追加するソース コード ファイルを選択します。
Add Files ボタンまたは
add_filesTcl コマンドを使用してプロジェクトにヘッダー ファイル (拡張子.h) を追加しないでください。Vitis HLS では、次のディレクトリがコンパイル検索パスに自動的に追加されます。- Vitis HLS のプロジェクト ディレクトリが含まれる作業ディレクトリ。
- プロジェクトに追加された C/C++ ファイルを含むディレクトリ。
これらのディレクトリに含まれるヘッダー ファイルは、コンパイル中に自動的にプロジェクトに追加されます。Edit CFLAGS 関数を使用してほかのインクルード パスを指定することもできます。
- オプションで New File をクリックして、プロジェクトに追加する新しいソース ファイルを作成します。[File Browser] ダイアログ ボックスが表示されるので、作成するファイルの名前と場所を指定します。 ヒント: 新しいファイルを新規プロジェクト用に作成されるディレクトリに保存する場合は、プロジェクトを作成した後に作成するようにしてください。
- ファイルを選択し、Edit
CFLAGS または Edit CSIMFLAGS をクリックすると、コンパイラ フラグまたはシミュレーション フラグを追加するダイアログ ボックスが表示されます。
次の図に、CFLAGS の例を示します。
図 3: [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
- 入れ子の関数を含むデザインに必要な指示子を定義します。
- Remove をクリックすると、不要なファイルまたは間違って追加してしまったファイルをプロジェクトから削除できます。
- Top
Function フィールドの横にある Browse ボタンをクリックし、追加したファイルに含まれる関数およびサブ関数をリストします。
次の図に示す Select Top Function ダイアログ ボックスが表示されます。このダイアログ ボックスには、追加したファイルに含まれる関数がリストされ、HLS 合成で最上位とする関数を指定できます。
図 4: Select Top Function ダイアログ ボックス ヒント: プロジェクトにファイルを追加していない場合は、最上位関数の名前を入力できます。ファイルを追加している場合は、使用可能な関数から選択できます。 - ファイルを追加して最上位関数を指定したら、Add/Remove
Files ページで Next をクリックします。
テストベンチを追加/削除する [Add/Remove Files] ページでは、テストベンチおよびほかの必要なファイルを追加できます。
図 5: テストベンチの追加/削除 - C ソース ファイルと同様に、Add Files をクリックしてテストベンチを追加します。コンパイラ オプションを含めるには、Edit CFLAGS または Edit CSIMFLAGS をクリックします。
- C ソース ファイルと共に、テストベンチで読み込まれるすべてのファイルをプロジェクトに追加する必要があります。上の図の例では、テストベンチで入力スティミュラスを供給する in.dat ファイルと、予測結果を含む out.golden.dat ファイルが読み込まれます。テストベンチがこれらのファイルにアクセスするので、これらもプロジェクトに追加する必要があります。ヒント: テストベンチ ファイルがディレクトリにある場合は、個々のファイルを追加する代わりに、Add Folder をクリックしてでディレクトリ全体を追加できます。
- プロジェクトにテストベンチを追加することは必須ではありません。Next をクリックして次に進みます。
プロジェクトのソリューションを設定する Solution Configuration ページが表示されます。
図 6: Solution Configuration ページ - プロジェクトの特定の設定における指示子、結果、およびレポートを格納するソリューションの名前を指定します。プロジェクト設定の異なる複数のソリューションを使用して、最適なソリューションをすばやく見つけることができます。
- クロック周期を ns で指定するか、周波数を MHz (150 MHz など) で指定します。詳細は、クロック周波数の指定を参照してください。
- クロックのばらつきを指定します。合成で使用されるクロック周期は、クロック周期からクロックのばらつきを引いた値になります。Vitis HLS では、内部モデルを使用して各デバイスの演算の遅延が見積もられます。[Uncertainty] に入力するクロックのばらつきの値では、RTL 合成、配置配線によるネット遅延の増加を考慮に入れた制御可能な差分を指定できます。ns で指定するか、クロック周期のパーセントで指定します。デフォルトのクロックのばらつきは、クロック周期の 12.5% です。
- 参照ボタン (…) をクリックして [Device Selection Dialog] ダイアログ ボックスを開き、ターゲット デバイスを選択します。
図 7: [Device Selection] ダイアログ ボックス [Device Selection Dialog] ダイアログ ボックスでは、プロジェクトのデバイスをパーツまたはボード (Alveo™ データセンター アクセラレータ カードなど) として選択できます。Search フィールドに検索文字列を入力してフィルターできます。
- Flow Target ドロップダウン リストから Vitis Kernel Flow Target を選択すると、Vitis カーネル フローのイネーブル に説明されているようにプロジェクトが設定され、合成済みプロジェクトからのコンパイル済みザイリンクス オブジェクト ファイル (.xo) がイネーブルになります。Vitis アプリケーション アクセラレーション開発フロー用のカーネルを開発するのに Vitis HLS を使用する場合は、この設定を使用する必要があります。
- Finish をクリックします。次の図に示すように新しい Vitis HLS プロジェクトが開きます。
図 8: 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) で定義されているカーネル要件を満たす必要があります。
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 を使用してバースト トランザクションを管理したりできます。
ソースの操作
次の図に、Vitis HLS デザイン フローと、その入力ファイルおよび出力ファイルを示します。
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)。
この出力から、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 リポジトリの表示を使用すると便利です。ユーザー独自のリポジトリを使用する際にこの機能を使用すると、プロジェクトのソース コードを管理したり、外部リポジトリにリンクしてファイルをダウンロードしたりできます。
Vitis HLS の GUI の左下に [Git Repositories] ビューが表示されます。
- Clone a Git Repository をクリックします。次の図に示す Clone Git Repository ウィザードが開きます。
図 10: Clone Git Repository ウィザード - このウィザードの [Source Git Repository] ページに https://github.com/Xilinx/HLS-Tiny-Tutorials/tree/2020.1 と入力します。
チュートリアルおよびサンプル に説明されている Vitis HLS チュートリアル リポジトリが設定されます。Next をクリックします。
- [Branch Selection] ページで、リポジトリの master ブランチまたは別の適切なブランチを選択します。Next をクリックします。
- [Local Destination] ページの Destination Directory でリポジトリをクローンするディレクトリを指定します。Next をクリックします。
Vitis HLS チュートリアル リポジトリからのサンプルがリストされます。これで、これらのファイルをプロジェクトのソース ファイルとして使用できるようになります。プロジェクトを管理しやすくするため、既存のローカル リポジトリを Vitis HLS に追加したり、新しいリポジトリを作成したりできます。
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 ライブラリ
Vitis HLS で使用可能な Vitis アクセラレーション ライブラリには、算術演算、統計、線形代数、DSP などの一般的な関数用のものだけでなく、ビジョンおよび画像処理、数理ファイナンス、データベースおよびデータ分析、データ圧縮などのドメイン特化アプリケーション用のものがあります。ライブラリは、https://github.com/Xilinx/Vitis_Libraries からダウンロードして使用できます。
Vitis ライブラリには、ザイリンクス デバイスへのインプリメンテーション用に最適化された関数およびコンストラクトが含まれます。これらのライブラリを使用すると、高い結果の品質 (QoR) を達成できるようになり、合成結果がリソースを最適に使用したパフォーマンスの優れたデザインにになります。ライブラリは C および C++ で提供されているので、最上位関数に組み込んで、合成前に論理的に問題ないかどうかをシミュレーションで検証できます。
ヘッダー ファイル問題の解決
デフォルトの Vitis HLS の GUI では、すべてのコード参照を解決するために、すべてのヘッダー ファイルが解析されます。次の図に示すように、未解決の参照は GUI でハイライトされます。
- 左側のサイドバー: 未解決の参照のソース コードの行番号がハイライトされます。
- 右側のサイドバー: 未解決の参照がファイル内でマークされます。
未解決の参照は、ヘッダー ファイル (拡張子は .h または .hpp) で定義されたコードを解決できない場合に発生します。未定義の参照の主な原因は、次のとおりです。
- コードが最近ファイルに追加された。
コードが新しい場合、ヘッダー ファイルが保存されていることを確認します。ヘッダー ファイルを保存すると、Vitis HLS でヘッダー ファイルに自動的にインデックスが付けられ、コード参照がアップデートされます。
- ヘッダー ファイルが検索パスに含まれない。
#include文を使用して C コードにヘッダー ファイルが含まれるようにし、ヘッダー ファイルがソースの C ファイルと同じディレクトリに含まれるか、ヘッダー ファイルのディレクトリが検索パスに含まれるようにします。ヒント: ソース ファイルの検索パスを追加するには、新規 Vitis HLS プロジェクトの作成 に説明するように、 をクリックして Synthesis または Simulation をクリックし、ソース ファイルの Edit CFLAGs ボタンを使用します。 - 自動インデックスがディスエーブルになっている。
Vitis HLS ですべてのヘッダー ファイルが自動的に解析されるようにします。 をクリックして Project Settings ダイアログ ボックスを開きます。General をクリックし、Disable Parsing All Header Files がオフになっていることを確認します。
ソース コードのコメント表示の解決
言語環境によっては、英語以外の言語のコメントが文字化けすることがあります。これは、次の手順で修正できます。
- Explorer ビューでプロジェクトを右クリックし、Properties をクリックします。
- ダイアログ ボックスの左側の Resource セクションを選択します。
- Text file encoding で Other をオンにし、ドロップダウン リストから適切なエンコードを選択します。
- Apply and Close をクリックして変更を確定します。
コンフィギュレーション オプションの設定
プロジェクトおよびソリューションを作成したら、コンフィギュレーション設定コマンド config_xxx を使用して、Vitis HLS ツールのデフォルト設定を指定できます。これらのコマンドの詳細は、コンフィギュレーション コマンド を参照してください。これらのコマンドを設定するには、 をクリックします。現在アクティブなソリューションの Solution Settings ダイアログ ボックスが開きます。
- 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 をクリックして現在のソリューションにコマンドを追加します。
クロック周波数の指定
C および C++ デザインでは、クロックは 1 つしかサポートされず、デザイン内のすべての関数に同じクロックが適用されます。
クロック周期 (ns) を指定するには、 をクリックします。デフォルトのクロック周期は 10 ns です。Vitis HLS では、クロックのばらつきの概念を使用して、ユーザー定義のタイミング マージンが提供されています。デザインのクロックのばらつきも、Solutions Setting ダイアログ ボックスで指定できます。クロックのばらつきを指定しない場合、デフォルトではクロック周期の 27% に設定されます。
Vitis HLS では、クロック周波数とデバイス ターゲット情報を使用して演算のタイミングが見積もられますが、最終的なコンポーネント配置およびネット配線は判断できません。配置配線は、出力 RTL の論理合成で実行されるからです。そのため、Vitis HLS では正確な遅延は判断できません。
Vitis HLS では、次の図に示すようにクロック周期からクロックのばらつきを差し引いて、合成に使用されるクロック周期が計算されます。
これにより、ユーザー指定のマージンが使用されて、論理合成や配置配線などのダウンストリーム プロセスで操作を完了するのに十分なタイミング マージンが供給されます。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 では、特定のパスのタイミング要件が満たされない場合でも、それ以外のすべてのパスではタイミングが達成されます。これにより、ダウンストリームの論理合成でエラーのあったパスに対して、より高い最適化レベルを使用したり、特別な処理を実行することで、タイミングを満たすことができるかどうかを評価できます。
合成が終了すると、デザイン レポートが階層の各関数ごとに生成され、ソリューションのレポート フォルダーから表示できます。デザイン全体のワースト ケース タイミングは、各関数レポートにレポートされます。階層の各レポートをすべて参照する必要はありません。
タイミング違反が最適化やダウンストリーム プロセスで修正できないほど大きい場合は、より高速のテクノロジをターゲットする前に、レイテンシの指定方法およびインプリメンテーション コアを指定する方法を見直してみてください。