Разница между >> и >>> в 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 .

pre_randomize
источник
2
Вау, это как раз противоположно значениям Java >>и >>>операторов ... злой.
Колин Д. Беннетт
2
Верилог был за 10 лет до Явы. : P
dave_59
1
@ dave_59, но знаковые значения (кроме 32-битного integerтипа) и операторы арифметического сдвига были введены в Verilog только в Verilog-2001.
Фотон
1
Верилог уже должен >>был означать логический сдвиг в 1985 году (взято из Паскаля, то есть с 1970 года). Так что его пришлось использовать >>>для арифметического сдвига.
dave_59
8

Согласно IEEE1800-2012 >>это двоичный логический сдвиг, в то время >>>как это двоичный арифметический сдвиг.

В основном, арифметический сдвиг использует контекст для определения битов заполнения, поэтому:

  • арифметика вправо shift ( >>>) - сдвиг вправо на указанное число битов, заполнить значением знакового бита, если выражение подписано , в противном случае заполнить нулем,
  • арифметика влево shift ( <<<) - сдвиг влево на указанное количество бит, заполнение нулями.

С другой стороны, логический 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. Думаю, было бы полезно обновить пример, чтобы уточнить типы.
Климент