はじめに
Xilinx AI Engine の シミュレータ (aiesimulator) を動かしてみた(その4)です。
シミュレーションの開始
下記のように、In file: sc_object_manager.cpp:156 というメッセージが出ているので、ここからは SystemC のシミュレーションが始まっています。
Warning: (W505) object already exists: tl.logicalNoC.PS_AIE_Config_Master.delayed_event. Latter declaration will be renamed to tl.logicalNoC.PS_AIE_Config_Master.delayed_event_0 In file: sc_object_manager.cpp:156 TraceManager type=psql_db Enabled fast PM writes. Enabled fast DM writes. [warning] : TCL interface disabled. Warning: (W505) object already exists: tl.aie_logical.aie_xtlm.math_engine.clockM. Latter declaration will be renamed to tl.aie_logical.aie_xtlm.math_engine.clockM_0 In file: sc_object_manager.cpp:156 Warning: (W505) object already exists: tl.aie_logical.aie_xtlm.math_engine.resetM. Latter declaration will be renamed to tl.aie_logical.aie_xtlm.math_engine.resetM_0 In file: sc_object_manager.cpp:156 NOCSlaveUnitXtlm::Detail::setAxiPhySize(): NOC_NSU128_X8Y6, reg_axi_width_byte=64B > physical interface=16B NOCSlaveUnitXtlm::Detail::setAxiPhySize(): NOC_NSU512_X0Y0, reg_axi_width_byte=64B > physical interface=64B TraceManagerDB::startTrace Enable stream switch latency
ここで、入力データ (data/input0.txt, data/input1.txt)、出力データ (data/output.txt) を設定しています。
Starting to send data from file: data/input0.txt Starting to send data from file: data/input1.txt Starting to receive data into file: data/output.txt
ps_i4_ps_main が動き始めます。
IP-INFO: [ps_i4_ps_main] IP started.
このメッセージは、Work/ps/c_rts/systemC/generated-source/genwrapper_for_ps_i4.cpp の main_action メソッドの中で出力されています。
void PSIP_ps_i4::main_action() { std::cout << "IP-INFO: [" << basename() << "] IP started." << std::endl; if(is_hybrid_emu()) { xrt_ps_main(); } else { ps_main(); } }
main_action メソッドは、PSIP_ps_i4 クラスのコンストラクタ内で、SC_THREADになっています。
PSIP_ps_i4::PSIP_ps_i4(sc_module_name nm) : IPBlock(nm) , PS_AxiMM_Rd("ps_axi_rd", BUSWIDTH) , PS_AxiMM_Wr("ps_axi_wr", BUSWIDTH) { std::cout << "IP-INFO: [" << basename() << "] IP loaded." << std::endl; PS_AxiMM_Rd_Util = new xtlm::xtlm_aximm_initiator_rd_socket_util("PS_AxiMM_Util_rd_socket", xtlm::aximm::TRANSACTION, BUSWIDTH); PS_AxiMM_Wr_Util = new xtlm::xtlm_aximm_initiator_wr_socket_util("PS_AxiMM_Util_wr_socket", xtlm::aximm::TRANSACTION, BUSWIDTH); mem_manager = new xtlm::xtlm_aximm_mem_manager(this); PS_AxiMM_Rd_Util->rd_socket.bind(PS_AxiMM_Rd); PS_AxiMM_Wr_Util->wr_socket.bind(PS_AxiMM_Wr); SC_THREAD(main_action); SC_THREAD(response_process); sensitive<< (PS_AxiMM_Wr_Util->resp_available); sensitive<< (PS_AxiMM_Rd_Util->data_available); if(is_hybrid_emu()) { load_xcl_client_graph(); } };
is_hybrid_emu メソッドは、${VITIS_HOME}/aietools/include/adf/wrapper/xrt_ps_wrapper.inc の中で、
static bool is_hybrid_emu() { static auto hemu = std::getenv("XILINX_VITIS_EMU_HYBRID"); if (hemu) { return true; } return false; }
is_hybrid_emu メソッドの中で呼び出している XILINX_VITIS_EMU_HYBRID 環境変数を定義して、aiesimulatior コマンドを実行したら、下記のようなエラーになりました。Work/ps/c_rts/systemC/generated-objects/ps_i4.so の中に destroy_aiesim_graph_xcl_client が無いと怒られるので、aiecompiler コマンドを実行する時に何かのオプションを指定する必要があるようですね。
XILINX_VITIS_EMU_HYBRID= $ aiesimulator --pkg-dir=Work --input-dir=data --output-dir=data AIEsim feature license is found. Removed previously generated option file INFO: Executing config: Work/config/scsim_config.json Loading device config from: /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/data/devices/VC1902.json Initializing AIE driver... Initializing ADF API... XAIEFAL: INFO: Resource group Avail is created. XAIEFAL: INFO: Resource group Static is created. XAIEFAL: INFO: Resource group Generic is created. IP-INFO: [ps_i4_ps_main] IP loaded. dlsym error: Work/ps/c_rts/systemC/generated-objects/ps_i4.so: undefined symbol: destroy_aiesim_graph_xcl_client /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/bin/unwrapped/lnx64.o/aiesim: symbol lookup error: Work/ps/c_rts/systemC/generated-objects/ps_i4.so: undefined symbol: _Z17register_graph_cbPFviPPvE /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/bin/aiesimulator: line 206: kill: (-3611) - No such process /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/bin/aiesimulator: line 208: kill: (-3611) - No such process
ここからが graph に対する elf file (いっぱいある)をロードし、実行している部分になっています。
Loading elfs of graph graph... [warning] : TCL interface disabled. Initializing graph graph... Resetting cores of graph graph... Configuring DMAs of graph graph... Configuring PL-Interface for graph graph... Set iterations for the core(s) of graph graph Enabling core(s) of graph graph Waiting for core(s) of graph graph to finish execution ... core(s) are done executing Exiting!
これらを実行している部分は、Work/ps/c_rts/aie_control.cpp の中の関数です。
- graph_init : Initializing graph graph...
- graph_init : Resetting cores of graph graph...
- graph_init : Configuring DMAs of graph graph...
- graph_init : Configuring PL-Interface for graph graph...
- graph_core_enable : Enabling core(s) of graph graph
AI Engine の動作が完了したので、シミュレータを止め、シミュレーションを終了します。
[warning] : Tcl interface disabled, not requesting profiles. [warning] : Tcl interface disabled, not requesting profiles. Stopping Simulator. [warning] : TCL interface disabled.
Info: /OSCI/SystemC: Simulation stopped by user. INFO::[ DDRC-TXNQ-TRACE ] DDRMC_X0Y0/controller_ch0/transactionQueue qe = 0.000000, overhd = 0.000000 INFO::[ DDRC-TXNQ-TRACE ] DDRMC_X0Y0/controller_ch1/transactionQueue qe = 0.000000, overhd = 0.000000 IP-INFO: deleting ip PSIP_ps_i4 IP-INFO: deleting packet ip IP-INFO: deleting packet ip IP-INFO: deleting packet ip [INFO] : Simulation Finished, Sim result: 0
おわりに
今回は、シミュレーションの開始から、終了までをみてみました。