Forum: FPGA, VHDL & Co. Datei beschreiben innerhlab einer TB


von Richy B. (derrichi)


Lesenswert?

Hallo,

ich möchte den Ausgabewert einer FIFO zu bestimmten Zeitpunkten (bevor 
er gelesen wird) in eine Textdatei schreiben. Der Code sieht 
folgendermaßen aus:

monitoring : process (clk)
    file OUT_DAT : text open write_mode is "output.txt";
    variable LO: line;
begin
    if(clk'event and clk = '1') then
      if(fifo_empty = '0') then
        fifo_read <= '1';
        --write output to file
        file_open(OUT_DAT, "output.txt", write_mode);
        write (LO,fifo_out);
        writeline (OUT_DAT, LO);
        file_close(OUT_DAT);
      else
        fifo_read <= '0';
      end if;
    end if;
end process;

output.txt wird zwar erstellt, aber nichts reingeschrieben. file_open 
und file_close habe ich nur mit reingenommen, weil es nicht 
funktioniert. Geändert hat sich allerdings nichts :-(

Hat jemand einen heißen Tipp?

von Expert (Gast)


Lesenswert?

rein gefühlsmässig muss da noch ein wait rein, bis die Datan geschrieben 
sind und beim Hauptprozess einer, damit sichergestellt wird, dass 
gespeichert wird, bevor die Simu "weiterarbeitet".

von Lattice User (Gast)


Lesenswert?

Nach
1
fifo_read <= '1';

stehen die Daten vom FIFO natürlich erst im nächsten Takt zur Verfügung.
Also etwa so:
1
    if(clk'event and clk = '1') then
2
      if(fifo_empty = '0') then
3
        fifo_read <= '1';
4
      else
5
        fifo_read <= '0';
6
      end if;
7
      if(fifo_read = '1') then
8
        --write output to file
9
        --file_open(OUT_DAT, "output.txt", write_mode);
10
        write (LO,fifo_out);
11
        writeline (OUT_DAT, LO);
12
        --file_close(OUT_DAT);
13
      end if;
14
    end if

von Lattice User (Gast)


Lesenswert?

Lattice User schrieb:
> stehen die Daten vom FIFO natürlich erst im nächsten Takt zur Verfügung.

Eventuell braucht es auch 2 Takte oder mehr, hängt von der FIFO 
Konfiguration ab.

von Richy B. (derrichi)


Lesenswert?

Danke für die schnellen Antworten :-)

@Expert

Wie genau würde das aussehen? Ich habe noch einen Hauptprozess in dem 
die Stimuli stehen, da gibts auch am Ende ein wait (nach den vielen 
"wait for x ns" um die verschiedenen Stimuli zu triggern). Aber wie kann 
ich in diesen "Dummy"-Prozess der nur dafür da ist, damit die Fifo 
geleert wird (wäre im richtigen Design ein externer Pin), ein wait 
einbauen (sorry, habe noch nicht viel mit TBs gemacht)? Genauso weiß ich 
nicht, wie ich im Hauptprozess der die File-Objekte nicht kennt (oder 
doch?), das Ganze abfragen soll.

@Lattice User
Das Problem ist nicht, dass die falschen Daten geschrieben werden, 
sondern dass gar nichts in die Datei geschrieben wird. Von der Logik her 
möchte ich es genau so: den aktuellen Wert lesen (bzw. schreiben), bevor 
durch das Read mit der entsprechenden Verzögerung neue Daten am Ausgang 
der Fifo anliegen.

: Bearbeitet durch User
von Lattice User (Gast)


Lesenswert?

Ich bin jetzt nicht der VHDL Experte aber da kommt mir extrem merkwürdig 
vor.
1
file OUT_DAT : text open write_mode is "output.txt";

write_mode sind normalerweise Dinge wie Anhängen oder Überschreiben.

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


Lesenswert?

Richard Bruchthal schrieb:
> output.txt wird zwar erstellt, aber nichts reingeschrieben.
Kommst du tatsächlich an die Stelle mit writeline()?

Immer einen Blick wert:
http://www.stefanvhdl.com/vhdl/html/file_write.html

von Klaus F. (kfalser)


Lesenswert?

Expert schrieb:
> rein gefühlsmässig muss da noch ein wait rein, bis die Datan
> geschrieben
> sind und beim Hauptprozess einer, damit sichergestellt wird, dass
> gespeichert wird, bevor die Simu "weiterarbeitet".

Auch wenn da Expert steht, ist das kompletter Quatsch (mit oder ohne 
Soße).

von Richy B. (derrichi)


Lesenswert?

Hallo nochmal,

wie es so ist, sind die Sachen an denen man lange hängt, entweder 
wirklich tricky oder einfach nur blöde. Ich konnte es zwar noch nicht 
verifizieren, aber ich glaube mein Problem gehört zur zweiten Kategorie 
(die Idee ist mir ganz klassisch im Halbschlaf gekommen). Ich habe 
zunächst das Dateizeugs eingebaut und als es nicht ging, erstmal so 
weitergemacht. Später mich dann nochmal rangesetzt und nach längerem 
rumprobieren den Thread eröffnet. Jetzt glaube ich aber, dass bei meinem 
letzten Testcase, also der vor dem erneuten ransetzen, die entsprechende 
Fifo gar nicht gefüllt wird. Somit hätte Lothar also recht.

Danke und sorry an alle :-/

von Trundle Trollkönig (Gast)


Lesenswert?

Klaus Falser schrieb:
> Expert schrieb:
>> rein gefühlsmässig muss da noch ein wait rein, bis die Datan
>> geschrieben
>> sind und beim Hauptprozess einer, damit sichergestellt wird, dass
>> gespeichert wird, bevor die Simu "weiterarbeitet".
>
> Auch wenn da Expert steht, ist das kompletter Quatsch (mit oder ohne
> Soße).

Der Typ trollt doch schon seit Wochen hier im Forum rum... Ich finds 
irgendwie lustig! Der kramt auch schon die ganze Zeit uralte Threads 
aus.
Ich glaube sein Vorgehen durchschaut zu haben. Der googlet nach 1-2 
Begriffen bzgl. des Themas und klatscht dann einfach Schlagwörter oder 
Kernsätze (zumindest, was er für wichtige Wörter und Sätze hält) so 
zusammen, das sie scheinbar nen Sinn ergeben!! Aber warum er hier 
weitermacht, versteh ich nicht. Du bist glaube ich der erste... ne sry 
mit dem TO, der zweite der jemals Bezug auf seinen Quatsch genommen hat. 
Ich glaub vor knapp nen Jahr war er schonmal da. Da hat er gleich 
mehrere "Experten" "miteinander" diskutieren lassen... das war irgendwie 
originell!
Tja wenn man sonst nix zu tun hat in der Kaffeepause

von Christian R. (supachris)


Lesenswert?

Vielleicht ist das der gleich wie der "Weltbeste FPGA pongo" der hat 
auch immer mit gut getarntem Halbwissen um sich geworfen...

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


Lesenswert?

Ich habe einen schönen Prozess als Ausgangsvorlage für dich aus einer 
Testbench ausgeschnitten. Dieser Process schreibt die Datenpakete in ein 
Logfile. Das ist sicher genau was du suchst, bzw. einfach an dein FiFo 
Problem adaptierbar.

Bei deinem Code, wird das File mit jeder Taktflanke erneut geöffnet.
1
use std.textio.all;
2
3
....
4
5
    process(PHY_TX_CLK)
6
      file log             : text open write_mode is "ether_tx.txt";
7
      variable trace_line             : line;
8
      variable PHY_TX_EN_D1           : std_logic :='0';
9
      variable counter                 : natural := 0;
10
      
11
    begin
12
      if rising_edge (PHY_TX_CLK) then
13
          if PHY_TX_EN_D1='0' and PHY_TX_EN='1' then
14
            write (log, string'("    new Frame    "));
15
            counter:=0;                  
16
          end if;
17
18
          if PHY_TX_EN = '1' then
19
 
20
            write (trace_line, hstr(PHY_TXD));            
21
          end if;
22
23
          counter:=counter+1;
24
          if counter=8 then 
25
            counter:=0;
26
            writeline(log, trace_line);            
27
          end if;
28
          
29
          if PHY_TX_EN_D1='1' and PHY_TX_EN='0' then
30
            writeline(log, trace_line);                    
31
          end if;          
32
                   
33
34
           PHY_TX_EN_D1:=PHY_TX_EN;
35
        end if;
36
      
37
38
    end process;

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.