StudyVerilog(三)

《Verilog HDL入门》摘抄笔记

Posted by Jackson on February 2, 2020

第四章 表达式

表达式由操作数和操作符组成

4.1 操作数

常数 参数 位选(Bit-select) 部分位选(Part-select)
线网 变量 存储器和数组元素 函数调用

4.1.9 符号

若某个表达式中的所有操作数全部都有符号,则表达式结果也是有符号的,否则是无符号的。

4.2 操作符

4.2.1 算数操作符: + - * / % **

注:%求出与第一个操作数符号相同的余数

Notice: 算数操作符中任意操作数只要有一位x或z,则整个运算结果为x。

1.算数运算结果的位宽

* 算术表达式运算结果的位宽由最大操作数的位宽决定
* 表达式中所有的中间结果应取最大操作数的位宽(在赋值时,此规则也包括赋值等号左端的目标变量)

2. 有符号数和无符号数

只要有一个操作数是无符号的,那么在开始任何操作之前,所有其他的操作数都被隐含地转换成了无符号数。

1. 无符号数值存储在:
 * 线网中
 * reg(寄存器)变量中
 * 用普通(没有用符号标记s)的基数格式表示的整型数中
 	2. 有符号数值存储在:
 * 有符号的线网中
 * 有符号的reg(寄存器)变量中
 * 十进制整型数中
 * 带s标记的基数格式表示的整型数中
 * 整型变量中。

4.2.2 关系操作符: < > <= >=

1.算数运算结果的位宽

  • 若操作数的位宽不同,并且所有的操作数都是无符号的,则位宽较小的操作数在高位方向添0补齐
  • 若操作数的位宽不同,并且所有的操作数都是有符号的,则位宽较小的操作数在高位方向添符号位补齐
  • 若表达式中一个操作数是无符号的,则该表达式的其余操作数均被当作无符号数处理。

4.2.3 相等操作符: == != === !==

==(逻辑相等) !=(逻辑不等)
===(全等,case equality) !==(非全等,case inequality)

全等比较严格地按照字符串进行比较,而在逻辑比较中,值x和z具有通常的物理含义,其比较的结果很可能出现不确定值。

例:4’b11x0 == 4’b11x0 结果为未知,但是 4’b11x0===4’b11x0

1.操作数的位宽

  • 若操作数位宽不相同,且有一个为无符号数,则位宽较小的操作数在左侧添0位补齐
  • 若操作数位宽不相同,且两个操作数都是有符号数,则较小的数用符号位补齐。

4.2.4 逻辑操作符: && || !

4.2.5 按位操作符: ~ & | ^ ~^,^~

1.操作数的位宽

  • 若操作数位宽不相同,且有一个为无符号数,则位宽较小的操作数在左侧添0位补齐
  • 若操作数位宽不相同,且两个操作数都是有符号数,则较小的数用符号位补齐。

4.2.6 缩减操作符: & ~& | ~| ^ ~^

​ 缩减操作符对单一操作数上的所有位进行操作,产生一位的操作结果。

注:若操作数中有任意一位的值为x或z,则操作的结果为x 参见p59

4.2.7 移位操作符: «   » «<  »>

右侧操作数总被认为是一个无符号数,若右侧操作数的值为x或z,则移位操作数的结果必定为x。对逻辑移位操作符(« ,»)而言,由于移位而腾空的位总是填0。而对于算术移位(«<,»>)而言,左移腾出空的位总是填0;而在右移的场合,若位于左侧的操作数是无符号数,则腾出的空位总是填0;若操作数是有符号数,则腾出的空位总是填符号位。

4.2.8 条件操作符: ? :

​ cond_expr?expr1:expr2

​ 若cond_expr为真,则选择expr1,若cond_expr为假,则选择expr2,若cond_expr为x或z,则操作结果将按以下逻辑执行expr1和expr2的按位操作:0与0得到结果0,1与1得到结果1,其余情况下的结果为x。

4.2.9 拼接与复制操作符

1.拼接是将小表达式中的位拼接起来形成一个由多个位组成的大表达式的操作。

{expr1,expr2,expr3…exprN}

由于未指定位宽的 常数其位数是未知的,所以拼接操作中不允许踹向那未指定位宽的常数

例: {dbus,5}

2.复制操作通过指定重复次数来执行

{repetition_number{expr1,expr2,expr3…exprN}}

例: abus = {3{4’b1001}}; 位向量12’b100110011001

重复操作也可以被参数化

例:parameter LENTH = 8; {LENTH{1’b0}}

4.3 表达式的类型

常量表达式是在编译时就计算出的常数值的表达式。通常,常量表达式可由下列要素组成:

  • 常量文字,诸如2’b10和326
  • 参数名,诸如参数声明语句中的SIZE
  • 参数的位选和部分位选
  • 常量函数调用

计算表达式步骤如下

  • 确定表达式的位宽,一般情况下为最大操作数的位宽
  • 确定表达式是否有符号。若表达式中由任意一个操作数为无符号数,则该表达式为无符号表达式。若表达式中所有操作数都是有符号的,则表达式是有符号的表达式。表达式等号左边(及目标)的类型不能决定表达式的符号。
  • 每个操作数的位宽都被扩展到表达式的位宽,有符号的操作数用符号进行扩展,无符号的操作数用0进行扩展。
  • 计算表达式的值