自分でも時々悩むのだが、Verilog-modeでAUTO_TEMPLATEを使って、さらにLispで信号名を制御したいときは、どこまでをLispとして取り合つかうかに注意しよう。 例えば、ポートに接続される信号名を正規表現で生成して、それをさらに全てdowncaseにしたいとする。
ポートの信号名制御は、正規表現を使えば簡単だ。
/* axi_bram AUTO_TEMPLATE "\([a-z]+\)$" ( .S_AXI_ACLK (CPU_CLK), .S_AXI_ARESETN (~CPU_RESET), .S_AXI_\(.*\) (axi_@_\1[]), )*/ axi_bram #(/*AUTOINSTPARAM*/ // Parameters .addr_w (addr_w), .data_w (data_w)) axi_bram_irom (/*AUTOINST*/ // Outputs .S_AXI_ARREADY (axi_irom_ARREADY), // Templated .S_AXI_AWREADY (axi_irom_AWREADY), // Templated .S_AXI_BID (axi_irom_BID[3:0]), // Templated .S_AXI_BRESP (axi_irom_BRESP[1:0]), // Templated .S_AXI_BVALID (axi_irom_BVALID), // Templated .S_AXI_RDATA (axi_irom_RDATA[127:0]), // Templated .S_AXI_RID (axi_irom_RID[3:0]), // Templated .S_AXI_RLAST (axi_irom_RLAST), // Templated .S_AXI_RRESP (axi_irom_RRESP[1:0]), // Templated .S_AXI_RVALID (axi_irom_RVALID), // Templated
でも、このままでは、信号名で大文字と小文字が混在することになる。ここでは、downcaseを使って、全ての信号線を小文字にしたい。
.S_AXI_\(.*\) (@"(downcase axi_@_\1)"[]),
これでは失敗する。何故ならば、downcaseするべき "axi@\1"がLispでは文字列として扱われておらず、「"axi@\1"(実際には、正規表現が適用されて(axi_irom_arreadyなど)という変数は無い」というメッセージになるからだ。 そこで、この部分を文字列として取り扱う。
.S_AXI_\(.*\) (@"(downcase \\"axi_@_\1\\")"[]),
\"で囲むことによって、この部分は文字列となる。これで、downcaseに渡すことができるようになる。
/* axi_bram AUTO_TEMPLATE "\([a-z]+\)$" ( .S_AXI_ACLK (CPU_CLK), .S_AXI_ARESETN (~CPU_RESET), .S_AXI_\(.*\) (@"(downcase \\"axi_@_\1\\")"[]), )*/ axi_bram #(/*AUTOINSTPARAM*/ // Parameters .addr_w (addr_w), .data_w (data_w)) axi_bram_irom (/*AUTOINST*/ // Outputs .S_AXI_ARREADY (axi_irom_arready), // Templated .S_AXI_AWREADY (axi_irom_awready), // Templated .S_AXI_BID (axi_irom_bid[3:0]), // Templated .S_AXI_BRESP (axi_irom_bresp[1:0]), // Templated .S_AXI_BVALID (axi_irom_bvalid), // Templated .S_AXI_RDATA (axi_irom_rdata[127:0]), // Templated .S_AXI_RID (axi_irom_rid[3:0]), // Templated .S_AXI_RLAST (axi_irom_rlast), // Templated .S_AXI_RRESP (axi_irom_rresp[1:0]), // Templated .S_AXI_RVALID (axi_irom_rvalid), // Templated .S_AXI_WREADY (axi_irom_wready), // Templated
うん、全て小文字になった。