SystemC モデルのコーディング - 2022.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 日本語

SystemC モデルを定義するには、次の手順を実行します。

  1. ヘッダー ファイル "xtlm_ap_ctrl.h""xtlm.h" を含めます。
  2. サポートされるカーネルの種類に基づいた定義済みのクラス (ap_ctrl_chainap_ctrl_hs など) からカーネルを派生させます。
  3. カーネルで使用される AXI インターフェイスを宣言および定義します。
  4. 適切なアドレス オフセットとサイズを指定して、必要なカーネル引数を追加します。
  5. カーネル本体を main() スレッドに書き込みます。

このプロセスについては、次のコード例で示します。

SystemC モデルを作成する場合、サポートされている制御プロトコル (xtlm_ap_ctrl_chainxtlm_ap_ctrl_hs、および xtlm_ap_ctrl_none) に基づいて、クラスからカーネルを派生させます。SystemC モデルを作成するには、次の構造を使用します。

ヒント: 次の例は、GitHub の Vitis_Accel_Examples にある単純なベクター加算 (VADD) デザイン例に基づいています。
#include "xtlm.h"
#include "xtlm_ap_ctrl.h"
 
class vadd : public xsc::xtlm_ap_ctrl_hs
{
    public:
        SC_HAS_PROCESS(vadd);
        vadd(sc_module_name name, xsc::common_cpp::properties& _properties):
        xsc::xtlm_ap_ctrl_hs(name)
        {
            DEFINE_XTLM_AXIMM_MASTER_IF(in1, 32);
            DEFINE_XTLM_AXIMM_MASTER_IF(in2, 32);
            DEFINE_XTLM_AXIMM_MASTER_IF(out_r, 32);
 
           ADD_MEMORY_IF_ARG(in1,   0x10, 0x8);
           ADD_MEMORY_IF_ARG(in2,   0x18, 0x8);
           ADD_MEMORY_IF_ARG(out_r, 0x20, 0x8);
           ADD_SCALAR_ARG(size,     0x28, 0x4);
 
            SC_THREAD(main_thread);
        }
 
 
        //! Declare aximm interfaces..
        DECLARE_XTLM_AXIMM_MASTER_IF(in1);
        DECLARE_XTLM_AXIMM_MASTER_IF(in2);
        DECLARE_XTLM_AXIMM_MASTER_IF(out_r);
 
        //! Declare scalar args...
        unsigned int size;
 
        void main_thread()
        {
            wait(ev_ap_start); //! Wait on ap_start event...
 
            //! Copy kernel args configured by host...
            uint64_t  in1_base_addr = kernel_args[0];
            uint64_t  in2_base_addr = kernel_args[1];
            uint64_t  out_r_base_addr = kernel_args[2];
            size = kernel_args[3];
 
            unsigned data1, data2, data_r;
            for(int i = 0; i < size; i++) {
                in1->read(in1_base_addr + (i*4), (unsigned char*)&data1);  //! Read from in1 interface
                in2->read(in2_base_addr + (i*4), (unsigned char*)&data2);  //! Read from in2 interface
 
                //! Add data1 & data2 and write back result
                data_r = data1 + data2;                //! Add
                out_r->write(out_r_base_addr + (i*4), (unsigned char*)&data_r); //! Write the result
            }
 
            ap_done(); //! completed Kernel computation...
        }
 
};

インクルード ファイルは、$XILINX_Vivado/data/systemc/simlibs/ フォルダーの下の Vitis インストール階層で使用できます。

前述のように、カーネル名は SystemC モデルのクラスを定義するときに xtlm_ap_ctrl_hs クラスから継承して指定されます。

次のに示すように、カーネル引数に関連付けられた AXI インターフェイスを宣言して定義する必要があります。
DECLARE_XTLM_AXIMM_MASTER_IF(in1);
DEFINE_XTLM_AXIMM_MASTER_IF(in1, 32);
宣言は、インターフェイス タイプを引数に関連付けます。定義では、インターフェイスのデータ幅を定義します。また、次に示すように、カーネル引数のレジスタ オフセットとサイズも宣言する必要があります。
ADD_MEMORY_IF_ARG(in1, 0x10, 0x8);

カーネルの引数、オフセット、およびサイズを指定する場合、これらの値は、ソフトウェア制御可能なカーネル および XRT 管理のカーネルの制御要件 で説明されるように、XRT 管理のカーネルの AXI4-Lite インターフェイスに反映される値と一致する必要があります。

次のアドレス 0x10 は、XRT でカーネルの実行を管理するために予約されています。カーネル引数は、0x10 以降から指定できます。最も重要なのは、SystemC モデルで指定された引数、オフセット、およびサイズが、Vitis HLS または RTL カーネルで使用される値と一致する必要があるということです。

カーネルは SystemC の main_thread で実行されます。このスレッドは、ホスト アプリケーションまたは XRT によって ap_start ビットが設定されるまで待機します。その際、カーネルは次のように引数値を処理できます。

  1. カーネルは、XRT から信号が開始されるまで待機します (ev_ap_start)。
  2. カーネル引数は、SystemC モデルの変数にマップされます。
  3. 入力が読み取られます。
  4. ベクトルが追加され、結果が取り込まれます。
  5. 出力はホストに書き戻されます。
  6. 終了した信号が XRT に送信されます (ap_done)。