はじめに
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 の最初の部分を見てみました。