FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

EmacsのVerilogモードで、AutoConnectビット幅を制御する(Lispと繋げるときの注意)

自分でも時々悩むのだが、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

うん、全て小文字になった。