Forum: FPGA, VHDL & Co. Hilfestellung Library, Package und vhd


von Alex (Gast)


Lesenswert?

Hallo zusammen,

ich stolpere gerade über mein eigenes Design und bei der Fehlersuche ist 
mir klar geworden, dass ich noch ein paar Verständnisprobleme habe.

Am Anfang jeder vhd, egal ob ENTITY oder PACKAGE wird ja die Standard 
Library IEEE eingebunden. Darin enthalten sind std_logic_1164 und 
numeric_std.
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;

Nun erstelle ich mir meine eigene Library, um meine eigenen Files dort 
hin zu kompilieren:
1
vlib project_lib

Dort werden nun sämtliche vhd einkompiliert:
1
vcom -work project_lib .../package.vhd
2
vcom -work project_lib .../funktionen1.vhd
3
vcom -work project_lib .../zwei.vhd
Im Package habe ich diverse Constanten und Generics übersichtlich 
zusammengefasst.

Nun instanziiere ich meine Entities im Topfile mit
1
i0_zwei : entity project_lib.zwei
Das erspart mir, dass ich den COMPONENT nochmal extra definieren muss 
und nur die Instanz habe - finde ich einfach übersichtlicher und wenn 
sich was ändert, hat man eine Baustelle weniger.

Damit das aber funktioniert, binde ich im Topfile meine project_lib ein.
1
LIBRARY project_lib;
2
USE project_lib.ALL;

Damit auch meine Konstanten erkannt und belegt werden, muss ich auch das 
Package einbinden.
1
LIBRARY project_lib;
2
USE project_lib.ALL;
3
USE project_lib.package.ALL;

Nun kommt es aber immer wieder vor, dass in einzelnen vhd die Library 
unbekannt ist.
Ich achte darauf, dass das Entity vor dessen Instanz compiliert wird, 
dass die nachfolgend kompilierte Datei das Entity auch kennt.

Schließt der Teil
1
USE project_lib.ALL;
auch diesen Teil automatisch mit ein?
1
USE project_lib.package.ALL;
Wann muss ich ersteres verwenden und wann zweiteres?

Ich kommen gerade nicht weiter. Wahrscheinlich habe ich da noch ein 
Verständnisproblem und daher ist die Lib unbekannt, obwohl ich meiner 
Meinung nach alles richtig gemacht habe.

Hat jemand einen Hinweis für mich, wie man in diese verschachtelte Welt 
der vhdl-Beschreibung am schnellsten und besten zurecht kommt?

Vielen Dank!
Alex

PS: Kann ich im Modelsim, bevor ich alles neu kompilieren lassen, die 
aktuelle Lib leeren bzw. löschen?

von Alex (Gast)


Lesenswert?

Alex schrieb:
> PS: Kann ich im Modelsim, bevor ich alles neu kompilieren lassen, die
> aktuelle Lib leeren bzw. löschen?
Sorry, gerade gefunden
1
vdel -lib project_lib -all

von Klaus F. (kfalser)


Lesenswert?

Alex schrieb:
> Nun kommt es aber immer wieder vor, dass in einzelnen vhd die Library
> unbekannt ist.
Welche Meldung bekommst Du? Wie äußert sich das?
Wenn du
1
LIBRARY project_lib;
schreibst, dann machst Du deine Library bekannt.

Du must aber unterscheiden:
VHDL libraries sind logische libraries. Die Implementierung ist jedem 
Compiler selbst überlassen.
Bei Modelsim ist es z.B. ein Verzeichnis und man kann mit vmap den 
logischen Namen zum Verzeichnis zuordnen.
Bei Aufruf von vcom liest der compiler die Zuordnungen zwischen 
logischen Library Namen und Verzeichnissen von (verschiedenen) .ini 
Dateien und holt sich so die vorkompilierten VHDL-Einheiten aus den 
entsprechenden Verzeichnissen.
Mit vlib erzeugts du nur ein solches (logisch leeres) Verzeichnis.

Du solltest Dir aber für den Anfang abgewöhnen mit selbstgebauten 
Libraries zu arbeiten, jedenfalls solange du nicht VHDL fest bist.
Das ist auch nicht notwendig, arbeite mit der Library work, das ist der 
Standard und Default.

> Ich achte darauf, dass das Entity vor dessen Instanz compiliert wird,
> dass die nachfolgend kompilierte Datei das Entity auch kennt.
>
> Schließt der Teil
1
USE project_lib.ALL;
auch diesen Teil automatisch mit ein?
1
 USE project_lib.package.ALL;
> Wann muss ich ersteres verwenden und wann zweiteres?
Das 1. macht alle entities aus projekt_lib bekannt.
Das 2. macht alle Definitionen aus dem package mit Namen "package" 
bekannt.

von Alex (Gast)


Lesenswert?

Hallo und vielen Dank!

Klaus Falser schrieb:
> Welche Meldung bekommst Du? Wie äußert sich das?
1
# ** Error: /.../.../.../Projektname/vhd/PACKAGE.vhd(35): Library project_lib not found.
2
# ** Error: /.../.../.../Projektname/vhd/PACKAGE.vhd(36): (vcom-1136) Unknown identifier "project_lib".
3
# ** Error: /.../.../.../Projektname/vhd/PACKAGE.vhd(38): VHDL Compiler exiting

Klaus Falser schrieb:
> Das ist auch nicht notwendig, arbeite mit der Library work, das ist der
> Standard und Default.
Ich wollte für meine Testbench und mein eigentliches Design der 
Übersicht halber getrennte Libs anlegen und nicht alles ungesehen in die 
work-Lib werfen.
Modelsim verwendet zwar work als Standard, aber wenn ich dann doch ein 
anderes Tool nehmen muss oder ein Kommilitone mit meinem Design 
weiterarbeiten will und ebenfalls ein anderes Tool verwendet, kann er so 
zumindest meine LIB verwenden und ist wegen work nicht an Modelsim 
gebunden. Oder ist die Verwaltung der LIBs wirklich so toolspezifisch, 
dass dieser Ansatz gar keinen Sinn ergibt?

Klaus Falser schrieb:
>> Ich achte darauf, dass das Entity vor dessen Instanz compiliert wird,
>> dass die nachfolgend kompilierte Datei das Entity auch kennt.
>> Schließt der Teil
>> USE project_lib.ALL;
>> auch diesen Teil automatisch mit ein?
>> USE project_lib.package.ALL;
>> Wann muss ich ersteres verwenden und wann zweiteres?
> Das 1. macht alle entities aus projekt_lib bekannt.
Alles klar!
Also würde
1
USE project_lib.entity_eins.ALL;
nur das entity_eins zur Verfügung stellen/bekannt machen?
Somit wäre das eine Einschränkung auf ein spezielles Entity gegenüber:
1
USE project_lib.ALL;

Vielen Dank!
Alex

von Alex (Gast)


Lesenswert?

Nachtrag:
Klaus Falser schrieb:
> Welche Meldung bekommst Du? Wie äußert sich das?
Was vielleicht noch wichtig wäre:
Die oben genannte Fehlermeldung kommt nicht beim Kompilieren, sondern 
erst wenn ich mit vsim den Simulator starten möchte. Also erst beim 
Laden des Designs in den Simulator gibt es auf einmal Probleme, dass die 
project_lib offenbar nicht bekannt ist.

von Alex (Gast)


Lesenswert?

Ich glaube ich habe dank diesem Kommentar eine Lösung gefunden:
Klaus Falser schrieb:
> Bei Modelsim ist es z.B. ein Verzeichnis und man kann mit vmap den
> logischen Namen zum Verzeichnis zuordnen.

Mit
1
vmap project_lib /.../.../.../Projektname/sim/project_lib
scheint es nun zu gehen! :)

von Klaus F. (kfalser)


Lesenswert?

Alex schrieb:
> Klaus Falser schrieb:
>> Das ist auch nicht notwendig, arbeite mit der Library work, das ist der
>> Standard und Default.
> Ich wollte für meine Testbench und mein eigentliches Design der
> Übersicht halber getrennte Libs anlegen und nicht alles ungesehen in die
> work-Lib werfen.
Ok, das macht Sinn.Dafür sind sie da.

> Modelsim verwendet zwar work als Standard,
Der VHDL Standard definiert work als die aktive library!
> aber wenn ich dann doch ein
> anderes Tool nehmen muss oder ein Kommilitone mit meinem Design
> weiterarbeiten will und ebenfalls ein anderes Tool verwendet, kann er so
> zumindest meine LIB verwenden und ist wegen work nicht an Modelsim
> gebunden. Oder ist die Verwaltung der LIBs wirklich so toolspezifisch,
> dass dieser Ansatz gar keinen Sinn ergibt?
Das ist mir nicht klar.
Libraries dienen zur logischen Strukturierung des Design, und werden 
somit von jeder Implementierung unterstützt, mit Ausnahme vielleicht von 
Syntheseprogrammen der ersten Stunde.
Portabel wie eine Library von Windows oder Linux sind sie aber überhaupt 
nicht. Wenn du von Modelsim auf ?? wechselt, dann musst Du in jedem Fall 
deine Libraries neu bilden.
ISIM z.B. unterstützt meines Wissens nicht einmal vorkompilierte 
Libraries, dort muss man immer alles kompilieren.

Alex schrieb:
> Nachtrag:
> Klaus Falser schrieb:
>> Welche Meldung bekommst Du? Wie äußert sich das?
> Was vielleicht noch wichtig wäre:
> Die oben genannte Fehlermeldung kommt nicht beim Kompilieren, sondern
> erst wenn ich mit vsim den Simulator starten möchte. Also erst beim
> Laden des Designs in den Simulator gibt es auf einmal Probleme, dass die
> project_lib offenbar nicht bekannt ist.

Verwendest Du vmap?
Kannst Du kurz einmal alle Schritte und Kommandos angeben und wie/wo der 
Fehler genau auftritt.

von Klaus F. (kfalser)


Lesenswert?

Alex schrieb:
> Ich glaube ich habe dank diesem Kommentar eine Lösung gefunden:
> Klaus Falser schrieb:
>> Bei Modelsim ist es z.B. ein Verzeichnis und man kann mit vmap den
>> logischen Namen zum Verzeichnis zuordnen.
>
> Mitvmap project_lib /.../.../.../Projektname/sim/project_lib
> scheint es nun zu gehen! :)

Gut, habe zu lange gebraucht, die Antwort zu tippen!

von Alex (Gast)


Lesenswert?

Klaus Falser schrieb:
> Gut, habe zu lange gebraucht, die Antwort zu tippen!

Dennoch VIELEN DANK für Deine Hilfe. Erst Dein Kommentar hat mich auf 
die richtige Lösung gebracht. Eine eigene Lösung mit Denkanstaß selber 
finden setzt sich auch besser im Hirn fest, als eine vorgekaute Lösung 
:)

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.