¿Cuál es la diferencia entre >>
y >>>
en verilog / system verilog? Sé que ==
solo prueba 1 y 0, mientras que ===
prueba 1, 0, X, Z. Entonces, ¿cómo es eso similar al operador de turno?
8
¿Cuál es la diferencia entre >>
y >>>
en verilog / system verilog? Sé que ==
solo prueba 1 y 0, mientras que ===
prueba 1, 0, X, Z. Entonces, ¿cómo es eso similar al operador de turno?
No es similar a ==
/ ===
, si el operando de la izquierda está firmado, entonces >>>
realiza la extensión del signo.
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
Resultado:
#a_signed 1111010101
#a_unsigned 0011010101
Ejemplo en EDA Playground .
>>
y los>>>
operadores ... malvados.integer
tipo de 32 bits ) y los operadores de desplazamiento aritmético solo se introdujeron en Verilog en Verilog-2001.>>
que significar un cambio lógico en 1985 (tomado de Pascal, que es de 1970). Por lo tanto, tuvo que usarse>>>
para el cambio aritmético.Según IEEE1800-2012
>>
es un cambio lógico binario, mientras que>>>
es un cambio aritmético binario.Básicamente, el desplazamiento aritmético utiliza el contexto para determinar los bits de relleno, por lo que:
>>>
): desplaza a la derecha el número de bits especificado, rellene con el valor del bit de signo si la expresión está firmada ; de lo contrario, rellene con cero<<<
): desplaza a la izquierda el número especificado de bits, rellene con cero.Por otro lado, el desplazamiento lógico (
<<
,>>
) siempre llena las posiciones de bit desocupadas con ceros.Por ejemplo:
fuente
c
: si usareg [4:0] c
, obtendrá5'b00101
, no5'b11101
. Creo que sería útil actualizar el ejemplo para aclarar los tipos.