verilog书写规范文档格式.docx
- 文档编号:17378311
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:22.96KB
verilog书写规范文档格式.docx
《verilog书写规范文档格式.docx》由会员分享,可在线阅读,更多相关《verilog书写规范文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
//*****************************
//DEFINEMODULEPORT//
//******************************
//moduleMODULE_NAME(
//INPUT
input_port_1,
…
input_port_m,
//OUTPUT
output_port_1,
output_port_m,
);
//DEFINEPARAMETER//
parameter…
//DEFINEINPUT
inputrst_n;
//reset,activelow.
inputclk_*;
//clocksignal,50M.
input[n:
0]a_din;
//*****
input[k:
0]b_din;
//DEFINEOUTPUT//
output[m:
0]a_dout;
output[i:
0]b_dout;
//OUTPUTATRRIBUTE//
//REGS
reg[m:
//WIRES
wire[i:
//INSTSNCEMODULE//
MODULE_NAME_AU_MODULE_NAME_A(
.A(A),
.B(B),
.C(C),
//MAINCODE//
……
//******************************//
Endmodule
3.一致的排版
A.一致的缩排
●统一的缩排取4个空格宽度
●输入输出信号的宽度定义与关键字之间,信号名与宽度之间要用空格分开;
所有宽度定义对所有信号名对齐,代码风格统一如下:
input[3:
0]input_a;
inputinput_b;
output[128:
0]output_a;
output[15:
0]output_b;
outputoutput_c;
A.一致的beginend书写方式
always中,一定要用beginend区分,格式和代码风格统一如下:
always@(postedgeclkornegedgerst_n)
begin
if(rst_n==1’b0)
syn_rst<
=‘DLY1’b0;
else
begin
if(a==b)
syn_rst<
=‘DLY1’b1;
end
end
ifelse中仅有一个语句行时,不要使用beginend;
如果有多个语句行时,beginend和if()或else()空四个格。
格式如下:
if(…)
…
elseif(…)
else
********************************************************************
…(
else
4.一致的信号命名风格
简洁,清晰,有效是基本的信号命名规则,详见命名规范。
全称
缩写
中文含义
acknowledge
ack
应答
adress
addr(ad)
地址
arbiter
arb
仲裁
check
chk
校验,如CRC校验
clock
clk
时钟
config
cfg
Configuration,装置
control
ctrl
控制
count
cnt
计数
datain
din(di)
数据输入
dataout
dout(do)
数据输出
decode
de
译码
decrease
dec
减一
delay
dly
disable
dis
不使能
error
err
错误(指示)
enable
en
使能
frame
frm
帧
generate
gen
生成,如CRC生成
grant
gnt
申请通过
increase
inc
加一
input
in(i)
length
len
(帧、包)长
nmport
nm
网管相关
output
out(o)
packet不推荐packet
pkt
与帧相同
priority
pri
优先级
pointer
ptr
指针
rdenable
ren
读使能
read
rd
读(操作)
ready
rdy
应答信号或准备好
receive
rx
(帧数据)接收
request
req
(服务、仲裁)请求
reset
rst
segment
seg
souce
scr
源(端口)
ststistics
stat
统计
timer
tmr
定时器
switcher
sf
Switchfabric
temporary
tmp
临时
transmit
tx
发送(帧数据)相关
Valid
vld(v)
有效、校验正确
wrenable
wen
写使能
write
wr
写操作
a.端口、信号、变量名的所有字母小写:
函数名、宏定义、参数定义用大写
b.使用简称、缩略词(加上列表)
c.基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小段之间加下划线”_”,如tx_data_val;
命名长度一般限制在20个字符以内。
d.低电平有效信号,加后缀”_n”,如rst_n
e.无条件寄存的寄存信号在原信号上加ff1、ff2…如原信号data_in,寄存一拍data_in_ff1,寄存两拍data_in_ff2
f.不能用”reg”,作为最后的后缀名,因为综合工具会给寄存器自动加上_reg,如果命名里就用_reg作为后缀名则扰乱了网表的可读性。
5.统一的表达式书写
A.括号的使用
如果一个表达式的分组情况不是很明显时,加上括号有助于理解。
例如下面的代码加上括号就清晰很多。
if(&
a==1’b1&
&
!
flag==1’b1||b==1’b1)//
改为:
if((&
a==1’b1)&
(!
flag==1’b1)||(b==1’b1))//
B.适当的使用空格
一般表达式在运算符的两侧要各留出一个空格,但定义比较长的表达式,去掉预先级高的运算符前的空格,使其与运算对象紧连在一起,可以更清晰的显示表达式结构。
还是上面的例子:
if((&
a==1’b1)&
flag==1’b1)||(b==1’b1))//
”<
=”,”==”前后都要加空格。
C.赋值要指明比特宽度
赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配。
如:
reg[4:
0]signal_a;
错误:
1signal_a<
=5;
2if(signal_a==5)
3signal_a<
=signal_b[3:
0]+4;
正确:
=5d5
2if(signal_a==5d5)
={1’b0,signal_b[3:
0]+5d4
因为工具默认是32位宽,如果不注明位宽,工具检查会报warning,而且这样增加了设计的严谨性。
6.统一的语句书写――条件判断结构书写方式
A.条件的完整性
Ifelse搭配使用,对于缺省的条件要写”else;
”;
Ifelsed条件判别式要全面,比如if(a==1’b0);
Case中的缺省条件要写”default”;
B.”ifelse”结构:
适用于复杂条件判断的语句
但对于复杂的条件判断,使用?
:
如果不仔细分析条件的每一条路径,就让读代码搞不清它是到底要做什么。
例如:
C=(!
Ic&
rc)?
0(Ic?
rc:
Ic)//(?
:
)
改为:
always@(Icorrc)//ifelse
begin
if((Ic==0)&
(rc==0))
c=0;
elseif(Ic==1)
c=rc;
c=Ic;
即使是简单的条件判断,我们也必须使用IF-ELSE,当涉及复杂的条件判断,使用IF-ELSE结构以获得清晰的结构便于理解和维护。
因此必须使用IF-ELSE。
C.”IFELSE”结构VS”CASE”结构
IFELSE结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而case结构综合结果一般会是多路选择器,但对于可以优化的case综合工具会综合出更简单的结构。
所有对于可以写出平行结构的条件,优先写成case结构,例如地址译码等,条件之间有重复和嵌套的情况则是写成ifelse结构。
D.FiniteStateMachine
不允许有模糊不清的状态机模式,所有的状态机必须清晰明了。
我们要求将状态机的时序部分和组合逻辑部分分开。
例如:
modulestate4(
out
);
inputreset
inputclock;
output[1:
0]out;
parameter[1:
0]stateA=2’b00;
0]stateB=2’b01;
0]stateC=2’b10;
0]stateD=2’b11;
reg[1:
0]state;
0]nextstate;
reg[1:
always@(posedgeclock)
if(reset==1,0’b0)
state<
=stateA;
=nextstate;
always@(state)
case(state)
stateA:
nextstate=stateB;
stateB:
nextstate=stateC;
stateC:
nextstate=stateD;
stateD:
nextstate=stateA;
endcase
always@(postdgeclockornegedgereset)
begin
if(reset==1’b0)
out<
=2’b0;
elsebegin
if(state==…)
=…;
endmodule
7.统一格式的always程序块的书写
A.always中的变量的赋值方式――阻塞与非阻塞赋值
当进行时序逻辑建模时,always块中使用非阻塞赋值――NON_BLOCKING;
参加如下代码:
always@(posedgeclkornegedgerst_n)
if(rst_n==1’b0;
myreg<
=1’b0;
=‘DLY1’b1;
always块中使用的NON_BLOCKING赋值时在”<
=”前要加上#‘DLY,如上例;
当使用always语句进行组合逻辑建模时,always块中使用阻塞赋值――BLOCKING;
参见如下代码:
always@(addr)
case(addr)
2’b00:
cs0_n=1’b0;
2’b01:
cs0_n=1’b1;
2’b10:
2’b11:
default:
如果要使用always语句同时进行时序与组合逻辑建模时,一定使用非阻塞赋值;
//组合逻辑与时序逻辑在同一个always块中
always@(posedgeclkornegedgereset_n)
if(reset_n==1’b0)
out<
=1’b0;
case(count)
=`DLYin_a;
=`DLYin_b;
=`DLYin_c;
B.always中变量赋值的唯一性
组合always块一定要注意敏感量列表中的触发项完整且不冗余;
如果不是这样,综合的电路会与实际设计不符合,会报warning;
不要再多个always模块中对同一个reg型变量进行赋值;
更不能再同一个always中随一个变量双重赋值;
always@(posedgeclkorposedgereset_n)
=`DLY1’b1;
//out10
=`DLY1’b0;
推荐不要在一个always块里给多个变量赋值。
如果将一组条件相同的变量写在一个always块中更有利于可读性的提高和功能的实现时候,可有例外情况,但请尽量多加注释,以增加可读性,并注意在组合always块中不要出现LATCH(不如对状态机的组合always块及它对条件相似的多个变量赋值);
C.always中复位的书写
复位的条件表达式及命名要和always敏感列表中的描述相统一,并且一定要使用异步复位。
所有的复位必须低有效。
//
always@(posedgeclkotnegedgerst_n)//
if(rst_n==1’b0)
D.always的注释
要在每一个always块之前加一段注释,增加可读性和便于调试。
//cmcarrycountwhich…
always@(posedgeclk_xcornegedgerst_n)
cm_carry_cnt<
=#`DLY1’b1;
8.合理的注释
代码中应采用英文作详细的注释,注释量应达到代码总量的50%以上。
指示应该与代码一致,修改程序的时候一定要修改相应的注释;
注释不应重复代码已经表明的内容,而是简介的点明程序的突出特征;
注释应该整个一个程序的线索和关键词,它连接整个程序中分散的信息并它帮助理解程序中不能表明的部分。
9.重用化设计
层次结构与模块划分
层次设计的原理以简单为主――尽量避免不必要的层次;
层次结构设计得好,在综合中就不需要太多的优化过程;
模块的划分根据层次设计来决定――模块化对于布线有很大帮助,模块化的设计中要尽量减少全局信号的使用;
通用的部分尽量提取出来作为一个共用模块,同时为了适应需求的更改也应提供用户定制模块入库的方式。
参数传递
需要传递参数的模块,在多次例化的时候统一都传递参数,不要例化同一个模块,有的传参数,有的不传。
模块划分的技巧:
将不同的时钟域分离开来;
按照不同的设计目标划分成块,分块式应在数据流方向上切分;
在同一模块中实现逻辑资源和算术资源的共享。
二.关于REVIEW
1.Review目的
发现缺陷
降低成本
提高质量
2.流程
1.完成第一个字模块时,请提交该模块代码,进行规范检查评审。
2.Coding期间每两星期提交依次代码和review报告。
Review报告主要包括内容:
Review工作时,review的代码模块
参与人
发现的缺陷和解决情况。
Review建议:
制定review计划;
(2)每次review代码不超过500行。
ANNEX
CODESTYLETEMPLATE
Thisatemplateofverilogcodefile,includingfileheaderandthemainbodyofcodeinwhichsomecodingrulesaredemonstrated.
//********************************************************
//Copyright(c)2005,HisiliconTechnologiesCo.,Ltd
//Allrightsreserved
IPlibindexjustasUTOPIA_B
thetopmodule_nameofthisip,usually,issameas
thesmallipclassifiednamejustasUTOPIA
file_nameofthisfilejustastx_fifo.v
module_nameofthisfilejustasTX_FIFO
completeEnglishnameoftheabbreviatedmodule_name
Author
2005/07/20
currentversion,justthis:
v1.0,mustsameastheCVSversion
//Abstract:
FathermodulejustasTX_PROC
//----------------------------------------------------------------------------
//VersionData(yyyy/mm/dd)name
//Descriptio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 书写 规范