Forum: FPGA, VHDL & Co. IEEE.STD_LOGIC_ARITH.ALL obsolete


von Dirk (Gast)


Lesenswert?

Hallo,

ich schreibe gerade an meiner Bachelor-Thesis und in diesem zusammenhang 
würde ich gerne in meiner Arbeit darauf hinweisen das 
IEEE.STD_LOGIC_ARITH.ALL obsolet ist. (Schreibt zumindest der gute 
Lothar Miller ;) ) Dafür bräuchte ich natürlich irgendwie eine Quelle. 
Schön wäre da natürlich irgendwas offizielles.

Weiß jemand wo von offizieller Seite her steht, dass die "gerne noch 
verwendeten Quasi-Industrie-Standards der Synopsis-Lib [..] schon 
geraume Zeit obsolete" (Zitat Lothar Miller  :D ) sind?

Vielen Dank
Dirk H.

von Mathi (Gast)


Lesenswert?

Das steht in den Büchern von Peter Ashenden. Und er ist Mitglied in 
diversen IEEE-Gremien betreffend VHDL...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ... das IEEE.STD_LOGIC_ARITH.ALL obsolet ist.
> (Zitat Lothar Miller  :D )
Ein schönes Zitat....
Sagen wir mal so: für mich ist sie obsolote, weil herstellerabhängig und 
doppeldeutig. Mein Anhaltspunkt ist der, dass im Kopf der 
numeric_std.vhd folgendes steht:
-- Copyright 1995 by IEEE. All rights reserved.
Das ist eine vom IEEE genormte Library.

In der std_logic_arith.vhd steht dagegen:
-- Copyright (c) 1990,1991,1992 by Synopsys, Inc.  All rights reserved. 
--

Das allerwichtigste aber ist:
MAN RECHNET NICHT MIT UNEINGESCHRÄNKTEN VEKTOREN.
Denn die std_logic_arith.vhd allein reicht ja nicht aus. Es muß dann 
immer noch dazu gesagt werden, ob mit der Vektorarithmetik signed oder 
unsigned gemeint ist. Siehe dazu z.B. den 
Beitrag "Re: Problem mit FSM"

Und dort findet sich auch der erhobene Zeigefinger ( nicht meiner ;-)
http://www.mikrocontroller.net/articles/Rechnen_in_VHDL#Schlecht:_Direktes_Rechnen_mit_std_logic_vector

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mathi schrieb:
> Das steht in den Büchern von Peter Ashenden.
Bzw. es steht nichts zur std_logic_arith in seinen Büchern ...  :-o

von Duke Scarring (Gast)


Lesenswert?

@Dirk:

Ein Quelle, aber nicht direkt offiziell:
http://www.eda.org/comp.lang.vhdl/FAQ1.html#4.11

Duke

von Dirk (Gast)


Lesenswert?

Hallo,

ich habe jetzt mal etwas zu dem Thema in meiner Thesis geschrieben (ist 
an unserer Hochschule dringend nötig). Was sagt ihr denn dazu?

An dieser Stelle soll darauf hingewiesen werden, dass nur Funktionen aus 
den Bibliotheken IEEE.STD LOGIC 1164 und IEEE.Numeric STD (IEEE 1076.3) 
genutzt werden, was generell zu empfehlen ist. Die häufig verwendeten 
Synopsis Bibliotheken (STD LOGIC ARITH, STD LOGIC UNSIGNED) sollten 
möglichst nicht verwendet werden (siehe [18]), da sie weder
herstellerunabhängig sind, noch der strengen Normung einer 
internationalen Organisation unterliegen. Außerdem geht aus einer 
Berechnung selbst nicht das tatsächlich resultierende Bitmuster hervor, 
da es je nach eingebundener Bibliothek (signed oder unsigend) 
unterschiedlich ist.

Grüße
Dirk H.

von Dirk (Gast)


Lesenswert?

..ich sollte mich Zwecks Editierung mal hier anmelden +duck+..

kleiner Nachtrag: Quelle[18] ist der von Duke gepostete Link 
(http://www.eda.org/comp.lang.vhdl/FAQ1.html#4.11)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ... tatsächlich resultierende Bitmuster hervor ...
Das kannst du bedenkenlos verallgemeinern:
... tatsächlich resultierende Ergebnis hervor ...

Und das letzte ist ist nur ein sein kann   ;-)

von ... (Gast)


Lesenswert?

Von mir aus:
1
LIBRARY IEEE;
2
use IEEE.std_logic_1164.all;
3
--use IEEE.std_logic_unsigned.all;
4
--use IEEE.std_logic_arith.all;
5
use IEEE.NUMERIC_STD.ALL;

von FPGAaaaah (Gast)


Lesenswert?

Also ich habe in meinem VHDL-Code folgende Libraries entfernt:
STD_LOGIC_ARITH
STD_LOGIC_UNSIGNED

und dafür die NUMERIC.STD hinzugefügt und bei der Synthese in icecube2 
(nutzt Synopsis Synthese Tool) gabs eine Fehlermeldung, wegen der 
folgenden Zuweisung:
cnt <= cnt + 1;

cnt ist ein std_logic_vector.

von Lua (Gast)


Lesenswert?

FPGAaaaah schrieb:
> cnt ist ein std_logic_vector.

Genau das ist das Problem.
cnt sollte dann vom typ unsigned (oder signed) sein.

von FPGAaaaah (Gast)


Lesenswert?

Achso. Ja stimmt, sehe ich auch gerade! Danke!

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich hab zu dem Thema mal meine Lieblingszusammenfassung angehaengt. :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hier gibt's das Original und ein paar Worte in Richtung "real":

http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

;-)

: Bearbeitet durch Moderator
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Hier gibt's das Original und ein paar Worte in Richtung "real":
>
> http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html
>
> ;-)

Ahhhh, Danke! :-)

von pittiplatsch (Gast)


Lesenswert?

> http://www.lothar-miller.de/s9y/uploads/Bilder/Usage_of_numeric_std.jpg
----------------------------------------------------------------------^^ 
^

Das kann man so nicht stehen lassen!

von Unbeteiligter (Gast)


Lesenswert?


von Klaus S. (kschleisiek)


Lesenswert?

FPGAaaaah schrieb:
> Also ich habe in meinem VHDL-Code folgende Libraries entfernt:
> STD_LOGIC_ARITH
> STD_LOGIC_UNSIGNED
>
> und dafür die NUMERIC.STD hinzugefügt

Ich habe mich auch zunächst verwirren lassen, dass NUMERIC_STD die 
ultima ratio ist. Bis ich versucht habe, alten Code mit den Synopsys 
Bibliotheken zu portieren. Das will man wirklich nicht. Und dann ist mir 
klar geworden, wie man damit umgehen kann:

Man nimmt primär erstmal SIGNED oder UNSIGNED. Das macht ganz viel 
sinnvolles operator overloading. Diese Bibliotheken fallen aber auf die 
Nase, wenn es irgendwo eine Sequenz gibt, die eigentlich die 
gegenteilige "Polarität" braucht. Dann kommt NUMERIC_STD zu Hilfe, weil 
man sich das dann präzise zusammenbasteln kann - was üblicherweise zu 
langen, schwer lesbaren Zeilen führt - aber es geht ohne weitere 
Verrenkung und das ganz präzise.

Seitdem sehen meine Header so
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_SIGNED.ALL;
4
USE IEEE.NUMERIC_STD.ALL;
oder so aus
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
4
USE IEEE.NUMERIC_STD.ALL;

Fazit: Es ist ziemlich dämlich, die Synopsys-Bibliotheken als veraltet 
zu bezeichnen. Kann ich mir aber für einen Akademiker, der keinen Code 
ans Laufen bringen muss, gut vorstellen ;)

von Gustl B. (-gb-)


Lesenswert?

Die USE IEEE.STD_LOGIC_SIGNED.ALL; und USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
kannst und solltest du auch weglassen. Trotzdem kannst du weiterhin 
unsigned und signed verwenden.

--------------

Aber ich habe auch eine Frage:
VHDL kennt auch ohne Zusatzpackages integer. Gibt es da auch "native" 
Konvertierungsfunktionen und kann man mit denen rechnen? Ohne die 
numeric_std oder sonst was zu nutzen.

von Klaus S. (kschleisiek)


Lesenswert?

Gustl B. schrieb:
> Die USE IEEE.STD_LOGIC_SIGNED.ALL; und USE IEEE.STD_LOGIC_UNSIGNED.ALL;
> kannst und solltest du auch weglassen. Trotzdem kannst du weiterhin
> unsigned und signed verwenden.

Danke für den Hinweis. Das gilt aber nur für zukünftigen Code. Insofern 
ist das "veraltet" wohl doch wahr.

Mein alter Code nutzt aber nur STD_LOGIC_VECTOR - und das auf 
NUMERIC_STD zu portieren - nein, das will man sich nicht antun.

von Gustl B. (-gb-)


Lesenswert?

Klaus S. schrieb:
> Mein alter Code nutzt aber nur STD_LOGIC_VECTOR - und das auf
> NUMERIC_STD zu portieren - nein, das will man sich nicht antun.

Das musst du auch nicht, denn STD_LOGIC_VECTOR wird durch die 
IEEE.STD_LOGIC_1164 abgedeckt. Sollte also problemlos gehen. Du musst 
deinen Code nur umschreiben wenn du direkt mit den std_logic_vectors 
gerechnet hast, dafür hast du nämlich die IEEE.STD_LOGIC_ARITH 
verwendet.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Fazit: Es ist ziemlich dämlich, die Synopsys-Bibliotheken als veraltet
> zu bezeichnen. Kann ich mir aber für einen Akademiker, der keinen Code
> ans Laufen bringen muss, gut vorstellen ;)

Der Punkt ist nicht, dass die veraltet sind und man sie deshalb nicht 
nehmen sollte. Der Punkt ist, dass die nicht ordentlich standartisiert 
sind und man deshalb zwangslaeufig Kompatibilitaetsprobleme bekommt. Ein 
Artikel das der leicht verstaendlich herunterbricht ist hier zufinden:

https://insights.sigasi.com/tech/deprecated-ieee-libraries/

BTW: STD_LOGIC_SIGNED / STD_LOGIC_UNSIGNED und NUMERIC_STD zu mischen, 
ist so ziemlich der unguenstigste Weg den du gehen kannst.

Ich sehe auch nicht wo das Problem in der Verwendung von NUMERIC_STD 
liegt. Viel einfacher kann man mit Signeds, Unsigneds und Integers kaum 
arbeiten. Hast du vielleicht ein paar konkrete Beispiele was dich zu 
diesem Schritt veranlasst? Dann koennen vielleicht ein paar der 
erfahreneren VHDLer hier aus dem Naehkaestchen plaudern was ihre 
Alltagsloesungen sind. :-)

von Duke Scarring (Gast)


Lesenswert?

Klaus S. schrieb:
> Seitdem sehen meine Header soLIBRARY IEEE;
> USE IEEE.STD_LOGIC_1164.ALL;
> USE IEEE.STD_LOGIC_SIGNED.ALL;
> USE IEEE.NUMERIC_STD.ALL;
> oder so ausLIBRARY IEEE;
> USE IEEE.STD_LOGIC_1164.ALL;
> USE IEEE.STD_LOGIC_UNSIGNED.ALL;
> USE IEEE.NUMERIC_STD.ALL;
Da hast Du Dir was tolles ausgedacht! (Achtung, ironisch gemeint!)

Der Spaß geht dann los, wenn mehrere Entwickler am Code arbeiten oder 
vorhandener Code von ehemaligen Entwicklern weitergenutzt werden soll.
Der eine nutzt den slv als signed und in der andere Entwickler in der 
nächsten entity als unsigned. Und manchmal wird auch unsigned genommen, 
obwohl die Werte definitiv signed sind (und umgekehrt).

Deine Submodulsimulation geht problemlos durch den Regressiontest, weil 
die den richtigen Input bekommt. Ob die Gesamtsystemsimulation Fehler 
zeigt, ist ungewiss, da dort z.B. nur ein Bruchteil der Testvektoren 
durchgespielt wird.

Ich habe mal in einem größeren recht DSP-lastigen Projekt die 
Bibliotheken glattgezogen und alle std_logic_signed/std_logic_unsigned 
rausgeschmissen. Dank Versionskontrollsystem und Testbenches war das 
Thema relativ schnell abgehackt.

Duke

von Klaus S. (kschleisiek)


Lesenswert?

Duke Scarring schrieb:
> Der Spaß geht dann los, wenn mehrere Entwickler am Code arbeiten oder
> vorhandener Code von ehemaligen Entwicklern weitergenutzt werden soll.
> Der eine nutzt den slv als signed und in der andere Entwickler in der
> nächsten entity als unsigned.

Vorbemerkung: In meinem Fall ist es glaube ich noch schwieriger. Erstens 
war ich ja zunächst mal Hardwerker mit viel TTL-Erfahrung. Und dann sehr 
misstrauisch, was die Synthesizer (vor 25 Jahren) angeht. Und deshalb 
habe ich zwar VHDL geschrieben, aber mental weiterhin Gates verbaut. Und 
habe dann langsam mit NATURAL und INTEGER rumhantiert bei Countern. Aber 
SIGNED und UNSIGNED habe ich erst vor 3 Jahren wahrgenommen.

Problem: microCore ist ein Stackprozessor mit Forth als Assembler. D.h. 
die Datenleitungen sind stark vernetzt und bleiben selten innerhalb 
einer Entity. Wenn ich also slv durch z.B. unsigned ersetze, dann hat 
das gleich weiterreichende Folgen. Dazu kommt, das manche Datenpfade 
manchmal signed, manchmal unsigned und manchmal wirklich slv sind je 
nachdem, welche Instruktion ausgeführt wird.

Der Code ist hier: 
https://github.com/microCore-VHDL/microCore/tree/master/vhdl
Und ein Struktogramm der Entities auf Seite 4 hier:
https://github.com/microCore-VHDL/microCore/blob/master/documents/uCore.pdf

Ich bin sehr daran interessiert, den Code zu verbessern, weil er 
öffentlich als IP verbreitet wird und deshalb auch ein Vorbild sein 
sollte.

Heute habe ich wieder einmal versucht, STD_LOGIC_SIGNED/_UNSIGNED 
loszuwerden, aber bereits bei dem einfachen Fall von uAdd.vhd wurde es 
so schwierig, dass ich es wieder gelassen habe. Von uCntrl.vhd und 
uCore.vhd will ich gar nicht erst reden.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Heute habe ich wieder einmal versucht, STD_LOGIC_SIGNED/_UNSIGNED
> loszuwerden, aber bereits bei dem einfachen Fall von uAdd.vhd wurde es
> so schwierig, dass ich es wieder gelassen habe. Von uCntrl.vhd und
> uCore.vhd will ich gar nicht erst reden.

Ich hab dir mal nenn PR fuer uAdd.vhd geschickt. Habs allerdings nicht 
getestet.

von Theor (Gast)


Lesenswert?

Klaus S. schrieb:
> [...] microCore ist ein Stackprozessor mit Forth als Assembler.
> [...]

Hi Klaus,
sehr interessant. Danke für den Link.

von Martin S. (strubi)


Lesenswert?

Tobias B. schrieb:
> BTW: STD_LOGIC_SIGNED / STD_LOGIC_UNSIGNED und NUMERIC_STD zu mischen,
> ist so ziemlich der unguenstigste Weg den du gehen kannst.

In der Tat. Das Thema hatten wir schon zigfach...
Das Synopsys-Geraffel ist naemlich von Seiten Xilinx auch schon mal 
anders interpretiert worden, wie der momentane Status ist, will ich gar 
nicht wissen.
Das fuehrte dazu, dass signed extensions, wie sie bei MIPS oder RISC-V 
Alltag sind, unterschiedlich ausgelegt werden.
Oder mal wieder den Klassiker auspacken:
1
resize(unsigned(x), n)

vs
1
unsigned(resize(x, n))

fuer ein signed x

Dukes Kommentar oben ist zudem zu unterschreiben. Wer std_logic_arith 
mit impliziter Konversion nutzt, sorgt irgendwann dafuer, dass der DSP 
falsch rechnet und isim/xsim was anderes ausspuckt als der 
'Gold-Standard' GHDL.
Leider, leider muss man trotzdem ab und an noch fuer eine Menge 
Legacy-Murks (auch noch vom Platzhirsch X, der sich nicht an den 
Standard haelt) die -ieee-synopsys-Flags aktivieren.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Leider, leider muss man trotzdem ab und an noch fuer eine Menge
> Legacy-Murks (auch noch vom Platzhirsch X, der sich nicht an den
> Standard haelt) die -ieee-synopsys-Flags aktivieren.

Das ist leider wahr. Aber Xilinx "loest" das Problem, indem sie die 
neuen Cores praktisch nur noch in Verilog ausliefern. Zum Kotzen.

Ich muss gestehen: Seit ich GHDL fuer Regression Tests einsetze, wird 
auch oefters mal auf ein Verilog-only Xilinx Core verzichtet, sofern es 
die Komplexitaet zulaesst den in endlicher Zeit selbst zu entwickeln. 
Und ganz cool finde ich da die Kunden, welche bereit sind die 
Entwicklung zu bezahlen, aber sich nicht davor straeuben die Cores frei 
zu machen.

Das wird Xilinx zwar herzlich wenig jucken, aber es ist Balsam fuer die 
Seele. :-D

von Klaus S. (kschleisiek)


Lesenswert?

Tobias B. schrieb:
> Ich hab dir mal nenn Pull Request fuer uAdd.vhd geschickt.

Hier mal etwas gekürzt der Originalcode:
1
...
2
USE IEEE.STD_LOGIC_unsigned.ALL;
3
4
ENTITY uAdd IS PORT (
5
   cin      : IN  STD_LOGIC;
6
   ladd_x   : IN  STD_LOGIC_VECTOR(data_width   DOWNTO 0);
7
   ladd_y   : IN  STD_LOGIC_VECTOR(data_width   DOWNTO 0);
8
   ladd_out : OUT STD_LOGIC_VECTOR(data_width+1 DOWNTO 0)
9
); END uAdd;
10
11
ARCHITECTURE inference OF uAdd IS
12
BEGIN
13
14
ladd_out <= ('0' & ladd_x) + ('0' & ladd_y) + cin;
15
16
END inference;
Und hier der von Tobias überarbeitete Code:
1
...
2
USE IEEE.numeric_std.ALL;
3
4
ENTITY uAdd IS PORT (
5
   cin      : IN  STD_LOGIC;
6
   ladd_x   : IN  STD_LOGIC_VECTOR(data_width   DOWNTO 0);
7
   ladd_y   : IN  STD_LOGIC_VECTOR(data_width   DOWNTO 0);
8
   ladd_out : OUT STD_LOGIC_VECTOR(data_width+1 DOWNTO 0)
9
); END uAdd;
10
11
ARCHITECTURE inference OF uAdd IS
12
13
SIGNAL add_ladd_x : unsigned(ladd_out'range);
14
SIGNAL add_ladd_y : unsigned(ladd_out'range);
15
16
BEGIN
17
18
add_ladd_x <= resize(unsigned(ladd_x), add_ladd_x'length);
19
add_ladd_y <= resize(unsigned(ladd_y), add_ladd_y'length);
20
21
ladd_out <= std_logic_vector(add_ladd_x + add_ladd_y + cin);
22
23
END inference;
Hmtja. Das ist dann zwar standardisierter Code, aber ich finde ihn 
umständlich und schlecht lesbar. Auf die Lösung war ich auch schon 
gekommen und hatte sie als "too cumbersome" verworfen.

Wenn es aber tatsächlich stimmt, dass mit der Originalversion 
verschiedene Synthesizer und P&Rs abweichende Resultate erzeugen, dann 
muss es halt sein. Ich habe bisher immer mit Synplify gearbeitet und der 
Code lief schon auf Lattice XP2, Actel A3PE, Altera CycloneII, Xilinx 
XC2S und in allen Fällen hatte sich microCore bei mir gemeldet und brav 
seinen coretest.fs absolviert.

: Bearbeitet durch User
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Ich finde das ehrlich gesagt garnicht unnoetig kompiliziert. Die ersten 
beiden Zeilen bereiten deine Signale darauf vor, dass du die 
Vektorbreite vergroesserst, um das mit dem Ueberlauf in Griff zu 
bekommen und die dritte ist dann ein Einzeiler fuer die Addition.

Du kannst das auch alles in eine Zeile packen, wie es im urspruenglichen 
Code war und fleissig casten. Spaetestens wenn du uAdd auf signed 
umstellen magst, wirst aber sehen, warum der weg mit den resize 
Funktionen aeussert wichtig ist. ;-)

Das ist leider auch ein bisschen die Krux beim FPGA entwickeln. Den 
reinen Hardware Leuten fehlen die Konzepte/Patterns aus der Software und 
bei den Software Leuten ist es umgekehrt. Deshalb wuerde ich oefters mal 
in Open Source Projekten nachschauen, was die so machen und sich 
inspirieren lassen.

Allgemein sieht man an dem Projekt, dass der Code extrem altbacken ist 
und viele Features von VHDL garnicht genutzt werden um den Code klar 
lesbar und elegant zu halten. Ein ordentliches Refactoring ist da 
wirklich zu empfehlen (vorausgesetzt es steht eine Regression Pipeline), 
ist ja zum Glueck jetzt nicht soooo maechtig, dass einen das erschlaegt 
alles.

: Bearbeitet durch User
von Klaus S. (kschleisiek)


Lesenswert?

Tobias B. schrieb:
> Ich finde das ehrlich gesagt garnicht unnoetig kompiliziert.

Es ist leider kompliziert, aber noch leiderer nicht unnötig. Ich finde 
den alten Code einfacher zu lesen. Sind ja auch weniger Zeilen. Und 
solange ich hier keinen Erfahrungsbericht sehe, WARUM und WO der Code 
durch Nutzung von STD_LOGIC_SIGNED.ALL von manchen Synthesizern 
fehlinterpretiert wird, werde ich das beibehalten.

> Du kannst das auch alles in eine Zeile packen, wie es im urspruenglichen
> Code war und fleissig casten.

Das wird dann vollends unleserlich. Die zwischengeschaltete 
Faktorisierung finde ich da schon sinnvoll.

> Spaetestens wenn du uAdd auf signed
> umstellen magst, wirst aber sehen, warum der weg mit den resize
> Funktionen aeussert wichtig ist. ;-)

Es ist schon ein signed als auch ein unsigned Addierer. Das hängt nur 
von der Interpretation durch die Software ab (in Forth gibt es dafür < 
und u< für den Größenvergleich). Und statt des resize finde ich, dass es 
('0' & ladd_x) völlig klar macht, das hier im Grunde eine unsigned 
Addition stattfindet. Aber wenn man die oberste (Carry) Stelle weglässt, 
ist der Rest eine klassische 2er-Komplement Addition.

> Allgemein sieht man an dem Projekt, dass der Code extrem altbacken ist.

Ja, ich habe mich viele Jahre lang auf VHDL-93 eingeschränkt, bis ich 
vor kurzem gemerkt habe, dass ich mir dadurch das Leben unnötig schwer 
mache. Ich hatte den Synthesizern nicht getraut, die vor 25 Jahren noch 
wirklich lustige Fehler produzierten.

> Ein ordentliches Refactoring ist da
> wirklich zu empfehlen (vorausgesetzt es steht eine Regression Pipeline).

Das Factoring stimmt schon, da bin ich durch Forth bestens trainiert. 
Aber was zum Teufel ist eine "Regression Pipeline"?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Und solange ich hier keinen Erfahrungsbericht sehe, WARUM und WO der
> Code durch Nutzung von STD_LOGIC_SIGNED.ALL von manchen Synthesizern
> fehlinterpretiert wird, werde ich das beibehalten.
Sieh dir den Beitrag "std_logic_vector auf integer umwandeln" oder 
den Beitrag "Änderung des Gehäuses erzeugt Compilation Fehler" oder den 
Beitrag "Re: vector mit 0 initalisieren" an.
Da gibts noch mehr derartige Threads, aber inzwischen gewöhnen sich die 
Professoren die numeric_std an, so dass nicht mehr jedes Semester ein 
paar Studenten mit ähnlichen Problemen hier aufschlagen.

> Es ist schon ein signed als auch ein unsigned Addierer.
Dann ist im Prinzip die simple Erweiterung vorne mit '0' aber falsch.
Korrekt müsste das bei dir dann so aussehen:
1
ladd_out <= (ladd_x(data_width) & ladd_x) + (ladd_x(data_width) & ladd_y) + cin;

> statt des resize finde ich, dass es ('0' & ladd_x) völlig klar macht
Wenn du unbedingt die numeric_std und deren Werkzeuge nicht verwenden 
willst, dann verwende sie einfach nicht. Du musst nicht krampfhaft nach 
Ausreden suchen, warum du das gut findest.

> statt des resize finde ich, dass es ('0' & ladd_x) völlig klar macht
Und zudem wesentlich weniger Codezeilen braucht...
Aber dann musst du dir auch die Frage stellen, warum da ein Addierer 
überhaupt in ein eigenes Modul gesteckt wird, wenn dann nur 1 Zeile die 
Arbeit verrichtet? Die eine Zeile hätte sicher noch eine Ebene höher 
Platz gefunden.

: Bearbeitet durch Moderator
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Es ist leider kompliziert, aber noch leiderer nicht unnötig. Ich finde
> den alten Code einfacher zu lesen. Sind ja auch weniger Zeilen. Und
> solange ich hier keinen Erfahrungsbericht sehe, WARUM und WO der Code
> durch Nutzung von STD_LOGIC_SIGNED.ALL von manchen Synthesizern
> fehlinterpretiert wird, werde ich das beibehalten.

Damit tust du deinem Projekt halt mal so richtig keinen Gefallen. 
Schliesslich willst du doch sicherstellen, dass das ganze mit moeglichst 
vielen Toolchains kompatibel ist.

Ein weiteres Problem koenntest du haben, wenn Leute ein Code Review 
machen um zu entscheiden ob der IP Core den eigenen Qualitaetstandards 
genuegt. Ich spreche da mal aus der Medizintechnik, in der man Cores 
ohne Probleme als SOUPs einsetzen kann (auch in Klasse C), man 
allerdings bewerten soll ob die gewuenschte SOUP den 
Qualitaetsanspruechen genuegt. Wenn ich jetzt eine solche atrix 
aufstellen muesste zu Qualitaetsbewertung, dann waere da sehr 
wahrscheinlich ein Punkt mit drin, dass die Verwendung von obsoleten 
Bibliotheken vermieden wird.

Die ehtliche Frage die du dir vll. auch stellen musst: Ist es wirklich 
kompliziert oder ist es einfach nur eine Gewoehnungsfrage? Die FPGA 
Fraktion ist da bekannt dafuer (zumindets habe ich es in meinem 
Berufsleben bisher so kennengelernt), da stur veralteten Pragmatismen zu 
folgen (was sicher auch der Vergangenheit und dem schlechten Support des 
VHDL Sprachumfans in den Entwicklungstools geschuldet ist).

Aber ich will da jetzt auch nicht allzuviel kritisieren. Dein Core - 
dein Bier. ;-)

Tobias B. schrieb:
> Spricht auch stark dafuer, dass der Core nicht via Regressiontests
> validiert wird. Spaetestens da haette es auffallen muessen.

Das sind einfach nur Regression Tests. Das Wort Pipeline hat sich in 
meiem Sprachschatz eingebuergert, weil ich das ganze praktisch nurnoch 
via Gitlab CI laufen lasse. Das ist aber sicher nicht allgemeiner 
Sprachschatz, daher sorry fuer die Verwirrung.

Lothar M. schrieb:
>> Es ist schon ein signed als auch ein unsigned Addierer.
> Dann ist im Prinzip die simple Erweiterung vorne mit '0' aber falsch.
> Korrekt müsste das bei dir dann so aussehen:

Genau das hatte ich gemeint, mit meiner obigen Aussage, dass er 
spaetestens beim Umstieg auf signeds froh sein wird die resize Funktion 
zu verwenden.

Spricht auch stark dafuer, dass der Core nicht via Regressiontests 
validiert wird. Spaetestens da haette es auffallen muessen.

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

Tobias B. schrieb:
> Wenn ich jetzt eine solche atrix
> aufstellen muesste zu Qualitaetsbewertung, dann waere da sehr
> wahrscheinlich ein Punkt mit drin, dass die Verwendung von obsoleten
> Bibliotheken vermieden wird.

Das ist eigentlich das erste, was mein 'DRC' bei third party Cores 
macht. Wenn ich mich recht entsinne, haben auch schon Leute an 
entsprechenden Language-Server-Plugins (auf Basis von GHDL) gebastelt, 
damit das gleich in der IDE angemahnt wird.

Der Gag an 'korrektem' VHDL ist ja grade, dass explizit dasteht, was 
gemacht wird. Die paar Keywords mehr sind wirklich Gewohnheitsfrage, wie 
man sich bei Verilog halt merken muss, wie die impliziten 
Konversionsregeln sind (auch da gibt's haessliche Szenarien). Wenn die 
Geschwaetzigkeit nervt, schreibt man sich halt eine Funktion.

Das Problem ist bei einer geschlossen verifizierten CPU, die keine 
signed extension macht, ev. nicht so kritisch, aber bei einer 
komplexeren DSP-Pipe, die allenfalls noch per C++-HLS generiert wird, 
eben schon. Da muss man u.U. jede einzelne Stage (formal) verifizieren, 
sonst wird die Fehlersuche spaeter richtig lustig. Da es kaum ein Tool 
geben duerfte, was das automatisch erledigt, ist das traurige Fazit in 
der Tat oft: Reimplementieren (aber nicht in V*).

Klaus S. schrieb:
> Und
> solange ich hier keinen Erfahrungsbericht sehe, WARUM und WO der Code
> durch Nutzung von STD_LOGIC_SIGNED.ALL von manchen Synthesizern
> fehlinterpretiert wird, werde ich das beibehalten.

Ich fuerchte, es laeuft anders: Wenn du fuer einen weiteren Core um 
Akzeptanz wirbst, musst du einem gewissen Erwartungshorizont genuegen, 
sonst gucken sich gebrannte HDL-Kinder das schlicht nicht an, auch wenn 
die besten Alleinstellungsmerkmale vorliegen sollten.
Die Erfahrungsberichte sind nunmehr hier von ca. 2005-2008, vielleicht 
findest du in den Xilinx-Foren noch ein paar ungeloeschte Rants betr. 
floating_point cores (nicht standardkonformes Coregen-Obfuskat, muss so 
ISE v12 gewesen sein). Die Synthese lieferte das 'richtige' Ergebnis, 
die Verifikation per GHDL sagt: Mismatch (inkorrektes Design). Aber 
Totschweigen ist Trumpf...deswegen klebt wohl dieser resize-Bug auch bis 
heute noch im 'upstream' VHDL-Konverter von MyHDL fest.

Kann sein, dass das heutzutage alles korrekt laeuft und xsim es jetzt 
auch richtig macht, aber eben: Gebranntes Kind sagt: Never ever again.

von Klaus S. (kschleisiek)


Lesenswert?

Lothar M. schrieb:
> Sieh dir den Beitrag "std_logic_vector auf integer umwandeln" oder
> den Beitrag "Änderung des Gehäuses erzeugt Compilation Fehler" oder den
> Beitrag "Re: vector mit 0 initalisieren" an.

Danke! Damit ist der Fall klar: Verschiedene Entwicklungssysteme/Parser 
verarbeiten die Bibliotheken unterschiedlich. Und ich hatte geglaubt, 
dass die in der Reihenfolge, in der sie hingeschrieben sind, durchsucht 
werden bis zum ersten passenden Match. Offenbar nicht immer. Mit 
Synplify und ModelSim hatte ich da keine Schwierigkeiten.

Seufz, ich werde meinen gesamten Code überarbeiten und nur noch NUMERIC 
benutzen.

Und herzlichen Dank an Tobias, Lothar und Martin für eure Geduld, es mir 
beizubiegen.

>> statt des resize finde ich, dass es ('0' & ladd_x) völlig klar macht.
> Dann ist im Prinzip die simple Erweiterung vorne mit '0' aber falsch.
> Korrekt müsste das bei dir dann so aussehen:
>
1
> ladd_out <= (ladd_x(data_width) & ladd_x) + (ladd_x(data_width) & 
2
> ladd_y) + cin;
3
>
Neinein, das war schon richtig. Diese angeklebten '0'en sind für die 
Ermittlung des Divisions-carrys im Prozessor nötig. Dafür findet sich 
später in uCntrl.vhd:
1
ALIAS add_sign        : STD_LOGIC IS ladd_out(data_width-1);
2
ALIAS add_carry       : STD_LOGIC IS ladd_out(data_width  );
3
ALIAS div_sign        : STD_LOGIC IS ladd_out(data_width  );
4
ALIAS div_carry       : STD_LOGIC IS ladd_out(data_width+1);
Und diese unsigned-Erweiterung mit einem resize zu erzeugen, ist auch 
ok. Da wird aber niemlas etwas auf "signed" umgestellt, wenn ich nämlich 
nur die Bits ladd_out(data_width-1 DOWNTO 0) nehme, dann rechnet das 
korrekt sowohl signed als auch unsigned - es hängt lediglich von der 
Interpretation durch die Software und die Nutzung von Carry und Overflow 
ab. In Forth gibt es dafür z.B. zwei Vergleichsoperatoren: < hantiert 
mit signed, u< mit unsigned Operanden, die sich auf dem völlig typfreien 
Stack befinden.

> Aber dann musst du dir auch die Frage stellen, warum da ein Addierer
> überhaupt in ein eigenes Modul gesteckt wird, wenn dann nur 1 Zeile die
> Arbeit verrichtet? Die eine Zeile hätte sicher noch eine Ebene höher
> Platz gefunden.

Das hat den Grund, dass ich die höhere Ebene (uCntrl.vhd) invariant 
halten will gegenüber projektspezifischen Bedingungen. uAdd.vhd habe ich 
eingeführt, als ich eine 32-bit Version von microCore auf Actel A3PE 
implementiert habe. Der Addierer, den Synplify inferenziert hatte, war 
der Bottleneck in der Timinganalyse, und ich musste mir eine schneller 
IP für den Addierer zusammenklicken.

Tobias B. schrieb:
> Die ehtliche Frage die du dir vll. auch stellen musst: Ist es wirklich
> kompliziert oder ist es einfach nur eine Gewoehnungsfrage?

Ich finde es nicht kompliziert, ich finde es geschwätzig. Insofern eine 
Gewöhnungsfrage. Aber VHDL ist sowieso eine Sprache für 10-Finger 
Blindtipper ;)

> Spricht auch stark dafuer, dass der Core nicht via Regressiontests
> validiert wird. Spaetestens da haette es auffallen muessen.

Der Regressionstest für microCore findet sowohl in Simulation als auch 
Real mit dem Programm coretest.fs statt. Da fällt entweder eine 
Fehlernummer heraus, oder ein ok. Und in der Simulation wird ein Bit des 
Ctrl Registers gesetzt, wenn alles ok ist. Dafür müssen bei langsamer 
Technologie (A3PE) 300 usec simuliert werden.

: Bearbeitet durch User
von udok (Gast)


Lesenswert?

Klaus S. schrieb:
>> Ich finde das ehrlich gesagt garnicht unnoetig kompiliziert.
>
> Es ist leider kompliziert, aber noch leiderer nicht unnötig. Ich finde
> den alten Code einfacher zu lesen. Sind ja auch weniger Zeilen. Und
> solange ich hier keinen Erfahrungsbericht sehe, WARUM und WO der Code
> durch Nutzung von STD_LOGIC_SIGNED.ALL von manchen Synthesizern
> fehlinterpretiert wird, werde ich das beibehalten.

Dem schliesse ich mich 100% an.
Ich verwende lieber die Synopsys Libs, als die numeric_std.
Meiner Meinung nach ist der Code damit kompakter und besser lesbarer.

Auf Asic Ebene gibt es praktisch nur Synopsys, und alle
FPGA Toolchains verwenden meines Wissens intern Synopsys.

von Christoph Z. (christophz)


Lesenswert?

udok schrieb:
> Auf Asic Ebene gibt es praktisch nur Synopsys,
Das sollte heissen: Auf Asic Ebene gibt es praktisch nur Synopsys, 
Cadence und Mentor

> und alle FPGA Toolchains verwenden meines Wissens intern Synopsys.

Das sollte heissen: und fast alle FPGA Toolchains können Synopsys 
verwenden wenn man eine Lizenz hat. Xilinx, Intel und NanoXplore nutzen 
intern eigene Synthesizer, Quicklogic nutzt Yosys, Lattice und Microchip 
nutzen Synopsys.

Was Achronix und Effinix nutzen müsste ich jetzt noch herausfinden.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Das ist eigentlich das erste, was mein 'DRC' bei third party Cores
> macht. Wenn ich mich recht entsinne, haben auch schon Leute an
> entsprechenden Language-Server-Plugins (auf Basis von GHDL) gebastelt,
> damit das gleich in der IDE angemahnt wird.

Ah stark. Ist der offen? Falls ja, waere es (oder ist es schon) eine 
Option daraus ein Code Climate Image zu machen? Auch mit Hinblick 
richtung Gitlab. ;-)

Klaus S. schrieb:
> Seufz, ich werde meinen gesamten Code überarbeiten und nur noch NUMERIC
> benutzen.
>
> Und herzlichen Dank an Tobias, Lothar und Martin für eure Geduld, es mir
> beizubiegen.

Gern geschehen und immer wieder. :-)

Vielleicht ist es auch nicht allzuviel Arbeit. Ist ja alles offen, vll 
bekommst du ja ein paar PRs. Doch davor wuerde ich unbedingt empfehlen 
einen modernen Style und Design Guide anzulegen. Und falls deine 
Regression Tests nicht automatisiert ablaufen, das noch zu 
automatisieren.

Klaus S. schrieb:
> Neinein, das war schon richtig. Diese angeklebten '0'en sind für die
> Ermittlung des Divisions-carrys im Prozessor nötig. Dafür findet sich
> später in uCntrl.vhd:ALIAS add_sign        : STD_LOGIC IS
> ladd_out(data_width-1);
> ALIAS add_carry       : STD_LOGIC IS ladd_out(data_width  );
> ALIAS div_sign        : STD_LOGIC IS ladd_out(data_width  );
> ALIAS div_carry       : STD_LOGIC IS ladd_out(data_width+1);
> Und diese unsigned-Erweiterung mit einem resize zu erzeugen, ist auch
> ok.

Dann ist mein Vorschlag aber evtl. nicht wirklich gut. Dann empfiehlt es 
sich dann, einen speziellen Satz Funktionen zu entwickeln, der genau auf 
diese Eigenheiten des Prozessors zurechtgeschnitten ist. Sonst musst du 
falls du einen Bug findest oder was anderes abaendern moechtest wieder 
den kompletten Code durchforsten und anpassen.

Klaus S. schrieb:
> Ich finde es nicht kompliziert, ich finde es geschwätzig. Insofern eine
> Gewöhnungsfrage. Aber VHDL ist sowieso eine Sprache für 10-Finger
> Blindtipper ;)

Daran gewoehnt man sich, bzw. kann einem mit der richtigen IDE einiges 
abgenommen werden. Ich bevorzuge Sigasi, viele anderen Emacs. Da gibts 
glaube ich auch schon ein paar tolle Beitraege hier im Forum.

Klaus S. schrieb:
> Der Regressionstest für microCore findet sowohl in Simulation als auch
> Real mit dem Programm coretest.fs statt. Da fällt entweder eine
> Fehlernummer heraus, oder ein ok. Und in der Simulation wird ein Bit des
> Ctrl Registers gesetzt, wenn alles ok ist. Dafür müssen bei langsamer
> Technologie (A3PE) 300 usec simuliert werden.

Fuer die Simulation wuerde ich dir noch empfehlen, diese zu 
automatisieren. Ich nimm dafuer gerne VUnit und GHDL in einem Docker 
Container, das ist auch am Anfang einer "CI" Karriere noch ueberschaubar 
simpel. Strubi kennt da noch ein paar modernere Konzepte, hat er hier 
auch mal irgendwo vorgestellt. :-)

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

udok schrieb:
> Auf Asic Ebene gibt es praktisch nur Synopsys, und alle
> FPGA Toolchains verwenden meines Wissens intern Synopsys.

Auch wenn dem so waere: Kein Grund 'broken by design' zu verwenden.
Die Syn*-Tools klammern ja die korrekte Umsetzung von numeric_std nicht 
aus.

Christoph Z. schrieb:
> Lattice und Microchip
> nutzen Synopsys.

Bei Lattice kann man zwischen Synplify und der hauseigenen LSE waehlen.
Und fuer [ECP5, ICE40] kommt yosys dazu.

von Martin S. (strubi)


Lesenswert?

Tobias B. schrieb:
> Ah stark. Ist der offen? Falls ja, waere es (oder ist es schon) eine
> Option daraus ein Code Climate Image zu machen? Auch mit Hinblick
> richtung Gitlab. ;-)

Code Climate hab ich keine Erfahrung mit. Der Check laeuft noch ueber 
XML-output der Analyse von GHDL im Browser, Beispielausgabe: 
https://hackfin.gitlab.io/xhdl/# (kannste eigene XML-Files draufziehen).
Fuer jeden DRC-Geschmack gibt's ein entsprechendes Style-Sheet. Da die 
XML-Ausgabe aber moeglicherweise irgendwann verwaist, ist der neue 
Schrei das Language-Server-Interface (pyghdl), musste mal den 
gitter-Chat des GHDL-Projekts durchsuchen.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Der Check laeuft noch ueber
> XML-output der Analyse von GHDL im Browser, Beispielausgabe:
> https://hackfin.gitlab.io/xhdl/# (kannste eigene XML-Files draufziehen).
> Fuer jeden DRC-Geschmack gibt's ein entsprechendes Style-Sheet. Da die
> XML-Ausgabe aber moeglicherweise irgendwann verwaist, ist der neue
> Schrei das Language-Server-Interface (pyghdl), musste mal den
> gitter-Chat des GHDL-Projekts durchsuchen.

Super, vielen Dank. Mal schauen was es da alles zu entdecken gibt. Das 
GHDL diesen --file-to-xml Switch hat wusste ich garnicht. Da tun sich 
ploetzlich ja ganz neue Moeglichkeiten auf. :-D

: Bearbeitet durch User
Beitrag #6608691 wurde vom Autor gelöscht.
von Klaus S. (kschleisiek)


Lesenswert?

Tobias B. schrieb:
> Vielleicht ist es auch nicht allzuviel Arbeit. Ist ja alles offen, vll
> bekommst du ja ein paar PRs. Doch davor wuerde ich unbedingt empfehlen
> einen modernen Style und Design Guide anzulegen. Und falls deine
> Regression Tests nicht automatisiert ablaufen, das noch zu
> automatisieren.

<schweißabwisch>. So, nach ca. 15 Std. Arbeit sind alle 
Synopsislibraries weg, nur noch 1164 und NUMERIC_STD sind übrig - und es 
funktioniert sogar noch. Für zukünftige solcher Übungen empfehle ich 
folgende Strategie:

1. Überall die Libraries auf 1164 und NUMERIC_STD umstellen.
2. Alles, was Adressen sind, von STD_LOGIC_VECTOR auf UNSIGNED ändern.
3. Dann im Simulator compilieren. Das produziert vieleviele 
Fehlermeldungen, die man in der Compilationsreihenfolge der vhd-Files 
einzeln "austreten" und mit UNSIGNED, to_UNSIGNED, SIGNED, to_UNSIGNED, 
to_INTEGER, STD_LOGIC_VECTOR und RESIZE verzieren kann.

Mich beschleicht der Verdacht, dass es sinnvoll ist, sämtliche 
STD_LOGIC_VECTOR Signale in UNSIGNED umzuändern. Das wird wahrscheinlich 
weniger verstreute Casts und Konvertierungen erfordern.

Gibt's da bereits Erfahrungen?

An den Tests arbeite ich noch, dass das eine einzige Testsuite wird, die 
im Batch abläuft. Die Schwierigkeit, zu der ich noch keine Lösung kenne: 
Für einzelne Tests des Debug-Interface (reines VHDL), muss der 
Programmspeicher immer wieder mit unterschiedlichen Programmen 
initialisiert werden. Das mache ich bisher so, dass ich mit jedem 
Programmwechsel den Simulator neu starte, so dass der Programmspeicher 
immer wieder neu initialisiert wird. Wenn ich das aber im Batch ablaufen 
lasse, starte ich nicht neu - das könnte ich wahrscheinlich auf der 
TCL-Eben erledigen, aber dann funktioniert es nur für ModelSim. ????

von Martin S. (strubi)


Lesenswert?

Klaus S. schrieb:
> Mich beschleicht der Verdacht, dass es sinnvoll ist, sämtliche
> STD_LOGIC_VECTOR Signale in UNSIGNED umzuändern. Das wird wahrscheinlich
> weniger verstreute Casts und Konvertierungen erfordern.
>
> Gibt's da bereits Erfahrungen?

Sinnvoll: Dort wo man in der CPU eine n-bit-Zahl nutzt, macht `unsigned` 
einfach weniger Stress, siehe auch 
http://www.jandecaluwe.com/hdldesign/counting.html

Erfahrungen: Was GHDL angeht, laufen `unsigned`-Signale etwas flotter 
und entsprechend memory-sparender in der Simulation, trotzdem bekommst 
du eine Warnung falls uninitialisierte Werte (std_logic: 'U') einen 
undefinierten Wert bei einer Operation erzeugen sollten ('X').

Klaus S. schrieb:
> An den Tests arbeite ich noch, dass das eine einzige Testsuite wird, die
> im Batch abläuft. Die Schwierigkeit, zu der ich noch keine Lösung kenne:
> Für einzelne Tests des Debug-Interface (reines VHDL), muss der
> Programmspeicher immer wieder mit unterschiedlichen Programmen
> initialisiert werden

State of the Art: In Circuit Emulation. Damit loesen sich eine Menge 
Szenarien elegant auf und das Debugging/Testing ist minimal-invasiv.
Im Grunde genommen lasse ich alle Verifikationstests nur noch ueber 
(virtualisierte) JTAG/TAP Interfaces oder RAM mit Software-Hintertuer 
laufen, fuer RISC-V laeuft das auch in der Cloud via GHDL/ghdlex, kann 
bei Interesse mehr Pointer liefern (alles OpenSource).
Der Gag ist dann, wenn's in die harte Verifikation mit unzaehligen 
Testvektoren geht, dass derselbe Lock-Step-Test fuer Simulation wie auch 
fuer die HW-Implementierung nutzbar ist.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> <schweißabwisch>. So, nach ca. 15 Std. Arbeit sind alle
> Synopsislibraries weg, nur noch 1164 und NUMERIC_STD sind übrig - und es
> funktioniert sogar noch. Für zukünftige solcher Übungen empfehle ich
> folgende Strategie:

Respekt! Du wirst es nicht bereuen. :-)

Klaus S. schrieb:
> Gibt's da bereits Erfahrungen?
>
> An den Tests arbeite ich noch, dass das eine einzige Testsuite wird, die
> im Batch abläuft. Die Schwierigkeit, zu der ich noch keine Lösung kenne:
> Für einzelne Tests des Debug-Interface (reines VHDL), muss der
> Programmspeicher immer wieder mit unterschiedlichen Programmen
> initialisiert werden. Das mache ich bisher so, dass ich mit jedem
> Programmwechsel den Simulator neu starte, so dass der Programmspeicher
> immer wieder neu initialisiert wird. Wenn ich das aber im Batch ablaufen
> lasse, starte ich nicht neu - das könnte ich wahrscheinlich auf der
> TCL-Eben erledigen, aber dann funktioniert es nur für ModelSim. ????

Schau dir mal VUnit an:

https://vunit.github.io/

Das ist genau das was du brauchst um die Testsuite aufzuziehen.

von Klaus S. (kschleisiek)


Lesenswert?

Klaus S. schrieb:
> Mich beschleicht der Verdacht, dass es sinnvoll ist, sämtliche
> STD_LOGIC_VECTOR Signale in UNSIGNED umzuändern. Das wird wahrscheinlich
> weniger verstreute Casts und Konvertierungen erfordern.

Das hat nochmal 3 Stunden gekostet und zu einer DEUTLICH gesteigerten 
Lesbarkeit geführt :) Viele Verzierungen waren überflüssig geworden. Der 
Lesbarkeit halber habe ich auch noch folgende beiden Funktionen ins 
Package gesteckt:
1
   FUNCTION  u_to_s(v : IN UNSIGNED) RETURN SIGNED IS
2
   BEGIN
3
      RETURN signed(std_logic_vector(v));
4
   END;
5
6
   FUNCTION  s_to_u(v : IN SIGNED)   RETURN UNSIGNED IS
7
   BEGIN
8
      RETURN unsigned(std_logic_vector(v));
9
   END;
Die Namen gefallen mir noch nicht wirklich, aber sonst ist es das Jetzt!

: Bearbeitet durch User
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Wenn du unsigneds nach signeds casten musst, hast du aber ein 
prinzipielles Problem. In welcher Anwendung tritt den so ein Fall auf?

Kleiner Nachtrag:

Die Konvertierung nach std_logic_vector brauchst du nicht. Damit hast du 
eigentlich nichts gewonnen als direkt die signed() und unsigned() 
Funktion zu verwenden.

: Bearbeitet durch User
von Jonas B. (jibi)


Lesenswert?

>Die Konvertierung nach std_logic_vector brauchst du nicht. Damit hast du
>eigentlich nichts gewonnen als direkt die signed() und unsigned()
>Funktion zu verwenden.

Und die Fehlersuche macht es auch nicht gerade einfacher, ohne die X'sen 
und U'sen...

von Klaus S. (kschleisiek)


Lesenswert?

Tobias B. schrieb:
> Wenn du unsigneds nach signeds casten musst, hast du aber ein
> prinzipielles Problem. In welcher Anwendung tritt den so ein Fall auf?

Der Datenstack ist typfrei und als UNSIGNED angelegt. Wenn ich jetzt ein 
"abs" machen will, muss ich das so machen: <stack> <= 
unsigned(abs(signed(<stack>)));

> Die Konvertierung nach std_logic_vector brauchst du nicht. Damit hast du
> eigentlich nichts gewonnen als direkt die signed() und unsigned()
> Funktion zu verwenden.

Wie schön. Diese Wege (signed <-> unsigned) fehlen demnach in Lothar 
Millers Schaubild. Wie ich bisher überhaupt fundierte Erläuterungen zu 
den Funktionen noch nicht gefunden habe. Und da ist der Sourcecode der 
NUMERIC_STD leider auch nicht hilfreich, da tauchen die Casts gar nicht 
drin auf. Wo stecken die denn?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Der Datenstack ist typfrei und als UNSIGNED angelegt. Wenn ich jetzt ein
> "abs" machen will, muss ich das so machen: <stack> <=
> unsigned(abs(signed(<stack>)));

Aber sollte so ein Datenstack nicht aus einem neutralen Datentyp 
bestehen? Rein aus der Modellbetrachtung her, wuerde ich den daher nur 
als std_logic_vector anlegen und erst wenn ich den Daten eine Bedeutung 
zuweise dann den Cast auf den Zieltyp durchfuehren. Aber da stecke ich 
auch nicht genug drin um mir eine vernuenftige Meinung bilden zu 
koennen.

Klaus S. schrieb:
> Und da ist der Sourcecode der
> NUMERIC_STD leider auch nicht hilfreich, da tauchen die Casts gar nicht
> drin auf. Wo stecken die denn?
1
  subtype unsigned is (resolved) unresolved_unsigned;
2
  subtype signed is (resolved) unresolved_signed;

Zeile 81 und 82. Das sind Casts wie sie VHDL bereitstellt und keine 
Funktion!

Leg dir am besten mal das Buch "The Designer's Guide to VHDL" von Peter 
Ashenden zu. Das ist sowas wie die Referenz Bibel zum Thema VHDL. Die 
dritte Auflage ist die aktuellste.

von Christoph Z. (christophz)


Lesenswert?

Tobias B. schrieb:
> Schau dir mal VUnit an:
>
> https://vunit.github.io/
>
> Das ist genau das was du brauchst um die Testsuite aufzuziehen.

Jepp, das wäre auch mein Vorschlag gewesen. Wir machen noch nicht viel 
damit, aber hat sich auch jetzt schon ausgezahlt.

Dann kann Klaus auch endlich den Multicore Prozessor in seinem PC nutzen 
und diese Simulationen mit unterschiedlichem Programmspeicher parallel 
ausführen lassen (Pro Instanz eine Modelsim Lizenz nötig und sonst GHDL) 
:-)

von Klaus S. (kschleisiek)


Lesenswert?

Tobias B. schrieb:
> Aber sollte so ein Datenstack nicht aus einem neutralen Datentyp
> bestehen? Rein aus der Modellbetrachtung her, wuerde ich den daher nur
> als std_logic_vector anlegen und erst wenn ich den Daten eine Bedeutung
> zuweise dann den Cast auf den Zieltyp durchfuehren.

Nein, nix STD_LOGIC_VECTOR. Würde ich als überflüssig bezeichnen. Warum? 
Da müssen wir die Binärarithmetik betrachten. Egal, ob signed oder 
unsigned, in beiden Fällen ist der Addierer identisch. Der Unterschied 
ist nur, wie das oberste Bit interpretiert wird. Bei UNSIGNED als Beginn 
der höheren Zahlenraumhälfte, bei SIGNED als negative Zahlenraumhälfte.

Unterschiede gibt es nur wenige. Beim Rechtsshiften haben wir 
arithmetischen und logischen Shift, und das RESIZE und der Vergleich (<, 
>) sind sehr unterschiedlich. Und einen Überlauf detektiert man bei 
unsigned mit Carry, bei signed mit Overflow. Das war's aber wohl schon.

Insofern ist es sinnvoll, UNSIGNED statt STD_LOGIC_VECTOR zu nutzen, 
weil die sich bei der Logik identisch verhalten. Darüberhinaus 
beherrschaft UNSIGNED aber auch die Arithmetik mit natürlichen Zahlen, 
so dass man im Endeffekt viel weniger Casten muss. Ich sehe das ja jetzt 
an microCore. Da musste ich jetzt ähnlich selten Casten, wie früher bei 
altbackener Nutzung von STD_LOGIC_VECTOR unter STD_LOGIC_UNSIGNED.ALL.

von Klaus S. (kschleisiek)


Lesenswert?

Jonas B. schrieb:
> Und die Fehlersuche macht es auch nicht gerade einfacher, ohne die X'sen
> und U'sen...

Puh, das hat mir reichlich Adrenalin verschafft. Aber nein, so ist es 
nicht, auch UNSIGNED und SIGNED werden mit 'U' (un-initialized) und 'X' 
(ungültiges Ergebnis) markiert. INTEGER und NATURAL werden mit 0 
initialisiert.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Klaus S. schrieb:
> Nein, nix STD_LOGIC_VECTOR. Würde ich als überflüssig bezeichnen. Warum?
> Da müssen wir die Binärarithmetik betrachten. Egal, ob signed oder
> unsigned, in beiden Fällen ist der Addierer identisch. Der Unterschied
> ist nur, wie das oberste Bit interpretiert wird. Bei UNSIGNED als Beginn
> der höheren Zahlenraumhälfte, bei SIGNED als negative Zahlenraumhälfte.

Ok alles klar.

Ich bin auch noch davon ausgegangen dass die Daten im Datenspeicher 
komplett generisch sind und nicht unbedingt als Zahl nterpretiert werden 
muessen, z.B. ASCII Chars oder aehnliches.

Klaus S. schrieb:
> Puh, das hat mir reichlich Adrenalin verschafft. Aber nein, so ist es
> nicht, auch UNSIGNED und SIGNED werden mit 'U' (un-initialized) und 'X'
> (ungültiges Ergebnis) markiert. INTEGER und NATURAL werden mit 0
> initialisiert.

Das ist richtig. (Un)signeds sind auch nichts anderes als std_logic 
Arrays, von daher war die Aussage von Jonas auch nicht korrekt. Bei 
Integers waere das allerdings richtig gewesen.

von Klaus S. (kschleisiek)


Lesenswert?

Klaus S. schrieb:

>> Mich beschleicht der Verdacht, dass es sinnvoll ist, sämtliche
>> STD_LOGIC_VECTOR Signale in UNSIGNED umzuändern. Das wird wahrscheinlich
>> weniger verstreute Casts und Konvertierungen erfordern.
>
> Das hat nochmal 3 Stunden gekostet und zu einer DEUTLICH gesteigerten
> Lesbarkeit geführt :)

Hier zum Abschluss noch eine Modifikation der Vorgehensweise bei der 
Umstellung:

1. Überall die Libraries auf 1164 und NUMERIC_STD umstellen.

2. In allen Files alle STD_LOGIC_VECTOR in UNSIGNED ändern.

3. Dann im Simulator compilieren. Das produziert viele Fehlermeldungen, 
die man in der Compilationsreihenfolge der vhd-Files einzeln "austreten" 
und mit UNSIGNED, to_UNSIGNED, SIGNED, to_UNSIGNED, to_INTEGER und 
RESIZE verzieren kann.

Direkt alle STD_LOGIC_VECTORen rauszuwerfen produziert deutlich weniger 
Fehlermeldungen als beim Vorgehen wie in 
Beitrag "Re: IEEE.STD_LOGIC_ARITH.ALL obsolete" vorgeschlagen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.