AUTOINSERTLISP
仕事でVerilogを書くとき、verilog-modeを使わせてもらっている。AUTO_TEMPLATEやAUTOINSTを使って、インスタンス呼び出しをいい感じにしてた。
シミュレータの問題で、2次元配列をいい感じにダンプできなかった。仕方が無いので、1次元配列(というかバス)にassignすることで無理矢理ダンプしてた。
こんな感じ。
reg [7:0] ARRAY [10:0];
wire [7:0] BUS_0 = BUS[0];
wire [7:0] BUS_1 = BUS[1];
....
面倒くさ過ぎてなんとかならんもんかと思って、最近暇だったので調べてみたらなんとかなった。AUTOINSERTLISPなる関数で、lispで生成した文字列を挿入できた。
こんな感じ。
reg [7:0] BUS [10:0];
/*AUTOINSERTLISP(insert (mapconcat '(lambda (i) (concat " wire [7:0] BUS_" (number-to-string i) " = BUS[" (number-to-string i) "];")) (number-sequence 0 10) "\n") "\n")*/
// Beginning of automatic insert lisp
wire [7:0] BUS_0 = BUS[0];
wire [7:0] BUS_1 = BUS[1];
wire [7:0] BUS_2 = BUS[2];
wire [7:0] BUS_3 = BUS[3];
wire [7:0] BUS_4 = BUS[4];
wire [7:0] BUS_5 = BUS[5];
wire [7:0] BUS_6 = BUS[6];
wire [7:0] BUS_7 = BUS[7];
wire [7:0] BUS_8 = BUS[8];
wire [7:0] BUS_9 = BUS[9];
wire [7:0] BUS_10 = BUS[10];
// End of automatics
EmacsLispがよくわかってないんで、ここまで来るのにひと苦労。
でもうまく応用すれば、検証で使えそう。これまではRubyとかで条件ぶりしてたけど、Verilogで書いたベンチと別ファイルになるんで管理がめんどかった。lispで書けるんで、ベンチの中に直接埋め込めるようになるから、一つのファイルにまとめられる。
いいかも。