ビットごとの OR 演算子 ("|") がモナドで使用されている Verilog コードを見てきました。目的は何ですか?
例えば
| address[15:14]==0
また
|address[15:14]? io_din : ramrd
「|」を省略できませんか これらの場合?
ビットごとの OR 演算子 ("|") がモナドで使用されている Verilog コードを見てきました。目的は何ですか?
例えば
| address[15:14]==0
また
|address[15:14]? io_din : ramrd
「|」を省略できませんか これらの場合?
この場合、リダクション演算子として機能します。次に例を示します。
|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 でカバーされています。
|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
提供されている例では、 を使用したコードは、 を省略|
した同じコードと機能的に同等です。提供されたコードを|
保持する 3 つの考えられる理由は次のとおりです。|
address
と比較して結果を AND 演算するのではなく、最初にビットを OR 演算してから 0 と比較します。address
これは、ゲート構成が異なっても機能的には同じ結果です。|address[15:14]==1
へのコード行の近くにがあるため、読みやすくなります (視覚的/構造的に魅力的です) |address[15:14]==0
。(注意:|address[15:14]==1
はと同じではありませんaddress[15:14]==1
)「|」かどうかという具体的な質問について 次の場合は省略できます。
|address[15:14]
とが同一であるかどうかaddress[15:14]
は、コンテキストによって異なります (一般に、未知のものは異なる方法で処理されるため、同一ではありません)。あなたの最初の例は と比較されました。この特定のケースでは を削除できる0
のは事実です|
が、 以外のものと比較した場合はそうではありません0
。
2 番目の例はよりトリッキーです。LRM は、三項式の最初の式がどのように評価されるかを指定していないようです。私はそれを縮小 OR として評価する 2 つのシムを知っているので、そのよう|
な場合は を削除できます。if
ただし、代わりにシムが(つまりif(address[15:14])
)と同じ方法で評価する場合は、|
が必要です。
もちろん、シンセサイザーは未知数について心配する必要がないため、合成はより単純です。