此篇为初篇,主要介绍环境搭建。部分功能可能已改动,只做参考。

点击查看终篇效果

综述

主要参考了下面几个链接的vimrc配置及脚本:

Kevin:如何提高敲代码的速度?

基于GVim搭建Verilog开发环境

全世界最好的编辑器VIM之Windows配置(gvim)

vim auto script for verilog & RtlTree - (like Emacs, Verdi)

automatic for Verilog & RtlTree : Automatic generator for Verilog HDL (upgraded) & RtlTree


Verilog专用设置

vimrc配置

根据Kevin:如何提高敲代码的速度?,修改相关vimrc的配置,根据自己的操作习惯做了一些快捷键映射的修改,同时添加部分注释。


自动化脚本

在使用上述vimrc配置,搜索相关资料时,作者在vim auto script for verilog & RtlTree - (like Emacs, Verdi)意外发现一个Verilog自动化脚本。此脚本包含很多Vim相关自动化功能,只需要自己修改部分脚本文件即可使用。

安装方法

在源地址下载链接后,将.vim/plugin文件夹下automatic.vim放入自己的Gvim同样位置的plugin文件夹下。另外可粘贴/after文件夹至vim源文件位置,作为Gvim工具栏使用的icon图标。由于原作者使用的是Linux,因此在Windows下需要重新配置图片位置及格式。

我的VIM安装位置为E:\Vim\vim73,因此将automatic.vim的下列代码

1
2
3
4
5
6
7
8
9
10
11
12
13
amenu ToolBar.-Show-            :
amenu icon=$HOME/.vim/after/ShowCall.xpm ToolBar.ShowCall :call ShowCall()<CR>
amenu icon=$HOME/.vim/after/ShowDef.xpm ToolBar.ShowDef :call ShowDef()<CR>
amenu ToolBar.-TimingWave- :
amenu icon=$HOME/.vim/after/AddClk.xpm ToolBar.AddClk :call AddClk()<CR>
amenu icon=$HOME/.vim/after/AddSig.xpm ToolBar.AddSig :call AddSig()<CR>
amenu icon=$HOME/.vim/after/AddBus.xpm ToolBar.AddBus :call AddBus()<CR>
amenu icon=$HOME/.vim/after/AddNeg.xpm ToolBar.AddNeg :call AddNeg()<CR>
amenu icon=$HOME/.vim/after/AddBlk.xpm ToolBar.AddBlk :call AddBlk()<CR>
amenu ToolBar.-Always- :
amenu icon=$HOME/.vim/after/alpn.xpm ToolBar.alpn :call AlBpn()<CR>
amenu icon=$HOME/.vim/after/al.xpm ToolBar.al :call AlB()<CR>
amenu icon=$HOME/.vim/after/alnn.xpm ToolBar.alnn :call AlBnn()<CR>

修改为(这里$VIM为指向E:\VIM的环境变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
amenu ToolBar.-Show-            :
amenu icon=$VIM/vim73/after/ShowCall.bmp ToolBar.ShowCall :call ShowCall()<CR>
amenu icon=$VIM/vim73/after/ShowDef.bmp ToolBar.ShowDef :call ShowDef()<CR>
amenu ToolBar.-TimingWave- :
amenu icon=$VIM/vim73/after/AddClk.bmp ToolBar.AddClk :call AddClk()<CR>
amenu icon=$VIM/vim73/after/AddSig.bmp ToolBar.AddSig :call AddSig()<CR>
amenu icon=$VIM/vim73/after/AddBus.bmp ToolBar.AddBus :call AddBus()<CR>
amenu icon=$VIM/vim73/after/AddNeg.bmp ToolBar.AddNeg :call AddNeg()<CR>
amenu icon=$VIM/vim73/after/AddBlk.bmp ToolBar.AddBlk :call AddBlk()<CR>
amenu ToolBar.-Always- :
amenu icon=$VIM/vim73/after/alpn.bmp ToolBar.alpn :call AlBpn()<CR>
amenu icon=$VIM/vim73/after/al.bmp ToolBar.al :call AlB()<CR>
amenu icon=$VIM/vim73/after/alnn.bmp ToolBar.alnn :call AlBnn()<CR>

这样打开Gvim就可以看见菜单栏和工具栏了。

工具栏和菜单栏

下面介绍这个脚本的一些自动化功能。


添加时序波形TimingWave

在编辑器内可以添加时序波形,通过菜单栏、工具栏以及快捷键操作。可以添加时钟(clk),信号(sig)和总线(bus)信号。通过翻转(Invert,快捷键ctrl+F8)操作信号。

配置参数在automatic.vim的如下位置:

1
2
3
4
5
6
let s:sig_offset = 13
let s:clk_period = 8
let s:clk_num = 16
let s:cq_trans = 1
let s:wave_max_wd = s:sig_offset + s:clk_num*s:clk_period
"0 is clk posedge, 4 is clk negedge

sig_offset:产生信号的偏移宽度

clk_period: 产生的时钟信号的周期

clk_num: 产生的时钟信号的个数

cq_trans: 第几个沿开始跳变。0代表上升沿,4代表下降沿。这里用1表示上升沿跳变,延迟1个单位。

输出的波形样式如下:

输出波形


添加always块和头部

在在编辑器内可以添加always块和文件头,通过菜单栏、工具栏或快捷键操作。前面的vimrc配置中其实已经有简洁版的always块生成方法(输入"al"),这里使用脚本可以使得修改配置更加简单,因为配置是通过函数输入的,不需要再手动去找位置改代码。

always块生成

always

想要修改always的生成逻辑,修改automatic.vim的如下代码即可(一共四种类型的alwyas块,这里只放一种作参考):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"Always Block definition {{{1

function AlBpn() "{{{2
let lnum = line(".")
for idx in range(1,7)
call append(lnum,"")
endfor
call setline(lnum+1,"always @(posedge clk or negedge rst_n) begin")
call setline(lnum+2," if(!rst_n) begin")
call setline(lnum+3," ")
call setline(lnum+4," end else if() begin")
call setline(lnum+5," end else begin")
call setline(lnum+6," end")
call setline(lnum+7,"end")
call cursor(lnum+3,9)
endfunction "}}}2

同样的方法可以修改添加头部设置。这里推荐删除原vimrc配置产生头文件的部分代码。

因为原vimrc配置由于头部过长,修改配置非常麻烦,但在此脚本的函数下比较方便。修改的代码位置如下:

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
function AddHeader() "{{{2
let line = getline(1)
if line =~ '// +FHDR'
return
endif
let company = system("echo $COMPANY")
let company = substitute(company,'\n','','')
if company =~ 'COMPANY:'
echohl WarningMsg | echo "unix env $COMPANY: Undefined variable. Please set_env COMPANY in ~/.cshrc" | echohl None
endif
"===============================================================
" Add File Header
"===============================================================
let filename = expand("%")
call append(0, "// +FHDR------------------------------------------------------------")
call append(1, "// Copyright (c) ".strftime("%Y ") . company . ".")
call append(2, "// ALL RIGHTS RESERVED")
call append(3, "// -----------------------------------------------------------------")
call append(4, "// Filename : ".filename)
call append(5, "// Author : ".s:GetUserName())
call append(6, "// Created On : ".strftime("%Y-%m-%d %H:%M"))
call append(7, "// Last Modified : ")
call append(8, "// -----------------------------------------------------------------")
call append(9, "// Description:")
call append(10, "//")
call append(11, "//")
call append(12, "// -FHDR------------------------------------------------------------")
call append(13, "")
endfunction "}}}2

注意这里作者使用的姓名、公司等是在linux系统下自动配置的,可以根据自己的需求自行修改(本人依旧采用vimrc配置头部的格式,只是改成了使用脚本的方法)。修改如下:

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
function AddHeader() "{{{2
let line = getline(1)
if line =~ '// +FHDR'
return
endif
let company = system("echo $COMPANY")
let company = substitute(company,'\n','','')
if company =~ 'COMPANY:'
echohl WarningMsg | echo "unix env $COMPANY: Undefined variable. Please set_env COMPANY in ~/.cshrc" | echohl None
endif
"===============================================================
" Add File Header
"===============================================================
let filename = expand("%")
call append(0, "// =================================================================================")
call append(1, "// Project Name : Test")
call append(2, "// Device : Xlinx")
call append(3, "// Author : HonkW")
call append(4, "// Email : honkwang93@gmail.com")
call append(5, "// Website : https://honk.wang")
call append(6, "// Create Time : ".strftime("%Y/%m/%d %H:%M"))
call append(7, "// File Name : .v")
call append(8, "// Module Name :")
call append(9, "// ")
call append(10, "// CopyRight(c) 2020, NPIC")
call append(11, "// All Rights Reserved")
call append(12, "// ")
call append(13, "// =================================================================================")
call append(14, "// Modification History:")
call append(15, "// Date By Version Change Description")
call append(16, "// ---------------------------------------------------------------------------------")
call append(17, "// ".strftime("%x")." Honk 1.0 Original")
call append(18, "// ")
call append(19, "// =================================================================================")
call append(20, "`timescale 1ns/1ns")
call append(21, "module")
call append(22, "( ")
call append(23, " ")
call append(24, " ")
call append(25, ");")
call append(26, " ")
call append(27, "endmodule")
call cursor(8,19)
endfunction "}}}2

当然,为了和我的vimrc统一,添加了map的快捷键设置,快捷键依旧保持为"hd",然后删除了vimrc中冗长且不好修改的头部文件配置代码。

1
map hd                                                                  :call AddHeader()<CR>i

实例/模块搜索

可以通过Search菜单栏上下搜索.v文件中多个例化模块,或者搜索module。


单行/多行注释

单行注释可直接通过快捷键或菜单栏点击生成,格式可在automatic.vim代码中自行修改。

多行注释注意先选中需要注释的内容再使用快捷键或菜单栏点击,否则可能出现异常。


自动例化

自动进行模块的端口例化。下面以一个例子作为说明:

假设已完成模块的文件名为sdrmc_state.v,模块名为sdrmc_state,模块端口如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module sdrmc_state (
// Outputs
pre_sd_ras_p, pre_sd_cas_p, pre_sd_we_p, pre_ld_brst, pre_ld_rcd,
pre_ld_cslt, pre_clr_ref, pre_sd_doe_n, pre_sd_doe2_n,
pre_sd_ready, pre_sd_add_mx, pre_ad_tri,
// Inputs
Reset, Clk, brst_end, cslt_end, rcd_end, auto_ref, ki_end,
clr_ref, Act_st, write_st
);
output pre_sd_ras_p, pre_sd_cas_p, pre_sd_we_p, pre_ld_brst;
output pre_ld_rcd, pre_ld_cslt, pre_clr_ref, pre_ad_tri;
output pre_sd_doe_n, pre_sd_doe2_n, pre_sd_ready, pre_sd_add_mx;

input Reset, Clk, brst_end, cslt_end, rcd_end;
input auto_ref, ki_end, clr_ref;
input [2:0] Act_st;
input write_st;

同一文件夹下新建一个.v文件。假设在这个文件例化sdrmc_state模块,则只需要在代码中输入(注意autoinst的输入方法,以及最后必须加分号):

1
sdrmc_state u_sdrmc_state(/*autoinst*/);

鼠标点中模块实例化行(autoinst关键字所在行),然后选择菜单Verilog -> AutoInst, 即完成自动例化功能 (或使用快捷键)。

自动例化状态如下:

1
2
3
4
5
6
7
8
9
10
   sdrmc_state u_sdrmc_state(/*autoinst*/
.pre_sd_ras_p (pre_sd_ras_p ), // output
.pre_ld_rcd (pre_ld_rcd ), // output
.pre_sd_doe_n (pre_sd_doe_n ), // output

.Reset (Reset ), // input
.auto_ref (auto_ref ), // input
.Act_st (Act_st[2:0] ), // input
.write_st (write_st ) // input
);

同时,原作者开发了几个实用的自动例化的相关功能

  • 自动例化更新:

    功能用于提示当子模块有接口改变后,快速的知道有哪些模块被添加或者被删除
    提示会用注释的方式在模块port例化行的末尾加上,修改连线代码后,请自行删除。
    // INST_NEW 表示当前行,为子模块新增加的信号
    // INST_DEL 表示当前行,子模块已经将此信号删除

    鼠标点中模块实例化行(autoinst关键字所在行),然后选择菜单 Verilog -> AutoInstUpdate, AutoInstUpdateOrder 是将连线顺序重新排布为子模块接口定义的顺序,方便对应

  • 添加例化模块的端口方向:

    鼠标点中模块实例化行(autoinst关键字所在行),然后选择菜单 Verilog -> AppendPortDirectionToInst

    注意这个功能是没有添加端口方向的例化模块使用的。如果使用的原作者的自动例化功能,是自动附带端口方向的。如果想取消这个功能,可以到automatic.vim的function AutoInst中修改部分代码

    1
    2
    3
    4
    5
    if value[7] == 1
    let tmp_line = tmp_line . suffix_margin . ') // ' . io_dir
    else
    let tmp_line = tmp_line . suffix_margin . '), // ' . io_dir
    endif

    修改为:

    1
    2
    3
    4
    5
    if value[7] == 1
    let tmp_line = tmp_line . suffix_margin . ') '
    else
    let tmp_line = tmp_line . suffix_margin . '), '
    endif

自动定义wire / reg

(以下为原作者语):此功能强烈依赖用户良好的verilog编码习惯,自己尝试后请慎重选择试用。 菜单Verilog -> AutoDef, 脚本会在autodef(请用注释符包起来)位置开始自动定义数据类型,当然不能识别所有的结构,未完全定义部分(会有提示,但测试中有遇到没有完全提示的情况)请自行添加到autodef结构之外, 避免重新autodef时被脚本删除。

此功能与vimrc中的配置有所重复(可查看vimrc配置文件),故暂不使用。


语法高亮

根据vim语法高亮—verilog/systemverilog的说法:

This script extends Verilog syntax highlighting, which comes along with Vim 6.3, and adds SystemVerilog stuff to it. It will recognize Verilog and SystemVerilog syntax in *.v, *.vh and *.sv files. The new syntax is named as “verilog_systemverilog”. If your scripts are loaded correctly, you should see this syntax name when you execute the Vim command “:set syntax?” in your Verilog/SystemVerilog files.

因此只有需要使用systemverilog的时候才需要,不然vim是自带verilog语法高亮的。安装步骤在链接中也有说,将三个文件分别拷贝到对应位置即可。此自动化脚本的压缩包内也包含语法高亮相关的配置文件。因暂时不使用systemverilog,故不使用此语法高亮扩展。


成对标签跳转

此脚本将matchit.vim文件放到plugin文件夹中,并在vimrc添加对标如下:

1
2
3
4
5
6
7
8
9
10
11
12
let b:match_words = '\<function\>:\<endfunction\>,'
\ . '\<task\>:\<endtask\>,'
\ . '\<module\>:\<endmodule\>,'
\ . '\<begin\>:\<end\>,'
\ . '\<case\>:\<endcase\>,'
\ . '\<class\>:\<endclass\>,'
\ . '\<for\>:\<endfor\>,'
\ . '\<while\>:\<endwhile\>,'
\ . '\<specify\>:\<endspecify\>,'
\ . '\<generate\>:\<endgenerate\>,'
\ . '\<\(ifdef\|ifndef\)\>:\<\(else\|elsif\)\>:\<endif\>,'
\ . '`\<\(ifdef\|ifndef\)\>:`\<\(else\|elsif\)\>:`\<endif\>'

参考基于GVim搭建Verilog开发环境,因Gvim的macro文件夹自带matchit.vim,只是平时未使用。因此直接在vimrc中添加路径即可。另外添加部分成对标签。最终在vimrc中添加如下代码:

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
" =============================================================
" 成对标签设置
" =============================================================
source $VIMRUNTIME/macros/matchit.vim

let b:match_ignorecase=0
let b:match_words=
\ '\<begin\>:\<end\>,' .
\ '\<if\>:\<else\>,' .
\ '\<module\>:\<endmodule\>,' .
\ '\<class\>:\<endclass\>,' .
\ '\<program\>:\<endprogram\>,' .
\ '\<clocking\>:\<endclocking\>,' .
\ '\<property\>:\<endproperty\>,' .
\ '\<sequence\>:\<endsequence\>,' .
\ '\<package\>:\<endpackage\>,' .
\ '\<covergroup\>:\<endgroup\>,' .
\ '\<primitive\>:\<endprimitive\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<interface\>:\<endinterface\>,' .
\ '\<function\>:\<endfunction\>,' .
\ '\<task\>:\<endtask\>,' .
\ '\<for\>:\<endfor\>,' .
\ '\<while\>:\<endwhile\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
\ '\<fork\>:\<join\>\|\<join_any\>\|\<join_none\>,' .
\ '`ifdef\>:`else\>:`endif\>,'

配置完成后,在Gvim中使用"%"操作,即可在各类配对的符号(针对verilog/systemverilog代码)中跳转。


字体缩放

zoom.vim放入plugin文件夹即可使用。使用"+“和”-"进行Gvim字体大小的缩放。


RTLTree

暂未使用,这里介绍一下找到的相关资料。主要想弄一个RTL结构树类型的插件。在搜索过程中找到了如下资料:

vtags3.0: vim/gvim中进行verilog语言信号追踪、显示拓扑插件,最新3.0版 ,然后根据这个找到了原版在vimscript上的原版vtags : verdi like, verilog code signal trace and show topo script。试了半天之后发现指导书均基于linux,貌似在windows下Gvim没法用,故放弃。

在这个自动化脚本里也有ctag_gen文件,作者也是用这个生成ctags,然后形成rtltree。尝试了发现不行,不知具体原因。

基于GVim搭建Verilog开发环境中介绍了universal-ctags的使用,使用 git-bash ctags -R --languages=Verilog /path/to/the/code 也成功生成了ctags,只是未尝试结合verilog_systemverilog的模块跳转功能。感觉这个功能影响不大,因为这个依然没有RTLTree显示的功能。

最新进展(2020-2-28):脚本ctags这个可以在windows下使用,需要perl。如果有git-bash很简单,git自带perl。可以用perl -v 查看自己的bash是否带perl。将所有.v文件和ctags_gen文件放到一个文件夹下,在git-bash中用perl输入:

1
perl ctags_gen *.v

这样就会在文件夹下生成一个tag文件。这样在Gvim中使用:Rtltree命令即可通过NERDTree插件查看Rtltree结构。注意这个脚本不是很稳定,有些时候调用会出问题。建议还是使用IDE,不在编辑器里使用。


插件设置

安装一些Verilog的Gvim插件。

Vundle插件管理

Vundle安装参考基于GVim搭建Verilog开发环境以及其源网站VundleVim/Vundle.vim。vimrc添加配置如下:

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
" =============================================================
" 插件设置
" =============================================================
" 设置运行路径,注意新建系统变量VIM指向Gvim的安装目录
if(has('win32') || has('win64'))
set rtp+=$VIM/vimfiles/bundle/Vundle.vim
let path='$VIM/vimfiles/bundle'
else
set rtp+=~/.vim/bundle/Vundle.vim
let path='~/.vim/bundle'
endif

" -----------------------插件列表------------------------------
call vundle#begin('$VIM/vimfiles/bundle')

"使用Vundle管理插件
Plugin 'VundleVim/Vundle.vim'
"多插件列表
Plugin 'AutoComplPop' "自动补全窗口弹出
Plugin 'vim-syntastic/syntastic' "语法检查

call vundle#end()

"允许插件
filetype plugin on

注意#begin位置那里要加入路径,不然可能生成两个bundle文件夹安装插件,因为默认在.vim文件夹下自建插件文件夹。

配置完成后启动Gvim,在Gvim中输入运行 :PluginInstall 安装插件。运行:PluginList查看安装了的插件。 若要卸载插件,先在vimrc中删除Plugin,然后启动Gvim,运行:PluginClean即可卸载插件。

这样的安装和卸载方法可以减少复制粘贴文件的麻烦,便于管理使用的插件。


AutoComplPop自动补全

输入时自动弹出补全窗口。直接使用Vundle安装即可。参考vim-scripts/AutoComplPop。根据网上的说法,YCM集成了多个插件,功能上应该更好。但鉴于本人暂时不需要复杂的自动补全,故没有选择YCM。


Syntastic代码检查

Vim之代码异步检测插件 ALEVim插件之ale中阐述主要有三种代码检查插件

  • Syntastic
  • Neomake
  • ALE

其中ALE为异步检测,效果最好,但是需要vim8以上的版本。本人之前一直使用的是Vim7.3,编译的要求也不高,只做简单的规则检查,所以暂时用的老版的syntastic。

使用Vundle安装syntastic过程中可能有故障,关闭打开的cmd窗口,忽略那些错误提示完成安装即可。

另外需要给syntastic配置Linter,这里使用iverilog。windows版本下载:Icarus Verilog for Windows。安装后需要将iverilog加入系统变量$PATH中,这样就可以在命令行里调用iverilog命令了。参考Windows 10下配置和使用Icarus Verilog (iverilog)和GTKWaveWindows上使用iverilog+gtkwave仿真

配置vimrc中的syntastic不正确会有类似故障信息如下:

1
2
3
4
5
E484: Cannot open file /tmp/vnmSZpx/4  
Error detected while processing function SyntasticInfo..310..309..247:
line 3:
E171: Missing :endif
Error detected while processing function SyntasticInfo..310:

Google后发现 Error messages when enabling syntastic #1384以及vim-syntastic/syntastic的FAQ的4.1里都有说,应该是shellslash的平台问题,syntastic_shell设置成git-bash后正常。但后来在syntastic调用git-bash一阵子再使用时出现故障

1
bash: /c: Is a directory /usr/bin/bash: Exit 126.

切换回命令行又可以正常使用。原因未知。

修改的vimrc配置:

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
"语法检查插件配置
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

"显示消息气泡
let g:syntastic_enable_balloons = 1

"
let g:syntastic_always_populate_loc_list = 1

"不自动进行代码检查
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {
\ "mode": "passive",
\ "active_filetypes": [""],
\ "passive_filetypes": ["verilog"] }

" 设置linter为iverilog,这里需要在系统变量PATH中添加iverilog的位置,这样shell才能识别iverilog指令
let g:syntastic_verilog_checkers = ['iverilog']

" 设置shell路径,注意这玩意不接受cmd.exe这种windows的shell,不设置就有问题(????????????????????????????????)
" let g:syntastic_shell = &shell

nnoremap check :SyntasticCheck<CR>

其中,mode_map设置主要为了关闭保存文件自动代码检查的功能。另外映射了check为代码检查的快捷键。代码编写完成后运行:SyntasticCheck或直接输入check即进行检查,效果如下:

syntastic

之后换新版Gvim考虑把代码检查换成ALE。


终版vimrc配置

按照之前需要的添加部分配置,然后删除了部分代码(添加always块和头部已经加入了自动化脚本的功能)。

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
" =============================================================
" Decription: 用于编写Verilog的vimrc文件,for windows
" Ver:1.1
" Maintainer: Honk
" Date: 2020-2-19
" =============================================================

" =============================================================
" 基础设置
" =============================================================
set nocompatible "关闭vi兼容模式
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin "部分按键按照windows模式操作,解决crtl+c、ctrl+v、ctrl+a等windows下的快捷键

"Windows Gvim 默认配置
set diffexpr=MyDiff()
function! MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

" =============================================================
" 成对标签设置
" =============================================================
source $VIMRUNTIME/macros/matchit.vim

let b:match_ignorecase=0
let b:match_words=
\ '\<begin\>:\<end\>,' .
\ '\<if\>:\<else\>,' .
\ '\<module\>:\<endmodule\>,' .
\ '\<class\>:\<endclass\>,' .
\ '\<program\>:\<endprogram\>,' .
\ '\<clocking\>:\<endclocking\>,' .
\ '\<property\>:\<endproperty\>,' .
\ '\<sequence\>:\<endsequence\>,' .
\ '\<package\>:\<endpackage\>,' .
\ '\<covergroup\>:\<endgroup\>,' .
\ '\<primitive\>:\<endprimitive\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<interface\>:\<endinterface\>,' .
\ '\<function\>:\<endfunction\>,' .
\ '\<task\>:\<endtask\>,' .
\ '\<for\>:\<endfor\>,' .
\ '\<while\>:\<endwhile\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
\ '\<fork\>:\<join\>\|\<join_any\>\|\<join_none\>,' .
\ '`ifdef\>:`else\>:`endif\>,'

" =============================================================
" 插件设置
" =============================================================
" 设置运行路径,注意新建系统变量VIM指向Gvim的安装目录
if(has('win32') || has('win64'))
set rtp+=$VIM/vimfiles/bundle/Vundle.vim
let path='$VIM/vimfiles/bundle'
else
set rtp+=~/.vim/bundle/Vundle.vim
let path='~/.vim/bundle'
endif

" -----------------------插件列表------------------------------
call vundle#begin('$VIM/vimfiles/bundle')

"使用Vundle管理插件
Plugin 'VundleVim/Vundle.vim'
"多插件列表
Plugin 'AutoComplPop' "自动补全窗口弹出
Plugin 'vim-syntastic/syntastic' "语法检查

call vundle#end()

"允许插件
filetype plugin on

"语法检查插件配置
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

"显示消息气泡
let g:syntastic_enable_balloons = 1

"
let g:syntastic_always_populate_loc_list = 1

"不自动进行代码检查
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {
\ "mode": "passive",
\ "active_filetypes": [""],
\ "passive_filetypes": ["verilog"] }

" 设置linter为iverilog,这里需要在系统变量PATH中添加iverilog的位置,这样shell才能识别iverilog指令
let g:syntastic_verilog_checkers = ['iverilog']

" 设置shell路径,注意这玩意不接受cmd.exe这种windows的shell,不设置就有问题(????????????????????????????????)
" let g:syntastic_shell = &shell

nnoremap check :SyntasticCheck<CR>

" =============================================================
" 界面设置
" =============================================================
set guifont=courier_new:b:h16 "windows设定字体风格字号
"set guifont=Courier\ 100\ Pitch "linux 设定字体风格字号
set number "显示行号
set background=light "背景
colorscheme desert "设定配色方案
syntax on "语法高亮
highlight Pmenu guibg=darkgrey guifg=white "修改自动补全窗口的配色
highlight PmenuSel guibg=lightgrey guifg=white

" =============================================================
" tab键设置
" =============================================================
set expandtab "tab自动转换空格
set softtabstop=4 "使得按退格键时可以一次删掉 4 个空格
set tabstop=4 "设定tab长度为4
set shiftwidth=4 "设定 << 和 >> 命令移动时的宽度为 4
"set autoindent "设定自动缩进

" =============================================================
" 其他设置
" =============================================================
"set ignorecase "搜索时忽略大小写
"set ignorecase smartcase "搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感

" ----------Vim打开文件时,会出现另一个同名的备份文件----------
set nowritebackup "写入期间不进行备份
"set writebackup "写入期间备份
set nobackup "不保存备份
"set backup "保存备份

" -------------------------------------------------------------
set helplang=en "设置英文帮助
"set helplang=cn "设置中文帮助

set directory=$VIMHOME\swp,.
set showcmd "显示在最右下角展示最近输入的命令
set backspace=indent,eol,start "不设定在插入状态下无法用退格键和delete键删除回车符
set foldclose=all "设置为自动关闭折叠
set fileformats=dos "消除文件格式不正确的出现^M
"set encoding=utf-8 "解决中文乱码
set termencoding=utf-8
set fileencodings=utf-8,chinese,latin-1
" -------------------------------------------------------------
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif

"language messages zh_CN.utf-8

" =============================================================
" IDE设置
" =============================================================

" -------------------------文件窗口----------------------------
"creat tags
set tags=tags;
set autochdir
"窗口管理
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
"let g:winManagerWindowLayout='FileExplorer|TagList'
let g:winManagerWindowLayout='FileExplorer'
nmap vp :WMToggle<cr>
"多文件编辑
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplMapWindowsNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplorerMoreThanOne=1
"grep
nnoremap <silent> <F10> :Grep<CR>

" -------------------------编辑vimrc--------------------------
"按F4或输入ee编辑_vimrc
:map <F4> :source $VIMHOME/_vimrc<cr>:w!<cr>
:map ,ee :e $VIMHOME/_vimrc<cr>

" ------------------------------------------------------------
cnoremap <silent> sp :sp<cr>
cnoremap <silent> vp :vsplit<cr>
":map gb :bd<cr><F4> "键盘键的映射,将gb快捷键映射为:bd回车键。即新建一个vim窗口。

" =============================================================
" 自定义设置
" nore 表示非递归
" n 表示在普通模式下生效
" v 表示在可视模式下生效
" i 表示在插入模式下生效
" c 表示在命令行模式下生效
" =============================================================
" -------------------------例化变量----------------------------
"F2例化光标选中变量(命令模式下)
:map <F2> ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ .\1 (\1 ),/<cr>*^24ldw24ldw`sj

" -------------------------生成时间----------------------------
"F2生成当前时间,格式为 2019/11/20 23:39:15(插入模式下)
":imap <F2> <C-R>=strftime("%c")<CR>
"F2生成当前时间,格式为 2019/11/20(插入模式下)
:imap <F2> <C-R>=strftime("%x")<CR>

" ------------------------产生代码段---------------------------
"添加reg/wire注释
:map ;cr i<cr><space><ESC>0dwi//========================================================================\<cr><space><ESC>0dwi// =========== Define Parameter and Internal signals =========== <cr><space><ESC>0dwi//========================================================================/<ESC>

"添加MAIN CODE注释
:map ;cc i<cr><space><ESC>0dwi//=============================================================================<cr><space><ESC>0dwi//************** Main Code **************<cr><space><ESC>0dwi//=============================================================================<ESC>

" ----------------------端口/变量声明--------------------------
"选中单词声明为wire
:map ;dw ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/wire \1;/<cr><F8>e*N`sj

"选中单词声明为reg
:map ;dr ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/reg \1;/<cr><F8>e*N`sj

"选中单词声明为input
:map ;i ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ input \1,/<cr><F7>e*N`sj

"选中单词声明为output wire
:map ;ow ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ output wire \1,/<cr><F7>bb*N`sj

"选中单词声明为output reg
:map ;or ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ output reg \1,/<cr><F7>bb*N`sj

" ------------------------对齐格式---------------------------
"调整格式以便对齐(例化后的)
:map <F6> :s/^ *\./ ./<cr>^f(i <ESC>f)i <ESC>^24ldw24ldwa <ESC>hdwj
"调整module定义中的变量,逗号和注释的位置
:map <F7> 0f,bi <ESC>^24ldwf,i <ESC>^48ldwa <ESC>dw^j
"调整reg,wire所在行的变量,逗号和注释的位置
:map <F8> 0f;bi <ESC>032ldwf;i <ESC>064ldwa <ESC>dw^j
"调整module定义中的逗号和注释的位置(定义中不包含input、output时使用)
:map <F9> 0f,i <ESC>056ldwa <ESC>dw<ESC>^j

" --------------------------其他-----------------------------
":map <F11> :s/$/ /<cr>j
":map <F12> :s/^\([^ ]*\)/NET "\1" IOSTANDARD = LVTTL \| LOC = "" ;/<cr>028ldw06l*Nj
":map ;f :s/\([0-9]\) *"/\1"/g<cr>j
":map <F12> :.w! F:\software_for_FPGA\eg.v<cr>:source F:\software_for_FPGA\eg.v<cr>
"删除TAB
":map ;t :%s/\t/ /g<cr>:w<cr>
"产生U_DLY
":imap <F4> <space><= #U_DLY
"删除
:map ;m :%s/
:autocmd Bufread :source $VIMHOME/_vimrc<cr>:w!<cr>


"====restore your cursor position in a file over several editing sessions
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

" =============================================================
" RTLTree
" 暂未使用,暂时关闭
" =============================================================
let t:RtlTreeVlogDefine = 0
"map <F4> :NERDTree<CR>
"map <F5> :RtlTree<CR>

其他设置

还有一些网上查到的相关配置文件,但是没有暂时还没有使用的,暂时列在下面作为备用。以后学习新东西需要用时方便参考。

中文帮助

Vim自带help文档可以切换为中文,参考链接如下:

Vim帮助文档首页

Vim中文帮助文档网页版

下载链接

下载完成,按步骤安装。安装完成后打开vim,输入:help ,这时vim中的help信息已经是中文了。 当然,可以通过下面命令来切换帮助语言。

1
2
set helplang=cn		"设置中文帮助
set helplang=en "设置英文帮助

参考

部分发现了但是未用到的配置资料。

提高Verilog和UVM testbench coding效率的利器

Verilog部分

  • 自动产生端口信号列表;

  • 自动产生信号声明;

  • 自动例化(能够识别例化之后连接的变更,优于emacs)

  • 自动产生一些有规律的代码(类似generate语句) 用户定义参数化模版

    UVM部分

  • 自动产生interface

  • 自动产生uvm_field_*

  • 各种uvm类的模版

vtags : verdi like, verilog code signal trace and show topo script

总结

为了在Windows下使用Gvim折腾了这么久,确实能得出一个结论:Linux开发比Windows方便很多。


最新v8.2版Gvim修改(2020-02-26 23:15:25 创建)

继续之前Gvim搭建Verilog编程环境的基础上,修改了部分配置和插件,针对最新的Gvim-v8.2。

vimrc更改

主要把代码段功能全部搬移到了automatic.vim文件里。另外对对齐操作进行了修改,使得input/output和reg/wire等的对齐也是一致的。另外autoinst的格式与对齐操作的格式的不一样,这个没去改,要用的时候直接重新对齐一下就好了。

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
" =============================================================
" Decription: 用于Verilog的vimrc文件,for windows
" Maintainer: Honk
" Date: 2020-2-26
" =============================================================

" =============================================================
" 基础设置
" =============================================================
set nocompatible "关闭vi兼容模式
source $VIMRUNTIME/vimrc_example.vim " Vim with all enhancements
source $VIMRUNTIME/mswin.vim " Remap a few keys for Windows behavior 部分按键按照windows模式操作,解决crtl+c、ctrl+v、ctrl+a等windows下的快捷键
behave mswin " Mouse behavior (the Windows way) 鼠标操作

" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
set diffexpr=MyDiff()
endif
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg1 = substitute(arg1, '!', '\!', 'g')
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg2 = substitute(arg2, '!', '\!', 'g')
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let arg3 = substitute(arg3, '!', '\!', 'g')
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
let cmd = substitute(cmd, '!', '\!', 'g')
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction

" =============================================================
" 界面设置
" =============================================================
set guifont=courier_new:b:h16 "windows设定字体风格字号
set number "显示行号
set background=light "背景
colorscheme desert "设定配色方案
syntax on "语法高亮
highlight Pmenu guibg=darkgrey guifg=white "修改自动补全窗口的配色
highlight PmenuSel guibg=darkblue guifg=white
set nofoldenable "关闭折叠

" =============================================================
" tab键设置
" =============================================================
set expandtab "tab自动转换空格
set softtabstop=4 "使得按退格键时可以一次删掉 4 个空格
set tabstop=4 "设定tab长度为4
set shiftwidth=4 "设定 << 和 >> 命令移动时的宽度为 4
"set autoindent "设定自动缩进

" =============================================================
" 其他设置
" =============================================================
"set ignorecase "搜索时忽略大小写
"set ignorecase smartcase "搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感

" ----------Vim打开文件时,会出现另一个同名的备份文件----------
set nowritebackup "写入期间不进行备份
"set writebackup "写入期间备份
set nobackup "不保存备份
"set backup "保存备份
set noundofile "不保存撤销文件

" -------------------------语言问题----------------------------
set helplang=en "设置英文帮助
"set helplang=cn "设置中文帮助

set directory=$VIMHOME\swp,.
set showcmd "显示在最右下角展示最近输入的命令
set backspace=indent,eol,start "不设定在插入状态下无法用退格键和delete键删除回车符
set foldclose=all "设置为自动关闭折叠
set fileformats=dos "消除文件格式不正确的出现^M
"set encoding=utf-8 "解决中文乱码
set termencoding=utf-8
set fileencodings=utf-8,chinese,latin-1
" -------------------------------------------------------------
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif

" =============================================================
" 插件设置
" =============================================================
" 设置运行路径,注意新建系统变量VIM指向Gvim的安装目录
if(has('win32') || has('win64'))
set rtp+=$VIM/vimfiles/bundle/Vundle.vim
let path='$VIM/vimfiles/bundle'
else
set rtp+=~/.vim/bundle/Vundle.vim
let path='~/.vim/bundle'
endif

" -----------------------插件列表------------------------------
call vundle#begin('$VIM/vimfiles/bundle')

"使用Vundle管理插件
Plugin 'VundleVim/Vundle.vim'
"多插件列表
Plugin 'AutoComplPop' "自动补全窗口弹出
Plugin 'preservim/nerdtree' "显示当前路径目录树结构
"Plugin 'dense-analysis/ale' "ALE-Asynchronous Lint Engine语法检查
Plugin 'vim-syntastic/syntastic' "syntastic语法检查
Plugin 'vim-airline/vim-airline' "状态栏美化

call vundle#end()

"总是打开Location List(相当于QuickFix)窗口,如果你发现syntastic因为与其他插件冲突而经常崩溃,将下面选项置0
let g:syntastic_always_populate_loc_list = 1

"不自动进行代码检查
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {
\ "mode": "passive",
\ "active_filetypes": [""],
\ "passive_filetypes": ["verilog"] }

" 设置linter为iverilog
let g:syntastic_verilog_checkers = ['iverilog']"允许插件

filetype plugin on

" =============================================================
" 成对标签设置
" =============================================================
source $VIMRUNTIME/macros/matchit.vim

let b:match_ignorecase=0
let b:match_words=
\ '\<begin\>:\<end\>,' .
\ '\<if\>:\<else\>,' .
\ '\<module\>:\<endmodule\>,' .
\ '\<class\>:\<endclass\>,' .
\ '\<program\>:\<endprogram\>,' .
\ '\<clocking\>:\<endclocking\>,' .
\ '\<property\>:\<endproperty\>,' .
\ '\<sequence\>:\<endsequence\>,' .
\ '\<package\>:\<endpackage\>,' .
\ '\<covergroup\>:\<endgroup\>,' .
\ '\<primitive\>:\<endprimitive\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<interface\>:\<endinterface\>,' .
\ '\<function\>:\<endfunction\>,' .
\ '\<task\>:\<endtask\>,' .
\ '\<for\>:\<endfor\>,' .
\ '\<while\>:\<endwhile\>,' .
\ '\<specify\>:\<endspecify\>,' .
\ '\<generate\>:\<endgenerate\>,' .
\ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
\ '\<fork\>:\<join\>\|\<join_any\>\|\<join_none\>,' .
\ '`ifdef\>:`else\>:`endif\>,'

" =============================================================
" 窗口管理设置
" =============================================================
"creat tags
set tags=tags;
set autochdir
"窗口管理
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
"let g:winManagerWindowLayout='FileExplorer|TagList'
let g:winManagerWindowLayout='FileExplorer'
nmap vp :WMToggle<cr>
"多文件编辑
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplMapWindowsNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplorerMoreThanOne=1
"grep
nnoremap <silent> <F10> :Grep<CR>

" =============================================================
" 自定义设置
" nore 表示非递归
" n 表示在普通模式下生效
" v 表示在可视模式下生效
" i 表示在插入模式下生效
" c 表示在命令行模式下生效
" =============================================================
" -------------------------编辑vimrc--------------------------
"按F4或输入ee编辑_vimrc
:map <F4> :source $VIMHOME/_vimrc<cr>:w!<cr>
:map ,ee :e $VIMHOME/_vimrc<cr>

" ------------------------------------------------------------
cnoremap <silent> sp :sp<cr>
cnoremap <silent> vp :vsplit<cr>
":map gb :bd<cr><F4> "键盘键的映射,将gb快捷键映射为:bd回车键。即新建一个vim窗口。

" -------------------------例化变量----------------------------
"F2例化光标选中变量(命令模式下)
:map <F2> ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ .\1 (\1 ),/<cr>*^24ldw24ldw`sj

" ----------------------端口/变量声明--------------------------
"选中单词声明为wire
:map ;dw ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ wire \1;/<cr><F8>e*N`sj

"选中单词声明为reg
:map ;dr ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ reg \1;/<cr><F8>e*N`sj

"选中单词声明为input
:map ;i ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ input \1,/<cr><F7>e*N`sj

"选中单词声明为output wire
:map ;ow ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ output wire \1,/<cr><F7>bb*N`sj

"选中单词声明为output reg
:map ;or ebmsd^:.s/^ *\([a-zA-Z][a-zA-Z0-9_]*\).*$/ output reg \1,/<cr><F7>bb*N`sj

" ------------------------对齐格式---------------------------
"调整格式以便对齐(例化后的)
:map <F6> :s/^ *\./ ./<cr>^f(i <ESC>f)i <ESC>^24ldw24ldwa <ESC>hdwj
"调整module定义中的变量,逗号和注释的位置
:map <F7> 0f,bi <ESC>^24ldwf,i <ESC>^48ldwa <ESC>dw^j
"调整reg,wire所在行的变量,逗号和注释的位置
:map <F8> 0f;bi <ESC>028ldwf;i <ESC>052ldwa <ESC>dw^j
"调整module定义中的逗号和注释的位置(定义中不包含input、output时使用)
:map <F9> 0f,i <ESC>056ldwa <ESC>dw<ESC>^j

" -------------------------生成时间----------------------------
"F2生成当前时间,格式为 2019/11/20 23:39:15(插入模式下)
":imap <F2> <C-R>=strftime("%c")<CR>
"F2生成当前时间,格式为 2019/11/20(插入模式下)
:imap <F2> <C-R>=strftime("%x")<CR>

" -------------------------其他设置----------------------------
"删除TAB
":map ;t :%s/\t/ /g<cr>:w<cr>
"TAB 转化为空格
:map ;t :retab<cr>

"产生U_DLY
":imap <F4> <space><= #U_DLY
"删除
:map ;m :%s/
:autocmd Bufread :source $VIMHOME/_vimrc<cr>:w!<cr>
"====restore your cursor position in a file over several editing sessions
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

let t:RtlTreeVlogDefine = 0
"map <F4> :NERDTree<CR>
"map <F5> :RtlTree<CR>

脚本更改

针对automatic.vim做了部分修改:

  1. 添加一键生成三段式状态机(快捷键fsm);
  2. 头文件生成快捷键由hd改为header(鉴于hd可能误操作);
  3. 删掉了check快捷键(使用:SyntasticCheck命令直接检查,主要是点击后用TAB也很方便,不太需要map这个快捷键);
  4. 生成主代码和wire/reg部分注释的快捷键由vimrc搬移到脚本中(快捷键;cr和;cc)。

插件更改(2020.3.6更新)

原计划更改代码检查工具从Syntastic变为异步的ALE,但使用Vundle安装ALE并配置之后,可以在ALEInfo看到Liner报出来的故障信息(且是多次执行的结果,表示其在异步调用Linter,且调用成功),但在Vim界面上没有任何标识,原因未知,进入iverilog.vim中echom其匹配error/warning/syntaxerr消息的那个函数结果好像是空的,不知道是脚本哪里有问题。在google和百度搜索了半天后无解,遂放弃。但在安装ALE中顺便安装了NERDTree和airline-vim,后来也没有再卸载。

  • NERDTree:文件结构树

  • airline-vim:状态栏美化

安装过程依旧使用Vundle插件管理。

  • VisIncr(新添加):列操作,添加递增递减一列数字

部分计划

  • 为了学习脚本中的ctag和调用RTLTree,以后找机会学一下Perl
  • 部分功能问题在windows下没有解决方案,但是linux下有,可以一试。

部分有用链接

学习过程中还搜索到了一些相关的可用功能,因为跟现有功能重复,所以没有使用。在此记录留作备份。

在Vim中集成emacs下的verilog-mode功能

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

Vim Syntax Plugin for Verilog and SystemVerilog

自己写的一个verilog模块例化自动生成脚本,希望大家能试用,多提bug啊

最后贴一张操作图吧。

操作图