我见过Verilog代码,其中按位或运算符(“|”)使用monadic。目的是什么?
例如
| address[15:14]==0
或
|address[15:14]? io_din : ramrd
我们不能省略“|”在这些情况下?
答案 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}}的三个可能原因是:
|
位与0进行比较,而不是将每个address
位与0进行比较,然后对结果进行AND运算。不同的门配置具有相同的功能结果。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])
)相同,则需要|
。
合成更简单,当然,因为合成器不必担心未知数。