В чем разница между >>
и >>>
в verilog / системном verilog? Я знаю, что ==
тесты только для 1 и 0, в то время как ===
тесты для 1, 0, X, Z. Так как это похоже на оператор сдвига?
8
В чем разница между >>
и >>>
в verilog / системном verilog? Я знаю, что ==
тесты только для 1 и 0, в то время как ===
тесты для 1, 0, X, Z. Так как это похоже на оператор сдвига?
Это не похоже на ==
/ ===
, если левый операнд подписан, то >>>
выполняет расширение знака.
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 (
<<
,>>
) всегда заполняет освобожденные позиции битов нулями.Например:
источник
c
: если вы используетеreg [4:0] c
, вы получите5'b00101
, а не5'b11101
. Думаю, было бы полезно обновить пример, чтобы уточнить типы.