Verilog按位或(“|”)一元

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

我见过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
将整个总线的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