Est de dépassement d'entier défini en VHDL?
Je me demandais si le dépassement d'entier est défini en VHDL. Je n'ai pas pu trouver quoi que ce soit en 2002 lors de la Spécification.
Comme un exemple (à Noter que cela peut ne pas compiler, c'est juste un exemple générique...):
entity foo is port (
clk : std_logic
);
end entity;
architecture rtl of foo is
signal x : integer range 0 to 2 := 0;
begin
process (clk)
begin
if rising_edge(clk) then
x <= x + 1;
end if;
end process;
end architecture;
Il est clair que x
passe de 0 à 1, puis à 2. Est-il défini ce qui va se passer sur la prochaine augmentation? C'est qu'un comportement indéfini?
OriginalL'auteur Bill Lynch | 2012-11-19
Vous devez vous connecter pour publier un commentaire.
pour un banc de test pour rtl de foo dans ghdl:
J'ai ajouté un contexte clause du projet de Loi foo entité et de l'architecture:
La ligne 15 est le signal d'affectation de x:
C'est une erreur de simulation (qui se produit au moment de l'exécution).
De l'IEEE 1076-1993:
7.2.4 l'Ajout d'opérateurs
Cela signifie que le résultat de l'opérateur "+" peut être en dehors du sous-type de contrainte de x. Notez qu'une fonction déclarée à fournir une surcharge pour le "+" n'est pas autorisé à spécifier le résultat sous-type. (La valeur retournée peut être un objet déclaré avec un sous-type d'indication, qui peut définir la valeur de plage ou un tableau de longueur).
et 12.6.2 Multiplication de la valeur du signal
Si le résultat de l'addition ne correspond pas au sous-type de contrainte de la cible x, il va générer une erreur. Ce sous-type de contrainte est fourni par l'objet x de la déclaration qui fournit un sous-type d'indication d'un nombre entier (la plage).
Une erreur d'exécution provoque la simulation de résilier pour un LRM mise en œuvre conforme.
Sans un format standardisé pour les rapports d'erreurs ghdl ne pas fournir le courant du temps de simulation. Qui peut être trouvé à l'examen du produit de la forme d'onde:
La forme d'onde tout à fait être mise à jour après 20 ns. L'événement suivant:
aurait été le front montant de clk à 25 ns.
Donc, de ce nous raconte comment une contrainte entier produit une erreur de dépassement de capacité.
Que sur un nombre entier sans un sous-type de contrainte:
Nous définissons x comme une contrainte ensemble d'entiers, c'est la valeur par défaut où nous nous attendons à x à débordement.
Paquet standard explicitement déclare ENTIER "+":
Le résultat attendu est en dehors de la plage de l'ENTIER si, comme nous le voyons "+" a l'ordinaire et le sens mathématique du terme.
Cependant, à partir de la mise en œuvre dépend de la déclaration dans le paquet standard:
et la simulation:
Nous voyons la valeur de x autour.
La cession de l'opérateur "+" résultat violé aucune contrainte:
3 Types:
Dans notre deuxième l'architecture et il n'y a pas de contrainte, mais il n'existe pas de valeurs possibles en dehors de la plage déclaré de type INTEGER. La valeur à la place des rouleaux de fil.
La sémantique pour VHDL ont été construits pour ne pas nécessiter de détection et cela correspond à des opérations mathématiques sur des dimensions des tableaux d'éléments représentant les bits binaires (matériel).
OriginalL'auteur user1155120
Tout bon simulateur va s'arrêter là avec un message d'erreur de pointage précisément à la plus que débordé. (Xilinx Isim est seulement un simulateur décent si vous pensez à activer les contrôles SUR, la dernière fois que j'ai regardé)
Spooky si vous avez trop fait de la programmation en C cours de la années!
De synthèse permettra de faire tout ce qui économise du matériel, (dans ce cas, pas de sorties, d'optimiser les X et les processus de disparaître complètement!) il est donc préférable de prendre ce genre de bug dans la simulation.
OriginalL'auteur Brian Drummond
Débordement d'entier (et underflow) est mise en œuvre définies par le comportement en VHDL. Je ne peux pas citer les spec pour le moment, mais si vous lisez attentivement, vous verrez que presque tout entier sur les plages de la mise en œuvre est définie au-delà d'un minimum prise en charge de la gamme (
-2**31
à2**31
).Plus VHDL implémentations sur les machines 32 bits, fait se comportent comme s'ils étaient de 32-bit 2 est completement entiers (par exemple, comment entiers machines se comportent sur ces plates-formes) et 64 bits des implémentations ont généralement des entiers 64 bits, mais vous ne pouvez pas compter sur cela.
Pour votre exemple, si vous utilisez un entier sous-type d'une série, si vous essayez d'attribuer une valeur en dehors de cette plage c'est une erreur et va générer une affirmation au moment de l'exécution. (Synthétiseurs, d'autre part, feront tout ce qui est étrange qu'ils veulent, et d'habitude ils VONT déborder comme s'il s'agissait d'un complément de 2 entier).
pour la synthèse, vous souhaitez toujours utiliser la non signé et signé types de l'ieee.numeric_std 100% intead de entier pour n'importe quel endroit où vous vous attendez bien défini de dépassement de la sémantique (et pour tout le temps où vous avez besoin d'un certain nombre de bits, etc).
OriginalL'auteur wjl