FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

独自RISC-V CPUコアの実装 (DPI-CによるELFファイルロード環境の作成)

前回自作CPUのVivado Simulatorによるシミュレーション環境が立ち上がったので、次はRAMのインスタンスとELFファイルのロードのためのDPI-Cの環境を構築したい。

Vivado SimulatorもDPI-Cをサポートしているので、Verilatorの時と同様にDPI-Cを使用してELFファイルをロードする環境を構築する。

まず、VivadoにおけるDPI-Cの環境構築についていろいろ調べると、FPGAの部屋のmarseeさんのブログを発見した。

marsee101.blog.fc2.com

この説明に基づいて自分でDPI-Cの環境を構築する。まずDPIのためのライブラリの作成にはxscというコマンドを使用するらしい。

xsc --cppversion 14 ../cpp/tb_elf_loader.cpp ../cpp/mem_body.cpp ../cpp/memory_block.cpp \
 --gcc_link_options "-L/usr/lib64 -lbfd -I/usr/include/x86_64-linux-gnu/" | tee sim.log

通常はxscコマンドにC++ファイルをロードするだけでDPI-Cのライブラリが構築できるようだが、私はlibbfdをロードしたいのでいくつかオプションを追加している。--gcc_link_optionsにおいてlibbfdのファイル位置とライブラリを指定している。

あとは特に問題なくコンパイル処理を行えばよい。--libを追加したくらいか。

xvlog --sv -i ../src  -f filelist.f   | tee -a sim.log
xelab --timescale 1ns/1ps --mt off -sv_lib dpi --lib bfd tb | tee -a sim.log
DUMP_TYPE=off xsim -t sim_vivado.tcl "work.tb" | tee -a sim.log

tbにDPI-C経由で呼び出したい関数を指定すれば無事に呼び出されることが確認できた。

module tb;

...
initial begin
  load_binary("", "../tests/simple_chain_add/test.elf", 1'b1);
end
  • cpp/tb_elf_loader.cpp
extern "C" int load_binary(char const* path_exec, char const* filename, bool is_load_dump);

extern "C" int
load_binary(char const* path_exec, char const* filename, bool is_load_dump)
{
  g_dump_hex = is_load_dump;
  m_memory = std::unique_ptr<Memory> (new Memory ());

  // open binary
...
}

これでELFファイルをロードしシミュレーションできる環境が構築できた。波形の表示も問題なさそうだ。

f:id:msyksphinz:20210211181658p:plain