www.mikrocontroller.net

Forum: FPGA, VHDL & Co. DDR-RAM in ModelSim


Autor: Sebastian B. (sfreak) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuche gerade den Opencores DDR-Controller 
http://www.xdr.com/dash/fpga/oc_ddr.tgz zum Laufen zu bringen, erstmal 
in der behavioral Simulation in ModelSim. Habe mir die Dateien dafuer in 
ein ISE Webpack 9.2i Projekt importiert und simuliert. Soweit ich mir 
das ganze angeschaut und mit dem RAM-Datenblatt verglichen habe sieht 
das Timing auch gut aus. Allerdings meldet die Testebench jede Menge 
Lesefehler (fuer jede Adresse um genau zu sein).

Ich wuerde mir nun gerne den Inhalt des RAMs angucken um zu sehen ob das 
Schreiben ueberhaupt geklappt hat. Im RAM-Modell (siehe Anhang) gibts 
auch ein entsprechendes Array fuer jede Bank.

Wie kann ich mir dieses Array sinnvoll anzeigen/exportieren lassen in 
ModelSim? 512MBit Daten machen in der Waveform-Anzeige nicht allzuviel 
Sinn...

Vielen Dank fuer eure Tips!
Sebastian

Autor: Da Micha (damicha)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es gibt in Modelsim im Workspace-View ein Memory Reiter. Dort ist der 
Zugriff auf den Inhalt der Speicher (alle Speicherarrays) zur aktuellen 
Simulationszeit möglich. Du machst einfach einen Doppelklick aufs 
angezeigte Array und der Speicherinhalt wird angezeigt.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da Micha wrote:
> es gibt in Modelsim im Workspace-View ein Memory Reiter. Dort ist der
> Zugriff auf den Inhalt der Speicher (alle Speicherarrays) zur aktuellen
> Simulationszeit möglich. Du machst einfach einen Doppelklick aufs
> angezeigte Array und der Speicherinhalt wird angezeigt.

Ah, das ist genau was ich gesucht habe... nur ein Problem: das gesuchte 
Speicherarray taucht dort nicht auf. Habe in der ModelSim-Doku 
nachgeschaut, offebar entspicht das Array nicht den als Speicher 
erkannten Typen.

Wenn ich versuche das Array haendisch hinzuzufuegen bekomme ich folgende 
Meldung:
> add mem /tb/i_mt46v16m16/state_register/bank0
# ** Error: (vsim-3663) Object '/tb/i_mt46v16m16/state_register/bank0' is not a memory.
# 

Der Speicher ist wie folgt deklariert:
    TYPE Array_ram_type IS ARRAY (2**cols_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);
    TYPE Array_ram_pntr IS ACCESS Array_ram_type;
    TYPE Array_ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF Array_ram_pntr;

    VARIABLE Bank0 : Array_ram_stor;


Was kann ich da tun?

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
     TYPE Array_ram_type IS ARRAY (2**cols_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);
     TYPE Array_ram_pntr IS ACCESS Array_ram_type;
     TYPE Array_ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF Array_ram_pntr;
 
     VARIABLE Bank0 : Array_ram_stor;
 

Nur zum Verstaendnis, ACCESS ist mir in VHDL noch nie begegnet: Es 
handelt sich hier um ein Array aus Pointern? Wusste gar nicht das es 
sowas in VHDL gibt...

Sebastian

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, du kannst mit ACCESS nur auf natural numbers zeigen, nicht 
auf andere Objekte.

Lassen sich ACCESS Types überhaupt synthetisieren?

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Lassen sich ACCESS Types überhaupt synthetisieren?

Ich wuerde mal stark vermuten das nicht, aber es geht hier eh nur um ein 
Simulationsmodell, von daher spielt das keine Rolle.

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest Dir zum Test nur die unteren Speicherbereiche in der 
Waveform anzeigen lassen: z.B.: Col 0 bis 3 der Bank 0 und dann auch nur 
auf diese zugreifen.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da Micha wrote:
> Du könntest Dir zum Test nur die unteren Speicherbereiche in der
> Waveform anzeigen lassen: z.B.: Col 0 bis 3 der Bank 0 und dann auch nur
> auf diese zugreifen.

Auch das klappt nicht. Egal ob ich es zum Beginn oder waehrend der 
Simulation probiere, bekomme ich folgende Fehlermeldung:
# Drop insertion failed: /tb/i_mt46v16m16/state_register/bank0(0)
# (vish-4014) No objects found matching '/tb/i_mt46v16m16/state_register/bank0(0)'.

Im "Locals" Fenster kann ich bank0 aber aufklappen und es werden die 
(8196) Untereintraege angezeigt...
Ich werde aus der ganzen Sache nicht schlau... aber ich will eigentlich 
auch nicht an dem Simulationsmodell rumbasteln. Das soll ja gerade 
unveraendert bleiben... wenn ich meine kaputte Schaltung an einem 
kaputtgespielten RAM-Modell verfiziere kann ich's auch gleich sein 
lassen :-/

Ratlos...
Sebastian

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nehme doch einfach die komplette Bank mit in die Simulation.
Wenn ich dass mit den Pointern richtig verstanden habe, existieren die 
Speicher hinter diesen sowieso noch nicht (alle = NULL).
Ich vermute mal, dass das Model eine Speicherverwaltung für die 
Ram-Columns hat und diese erst anlegt, wenn sie gebraucht werden.
Wenn Du jetzt nur einen kleinen Speicherbereich benutzt, sollte sich der 
Speicherverbrauch der Simulation auch in Grenzen halten.

Gruß DaMicha.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hrm... dann hab ich den ganzen Brocken in der Waveform-anzeige? Kann ich 
mir nicht so recht vorstellen das das funktioniert. Werde das aber 
nachher mal ausprobieren.

Habe damit wenigstens ein bisschen weiterkomme doch erstmal das Modell 
"gehackt" und das dynamische Konstrukt durch ein statisches Array 
ersetzt und natuerlich die dynamische Speicherverwaltung rausgeworfen. 
Nun kann ich mir das ganze wenigstens im "Memory" Fenster von ModelSim 
angucken und es wandern auch die Werte rein die die Testbench erzeugt.

Sebastian

Autor: Matthias F. (flint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du das Array statisch anlegst brauchst du aber viel RAM. Und ich 
zweifle, dass du damit den Fehler findest. Ich hatte zb bei einem 
Simulationsmodell den Fall, dass es etwas zu streng war und bei der 
Initialisierung trotz Spec-konformen Verhaltens (auf den 
Addressleitungen 'X's aber die Kommandoleitungen waren korrekt gesetzt) 
in einen Fehlerzustand ging und gar nichts mehr machte.

Ich würde mir an deiner Stelle die interne State Machine die sich um 
Schreiben/Lesen kümmert suchen und dort mit report bzw. assert 
versuchen, Ausgaben zu bekommen, die dir zeigen, ob es überhaupt durch 
die Initialisierung kommt und wann es Fehler sieht.

DRAM Simulationsmodelle sind so ein eigenes Thema ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.