Verilog语法(二)——运算符

Verilog HDL 中支持多种运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符等等。以下是一些常用的运算符及其用法。

算术运算符

Verilog 中的算术运算符包括加法、减法、乘法、除法、取模等。它们的用法与常见的编程语言类似,如:

  • 加法:+


a + b
  • 减法:-


a - b
  • 乘法:*


a * b
  • 除法:/


a / b
  • 取模:%


a % b

比较运算符

Verilog 中的比较运算符用于比较两个数的大小或相等性,如:

  • 相等:==


a == b
  • 不相等:!=


a != b
  • 大于:>


a > b
  • 小于:<


a < b
  • 大于等于:>=


a >= b
  • 小于等于:<=


a <= b

逻辑运算符

Verilog 中的逻辑运算符包括与、或、非、异或等,它们的用法如下:

  • 与:&&


a && b
  • 或:||


a || b
  • 非:!


!a
  • 异或:^


a ^ b

位运算符

Verilog 中的位运算符用于对二进制数的位进行操作,包括按位与、按位或、按位异或、按位取反等。它们的用法如下:

  • 按位与:&


a & b
  • 按位或:|


a | b
  • 按位异或:^


a ^ b
  • 按位取反:~


~a

以上是常用的 Verilog 运算符及其用法,需要根据具体场景选择不同的运算符来实现电路的功能。

运算优先级

Verilog HDL 中的运算符优先级按照从高到低的顺序如下:

运算符类型

优先级

()

1

-

2

! ~

3

* / %

4

+ -

5

<< >> >>>

6

< <= > >=

7

== !=

8

&

9

^

10

|

11

&&

12

||

13

?:

14

=

15

运算符优先级越高,其计算顺序越先。括号可以改变优先级顺序,使用括号可以使运算符按照自己的期望顺序进行计算。例如,以下表达式使用了运算符优先级规则:


a + b * c

根据优先级规则,b * c 会先计算,然后再和 a 相加。如果需要改变计算顺序,可以使用括号来改变优先级,例如:


(a + b) * c

这样,(a + b) 会先计算,然后再和 c 相乘。

注意:Verilog 运算符优先级不同于其他编程语言中的优先级,因此在使用时需要格外注意。建议在表达式中使用括号来显式地标识优先级顺序,提高代码的可读性和可维护性。

表达式位宽的推断

身为硬件描述语言,Verilog表达式运算过程中必然要严肃考虑位宽问题

表达式的位宽由式中操作数和语境决定

表达式按位宽确定方式分为两类:

  • self-determined expression

A self-determined expression is one where the bit length of the expression is solely determined by the expression itself—for example, an expression representing a delay value.

位宽仅有表达式自身确定,不会受语境影响也不影响语境中其他表达式(在复合表达式中某些位置上的子表达式,如i>>j中的表达式j、i?j:k中的表达式i)。

  • context-determined expression

A context-determined expression is one where the bit length of the expression is determined by the bit length of the expression and by the fact that it is part of another expression. For example, the bit size of the right-hand expression of an assignment depends on itself and the size of the left-hand side.

位宽由表达式本身和其所属表达式(父子表达式)共同决定(如阻塞赋值操作的RHS位宽由其自身和LHS被赋值变量的位宽决定)。

下表中i j k表示“单操作数表达式”,L(i)表示表达式i的位宽。(表来源于Verilog LRM)

位宽问题导致丢失最高位精度

举个例子,看下面这两组加法:


reg [15:0] a,b,ans; //16 bits register
// expression 1
ans = (a + b) >> 1;
// expression 2
ans = (a + b + 0) >> 1;
  • e1中,a,b都是16 bits,那么temp result (a+b) 也将会是16bits,一旦overflow,就会导致最高位丢失,也就是说ans的最高位永远是0

  • e2中,0默认为integer,此时就可以保证temp result至少是17bits,就不会丢失最高位的精度

表达式符号的推断

Verilog计算表达式前,需要确定表达式的符号性,规则如下:

  • 仅取决于RHS操作数,与LHS无关(与位宽确定有别,如assign a = b ? c : d;中LHS符号性与a自身无关)

  • 十进制数视为signed

  • 进制表示数视为unsigned,除非使用进制前加s特殊标明(4'd3无符号,4'sd3无符号)

  • 位选择(不论是否选全)、位拼接(不论操作数)结果视为unsigned


reg [15:0] a;
reg signed [7:0] b;

initial 
    a = b[7:0] //此处认为b[7:0]为无符号数,所以做 zero-extended
  • 比较表达式结果视为unsigned

  • 实数强转整形表达式结果视为signed

  • self-determined expression:符号性取决于其中操作数

  • context-determined expression:(nonself-determined operands)

  • 若存在操作数为real,则结果视为real

  • 若存在操作数为unsigned,则结果视为unsigned

  • 若所有操作数为signed,则结果视为signed

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值