ROM の設定

parameter を先に定義してから、input/output の幅を決めることを最近知った。モジュール呼び出しの前に # をつけることをしらんかった。

module romx1 #(
	parameter ADDRESS_MSB = 'x,
	parameter DATA_MSB = 'x,
	parameter WAIT = 'x,
	//parameter FILENAME = "simulate.v"
)(
	input [ADDRESS_MSB:0] a, output [DATA_MSB:0] d, input ce, output w
);
	function [DATA_MSB:0] q;
		input [ADDRESS_MSB:0] a;
		case(a)
		//`include "simulate.v"
		`include `FILENAME
		endcase
	endfunction
	assign #WAIT d = ce == 1'b1 ? 16'hzzzz : q(a);
	assign #WAIT w = ce;
endmodule

こんな感じに書いてみたところ `include のファイル名をうまく渡すことができないことが判明。 C の #define で # とか ## で連結させる方法は使えないみたい。

となると、case の中だけ include はあきらめてこのモジュールもまるまる出力するスクリプトを作らないと無理と言うことだ。*1 1M byte 越えの ROM データを全てを読むとシミュレーションが遅くなるんで必要データだけを生成することも考えないといけないので、それも連携できる作りにしないとダメね。

*1:readmemh は連続してないデータは出しにくいのでアウト。