Verilogの>>と>>>の違いは?


8

違いは何である>>>>>のverilog /システムのverilogでは?==1と0のみを===テストし、1、0、X、Z をテストすることを知っています。シフト演算子とどのように似ていますか?

回答:


13

==/ とは===異なり、左側のオペランドが符号付きの場合>>>、符号拡張を実行します。

reg signed [9:0] b = 10'sb11_0101_0101;
reg signed [9:0] a_signed;
reg        [9:0] a_unsigned; 

always_comb begin
  a_signed   = b >>> 2;
  a_unsigned = b >>  2;
end

結果:

#a_signed   1111010101
#a_unsigned 0011010101

EDA Playgroundの例。


2
うわー、それはJava >>>>>演算子の意味の正反対です...邪悪です。
コリンDベネット

2
VerilogはJavaの10年前です。:P
dave_59 2014年

1
@ dave_59、ただし符号付きの値(32ビットintegerタイプを除く)および算術シフト演算子は、Verilog-2001でのみVerilogに導入されました。
Photon

1
Verilogはすでに>>1985年に論理的なシフトを意味する必要がありました(1970年からのパスカルから取得)。したがって>>>、算術シフトに使用する必要がありました。
dave_59

8

IEEE1800-2012によれば>>、バイナリ論理シフト>>>ですが、バイナリ算術シフトです。

基本的に、算術シフトはコンテキストを使用してフィルビットを決定するため、次のようになります。

  • 算術右シフト(>>>)-指定されたビット数だけ右にシフトします。式が符号付きの場合は符号ビットの値を入力し、それ以外の場合はゼロを入力します。
  • 算術左シフト(<<<)-指定されたビット数だけ左にシフトし、ゼロで埋めます。

一方、論理シフト(<<>>)は常に空のビット位置をゼロで埋めます。

例えば:

a = 5'b10100;
b = a <<< 2; //b == 5'b10000
c = a >>> 2; //c == 5'b11101, 'cause sign bit was `1`
d = a <<  2; //d == 5'b10000
e = a >>  2; //e == 5'b00101

この例の結果はの宣言に依存c:あなたが使用している場合reg [4:0] c、あなたが得るでしょう5'b00101、ではありません5'b11101。型を明確にするために例を更新すると便利だと思います。
クレメント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.