这才是用Gvim写Verilog的正确方式

环境:RedHat Linux,工具:GVim,Emacs

为了高效的编写Verilog,通常有些编辑器插件可以自动生成代码,比如自动端口定义,自动连线,自动实例化等等。公司的环境有很好用的自动化插件,想给自己的电脑也整个怎么做。比如Emacs中有个插件叫verilog-mode。但是博主习惯了用Vim,查询后发现Vim也可以调用这个插件来实现自动化。

verilog-mode开发者网站在这里,更多内容去上网查询。

https://www.veripool.org/wiki/verilog-mode

自动化前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
module test (/*AUTOARG*/

);

input clk;
input rst_n;
input i;
output douty;

parameter DWIDTH=32;

/*AUTOREG*/

/*AUTOWIRE*/

assign doutx = i;

always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
douty <= 1'd0;
end
else
douty <= doutx;
end

assign doutx = i & o[DWODTH-1];

foo u_foo(/*autoinst*/

);

endmodule
//Local Variables:
//verilog-library-directories:("." "foo")
//End:

module foo(/*AUTOARG*/);

input i;
output [DWIDTH-1:0] o;

endmodule

自动化后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module test (/*AUTOARG*/
// Outputs
douty,
// Inputs
clk, rst_n, i
);

input clk;
input rst_n;
input i;
output douty;

parameter DWIDTH=32;

/*AUTOREG*/
// Beginning of automatic regs (for this module's undeclared outputs)
reg douty;
// End of automatics

/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire [DWIDTH-1:0] o; // From u_foo of foo.v
// End of automatics

assign doutx = i;

always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
douty <= 1'd0;
end
else
douty <= doutx;
end

assign doutx = i & o[DWODTH-1];

foo u_foo(/*autoinst*/
// Outputs
.o (o[DWIDTH-1:0]),
// Inputs
.i (i));

endmodule
//Local Variables:
//verilog-library-directories:("." "foo")
//End:

module foo(/*AUTOARG*/
// Outputs
o,
// Inputs
i
);

input i;
output [DWIDTH-1:0] o;

endmodule

在相应的位置写好命令,测试了下不区分大小写。然后在Vim命令模式下按 < Leader > + a,< Leader>在Vim中默认是 \,也就是按 \ + a,就OK了。这个对于写顶层的来说大大提高了效率。

实例化的文件和top在一个目录下直接运行就行,如果不在一个目录下,就在endmodule后添加如下

1
2
3
//Local Variables:
//verilog-library-directories:("." "子文件夹名1" "子文件夹名2")
//End:

如何安装

  • 确保自己的环境Emacs安装完整,最新的Emacs版本会自带这个插件

  • 从git上下这个文件到本地

1
git clone https://github.com/zhuzhzh/verilog_emacsauto.vim
  • 把这个插件放在/home/xxx/.vim/plugin/verilog_emacsauto.vim,plugin这个文件夹默认是没有,可以自己新建一个。
  • 然后打开verilog_emacsauto.vim里面的文件verilog_emacsauto.vim/plugin/systemverilog_emacs_auto.vim
  • 把其中所有的%.emacsautotmp全部替换成%.tmp.v
  • 把-l ~/.elisp/verilog-mode.el全部去掉

没去掉之前是这个亚子的

修改vim配置文件

去掉之后是这个亚子的

修改vim配置文件完成

  • 然后就大功告成了,还有图形界面可以使用

vim插件使用图形界面

常用的就这几个,还有更多的自动化读者可以自己去本文开始的开发者网站探索。或者打开Emacs,菜单栏-Verilog-AUTO Help,

auto-help

点击对应的auto会有下详细解释。

我也试了一下,这个autowire和autoreg,只能对output和实例化的端口进行操作,直接写一个always块或assign,如果操作的变量,不在output或实例化端口中,也不会自动定义。本文开始的那段代码中的变量doutx就没有被自动定义。在Emacs-菜单栏-Verilog-AUTO Help中打开这两个auto的详细介绍,貌似就是这样的。所以读者在使用的过程中应该注意。

autoreg的限制

autowire限制

本操作只在RedHat下操作成功,其他平台感兴趣的读者可以自己试试,有人有疑惑为什么不直接用Emacs呢,这就是习惯,编辑器用习惯了其实也都一样,并不是要说哪个更好用。听说Sublime Text中也有类似这样的插件,不过编辑器这个东西,找个自己用的顺的,能跨多个平台的就可以了。

关于写代码还有哪些便捷,提高效率的工具,欢迎留言区分享出来。

感谢订阅号 ExASIC提供的这个方法,并帮助我进行配置修改。

Reference

https://mp.weixin.qq.com/s/R-dzQ6xXnQ5YqUZTGPVO_A

https://mp.weixin.qq.com/s/-gPn6g5E7tvPdjus_yZxFA

NingHeChuan wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!