新しいディレクトリは、Hub ブロックで code directory
に指定した名前で作成されます。code ディレクトリにはさまざまなサブディレクトリがあります。このセクションでは、次の図で赤で囲まれている src_aie/ および Makefile に注目します。その他のサブディレクトリについては、その後のセクションで説明します。
ファイル/ディレクトリ | ファイル/サブディレクトリ | 説明 |
---|---|---|
src_aie | Subsystem_Name.h |
AI エンジン データフロー グラフを指定するヘッダー ファイル。 注記:
Subsystem_Name は、Model Composer モデルで指定された最上位サブシステムから抽出された固有の文字列です。
|
Subsystem_Name.cpp | Subsystem_Name.h で指定されたデータフロー グラフをシミュレーションするテストベンチ。 | |
makefile | Model Composer Hub ブロックで指定した aiecompiler オプションが含まれます。 | |
makefile |
データフロー グラフをコンパイルおよびシミュレーションするコマンドが含まれます。 コマンド ラインから |
Vitis Model Composer で src_aie ディレクトリに生成されるファイルには、コンパイルされたサブシステムの内容と階層が反映されます。ここでは、 『Vitis Model Composer チュートリアル』 (UG1498) のデザインから作成された aie_system をサブシステムとして使用します。次の図に、サブシステムとしてまとめられた、ブロックとしてインポートされたカーネル関数の接続を示します。
サブシステム aie_system に生成されたコードは次のとおりです。
aie_system.h
#ifndef __XMC_AIE_SYSTEM_H__
#define __XMC_AIE_SYSTEM_H__
#include <adf.h>
#include "kernels/inc/hb_27_2i.h"
#include "kernels/inc/polar_clip.h"
#include "kernels/inc/hb_27_2d.h"
class Aie_system_base : public adf::graph {
public:
adf::kernel fir_27t_sym_hb_2i_0;
adf::kernel polar_clip_0;
adf::kernel fir_27taps_symm_hb_dec2_0;
public:
adf::input_port In1;
adf::output_port Out1;
Aie_system_base() {
// create kernel fir_27t_sym_hb_2i_0
fir_27t_sym_hb_2i_0 = adf::kernel::create(fir_27t_sym_hb_2i);
adf::source(fir_27t_sym_hb_2i_0) = "kernels/src/hb_27_2i.cpp";
// create kernel polar_clip_0
polar_clip_0 = adf::kernel::create(polar_clip);
adf::source(polar_clip_0) = "kernels/src/polar_clip.cpp";
// create kernel fir_27taps_symm_hb_dec2_0
fir_27taps_symm_hb_dec2_0 = adf::kernel::create(fir_27taps_symm_hb_dec2);
adf::source(fir_27taps_symm_hb_dec2_0) = "kernels/src/hb_27_2d.cpp";
// create kernel constraints fir_27t_sym_hb_2i_0
adf::runtime<ratio>( fir_27t_sym_hb_2i_0 ) = 0.9;
// create kernel constraints polar_clip_0
adf::runtime<ratio>( polar_clip_0 ) = 0.9;
// create kernel constraints fir_27taps_symm_hb_dec2_0
adf::runtime<ratio>( fir_27taps_symm_hb_dec2_0 ) = 0.9;
// create nets to specify connections
adf::connect< adf::window<512,64> > net0 (In1, fir_27t_sym_hb_2i_0.in[0]);
adf::connect< adf::window<1024>, adf::stream > net1 (fir_27t_sym_hb_2i_0.out[0], polar_clip_0.in[0]);
adf::connect< adf::stream, adf::window<1024,128> > net2 (polar_clip_0.out[0], fir_27taps_symm_hb_dec2_0.in[0]);
adf::connect< adf::window<512> > net3 (fir_27taps_symm_hb_dec2_0.out[0], Out1);
}
};
class Aie_system : public adf::graph {
public:
Aie_system_base mygraph;
public:
adf::input_plio In1;
adf::output_plio Out1;
Aie_system() {
In1 = adf::input_plio::create("In1",
adf::plio_32_bits,
"./data/input/In1.txt");
Out1 = adf::output_plio::create("Out1",
adf::plio_32_bits,
"Out1.txt");
adf::connect< > (In1.out[0], mygraph.In1);
adf::connect< > (mygraph.Out1, Out1.in[0]);
}
};
#endif // __XMC_AIE_SYSTEM_H__
Vitis Model Composer により、Hub ブロックで指定されたサブシステム名に対応するデータフロー グラフを含むグラフ ヘッダー ファイル aie_system.h が自動的に生成されます。AI エンジン カーネルまたはグラフ間の接続と、AI エンジン カーネル ブロックで指定されたウィンドウ サイズ、ウィンドウ マージンなどの設定パラメーターは、生成されたグラフ コードに自動的に反映されます。
Vitis Model Composer では、aie_system.cpp ファイルも生成されます。これは、制御 API を使用してシミュレーションを初期化、実行、および終了する main()
関数を含む制御プログラムです。
aie_system.cpp
#include "aie_system.h"
// instantiate cardano dataflow graph
Aie_system mygraph;
// initialize and run the dataflow graph
#if defined(__AIESIM__) || defined(__X86SIM__)
int main(void) {
mygraph.init();
mygraph.run();
mygraph.end();
return 0;
}
#endif
制限
- 最上位サブシステムの
output
ポートが同期ランタイム パラメーター ポートに接続されている場合、AI エンジン コードは生成できません。 - 入力ランタイム パラメーター ポートの値は、生成されたグラフ実行の開始時に 1 回だけアップデートできます。