gvim【二】【ab命令快速制作verilog模板】
文章目录
- 一、前言
- 二、使用方法
- 1.将以下代码拷贝到 `_vimrc文件`中
- 2.打开gvim,敲入模板名字,敲回车即可
- 3. 自己制作模板方法
- 4. 注意事项
- 5. 下载
- 三、本系列其他博客
一、前言
gvim对于编写Verilog代码有个神奇的功能,可以快速制作verilog模板,但是网上没有相应的分享,所以自己制作了一个,分享出来(windows下)。
模板包括:文件头、常用自定义命令、Module中常用模板(包括模块基本模板、组合时序逻辑模板、计数器、状态机、边沿检测器、同步器、触发器、触发器例化、头文件等)、预编译模板(延时、仿真精度)、TB模板(TB基本模板、产生时钟复位、延时任务、生成波形图文件、产生随机数、取对数、打开文件、断言等)、注释(注释头、段注释、端口注释等)、任务模板(延时任务、任务模板)。
注: 这些模板都是我自己经常使用的模板
二、使用方法
1.将以下代码拷贝到 _vimrc文件
中
该文件在安装目录中,如果不知道安装目录在哪,可以在末行模式下输入::echo $VIM
就可以显示安装位置。
各命令意思已经在注释中注明。
请注意:以下内容其实具有灵活性,可以根据你自己的需求添加相应的代码。我的命名规格一般是大写缩写+小写缩写
,什么意思呢,举个例子:就拿最常见的Verilog模块的框架来说,我的重命名为:MBmk
,MB
就是模板
的缩写,mk
是模块
的缩写,所以如果你想生成一个模块的模板,只需要输入MBmk
即可,其他的都类似。
"""""""""""""""""""""""""""""""新文件标题"""""""""""""""""""""""""""""""""""""""""""""""""""按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"elselet tmp1 = "NONE"endifcall 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
上面的代码中新文件标题
那里,定义了代码的注释头,大家修改成自己的信息后,直接按F4即可插入。
2.打开gvim,敲入模板名字,敲回车即可
此处给大家演示一下我平时写Verilog的步骤:
1、首先按F4,插入文件头,然后输入该文件的功能注释(对了我上面的演示忘记写模块名了哈哈哈,总是忘记,大家记得写呀)。
2、跳到最后一行,输入MBmk
,敲回车,就形成了一个模块的模板。
3、添加输入输出端口,clk和rst_n默认已经添加。请注意我的操作,在输入一个端口后,敲了很多空格(或者TAB),一个原因是美观,再者是为了方便写逗号,这样子你就可以通过列操作将逗号整齐的写到端口后面。但是对于某些软件来说,可能把空格也识别为端口名,所以这种做法要根据具体软件来决定是否使用。
为什么要将逗号写整齐呢?难道只是强迫症为了好看嘛?
当然不是,这样写端口,后面你在例化模块的时候就可以直接复制这里的代码,而不用手敲了。如下所示。
是不是方便了很多呢?
4、添加完端口名后,开始定义端口的输入输出,以及wire、reg等类型,只需要按yy
复制input clk;
那一行,然后有多少个端口就粘贴几次,快捷键为数字+p
,然后修改input
和output
关键字。当然信号位宽也要修改。
5、将改好的input
、output
的所有端口都复制一下,然后按p
进行粘贴,ctrl+q
列选,将input
、output
全部先改为wire,然后修改需要的端口为reg类型。
6、添加核心代码,通过GVIM中的别名,添加你想要的代码即可。
上述过程看着麻烦,其实等你实践的时候就知道有多爽了。比起你手动一行一行敲,这样可以提升你的编程效率,把时间花在刀刃上。
_vimrc文件路径:
3. 自己制作模板方法
:ab name code
:ab 为命令,name为你要制作的模板名字,code为代码,如果需要换行使用<enter>即可。
4. 注意事项
我的gvim自动缩进2空格,tab也为2空格,如果将代码复制进去格式不太好看的话可能是这个引起的,将以下代码复制到_vimrc文件
中即可:
"设置缩进
"设置Tab长度为2空格
set expandtab
set tabstop=2
"设置自动缩进长度为2空格
set shiftwidth=2
"继承前一行的缩进方式,适用于多行注释"
set autoindent
使用模板可以减少不必要的重复,大量缩短时间,希望我的分享对你有帮助,转载请说明出处~
5. 下载
从我的github上进行下载。
三、本系列其他博客
- gvim【一】【安装和基本使用】
- gvim【二】【ab命令快速制作verilog模板】
- gvim【三】【_vimrc配置】
gvim【二】【ab命令快速制作verilog模板】相关推荐
- gvim 模板(ab命令快速生成常用Verilog模板)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.模板制作方法 二.使用步骤 总结 前言 gvim在编写Verilog代码时通过预先设定的模板可以快速生成特定代码模 ...
- 经典快速制作套打证书模板(doc)大全
经典快速制作套打证书模板(doc)大全 一.扫描证书 首先,需要将准备的证书通过拍照或扫描转换成电子图片,这里推荐使用扫描的方式完成,其好处就不多说了. 若是使用数码相机拍照,还需要对图片进行适当的裁 ...
- Python和ArcGIS自动化制图完全指南(二):制作mxd模板
Python和ArcGIS自动化制图完全指南(二):制作mxd模板 前言:mxd 模板是我们出图的标准样式,我们所有的成果图都是以 mxd 模板为基础.模板文件不要求对某些特定数据进行特定的展示(设置 ...
- Vs code如何快速生成Verilog例化模板
问题描述 用过很多种编辑器,Vs code对与Verilog的语法支持,以及Vivado关联都是目前我最满意的. 也是我用过安装插件最方便的一款软件,最关键的是它不需要破解,直接在官网下载正版,安装即 ...
- 学术海报poster模板_教你快速制作学术会议的海报
最近向亚太地球物理学生大会(APGSC)投去了一份论文摘要,这是一个国际性地球物理会议. 我的会议摘要有幸获得了组委会的青睐. 你以为这就完事了吗,随后组委会又发来了一份邮件: 这就比较难办了,要做P ...
- 使用模板快速制作H5网页(仅供参考)
#[转载] 使用模板快速制作H5网页(仅供参考) 教程来源: 零基础30分钟学会制作网站--如何使用HTML网页模板(更新P2字幕版) 作者:SolidifieRay 1.HTML整体框架: < ...
- 韩顺平主讲织梦dedecms 5.7二次开发实战仿站模板制作视频教程
个人看后感觉 最好的 dedecms 5.7二次开发视频教程 由于原文件太大,上传到cdsn不方便,就传到网盘了 下载地址 传智播客 PHP教程 韩顺平 dedecms 项目开发笔记.rar 下载地 ...
- 二维码如何快速制作?我只推荐这两个方法
二维码如何快速制作?二维码作为我们日常生活中无处不在的物品,我们自然需要对其制作方法有所了解.通过扫描二维码我们可以获取更多的信息,通过扫描二维码我们可以进行支付.添加好友,可见二维码的功能十分丰富. ...
- 二维码如何制作?快速制作二维码的教程在这里
二维码如何制作?在我们的日常生活中总是会看到形形色色的二维码图片,在我们的日常生活中少不了需要时时接触二维码,除了系统自动生成二维码之外,其实我们还可以借助一些软件来进行二维码的生成,这里小编就来给大 ...
最新文章
- 深度学习的实时面部姿势估计研究
- PHP 设计模式之数据对象映射模式
- 串行测试 并行测试_如何通过CircleCI测试并行性增加构建时间
- Oracle 外部表加载监听日志,使用外部表访问监听日志
- 基于高程的地面点云信息提取
- Scrapy框架——CrawlSpider爬取某招聘信息网站
- 如何在MSWord中加入MSAgent
- 无盘服务器pnp,锐起无盘PNP有哪些配置类型
- 小白怎么入门网络安全?
- 企业为什么着急签三方_学校又在催我签三方了、三方协议很重要吗、签完三方能毁约吗……...
- Java NIO 通道(二)通道分散/聚集
- css 图片 鼠标样式,鼠标样式 - CSS | 绿叶学习网
- 毕业生的商业软件开发之路 --- 现代商业软件开发概况
- 小区宽带网络解决方案
- mqtt简介及在web端的应用(接入阿里iot)
- 【MapReduce】数据去重、多表查询、倒排索引、单元测试等案例编程
- java锁的种类以及辨析(一):自旋锁
- 在自己的数据集上训练CrowdDet过程记录
- [ 利器篇 ] - 升级Ubuntu 18.04系统工具集合
- NLP在线医生(一)
热门文章
- 计算机作业评价表,【作业检查记录评语】_教导处作业检查评语,教导处作业检查记录...
- Python time time()方法-菜鸟教程
- 用Python实现快速排序和冒泡排序,代码+详细解析
- 一篇文章让你搞懂Java中的静态代理和动态代理
- 编程的50种基础算法代码,编程常用算法有哪些
- Vue2基础(6)——vue-cli、element-ui、axios拦截器、proxy接口代理
- VMware虚拟机 桥接模式 无法上网 校园网
- 如何修改C盘下的hosts文件
- 矩阵连乘问题算法思想_动态规划-矩阵连乘问题(一)
- 最新电脑为何不支持安装win7系统?原来秘密就藏在这里!