Vengineerの戯言

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

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

はじめに

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 の中の

  • device_json
  • phy_defile_file
  • aiearch
  • aie_freq
  • use_real_noc
  • noc_ip_block
  • pl_ip_block

という情報があり、これにより 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 の中身を見ると、

  • "Name": "MC"
  • "Name": "PS_AIE_Config_Master"
  • "Name": "PS_AIE_Config_Slave"
  • "Name": "PS_PL_RTP_Slave"

が居て、 "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 の最初の部分を見てみました。