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?

daut
la source

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 .

pre_randomize
la source
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
Qiu
la source
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