ModelSim: Simulation kontrolliert beenden

OP #1073039
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?
#1073068
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....
Gast #1073098
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
Gast #1073207
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
OP #1073295
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.
Gast #1074202
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren