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.