Forum: FPGA, VHDL & Co. 'Lesenden' Zugriff protokollieren


von Stefan A. (chaos)


Lesenswert?

Hallo,

mal eine etwas ungewöhliche Frage:

Gibt es in VHDL eine Möglichkeit (Funktion, Designbeispiel, Workaround)
die lesend auf ein Signal zugreifenden Prozesse zu überwachen?

Beispiel:

Ein SRAM Modell zur Nutzung in einer Testbench. Während des Lesezugriffs 
ist die Datenleitung kurz 'invalid'. Ein Zugriff zu diesem Zeitpunkt 
brächte dem zu angeschlossenen Schaltkreis ungültige Daten.

Wie stelle ich fest, das mein DUT nun doch (/nicht) während dieser Zeit 
gelesen hat?

Danke schonmal für eure kreativen Vorschläge...

(Das DUT wird als Black-Box angenommen. Sollte es keine VHDL-Möglichkeit 
geben, dann vielleicht mit einem Simulatorscript? (kein ModelSim, 
sondern NCSim!))

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


Lesenswert?

Üblicherweise hat so ein SRAM aber Steuersignale (CE# und OE#), und die 
haben einen zeitlichen Bezug zur Gültigkeit der Daten. Ist da nichts zu 
machen?

Das ist dein/ein Problem:
>Das DUT wird als Black-Box angenommen...
Wie willst du etwas testen, von dem du nicht weißt, was darin vorgeht? 
Du weißt dann ja nicht einmal, welches Signal intern möglicherweise die 
fehlerhaften Daten übernehmen würde.

Willst du von der TB aus auf interne Signale des DUT zuzugreifen, ohne 
diese über die entity zu schleusen?

von Stefan A. (chaos)


Lesenswert?

Lothar Miller wrote:
> Üblicherweise hat so ein SRAM aber Steuersignale (CE# und OE#)

Der Sram hat (eingehende) Steuersignale, aber wie das bei der 
Überprüfung der Lesezugriffe helfen soll weiß ich nicht.

> Wie willst du etwas testen, von dem du nicht weißt, was darin vorgeht?
> Du weißt dann ja nicht einmal, welches Signal intern möglicherweise die
> fehlerhaften Daten übernehmen würde.

Nunja, wissen schon. Black_Box meint mehr sowas wie 'nicht änderbar' und 
nicht unbedingt 'nicht einsehbar'.  Ich hab zwar das Wissen über den 
inneren Aufbau, ich will im DUT aber nichts verändern (keine Konstrukte 
nur zu Debugging Zwecken).

>
> Willst du von der TB aus auf interne Signale des DUT zuzugreifen, ohne
> diese über die entity zu schleusen?

Nunja, ich will nicht zugreifen im Sinne von schreiben/lesen. Ich will 
nur Wissen DASS da jemand lesend zugreift.

Soweit ich bisher rausgefunden habe ist sowas nicht möglich. 
Gegebenenfalls könnte man ein eigenes Signal schreiben, welches nicht 
nur schreibende (wie std_logic), sondern auch lesende Prozesse in eine 
Art Queue speichert.

Mein Workaround ist momentan: Ich schreibe im fraglichen Zeitraum 'X' 
auf das Signal. Sollte jetzt jemand lesend zugreifen, muß ich hoffen 
dass das im DUT auffällt (interne assertions) und die Simulation stoppt.

von Morin (Gast)


Lesenswert?

> Mein Workaround ist momentan: Ich schreibe im fraglichen Zeitraum 'X'
> auf das Signal. Sollte jetzt jemand lesend zugreifen, muß ich hoffen
> dass das im DUT auffällt (interne assertions) und die Simulation stoppt.

Das ist meiner Meinung nach mehr als nur ein Workaround. Bei 
kontinuierlichen Signalen ist der Unterschied zwischen "lesen" und 
"nicht lesen" nicht so klar. Einfaches Beispiel:
1
if clk'event and clk='1' then
2
  if enable='1' then
3
    q <= d;
4
  else
5
    q <= 0;
6
  end if;
7
end if;

Hier könnte man sagen, dass die Schaltung das Eingangssignal d nur 
während enable='1' liest, nicht bei enable='0'.
1
if clk'event and clk='1' then
2
  q <= enable and d;
3
end if;

Hier wird rein formal das Eingangssignal d immer "gelesen", die 
Schaltung macht aber genau dasselbe wie die oben.

Ich würde genau bei deiner Lösung bleiben: Schreib X auf die Signale, 
die nicht "gelesen" werden sollen. Wenn sie es doch werden, breitet sich 
das X durch die Schaltung aus (*), und die wirst es irgendwann an den 
Ausgängen wiederfinden, bzw. an internen Signalen welche du im Simulator 
verfolgst.

(*) Tatsächlich kann es je nach Eingabemuster vorkommen, dass die Xe 
doch wieder "verschluckt" werden. In diesem Fall kannst du im Ganzen das 
Signal als "nicht gelesen" werten. Bei anderen Mustern wird es dann 
nicht "verschluckt". Das ist aber ein grundlegendes Problem an Tests 
bzw. Testbenches: Du weißt immer nur für bestimmte Eingabemuster was 
passiert, nie für alle.

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.