CMakeを使ってModelsim環境を構築したが、GUIでデバッグしているときの問題があった。 これは、Verilogを修正した場合にGUIを立ち上げている状態でどのようにしてリコンパイルするかということだった。
シミュレーションのやり直し(Verilogの変更無く再コンパイルの必要がない場合)は、restart -force; run -all
と記述すればシミュレーションをやり直してくれる。
しかし、リコンパイルしたい場合にはどのようにしたら良いのだろう?
例えば、CMakeLists.txtには以下のような割かし複雑なコンパイルオプションが記述されている。
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} +define+TOOL_QUESTA_SIM +define+SIMULATION +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 )
で、GUI上でリコンパイルするためには、これをもう一度コンソールに叩けばよいのだが、もちろん環境変数などがあり難しい。
怒られる。
そこで、compile.do
を作成して、リコンパイルする場合にはdo compile.do
としたい。compile.do
は手動ではなく、可能ならばオプションが変更になる場合に備えて自動で作りたいなあ。
という訳で、vlog.logに記述されているコンパイルオプションをgrepで抽出して、compile.do
を自動的に作れるようにした。
add_custom_command (OUTPUT compile.do COMMAND grep ^vlog vlog.log > compile.do )
vlog.logから、vlog
の文字から始まる行を検索してcompile.do
に入れている。結果として、以下のようなcompile.do
が作成される。
vlog -f filelist.f "+define+IC_RD_RAND+0" "+define+DC_RD_RAND+0" "+define+DC_WR_RAND+0" "+define+TOOL_QUESTA_SIM" "+define+SIMULATION" "+define+SIM_DATE=20170302" "+define+REVISION=28'haf2465a" "+incdir+../../../../hardware/common/include/" -work worklib -l vlog.log
1行だからむちゃ長いけど。というわけでこのファイルをGUI上で読み込ましてやれば再コンパイルしてくれる。