2、命名规范(上):模块名、端口名、信号名的命名规则,避免使用歧义缩写

好,咱们正式开始聊命名规范。

说实话,我见过太多因为命名不规范而翻车的项目了。有一次我接手一个别人留下的模块,里面有个信号叫 tmp_out,我琢磨了半天——这到底是「临时输出」还是「温度输出」?后来查代码上下文才发现,它其实是「三态输出」的缩写。你说坑不坑?

所以这一章,咱们就把模块名、端口名、信号名的规矩说清楚。说白了,命名这件事,就是给别人看的,也是给未来的自己看的。

2.1 模块名:一眼看出它是什么

模块名,我建议用「功能+类型」的结构。比如 uart_tx、spi_master、fifo_async。这样别人一看就知道:哦,这是个UART发送模块,这是个SPI主设备,这是个异步FIFO。

核心原则:模块名要能反映它的功能,不要用无意义的编号。

我个人习惯用下划线分隔单词,全部小写。比如 i2c_slave 而不是 I2CSlave 或 i2cSlave。为什么?因为Verilog和SystemVerilog对大小写敏感,全部小写可以避免一些低级错误。

嗯,这里要注意:模块名不要超过20个字符。太长了,综合工具和仿真工具都会觉得烦,你自己写代码也容易打错。

推荐 不推荐 说明
uart_rx urx urx是什么?没人知道
spi_master spi_m m是master还是memory?歧义
fifo_async fifo_a a是async还是address?

2.2 端口名:输入输出要清晰

端口命名,我有个铁律:方向前缀 + 功能名。

比如输入端口用 i_ 开头,输出端口用 o_ 开头,双向端口用 io_ 开头。这样你在看代码的时候,一眼就能分清信号方向。

小技巧:我习惯把时钟和复位放在端口列表的最前面。这样结构清晰,别人接手也方便。

举个例子:

module uart_tx (
    input  logic       i_clk,      // 时钟
    input  logic       i_rst_n,    // 复位,低有效
    input  logic       i_data_en,  // 数据使能
    input  logic [7:0] i_data,     // 待发送数据
    output logic       o_tx,       // 串行输出
    output logic       o_busy      // 忙标志
);

你看,每个端口的功能一目了然。我曾经见过一个项目,端口名全是 a、b、c 这种,结果调试的时候根本分不清哪个是哪个,最后只能对着原理图一个一个对——那叫一个痛苦。

2.3 信号名:别用歧义缩写

信号命名,是重灾区。我见过最离谱的是 cnt——它到底是 counter 还是 control?还有 reg,在Verilog里是关键字,你拿它当信号名,综合直接报错。

我总结了几条经验:

  • 缩写要有共识:比如 clk(时钟)、rst(复位)、en(使能)、addr(地址)、data(数据)。这些是行业通用缩写,没问题。
  • 避免自创缩写:比如 tmr(是timer还是temp?)、cfg(是config还是cough?)。
  • 长度适中:信号名建议8-20个字符。太短容易歧义,太长写起来累。

注意:不要用数字结尾的信号名,比如 data1、data2。这种命名完全看不出功能差异,后期维护就是噩梦。

举个例子,假设你要表示「写地址有效」这个信号:

推荐 不推荐 原因
wr_addr_valid wav wav是波形文件?还是写地址有效?
wr_addr_vld wavld 读起来像外星语
write_addr_valid w_addr_v v是valid还是vector?

2.4 避坑指南:我曾经踩过的坑

我曾经接手过一个模块,里面有个信号叫 rst_n。你猜怎么着?它居然是高有效复位!因为设计者觉得 _n 后缀只是装饰。结果我仿真跑了一整天,发现复位逻辑全反了。从那以后,我规定团队里:_n 后缀必须表示低有效,_p 后缀表示高有效,谁都不许乱用。

还有一次,我看到一个信号叫 data_rdy,心想这是 data ready 吧?结果代码里写的是 data_rdy = data_in & rdy_signal——它居然是 data AND rdy!你说这命名坑不坑?

我的建议:命名时多花30秒想清楚,能省下后面3小时的调试时间。真的,不骗你。

2.5 知识体系图

下面这张图,帮你理清命名规范的核心逻辑:

命名规范知识体系 模块名 端口名 信号名 功能+类型 全部小写,下划线分隔 不超过20字符 例:uart_tx, spi_master 方向前缀+功能名 i_ 输入 / o_ 输出 / io_ 双向 时钟复位放最前 例:i_clk, o_tx, io_sda 使用通用缩写 避免自创缩写 长度8-20字符 例:wr_addr_valid 核心目标:消除歧义,提升可读性 命名多花30秒,调试省下3小时

2.6 总结一下

命名规范这件事,说白了就是「约定大于配置」。你一个人写得爽,团队其他人看不懂,那这代码就是废的。

我个人习惯在项目开始前,先花10分钟把命名规范文档写出来,大家签字确认。这样后面谁写错了,直接拿文档怼回去——省心。

好了,这一章就到这里。记住:好的命名,是代码最好的注释。

最后送大家一句话:你写的每一行代码,都是给未来的自己写的一封信。别让未来的你,骂现在的你。

可可精品资料库