¿Diferencia entre >> y >>> en verilog?

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?

daut
fuente

Respuestas:

13

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 .

pre_randomize
fuente
2
Wow, eso es exactamente lo contrario de los significados de Java >>y los >>>operadores ... malvados.
Colin D Bennett
2
Verilog fue 10 años antes de Java. : P
dave_59
1
@ dave_59, pero los valores con signo (aparte del integertipo de 32 bits ) y los operadores de desplazamiento aritmético solo se introdujeron en Verilog en Verilog-2001.
The Photon
1
Verilog ya tenía >>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.
dave_59
8

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:

  • desplazamiento aritmético a la derecha ( >>>): 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
  • Desplazamiento aritmético a la izquierda ( <<<): 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:

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
Qiu
fuente
Los resultados de este ejemplo dependen de la declaración de c: si usa reg [4:0] c, obtendrá 5'b00101, no 5'b11101. Creo que sería útil actualizar el ejemplo para aclarar los tipos.
Clément