C++ コードの生成 - 2023.2 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2023-11-15
Version
2023.2 日本語

次の図は、Generate コマンドを使用した後の Vitis Model Composer からの HLSC++ コード出力を示しています。C++ コードは、System Generator 出力用の IP パッケージを生成する際の中間段階として、または AMD Vitis™ HLS の指示子またはプラグマを使用して C++ コードを最適化できるように指定したファイルとして出力されます。

図 1. C++ 出力ファイル

Model Composer で生成されたファイルには、コンパイルされたサブシステムの内容と階層が反映されます。この場合、Vitis Model Composer チュートリアルの「Model Composer」セクションに示すように、サブシステムは Edge Detection 関数です。次の図は、Edge Detection サブシステムの内容を示しています。

図 2. Edge Detection サブシステム
Edge_Detection.cpp ファイルでは次のインクルード ファイルが指定されており、これらのインクルード ファイルによりサブシステムで使用されるさまざまな Model Composer ブロック用に生成されたコードが組み込まれます。
#include "Edge_Detection.h"
#include "GradMagnitude.h"
#include "SobelFilter.h"

次の図は、Edge Detection サブシステム用に生成されたコードを示しています。関数に追加されたプラグマでは、その関数のシグネチャと戻り値用に関数プロトコルと I/O ポート プロトコルが指定されています。プラグマを使用すると、Vitis HLS で合成されたソリューションが指示されるので、インプリメントされた RTL のパフォーマンスを向上できます。

Edge_Detection(hls::stream< ap_axiu<16, 1, 1, 1> >& Y, 
    hls::stream< ap_axiu<16, 1, 1, 1> >& Y_Out)
{
    #pragma HLS INTERFACE s_axilite port=return
    #pragma HLS INTERFACE axis bundle=image_out port=Y_Out
    #pragma HLS INTERFACE axis bundle=input_vid port=Y
    #pragma HLS dataflow
    uint8_t core_Y[360][640];
    #pragma HLS stream variable=core_Y dim=2 depth=1
    uint8_t core_Cb[360][320];
    #pragma HLS stream variable=core_Cb dim=2 depth=1
    uint8_t core_Cr[360][320];
    #pragma HLS stream variable=core_Cr dim=2 depth=1
    uint8_t core_Y_Out[360][640];
    #pragma HLS stream variable=core_Y_Out dim=2 depth=1
    uint8_t core_Cb_Out[360][320];
    #pragma HLS stream variable=core_Cb_Out dim=2 depth=1
    uint8_t core_Cr_Out[360][320];
    #pragma HLS stream variable=core_Cr_Out dim=2 depth=1
    fourier::AxiVideoStreamAdapter< uint8_t >::readStreamVf0(Y, 
        reinterpret_cast< uint8_t* >(core_Y), reinterpret_cast< uint8_t* >(
        core_Cb), reinterpret_cast< uint8_t* >(core_Cr), 360, 640);
    Edge_Detection_core(core_Y, core_Cb, core_Cr, core_Y_Out, core_Cb_Out, 
        core_Cr_Out);
    fourier::AxiVideoStreamAdapter< uint8_t >::writeStreamVf0(Y_Out, 
        reinterpret_cast< uint8_t* >(core_Y_Out), reinterpret_cast< uint8_t* >(
        core_Cb_Out), reinterpret_cast< uint8_t* >(core_Cr_Out), 360, 640);
}

最後に、出力フォルダーに生成された run_hls.tcl ファイルに注目してください。これは生成された出力ファイルで Vitis HLS を実行するために使用可能な Tcl スクリプトで、プロジェクトおよびソリューションを作成し、C++ コードから RTL を合成して、デザインを Model Composer HDL モデルにエクスポートします。Vitis HLS プロジェクトにはそれぞれ 1 セットの C/C++ コードが含まれており、複数のソリューションを含めることができます。各ソリューションに異なる制約および最適化指示子を設定できます。詳細は、 『Vitis 高位合成ユーザー ガイド』 (UG1399) を参照してください。

run_hls.tcl スクリプトは、AMD Vitis™ HLS コマンド プロンプトから次のように実行できます。

  1. AMD Vitis™ HLS コマンド プロンプトを開きます。
    • Windows の場合、Start > All Programs > Xilinx Design Tools > Vitis HLS 2023.2 > Vitis HLS > Vitis HLS 2023.2 Command Prompt をクリックします。
    • Linux では、新しいシェルを開き、<install_dir>/Vitis_HLS/<version>/settings64.sh スクリプトを読み込んでシェルを設定します。
  2. Vitis Model Composer Hub の手順に従って、コマンド プロンプトから、出力を生成したときに Model Composer Hub の設定ダイアログ ボックスの Code Directory で指定したディレクトリの親フォルダーに移動します。次に例を示します。
    cd C:/Data
  3. コマンド プロンプトで C ディレクトリにある run_hls.tcl スクリプトを実行します。
    vitis_hls -f ./code/run_hls.tcl
AMD Vitis™ HLS で C++ コードから RTL が合成され、AMD Vitis™ HLS プロジェクトとソリューションが生成されます。AMD Vitis™ HLS プロジェクトは、Code directory で指定したディレクトリに移動して、次のようにプロジェクト名を付けて実行すると開くことができます。
vitis_hls -p ./Edge_Detection_proj

AMD Vitis™ HLS プロジェクトが GUI モードで開きます。