一、逻辑值
0: 逻辑低电平,条件为假
1: 逻辑高电平,条件为真
z: 高阻态,无驱动
x: 未知逻辑电平
二、实际例子
1. 模块名一般与文件名相同
线网型变量会被映射成一条真实存在的物理连线。
寄存器型变量会被映射成一个寄存器。
2. 参数
parameter 与 localparam 都可以作为参数的关键字,进行参数的定义。
区别:
- 如果参数关键字使用 parameter,我们可以在顶层文件通过实例化,来对此功能模块中的参数进行修改。如截图中的红框所示。
- localparam 只能在模块内部使用,不能进行实例化。
3、常量
基数表示法
格式:[换算为二进制后位宽的总长度]['][数值进制符号][与数值进制符号对应的数值]
8'd171: 位宽是8bit,十进制的171。
[数值进制符号]中如果是[h]则表示十六进制,如果是[o]则表示八进制,如果是[b]则表示二进制,如果是[d]则表示十进制。
8'hab: 表示8bit的十六进制数 ab;
8'o253: 表示8bit的八进制数 253;
8'b1010_1011: 表示 8bit 的二进制数 1010_1011,下划线增强可读性。
[换算为二进制后位宽的总长度]:可有可无,verilog 会为常量自动匹配合适的位宽。
当总位宽大于实际位宽,则自动在左边补0,总位宽小于实际位宽,则自动截断左边超出的位数。
'd7与8’d7: 表示相同数值,8’d7换算为二进制就是8’b0000_0111,前面 5 位补 0;
2’d7 换算为二进制就是 2’b11,超过 2 位宽的部分被截断。
如果直接写参数,例如100,表示位宽为 32bit 的十进制数 100.
4、赋值方式
阻塞型赋值
声明 3 个变量,a 的值是 1,b 的值是2,c 的值是 3.
阻塞赋值可以理解为顺序执行,也就是说第一句语句执行完毕之后, 才会执行第二句语句。
非阻塞型赋值
非阻塞型赋值语句是并行执行的。即在同一时刻,多条语句是同时执行的。
声明 3 个变量,a 的值是 1,b 的值是2,c 的值是 3.
b 的值目前是 2,a 的值目前是 1. 在同一时刻,将 b 的值赋值给 a,将 a 的值赋值给 c.
三、算术运算符
+ (加法,如 assign c=a+b; 即把a与b的和赋值给c)
- (减法,如 assign c=a-b; 即把a减b的差赋值给c)
* (乘法,如 assign c=a*3; 即让a和3相乘,结果赋值给c,但是一般不用乘号)
/ (除法,如 assign c=a/2; 即让a和2相除,结果赋值给c,一般也不用除号)
% (求模,或称为求余,要求%两侧均为整型数据,5%3的值为2,用在测试文件)
四、归约运算符、按位运算符
以 “&” 操作符为例,“&” 操作符有两种用途,既可以作为一元运算符(仅有一个参与运算的量),也可以作为二元运算符(有两个参与运算的量)。
当 “&” 作为一元运算符时表示归约与,&m 是将 m 中所有比特相与,最后的结果为 1bit。
例如:
&4’b1111=1&1&1&1=1’b1
&4b1101=1&1&0&1=1’b0
当 “&” 作为二元运算符时表示按位与,m&n 是将 m 的每个比特与 n 的相应比特相与,在运算的时候要保证 m 和 n 的比特数相等,最后的结果和 m(n) 的比特数相同。
例如:
4’b1010&4’b0101=4’b0000
4’b1101&4‘’b1111=4’b1101
“~&”、“ ^ ”、“ ~^ ”、“|”、“ ~|” 同理。
五、逻辑运算符
以 “&&” 操作符为例,“&&” 表示逻辑与,运算规则:逻辑与运算符号两边只有真或者假,非零表示真,零表示假,逻辑运算符两边都不为零则结果为 1,否则为 0。
例如:
a=4’ha, b=4’d0, c=a&&b, 则c的值为0.
“ ||(逻辑或)”、 “==(逻辑相等)”、“!=(逻辑不等)” 同理。
六、关系运算符
a<b a小于b
a>b a大于b
a<=b a小于或等于b
a>=b a大于或等于b
注:关系运算符一般在条件判断时用到,例如 if 的判断语句,如果 if 后面接的判断语句是真的,则返回值为1,
否则为0.
七、移位运算符
移位运算符是二元运算符,左移符号为 “<<”,右移符号为 “>>”,将运算符左边的操作数左移或右移指定的位数,用 0 来补充空闲位。
b <= a<<1; 即让 a 的每一位都往左移动1位,结果赋值给 b;
b<= a>>2; 即让 a 的每一位都往右移动2位,结果赋值给 b;
在应用移位运算符的时候一定要注意它的这个特性,那就是空闲位用 0 来填充,也就是说,一个二进制数不管原数值是多少,只要一直移位,最终全部会变为 0。
例如:4’b1000 >>3 后的结果为 4’b0001, 4’b1000>>4 的结果为 4’b0000。
移位运算符在使用时,可代替乘法和除法,左移一位可以看成是乘以 2,右移一位可以看成是除以 2,但要注意位宽的拓展。
八、位拼接运算符
位拼接运算符由一对花括号加逗号组成 “{,}”,拼接的不同数据之间用“,”隔开。
例如:将 8bit 的 a、3bit 的 b、5bit 的 c ,按顺序拼接成一个 16 位的 d, 表示方法为:d={a,b,c};
九、条件运算符
条件运算符,“ ?:”,是一个三元运算符,即有三个参与运算的量,条件表达式的一般形式为:表达式1 ?表达式2 :表达式3。
执行过程是:当表达式1 为真,则表达式2 作为条件表达式的值,否则以表达式3 作为条件表达式的值。
例如:当 a=6, b=7, c=(a>b)?a:b的结果为7。
要注意的是,使用条件表达式时 “?” 和 “:” 是一对,不可以只是用一个。
十、优先级
总的优先级关系为 :归约运算符 > 算数运算符 > 移位运算符 > 关系运算符 > “==” 和 “!=” > 按位运算符> “&&” 和 “‖” >条件运算符,总的来说是一元运算符 > 二元运算符 > 三元运算符。
如果在编写代码的时候对这些关系容易混淆,最好的方式就是使用 “()” 增加优先级。
十一、 if-else 条件分支语句
十二、case 分支控制语句
十三、系统函数