Ответы:
Это не похоже на ==
/ ===
, если левый операнд подписан, то >>>
выполняет расширение знака.
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 .
integer
типа) и операторы арифметического сдвига были введены в Verilog только в Verilog-2001.
>>
был означать логический сдвиг в 1985 году (взято из Паскаля, то есть с 1970 года). Так что его пришлось использовать >>>
для арифметического сдвига.
Согласно IEEE1800-2012 >>
это двоичный логический сдвиг, в то время >>>
как это двоичный арифметический сдвиг.
В основном, арифметический сдвиг использует контекст для определения битов заполнения, поэтому:
>>>
) - сдвиг вправо на указанное число битов, заполнить значением знакового бита, если выражение подписано , в противном случае заполнить нулем,<<<
) - сдвиг влево на указанное количество бит, заполнение нулями.С другой стороны, логический shift ( <<
, >>
) всегда заполняет освобожденные позиции битов нулями.
Например:
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
. Думаю, было бы полезно обновить пример, чтобы уточнить типы.
>>
и>>>
операторов ... злой.