Ich kriege ein paar Warnungen mit ghdl, das Problem es ist daß es nicht
sagt wo (in meinem Quelltext). Ich hab ghdl 0.35 (llvm/x64) unter
Windows:
../../src/ieee2008/numeric_std-body.vhdl:3034:7:@0ms:(assertion
warning): NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0
../../src/ieee2008/numeric_std-body.vhdl:3087:7:@1043us:(assertion
warning): NUMERIC_STD.TO_UNSIGNED: vector truncated
Gibt es irgend ein Kommando/Option was man verwenden könnte so es sagt
mindesten wie den Parameter heist ?.
ghdl -r --ieee=synopsys --std=08 tb --vcd=tb_11.vcd --stop-time=10ms
wo (in meinem Quelltext)
Gibt es irgend ein Kommando/Option was man verwenden könnte so es sagt
mindesten wie den Parameter heist ?
lesen kann ich auch :/
Schau Dir mal die Stellen an, an denen Du to_integer bzw. to_unsigned
verwendest.
Die mögen es nicht, wenn etwas anderes als '0' oder '1' konvertiert
werden soll.
Bei Modelsim setze ich in solchen Fällen die 'Break Severity' hoch, um
die Stelle und den Zeitpunkt zu finden.
Duke
Duke Scarring schrieb:> Schau Dir mal die Stellen an, an denen Du to_integer bzw. to_unsigned> verwendest.> Die mögen es nicht, wenn etwas anderes als '0' oder '1' konvertiert> werden soll.
denke ich auch, da wird wohl ein nicht initialisierter std_logic_vector
oder (un)signed nach Integer gemoppelt
Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es
gezeigt!
Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine
Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).
Ale schrieb:> Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es> gezeigt!> Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine> Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).
Das tut es doch?
Der Fehler tritt in numeric_std-body.vhdl in Zeile 3034 auf.
Dort steht ein assert mit severity warning. Mach' da (von mir aus auch
temporär) ein "severity error" draus und Du bekommst einen Fehler mit
backtrace. Mit dem kannst Du festestellen, wo das Problem auftritt.
Das sollte aber auch ohne diese Änderung nicht allzu schwierig sein - so
viele Stellen, wo Du to_integer() aufrufst, wird's ja wohl nicht geben.
Markus F. schrieb:> Ale schrieb:>> Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es>> gezeigt!>> Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine>> Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).>> Das tut es doch?>> Der Fehler tritt in numeric_std-body.vhdl in Zeile 3034 auf.
Genaugenommen tritt der Fehler nicht im Quelltext sondern während der
Laufzeit auf. Und ursächlich ist nicht der Quelltext der meckert
(konvertierungsroutine in Standard-lib) sondern entweder der Umstand das
eine Konvertierung gemacht wird, die vermeidbar ist oder das ein
mehrwertigessignal (höchstwahrscheinlich vom typ std_logic) einen Wert
neben '1' oder '0' annimmt. Und es ist kein Fehler sondern eine warning,
die man wennman deren Ursache kennt, getrost ignorieren kann.
Vielleicht hilft es den Code für einen anderen hdl-standard bspw. 93 zu
kompilieren, vielleicht sind diese standardlibs genauer.
Dann könnte es auch sein, das "zuviel" optimiert wurde bei Compilieren,
bspw Reduktion des Speicherbedarfs durch Entfernen der Symboltabelle.
Bei manchen Compileren heisst die Option die die (hier mglw nötige)
Synboltablle entfernt "-strip".
Auf die schnelle fallen mir in
https://ghdl.readthedocs.io/en/latest/using/InvokingGHDL.html
folgende Optionen auf
--ieee= ...versuch mal ne andere standard lib
-v ..verbose (geschwätzig)
C. A. Rotwang schrieb:> Genaugenommen tritt der Fehler nicht im Quelltext sondern während der> Laufzeit auf.
Noch genauer genommen ist der Fehler keiner, sondern eine
(beabsichtigte) Warnung.
> mehrwertigessignal (höchstwahrscheinlich vom typ std_logic)
Unwahrscheinlich (es gibt kein to_integer für std_logic). Eher signed
oder unsigned...
Markus F. schrieb:>> mehrwertigessignal (höchstwahrscheinlich vom typ std_logic)> Unwahrscheinlich (es gibt kein to_integer für std_logic). Eher signed> oder unsigned...
???
auch unsigned und signed sind vom Typ std_logic, genauer array of
std_ulogic; lediglich ein paar Operatoren sind neu oder anders wie
std_logic_vector definiert. Siehe package code - Auszug
Der Quelltext der lib ist beispeilsweise im Modelsim-Verzeichniss zu
finden, bei Quartus -Lite unter
\intelFPGA\18.0\modelsim_ase\vhdl_src\ieee
Und in der std_logic_arith sollte sich sehr wohl ein to_integer für
std_logic_vector finden lassen:
http://soc.eurecom.fr/EDC/lectures/vhdl/1164pkg.pdf Abschnitt 9.4..
Im Quelltext findet sich auch einen ähnliche Assertion wie vom TO
zitiert, die sogar genauer als der wohl weniger geläufige Begriff
'metavalue' ist:
1
elsiftmp='X'then
2
assertfalse
3
report"CONV_INTEGER: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, and it has been converted to 0."
C. A. Rotwang schrieb:> Und in der std_logic_arith sollte sich sehr wohl ein to_integer für> std_logic_vector finden lassen:
wer redet von std_logic_arith?
Die Meldung kommt doch eindeutig aus numeric_std.to_integer bzw.
numeric_std.to_unsigned.
Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B.
in einem report-Statement):
1
x<=to_integer(<unsigned>...
2
x<=to_unsigned(<natural>,...)
wobei die Argumente nicht oder nicht vollständig initialisiert sind.
Die erste Warnung tritt @0 auf. Die kann man mit der ghdl run option
--ieee-asserts=disable-at-0 unterdrücken. Die zweite würde dann immer
noch kommen - will man die auch weg haben, geht das entweder durch eine
entsprechende Initialisierung im Quelltext oder mit der run option
--ieee-asserts=disable (nicht empfehlenswert, wenn man sich nicht später
nach echten Problemen totsuchen will).
Markus F. schrieb:> wobei die Argumente nicht oder nicht vollständig initialisiert sind.
Nö, fehlendes Init kann , muss aber nicht die Ursache dafür sein, das
signale die mehr Werte als '0' und '1' annehmen können einen wie im
report genannt "Metavalue" annehmen.
Unitialisiert wäre 'U', genauso kann es aber auch 'Z', was aber ein
Initwert ist den man gerne Datenbussen zuweist.
https://www.csee.umbc.edu/portal/help/VHDL/misc.html
Wie bereits gestern geschrieben die Ursache liegt in der Verwendung
mehrwertiger signale, ob nun unsigned, signed, std_logic ist Wurscht.
>Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B.>in einem report-Statement):
1
--snip
2
x<=to_unsigned(<natural>)
Ich seh jetzt nicht, wo bei dieser Umwandlung von natural als subtype
von integer metavalues auftreten können, 'integer' kennt kein
"Unitialized" oder "Unknown".
Markus F. schrieb:> Die erste Warnung tritt @0 auf. Die kann man mit der ghdl run option> --ieee-asserts=disable-at-0 unterdrücken. Die zweite würde dann immer> noch kommen - will man die auch weg haben, geht das entweder durch eine> entsprechende Initialisierung im Quelltext oder mit der run option> --ieee-asserts=disable
Oder man ergänzt den Code mit zusätzlichen to_01()-Funktionen.
Duke
C. A. Rotwang schrieb:>>Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B.>>in einem report-Statement):--snip> x <= to_unsigned(<natural>)>> Ich seh jetzt nicht, wo bei dieser Umwandlung von natural als subtype> von integer metavalues auftreten können, 'integer' kennt kein> "Unitialized" oder "Unknown".
An der Stelle sagt die Warning eindeutig "Vector truncated". Ich dachte,
das wäre klar ...