提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
gvim在编写Verilog代码时通过预先设定的模板可以快速生成特定代码模块,提高代码编写效率。
一、模板制作方法
1.Windows下:将以下代码拷贝到 "_vimrc"文件中,该文件在安装目录中,如果不知道安装目录在哪,可以在末行模式下输入::echo $VIM就可以显示安装位置。
2.Linux下:将以下代码拷贝到 ".vimrc"文件中,该文件一般在/home目录下,该文件属于隐藏文件,使用命令“ls -a” 可以查看到。
二、使用步骤
请注意:以下模板的映射名具有灵活性,可以根据你自己的需求修改相应的代码。我的命名规格一般是模块名英文翻译是单个单词,则令其映射为首字母大写的英文全拼,若翻译超过一个单词则命名为各单词首字母,并且大写。举个例子:就拿最常见的Verilog模块中的计数器模块来说,我的重命名为:Counter,若有多个计数器模块,可在其后加数字区。例如时序逻辑块(sequential logic),我的重命名为:SL,如有多个时序逻辑块,则同样在其名字后加数字区分。其他的都类似。
模板如下(模板中已做了英文注释,可参考):
" 语法高亮度显示
syntax on
"取消自动备份及产生swp文件
"set noundofile
"set nobackup
"set nowb
"set noswapfile
"自动保存
"set autowrite
"设置当文件被改动时自动载入
set autoread
"与windows共享剪贴板
set clipboard+=unnamed
"代码补全
set completeopt=preview,menu
"搜索匹配高亮
set hlsearch
set cuc
set cul
" 设置行号
set nu
"防止中文注释乱码
set fileencoding=utf-8
set fenc=utf-8
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936,big-5
set enc=utf-8
let &termencoding=&encoding
"设置字体
"set guifont=Monospace\ 13
" 设置tab4个空格
"set tabstop=4
"set expandtab
"程序自动缩进时候空格数
"set shiftwidth=4
"退格键一次删除4个空格
"set softtabstop=4
"autocmd FileType make set noexpandtab
" 在编辑过程中,在右下角显示光标位置的状态行
set ruler
" 搜索忽略大小写
set ignorecase
" vim使用自动对起,也就是把当前行的对起格式应用到下一行
"set autoindent
" 依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用
"set smartindent
" 在状态列显示目前所执行的指令
set showcmd
" 设置颜色主题
colorscheme koehler
set nocompatible
set backspace=indent,eol,start
"################### set file head start #########################
"autocmd创建新文件自动调用setfilehead()函数
autocmd BufNewFile *.v,*.sv,*.cpp,*.c,*.h exec ":call Setfilehead()"
func Setfilehead()
call append(0, '/***********************************************')
call append(1, '#')
call append(2, '# Filename: '.expand("%"))
call append(3, '#')
call append(4, '# Author: Bright - zhishigexianren@163.com')
call append(5, '# Description: ---')
call append(6, '# Create: '.strftime("%Y-%m-%d %H:%M:%S"))
call append(7, '# Last Modified: '.strftime("%Y-%m-%d %H:%M:%S"))
call append(8, '***********************************************/')
" call append(9, '')
endfunc
"map F2 to creat file head comment
"映射F2快捷键,生成后跳转至第10行,然后使用o进入vim的插入模式
map <F2> :call Setfilehead()<CR>:10<CR>o
"################### set file head end ##########################
" Annote the line where the cursor is
:map <F6> l0<ESC>i//<ESC>
" Cut-off Line
:ab COL //------------------------------Cut-off-Line----------------------------------------------------
" Note
:ab Note /*******************************Annotation****************************************************/
" Parameter
:ab Parameter <Tab>parameter<Tab><Tab>DATA_W<Tab><Tab>=<Tab>8;
" Localparam
:ab Localparam <Tab>localparam<Tab><Tab>P_ST_IDLE<Tab>=<Tab>8'b0000_0001<Tab><Tab>;
" Assign
:ab Assign <Tab>assign<Tab><Tab>o_<Tab><Tab>=<Tab>r_<Tab><Tab>;
" Initial
:ab Initial <tab>initial begin<Enter><Tab><Tab>#1;<Enter><Tab>end
" Sequential Logic
:ab SL1 <Tab>always @(posedge i_clk or negedge i_rstn)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Enter>
:ab SL2 <Tab>always @(posedge i_clk or negedge i_rstn)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Tab> if()<Enter>
:ab SL3 <Tab>always @(posedge i_clk or negedge i_rstn)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Tab> if()<Enter><Tab>else<Tab> if()<Enter>
" Combinatorial Logic
:ab CL1 <Tab>always @(*)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Enter>
:ab CL2 <Tab>always @(*)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Tab>if()<Enter><Enter>
:ab CL3 <Tab>always @(*)<Enter><Tab><Tab>if(!i_rstn)<Enter><Tab>else<Tab>if()<Enter><Tab>else<Tab>if()<Enter>
" Module
:ab Module module module_name(<Enter><Tab>input<Tab><Tab><Tab>i_clk<Tab><Tab>,<Enter><Tab>input<Tab><Tab><Tab>i_rstn<Tab><Tab>,<Enter><Tab>output<Tab>[15: 0]<Tab><Tab>o_out<Enter>);<Enter><Enter><Tab>// Parameter<Enter><Tab>parameter<Tab>DATA_W<Tab><Tab>=<Tab>8<Tab>;<Enter><Enter>endmodule
" Top
:ab Top module top_name(<Enter><Tab>input<Tab><Tab><Tab>i_clk<Tab><Tab>,<Enter><Tab>input<Tab><Tab><Tab>i_rstn<Tab><Tab>,<Enter><Tab>input<Tab>[15: 0]<Tab><Tab>i_in<Tab><Tab>,<Enter><Tab>output<Tab>[15: 0]<Tab><Tab>o_out<Tab><Tab><Enter>);<Enter><Tab>//Instantiation<Enter><Tab>module_name u_module_name(<Enter><Tab><Tab>.i_clk<Tab><Tab><Tab>(i_clk<Tab><Tab>),<Enter><Tab><Tab>.i_rstn<Tab><Tab><Tab>(i_rstn<Tab><Tab>),<Enter><Tab><Tab>.i_in<Tab><Tab><Tab>(i_in<Tab><Tab>),<Enter><Tab><Tab>.o_out<Tab><Tab><Tab>(o_out<Tab><Tab>)<Enter><Tab>);<Enter>endmodule
" Instantiation
:ab Instantiation <Tab>//Instantiation<Enter><Tab>module_name u_module_name(<Enter><Tab><Tab>.i_clk<Tab><Tab><Tab>(i_clk<Tab><Tab>),<Enter><Tab><Tab>.i_rstn<Tab><Tab><Tab>(i_rstn<Tab><Tab>),<Enter><Tab><Tab>.i_in<Tab><Tab><Tab>(i_in<Tab><Tab>),<Enter><Tab><Tab>.o_out<Tab><Tab><Tab>(o_out<Tab><Tab>)<Enter><Tab>);<Enter>
" Testbench
:ab Testbench `timescale 1 ns/1 ns<Enter><Enter>module testbench_name();<Enter><Enter><Tab>// Clock and reset signals <Enter><Tab>reg<Tab><Tab><Tab>i_clk<Tab><Tab>;<Enter><Tab>reg<Tab><Tab><Tab>i_rstn<Tab><Tab>;<Enter><Enter><Tab>// Input signals<Enter><Tab>reg<Tab>[15: 0]<Tab><Tab>din0<Tab><Tab>;<Enter><Tab>reg<Tab>[15: 0]<Tab><Tab>din1<Tab><Tab>;<Enter><Enter><Tab>// Output signals<Enter><Tab>wire<Tab>[15: 0]<Tab><Tab>dout0<Tab><Tab>;<Enter><Tab>wire<Tab>[15: 0]<Tab><Tab>dout1<Tab><Tab>;<Enter><Enter><Tab>// Clock period<Enter><Tab>parameter<Tab><Tab>CYCLE<Tab><Tab>=<Tab>20<Tab>;<Enter><Enter><tab>// Reset time<Enter><Tab>parameter<Tab><Tab>RST_TIME<Tab>=<Tab>3<Tab>;<Enter><Enter><Tab>// DUT<Enter><Tab>module_name<Enter><Tab>u_instatiation_name(<Enter><Tab><Tab>.i_clk<Tab><Tab>(i_clk<Tab><Tab>), <Enter><Tab><Tab>.i_rstn<Tab><Tab>(i_rstn<Tab><Tab>),<Enter><Tab><Tab>.din0<Tab><Tab>(din0<Tab><Tab>),<Enter><Tab><Tab>.din1<Tab><Tab>(din1<Tab><Tab>),<Enter><Tab><Tab>.dout0<Tab><Tab>(dout0<Tab><Tab>),<Enter><Tab><Tab>.dout1<Tab><Tab>(dout1<Tab><Tab>)<Enter><Tab>);<Enter><Enter><Tab>// Generate system clock<Enter><Tab>initial begin<Enter><Tab><Tab>i_clk = 0;<Enter><Tab><Tab>forever<Enter><Tab><Tab>#(CYCLE/2)<Tab>i_clk<Tab>=<Tab>~i_clk;<Enter><Tab>end<Enter><Enter><Tab>// Generate reset signal<Enter><Tab>initial begin<Enter><Tab><tab>i_rstn = 1;<Enter><tab><Tab>#2;<Enter><Tab><tab>i_rstn = 0;<Enter><Tab><tab>#(CYCLE*RST_TIME);<Enter><Tab><tab>i_rstn = 1;<Enter><Tab>end<Enter><Enter><Tab>// Input singals assignment<Enter><Tab>initial begin<Enter><Tab><Tab>#1;<Enter><Tab><Tab>//Initial value assignment<Enter><Tab><Tab>din0<Tab>=<Tab>0;<Enter><Tab><Tab>#(10*CYCLE);<Enter><Tab><Tab>// Start the assignment<Enter><Tab>end<Enter><Enter>endmodule
" State Machine
:ab SM <Tab>localparam<Tab>[2:0]<Tab>P_ST_IDLE<Tab>=<Tab>3'b000<Tab>;<enter><Tab>localparam<tab>[2:0]<tab>P_ST_S1<tab><Tab>=<Tab>3'b001<Tab>;<enter><Tab>localparam<Tab>[2:0]<Tab>P_ST_S2<Tab><Tab>=<Tab>3'b010<Tab>;<Enter><enter><Tab>reg<Tab><Tab>[2:0]<Tab>r_state_c<Tab>;<enter><Tab>reg<Tab><Tab>[2:0]<Tab>r_state_n<Tab>;<enter><Tab>always @( posedge i_clk or negedge i_rstn )<enter><Tab><Tab>if ( !i_rstn )<Tab>r_state_c<Tab><=<Tab>P_ST_IDLE<Tab>;<enter><Tab>else<Tab><Tab><Tab>r_state_c<Tab><=<Tab>r_state_n<tab>;<enter><enter><Tab>always @( * ) begin<enter><Tab><Tab>r_state_n = P_ST_IDLE;<enter><Tab>case ( r_state_c )<enter><Tab><Tab>IDLE: begin<enter><Tab><Tab><Tab>if ( )<Tab><Tab>r_state_n = P_ST_S1;<enter><Tab><Tab>else<Tab>if ( )<Tab><Tab>r_state_n = P_ST_S2;<enter><Tab><Tab>else<Tab><Tab><Tab>r_state_n = P_ST_IDLE;<Enter><Tab><Tab>end<enter><Tab><Tab>P_ST_S1: begin<enter><Tab><Tab><Tab>if ( )<Tab><Tab>r_state_n = P_ST_IDLE;<enter><Tab><Tab>else<Tab>if ( )<Tab><Tab>r_state_n = P_ST_S2;<enter><Tab><Tab>else<Tab><Tab><Tab>r_state_n = P_ST_S1;<enter><Tab><Tab>end<enter><Tab><Tab>P_ST_S2: begin<enter><Tab><Tab><Tab>if ( )<Tab><Tab>r_state_n = P_ST_IDLE;<enter><Tab><Tab>else<Tab>if ( )<Tab><Tab>r_state_n = P_ST_S1;<enter><Tab><Tab>else<Tab><Tab><Tab>r_state_n = P_ST_S2;<enter><Tab><Tab>end<enter><Tab><Tab>default:<Tab><Tab>r_state_n = P_ST_IDLE; <enter><Tab>endcase<enter><Tab>end<enter><enter><Tab>always @( posedge i_clk or negedge i_rstn )<enter><Tab><Tab>if ( !i_rstn )<enter><Tab>else begin <enter><Tab><Tab><Tab>case ( r_state_n )<enter><Tab><Tab><Tab>endcase <enter><Tab>end
" Counter
:ab Counter <Tab>reg<Tab>[15:0]<Tab><Tab>r_cnt<Tab><Tab>;<Enter><Tab>wire<Tab><Tab>w_cnt_clr<Tab><Tab>=<Tab><Tab>;<Enter><Enter><Tab>wire<Tab><Tab>w_cnt_inc<Tab><Tab>=<Tab><Tab>;<Tab>always @(posedge i_clk or negedge i_rstn)<Enter><Tab><Tab>if(!i_rstn)<Tab><Tab>cnt <= 'h0;<Enter><Tab>else<Tab>if(w_cnt_clr)<Tab><Tab>r_cnt <= 'h0;<Enter><Tab>else<Tab>if(w_cnt_inc)r_cnt <= r_cnt + 1'b1;<Enter>
" Output
:ab Output32 <Tab>output<Tab>[31: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output16 <Tab>output<Tab>[15: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output8 <Tab>output<Tab>[ 7: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output4 <Tab>output<Tab>[ 3: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output3 <Tab>output<Tab>[ 2: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output2 <Tab>output<Tab>[ 1: 0]<Tab><Tab>o_<Tab><Tab>;
:ab Output1 <Tab>output<Tab> <Tab><Tab>o_<Tab><Tab>;
" Input
:ab Input32 <Tab>input<Tab>[31: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input16 <Tab>input<Tab>[15: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input8 <Tab>input<Tab>[ 7: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input4 <Tab>input<Tab>[ 3: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input3 <Tab>input<Tab>[ 2: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input2 <Tab>input<Tab>[ 1: 0]<Tab><Tab>i_<Tab><Tab>;
:ab Input1 <Tab>input<Tab> <Tab><Tab>i_<Tab><Tab>;
" Wire
:ab Wire32 <Tab>wire<Tab>[31: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire16 <Tab>wire<Tab>[15: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire8 <Tab>wire<Tab>[ 7: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire4 <Tab>wire<Tab>[ 3: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire3 <Tab>wire<Tab>[ 2: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire2 <Tab>wire<Tab>[ 1: 0]<Tab><Tab>w_<Tab><Tab>;
:ab Wire1 <Tab>wire<Tab> <Tab><Tab>w_<Tab><Tab>;
" Register
:ab Reg32 <Tab>reg<Tab>[31: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg16 <Tab>reg<Tab>[15: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg8 <Tab>reg<Tab>[ 7: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg4 <Tab>reg<Tab>[ 3: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg3 <Tab>reg<Tab>[ 2: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg2 <Tab>reg<Tab>[ 1: 0]<Tab><Tab>r_<Tab><Tab>;
:ab Reg1 <Tab>reg<Tab> <Tab><Tab>r_<Tab><Tab>;
总结
例如:在使用的过程如果遇到更好用的模板还会继续更新。