¿Cuál es la diferencia entre >>
y >>>
en verilog / system verilog? Sé que ==
prueba solo para 1 y 0, mientras que ===
prueba para 1, 0, X, Z. Entonces, ¿cómo es eso similar al operador de cambio?
¿Cuál es la diferencia entre >>
y >>>
en verilog / system verilog? Sé que ==
prueba solo para 1 y 0, mientras que ===
prueba para 1, 0, X, Z. Entonces, ¿cómo es eso similar al operador de cambio?
No es similar a ==
/ ===
, si el operando de la mano izquierda está firmado, entonces >>>
realiza la extensión de 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 .
Según IEEE1800-2012 >>
es un cambio lógico binario, mientras que >>>
es un cambio aritmético binario.
Básicamente, el cambio aritmético utiliza el contexto para determinar los bits de relleno, por lo que:
>>>
): desplaza a la derecha el número especificado de bits, rellena con el valor del bit de signo si la expresión está firmada , de lo contrario llena con cero, <<<
): desplaza a la izquierda el número especificado de bits, rellene con cero. Por otra parte, el desplazamiento lógico ( <<
, >>
) siempre llena las posiciones de bit vacantes con ceros.
Por ejemplo:
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
Lea otras preguntas en las etiquetas verilog system-verilog data-operator