热度 2| |||
在工作中经常需要经手别人的代码,发现有些人的代码很规范、有规律,而有些人的代码写的随心所欲,编写的人容易理解,给别人看就需要花一定功夫才能理解。良好的代码风格有助于后来的阅读者快速理解、学习。看到过几种常见的代码风格,今天结合自己的思考,并吸取几种风格的优势,总结下自己比较喜欢的代码风格。
端口定义时明确数据传输方向,对于有可配置参数传递的模块,将参数写在端口前,端口方式使用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. 实例模块名若无特殊需求使用U开头。
例如:
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                (            )
);
 /1