4. 一致的信号命名风格
简洁,清晰,有效是基本的信号命名规则,详见命名规范。
全称 | 缩写 | 中文含义 | acknowledge | ack | 应答 | adress | addr(ad) | 地址 | arbiter | arb | 仲裁 | check | chk | 校验,如CRC校验 | clock | clk | 时钟 | config | cfg | Configuration,装置 | control | ctrl | 控制 | count | cnt | 计数 | data in | din(di) | 数据输入 | data out | dout(do) | 数据输出 | decode | de | 译码 | decrease | dec | 减一 | delay | dly |
| disable | dis | 不使能 | error | err | 错误(指示) | enable | en | 使能 | frame | frm | 帧 | generate | gen | 生成,如CRC生成 | grant | gnt | 申请通过 | increase | inc | 加一 | input | in(i) |
| length | len | (帧、包)长 | nmport | nm | 网管相关 | output | out(o) |
| packet不推荐packet | pkt | 与帧相同 | priority | pri | 优先级 | pointer | ptr | 指针 | rd enable | ren | 读使能 | read | rd | 读(操作) | ready | rdy | 应答信号或准备好 | receive | rx | (帧数据)接收 | request | req | (服务、仲裁)请求 | reset | rst |
| segment | seg |
| souce | scr | 源(端口) | ststistics | stat | 统计 | timer | tmr | 定时器 | switcher | sf | Switch fabric | temporary | tmp | 临时 | transmit | tx | 发送(帧数据)相关 | Valid | vld(v) | 有效、校验正确 | wr enable | wen | 写使能 | write | wr | 写操作 | a. 端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写
b. 使用简称、缩略词(加上列表)
c. 基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小段之间加下划线”_”,如tx_data_val;命名长度一般限制在20个字符以内。
d. 低电平有效信号,加后缀”_n”,如 rst_n
e. 无条件寄存的寄存信号在原信号上加ff1、ff2… 如原信号 data_in, 寄存一拍data_in_ff1,寄存两拍data_in_ff2
f. 不能用 ”reg”,作为最后的后缀名,因为综合工具会给寄存器自动加上_reg, 如果命名里就用_reg作为后缀名则扰乱了网表的可读性。
5.统一的表达式书写
A. 括号的使用
如果一个表达式的分组情况不是很明显时,加上括号有助于理解。
例如下面的代码加上括号就清晰很多。
if (&a==1’b1&&!flag==1’b1 || b==1’b1) //
改为:
if ((&a==1’b1)&&(!flag==1’b1)||( b==1’b1)) //
B.适当的使用空格
一般表达式在运算符的两侧要各留出一个空格,但定义比较长的表达式,去掉预先级高的运算符前的空格,使其与运算对象紧连在一起,可以更清晰的显示表达式结构。
还是上面的例子:
if ((&a==1’b1)&&(!flag==1’b1)||( b==1’b1)) //
改为:
if ((&a == 1’b1)&&(!flag == 1’b1)||( b == 1’b1)) //
”<=”, ”==”前后都要加空格。
C. 赋值要指明比特宽度
赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配。如:
reg [4:0] signal_a;
错误: 1 signal_a <= 5;
2 if(signal_a == 5)
3 signal_a <= signal_b[3:0]+4;
正确: 1 signal_a <= 5d5
2 if(signal_a == 5d5)
3 signal_a <= {1’b0,signal_b[3:0]+5d4
因为工具默认是32位宽,如果不注明位宽,工具检查会报warning,而且这样增加了设计的严谨性。
6.统一的语句书写――条件判断结构书写方式
A. 条件的完整性
Ifelse搭配使用,对于缺省的条件要写”else;”;
Ifelsed 条件判别式要全面,比如if(a == 1’b0);
Case中的缺省条件要写”default”;
B.”if else”结构:适用于复杂条件判断的语句
但对于复杂的条件判断,使用?:如果不仔细分析条件的每一条路径,就让读代码搞不清它是到底要做什么。例如:
C =(!Ic&&!rc)?0(Ic?rc:Ic) // (?
改为:
always @(Ic or rc) // if else
begin
if((Ic==0)&&(rc==0))
c = 0;
else if(Ic==1)
c = rc;
else
c = Ic;
end
即使是简单的条件判断,我们也必须使用IF-ELSE,当涉及复杂的条件判断,使用IF-ELSE结构以获得清晰的结构便于理解和维护。因此必须使用IF-ELSE。
C.”IFELSE”结构VS”CASE”结构
IF ELSE结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而case结构综合结果一般会是多路选择器,但对于可以优化的case综合工具会综合出更简单的结构。
所有对于可以写出平行结构的条件,优先写成case结构,例如地址译码等,条件之间有重复和嵌套的情况则是写成if else结构。 |