Forum: FPGA, VHDL & Co. Testbench via .txt Datei parametrieren - erneutes compilieren überflüssig?


von Alex (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine recht umfangreiche Testbench, mit der ich mein Design im 
Modelsim simuliere.

Bisher habe ich immer mit dem .do Dateien gearbeitet und/oder kleine 
änderungen direkt mit dem vcom Befehl in der work-Lib aktualisiert.

Nun habe ich zahlreiche Steuersignale im Testbench, deren Wert im Laufe 
der Simulation konstant ist. Nehmen wir als Bsp. die Zählrichtung eines 
Counters... Hoch = 1, Runter = 0.

Nun muss ich meine testbench.vhd immer wieder neu compilieren, wenn ich 
die Zählrichtung ändern will. Das bedarf also der Änderung im Testbench, 
dann dem vcom Befehl im Modelsim, einem restart und einem erneuten 
run-Befehl.

Kann ich die Zählrichtung nun auf ein Signal legen und den Zustand des 
Signales aus einer .txt Datei auslesen?
Das sich dieser Wert dann im Laufe der Simulation nicht ändern kann, ist 
mir bewusst, es geht wirklich nur um statische Steuersignale, die ich 
mit Zeitersparnis ändern möchte und so verschiedene Szenarien 
durchspielen könnte.

Wenn ich nun meinetwegen einen Parameter in der .txt Datei ändere und 
die Simulation erneut starte, wird dieser Wert dann auch aktualisiert? 
Oder werden die Werte für die Steuersignale nur beim Compilieren aus der 
Datei gelesen und ich habe maximal den Vorteil, dass ich alle Parameter 
(auch verschiedener Blöcke) übersichtlich in einer txt zusammenfassen 
kann?

Wie die Sache mit der TEXTIO funktioniert, muss ich mich belesen. Ich 
wollte nur erstmal prinzipiell abklären, ob das vielleicht vertane Zeit 
wäre.

Vielen Dank!
Alex

von Christian R. (supachris)


Lesenswert?

Wenn du die Daten (Stimuli) aus einer Datei liest, musst du den 
Quellcode der Testbench nicht ändern. Das ist ja gerade einer der 
Vorteile dieser Vorgehensweise.

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


Lesenswert?

Die Testbench muss die Datei lesen. Textio ist der richtige Ansatz.

Sehr schöne Beschreibung:
http://www.stefanvhdl.com/vhdl/html/file_read.html

von Alex (Gast)


Lesenswert?

Vielen Dank für die Antworten!

Um mal konkret zu werden:
- Ich setze in der txt meine Parameter (z.B. Zählrichtung = 1) und 
speichere.
- Ich compiliere mit vcom meine vhds in meine Lib.
- Ich starte meine Simulation mit run 100us und bekomme als Ausgabe 0, 
1, 2, 3, 4, 5, ...
- Die Simulation ist bei 100us zu Ende.
- Ich ändere die txt Datei und speichere erneut ((z.B. Zählrichtung = 
0).
- Ich starte meine Simulation mit run 100us und bekomme als Ausgabe ..., 
5, 4, 3, 2, 1, ...

Ist diese Vorgehensweise im Modelsim und der TEXTIO so möglich?
Die Simulation wird also direkt mit geänderten Stimuli und ohne erneutes 
kompilieren fortgesetzt?

Dann werde ich mir die Sache mal genauer anschauen :)

Vielen Dank!
Alex

von Erwin (Gast)


Lesenswert?

für das ganze braucht man nichtmal ein ein TextIO, ich definiere mehrere 
Testsvektoren in einem Array und lasse sie dann im Stimuli Process 
durchlaufen
1
ARCHITECTURE testbench OF tb_XXXXXXXX IS 
2
 
3
    -- Component Declaration for the Unit Under Test (UUT)
4
 
5
    COMPONENT XXXXXXXXX
6
    PORT(
7
         clk : IN  std_logic;
8
         rst : IN  std_logic;
9
         ena : IN  std_logic;
10
         data : OUT  std_logic_vector(23 downto 0);
11
         preview_last : OUT  std_logic
12
        );
13
    END COMPONENT;
14
    
15
16
   --Inputs
17
   signal clk : std_logic := '0';
18
   signal rst : std_logic := '0';
19
   signal ena : std_logic := '0';
20
21
   --Outputs
22
   signal data : std_logic_vector(23 downto 0);
23
   signal preview_last : std_logic;
24
25
   -- Clock period definitions
26
   constant clk_period : time := 10 ns;
27
  
28
    -- Internal
29
  type Feldelement is array (0 to 1) of integer;
30
  type FeldTyp0 is array (0 to 9) of Feldelement;
31
  constant FeldA : FeldTyp0 := (
32
    (1, 1),                         -- Ena für 1 Takt aktiv
33
    (0, 4),                        -- Ena für 10 Takte aussetzen
34
    (1, 1),                         -- Ena für 1 Takte aktiv
35
    (0, 4),                        -- Ena für 10 Takte aussetzen
36
    (1, 1),                         -- Ena für 1 Takt aktiv
37
    (0, 4),                         -- Ena für 10 Takte aussetzen
38
    (1, 1),                         -- Ena für 1 Takt aktiv
39
    (0, 4),                         -- Ena für 10 Takte aussetzen
40
    (1, 1),                         -- Ena für 1 Takt aktiv
41
    (0, 4)                         -- Ena für 10 Takte aussetzen
42
  );
43
 
44
BEGIN
45
 
46
  -- Instantiate the Unit Under Test (UUT)
47
   uut: XXXXX PORT MAP (
48
          clk => clk,
49
          rst => rst,
50
          ena => ena,
51
          data => data,
52
          preview_last => preview_last
53
        );
54
55
   -- Clock process definitions
56
   clk_process :process
57
   begin
58
    clk <= '0';
59
    wait for clk_period/2;
60
    clk <= '1';
61
    wait for clk_period/2;
62
   end process;
63
 
64
65
     -- Stimulus process
66
  stim_proc : process
67
  begin
68
    rst <= '1';
69
    ena <= '0';
70
    wait for clk_period * 5;
71
72
    -- Stimulimuster anwenden
73
    for i in 0 to FeldA'length - 1 loop
74
      rst <= '0';
75
      ena <= to_unsigned((FeldA(i)(0)), 1)(0);
76
      wait for clk_period * FeldA(i)(1);
77
    end loop;
78
79
    -- Jetzt nochmal prüfen ob dasselbe auch nach einem neuen Reset
80
    -- funktioniert
81
    rst <= '1';
82
    wait for clk_period * 3;
83
    -- Stimulimuster anwenden
84
    for i in 0 to FeldA'length - 1 loop
85
      rst <= '0';
86
      ena <= to_unsigned((FeldA(i)(0)), 1)(0);
87
      wait for clk_period * FeldA(i)(1);
88
    end loop;
89
90
    wait;
91
  end process;
92
93
END;

von Alex (Gast)


Lesenswert?

Hallo un Danke!
Dieses Vorhaben kann man sicher auch auf vielen anderen Wegen 
abarbeiten.
Aber mit einem festen Vorgang in der Stimuli muss man schon im Vorfeld 
wissen, was genau man testen will. Das ist in der Regel der Fall, aber 
wenn man mal etwas übersehen hat und diese und jene Kombination nochmal 
testen will, ist es eben nicht schlecht eine Lösung zu haben, mit der 
man schnell und einfach die Stimuli ändern kann, ohne gleich das ganze 
Design nochmal durch den Compiler laufen zu lassen.

René D. schrieb:
> Die Testbench muss die Datei lesen. Textio ist der richtige Ansatz.
> Sehr schöne Beschreibung:
> http://www.stefanvhdl.com/vhdl/html/file_read.html
Ich habe mir die Seite angesehen und es ist wirklich schön und schnell 
beschrieben, schöner Einstieg.

Leider wird nicht darauf eingegangen, wie man Kommentare verfasst und 
wie es auszusehen hat, wenn man Klartext zur Beschreibung der Stimuli 
verwenden möchte und die dann beim Auslesen ignoriert werden.

Außerdem ist das Design bei mir so nicht simulierbar.
Wenn ich im Modelsim den Optimierer anlasse, kann ich das Design 
simulieren, aber dann existiert EOG nicht mehr - keine Ahnung warum.
Wenn ich den Optimierer auschalte "Disable optimizations by using -O0" 
dann bringt mir der Simulator einen Fehler:
1
# ** Fatal: (vsim-3633) Index range 4 downto 0 is not compatible with index subtype (1 to 2147483647) of std.standard.string.
2
#    Time: 0 ps  Iteration: 0  Instance: /tb_file_read File: TB_FILE_READ.vhd Line: 25
3
# FATAL ERROR while loading design

Da ich zum ersten Mal mit den Typ string arbeite, fällt es mir gerade 
schwer herauszufinden, wo genau das Problem liegt. Hier der scheinbar 
kritische Part in der vhd:
1
component FILE_READ 
2
  generic (
3
           stim_file:       string  := "sim.dat"
4
          );
5
  port(
6
       CLK              : in  std_logic;
7
       RST              : in  std_logic;
8
       Y                : out std_logic_vector(4 downto 0);
9
       EOG              : out std_logic
10
      );
11
end component;
12
13
signal rst:  std_logic;                    -- Zeile 25
14
signal clk:  std_logic := '0';
15
signal eog:  std_logic;
16
signal y:    std_logic_vector(4 downto 0);

Hat jemand eine Idee, wieso mir die Simulation ohne Optimierung nicht 
gelingen will? Oder ist der vorgegebene VHDL Code unsauber und/oder 
fehlerhaft?

Vielen Dank!
Alex

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


Lesenswert?

Ich kenne Modelsim nicht weiter. Sehr gute Auskunkft.
In GHDL liefen die Beispiele  ohne Problem. Schon eine Weile her. Da hat 
sich aber nichts geändert.


Hast du die richtigen Libs eingebunden?

von Alex (Gast)


Lesenswert?

Hallo,
René D. schrieb:
> Hast du die richtigen Libs eingebunden?
Ja das habe ich. Ich denke sonst würde auch schon der Compiler meckern 
und nicht erst der Simulator.

Ich habe es gerade nochmal mit dem -vopt Zusatz im Modelsim versucht und 
die Optimierung abgeschaltet, auch hier wird EOG wieder 
wegrationalisiert...

Sehr komisch... aber ich suche mal weiter, vielleicht kann ich das 
Problem ja alleine lösem.

Vielen Dank!

von Alex (Gast)


Lesenswert?

Alex schrieb:
> Ich habe es gerade nochmal mit dem -vopt Zusatz im Modelsim versucht und
> die Optimierung abgeschaltet, auch hier wird EOG wieder
> wegrationalisiert...

Mit
1
vcom -novopt -t 1ps tb_file_read
funktioniert es. EOG ist wieder da...

Dabei muss aber die Option im Compiler "Disable optimizations by using 
-O0" abgewählt bleiben.

Also gibt es jetzt eine Lösung für Modelsim, aber ich kann es mir immer 
noch nicht erklären.

Danke dennoch!

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.