PayPal的个人空间 https://blog.eetop.cn/asic [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

工作中总结的Verilog代码编写风格

热度 1已有 640 次阅读| 2023-12-11 23:23 |个人分类:菜鸟の新知识|系统分类:芯片设计| Verilog, Verilog

写在前面

在工作中经常需要经手别人的代码,发现有些人的代码很规范、有规律,而有些人的代码写的随心所欲,编写的人容易理解,给别人看就需要花一定功夫才能理解。良好的代码风格有助于后来的阅读者快速理解、学习。看到过几种常见的代码风格,今天结合自己的思考,并吸取几种风格的优势,总结下自己比较喜欢的代码风格。

端口定义

端口定义时明确数据传输方向,对于有可配置参数传递的模块,将参数写在端口前,端口方式使用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;



begin-end 位置

为了使代码看起来紧凑、协调,总结了以下几点。

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                (            )
);



1

点赞

刚表态过的朋友 (1 人)

发表评论 评论 (1 个评论)

回复 PayPal 2023-12-11 23:26
EETOP的编辑器是真的不好用

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 4

    粉丝
  • 2

    好友
  • 13

    获赞
  • 6

    评论
  • 851

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-20 16:41 , Processed in 0.014924 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部