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 
+0

请注意'测试? if_true:if_false'在含义上与'| test? if_true:if_false' - 当在布尔上下文中使用时,'|'是redudant – Eric

在所提供的实例中,与|代码是功能上等同于相同的省略了|编码。三个可能的理由,并保持|对所提供的代码是:

  1. 它给出指导合成:第一或address位,然后比较,而不是每个address位比较为0,则取与的结果为0, 。这是不同的门配置相同的功能结果。
  2. 它遵循编码风格或格式风格要求。
  3. 它只是读得更好(视觉上/结构上吸引人),因为|address[15:14]==0附近的代码行有|address[15:14]==1。 (提醒:|address[15:14]==1一样address[15:14]==1
+0

尽管'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]))相同的方式评估它,那么|是必需的。

合成比较简单,当然,因为合成器不必担心未知数。