Verilog按位或(“|”)monadic
我看过Verilog代码,其中使用了位运算符(“|”)monadic。目的是什么?Verilog按位或(“|”)monadic
例如
| address[15:14]==0
或
|address[15:14]? io_din : ramrd
水湿我们省略 “|”在这些情况下?
在这种情况下它作为一个减少操作者,例如:
|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
或运算整个总线到一个1个比特值,或施加AND/XOR到整个总线。
这被称为'一元'操作符,因为它只需要一个右手参数。它们在SystemVerilog IEEE1800-2012的第11.4.9节中介绍。
|address[15:14]? io_din : ramrd
是快捷用于写入
(address[15] | address[14]) ? io_din : ramrd
即按位总线的所有位的或运算在一起以生成1比特的值。 在这种情况下,如果(或两者)第15位或第14位为高电平,它将评估为高电平。
同样可以写其它位运算符
&address[15:14]? io_din : ramrd // ANDing
^address[15:14]? io_din : ramrd // XORing
在所提供的实例中,与|
代码是功能上等同于相同的省略了|
编码。三个可能的理由,并保持|
对所提供的代码是:
- 它给出指导合成:第一或
address
位,然后比较,而不是每个address
位比较为0,则取与的结果为0, 。这是不同的门配置相同的功能结果。 - 它遵循编码风格或格式风格要求。
- 它只是读得更好(视觉上/结构上吸引人),因为
|address[15:14]==0
附近的代码行有|address[15:14]==1
。 (提醒:|address[15:14]==1
是不一样address[15:14]==1
)
尽管'address [15:14]!= 0'可能比'| address [15:14] == 1'更具可读性 – Eric
上的具体问题是否会出现 '|'在这些情况下可以省略:
|address[15:14]
和address[15:14]
是否相同取决于上下文(通常它们不是,因为未知数的处理方式不同)。你的第一个例子与0
相比,在这种情况下|
可以被删除,但如果与0
以外的任何其他值进行比较,则不会这样。
你的第二个例子更棘手。 LRM似乎没有指定如何评估三元组中的第一个表达式。我知道有2个模拟评估它是一个还原-OR,因此在这些情况下可以删除|
。然而,如果一个sim用与if
(即if(address[15:14])
)相同的方式评估它,那么|
是必需的。
合成比较简单,当然,因为合成器不必担心未知数。
请注意'测试? if_true:if_false'在含义上与'| test? if_true:if_false' - 当在布尔上下文中使用时,'|'是redudant – Eric