1 / 31
文档名称:

Verilog编码规范.doc

格式:doc   大小:211KB   页数:31页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Verilog编码规范.doc

上传人:916581885 2022/3/3 文件大小:211 KB

下载得到文件列表

Verilog编码规范.doc

文档介绍

文档介绍:
Verilog编码标准
〔仅供内部使用〕
拟制:
xxx
日期:
xxx
审核:
审核者
日期:
yyyy机每行不能超过80个字符。规定72个字符是为了留出边空,提高可读性。还有一个原因是为象vi这样的编辑器留有显示行号的地方。
用回车来分割超过72个字符的行,并且在下一行用缩进来表示该行是前一行的继续。
缩进。
用缩进来提高续行和嵌套循环的可读性。
缩进采用4个空格。
防止使用TAB键。不同的编辑器或用户环境使得TAB的位置差异很大,造成缩进的混乱。有一些工具可以将TAB替换成空格。
〔建议〕使用注释
使用注释来解释端口、信号、信号组、always块、函数等。注释应该放在它所描述的代码的附近。注释应该简明扼要,并足够说明问题。防止注释杂乱。显而易见的功能不用加注释。注释关键是说明设计意图。
编写代码标准
在源文件中要有文件头
在源文件、script文件的开始应包含一个文件头。文件头至少应包含以下信息:文件名、作者、模块的功能描述和关键特征的列表、文件产生的日期、更改记录〔日期、更改者、更改的内容〕。〔〕
模块名称用大写,例如:module MEM_CTRL。
端口声明时每行声明一个端口,并有注释〔最好在同一行〕,也可对同一类型的一组端口加注释。对于时钟,复位以及其他控制信号,需要注释有效工作沿或者有效工作值
建议用下述顺序声明端口。
//INPUTs
clocks , // posedge active
resets , // active high
enables , // active high
other control signals ,
Data and address lines ,

//OUTPUTs
clocks ,
resets ,
enables ,
other control signals ,
data
在输入和输出两类端口之间留一个空行来提高可读性。如上例所示。
端口列表之后,使用parameter定义内部信号宽度以及其他参数化设置。
IO信号申明和内部信号申明要单独成行,
使用简单的语句,一般使用if … else…和case就能满足大局部需求,不要使用复杂的语句
常量
〔1〕一位的控制信号采用二进制表达方式,如1'b0;
〔2〕常数位宽不可缺省;
如:
Bad: if ((rst_n == 0) && (cnt_addr == 15))
Good:if ((rst_n == 1'b0) && (cnt_addr == 5'd15))
变量
〔1〕Net and Register
〔a〕一位位宽的wire信号的声明不可缺省
〔b〕一个reg变量只可以在一个always语句中赋值
〔c〕〔建议〕任一register的赋值加上单位延迟,对异步复位同样加上单位延迟;
〔d〕向量有效位顺序的定义采用倒序格式,如:Data[4:0]
〔2〕Memory
代码中不建议使用Memory(存储器阵列),Memory只用于Testbench中,访问存储器阵列中某一向量的某一位或几位,需要通过中间变量进行。
例:
reg[15:0] mem[0:255];
temp = mem[33]; //temp gets data at addr 33
3_bit_reg = temp[8:6]; //get three bits of addr 33
运算符及表达式
〔1〕表达式
〔a〕用括号来表示执行的优先级,尽管操作符本身有优先顺序,但用括号表示优先级对读者更清晰,更有意义

如:
Bad: A + B ? C : D;
Good: (A + B) ? C : D;
〔b〕适当使用括号
适当使用括号可以控制生成的电路结构,如Z = A + B + C + D,综合结果可能为三级加法器,而变换为Z = (A + B) + (C + D),综合结果那么可能为两级加法器;
〔c〕注意资源共享
需要资源共享的局部一定要放在同一个模块的同一个always语句中,不同模块不同always语句之间的代码不能实现资源共享。
如:always @(...)
if (...) d0 = A + B;
else d0 = C + D;