ModelSim 向け Makefile

vlog, vcom のようなコンパイルコマンドは単体のプログラムということに気づいたり、 vmake みたいなものは modelsim の transript から起動できなかったりする。vmake はライブラリから makefile を自動生成してくれるらしいが、使ってみたらちゃんと動くような様子がなかった。

コンパイルコマンドとコンパイルターゲット

OS,OEM,設定などによって path は若干異なるが、自分のやつはこうなってた。

MODELSIM_BIN = d:/dev/altera/90sim/modelsim_ase/win32aloem

ここに実行ファイルが揃ってるので rxvt からコマンドラインオプションを確認したほうがよい。

vmake からでてきたファイルを見ると library/modulename/_primary.dat が生成対象となっているようだ。というわけでかなりめんどいが、ソースファイルに含まれるモジュールをリストアップしていく必要がある。 _primary.dat は addprefix と addsufix の両方になって面倒だったので、 addprefix つまり生成対象をディレクトリとした。

MODELSIM_WORK = sim_video

VIDEO_TILE = $(addprefix $(MODELSIM_WORK)/, \
	tilemap_lb_core tilemap_linebuffer \
	tilemap_renderer tilemap_scroll_addressing \
)

生成対象をまとめておき、 make のターゲット名にする。

VIDEO_MODULE_NAME = \
	$(MEMORY_SHAREDRAM) $(MEMORY_DVRAM) $(MEMORY_MAINCPU_VIDEO) \
	$(MEMORY_SDRAM) $(VIDEO_SPRITE) $(VIDEO_TILE) $(VIDEO_MAIN) \
	$(VIDEO_LINEBUFFER) \
	$(VIDEO_TEST_TOP) $(VIDEO_TEST_ROOT) $(VIDEO_TIMING)

video: $(VIDEO_MODULE_NAME)

生成対象 (library/modulename/) の依存関係を書く。ここで mkdir -p をいれておかないと、コンパイル時にファイルが作れないと文句を言われる。

$(VIDEO_TILE): video/video_tilemap_sim.v
	mkdir -p $(VIDEO_TILE)
	$(MODELSIM_BIN)/vlog -work $(MODELSIM_WORK) $<

この時点で verilog ソースから modelsim 向けのコンパイルが make video と打つだけで自動的に行われるようになる。 modelsim のシェルからはファイル操作は不要となるので restart や run コマンドだけで動かせるようになる。

nsl ソースからの自動生成

nsl ソースから verilog ファイルを自動生成 -> modelsim 向けにコンパイルを一括してやるとなるとさらに書き加えが必要。

nsl -> v ファイルの suffix rule を追加する。

NSLCORE = d:/dev/nslcore_20120915_2/nslc.exe
NSLPRE = d:/dev/nslcore_20120915_2/nslpp.exe
NSLOPTION = -O2 -neg_res -default_nettype none 


.SUFFIXES: .nsl .v
.nsl.v:
	echo "\`include \"timescale.h\"" > $@
	$(NSLPRE) $(NSLDEF) < $< | $(NSLCORE) $(NSLOPTION) >> $@

最初にかいた echo > は modelsim で timescale の設定がないと怒られるのでいれてあるんだが、これが原因で `include "timescale.h" だけが書かれたファイルを最新と見なされるので、できればなくしたい。

NSLDEF は ifdef 向けに -Dhogehoge といれる。共有 RAM は CPU テスト向け, Video テスト向け, FPGA 実機向けと3つに切り分けないといけない。

最後に生成対象とその依存ファイルを書く。ここらへんは C ソースと同じ。
生成元から生成対象で名前を変える場合はやり方を個別に書かないといけないんだが、ここはコピペ感があるのでできればなくしたい。(どなたかいい方法を教えてください)

memory/maincpu_video.v: memory/maincpu_video.nsl memory/maincpu_video.nh
video/video_tilemap_sim.v: video/video_tilemap.nsl video/video_tilemap.nh video/linebuffer.nh
	echo "\`include \"timescale.h\"" > $@
	$(NSLPRE) $(NSLDEF) -DSIM_VIDEO < $< | $(NSLCORE) $(NSLOPTION) >> $@

cleanとか

clean:
	rm -fr $(VIDEO_MODULE_NAME) 

こうやると再生成も便利。

(というわけで便利になりました。3年間それをやっていなかったという残念な気持ちもあります。許してください。)