はじめに
AMD(Xilinx)のgithubの mlir-aie を覗いていたら、勉強になるコードを見つけたので、記録のためにブログに残します。
AIE runtime lib
- AIE
- AIE2
があります。各ディレクトリの下に、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言語のプログラムからアクセスできる関数も定義されています。