はじめに
Xilinx AI Engine の シミュレータ (aiesimulator) を動かしてみた(その2)です。
aiesimulator コマンドの出力メッセージ
aiesimulator コマンドを実行すると、まずはライセンスを見つけに行きます。
aiesimulator --pkg-dir=Work --input-dir=data --output-dir=data AIEsim feature license is found.
ライセンスが見つからないと、ここで終了してしまいます。その後、aiesimulator の コンフィギュレーションを行います。
最初に読み出すのは、Work/config/scsim_config.json ファイルを読み出します。このファイルが aiesimulator の中の構成を決めます。
INFO: Executing config: Work/config/scsim_config.json
Work/config/scsim_config.json を見てみると、SimulationConfig の中の
という情報があり、これにより aiesimulator の内部構成を変更しているようです。
cat Work/config/scsim_config.json
{
"SimulationConfig": {
"device_json": {
"directory": "data/devices",
"file": "VC1902.json"
},
"phy_device_file": "xcvc1902-vsva2197-1LP-e-S-es1",
"aiearch": "aie",
"aie_freq": 1000000000.0,
"use_real_noc": 1,
"noc_ip_block": {
"lib_path": "Work/noc/liblnoc_tlm.so",
"traffic_file": "Work/noc/noc_traffic.nts",
"config_file": "Work/noc/noc_soln.ncr"
},
"pl_ip_block": [
{
"name": "i1",
"arguments": [
"input0.txt",
"32",
"32",
"1",
"0",
"0"
],
"ip": "release",
"lib_path": "data/pl_fileio/libpl_sender.so",
"pl_freq": 250000000.0,
"axi_stream": [
{
"port_name": "do",
"column": 24,
"stream_id": 1,
"direction": "pl_to_me",
"bus_width": 32
}
{
"name": "i2",
"arguments": [
"input1.txt",
"32",
"32",
"1",
"0",
"0"
],
"ip": "release",
"lib_path": "data/pl_fileio/libpl_sender.so",
"pl_freq": 250000000.0,
"axi_stream": [
{
"port_name": "do",
"column": 24,
"stream_id": 2,
"direction": "pl_to_me",
"bus_width": 32
}
],
"event_bus": []
},
{
"name": "i3",
"arguments": [
"output.txt",
"32",
"32",
"1",
"0",
"0"
],
"ip": "release",
"lib_path": "data/pl_fileio/libpl_receiver.so",
"pl_freq": 250000000.0,
"axi_stream": [
{
"port_name": "di",
"column": 24,
"stream_id": 1,
"direction": "me_to_pl",
"bus_width": 32
}
],
"event_bus": []
},
{
"name": "ps_i4_ps_main",
"ip": "ps",
"lib_path": "ps/c_rts/systemC/generated-objects/ps_i4.so",
"pl_freq": 250000000.0,
"axi_mm": [
{
"port_name": "ps_axi",
"direction": "ps_to_gm",
"noc_endpoint": "NOC_NMU128_X0Y5",
"bus_width": 0
}
],
"event_bus": []
}
]
}
}
device_json では、directory = data/devices、file = VC1902json から device config ファイルをロードしています。
"device_json": {
"directory": "data/devices",
"file": "VC1902.json"
},
VC1902.json は、binary file のようです。
Loading device config from: /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/data/devices/VC1902.json
phy_device_file にて、デバイスの型、aiearch は aie (AI Edgeデバイスの一部では、aie_ml になるものもあるようです)、aie_freq は AI Engine の動作は1GHz、use_read_noc に 1 を設定して、noc_ip_block にて、SystemC TLM モデルを lib_path にて Work/noc/liblnoc_tlm.so、traffic_file を Work/noc/noc_traffic.nts、config_file を Work/noc/noc_soln.ncr を設定しています。
"phy_device_file": "xcvc1902-vsva2197-1LP-e-S-es1",
"aiearch": "aie",
"aie_freq": 1000000000.0,
"use_real_noc": 1,
"noc_ip_block": {
"lib_path": "Work/noc/liblnoc_tlm.so",
"traffic_file": "Work/noc/noc_traffic.nts",
"config_file": "Work/noc/noc_soln.ncr"
},
traffic_file の中身を見ると、
が居て、 "Paths" にて、どのように接続しているかを示しています。アドレスとサイズも設定しています。
- "From": "PS_AIE_Config_Master" => "To": "MC" = ("Base": "0x0", "Size": "0x80000000")
- "From": "PS_AIE_Config_Master" => "To": "PS_AIE_Config_Slave" = ("Base": "0x20000000000", "Size": "0x40000000")
- "From": "PS_AIE_Config_Master" => "To": "PS_PL_RTP_Slave" = ("Base": "0x20100000000", "Size": "0x40000000")
全部、"Protocol" は、"AXI_MM" です。
どうやら、traffic_file は、AI Engine の中ではなく、AI Engine の外側の接続情報のようです。
cat Work/noc/noc_traffic.nts
{
"LogicalInstances": [
{
"Name": "MC",
"IsMaster": false,
"CompType": "DDRC",
"Protocol": "AXI_MM",
"Ports": [
"PORT0"
],
"SysAddresses": [
{
"Base": "0x0",
"Size": "0x80000000"
}
]
},
{
"Name": "PS_AIE_Config_Master",
"IsMaster": true,
"CompType": "PS_NCI_NMU",
"Protocol": "AXI_MM",
"ReadTC": "BE",
"WriteTC": "BE",
"SysAddresses": []
},
{
"Name": "PS_AIE_Config_Slave",
"IsMaster": false,
"CompType": "AIE_NSU",
"Protocol": "AXI_MM",
"SysAddresses": [
{
"Base": "0x20000000000",
"Size": "0x40000000"
}
]
},
{
"Name": "PS_PL_RTP_Slave",
"IsMaster": false,
"CompType": "PL_NSU",
"Protocol": "AXI_MM",
"SysAddresses": [
{
"Base": "0x20100000000",
"Size": "0x40000000"
}
]
}
],
"Paths": [
{
"Phase": 0,
"From": "PS_AIE_Config_Master",
"To": "PS_AIE_Config_Slave",
"Port": "PORT0",
"CommType": "MM_ReadWrite",
"ReadBW": 1,
"ReadLatency": 100,
"ReadAvgBurst": 4,
"WriteBW": 1,
"WriteLatency": 100,
"WriteAvgBurst": 4
},
{
"Phase": 0,
"From": "PS_AIE_Config_Master",
"To": "MC",
"Port": "PORT0",
"CommType": "MM_ReadWrite",
"ReadBW": 1,
"ReadLatency": 100,
"ReadAvgBurst": 4,
"WriteBW": 1,
"WriteLatency": 100,
"WriteAvgBurst": 4
},
{
"Phase": 0,
"From": "PS_AIE_Config_Master",
"To": "PS_PL_RTP_Slave",
"Port": "PORT0",
"CommType": "MM_ReadWrite",
"ReadBW": 1,
"ReadLatency": 100,
"ReadAvgBurst": 4,
"WriteBW": 1,
"WriteLatency": 100,
"WriteAvgBurst": 4
}
]
}
config_file は、NoC のコンフィギュレーションを決めるためのファイルのようです。
Paths のところに、traffic_file の Paths に対応するっぽいです。
cat config_file
"Paths": [
{
"Phase": 0,
"From": "PS_AIE_Config_Master",
"FromLocked": false,
"To": "PS_AIE_Config_Slave",
"ToLocked": false,
"Port": "PORT0",
"ReadTC": "BE",
"WriteTC": "BE",
"ReadBW": 1,
"WriteBW": 1,
"ReadAchievedBW": 1,
"WriteAchievedBW": 1,
"ReadLatency": 100,
"WriteLatency": 100,
"ReadBestPossibleLatency": 100,
"WriteBestPossibleLatency": 100,
"PathLocked": false,
"Nets": [
{
"PhyInstanceStart": "NOC_NSU128_X8Y6",
"PhyInstanceEnd": "NOC_NMU128_X0Y5",
"VC": 6,
"CommType": "READ",
"Connections": [
"NOC_NSU128_X8Y6",
"resp",
"NOC_NPS5555_X13Y4",
"port3_in",
"NOC_NPS5555_X13Y4",
"port0_out",
"NOC_NCRB_X0Y1",
"port1_in",
"NOC_NCRB_X0Y1",
おわりに
今回は、aiesimulator コマンドが読み込んでいる Work/config/scsim_config.json の最初の部分を見てみました。