Verilog有哪些运算符及其优先级

本文详细介绍了Verilog语言中的各种运算符,包括算术运算符、关系运算符、逻辑运算符、条件运算符、位运算符、移位运算符和拼接运算符,并解释了它们的使用方法和优先级。

目录

1、算术运算符

2、关系运算符

3、 逻辑运算符

4、 条件运算符

5、位运算符

6、 移位运算符

7、 拼接运算符

8、运算符的优先级


Verilog中的运算符
按照功能可以分为下述类型:

  • 1、算术运算符、
  • 2、关系运算符、
  • 3、逻辑运算符、
  • 4、条件运算符、
  • 5、位运算符、
  • 6、移位运算符、
  • 7、拼接运算符。

1、算术运算符

算术运算符,简单来说,就是数学运算里面的加减乘除,数字逻辑处理有时候也需要进行数字运算,所以需要算术运算符。

符号使用方法说明
+a + b

                                        a加上b 

-a - ba减去b
*a * ba乘以b
/a / ba除以b
%a % ba模除b

 

 

 

 

 

 

Verilog实现乘除比较浪费组合逻辑资源,尤其是除法。一般2的指数次幂的乘除法使用移位运算来完成运算,详情可以看移位运算符章节。非2的指数次幂的乘除法一般是调用现成的IP,QUARTUS/ISE等工具软件会有提供,不过这些工具软件提供的IP也是由最底层的组合逻辑(与或非门等)搭建而成的。

2、关系运算符

关系运算符主要是用来做一些条件判断用的,在进行关系运算符时,如果声明的关系是假的,则返回值是0,如果声明的关系是真的,则返回值是1;所有的关系运算符有着相同的优先级别,关系运算符的优先级别低于算术运算符的优先级别

符号使用方法说明
>a > ba大于b
<a < ba小于b
>=a >= ba大于等于b
<=a <= ba小于等于b
==a == ba等于b
!=a != ba不等于b

 

 

 

 

 

 

 

 

3、 逻辑运算符

逻辑运算符是连接多个关系表达式用的,可实现更加复杂的判断,一般不单独使用,都需要配合具体语句来实现完整的意思

符号使用方法说明
!!aa的非,如果a为0,那么a的非是1。
&&a && ba 与上 b,如果a和b都为1,a&&b结果才为1,表示真
||a || ba 或上 b,如果a或者b有一个为1,a||b结果为1,表示真。

 

 

 

 

 

4、 条件运算符

条件操作符一般来构建从两个输入中选择一个作为输出的条件选择结构,功能等同于always中的if-else语句。

符号使用方法说明
? :a ? b : c如果 a 为真,就选择 b,否则选择 c

 

 

 

5、位运算符

位运算符是一类最基本的运算符,可以认为它们直接对应数字逻辑中的与、或、非门等逻辑门。

符号使用方法说明
~~a将 a 的每个位进行取反
&a & b将 a 的每个位与 b 相同的位进行相与
|a | b将 a 的每个位与 b 相同的位进行相或
^a ^ b将 a 的每个位与 b 相同的位进行异或

 

 

 

 

 

 

位运算符的与、或、非与逻辑运算符逻辑与、逻辑或、逻辑非使用时候容易混淆,逻辑运算符一般用在条件判断上,位运算符一般用在信号赋值上。

6、 移位运算符

移位运算符包括左移位运算符和右移位运算符,这两种移位运算符都用0来填补移出的空位。

符号使用方法说明
<<a << b将 a 左移 b 位
>>a >> b将 a 右移 b 位

 

 

 

 

假设a有8bit数据位宽,那么a<<2,表示a左移2bit,a还是8bit数据位宽,a的最高2bit数据被移位丢弃了,最低2bit数据固定补0。如果a是3(二进制:00000011),那么3左移2bit,3<<2,就是12(二进制:00001100)。一般使用左移位运算代替乘法,右移位运算代替除法,但是这种也只能表示2的指数次幂的乘除法。

7、 拼接运算符

Verilog中有一个特殊的运算符是C语言中没有的,就是位拼接运算符。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。

符号使用方法说明
{}{a, b}将 a 和 b 拼接起来,作为一个新信号

 

 

 

8、运算符的优先级

运算符优先级
!  、 ~最高
*  、 / 、%次高
+ 、 -

                        优

                        先

                        级

                        依

                        次

                        降

                        低

<< 、 >>
< 、 <= 、 > 、 >= 
== 、 != 、 === 、 !==
&
^ 、 ^~
|
&&
||次低
最低

 

### Verilog 中的运算优先级运算符优先级规则 #### 1. 运算符分类及其优先级 Verilog运算符按照其功能可以分为多个类别,每类运算符具有不同的优先级。以下是详细的分类和优先级列表(从高到低排列)[^1]: | 类别 | 运算符 | |--------------------|--------------------------------------------------------------------------------------------| | 单目运算符 | `~`, `!`, `&`, `\|`, `-` | | 幂运算 | `**` | | 乘除模运算 | `*`, `/`, `%` | | 加减运算 | `+`, `-` | | 移位运算 | `<<`, `>>` | | 关系运算符 | `<`, `<=`, `>`, `>=` | | 等式比较 | `==`, `!=`, `===`, `!==` | | 按位与 | `&` | | 按位异或 | `^`, `~^` | | 按位或 | `\|` | | 逻辑与 | `&&` | | 逻辑或 | `\|\|` | | 条件运算符 | `? :` | | 赋值运算符 | `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `\|=`, `^=`, `<<=`, `>>=` | --- #### 2. 特殊说明 - **单目运算符**:这些运算符作用于单一操作数,例如取反 (`~`) 或逻辑非 (`!`)。 - **关系运算符**:用于比较两个操作数之间的大小关系,返回布尔值。 - **按位运算符**:逐位执行二进制操作,适用于整型数据类型的每一位。 - **逻辑运算符**:评估整个表达式的真伪状态,通常用于条件判断。 - **赋值运算符**:不仅完成变量初始化还可能涉及复合计算后再赋值的操作。 --- #### 3. 示例分析 以下是一些具体示例来展示不同级别间如何相互作用以及遵循既定顺序的重要性: ##### 示例 1: 结合多种运算符 ```verilog module priority_example; initial begin integer a, b, c, d; a = 5; b = 3; c = 7; // 表达式混合了加法、乘法和移位操作 d = (a + b * c << 2); $display("Result of expression is %d", d); end endmodule ``` 在此情况下: - 首先执行乘法 `(b * c)` 得到结果为 `21`. - 接着进行左移操作 `21 << 2` 计算得出 `84`. - 最终加上 `a` 值即得到总的结果 `89`. 注意这里括号强制改变了默认的求解路径从而确保预期效果得以实现. ##### 示例 2: 使用逻辑运算符构建复杂条件 ```verilog module logical_priority; reg [3:0] data_in; always @(*) begin if ((data_in > 4'd8 && data_in < 4'd15) || !data_in) begin $display("Condition met!"); end else begin $display("Condition not met."); end end endmodule ``` 此处: - 先分别独立检验子句内的范围检查及零检测. - 再依据逻辑 OR 将两者组合起来形成最终判定标准. --- #### 4. 注意事项 虽然了解并记住所有层次间的相对地位很有帮助,但在实际编码过程中推荐适当加入圆括号明确指示期望的行为模式以免因误解引发错误[^2]. 此外还需留意某些特殊情形下可能存在例外状况比如三元选择器(? :) 应处于最低层以避免混淆解读. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值