Forum: FPGA, VHDL & Co. fehlende Testbench Befehle


von Martin (Gast)


Lesenswert?

Hallo zusammen,

für meine Testbench arbeite ich häufiger mit Dateien, um Steuersequenzen 
einzulesen oder Logdateien zu schreiben. Dabei habe ich folgende 
Funktionen immermal wieder vermisst und bin nun drauf und dran, mich dem 
ganzen selber zu widmen. Bevor ich mir die Mühe mache, wollte ich hier 
aber noch einmal fragen, ob ihr vielleicht schon eine fertige Lösung für 
die folgenden Problemchen kennt oder selbst erstellt habt.

 - Eine Zeit aus einer Datei auslesen. Idealer Weise kann man die Zeit 
in ps, ns, us oder ms angeben. Read(line, timestamp) funktioniert leider 
nicht.

 - eine Zeit (z.B. Timestamp) mit einer bestimmten Formatierung (ggf. 
gerundet) in eine Datei schreiben: mit den Befehlen write(Line, now); 
writeline(LogFile, Line); kann ich einen Timestamp in die Datei 
schreiben, dieser wird je nach Wert unterschiedlich dargestellt: 1ms 
wird als 1 ms dargestellt, der nächste Timestamp eine ps später wird 
dann aber zu 100...001 ps. Das macht das Lesen schwierig, da die Werte 
immer eine unterschliedliche Länge haben. Schön wäre eine Funktion, die 
eine Zeit auf ns, us oder ms runden kann und dann immer in einer 
konstanten Formatierung ausgibt (also nur ns oder nur us oder nur ms)



Außerdem bin ich auf der Suche nach einer Möglichkeit, die Simulation 
aus dem Quellcode zu stoppen. Bisher generiere ich einen Fehler und 
stell den Simulator entsprechend ein, aber
1
if (endfile(File) = TRUE) then
2
  assert (FALSE) report "EOF der Datei erreicht, Simulation erfolgreich beendet" severity failure; 
3
end if;
sieht einfach doof aus.

Wenn jemand ideen für mich hat, würd ich mich freuen.

Vielen Dank und viele Grüße
Martin

von SeriousSam (Gast)


Lesenswert?

Um eine Simulation zu beenden musst du dafür sorgen, dass keine Events 
mehr erzeugt werden. Normalerweise kannst du einfach dafür sorgen, dass 
keine Clock mehr generiert wird und die Simulation wird stoppen.

von Duke Scarring (Gast)


Lesenswert?

Martin schrieb:
> - Eine Zeit aus einer Datei auslesen. Idealer Weise kann man die Zeit
> in ps, ns, us oder ms angeben. Read(line, timestamp) funktioniert leider
> nicht.

Ich würde an die erste Stelle der Zeile eine Markierung machen und die 
Zeit als integer abspeichern.
1
# control file
2
T 5000
1
:
2
constant time_unit : time := 1 us;
3
:
4
read(line, mark);
5
case mark is
6
7
  when '#' =>
8
    null; -- ignore comments
9
10
  when 'T' =>
11
    read(line, space);
12
    read(line, time_value);
13
    wait for time_value * time_unit;
14
:
15
  when others =>
16
    null;
17
18
end case;

Die Interpretation kann dann in der gewählten Zeiteinheit oder durch 
einen zusätzlichen Parser erfolgen.

Duke

von Duke Scarring (Gast)


Lesenswert?

SeriousSam schrieb:
> Normalerweise kannst du einfach dafür sorgen, dass
> keine Clock mehr generiert wird und die Simulation wird stoppen.

Bei mir sieht das meist so aus:
1
:
2
constant frequency       : natural   := 50_000_000;
3
constant period          : time      := (1 sec) / frequency;
4
5
signal simulation_active : boolean   := true;
6
7
signal testbench_clock   : std_logic := '0';
8
:
9
testbench_clock <= not testbench_clock after period/2 when simulation_active;
10
:
11
process
12
begin
13
  :
14
  -- apply some test vectors
15
  :
16
  simulation_active <= false;
17
  wait;
18
end process;

Duke

von Matthias G. (mgottke)


Lesenswert?

Zum lesen der Control-Files habe ich mir inzwischen einige Funktionen 
und Prozeduren geschrieben um komfortabler Daten einlesen zu können. So 
werden dann z.B. Leerzeilen und Kommentare (beginnend mit --) 
herausgefiltert. Die Strings können beliebig lange sein und auch mit 
einem beliebig langem Zwischenraum. Bei Integer-zahlen (inkl. 
std_logic_vector) können diese nun ein beliebiges Format haben. Entweder 
als Integer-, Binär oder Hex-Codiert.

In der Testbench definiere ich dann Befehle. Diese verwende ich dann als 
erstes im Control-File einer Zeilen. Jeder Befehl hat dann im Folgenden 
einen
festen Satz an Daten. Um in Deinem Beispiel zu bleiben kann das dann 
z.B. So
aussehen:
   set_time   12 h   25 min   10 sec
oder sowas:
   wait   3.4 ns

von NichtDerMartin (Gast)


Lesenswert?

>if (endfile(File) = TRUE) then

VHDL braucht keine Klammerung ;O)

von Georg A. (Gast)


Lesenswert?

BTW: pck_fio ist übrigens sehr praktisch, so eine Art printf.

http://www.easics.com/webtools/freesics

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


Lesenswert?

> VHDL braucht keine Klammerung ;O)
Aber es ist einfacher, sich bei den Abfragen immer Klammern zu setzen, 
insbesondere, wenn man zwischen C und VHDL hin- und herwechselt.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich weiss nicht ob es weiter hilft, jedoch es wäre zur Formatierung 
einen Versuch wert.

1
write(line, now, justified =>right, field => 10, unit => us);

von NichtDerMartin (Gast)


Lesenswert?

>Aber es ist einfacher, sich bei den Abfragen immer Klammern zu setzen,
>insbesondere, wenn man zwischen C und VHDL hin- und herwechselt.

Ist aber bestimmt nicht der Fall ;-)
Überall Klammern, das nervt einfach nur.

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


Lesenswert?

> Überall Klammern, das nervt einfach nur.
Immer_noch_besser_als_die_beliebten_Unterstriche  ;-)

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Man habt ich Probleme.
Von der Lesbarkeit finde ich C auch ungünstig.
Dafür gibt es sogar ein Misra C, um unleserliche Konstrukte zu 
eliminieren.
Aber die obige Klammer schadet mal nicht.
Da finde ich die Typenumwandlungen in VHDL wesentlich unleserlicher.

Eigentlich wollte ich nur mal fragen, ob es eine Rückmeldung zu meinem 
Formatierungsbeitrag gibt?

von FpgaX (Gast)


Lesenswert?

>Immer_noch_besser_als_die_beliebten_Unterstriche

Nichtsdestotrotz sind Unterstriche meiner Meinung nach besser als:

ImmerNochBesserAlsDieBeliebtenUnterstricke


weil Modelsim bspw. folgendes daraus macht:
immernochbesseralsdiebeliebtenunterstricke

daverliertmanschonmaldenueberblicklothar ;-)

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.