mikrocontroller.net

Forum: FPGA, VHDL & Co. Tesbench X abfragen


Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Derzeit habe ich folgendes Problem:
Ich habe einen bidirektionalen Bus an eine Komponente (SD-RAM). Den 
schalte ich entsprechend hochohmig wenn ichs brauche. Die Komponente ist 
in der Testbench instanziiert.

Der Ausgang der Komponente wird immer kombinatorisch in meine entity 
geführt, z.B. an einen Addierer.

Nun gibt es Situationen, da liefert die Komponente, wenn sie als Ausgang 
konfiguriert ist, 'X' (std_logic_vector). Das soll auch so sein und ist 
soweit egal, da die Werte zwar an den Adder gehen, aber kein 
Ausgangs"valid" erzeugt wird.

Nun gibt es dadurch natürlich haufenweise Warnungen in der Simulation 
derart, dass eben ein Operand in einer arithemtischen Operation 'X' ist 
und der Ausgang deswegen 'X' ist. Das ist ja auch so geplant. Allerdings 
ist durch diese ständige Warnungen zu fast jedem Takt keine vernünftige 
Simualtion möglich (geht sehr langsam wegen der Ausgabe). Die Ausgabe 
von Warnungen komplett abschalten möchte ich allerdings nicht.

Eine Abfrage in der Testbench derart, dass ich den bidir-Bus mit ...='X' 
abfrage und falls er X ist einfach 0 an meine entity leite funktioniert 
aus demselben Grund nicht, dann ist eben die Abfrage die arithemtische 
Operation die nicht sein darf.

Also kurz gefragt: Gibt es eine Möglichkeit, einen std_logic_vector für 
die Simulation auf X abzufragen und entsprechend zu reagieren?

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es richtig verstanden habe, liefert deine Komponente während 
der Simulation zu bestimmten Zeiten ein "X", statt eines sinvollen 
Wertes.

Warum gehst du nicht den "sauberen" Weg und beschreibst deine Komponente 
vollständig, so dass in jedem Zustand ein definierter Wert an dem Bus 
anliegt?
Ist meinst durch ein einfaches "else" o.Ä. erledigt.

Ob man die Abfrage auf "X" mit einem Assert o.Ä. hinbekommt und dann den 
Wert korrigieren kann, wage ich zu bezweifeln.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bidirektionalen Bus
Auf einem bidirektionalen Bus darf keiner 'X' treiben, da sollte es nur 
'0', '1' und 'Z' geben.

> Das soll auch so sein ...
Eine reale Schaltung wird dir auch nie ein 'X' zurückgeben.
D.h. das was du da simulierst kann niemals der Realität entsprechen.
Wozu also die Simulation?

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten.

>Warum gehst du nicht den "sauberen" Weg und beschreibst deine Komponente
>vollständig, so dass in jedem Zustand ein definierter Wert an dem Bus
>anliegt?

Weil das nicht "meine" Komponente ist, sondern ein SD-RAM 
Simulationsmodell, welches ich nicht gewillt bin zu ändern. Bzw. ich es 
von meiner Komponente aus nicht brauche, siehe nächster Punkt.

>Auf einem bidirektionalen Bus darf keiner 'X' treiben, da sollte es nur
>'0', '1' und 'Z' geben.

Das treibe nicht ich, sondern es wird vom SD-RAM zurückgegeben, während 
ich 'Z' treibe, also lese. Konkret lese ich an uninitialisierten 
Adressen, welche im Laufe der Simulation erst beschrieben und später 
zurückgelesen werden, also am Anfang noch 'X' enthalten. Natürlich 
könnte ich jetzt einen Sonderfall definieren und am Anfang noch nicht 
dort lesen usw. aber das würde eben wieder mehr Hardwareaufwand 
bedeuten, den ich in der realen Schaltung eben wirklich nicht brauche. 
Zur Zeit beschränkt sich der Sonderfall darauf, den Ausgang meiner 
Berechnung dann nicht weiter zu verwenden. Nur in der Simulation möchte 
ich die Warnungen darüber eben nicht haben.

>Eine reale Schaltung wird dir auch nie ein 'X' zurückgeben.
>D.h. das was du da simulierst kann niemals der Realität entsprechen.
>Wozu also die Simulation?

Damit ich meine Gesamtschaltung simulieren kann. Natürlich gibt es kein 
'X' im realen, aber in der Simulation weiß ich wo es herkommt und kann 
damit leben, gerade weil ich weiß, dass es real kein X ist.

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Auf einem bidirektionalen Bus darf keiner 'X' treiben, da sollte es nur
> '0', '1' und 'Z' geben.

'X' sollte da tatsächlich nicht vorkommen, aber zu '0', '1' und 'Z' 
können sich durchaus noch 'L' und 'H' dazugesellen. Das wären dann 
Pullup- und Pulldown-Widerstände. Im 'NUMERIC_STD' gibt es dazu 
Funktionen wie 'To_01'. Die Funktion wandelt alles außer '1' und 'H' in 
'0'.

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Matthias, das ist eine gute Idee.

Leider überschreibt ein X gnadenlos jedes L und H. Das Problem ist, das 
X wird von der SD-RAM-Komponente wirklich getrieben. Liegt wohl daran, 
dass die in Verilog beschrieben ist und da gibts kein std_logic_vector, 
also entscheidet sich die Simulation bei unitialisierten Speicherstellen 
für X.

Das to_01 lässt sich aber gut nutzen, hab nun eine ähnliche Funktion 
geschrieben, die mir nur aus X ein L macht und ansonsten alles so lässt. 
Also kein wirkliches Pulldown aber für diesen Simulationszweck reichts.

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.