我见过 Verilog 代码,其中按位或运算符 ("|") 是单子使用的。目的是什么?
例如
| address[15:14]==0
或者
|address[15:14]? io_din : ramrd
我们不能省略“|” 在这些情况下?
我见过 Verilog 代码,其中按位或运算符 ("|") 是单子使用的。目的是什么?
例如
| address[15:14]==0
或者
|address[15:14]? io_din : ramrd
我们不能省略“|” 在这些情况下?
In this case it acts as a reduction operator, for example:
|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
ORing the entire bus to a 1 bit value, or applying an AND/XOR to the entire bus.
This is referred to as a 'unary' operator as it only take a right hand argument. They are covered in Section 11.4.9 of SystemVerilog IEEE1800-2012.
|address[15:14]? io_din : ramrd
是写作的捷径
(address[15] | address[14]) ? io_din : ramrd
即对总线的所有位进行按位或运算以生成 1 位值。在这种情况下,如果第 15 位或第 14 位中的一个(或两者)为 HIGH,它将评估为 HIGH。
同样,您可以编写其他按位运算符
&address[15:14]? io_din : ramrd // ANDing
^address[15:14]? io_din : ramrd // XORing
在提供的示例中,带有 的代码在|
功能上等同于带有|
省略的代码。|
拥有并保留提供的代码的三个可能原因是:
address
位,然后与 0 比较,而不是将每个address
位与 0 比较,然后对结果进行与运算。这是相同的功能结果与不同的门配置。|address[15:14]==1
在附近的代码行上有一个|address[15:14]==0
. (提醒:|address[15:14]==1
不一样)address[15:14]==1
关于是否'|'的具体问题 在这些情况下可以省略:
是否相同取决于上下文(通常,它们不是,因为未知数的处理方式不同)|address[15:14]
。address[15:14]
您的第一个示例与 相比0
,确实|
可以在这种特殊情况下删除 ,但如果您与0
.
你的第二个例子更棘手。LRM 似乎没有指定如何评估三元组中的第一个表达式。我知道有 2 个模拟人生将其评估为归约或,因此|
在这些情况下可以放弃。if
但是,如果 sim 以与(ie if(address[15:14])
)相同的方式评估它,|
则需要 。
当然,合成更简单,因为合成器不必担心未知数。