FPGA開発日記

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

CMake + Modelsim Intel FPGA Starter Editionの環境構築

せっかく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)のような記法を利用している。