SystemC モデルを定義するには、次の手順を実行します。
- ヘッダー ファイル "xtlm_ap_ctrl.h" と "xtlm.h" を含めます。
- サポートされるカーネルの種類に基づいた定義済みのクラス (
ap_ctrl_chain
、ap_ctrl_hs
など) からカーネルを派生させます。 - カーネルで使用される AXI インターフェイスを宣言および定義します。
- 適切なアドレス オフセットとサイズを指定して、必要なカーネル引数を追加します。
- カーネル本体を
main()
スレッドに書き込みます。
このプロセスについては、次のコード例で示します。
SystemC モデルを作成する場合、サポートされている制御プロトコル (xtlm_ap_ctrl_chain
、xtlm_ap_ctrl_hs
、および xtlm_ap_ctrl_none
) に基づいて、クラスからカーネルを派生させます。SystemC モデルを作成するには、次の構造を使用します。
#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
クラスから継承して指定されます。
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
ビットが設定されるまで待機します。その際、カーネルは次のように引数値を処理できます。
- カーネルは、XRT から信号が開始されるまで待機します (
ev_ap_start
)。 - カーネル引数は、SystemC モデルの変数にマップされます。
- 入力が読み取られます。
- ベクトルが追加され、結果が取り込まれます。
- 出力はホストに書き戻されます。
- 終了した信号が XRT に送信されます (
ap_done
)。