Risposte:
Non è simile a ==
/ ===
, se l'operando di sinistra è firmato, >>>
esegue l'estensione del segno.
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
Risultato:
#a_signed 1111010101
#a_unsigned 0011010101
Esempio su EDA Playground .
integer
) e gli operatori di spostamento aritmetico sono stati introdotti in Verilog solo in Verilog-2001.
>>
significare uno spostamento logico nel 1985 (tratto da Pascal, che è del 1970). Quindi ha dovuto usare >>>
per il turno aritmetico.
Secondo IEEE1800-2012 >>
è uno spostamento logico binario, mentre >>>
è uno spostamento aritmetico binario.
Fondamentalmente, lo spostamento aritmetico utilizza il contesto per determinare i bit di riempimento, quindi:
>>>
) - sposta a destra il numero specificato di bit, riempi con il valore del bit di segno se espressione è firmata , altrimenti riempi con zero,<<<
) - sposta il numero di bit specificato a sinistra, riempi con zero.D'altra parte, lo shift logico ( <<
, >>
) riempie sempre di zero le posizioni di bit liberate.
Per esempio:
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
: se usi reg [4:0] c
, otterrai 5'b00101
, no 5'b11101
. Aggiornare l'esempio per chiarire i tipi sarebbe utile, credo.
>>
e degli>>>
operatori ... malvagi.