Vengineerの妄想(準備期間)

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

AMD AIE (AI Engine) Runtime libのSystemCコードWrapper

はじめに

AMD(Xilinx)のgithubの mlir-aie を覗いていたら、勉強になるコードを見つけたので、記録のためにブログに残します。

AIE runtime lib

AI Engineの runtimeのライブラリに、

があります。各ディレクトリの下に、asesim/genwrapper_fo_ps.cpp というファイルがあります。

このファイルは、SystemCモデルです。IPBlockクラスを継承して、PSIP_ps_i3クラスを定義しています。

C言語からのアクセス

extern "C" {
void ess_Write32(uint64 Addr, uint Data) {
  (PSIP_ps_i3::getInstance())->write32(Addr, Data);
}
uint32 ess_Read32(uint64 Addr) {
  return ((PSIP_ps_i3::getInstance())->read32(Addr));
}
void ess_Write128(uint64_t Addr, uint32_t *Data) {
  (PSIP_ps_i3::getInstance())->write128(Addr, Data);
}
void ess_Read128(uint64_t Addr, uint32_t *Data) {
  (PSIP_ps_i3::getInstance())->read128(Addr, Data);
}
void ess_WriteGM(uint64 addr, const void *data, uint64_t size) {
  (PSIP_ps_i3::getInstance())->writeGM(addr, data, size);
}
void ess_ReadGM(uint64 addr, void *data, uint64_t size) {
  (PSIP_ps_i3::getInstance())->readGM(addr, data, size);
}
IPBlock *create_ip(sc_module_name name) {
  return (PSIP_ps_i3::createInstance(name));
}
void destroy_ip(IPBlock *ip) {
  std::cout << "IP-INFO: deleting ip PSIP_ps_i3 " << std::endl;
  delete ip;
}
}

のように、

  • 32ビットのリード/ライトアクセス
  • 128ビットのリード/ライトアクセス
  • 指定サイズのリード/ライトアクセス

と、モデルの生成と解放のAPIが用意されています。

おわりに

SystemCモデルを作って、C言語のプログラムからアクセスするときは、こんな感じにすれば、OKでは?ということでブログに残しました。

このモデルを使って、C言語のプログラムからアクセスできる関数も定義されています。