What is the difference between >>
and >>>
in verilog/system verilog? I know that ==
tests for only 1 and 0, while ===
tests for 1, 0, X, Z. So how is that similar to the shift operator?
3 Answers 3
It is not similar to ==
/===
, if the left hand operand is signed then >>>
performs sign extension.
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
Result:
#a_signed 1111010101
#a_unsigned 0011010101
Example on EDA Playground.
-
2\$\begingroup\$ Wow, that is exactly the opposite of the meanings of the Java
>>
and>>>
operators... wicked. \$\endgroup\$Colin D Bennett– Colin D Bennett2014年10月11日 07:23:45 +00:00Commented Oct 11, 2014 at 7:23 -
2\$\begingroup\$ Verilog was 10 years before Java. :P \$\endgroup\$dave_59– dave_592014年10月11日 15:49:26 +00:00Commented Oct 11, 2014 at 15:49
-
1\$\begingroup\$ @dave_59, but signed values (aside from the 32-bit
integer
type) and the arithmetic shift operators were only introduced to Verilog in Verilog-2001. \$\endgroup\$The Photon– The Photon2019年01月19日 22:15:14 +00:00Commented Jan 19, 2019 at 22:15 -
1\$\begingroup\$ Verilog already had
>>
to mean logical shift in 1985 (taken from Pascal, which is from 1970). So it had to use>>>
for arithmetic shift. \$\endgroup\$dave_59– dave_592019年01月20日 02:11:33 +00:00Commented Jan 20, 2019 at 2:11
According to IEEE1800-2012 >>
is a binary logical shift, while >>>
is a binary arithmetic shift.
Basically, arithmetic shift uses context to determine the fill bits, so:
- arithmetic right shift (
>>>
) - shift right specified number of bits, fill with value of sign bit if expression is signed, otherwise fill with zero, - arithmetic left shift (
<<<
) - shift left specified number of bits, fill with zero.
On the other hand, logical shift (<<
, >>
) always fill the vacated bit positions with zeroes.
For example:
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
-
1\$\begingroup\$ The results of this example depend on the declaration of
c
: if you usereg [4:0] c
, you'll get5'b00101
, not5'b11101
. Updating the example to clarify the types would be useful, I think. \$\endgroup\$Clément– Clément2020年02月21日 14:06:35 +00:00Commented Feb 21, 2020 at 14:06
Note: In logical shift (>> or <<) if number is signed or unsigned always insert zero at palace of vacant bits.
In arithmetic shift (>>> or <<<)
if number is signed then (in case >>>) MSB will be insert at palace of vacant bits, and (in case <<<) zero will insert at palace of vacant bits.
if number is unsigned then zero at palace of vacant bits.
Here Example:
input [4:0] a;
input signed [4:0] b;
output [4:0] c;
output signed [4:0] d;
if
assign c = a >> 2;
assign d = b >> 2;
then
0, inputs a=00100, b=01110,output c=00001, d=00011
10, inputs a=00001, b=01101,output c=00000, d=00011
20, inputs a=01001, b=11101,output c=00010, d=00111
30, inputs a=10101, b=10001,output c=00101, d=00100
40, inputs a=10001, b=10111,output c=00100, d=00101
if
assign c = a >>> 2;
assign d = b >>> 2;
then
0, inputs a=00100, b=01110,output c=00001, d=00011
10, inputs a=00001, b=01101,output c=00000, d=00011
20, inputs a=01001, b=11101,output c=00010, d=11111
30, inputs a=10101, b=10001,output c=00101, d=11100
40, inputs a=10001, b=10111,output c=00100, d=11101
if
assign c = a >>> 2;
assign d = b <<< 2;
then
0, inputs a=00100, b=01110,output c=00001, d=11000
10, inputs a=00001, b=01101,output c=00000, d=10100
20, inputs a=01001, b=11101,output c=00010, d=10100
30, inputs a=10101, b=10001,output c=00101, d=00100
40, inputs a=10001, b=10111,output c=00100, d=11100
Explore related questions
See similar questions with these tags.