目录
原因
每次编写verilog代码时,总是要重用很多代码,虽然很多教程里给了相关的模板代码,比如一些相关的插件或者代码给了相关的模板,例如sublime默认的verilog自动补全不好用,不过提供了代码段这个功能,我们自己写个重用率高的代码段减轻工作量。但本人用起来或多或少的感觉不习惯不自在,所以我在Sublime Text3里面新建自己的verilog代码模板,实际使用起来非常方便。
步骤
1、第一步:新建基本模板
这里在我的上一篇文章写过了,可以去看看 【FPGA学习】(三)Modelsim自动化仿真_洲洲不是州州的博客-CSDN博客
2、在sublime中选择添加新的snippet
3、保存文件后缀名为sublime-snippet,否则自动补全不生效;
注意
content中由CDATA包裹起来的部分是我们要插入的代码片段,可选。
tabTrigger是我们tab键触发的自动补全代码功能的一个名字,可选。
scope,可选,使用范围,不填写代表对所有文件有效。附:source.css和test.html分别对应不同文件。
description,可选,在snippet菜单中的显示说明(支持中文)。如果不定义,菜单则显示当前文件的文件名。
${1:this}表示代码插入后,光标所停留的位置,可同时插入多个。其中:this为自定义参数(可选)。
${2}表示代码插入后,按Tab键,光标会根据顺序跳转到相应位置(以此类推)。
示例模板
下面是我自己用的模板,大家可以参考
计数器模板
<snippet>
<description>"计数器"</description>
<content><![CDATA[
reg [${4}:0] ${1:cnt} ;
wire add_${1:cnt} ;
wire end_${1:cnt} ;
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
${1:cnt} <= 'd0;
end
else if(add_${1:cnt}) begin
if(end_${1:cnt})
${1:cnt} <= 0;
else
${1:cnt} <= ${1:cnt}+1 ;
end
end
assign add_${1:cnt} = ${2};
assign end_${1:cnt} = add_${1:cnt} && ${1:cnt} == (${3})-1 ;
]]></content>
<tabTrigger>jsq</tabTrigger>
<scope>source.verilog</scope>
</snippet>
时序逻辑模板:
<snippet>
<description>"时序逻辑"</description>
<content><![CDATA[
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
${1:"复位变量"} <= 'd0;
end
else if (${2}) begin
end
//else begin ... end?
end
]]></content>
<tabTrigger>shixu</tabTrigger>
<scope>source.verilog</scope>
</snippet>
状态机模板:
<snippet>
<description>"状态机"</description>
<content><![CDATA[
parameter ${1:state1} = 5'b0_0001;//状态一(默认)
parameter ${2:state2} = 5'b0_0010;//状态二
parameter ${3:state3} = 5'b0_0100;//状态三
parameter ${4:state4} = 5'b0_1000;//状态四
parameter ${5:state5} = 5'b1_0000;//状态五
//状态切换事件
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
state <= ${1:state1};
end
else begin
case (state)
${1:state1} :begin
if( )begin
state <= ;
end
else if( ) begin
state <= ;
end
end
${2:state2} :begin
if () begin
state <= ;
end
else if () begin
state <= ;
end
end
${3:state3} : begin
if( )begin
state <= ;
end
else if () begin
state <= ;
end
end
${4:state4} :begin
if () begin
state <= ;
end
else if () begin
state <= ;
end
end
${5:state5} :begin
if( )begin
state <= ;
end
else if () begin
state <= ;
end
end
endcase
end
end
//状态处理事件
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
end
else begin
case (state)
${1:state1} : ;
${2:state2} : ;
${3:state3} : ;
${4:state4} : ;
${5:state5} : ;
endcase
end
end
]]></content>
<tabTrigger>ztj_FSM</tabTrigger>
<scope>source.verilog</scope>
</snippet>