购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.8 逻辑运算符号优先级

Verilog中各种逻辑运算符的优先级顺序见表2—2,其中运算符用逗号隔开,优先级数值低者更优先。因为表中求余运算器件不常用于RTL,所以在写代码时应使用更常见的逻辑取代。“&”和“&&”在电路上都会综合为与门,“|”和“||”在电路上都会综合为或门。“&”“|”和“ ^ ”既是单参数运算符(只需跟一个参数),又是双参数运算符(需要跟两个参数)。当作为单参数运算符时,可将一个多比特信号的内部进行按位运算,最终结果是单比特,例如& a ,其中 a 的位宽是3比特,该表达式将 a 的3比特都连到与门的输入端。在作为双参数运算符时,可将两个参数进行按位运算,两个参数的位宽必须相等,结果的位宽也与这两个参数一致,如 a & b ,表示 a b 按位进行与操作,而“&&”作为双参数运算符,体现的不是按位操作,而是逻辑操作,例如 a && b a 被看作一个事件,而 b 是另一个事件。原则上这两个事件都应该是单比特,值为1表示成功,为0表示失败,语法允许 a b 为多比特,只要不为全零即表示成功。在C语言中,常常会出现 a b 是多比特而使用&&的情况,而Verilog作为硬件设计语言,为了表义准确,应保证 a b 都是单比特,此时,&和&&可以通用。读者可能会读到类似( a == b )&( c != d )这样的代码,其中 a == b 可以理解为一个事件, c != d 可以理解为另一个事件,两个事件成功为1,失败为0,因此,( a == b )表达本身就只代表一个比特。另外,“!”和“~”在C语言中也有差别,“!”指逻辑取反,其参数是单比特,即本来某个事件是成功的,取“!”就变为失败,而“~”是按位取反,其参数允许是多比特的。在Verilog中,这两个符号的含义与C语言相同,但对于单比特信号,两个符号经常混用,例如触发器中复位逻辑有时会写为!rst_n,有时也会写为~rstn_n。

表2—2 逻辑运算符优先级

学习优先级的目的是可以让设计者少写几个括号,有时运算式特别复杂,括号特别多,可读性会很差,代码如下:

     assign z = ((a + (b * c)<<3) & (~d)) - 1;      //原式
     assign z = (a + b * c<<3 & ~d) - 1;            //简化式

括号多或少,都可能影响阅读体验,那么,哪些情况下需要加括号呢?原则如下:

(1)在设计者不确定优先级的情况下,应尽量加括号,防止出错。

(2)相同优先级的符号并列出现,要加括号以区分运算顺序。

(3)一些被普遍接受的表达可以不加括号,例如乘法优先于加法,对于 a +( b * c )就可以省略括号。

(4)(~ d )的优先级很高,可以省略括号。

(5)对于 a b 3,为了明确先做加法再左移3位,虽然可以不用括号,但一般会加上,以便表达式更清晰。

(6)当&等符号作为单参数运算符时,一般需要加括号以提醒阅读者,如(& a )或(~ a )。 RV2PAwyJ4mJYsTkr11BTf+SRnHj6d9IjFbTHdfBcCix2LBnJuOyT7YkOAwJ1b86C

点击中间区域
呼出菜单
上一章
目录
下一章
×