せっかくModelsim Intel FPGA Starter Editionを使い始めたので、CMakeでビルドする環境を構築しよう。
CMakeでVerilogのシミュレーション環境を構築するためにはCMakeのadd_custom_target
を使う。
C++のようにビルド環境を自動的に作れないので、自分で作るしかしょうがない。
vlogビルド環境
add_custom_command (OUTPUT vlog COMMAND vlog -f filelist.f +define+IC_RD_RAND+${IC_RD_RAND} ... +define+SIM_DATE=${CMAKE_SIM_DATE} +define+REVISION=28\\'h${CMAKE_REVISION} +incdir+../../../../hardware/common/include/ -work worklib -l vlog.log DEPENDS filelist.f riscv_ctrl csu_main vlib )
ビルド環境は上記のようになった。filelist.fはcpp
を使って自動生成している。
add_custom_command (OUTPUT filelist.f COMMAND cpp -DTOOL_VCS_SIM -P -DHW_DIR=../../../../hardware ../sim/tb_mag_top.f > filelist.f DEPENDS ../sim/tb_mag_top.f ../rtl/mag_top.f )
vsimのビルド環境
シミュレーションの開始は以下のようにした。
add_custom_target (tb_mag_top ALL COMMAND vsim -c tb_mag_top +access+rw -l simv.log -work worklib -do "run -all; quit" DEPENDS vlog )
変数やシミュレーションパラメータをどのように定義するか
とりあえず、CMakeのパラメータとして以下を定義している。
if(IC_RD_RAND) set(IC_RD_RAND 1) else() set(IC_RD_RAND 0) endif() if(DC_RD_RAND) set(DC_RD_RAND 1) else() set(DC_RD_RAND 0) endif() if(DC_WR_RAND) set(DC_WR_RAND 1) else() set(DC_WR_RAND 0) endif()
これらをビルド時に+define+
として投入している。
add_custom_command (OUTPUT vlog COMMAND vlog -f filelist.f +define+IC_RD_RAND+${IC_RD_RAND} +define+DC_RD_RAND+${DC_RD_RAND} +define+DC_WR_RAND+${DC_WR_RAND}
ビルド時に日付やgitのリビジョン番号を埋め込む
ビルド時の日付やリビジョン番号を挿入するためには、まずはCMakeLists.txtに以下の変数を定義する。
execute_process (COMMAND date +%Y%m%d OUTPUT_VARIABLE CMAKE_SIM_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND git rev-parse --short HEAD OUTPUT_VARIABLE CMAKE_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE) set (SIM_DATE ${CMAKE_SIM_DATE}) set (REVISION ${CMAKE_REVISION})
これを+define+
で挿入している。
+define+SIM_DATE=${CMAKE_SIM_DATE} +define+REVISION=28\\'h${CMAKE_REVISION}
16進数で表現されるリビジョン番号については、Verilog固有の記述(28'h01234abcd
)のような記法を利用している。