Comment Verilog se comporter avec les nombres négatifs?
Par exemple, dire que j'ai un reg [7:0] myReg
Je affectez-lui la valeur -8'D69
Je sais Verilog stocke sous forme de complément de 2 il doit donc être stocké comme
10111011
La question que je me pose maintenant est de savoir si je devais effectuer une opération sur elle, dire myReg/2
Serait-il évaluer à -34? Ou faudrait-il 10111011 et de le transformer en 187 puis effectuer les opérations de division, de retour de 93?
Vous devez également déclarer des nombres signés en tant que tel.
Vous pouvez utiliser >>> 1 pour effectuer un signe étendu de diviser par 2. (s'il est déclaré comme un type signé).
reg signed [7:0] my_reg
Vous pouvez utiliser >>> 1 pour effectuer un signe étendu de diviser par 2. (s'il est déclaré comme un type signé).
OriginalL'auteur wonton | 2012-09-13
Vous devez vous connecter pour publier un commentaire.
Vous devez vous rappeler que
-8d69
est un peu juste motif. reg est un type qui détient les séquences de bits. C'est le type de la variable qui indique/
pour effectuer signé ou non signé l'arithmétique.Si c'est pour la synthèse bare à l'esprit que vous voulez essayer et d'éviter les diviseurs, vous voulez vraiment essayer et d'éviter signé diviseurs. Il sera probablement de synthèse les plus petits avec
>>> 1
Donne:
>> x
Décale à droite par x lieux,>>> x
Décale à droite x endroits, mais signe s'étend pour les types signés.NB: le
/2
est également arrondi vers le haut dans mes exemples,>>>
arrondir vers le bas/truncate.OriginalL'auteur Morgan
Ce n'est pas vraiment un signé nombre, mais plutôt une expression composée d'un unaire de négation appliquée à une constante positive. Si l'expression a été
-8'd130
le résultat de débordement. Signé constantes sont déclarées comme8'sd69
ou tout simplement69
.myReg
est pas signé donc le résultat de l'expression sera également unsigned*. Si vous avez besoin de la raison d'être signé que tous opérandes doivent être signés. Il y a deux façons d'y parvenir:*L'ensemble des règles concernant l'évaluation de l'expression sont beaucoup plus complexes, mais fondamentalement le résultat d'une expression est non signés, à moins que tous les opérandes sont signés.
OriginalL'auteur
Je vais ajouter que
1. Types de données bits et les reg sont pas signés par défaut.
2. Les types de données int, integer, longint, de type shortint, et octet signé, par défaut.
3. Tous ces types de données peuvent prendre un signés ou non signés qualifier pour modifier la valeur par défaut.
Ainsi, l'attribution -8'D69 à myReg fait une conversion implicite à 187. Ensuite, myReg/2 = 187/2 = 93, non signé. Il est important de comprendre quand et comment SystemVerilog ne les conversions de type implicites dans les expressions et les affectations.
OriginalL'auteur Steve K