Vengineerの戯言

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

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

はじめに

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

aiesimulator のログの続き

Initializing AIE driver...
Initializing ADF API...

この部分は、Work/ps/c_rts/aie_control.cpp の InitializeAIEControl クラスのコンストラクタ内で出力されています。

    InitializeAIEControl()
    {
      printf("Initializing AIE driver...\n");
      XAie_SetupConfig(ConfigPtr, HW_GEN, XAIE_BASE_ADDR, XAIE_COL_SHIFT,
                       XAIE_ROW_SHIFT, XAIE_NUM_COLS, XAIE_NUM_ROWS,
                       XAIE_SHIM_ROW, XAIE_MEM_TILE_ROW_START,
                       XAIE_MEM_TILE_NUM_ROWS, XAIE_AIE_TILE_ROW_START,
                       XAIE_AIE_TILE_NUM_ROWS);

      XAie_CfgInitialize(&(DevInst), &ConfigPtr);

#if defined(__AIESIM__)
#if defined(__CDO__)
      XAie_SetIOBackend(&(DevInst), XAIE_IO_BACKEND_CDO); // Set aiengine driver library to run for CDO Mode
      XAie_UpdateNpiAddr(&(DevInst), 0xf70a0000);
#else
      //AIE driver currently error out XAie_UpdateNpiAddr for AIESIM
#endif
#else
      XAie_UpdateNpiAddr(&(DevInst), 0xf70a0000);
#endif

#if defined(__AIESIM__) && !defined(__CDO__)
      XAie_TurnEccOff(&DevInst);
#endif

      printf("Initializing ADF API...\n");

#if defined(__AIESIM__) && !defined(__CDO__)
      extern unsigned ess_debug;
#else
      unsigned ess_debug = false;
#endif
#ifdef __EXCLUDE_PL_CONTROL__
      bool exclude_pl_control = true;
#else
      bool exclude_pl_control = false;
#endif

#ifdef __CDO__
      int trace_config_stream_option = 2;
#else
      int trace_config_stream_option = 0;
#endif

      adf::initializeConfigurations(&DevInst, XAIE_NUM_COLS, XAIE_AIE_TILE_NUM_ROWS, XAIE_MEM_TILE_NUM_ROWS,
                                        GraphConfigurations, NUM_GRAPH,
                                        nullptr, 0,
                                        nullptr, 0,
                                        nullptr, 0,
                                        nullptr, 0,
                                        nullptr, 0,
                                        nullptr, 0,
                                        PLIOConfigurations, NUM_PLIO,
                                        nullptr, 0, trace_config_stream_option, nullptr,
                                        ess_debug, exclude_pl_control, true, &broadcastConfigForCoreEnable, true, 2);

    }
  } initAIEControl;

この initAIEControl インスタンスは、どこかで呼ばれています。libadf.a の中にあるので、この libadf.a をリンクするだからが呼んでいるようです。

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.

ps_i4_ps_main は、config/scsim_config.json の中に、次のように設定されています。

            {
                "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": []
            }

ps_i4_ps_main は、ps という ip で、ps/c_rts/systemC/generated-objects/ps_i4.so がライブラリになります。/Work/ps/c_rts/systemC/generated-source/genwrapper_for_ps_i4.cpp をコンパイルしたものですね。動作周波数 (pl_freq) は AI Engine の動作周波数 1GHz の 1/4 の 250MHzです。

"noc_endpoint": "NOC_NMU128_X0Y5" は、Work/noc/noc_soln.ncr の中で下記のように定義されています。PS_AIE_Config_Master に対応します。 つまり、ps (ps_i4_ps_main) は、PS_AIE_Config_Master ということになります。

    {
      "Name": "NOC_NMU128_X0Y5",
      "TrafficLInst": "PS_AIE_Config_Master",
      "DestId": 128
    },
Warning: AieSimConfig: xv_cpt_lib_path env is not set
In file: aie_config.cpp:451

Warning: AieSimConfig: xv_cxl_ip_path env is not set
In file: aie_config.cpp:472

Info: DEVICE FILE: /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/data/devices/VC1902.json

Info: AIE SOLUTION FILE: Work/arch/aieshim_solution.aiesol

Work/arch/aieshim_solution.aiesol は、下記のようになっています。

cat Work/arch/aieshim_solution.aiesol
{
  "Placement": [
    {
      "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S00_AXIS"},
{
  "Placement": [
    {
      "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S00_AXIS"},
      "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_1", "column" : 24, "channel" : 1 }],
      "IsSoft" : true
    },
    {
      "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S01_AXIS"},
      "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_2", "column" : 24, "channel" : 2 }],
      "IsSoft" : true
    },
    {
      "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "M00_AXIS"},
      "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_M_AXIS_1", "column" : 24, "channel" : 1 }],
      "IsSoft" : true
    }
  ]
}

ai_engine_0 というインスタンスは、

  • S00_AXIS
  • S01_AXIS
  • M00_AXIS

ポートを持っていて、それぞれ、column 24 に繋がっています。

  • "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_1", "column" : 24, "channel" : 1 }],
  • "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_2", "column" : 24, "channel" : 2 }],
  • "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_M_AXIS_1", "column" : 24, "channel" : 1 }],
[AIESIM_OPTIONS]: aiesim_options file path data/aiesim_options.txt

data/aiesim_options.txt は、次のようになっています。aiesimulator コマンドの --pkg-dir オプションで指定したディレクトリになります。

cat data/aiesim_options.txt
AIE_PKG_DIR=/mnt/c/Users/haray/home/src/aie_hw/Work
Disable unused tiles
xpe directory: Work
Found xpe file Work/reports/graph.xpe

Work/reports/graph.xpe は、次のようになっています。

cat Work/reports/graph.xpe
<?xml version="1.0"?>
<POWERDATA data="AI-Engine Compiler" dataVersion="2022.1" design="graph" date="Sat Sep 24 10:49:54 2022
">
 <DEVICE part="xcvc1902" grade="extended" package="vsva2197" speed="-1LP" process="typical" vid="No"></DEVICE>
  <AIE status="COMPILER_OUTPUT">
    <AIE_MODULE name="graph" num_tiles="1" clk_freq="1000">
      <TILE name="CR(24,0)" type="int16" int_core_load="0.6" fp_core_load="0" mem_banks="2" mem_rw_rate="0.2" stream_util="0.12" coordinates="24,1">
        <KERNEL name="i0"  int_core_load="1" fp_core_load="0"></KERNEL>
      </TILE>
      <SHIM name="SHIM(19, 0)" type="AIE_PL_NOC_SHIM" stream_util="0" num_pl_streams="0" num_aximm_connections="1" coordinates="19,0"></SHIM>
      <SHIM name="SHIM(24, 0)" type="AIE_PL_SHIM" stream_util="0.13" num_pl_streams="3" num_aximm_connections="0" coordinates="24,0"></SHIM>
    </AIE_MODULE>
  </AIE>
</POWERDATA>
ISS disables unused tiles
Optimized ISS Wrapper (R+W), r2p21
Running Dispatch Server on port: 36851
Current Directory=/mnt/c/Users/haray/home/src/aie_hw
--------------------------------------------------------------------------------------------------
SLAVE STREAM INFO:  | Port Name         | Port Width        | Stream Type       | Channel Index
                    | S00_AXIS          | 32                | PL STREAM         | 193
                    | S01_AXIS          | 32                | PL STREAM         | 194
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
MASTER STREAM INFO: | Port Name         | Port Width        | Stream Type       | Channel Index
                    | M00_AXIS          | 32                | PL STREAM         | 145
--------------------------------------------------------------------------------------------------

上記のログに出てきた、

  • S00_AXIS
  • S01_AXIS
  • M00_AXIS

は、Work/arch/aieshim_solution.aiesol に出てきたものと同じですね。

おわりに

今回は、config/scsim_config.json の続きから aiesimulator でシミュレーションが始まる前までについて、見てみました。