Réponses:
Il n'est pas similaire à ==
/ ===
, si l'opérande de gauche est signé puis >>>
effectue l'extension du signe.
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
Résultat:
#a_signed 1111010101
#a_unsigned 0011010101
Exemple sur EDA Playground .
integer
) et les opérateurs de décalage arithmétique n'ont été introduits dans Verilog que dans Verilog-2001.
>>
signifier un changement logique en 1985 (tiré de Pascal, qui date de 1970). Il a donc dû utiliser >>>
pour le décalage arithmétique.
Selon IEEE1800-2012, il >>
s'agit d'un décalage logique binaire, alors qu'il >>>
s'agit d'un décalage arithmétique binaire.
Fondamentalement, le décalage arithmétique utilise le contexte pour déterminer les bits de remplissage, donc:
>>>
) - décalage à droite du nombre de bits spécifié, remplir avec la valeur du bit de signe si l'expression est signée , sinon remplir avec zéro,<<<
) - décalage gauche spécifié nombre de bits, remplir avec zéro.D'un autre côté, le décalage logique ( <<
, >>
) remplit toujours les positions de bits libérées avec des zéros.
Par exemple:
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
: si vous utilisez reg [4:0] c
, vous obtiendrez 5'b00101
, non 5'b11101
. Mettre à jour l'exemple pour clarifier les types serait utile, je pense.
>>
et des>>>
opérateurs ... méchants.