Forum: FPGA, VHDL & Co. logfile aus VHDL Simulation


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


Lesenswert?

hat jemand ein gutes Beispiel für ein log file?


Ich will Busereignisse protokollieren.
Wie Lese- und Schreibzugriffe. Davon ist die Adresse und und Bitbreite 
und noch der Wert usw. interessant.
Diese Werte willte ich mir als Text-Tabelle vom Simulator ausgeben 
ausgeben lassen. Die Suche im Taktdiagramm dauert einfach zu lange. Wenn 
ich die Tabelle hätte, wüsste ich die Position an den ich im 
Taktdiagramm expliziter schauen muss.


Der Weg geht über lib textio das ist mir klar.

Falls jemand ein Beispiel für so eine File-Ausgabe hat, würde es mir 
weiterhelfen.


Ich dachte an folgende Ausgabeform.

time    addr    R/W     Data_in Data_out    bit_width     Chipselect

von Kratzele (Gast)


Lesenswert?

>Der Weg geht über lib textio das ist mir klar.

Und wo genau ist jetzt dein Problem?
Was hast du denn schon ausprobiert? Zeig doch mal.

von SuperWilly (Gast)


Lesenswert?

Hallo René,

wie wäre es mit folgendem Ansatz: (VHDL-2008, getestet in Modelsim PE 
10.1c)


1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
library std;
5
use std.textio.all;
6
7
8
entity output_format is
9
end entity;
10
11
architecture test of output_format is
12
signal out_vec : std_logic_vector(3 downto 0) := x"7";
13
signal count : integer := 77;
14
15
begin
16
17
process
18
   variable s : string(1 to 5) := "     ";
19
begin
20
  wait for 333 ns;
21
22
  write( output, to_string(now, ns) &s&
23
                 to_hstring(out_vec) &s&
24
                 to_string(count)   );
25
wait;
26
end process;
27
28
end test;



Ausgabe:
333 ns       7       77



VG, SuperWilly

von SuperWilly (Gast)


Lesenswert?

Möchtest Du Zeilenumbrüche sehen, dann vielleicht so:


1
p2: process  
2
begin
3
  wait for 444 ns;
4
5
  write( output, to_string(now, ns)     &LF&
6
                 to_hstring(out_vec)    &LF&
7
                 to_string(count)  );
8
wait;
9
end process;


VG, SuperWilly

von Duke Scarring (Gast)


Lesenswert?

René D. schrieb:
> Ich will Busereignisse protokollieren.
> Wie Lese- und Schreibzugriffe. Davon ist die Adresse und und Bitbreite
> und noch der Wert usw. interessant.

Suchst Du vielleicht sowas?:
http://repo.or.cz/w/zpu.git/blob/HEAD:/zpu/hdl/zpu4/src/trace.vhd

Duke

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


Lesenswert?

> Und wo genau ist jetzt dein Problem?


ich müsste mich auf die Lauer legen bis ein Ereignis, was ich loggen 
will, eintritt  und das noch rekursiv für das nächst Ereignis.

Dazu kann ich einen Prozess oder eine loop nehmen.

Weil ich einen Tabellenkopf generieren will scheidet der Prozess aus.


Die ganzen Ausgaben sind noch zu konvertieren und zu formatieren und 
Stringumwandlungen. Das ist nicht synthetisierbarer Code und damit habe 
ich lange nicht mehr gearbeit. Das ist so das grundübel.

Ich habe nich auch gerade umgeschaut. Der Begriff "Testvector" ist hier 
das Wort in der Praxis. Dazu brache ich ein paar Anregungen, wie man 
effektiver Code testet.

zurück du den oben genannten Stellen.


Die Printf funktion fehlt leider in VHDL.

die Funktion print aus der ZPU sieht sehr nach der Lösung für mein 
Problem aus. Hinter Print ist Funktion hinterlegt, die ich noch nicht 
kenne. Da muss ich nochmal graben.


>             print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & "
> 0x"  & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" &
> hstr(intSp) & " 0x" & hstr(std_logic_vector(counter)));

von Duke Scarring (Gast)


Lesenswert?

René D. schrieb:
> Weil ich einen Tabellenkopf generieren will scheidet der Prozess aus.
1
-- Pseudocode
2
  ...
3
  variable tabellenkopf : boolean := true;
4
  ...
5
  if tabellenkopf then
6
     print "Tabellenkopf";
7
     tabellenkopf := true;
8
  end if;
9
  
10
  print "restliche, permanente Ausgaben";
11
  ...

René D. schrieb:
> Hinter Print ist Funktion hinterlegt, die ich noch nicht
> kenne. Da muss ich nochmal graben.
siehe hier:

http://repo.or.cz/w/zpu.git/blob/HEAD:/zpu/hdl/zpu4/src/txt_util.vhd

Die txt_util ist sicher auch für andere Projekte ganz hilfreich.

Duke

von Stachele (Gast)


Lesenswert?

>Der Begriff "Testvector" ist hier das Wort in der Praxis.

Ja? Du möchtest doch Daten loggen. Der Begriff Testvektor ist doch eher 
im Stimulus-Zusammenhang zu sehen.

von SuperWilly (Gast)


Lesenswert?

>Weil ich einen Tabellenkopf generieren will scheidet der Prozess aus.


Wieso?


Ich kann doch in einem Prozess einmalig einen Tabellenkopf ausgeben und 
mich gleichzeitig in einer while-Schleife befinden.


1
process
2
variable once : boolean := true;
3
begin
4
   while (not simulation_end) loop
5
     
6
        for k in 0 to 7 loop                    -- z.B. 8 Log-Ereignisse 
7
              
8
            wait until (log_event = '1');
9
10
            if once then
11
               write(output, "Deine Kopf-Meldung");
12
               once := false;
13
            else
14
               write(output, "Deine sonstigen Meldungen");
15
            end if; 
16
17
        end loop;
18
19
   end loop;
20
21
   report "Logging beendet" severity note;
22
wait;
23
end process;

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


Lesenswert?

> Ja? Du möchtest doch Daten loggen. Der Begriff Testvektor ist doch eher
> im Stimulus-Zusammenhang zu sehen.

Das habe ich auch schon bemerkt, dass der Testvector im Regelfall zum 
Stimulieren gelesen wird. Ich will so was eben zu kritischen Zeitpunkten 
ausgeben und brauche auch kein kontinuierliches Loggen.


Zum stimulieren habe ich schon eine Testbench. Die Simulation muss ich 
auswerten und bin hier noch nicht optimal mit meinen Tools aufgestellt.

Deshalb auch die Frage in den Raum.

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


Lesenswert?

ich habe noch einen schönen Beitrag zu dem Thema gefunden.


www.actel.com/documents/TestVector_AN.pdf

von Stachele (Gast)


Lesenswert?

Naja, etwas altbacken, anno 2003. So generiert man doch keine Stimuli 
mehr ...

"Bus Functional Model" lautet hier das Stichwort.

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


Lesenswert?

> "Bus Functional Model" lautet hier das Stichwort.

So richtig bin ich noch nicht im Bilde.

Bis jetzt habe ich als Vorstellung das Bus funtion Model ist ein 
spezielle Testbench. Damit kann man einen Busteilnehmer einzeln 
verifizieren.
Mehr konnte ich aus der Meldung ableiten.

von Stachele (Gast)


Lesenswert?

Was für Daten muss du denn stimulieren?

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


Lesenswert?

Stachele schrieb:
> Was für Daten muss du denn stimulieren?


Ursprung: ich habe einen eigenen Softcore mit dem ahb-lite bus.
Die Fehler befinden sich in entweder in der compilierten Software, im 
Softcore oder in  der Peripherie.



CPU Fehler hatte ich jetzt lange nicht mehr. Sofern ist das ganz harte 
überwunden.


Eine Baustelle ist meine AHB-lite Peripherie auch unabhängig vom 
Softcore zu testen. Hier könnte ich mir so etwas mit Bus function model 
vorstellen.

Eine andere Baustelle sind Tests für den Softcore, der sich aber ab und 
zu ändert. Hier nehme ich als Stimulation ein Hexfile.

von Stachele (Gast)


Lesenswert?

>Eine Baustelle ist meine AHB-lite Peripherie auch unabhängig vom
>Softcore zu testen.


Lohnt sich denn der Aufwand die Peripherie separat zu simulieren? Ich 
meine, wird sie denn jemals ohne Softcore zum Einsatz kommen oder ist 
die Simulation der Softcores zu langsam?

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


Lesenswert?

> Lohnt sich denn der Aufwand die Peripherie separat zu simulieren? Ich
> meine, wird sie denn jemals ohne Softcore zum Einsatz kommen oder ist
> die Simulation der Softcores zu langsam?

Mit GHDL geht das schon vernünftig.

anderer Aspekt:
Wenn jemand weitere Peripherie schreibt. Dann hat er nicht die Ahnung 
mit den internen Signalen des Softcore. Deshalb würde ich noch eine 
einfachere Simulation für die Peripherie als Schiedrichter haben wollen.
Wo ich mich nicht an den internen Signalen entlanghangeln muss, sondern 
schneller die Fehler im Bus sehe.

Nur als Beispiel:
Ich hatte gerade den Fall. Ich bin immer von geraden Speicheradressen 
beim Buszugriff auf meine Peripherie ausgegagen, deshalb habe ich den 
Fall nicht in VHDL abgebildet. Jetzt greift der Compiler mit 
Bytezugriffen drauf und kommt dadurch an ungerade Adressen und der 
Softcore wartet auf das Signal, dass die Daten im Bus gültig sind.

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.