Verilog按位或(“|”)monadic

时间:2013-10-10 18:52:26

标签: verilog

我见过Verilog代码,其中按位或运算符(“|”)使用monadic。目的是什么?

例如

| address[15:14]==0

|address[15:14]? io_din : ramrd

我们不能省略“|”在这些情况下?

4 个答案:

答案 0 :(得分:4)

在这种情况下,它充当减少运算符,例如:

|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节中介绍。

答案 1 :(得分:2)

|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

答案 2 :(得分:1)

在提供的示例中,|的代码在功能上等同于省略|的相同编码。保留所提供代码的{​​{1}}的三个可能原因是:

  1. 它为合成器提供指导:首先,然后将|位与0进行比较,而不是将每个address位与0进行比较,然后对结果进行AND运算。不同的门配置具有相同的功能结果。
  2. 遵循编码样式或格式样式要求。
  3. 它只是阅读得更好(视觉/结构上吸引人),因为在address的近似代码行上有一个|address[15:14]==1。 (提醒:|address[15:14]==0 |address[15:14]==1相同

答案 3 :(得分:0)

关于“|”的具体问题在这些情况下可以省略:

|address[15:14]address[15:14]是否相同取决于上下文(一般情况下,它们不是,因为未知数的处理方式不同)。您的第一个示例与0进行了比较,并且在此特定情况下可以删除|,但如果您与0以外的任何内容进行比较,则不会出现这种情况。

你的第二个例子比较棘手。 LRM似乎没有指定如何评估三元组中的第一个表达式。我知道2个sims将它评估为还原OR,因此在这些情况下可以删除|。但是,如果SIM卡的评估方式与if(即if(address[15:14]))相同,则需要|

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