次では、高度な 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 など) を解除
|
ipc_axis_master_util (<sender_io_name>)
Python スクリプトで送信ポートをインスタンシエートするために使用します。
- API の使用
- センダー用の API を使用してユーザー オブジェクトを作成します。
- パラメーター
- データ送信する外部ポートの名前:
- 例
-
#Instantiating AXI Master Utilities data_in = ipc_axis_master_util("DataIn")
ipc_axis_slave_util(<receiver_io_name>)
Python スクリプトでレシーバー ポートをインスタンシエートするために使用します。
- API の使用
- レシーバー用の API を使用してユーザー オブジェクトを作成します。
- パラメーター
- データを受信する外部ポートの名前:
- 例
-
#Instantiating AXI Slave Utilities data_out = ipc_axis_slave_util("DataOut")
b_transport(packet)
- API の使用
- 作成したオブジェクトを使用して API を呼び出します。
- パラメーター
- AXI4-Stream パケット
- 例
-
#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 を呼び出します。
- 例
-
#Sample the packets data_packet = data_out.sample_transaction() # Will wait until data is received.
ipc_axis_master_nb_util (<sender_io_name>)
Python スクリプトでノンブロッキングのセンダー ポートをインスタンシエートします。- API の使用
- センダー用の API を使用してユーザー オブジェクトを作成します。
- パラメーター
- データを送信する外部ポートの名前:
- 例
-
#Instantiating AXI Master Utilities data_in = ipc_axis_master_nb_util("DataIn")
ipc_axis_slave_nb_util(<receiver_io_name>)
Python スクリプトでノンブロッキングのレシーバー ポートをインスタンシエートします。
- API の使用
- レシーバー用 API を使用してユーザー オブジェクトを作成します。
- パラメーター
- データを送信する外部ポートの名前
- 例
-
#Instantiating AXI Slave Utilities data_out = ipc_axis_slave_nb_util("DataOut")
nb_transport(<packet>)
AXI4-Stream パケットを送信するのに使用するノンブロッキング API。データを転送する前に、次の「Python でのトラフィック ジェネレーターによるデータのフォーマット」で説明するように、データをデータ パケットにフォーマットする必要があります。
- API の使用
- sender_obj を使用して API を呼び出します。
- パラメーター
- AXI4-Stream パケット
- 例
-
#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 を呼び出します。
- 例
-
data_in.end_of_simulation()
sw_emu/hw_emu と使用することを推奨します。
disconnect()
ソケット接続 (DataIn、DataOut など) を解除
- API の使用
- センダーまたはレシーバー オブジェクトを使用して API を呼び出します。
- 例
-
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 を参照してください。
データ型 | [PLIO Width] | Python コードの抜粋 |
---|---|---|
cfloat | PLIO32 | N/A |
PLIO64 |
rVec =
np.real(data)
|
|
PLIO128 | ||
cint16 | PLIO32 |
rVec =
np.real(data).astype(np.int16)
|
PLIO64 | ||
PLIO128 | ||
int8 | PLIO32 |
intvec =
np.real(data).astype(np.int8)
|
PLIO64 | ||
PLIO128 | ||
int32 | PLIO32 |
intvec =
np.real(data).astype(np.int32)
|
PLIO64 | ||
PLIO128 |