好的代码风格至关重要,不仅便于自己日后理解以前的代码,也给他人阅读带来白便利;良好代码风格的获得,首先需要遵循一定的规则,再加上不断历练,才得以最终形成。本文记录了《FPGA之道》中的一些建议,作为以后编程的准则。
目录
一、代码风格
1、整齐
整齐是代码的最基本要求,无需多言。
2、统一
整齐与统一并不是一个概念,统一的代码一定是整齐的,但是整齐的代码并不一定是统一的。代码的统一,指的是设计过程遵从相同的规律,同样的写法代表了相近的含义,因此可以由局部推广到整体,方便快速理解。
3、易懂
代码应该易懂,能用最易懂的方式描述模块功能,无论对自己还是对他人阅读代码都带来极大方便。
4、精简
代码应该精简,设计应该言简意赅,而不是废话连篇,说不到重点。
二、命名规则
好的命名习惯,能大大提升代码的可读性。相反,混乱的命名,连自己都会晕掉,更何况别人!我曾经看过的一段代码,一堆诸如a1,a2,a3此类命名,不仅其对应的具体功能需要推敲,变量数目增加以后真要疯掉!
1、命名要有意义
有意义的命名让人更容易理解它的用途
eg1:
reg aa;
reg [3:0] bb;
eg2:
reg clk;
reg [3:0] cnt;
示例1中的命名,没人能知道这几个变量的用途,即使是作者本身,也不能保证一周以后还能知道; 示例2中的命名,即使不去看具体使用,也知道clk是用于时钟,cnt用于某处计数。
2、相同类型命名格式要统一
相同类型,命名格式最好统一,便于理解。
eg1:
reg [3:0] cnt_hour;
reg [3:0] minute_CNT;
reg [3:0] CntSecond;
eg2:
reg [3:0] cnt_hour;
reg [3:0] cnt_minute;
reg [3:0] cnt_second;
示例1中的命名,规则混乱,加大了理解难度; 示例2中的命名,相互统一,甚至只看一眼都能知道这几个寄存器用于时分秒计数。
3、不同类型命名格式要区分
不同类型,命名格式最好区别,同样能够便于理解。
eg1:
reg [3:0] cnt;
parameter cnt10 = 10;
eg2:
reg [3:0] cnt;
parameter CNT10 = 10;
示例1中的命名,用于计数的寄存器与计数值参数命名格式一样,代码中出现时极易弄混,需要重新查找声明部分,明确含义; 而示例2中的命名,参数大写,代码中出现时也能明确知道各自的含义。
4、命名格式
下划线分隔:
reg [3:0] cnt_hour;
reg [3:0] cnt_minute;
reg [3:0] cnt_second;
非首单词字母大写分隔:
reg [3:0] cntHour;
reg [3:0] cntMinute;
reg [3:0] cntSecond;
电平敏感命名:
reg rst;
reg rst_n;
三、语法结构
1、不建议省略 begin end
begin end中只有一条语句时,begin end可以省略,但是不建议这样做
- 省略begin end后,不便于代码扩展。如果扩展一条语句,还得添加begin end,如果忽略就会报错;
- 有些代码块有名字,这一标识符只能放在begin之前,即使只有一条语句,begin end也不能省略;
2、范围方向应一致
信号具有一定位宽时,范围的书写建议统一为从高到底。
eg:
reg [3:0] cnt_hour;
reg [3:0] cnt_minute;
reg [3:0] cnt_second;
3、端口声明应一致
- 端口列表可以只写端口名,而将端口方向等参数再声明部分写;
- 声明部分,端口方向与类型可以写在一起,也可以分开写;
4、映射方式应一致
- 例化时端口位置映射
- 例化时端口名称映射(建议)
5、代码缩进应一致
有序的缩进,使得代码易读。
6、适当的空格和空行
空格用于一条语句中的不同部分;空行用于模块内不同功能之间;均能提高代码的易读性;
eg1:
reg clk;
reg [3:0]cnt
always@(posedge clk)
begin
cnt<=cnt+1;
end
eg2:
reg clk;
reg [3:0] cnt
always@(posedge clk)
begin
cnt <= cnt + 1;
end
四、参考文献
《FPGA之道》