1.工程组织形式
工程的组织形式一般包括如下几个部分,分别是doc、par、rtl和sim四个部分。doc:一般存放工程相关的文档,包括该项目用到的datasheet(数据手册)、设计方案等。 不过为了便于大家查看,我们开发板文档是一汇总存放在资料盘下的;
par:主要存放工程文件和使用到的一些IP文件;
rtl:主要存放工程的rtl代码,这是工程的核心,文件名与module名称应当一致,建议按 照模块的层次分开存放;
sim:主要存放工程的仿真代码,复杂的工程里面,仿真也是不可或缺的部分,可以极大 减少调试的工作量。
2.
文件头声明
每一个Verilog文件的开头,都必须有一段声明的文字。包括文件的版权,作者,创建日期以及内容介绍等,如下表所示。
3.输入输出定义
① 一行只定义一个信号;
② 信号全部对齐;
③ 同一组的信号放在一起。
4.
parameter
定义
①
module
中的
parameter
声明,不建议随处乱放;
② 将
parameter
定义放在紧跟着
module
的输入输出定义之后;
③
parameter
等常量命名全部使用大写。
5.
wire/reg
定义
① 将
reg
与
wire
的定义放在紧跟着
parameter
之后;
② 建议具有相同功能的信号集中放在一起;
③ 信号需要对齐,
reg
和位宽需要空
2
格,位宽和信号名字至少空四格;
④ 位宽使用降序描述,
[6:0]
;
⑤ 时钟使用前缀
clk
,复位使用后缀
rst
;
⑥ 不能使用
Verilog
关键字作为信号名字;
⑦ 一行只定义一个信号。
6.信号命名
① 信号命名需要体现其意义,比如
fifo_wr
代表
FIFO
读写使能;
② 可以使用“_”隔开信号,比如sys_clk
;
③ 内部信号不要使用大写,也不要使用大小写混合,建议全部使用小写;
④ 模块名字使用小写;
⑤ 低电平有效的信号,使用
_n
作为信号后缀;
⑥ 异步信号,使用
_a
作为信号后缀;
⑦ 纯延迟打拍信号使用
_dly
作为后缀。
7.
always
块描述方式
①
if
需要空四格;
② 一个always
需要配一个begin
和
end
;
③
always
前面需要有注释;
④
beign
建议和
always
放在同一行;
⑤ 一个always
和下一个always
空一行即可,不要空多行;
⑥ 时钟复位触发描述使用
posedge sys_clk
和
negedge sys_rst_n
⑦ 一个always
块只包含一个时钟和复位;
⑧ 时序逻辑使用非阻塞赋值。
8.assign块描述方式
①
assign
的逻辑不能太复杂,否则易读性不好;
②
assign
前面需要有注释;
③ 组合逻辑使用阻塞赋值。
9.
空格和
TAB
由于不同的解释器对于TAB翻译不一致,所以建议不使用TAB,全部使用空格。
10.
注释
① 注释描述需要清晰、简洁;
② 注释描述不要废话,冗余;
③ 注释描述需要使用“//”;
④ 注释描述需要对齐;
⑤ 核心代码和信号定义之间需要增加注释。
11.
模块例化
①
moudle
模块例化使用
u_xx
表示。
12.其他
① 代码写的越简单越好,方便他人阅读和理解;
② 不使用
repeat
等循环语句;
③
RTL
级别代码里面不使用
initial
语句,仿真代码除外;
④ 避免产生
Latch
锁存器,比如组合逻辑里面的
if
不带
else
分支、
case
缺少
default
语句;
⑤ 避免使用太复杂和少见的语法,可能造成语法综合器优化力度较低。
良好的代码风格是我的坚持!