FPGA学习笔记(二)——verilog代码规范化

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 语句;
⑤ 避免使用太复杂和少见的语法,可能造成语法综合器优化力度较低。
 
 
 
 
良好的代码风格是我的坚持!

 
 
 

猜你喜欢

转载自blog.csdn.net/qq_25479231/article/details/103616641