ModelSim: Simulation kontrolliert beenden

OP #1073039
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
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
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
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
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
@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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.