Ответы:
Это не похоже на ==/ ===, если левый операнд подписан, то >>>выполняет расширение знака.
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. Думаю, было бы полезно обновить пример, чтобы уточнить типы.
>>и>>>операторов ... злой.