Forum: FPGA, VHDL & Co. ModelSim: Simulation kontrolliert beenden


von Martin K. (mkohler)


Lesenswert?

Hallo,

Ich simuliere meine Designs mit ModelSim XE III/Starter 6.2g

Dabei habe ich das Problem, dass ich eine laufende Simulation nicht 
wirklich sauber beenden kann.
Bisher habe ich immer am Ende der Kontrollsignale eine solche Zeile 
eingefügt:
1
assert false report "Ende control signals" severity failure;

Dies führt zwar zum gewünschten Resultat (Simulation wird beendet), ist 
aber nicht wirklich sauber.

Gibt es da eine elegantere Möglichkeit?

von Klaus F. (kfalser)


Lesenswert?

Soviel ich weiss, ist die einzige Methode, mit der die Simulation 
wirklich "sauber" aufhört, keine Events mehr zu erzeugen.
Das heißt, man muß den Takt beenden und auch von außen keine Taktflanken 
mehr anliegen.
Ob es jemand wirklich so macht weiss ich nicht, ich jedenfalls nicht.
Meine Befürchtung war immer die, dass der Taktgenerator der am 
häufigsten aufgerufene Prozess ist, und deshalb die Simulation gebremst 
wird, aber eigentlich ist das ein Blödsinn....

von SuperWilly (Gast)


Lesenswert?

Alternative:

Man definiert sich ein Testbench-Signal

signal sim_status : string (1 to 10) := "INITIAL ";


Wenn die Simulation beendet werden soll, wird das Signal geändert, 
bspw.:

sim_status <= "FINISHED";


In einem do-Skript könnte man dieses Signal abfragen:

when {/sim_status == "FINISHED"} {
echo "@ t= $now ENDE der Simulation"
quit -f

von Duke Scarring (Gast)


Lesenswert?

Bei mir sieht es ungefähr so aus:
1
  signal running: boolean := true;
2
3
  ...
4
5
  clk <= not clk after t_period/2 when running;
6
7
  ...
8
  
9
  control_simulation: process
10
  begin
11
12
    wait for whatever;
13
14
    running <= false;
15
    wait;
16
  end process;


Duke

von Martin K. (mkohler)


Lesenswert?

Danke für die Antworten.

Ich habe jetzt ein separates Signal "simulation_running" eingefügt, 
welches ich am Ende der Tests auf 0 setzt.
Dadurch setze ich den Clock Process und einen weiteren Generator Process 
auf "wait", so dass keine weiteren Events mehr entstehen.
Die Simulation hört nun wie gewünscht auf zu laufen.

Ob das der "saubere" Weg ist - keine Ahnung ;-)

PS: zuerst hat es mich "erwischt", weil simulation_running ganz zu 
Beginn der Simulation noch undefiniert war und somit der Clock gar nie 
zum Laufen kam.

von Matthias (Gast)


Lesenswert?

@Klaus Falser: Mein Kollege hat hier eine Lösung eingebracht, bei der 
ein Prozess die Clock erzeugt und das beendet sobald ein Signal auf eins 
geht. Das schaut dann ungefähr so aus:
1
  gen_clk : process is
2
  begin  -- process
3
    loop
4
      MainClock    <= '0';
5
      wait for clock_low_time;
6
      MainClock    <= '1';
7
      wait for clock_high_time;
8
      exit when simulation_finished;
9
    end loop;
10
    wait;
11
  end process;

wobei die Konstanten und Signale natürlich woanders definiert sind. Das 
funktioniert auch recht gut und gibt (wenigstens in der Theorie) den 
Vorteil, dass kombinatorische Schleifen, die auch ohne Takt noch Events 
erzeugen, entdeckt werden können.

von Matthias (Gast)


Lesenswert?

Grmpf, ich sollte so Threads bis zum Ende lesen, sorry, mein Fehler.

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.