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 は連続してないデータは出しにくいのでアウト。