人的一生是不断学习,自我完善的过程. 七尺男儿欲上青天揽月,凭一腔血性仗剑天涯,梦想闯出一片自己的天空,一直执著的赶路。

Verilog代码编写规范

上一篇 / 下一篇  2006-10-17 10:43:54 / 天气: 晴朗 / 心情: 高兴

Verilog代码编写规范EDA中国门户网站rQk9h0c
一. 强调Verilog代码编写风格的必要性。
+fD"oO9q[ B/P!`-{S0    强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。
}!H p@ En7z5Q1d8h^0每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。EDA中国门户网站9t9hs^6Mh4N
    曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。
l,q"Z,hWi0    遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。
,Sx?-JR9IT0    (实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。)EDA中国门户网站b d(}xTYc

[AD6Msj0二. 强调编写规范的宗旨。
*F1VNLl9I:l H8c0缩小篇幅EDA中国门户网站7aR-`*Gv'i3}
提高整洁度
n{ a#iU iH [v0便于跟踪、分析、调试
C@p)AqCLoxc;_0    增强可读性,帮助阅读者理解EDA中国门户网站q~'@"F].s
    便于整理文档EDA中国门户网站4P$?6E dYR:u%[
    便于交流合作EDA中国门户网站1u/W7I zn
EDA中国门户网站`l HCh5tg$J J.?
三. 变量及信号命名规范。
0rzc{(E+i0hT)^01.     系统级信号的命名。EDA中国门户网站W0WQ$Zd3U
系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。EDA中国门户网站R(fb9yzx
EDA中国门户网站 t#bWz4Z)v
2.     低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;EDA中国门户网站3PHYl'P7w

0W{^;y"q.T.{B:p03.     经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
u&Mb(M,x+HHG0低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nrEDA中国门户网站`b%i^ F S
多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。EDA中国门户网站;jO;yXGk4AI

Q \ K5J-t[*u04.    模块的命名。EDA中国门户网站1c.X ^p v&U
    在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如:
P!X @*_iz;q3CL0    Arithmatic Logical Unit模块,命名为ALU。EDA中国门户网站.whMGUK`d
    Data Memory Interface模块,命名为DMI。
%eGU7[6?G/C0    Decoder模块,命名为DEC。EDA中国门户网站#y/DqNRk4]V
EDA中国门户网站H3a6z,A0_J h
5.    模块之间的接口信号的命名。EDA中国门户网站 U a*p.Cg"h q1cB
所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。
$j\` TL0m!{0两部分之间用下划线隔离开。
P.` ?!a}B0第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。EDA中国门户网站9\F+hfS @G u$X U
举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写,Req是Request的缩写。两个缩写的第一个字母都大写,便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。
^@)hv b&a9t W0        模块上下层次间信号的命名也遵循本规定。
#X&ry |S q8u0    若某个信号从一个模块传递到多个模块,其命名应视信号的主要路径而定。EDA中国门户网站K(iJX$r7`V

]&z(UE/yA06. 模块内部信号:EDA中国门户网站9} h oFqbS1ePO
模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;
c fK!Y;c0单词除常用的缩写方法外(如:Clock->Clk, Write->Wr, Read->Rd等),一律取该单词的前几个字母( 如:Frequency->Freq, Variable->Var 等);
C ]B]l3LE/u-c/Kj7f0每个缩写单词的第一个字母大写;
a;g1N:u Vw9@0若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);EDA中国门户网站)feOn'|t T%L z/p!K
举例:SdramWrEn_n;FlashAddrLatchEn;
C+{Zo)zy0
o6Bb?Gq0四. 编码格式规范。EDA中国门户网站 gT'O;cJWJ[^8j
EDA中国门户网站+ly[ k6sEe#l
1. 分节书写,各节之间加1到多行空格。如每个always,initial语句都是一节。每节基本上完成一个特定的功能,即用于描述某几个信号的产生。在每节之前有几行注释对该节代码加以描述,至少列出本节中描述的信号的含义。EDA中国门户网站9H({ S}8iP%O \n;c#e
EDA中国门户网站'u'itg!yV
2. 行首不要使用空格来对齐,而是用Tab键,Tab键的宽度设为4个字符宽度。行尾不要有多余的空格。
*P;Q[+jA6h&?,f0
0y[J8D2t^RHI03. 注释。EDA中国门户网站!~"C0XZ7zb h
使用//进行的注释行以分号结束;EDA中国门户网站4II([#garKA(us
使用/* */进行的注释,/*和*/各占用一行,并且顶头;
NT.[p]%df+Y}0例:
q o!m7q$VV0// Edge detector used to synchronize the input signal;
0TBh2ic1b D {0
lb*S#b&S04. 空格的使用:EDA中国门户网站]`T[8l vZr
不同变量,以及变量与符号、变量与括号之间都应当保留一个空格。EDA中国门户网站(R#b,DL3ySh2U
Verilog关键字与其它任何字符串之间都应当保留一个空格。如:
1I0q1O^H-x~Lg/W0Always @ (......)EDA中国门户网站"P!m$a k8K[
使用大括号和小括号时,前括号的后边和后括号的前边应当留有一个空格。
1F J2E0T H\*yy%c0逻辑运算符、算术运算符、比较运算符等运算符的两侧各留一个空格,与变量分隔开来;单操作数运算符例外,直接位于操作数前,不使用空格。EDA中国门户网站? V+K8@;{~'fP#H7c7e
使用//进行的注释,在//后应当有一个空格;注释行的末尾不要有多余的空格。
8`0BO,N1F9G6gU;{-h0例:EDA中国门户网站A2Uy^ |
assign SramAddrBus = { AddrBus[31:24], AddrBus[7:0] };EDA中国门户网站$CN}kvD~*U^
assign DivCntr[3:0] = DivCntr[3:0] + 4'b0001;
`+K`"`*GA0assign Result = ~Operand;EDA中国门户网站 }W1g@;O wC)mDB

7TX%bBfw05. 同一个层次的所有语句左端对齐;Initial、always等语句块的begin关键词跟在本行的末尾,相应的end关键词与Initial、always对齐;这样做的好处是避免因begin独占一行而造成行数太多;
{3?Go:\bJ0例:
0k|JJ1G0always @ ( posedge SysClk or negedge SysRst ) begin
+jGSK W/m#c:u0if( !SysRst ) DataOut <= 4'b0000;EDA中国门户网站;D8g8f/YS
else if( LdEn ) begin
c KB M Oi-Z'H0DataOut <= DataIn;
&yK8d)t2J0EndEDA中国门户网站KKwfq!?
else DataOut <= DataOut + 4'b0001;
|.A\U{'M ~0endEDA中国门户网站{R0cUc8J#Be

-MLx"AC&}06. 不同层次之间的语句使用Tab键进行缩进,每加深一层缩进一个Tab;
fD } r;qbX*~0EDA中国门户网站2kEhI.l j
8.    在endmodule,endtask,endcase等标记一个代码块结束的关键词后面要加上一行注释说明这个代码块的名称;
3z3o~Y.yvH0EDA中国门户网站Ca0w8M T?
9.    在task名称前加tsk以示标记。在function的名称前加func以示标记。例如:
a]9U_4Q0task tskResetSystem;
GESV}#NG%G0......EDA中国门户网站 L$zIeD4tt
endtask    //of tskResetSystem
Cr%f~G+A0
'T%co AG W0五.小结:EDA中国门户网站&FFfP%O@b
    以上列出的代码编写规范无法覆盖代码编写的方方面面,还有很多细节问题,需要在实际编写过程中加以考虑。并且有些规定也不是绝对的,需要灵活处理。并不是律条,但是在一个项目组内部、一个项目的进程中,应该有一套类似的代码编写规范来作为约束。
Eh?BvEy#^3v0总的方向是,努力写整洁、可读性好的代码。

FPGA/CPLD器件价格查询

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-01  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 9376
  • 日志数: 31
  • 文件数: 15
  • 建立时间: 2006-07-03
  • 更新时间: 2006-10-23

RSS订阅

Open Toolbar