前回自作CPUのVivado Simulatorによるシミュレーション環境が立ち上がったので、次はRAMのインスタンスとELFファイルのロードのためのDPI-Cの環境を構築したい。
Vivado SimulatorもDPI-Cをサポートしているので、Verilatorの時と同様にDPI-Cを使用してELFファイルをロードする環境を構築する。
まず、VivadoにおけるDPI-Cの環境構築についていろいろ調べると、FPGAの部屋のmarseeさんのブログを発見した。
この説明に基づいて自分で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ファイルをロードしシミュレーションできる環境が構築できた。波形の表示も問題なさそうだ。