高度な Python トラフィック トラフィック ジェネレーター API - 2023.2 日本語

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

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

次では、高度な Python トラフィック ジェネレーター API と使用方法を紹介します。

ヒント: これらの API を使用した完全なシステム レベルの例は、GitHub の External_IO_PY チュートリアルの Python の外部 IO から入手できます。
表 1. 外部トラフィック ジェネレーターで使用される高度な Python API のリスト
API ビヘイビアー
ipc_axis_master_util("<sender_io_name>") マスター トラフィック ジェネレーター (TG) をインスタンシエート
ipc_axis_slave_util("<receiver_io_name>") スレーブ TG をインスタンシエート
b_transport(packet) AXI4-Stream パケットを送信するブロッキング API
sample_transaction() AXI4-Stream パケットを受信するブロッキング API。データをビートごとに受信します (1 回の sample_transaction() 呼び出しで 1 ビートを取得)。
ipc_axis_master_nb_util("<sender_io_name>") ノンブロッキング マスター TG をインスタンシエート
ipc_axis_slave_nb_util("<receiver_io_name>") ノンブロッキング スレーブ TG をインスタンシエート
nb_transport(packet) AXI4-Stream パケットを送信するノンブロッキング API 呼び出し
nb_sample_transaction() AXI4-Stream パケットを受信するノンブロッキング API 呼び出し。データをビートごとに受信します (1 回の sample_transaction() 呼び出しで 1 ビートを取得)。
no_of_available_txns() ノンブロッキング TG の受信トランザクション数を取得するために使用
end_of_simulation()

この API を使用してシミュレーションを終了

sw_emu/hw_emu を使用して External TG で使用することを推奨

disconnect()

ソケット接続 (DataIn、DataOut など) を解除

x86simulator または aiesimulator を使用して外部 TG で使用することを推奨

ipc_axis_master_util (<sender_io_name>) 

Python スクリプトで送信ポートをインスタンシエートするために使用します。

API の使用
センダー用の API を使用してユーザー オブジェクトを作成します。
sender_obj = ipc_axis_master_util (<sender_io_name>) 
パラメーター
データ送信する外部ポートの名前:
<sender_io_name>
#Instantiating AXI Master Utilities 
data_in = ipc_axis_master_util("DataIn")
DataIn は外部ポート名、data_in はユーザー オブジェクトです。

ipc_axis_slave_util(<receiver_io_name>)

Python スクリプトでレシーバー ポートをインスタンシエートするために使用します。

API の使用
レシーバー用の API を使用してユーザー オブジェクトを作成します。
receiver_obj = ipc_axis_slave_util (<receiver_io_name>)
パラメーター
データを受信する外部ポートの名前:
receiver_io_name
#Instantiating AXI Slave Utilities 
data_out = ipc_axis_slave_util("DataOut")
この例の場合、DataOut は外部ポート名、data_out はユーザー オブジェクトです。

b_transport(packet)

AXI4-Stream を送信するブロッキング API。
API の使用
作成したオブジェクトを使用して API を呼び出します。
sender_obj.b_transport(<packet>) 
パラメーター
AXI4-Stream パケット
packet
この AXI4-Stream の場合、次の属性を設定する必要があります。
送信する必要のあるデータ:
data
パケットの終わりを示す TLAST 値。これは、アプリケーションに基づいてユーザーが選択します。
tlast
指定しない場合、デフォルトの TLAST 値は true です (すべてのデータ ビートがトランザクションになります)。tlast=false の場合、TLAST は駆動されません。tlast=true (ユーザーがアプリケーションに基づいて指定) の場合、最後のデータ ビートは tlast=true になります。
その他のオプションの AXI4-Stream パケット フィールドには、tuser および tkeep があります。
#Create packet
data_packet = xtlm_ipc.axi_stream_packet() // API to generate the stream packet
data = generate_data() # custom user code to generate the data
data_packet.data = data 

data_packet.tlast = True #AXI Stream Fields
#Optional AXI Stream Parameters
data_packet.tuser = optional data
data_packet.tkeep = optional data 

#Send Transaction
data_in.b_transport(data_packet)

sample_transaction()

AXI4-Stream パケットを受信するブロッキング API。
API の使用
作成した receiver_obj を使用して API を呼び出します。
packet = receiver_obj.sample_transaction()
#Sample the packets
data_packet = data_out.sample_transaction() # Will wait until data is received.
この場合、data_out はレシーバー オブジェクト、data_packet は受信パケットです。

ipc_axis_master_nb_util (<sender_io_name>) 

Python スクリプトでノンブロッキングのセンダー ポートをインスタンシエートします。
API の使用
センダー用の API を使用してユーザー オブジェクトを作成します。
sender_obj = ipc_axis_master_nb_util (<sender_io_name>) 
パラメーター
データを送信する外部ポートの名前:
<sender_io_name>
#Instantiating AXI Master Utilities 
data_in = ipc_axis_master_nb_util("DataIn")

ipc_axis_slave_nb_util(<receiver_io_name>)

Python スクリプトでノンブロッキングのレシーバー ポートをインスタンシエートします。

API の使用
レシーバー用 API を使用してユーザー オブジェクトを作成します。
receiver_obj = ipc_axis_slave_util (<receiver_io_name>)
パラメーター
データを送信する外部ポートの名前
receiver_io_name
#Instantiating AXI Slave Utilities
data_out = ipc_axis_slave_nb_util("DataOut")

nb_transport(<packet>)

AXI4-Stream パケットを送信するのに使用するノンブロッキング API。データを転送する前に、次の「Python でのトラフィック ジェネレーターによるデータのフォーマット」で説明するように、データをデータ パケットにフォーマットする必要があります。

API の使用
sender_obj を使用して API を呼び出します。
sender_obj.nb_transport(<packet>) 
パラメーター
AXI4-Stream パケット
packet
この AXI4-Stream パケットは、次の属性を持つユーザーによって作成されます。
送信する必要のあるデータ:
data
パケットの終わりを示す TLAST 値。これは、アプリケーションに基づいてユーザーが選択します。
tlast
指定しない場合、デフォルトの TLAST 値は true です (すべてのデータ ビートがトランザクションになります)。tlast=false の場合、TLAST は駆動されません。tlast=true (ユーザーがアプリケーションに基づいて指定) の場合、最後のデータ ビートは tlast=true になります。
その他のオプションの AXI4-Stream パケット フィールドには tuser および tkeep があります。
#Create packet
data_packet = xtlm_ipc.axi_stream_packet()
data = generate_data() # custom user code to generate the desired data
data_packet.data_length = "DATA_LENGTH"
data_packet.data = data
data_packet.tlast = True #to mark end of packet. This is user's choice based on application
data_in.nb_transport(data_packet)

nb_sample_transaction()

AXI4-Stream パケットを受信するノンブロッキング API。

API の使用
packet = receiver_obj.nb_sample_transaction() 
#Sample the packets
# Will return data if it is available
# Will return empty list if nothing is available
# Will not wait or stop the execution until data is present to sample
data_packet = data_out.nb_sample_transaction()

この場合、data_out はレシーバー オブジェクト、data_packet は受信パケットです。

no_of_available_txns

ノンブロッキングの場合、この API は受信したトランザクション数の取得に使用されます。

API の使用
レシーバーのユーザー オブジェクトを使用して API を呼び出します。
data_out = ipc_axis_slave_nb_util("ReceiverName")
data = []

# Checks if any data is present to receive
if(slave.no_of_available_txns != 0) :
data = data_out.nb_sample_transaction() # fill data with respective received data

end_of_simulation()

シミュレーションを終了します。

API の使用
センダー オブジェクトを使用して API を呼び出します。
sender_obj.end_of_simulation()
data_in.end_of_simulation()

sw_emu/hw_emu と使用することを推奨します。

disconnect()

ソケット接続 (DataIn、DataOut など) を解除

API の使用
センダーまたはレシーバー オブジェクトを使用して API を呼び出します。
sender_obj.disconect()
receiver_obj.disconnect()
data_in.disconnect() 
data_out.disconnect()

x86simulator または aiesimulator と併用することをお勧めします。

Python でのトラフィック ジェネレーターによるデータのフォーマット

AI エンジン グラフのための Python API で説明されるように、AI エンジン API を使用する場合、データのフォーマットは必要ありません。ただし、高度な API を使用してデータを送信または受信するには、データがパケット形式であるはずなので、転送前にデータをフォーマットする必要があります。

AXI4-Stream トランザクションをエミュレートするため、AXI トラフィック ジェネレーターでペイロード データを適切なサイズのバーストに分割する必要があります。たとえば、128 バイトを 32 ビット (4 バイト) 幅の PLIO で送信するには、128 バイト/4 バイト = 32 AXI4-Stream トランザクションが必要です。バイト アレイと AXI トランザクション間の変換は、Python で処理します。

Python struct ライブラリは、Python と C データ型間の変換メカニズムを提供します。特に、struct.pack および struct.unpack 関数は、フォーマット文字列引数に応じて、バイト配列をパック/アンパックします。次の表に、一般的な C データ型と PLIO 幅のフォーマット文字列を示します。

詳細は、https://docs.python.org/3/library/struct.html を参照してください。

表 2. C データ型と PLIO 幅のフォーマット文字列
データ型 [PLIO Width] Python コードの抜粋
cfloat PLIO32 N/A
PLIO64 rVec = np.real(data)

iVec = np.imag(data)

out2column = np.zeros((L,2)).astype(np.single)

out2column.tobytes()

formatString = "<"+str(len(byte_arry)//4)+"f"

PLIO128
cint16 PLIO32 rVec = np.real(data).astype(np.int16)

iVec = np.imag(data).astype(np.int16)

formatString = "<"+str(len(byte_arry)//2)+"h"

PLIO64
PLIO128
int8 PLIO32 intvec = np.real(data).astype(np.int8)

formatString = "<"+str(len(byte_arry)//1)+"b"

PLIO64
PLIO128
int32 PLIO32 intvec = np.real(data).astype(np.int32)

formatString = "<"+str(len(byte_arry)//4)+"i"

PLIO64
PLIO128