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
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.
Die Testbench muss die Datei lesen. Textio ist der richtige Ansatz. Sehr schöne Beschreibung: http://www.stefanvhdl.com/vhdl/html/file_read.html
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
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; |
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
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.