Verilog按位或(“|”)一元
我见过Verilog代码,其中按位or运算符(“|”)是一元的。目的是什么 比如说Verilog按位或(“|”)一元,verilog,Verilog,我见过Verilog代码,其中按位or运算符(“|”)是一元的。目的是什么 比如说 | address[15:14]==0 或 在这些情况下,我们不能省略“|”吗 在这种情况下,它充当还原运算符,例如: |4'b1000 => 1'b1 (OR) &4'b1000 => 1'b0 (AND) ^4'b1000 => 1'b1 (XOR) |4'b0000 => 1'b0 &4'b1111 => 1'b1 ^4'b1111 => 1'b0
| address[15:14]==0
或
在这些情况下,我们不能省略“|”吗 在这种情况下,它充当还原运算符,例如:
|4'b1000 => 1'b1 (OR)
&4'b1000 => 1'b0 (AND)
^4'b1000 => 1'b1 (XOR)
|4'b0000 => 1'b0
&4'b1111 => 1'b1
^4'b1111 => 1'b0
将整个总线的or设置为1位值,或对整个总线应用AND/XOR
这被称为“一元”运算符,因为它只接受右手参数。SystemVerilog IEEE1800-2012第11.4.9节对其进行了介绍
|address[15:14]? io_din : ramrd
写作的捷径是什么
(address[15] | address[14]) ? io_din : ramrd
i、 将总线的所有位按位进行ORing,以生成1位值。
在这种情况下,如果位15或位14中的任何一个(或两个)为高,则其计算结果为高
类似地,您可以编写其他按位运算符
&address[15:14]? io_din : ramrd // ANDing
^address[15:14]? io_din : ramrd // XORing
在提供的示例中,带有
|
的代码在功能上等同于省略了|
的代码。为所提供的代码保留|
的三个可能原因是:
地址
位与0进行比较,而不是将每个地址
位与0进行比较,然后对结果进行ANDing。对于不同的门配置,这是相同的功能结果|address[15:14]==0的代码行上有一个|address[15:14]==1
。(提醒:|地址[15:14]==1
与地址[15:14]==1
不一致)
关于在这些情况下是否可以省略“|”的具体问题:
| address[15:14]
和address[15:14]
是否相同取决于上下文(通常情况下,它们不相同,因为未知的处理方式不同)。您的第一个示例与0
进行了比较,在这种特殊情况下可以删除|
,但如果您与0
以外的任何内容进行比较,则不成立
你的第二个例子更棘手。LRM似乎没有指定如何计算三元中的第一个表达式。我知道有2个模拟人生将其评估为一种减少或减少,因此在这些情况下可以删除
。但是,如果sim卡以与if
(即if(地址[15:14])
)相同的方式对其进行评估,则需要|
合成当然更简单,因为合成器不必担心未知因素。注意
测试?if_true:if_false
在含义上与测试相同?if_true:if_false
-在布尔上下文中使用时,
是冗余的,尽管地址[15:14]!=0可能比地址[15:14]==1更可读
&address[15:14]? io_din : ramrd // ANDing
^address[15:14]? io_din : ramrd // XORing