3

ビットごとの OR 演算子 ("|") がモナドで使用されている Verilog コードを見てきました。目的は何ですか?

例えば

| address[15:14]==0

また

|address[15:14]? io_din : ramrd

「|」を省略できませんか これらの場合?

4

4 に答える 4

8

この場合、リダクション演算子として機能します。次に例を示します。

|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 ビット値に OR するか、バス全体に AND/XOR を適用します。

これは、右側の引数のみを取るため、「単項」演算子と呼ばれます。これらは、SystemVerilog IEEE1800-2012 のセクション 11.4.9 でカバーされています。

于 2013-10-10T19:47:10.473 に答える
2
|address[15:14]? io_din : ramrd

書き込みのショートカットです

(address[15] | address[14]) ? io_din : ramrd

つまり、バスのすべてのビットをビットごとに OR して、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

提供されている例では、 を使用したコードは、 を省略|した同じコードと機能的に同等です。提供されたコードを|保持する 3 つの考えられる理由は次のとおりです。|

  1. 各ビットを 0addressと比較して結果を AND 演算するのではなく、最初にビットを OR 演算してから 0 と比較します。addressこれは、ゲート構成が異なっても機能的には同じ結果です。
  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

2 番目の例はよりトリッキーです。LRM は、三項式の最初の式がどのように評価されるかを指定していないようです。私はそれを縮小 OR として評価する 2 つのシムを知っているので、そのよう|な場合は を削除できます。ifただし、代わりにシムが(つまりif(address[15:14]))と同じ方法で評価する場合は、|が必要です。

もちろん、シンセサイザーは未知数について心配する必要がないため、合成はより単純です。

于 2013-10-11T08:34:51.870 に答える