gvim 模板(ab命令快速生成常用Verilog模板)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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>;


总结

例如:在使用的过程如果遇到更好用的模板还会继续更新。

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GVim 是一个功能强大的文本编辑器,可以在终端中使用。下面是一些常用GVim 命令: 1. 打开文件: 在 GVim 中,你可以通过在终端输入 `gvim 文件名` 来打开一个文件。例如,`gvim test.txt` 将打开一个名为 test.txt 的文件。 2. 复制和粘贴: 在 GVim 中,你可以使用 `yy` 命令来复制当前行,并使用 `p` 命令来粘贴在光标位置。例如,将光标放在想要复制的行上,然后按下 `yy`,接着将光标移动到希望粘贴的位置上,然后按下 `p` 来粘贴。 3. 保存和退出: 在 GVim 中,使用 `:w` 命令可以保存当前文件,使用 `:q` 命令可以退出 GVim。如果你在进行编辑时没有保存文件,GVim 会警告你保存文件。如果你想同时保存并退出,可以使用命令 `:wq`。 4. 搜索和替换: 在 GVim 中,你可以使用 `/关键词` 来搜索当前文件中的关键词。例如,如果你想搜索文件中的 "hello",只需在命令行中输入 `/hello`,按下 Enter 即可。你还可以使用 `:s/旧关键词/新关键词/g` 来替换文件中的内容。 5. 跳转和移动: 在 GVim 中,可以使用 `gg` 命令来跳转到文件的开头,使用 `G` 命令跳转到文件的结尾,使用 `:行号` 命令跳转到特定行。还可以使用 hjkl 键来在文件中上下左右移动光标。 6. 撤销和重做: 在 GVim 中,使用 `u` 命令可以撤销最后的操作,使用 `Ctrl + r` 命令可以重做。 这些是一些 GVim 常用命令,希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值