Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Xilinx AI Engine の シミュレータ (aiesimulator) を動かしてみた(その4)

はじめに

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

おわりに

今回は、シミュレーションの開始から、終了までをみてみました。