3

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

例如

| address[15:14]==0

或者

|address[15:14]? io_din : ramrd

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

4

4 回答 4

8

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.

于 2013-10-10T19:47:10.473 回答
2
|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
于 2013-10-10T20:01:39.950 回答
1

在提供的示例中,带有 的代码在|功能上等同于带有|省略的代码。|拥有并保留提供的代码的三个可能原因是:

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

关于是否'|'的具体问题 在这些情况下可以省略:

是否相同取决于上下文(通常,它们不是,因为未知数的处理方式不同)|address[15:14]address[15:14]您的第一个示例与 相比0,确实|可以在这种特殊情况下删除 ,但如果您与0.

你的第二个例子更棘手。LRM 似乎没有指定如何评估三元组中的第一个表达式。我知道有 2 个模拟人生将其评估为归约或,因此|在这些情况下可以放弃。if但是,如果 sim 以与(ie if(address[15:14]))相同的方式评估它,|则需要 。

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

于 2013-10-11T08:34:51.870 回答