一: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博客