Différence entre >> et >>> dans Verilog?


8

Quelle est la différence entre >>et >>>dans verilog / verilog système? Je sais que les ==tests pour seulement 1 et 0, tandis que les ===tests pour 1, 0, X, Z. Alors, comment est-ce similaire à l'opérateur de décalage?

Réponses:


13

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 .


2
Wow, c'est exactement le contraire de la signification de Java >>et des >>>opérateurs ... méchants.
Colin D Bennett

2
Verilog était 10 ans avant Java. : P
dave_59

1
@ dave_59, mais les valeurs signées (à part le type 32 bits integer) et les opérateurs de décalage arithmétique n'ont été introduits dans Verilog que dans Verilog-2001.
The Photon

1
Verilog devait déjà >>signifier un changement logique en 1985 (tiré de Pascal, qui date de 1970). Il a donc dû utiliser >>>pour le décalage arithmétique.
dave_59

8

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 arithmétique à droite ( >>>) - 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 arithmétique ( <<<) - 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

Les résultats de cet exemple dépendent de la déclaration de 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.
Clément
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.