回答:
==/ とは===異なり、左側のオペランドが符号付きの場合>>>、符号拡張を実行します。
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
integerタイプを除く)および算術シフト演算子は、Verilog-2001でのみVerilogに導入されました。
>>1985年に論理的なシフトを意味する必要がありました(1970年からのパスカルから取得)。したがって>>>、算術シフトに使用する必要がありました。
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。型を明確にするために例を更新すると便利だと思います。
>>と>>>演算子の意味の正反対です...邪悪です。