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.
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
ARCHITECTUREtestbenchOFtb_XXXXXXXXIS
2
3
-- Component Declaration for the Unit Under Test (UUT)
4
5
COMPONENTXXXXXXXXX
6
PORT(
7
clk:INstd_logic;
8
rst:INstd_logic;
9
ena:INstd_logic;
10
data:OUTstd_logic_vector(23downto0);
11
preview_last:OUTstd_logic
12
);
13
ENDCOMPONENT;
14
15
16
--Inputs
17
signalclk:std_logic:='0';
18
signalrst:std_logic:='0';
19
signalena:std_logic:='0';
20
21
--Outputs
22
signaldata:std_logic_vector(23downto0);
23
signalpreview_last:std_logic;
24
25
-- Clock period definitions
26
constantclk_period:time:=10ns;
27
28
-- Internal
29
typeFeldelementisarray(0to1)ofinteger;
30
typeFeldTyp0isarray(0to9)ofFeldelement;
31
constantFeldA: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:XXXXXPORTMAP(
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
waitforclk_period/2;
60
clk<='1';
61
waitforclk_period/2;
62
endprocess;
63
64
65
-- Stimulus process
66
stim_proc:process
67
begin
68
rst<='1';
69
ena<='0';
70
waitforclk_period*5;
71
72
-- Stimulimuster anwenden
73
foriin0toFeldA'length-1loop
74
rst<='0';
75
ena<=to_unsigned((FeldA(i)(0)),1)(0);
76
waitforclk_period*FeldA(i)(1);
77
endloop;
78
79
-- Jetzt nochmal prüfen ob dasselbe auch nach einem neuen Reset
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.
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
componentFILE_READ
2
generic(
3
stim_file:string:="sim.dat"
4
);
5
port(
6
CLK:instd_logic;
7
RST:instd_logic;
8
Y:outstd_logic_vector(4downto0);
9
EOG:outstd_logic
10
);
11
endcomponent;
12
13
signalrst:std_logic;-- Zeile 25
14
signalclk:std_logic:='0';
15
signaleog:std_logic;
16
signaly:std_logic_vector(4downto0);
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!