Verilog_mode常用的几个用法

一:verilog mode中如何使用正则表达

在顶层实例化时,有大量的信号需要重新命名,使用模板的话会增加大量的注释内容,不过往往这些信号命名有特定的规律,我们可以使用正则表达式来处理,下面举几个例子:

1:提取信号中固定位置的数字

.pci_req\([0-9]+\)_j   (pci_req_jtag_[\1]),

.pci_req12_j   (pci_req_jtag_[12]),

或者使用@

   .pci_req@_l      (pci_req_jtag_[\1]),

2:删除末尾下划线内容

.\(.*\)_j        (\1_[]),

.pci_req_j   (pci_req[7:0])

这个我个人最常用;

二:AUTOINSTPARAM的使用

如何在实例化的时候自动填充参数列表?AUTOINSTPARAM可以做到,如下:

module InstModule;
   parameter PARAM1 = 1;
   parameter PARAM2 = 2;
endmodule

module ModnameTest;
   InstModule #(/*AUTOINSTPARAM*/
         // Parameters
         .PARAM1  (PARAM1),
         .PARAM2  (PARAM2))
     instName
       (/*AUTOINST*/
        ...);

三:多目录问题(如果文件在同一个目录,可以忽略)

// Local Variables:
// verilog-library-directories:("." "subdir" "subdir2")
// verilog-library-files:("/some/path/technology.v" "/some/path/tech2.v")
// verilog-library-extensions:(".v" ".h")
// End:

verillog-mode首先在当前目录查找;

verilog-library-extensions中查找带有每个扩展名的模块名,通常是一个’.v’;

verilog-library-directories包含了要在其中查找模块的目录列表;

verilog-library-files包含一个文件列表,这些文件将完整地搜索模块。这通常是到技术文件的完整路径,其中定义了许多标准单元;

四:AUTOXXX

module top_md(/*AUTOARG*/);
input           din1;
input [1:0]     din2;

output          dout1;
output [1:0]    dout2;

/*AUTOINOUT*/
/*AUTOINPUT*/
/*AUTOOUTPUT*/
/*AUTOWIRE*/

wire            din_a;
wire            din_b;


assign din_a = din2[0];
assign din_b = din2[1];

sub_md u_sub_md
(/*AUTOINST*/
);

assign dout2[1:0] = dout_a[1:0];

endmodule // top_md

上面的例子包含了AUTOARG/AUTOINPUT/AUTOOUTPUT/AUTOWIRE/AUTOINOUT

不支持带 `ifdefs 等条件限制的端口声明,如有此需求,可以将其写在 AUTOARG  前, AUTOARG 不会对其进行重新声明。不过不建议这种方式,因为在 AUTOINST 中会引入更多的 `ifdefs 。

module ex_arg (
`ifdef need_x_input
  x,
`endif
  /*AUTOARG*/
  // Outputs
  o,
  // Inputs
  i);

`ifdef need_x_input
  input x;   // This is an optional input, if `need_x_signal is defined
`endif

  ...

五:信号模板中使用Lisp

在AUTO_TEMPLATE中指定简单的线名称并不能够解决所有需求,尤其是在多个实例化中使用同一信号不同数据位时。因此,Verilog-Mode允许你编写一个程序来进行计算并为实例化端口进行命名,如下:

/* InstModule AUTO_TEMPLATE (
     .a(in[@"(+ (* 8 @) 7)":@"(* 8 @)"]),
     );*/

InstModule u_a0 (/*AUTOINST*/
                 // Inputs
                 .a                     (in[7:0]));               // Templated
InstModule u_a1 (/*AUTOINST*/
                 // Inputs
                 .a                     (in[15:8]));              // Templated
InstModule u_a2 (/*AUTOINST*/
                 // Inputs
                 .a                     (in[23:16]));             // Templated
InstModule u_a3 (/*AUTOINST*/
                 // Inputs
                 .a                     (in[31:24]));             // Templated

 这里对上述Lisp代码部分解释一下, 也就是 @"(+ (* 8 @) 7)":@"(* 8 @)" :

  • 基础结构为 @"" 代表@为输入参数,引号内为计算处理
  • 每个括号内容为一步计算,形如 (* 8 @) ,意思是 @参数乘8
  • (+ (* 8 @) 7) 就是将 (* 8 @) 的结果加7

参考连接: Emacs verilog-mode 的使用 – Wenhui's Rotten Pen

Linux中verilog-mode使用方法总结_实例化代码和设计代码可以不放在一个文件里,利用verilog-library-files变量设_Alfred.HOO的博客-CSDN博客 

你可能感兴趣的:(Verilog,mode)