此篇为初篇,主要介绍环境搭建。部分功能可能已改动,只做参考。
点击查看终篇效果
综述
主要参考了下面几个链接的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 = 13let s:clk_period = 8let s:clk_num = 16let s:cq_trans = 1let 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的生成逻辑,修改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 ( 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, 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关键字所在行),然后选择菜单Verilog -> AutoInst, 即完成自动例化功能 (或使用快捷键)。
自动例化状态如下:
1 2 3 4 5 6 7 8 9 10 sdrmc_state u_sdrmc_state( .pre_sd_ras_p (pre_sd_ras_p ), .pre_ld_rcd (pre_ld_rcd ), .pre_sd_doe_n (pre_sd_doe_n ), .Reset (Reset ), .auto_ref (auto_ref ), .Act_st (Act_st[2 :0 ] ), .write_st (write_st ) );
同时,原作者开发了几个实用的自动例化的相关功能
自动例化更新:
功能用于提示当子模块有接口改变后,快速的知道有哪些模块被添加或者被删除
提示会用注释的方式在模块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输入:
这样就会在文件夹下生成一个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之代码异步检测插件 ALE 、 Vim插件之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)和GTKWave 和Windows上使用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
即进行检查,效果如下:
之后换新版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.vimsource $VIMRUNTIME /mswin.vimbehave 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 "使用Vundle管理插件 Plugin 'VundleVim/Vundle.vim' " 多插件列表Plugin 'AutoComplPop' "自动补全窗口弹出 Plugin 'vim-syntastic/syntastic' " 语法检查call vundle "允许插件 filetype plugin on " 语法检查插件配置set statusline+=%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 = &shellnnoremap 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=1let Tlist_Exit_OnlyWindow=1"let g:winManagerWindowLayout='FileExplorer|TagList' let g:winManagerWindowLayout='FileExplorer' nmap vp :WMToggle<cr> " 多文件编辑let g:miniBufExplMapCTabSwitchBufs=1let g:miniBufExplMapWindowsNavVim=1let g:miniBufExplMapWindowNavArrows=1let 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部分
总结
为了在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 enhancementssource $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 !~ 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长度为4set 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 "使用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 "总是打开Location List(相当于QuickFix)窗口,如果你发现syntastic因为与其他插件冲突而经常崩溃,将下面选项置0 let g:syntastic_always_populate_loc_list = 1 " 不自动进行代码检查let g:syntastic_auto_loc_list = 1let g:syntastic_check_on_open = 0let g:syntastic_check_on_wq = 0let 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=1let Tlist_Exit_OnlyWindow=1"let g:winManagerWindowLayout='FileExplorer|TagList' let g:winManagerWindowLayout='FileExplorer' nmap vp :WMToggle<cr> " 多文件编辑let g:miniBufExplMapCTabSwitchBufs=1let g:miniBufExplMapWindowsNavVim=1let g:miniBufExplMapWindowNavArrows=1let 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做了部分修改:
添加一键生成三段式状态机(快捷键fsm);
头文件生成快捷键由hd改为header(鉴于hd可能误操作);
删掉了check快捷键(使用:SyntasticCheck命令直接检查,主要是点击后用TAB也很方便,不太需要map这个快捷键);
生成主代码和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啊
最后贴一张操作图吧。