Hilfestellung Library, Package und vhd

Gast #3015484
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?
#3015630
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.
Gast #3015660
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
Gast #3015669
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.
#3015713
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.
#3015717
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren