热度 1| |||
在工作中经常需要经手别人的代码,发现有些人的代码很规范、有规律,而有些人的代码写的随心所欲,编写的人容易理解,给别人看就需要花一定功夫才能理解。良好的代码风格有助于后来的阅读者快速理解、学习。看到过几种常见的代码风格,今天结合自己的思考,并吸取几种风格的优势,总结下自己比较喜欢的代码风格。
端口定义时明确数据传输方向,对于有可配置参数传递的模块,将参数写在端口前,端口方式使用verilog-2001风格。
1. 输入端口统一使用 "I_" 前缀;
2. 输出端口统一使用 "O_" 前缀;
3. 可配置参数统一使用 "P_" 前缀;
4. 端口前缀之后的用小写,参数前缀之后用大写;
5. 可依据个人喜好决定是否需要对齐。
例如:
module memory_core #
(
P_DATA_BL = 16,
P_ADDR_BL = 8
)
(
input I_clk,
input I_rstn,
input I_wren,
input [P_ADDR_BL-1:0] I_waddr,
input [P_DATA_BL-1:0] I_data,
output O_data_vaild,
output [P_DATA_BL-1:0] O_data
);
endmodule
1. 本地参数使用 "C_" 前缀;
2. 使用 "R_" 前缀来表示reg类型信号;
3. 使用 "W_" 前缀来表示wire类型信号;
4. 也可以统一使用 "S_" 前缀来表示信号;
5. 对于延迟信号,若延迟1拍,用 "_1d"后缀,若延迟多拍,使用 "_d" 后缀;
6. 除有特殊含义外,generate 中变量用一个 i 即可。
例如:
localparam C_DATA_DEPTH = (1<<P_ADDR_BL);
reg [P_DATA_BL -1:0] S_mem[C_DATA_DEPTH-1:0];
reg [P_DATA_BL -1:0] S_data;
reg S_data_vaild;
integer k;
genvar i;
为了使代码看起来紧凑、协调,总结了以下几点。
1. always 与 begin 同行
2. if 与 begin 同行
3. else 与 begin 同行
4. else if 与 begin 同行
5. case 后有多条语句 begin 在单独一行,且进行一次缩进
6. generate 与 begin 同行
7. for 与 begin 同行
8. 以上仅在多条语句时成立,单挑语句可以省略 begin
例如:
always @(posedge clk or negedge I_rstn) begin
if(!I_rstn) begin
for(k=0; k<C_DATA_DEPTH; k=k+1)
S_mem[k] <= {(P_DATA_BL){1'b0}};
end
else if(I_wren)
S_mem[I_waddr] <= I_data;
end
always @(posedge clk or negedge I_rstn) begin
if(!I_rstn)
S_data <= {(P_DATA_BL){1'b0}};
else begin
case(S_cnt)
`ADDR_BL'd0: S_data <= S_mem[0] ;
`ADDR_BL'd1: S_data <= S_mem[1] ;
default: S_data <= {(P_DATA_BL){1'b0}};
endcase
end
end
1. 模块例化端口尽量对齐;
2. 实例模块名若无特殊需求使用。
例如:
memory_core #(.P_DATA_BL(16), .P_ADDR_BL(8))
U_memory_core
(
.I_clk ( ),
.I_rstn ( ),
.I_wren ( ),
.I_waddr ( ),
.I_data ( ),
.O_data_vaild ( ),
.O_data ( )
);