PLIO ベースのシミュレーションの場合、AI エンジン シミュレータは CSV ファイル形式をサポートします。この新しい形式は、トランザクションをより詳細に制御し、AI エンジンへのサイクルごとのトラフィック挿入を可能にします。このファイル形式は高い柔軟性を備えており、トラフィック挿入に空のクロック サイクルを追加する、STALL
コマンドを使用して複数の空のサイクルを挿入する、および TLAST
と TKEEP
の値を明示的に指定することが可能です。このような機能により、複雑なシナリオをシミュレーションし、デザインのビヘイビアーを解析できます。
CSV ファイルを PLIO ベースの入力または出力に関連付けるには、グラフ PLIO の作成時に CSV ファイルを指定する必要があります。
adf::input_plio in = adf::input_plio::create("DataIn", adf::plio_32_bits, "data/input.csv");
adf::input_plio out = adf::output_plio::create("DataOut", adf::plio_32_bits, "data/output.csv");
入力ファイル
AI エンジン シミュレータへの入力 CSV ファイルは、カンマ区切りの複数のデータ列として定義できます。ファイルの最初の行は、ヘッダーです。ヘッダー行は、CMD
列、データ D
列、TLAST
列、TKEEP
列として定義されます。データ D
列の数は、入力されるカーネル データの PLIO バス幅/データ幅と等しくする必要があります。たとえば、次のヘッダーは、PLIO のバス幅が 32 ビット、データ幅が int16 で提供されるデータに対応しています。したがって、ヘッダー行に 2 つのデータ サンプル D
列があります。
CMD, D, D, TLAST, TKEEP
ヘッダー行に続く行にデータ入力を提供するには、DATA
コマンドを使用する必要があります。
CMD, D, D, TLAST, TKEEP
DATA, 16, 20, 0, -1
DATA, 15, 11, 0, -1
STALL
コマンドは、データ トラフィックに挿入される空サイクル数を指定するために使用する必要があります。このコマンドは、入力トラフィックのバック プレッシャーを模倣するため、実際のデータ入力をシミュレーションするのに役立ちます。
CMD, D, D, TLAST, TKEEP
DATA, 16, 20, 0, -1
DATA, 15, 11, 0, -1
STALL:100
既存の TXT ファイル形式を CSV 形式に変換するには、python スクリプト aiesim_convert_plio_txt2csv.py
を次のように使用します。
$XILINX_VITIS/data/emulation/scripts/aiesim_convert_plio_txt2csv.py -txt <input txt file> --datawidth <n> --buswidth <n>
-
--datawidth <n>
オプション: AI エンジン カーネルのデータ幅をビット単位で指定します。このオプションは必須です。 -
--buswidth <n>
オプション: PLIO のバス幅をビット単位で指定します。このオプションは必須です。 -
--complex
: オプションの引数であり、AI エンジン カーネルのデータ型を複素数型に指定します。
列 | 説明 |
---|---|
CMD |
パーサーが処理する定義済みキーワード セット。有効な値は、
|
D |
|
TKEEP |
TKEEP 列を使用して、D (データ) 列の処理方法を指定できます。PLIO バス幅によって、TKEEP 列の設定可能な値とその影響は異なります。 32 ビットの PLIO バス幅:
64 ビットの PLIO バス幅:
128 ビットの PLIO バス幅:
次の例では、32 ビットのデータ型、64 ビットの PLIO バス幅を表す CSV ファイルについて、TKEEP の適切な組み合わせと、シミュレーション時のその影響 (コメント) を示します。
|
TLAST |
|
CMD,D,D,TLAST,TKEEP
DATA,3,2, ,
データ型 | PLIO 32 ビット | PLIO 64 ビット | PLIO 128 ビット |
---|---|---|---|
adf::input_plio in =
adf::input_plio::create("DataIn1", adf::plio_32_bits,
"input.csv");
|
adf::input_plio in =
adf::input_plio::create("DataIn1", adf::plio_64_bits,
"input.csv");
|
adf::input_plio in =
adf::input_plio::create("DataIn1", adf::plio_128_bits,
"input.csv");
|
|
int8 | 4 つのデータ列が想定されます。次に例を示します。
|
8 つのデータ列が想定されます。次に例を示します。
|
16 のデータ列が想定されます。次に例を示します。
|
int16 | 2 つのデータ列が想定されます。次に例を示します。
|
4 つのデータ列が想定されます。次に例を示します。
|
8 つのデータ列が想定されます。次に例を示します。
|
int32 | 1 つのデータ列が想定されます。
|
2 つのデータ列が想定されます。次に例を示します。
|
4 つのデータ列が想定されます。次に例を示します。
|
int64 | N/A | 1 つのデータ列が想定されます。
|
2 つのデータ列が想定されます。次に例を示します。
|
cint16 | 2 つのデータ列で 1 つの cint 値 (real, imag) を表すことが想定されます。次に例を示します。
|
4 つのデータ列で 2 つの cint 値 (実数、虚数) を表すことが想定されます。次に例を示します。
|
8 つのデータ列で 4 つの cint 値 (実数、虚数) を表すことが想定されます。次に例を示します。
|
cint32 | N/A | 2 つのデータ列で 1 つの cint 値 (実数、虚数) を表すことが想定されます。次に例を示します。
|
4 つのデータ列で 2 つの cint 値を表すことが想定されます。次に例を示します。
|
float | 1 つのデータ列が想定されます。次に例を示します。
|
2 つのデータ列が想定されます。次に例を示します。
|
4 つのデータ列が想定されます。次に例を示します。
|
cfloat | N/A | 2 つのデータ列で 1 つの浮動小数点 cfloat 値を表すことが想定されます。次に例を示します。
|
4 つのデータ列で 2 つの浮動小数点 cfloat 値を表すことが想定されます。次に例を示します。
|
bfloat16 | 2 つのデータ列が想定されます。次に例を示します。
|
4 つのデータ列が想定されます。次に例を示します。
|
8 つのデータ列が想定されます。次に例を示します。
|
adf::input_plio::create()
API で bool hex
パラメーターを True に設定してください。詳細は、
『AI エンジン カーネルおよびグラフ プログラミング ガイド』 (UG1076) の input_plio/output_plio を参照してください。CSV ファイル形式とシミュレーション時のエラー チェック
CSV に正しくないデータが含まれている場合、AI エンジン シミュレーションの実行時にエラー メッセージが表示されます。次に、CSV ファイルを入力とした場合のシミュレーション時のエラー チェック条件を一部示します。
エラーのシナリオ | CSV 入力 | エラー メッセージ |
---|---|---|
データ列の数が PLIO のバス幅/データ幅と等しくない | たとえば、buswidth =
64 および datawidth = 16 の場合、4 つの D 列が必要です。D 列が少ない:
|
[ERROR]: In <filename>, number of D columns is less than expected.Expected <expected_number> |
D 列が多い:
|
[ERROR]: In <filename>, number of D columns is more than expected.Expected <expected_number> | |
CSV のデータ列に部分的なデータしか提供されない | たとえば、buswidth = 64、datawidth = 16 の場合、4 つの D 列が必要です。4 つの D 列すべてにデータ サンプルを提供する必要があります。部分的なデータを提供する場合は、TLAST=1 に設定した適切な TKEEP を設定する必要があります。TKEEP の値によって、下位 32 ビットが有効か、または 64 ビットすべてが有効かを指定します。1 つのデータ サンプルが不足:
2 つのデータ サンプルが不足:
|
[ERROR]: In <filename>, in line <linenumber> , partial data is being fed to plio.To feed partial data, provide appropriate TKEEP value with TLAST = 1 |
CSV ファイルに空の行がある | 空の行:
|
This line is ignored by the tool. |
CMD 列または D 列に無効な値が指定されている | CMD 列の無効なコマンド:
D 列の無効なデータ サンプル:
|
[ERROR]: In <filename>, invalid command at <line number> |
データ列の順序が正しくない | D 列が隣どうしの横並びになっていません (順序が正しくない)。
|
[ERROR]: In <filename>, in the header row, DATA columns should be packed together. |
特定のデータ型についてデータ値が範囲外となっている | たとえば、データ型が int8 、バス幅が 32 の場合、データ サンプル 2323 は範囲外となります。 次のデータ値 2323 は範囲外です。
|
[ERROR]: In <filename>, out of range value is present.Datatype is <datatype_provided_from_graph>.Range is <corresponding_range> |
提供されるデータ値が無効 | D 列の無効なデータ サンプル:
|
[ERROR]: In <filename>, invalid data value is provided at <line number>. |
出力ファイル
入力 CSV ファイルと同様に、PLIO の出力ポートに対して生成される CSV ファイルについても指定できます。シミュレータは、適切な PLIO ポートに対応するシミュレーション出力を、指定された出力 CSV ファイルに書き込みます。
adf::output_plio out1 = adf::output_plio::create("DataOut1",adf::plio_32_bits,"output1.csv");
adf::output_plio out2 = adf::output_plio::create("DataOut2",adf::plio_64_bits,"output2.csv");
adf::output_plio out3 = adf::output_plio::create("DataOut3",adf::plio_128_bits,"output3.csv");
CSV ファイル出力には、TLAST
と TKEEP
データの両方が含まれます。各出力行にはタイムスタンプも含まれるため、シミュレーション実行時のデータ スループットを見積もることができます。タイムスタンプは、出力 CSV ファイルの最後の列として ns
単位で出力されます。
...
CMD, D, D, TLAST, TKEEP, TIME_NS
DATA:1, 0, 1, 0, -1, 720
DATA:1, 2, 3, 0, -1, 918.4
DATA:1, 4, 5, 0, -1, 1116.8
DATA:1, 6, 7, 0, -1, 1315.2
DATA:1, 8, 9, 0, -1, 1513.6
DATA:1, 10, 11, 0, -1, 1712
DATA:1, 12, 13, 0, -1, 1910.4
DATA:1, 14, 15, 0, -1, 2108.8
DATA:1, 16, 17, 0, -1, 2307.2
DATA:1, 18, 19, 0, -1, 2505.6
DATA:1, 20, 21, 0, -1, 2704
DATA:1, 22, 23, 0, -1, 2902.4
DATA:1, 24, 25, 0, -1, 3100.8
DATA:1, 26, 27, 0, -1, 3299.2
DATA:1, 28, 29, 0, -1, 3497.6
DATA:1, 30, 31, 0, -1, 3696
DATA:1, 32, 33, 0, -1, 3894.4
DATA:1, 34, 35, 0, -1, 4092.8
DATA:1, 36, 37, 0, -1, 4291.2
DATA:1, 38, 39, 0, -1, 4489.6
DATA:1, 40, 41, 0, -1, 4688
DATA:1, 42, 43, 0, -1, 4886.4
DATA:1, 44, 45, 0, -1, 5084.8
DATA:1, 46, 47, 0, -1, 5283.2
DATA:1, 48, 49, 0, -1, 5481.6
DATA:1, 50, 51, 0, -1, 5680
DATA:1, 52, 53, 0, -1, 5878.4
DATA:1, 54, 55, 0, -1, 6076.8
DATA:1, 56, 57, 0, -1, 6275.2
DATA:1, 58, 59, 0, -1, 6473.6
DATA:1, 60, 61, 0, -1, 6672
DATA:1, 62, 63, 0, -1, 6870.4
DATA:1, 0, 1, 0, -1, 7068.8
DATA:1, 2, 3, 0, -1, 7267.2
DATA:1, 4, 5, 0, -1, 7465.6
DATA:1, 6, 7, 0, -1, 7664
DATA:1, 8, 9, 0, -1, 7862.4
DATA:1, 10, 11, 0, -1, 8060.8
DATA:1, 12, 13, 0, -1, 8259.2
DATA:1, 14, 15, 0, -1, 8457.6
...
CMD, D, TLAST, TKEEP, TIME_NS
DATA:1, 2.002000093e+00, 0, 0, 3264
DATA:1, 4.004000187e+00, 0, 0, 3267.2
DATA:1, 6.006000042e+00, 0, 0, 3270.4
DATA:1, 8.008000374e+00, 0, 0, 3273.6
DATA:1, 1.001000023e+01, 0, 0, 3276.8
DATA:1, 1.201200008e+01, 0, 0, 3280
DATA:1, 1.401399994e+01, 0, 0, 3283.2
DATA:1, 1.601600075e+01, 0, 0, 3286.4
DATA:1, 1.801799965e+01, 0, 0, 3328
DATA:1, 2.002000046e+01, 0, 0, 3331.2
DATA:1, 2.202199936e+01, 0, 0, 3334.4
DATA:1, 2.402400017e+01, 0, 0, 3337.6
DATA:1, 2.602599907e+01, 0, 0, 3340.8
DATA:1, 2.802799988e+01, 0, 0, 3344
DATA:1, 3.003000069e+01, 0, 0, 3347.2
DATA:1, 3.203200150e+01, 0, 0, 3350.4
DATA:1, 3.403400040e+01, 0, 0, 3395.2
Vitis 統合 IDE の [Analysis] ビューでストールを表示
AI エンジンを実行し、シミュレーション トレース データの生成を選択した後、CSV ファイルで STALL
コマンドを使用すると、Vitis 統合 IDE でシミュレーション実行サマリを開いてストールを表示させることができます。STALL:<n>
は、PL ドメインから n
の空サイクル間ストールを挿入します。PL 周波数に基づいたストール期間を確認できます。たとえば、PL 周波数が 100 MHz の場合、STALL:100
は 1000 ns 間、PL から 100 の空サイクルを挿入します。
例 1: 直接ストリーム接続 (バッファーなし) を使用するデザインでは、指定された 500 空サイクル (PL ドメインから) のストリーム ストールが発生します。
例 2: バッファーを介してストリームが接続されているデザインでは、指定された 1000 空サイクル (PL ドメインから) のロック ストールが発生します。