声明:本文内容是基于csdn博主学习后的笔记内容,如有侵权请联系删帖!
一、Gvim的安装
下载地址:GVIM官方下载地址
64位电脑可直接点击下方红框链接即可开始下载安装包。
安装包下载后,全程默认,无脑下一步即可,最后选择安装位置完成安装。
二、基础使用
2.1 工作模式
首先简单介绍一下gvim的三种工作模式:命令模式、插入模式和末位模式。
- 命令模式(默认模式,打开GVIM即进入该模式,不能进行文本编辑,只能够通过命令行来操作):a在光标后插入、i在行首插入
- 插入模式(文本编辑,即在该模式下进行文本编辑):esa键退出插入模式。
- 末位模式(配置文件,即在该模式下进行文件的临时配置):或 / 进入末位模式,回车键回到命令模式。
2.2 命令模式常用操作符
以下纪录常用的一些操作符,个人认为记太多用不到反而忘得更快。
dd : 删除本行
dG : 删除本行至末尾处的所有内容
ndd :删除n行
yy :复制本行内容
yyp : 复制本行内容,并粘贴至下一行
nyyp :: 复制n行内容,并粘贴至下一行
p : 粘贴
u : 撤销
ctrl + r : 取消撤销
gg :移动光标至行首
G : 移动光标至行末
x :删除字符
ddp :上下两行交换命令
0 : 光标移动到行首
$ :光标移动到行尾
2.3 末位模式常用操作指令
:wq 保存退出
:w 保存
:x 保存退出
/ 关键词 查找关键词,并标亮
:nohl 取消高亮
:%s/关键词/替换后的词/g (%s表示全局,g表示一个一个的替换,gc一次性全部替换)
:ab name code 简化模块,vimrc中设置,非常nice方便!
:sp (slipe)分屏横窗口 关闭:ctrl + w
:vsp 分屏竖窗口
2.4 可视化操作
块选 :gvim ctrl + q进入块选,hjkl选择范围,I进入插入模式,输入#来多行注释,esc退出完成多行注释。
列选:小写v
行选:大写V
三、ab命令快速制作verilog模板
模板包括:文件头、常用自定义命令、Module中常用模板(包括模块基本模板、组合时序逻辑模板、计数器、状态机、边沿检测器、同步器、触发器、触发器例化、头文件等)、预编译模板(延时、仿真精度)、TB模板(TB基本模板、产生时钟复位、延时任务、生成波形图文件、产生随机数、取对数、打开文件、断言等)、注释(注释头、段注释、端口注释等)、任务模板(延时任务、任务模板)。
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。原文链接
"""""""""""""""""""""""""""""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""
"按F4自动插入文件头
map <F4> :call SetTitle() <cr>:11 <cr><end>i"定义函数SetTitle,自动插入文件头
func SetTitle()
call append(line(".")-1 , "`timescale 1ns/1ps")
call append(line(".")+0 , "//******************************************************************")
call append(line(".")+1 , "//")
call append(line(".")+2 , "//*@File Name: ".expand("%"))
if expand("%:e") == "v"
let tmp1 = "verilog"
elseif expand("%:e") == "sv"
let tmp1 = "system verilog"
elseif expand("%:e") == "c"
let tmp1 = "C"
elseif expand("%:e") == "cpp"
let tmp1 = "C++"
elseif expand("%:e") == "txt"
let tmp1 = "plain text"
else
let tmp1 = "NONE"
endif
call append(line(".")+3 , "//*@File Type: ".expand(tmp1))
call append(line(".")+4 , "//*@Version : 0.0")
call append(line(".")+5 , "//*@Author : Zehua Dong, SIGS")
call append(line(".")+6 , "//*@E-mail : 1285507636@qq.com")
call append(line(".")+7 , "//*@Date : ".strftime("%c"))
call append(line(".")+8 , "//*@Function : ")
call append(line(".")+9 , "//")
call append(line(".")+10, "//*@V0.0 : Initial.")
call append(line(".")+11, "//")
call append(line(".")+12, "//******************************************************************")
call append(line(".")+13, "")
call append(line(".")+14, "//")
call append(line(".")+15, "// Header file")
call append(line(".")+16, "`include \"common.vh\"")
call append(line(".")+17, "")
call append(line(".")+18, "//")
call append(line(".")+19, "// Module")
call append(line(".")+20, "")
"新建文件后,自动定位到文件末尾
autocmd BufNewFile * normal Gendfunc
""""""""""""""""""""""""""""""""自定义命令""""""""""""""""""""""""""""""""""""显示时间,两种方式,可以取消注释都试试效果
":ab xtime <c-r>=strftime("%Y-%m-%d")<cr>
:ab xtime <c-r>=strftime("%Y-%m-%d %H:%M:%S")<cr>""""""""""""""""""""""""""""""""Module"""""""""""""""""""""""""""""""""""
"模块定义
:ab MBmk module (<enter>clk <enter>rst_n <enter>);<enter><enter>input clk <enter>input rst_n <enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter>endmodule"组合逻辑
:ab Zuhe always @(*) begin<Enter>if( )begin<Enter>end<Enter>else begin<Enter>end<Enter>end
"时序逻辑
:ab Shixu always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>end<enter>else begin<enter>end<enter>end
"计数器
:ab MBjsq `define COUNT_BITS 8<enter><enter>reg [ `COUNT_BITS-1:0 ] count;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>count <= #`DEL `COUNT_BITS'd0;<enter>end<enter>else if( count ) begin<enter>count <= #`DEL `COUNT_BITS'd0;<enter>end<enter>else begin<enter>count <= #`DEL count + `COUNT_BITS'd1;<enter>end<enter>end
"状态机
:ab MBfsm reg [2:0] cs;<enter>reg [2:0] ns;<enter>parameter [2:0] IDLE = 3'b000,<enter>S1 = 3'b001,<enter>S2 = 3'b010,<enter>ERROR = 3'b100;<enter>always @( posedge clk or negedge rst_n ) begin<enter>if ( !rst_n ) begin<enter>cs <= IDLE;<enter>end<enter>else begin<enter>cs <= ns;<enter>end<enter>end<enter><enter>always @( * ) begin<enter>ns = IDLE;<enter>case ( cs )<enter>IDLE: begin<enter>if ( ) begin<enter>ns = S1;<enter>end<enter>else begin<enter>ns = IDLE;<enter>end<enter>end<enter>S1: begin<enter>if ( ) begin<enter>ns = S2;<enter>end <enter>else begin <enter>ns = S1;<enter>end<enter>end <enter>S2: begin <enter> if ( ) begin<enter>ns = ERROR; <enter>end <enter>else begin <enter>ns = S2;<enter>end<enter>end<enter>ERROR: begin <enter> if ( ) begin<enter>ns = IDLE; <enter>end<enter>else begin<enter>ns = ERROR;<enter>end<enter>end <enter>endcase <enter>end<enter><enter>always @( posedge clk or negedge rst_n ) begin <enter>if ( !rst_n ) begin <enter>end<enter>else begin <enter>case ( ns )<enter>endcase <enter>end <enter>end"边沿检测器
:ab MBby reg _en_q;<enter>wire _en_flag;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>_en_q <= #`DEL 1'b0;<enter>end<enter>else begin<enter>_en_q <= #`DEL _en;<enter>end<enter>end<enter>assign _en_flag = ( ~_en_q ) && ( _en );"同步器
:ab MBtongbuqi reg rst_s1;<enter>reg rst_s2;<enter><enter>always @ (posedge clk or negedge rst_n) begin<enter>if (!rst_n) begin<enter>rst_s1 <= 1'b0;<enter>rst_s2 <= 1'b0;<enter>end<enter>else begin<enter>rst_s1 <= 1'b1 ;<enter>rst_s2 <= rst_s1;<enter>end<enter>end"触发器模板
:ab MBdff module dff #( parameter SIZE = 64 )(<enter> clk ,<enter>rst_n ,<enter>D ,<enter>Q<enter>);<enter><enter>input clk ;<enter>input rst_n ;<enter>input [SIZE - 1 : 0] D ;<enter>output [SIZE - 1 : 0] Q ;<enter><enter>wire clk ;<enter>wire rst_n ;<enter>wire [SIZE - 1 : 0] D ;<enter>reg [SIZE - 1 : 0] Q ;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>Q <= 'b0;<enter>end<enter>else begin<enter>Q <= D;<enter>end<enter>end<enter><enter>endmodule<enter>"触发器例化tb_
:ab LHdff dff #( ) dff_dut1(<enter>.clk ( clk ),<enter>.rst_n( rst_n ),<enter>.D ( ),<enter>.Q ( )<enter>);"共同的头文件
:ab MBc `ifndef COMMON_HEADER <cr>`define COMMON_HEADER<cr><cr>`define CYCLE 10<cr>`define HALF_CYCLE (CYCLE/2)<cr><cr>`define TB_BEGIN $display("=== BEGIN TESTBENCH %m ===\n");<cr>`define TB_END #`CYCLE $display("\n===== END TESTBENCH %m ===");<cr><cr>`endif"""""""""""""""""""""""""""""""""预编译""""""""""""""""""""""""""""""""""
"延时宏定义
:ab YBYys `define DEL 1"仿真精度
:ab YBYjd `timescale 1ns/1ps""""""""""""""""""""""""""""""""Testbench""""""""""""""""""""""""""""""""""
"产生时钟
:ab TBsz initial begin<enter>tb_clk = 0;<enter>end<enter>always #`HALF_CYCLE tb_clk = ~tb_clk;"产生复位信号
:ab TBfw initial begin<enter>tb_rst_n = 1;<enter>repeat(1) @( posedge tb_clk ) #1;<enter>tb_rst_n = 0;<enter>repeat(1) @( posedge tb_clk ) #1;<enter>tb_rst_n = 1;<enter>end"延时
:ab TBys repeat( 1 ) @( posedge tb_clk ) #1;"波形图
:ab TBbxt initial begin<enter>$dumpfile(" .vcd ");<enter>$dumpvars();<enter>end"随机数
:ab TBsjs integer seed;<enter>reg[31:0] num1;<enter>initial begin<enter>if ( !$value$plusargs("seed+%d", seed) ) begin<enter>seed = 0;<enter>end<enter>@(posedge tb_clk);<enter>#1;<enter>num1 = $random(seed);<enter>end"取对数,用来求位宽
:ab TBds function integer clogb2;<enter>input [31:0] value;<enter>begin<enter>value = value - 1;<enter>for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin<enter>value = value >> 1;<enter>end<enter>end<enter>endfunction"打开文件
:ab TBwj integer FILE;<enter> FILE=$fopen(" .txt ", "a+");<enter>$fdisplay(FILE, " = %h", );<enter>$fclose(FILE);"TB模板
:ab TBmb module _tb();<enter><enter> reg tb_clk <enter>reg tb_rst_n <enter><enter>task delay;<enter>input [31:0] num;<enter>begin<enter>repeat(num) @(posedge tb_clk);<enter>#1;<enter>end<enter>endtask<enter><enter>initial begin<enter>tb_clk = 0;<enter>end<enter>always #`HALF_CYCLE tb_clk = ~tb_clk;<enter><enter>initial begin<enter>tb_rst_n = 1;<enter>delay(1);<enter>tb_rst_n = 0;<enter>delay(1);<enter>tb_rst_n = 1;<enter>end<enter><enter>initial begin<enter>$dumpfile(" _tb.vcd ");<enter>$dumpvars();<enter>end<enter><enter>initial begin<enter>`TB_BEGIN<enter>delay(3);<enter><enter>`TB_END<enter>$finish;<enter>end<enter><enter><enter>endmodule:ab TBb `TB_BEGIN
:ab TBe `TB_END"断言assert
:ab TBas assert( tb_ == ) $strobe("%0d, !!TEST SUCCESS!!", $time);<enter>else $error("tb_ = %0d", tb_);"TB中initial块
:ab TBin initial begin<CR>`TB_BEGIN<CR><CR>`TB_END<CR>$finish;<CR>end
""""""""""""""""""""""""""""""""注释""""""""""""""""""""""""""""""""""""""""
"注释头
:ab ZSt //*************************************************************<enter><enter>*@File name: <enter><enter>*@File type: <enter><enter>*@Version : 0.0.1<enter><enter>*@Author : Zehua Dong, HITWH<enter><enter>*@E-mail : hitdongzh@163.com<enter><enter>*@Date : <enter>*@Function : <enter><enter>*************************************************************<enter><enter> Head files<enter>`include "common.v"<enter><enter> Module definition"段注释
:ab ZSk /<enter>*Function Description:<enter>* <enter>* <enter>///"端口注释
:ab ZSdk //===========================================================<enter>* Input and output ports<enter>* Internal signals<enter>==========================================================="分割注释
:ab ZS //*******************************<enter><enter>*******************************
""""""""""""""""""""""""""""""""任务"""""""""""""""""""""""""""""""""""""""""延时任务
:ab RWys task delay;<enter>input [31:0] num;<enter>begin<enter>repeat(num) @(posedge tb_clk);<enter>#1;<enter>end<enter>endtask"任务模板
:ab RWmb task ;<enter>input [ :0] <enter>begin<enter>end<enter>endtask
使用模板可以减少不必要的重复,大量缩短时间!
四、vimrc配置
此处给出搬移作者的vimrc配置
"设置背景主题
"colo Candyset nocompatible
" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim" Remap a few keys for Windows behavior
source $VIMRUNTIME/mswin.vimset expandtab
"set tabstop=4
set guifont=Courier_New:h14
"set guifont=DejaVu\ Sans\ Mono\:h14"colorscheme eighties "主题设置
" Set window size
winpos 100 100
set lines=25 columns=80" 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"自动全屏
"autocmd GUIEnter * simalt ~x"设置编码"
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim"显示行号"
set nu
set number"突出显示当前行"
"set cursorline
"set cul "cursorline的缩写形式""突出显示当前列"
"set cursorcolumn
"set cuc "cursorcolumn的缩写形式""启用鼠标"
set mouse=a
set selection=exclusive
set selectmode=mouse,key"显示括号匹配"
set showmatch"设置缩进"
"设置Tab长度为2空格"
set tabstop=2
"设置自动缩进长度为2空格"
set shiftwidth=2
"继承前一行的缩进方式,适用于多行注释"
set autoindent"设置粘贴模式"
"显示空格和tab键在Vim中通过鼠标右键粘贴时会在行首多出许多缩进和空格,通过set paste可以在插入模式下粘贴内容时不会有任何格式变形、胡乱缩进等问题。"
set paste"vimrc显示空格和tab键"
"Vim编辑器中默认不显示文件中的tab和空格符,通过下面的配置可以获得以下的显示效果,方便定位输入错误。"
set listchars=tab:>-,trail:-"设置当文件被改动时自动载入
set autoread
"quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>"代码补全
set completeopt=preview,menu"自动保存
set autowrite"设置上下文行数
set so=1" 语法高亮
set syntax=on"与windows共享剪贴板
set clipboard+=unnamed"取消自动备份及产生swp文件
set noundofile
set nobackup
set nowb
set noswapfile
"为C程序提供自动缩进
set smartindent"启动的时候不显示那个援助索马里儿童的提示
set shortmess=atI"忽略大小写
"set ic(ignorecase 的缩写) 忽略大小写
"set noic(noignorecase 的缩写) 不忽略大小写"状态行显示的内容
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=\ [POS=%l,%v][%p%%]\ %{strftime(\"20%y/%m/%d\ -\ %H:%M\")}
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
vim的配置
" 设置字体
set guifont=Courier\ New\ 14
" 设置启动时窗口大小
set lines=50 columns=130
" 设置启动时窗口位置
winpos 70 50
" 设置语法高亮
syntax on
syntax enable" 设置快捷键
" 设置F11为全屏快捷键
nnoremap <F11> :set lines=9999 columns=9999<Bar>winpos 0 0<CR>
" 设置F12为小窗口快捷键
nnoremap <F12> :set lines=50 columns=130<Bar>winpos 70 50<CR>
" 设置F9为编辑快捷键,有些文件可能怕被修改:'modifiable' is off,可以通过这个快捷键快速设置为可修改
nnoremap <F9> :set ma<CR>" 窗口设置
" 设置文本宽度(textwidth),文本宽度指定了文本中每行的最大字符数
set tw=10000
" 启用标尺(ruler),标尺是一个位于 Vim 窗口底部的状态行,它通常用于显示当前光标位置、行号和列号等信息
set ruler
" 启用状态栏(status line)中显示当前命令
set showcmd
" 启用状态栏中显示当前编辑模式
set showmode" 设置临时文件
set noswapfile
set nobackup
set nowritebackup
set noundofile" 显示相对行号
set rnu
" 显示行号
set nu
" 启用高亮搜索功能
set hlsearch
" 设置高亮当前行和列
set cuc
set cul" 缩进
" 配置 Tab 键的缩进行为
" autocmd FileType make set noexpandtab
" 配置 Tab 键的缩进行为
" set expandtab
" 启用智能缩进
set smartindent
" 启用自动缩进功能,使 Vim 在新行中自动匹配上一行的缩进级别
set autoindent
" 设置软制表符的宽度为 4 个空格,用于控制在编辑中使用 Tab 键时插入的空格数量
set softtabstop=4
" 设置制表符(Tab)的宽度为 4 个空格,控制在编辑中使用 Tab 键时插入的空格数量
set tabstop=4
" 设置缩进时使用的空格数为 4 个空格,影响代码的缩进级别
set shiftwidth=4" 启用 Vim 的文件类型检测、插件支持和自动缩进功能
filetype plugin indent on
" 切换到名为 "desert" 的颜色主题
colorscheme desert
" 禁用兼容模式
set nocompatible
" 配置 Vim 中的回退(backspace)键行为
set backspace=indent,eol,start" 启用 Vim 中的换行(line break)功能,当你启用这个选项时,Vim 将根据单词边界来换行,而不会在单词中断的地方进行换行,这有助于提高文本的可读性
set linebreak
" 启用文本自动换行功能,当文本行过长时,它将自动折行显示。
set wrap
" 启用匹配字符高亮显示
set showmatch
" 添加 "kspell" 补全选项,这表示 Vim 在进行单词补全时将使用拼写检查功能
set complete+=kspell
" 启用折叠(folding)功能,折叠允许你折叠代码块或文本段落,以便更轻松地浏览和编辑大型文件
set foldenable
" 设置垂直滚动时的上下边距为 4 行
set scrolloff=4
" 设置状态栏的显示级别为 2
set laststatus=2,这将在底部显示状态栏,其中包括文件名、文件类型等信息
" 启用增量搜索功能
set incsearch
" 设置 Vim 命令历史记录的最大行数为 1000 行
set history=1000
" 启用自动读取功能,这意味着如果在编辑一个文件时,该文件在外部被修改了(比如被其他程序修改了),Vim 会自动重新读取文件以更新编辑器中的内容,以防止冲突
set autoread
" 启用智能菜单功能,当你在命令行中使用通配符(如 :e *.txt)时,Vim 会在命令行下方显示一个菜单,列出匹配的文件名,以帮助你选择文件
set wildmenu" 将crtl+C按键映射为插入注释行
map ^C i//------------------------------------------------------------------------------------------------------------------^M//^M<ESC>0Di//------------------------------------------------------------------------------------------------------------------<ESC>ka" 根据文件扩展名自动设置文件类型为 Verilog
au BufNewFile,BufRead *.v,*.vh set filetype=verilog
" 根据文件扩展名自动设置文件类型为 python
au BufNewFile,BufRead *.py set filetype=python
" 根据文件扩展名自动设置文件类型为 logtalk
au BufNewFile,BufRead *.txt,*.log,README set filetype=logtalk" 使用了 <M-i> 键(Alt+i)来执行相应的操作
" 映射定义了在普通模式下按下 Alt+i 时的操作,即插入注释
nnoremap <M-i> :normal! I//<Esc>
" 映射定义了在可视模式下按下 Alt+i 时的操作,即插入注释
vnoremap <M-i> :s/^/\/\//<CR>
" 使用了 <M-o> 键(Alt+o)来执行相应的操作
" 映射定义了在普通模式下按下 Alt+o 时的操作 ,即取消注释
nnoremap <M-o> :normal! ^xx<Esc>
" 映射定义了在可视模式下按下 Alt+o 时的操作 ,即取消注释
vnoremap <M-o> :s/^\/\///<CR>
" 映射定义了在插入模式下按下 Alt+i 时的操作,即插入注释
inoremap <M-i> :<Esc>I//<Esc>
" 映射定义了在插入模式下按下 Alt+o 时的操作 ,即取消注释
inoremap <M-o> :<Esc>^xx<Esc>" 在插入模式下输入一个左括号 ( 后,自动插入右括号 ) 并将光标移到括号中间
inoremap ( ()<Left>
" 在插入模式下输入一个左方括号 [ 后,自动插入右方括号 ] 并将光标移到方括号中间
inoremap [ []<Left>
" 在插入模式下输入一个左大括号 { 后,自动插入右大括号 } 并将光标移到大括号中间
inoremap { {}<Left>
" 在插入模式下输入一个左引号 " 后,自动插入右引号 " 并将光标移到引号中间
inoremap " ""<Left>" 在输入 bg 后,自动将其替换为 begin,并在下一行插入 end
inoremap bg begin<Enter>end<Esc>k$a