Forum: FPGA, VHDL & Co. ModelSim optimiert Signale weg - wie verhindern?


von Markus (Gast)


Lesenswert?

Hallo

ich habe folgendes Problem:
Ich habe eine Design Unit die ich mittels Testbench testen will. Soweit 
steht das alles.

Die Simulation wird über DO-Files (Makros) gesteuert. Die Simulation 
soll terminieren wenn ein Testbench-internes Signal (stop_simulation, 
Typ std_logic) getriggert ist.

Das Problem ist jetzt, dass das Signal beim Compilieren rausoptimiert 
wird und später nicht mehr als solches im Simulator verfügbar ist.

Wie kann ich das unterbinden? Ich habs schon mit Compileswitch -O0 
probiert. Bringt aber leider nichts. Ich will mir auch ungern wilde 
Konstrukte überlegen, die Modelsim irgendwie dazu veranlassen das 
Signal drin zu lassen (und evtl. noch in meine DUT rein spuken).

Geht das irgendwie einfacher?

Vielen Dank schonmal.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> Das Problem ist jetzt, dass das Signal beim Compilieren rausoptimiert
> wird und später nicht mehr als solches im Simulator verfügbar ist.
Machst du eine Verhaltenssimulation oder eine Timingsimulation?

> Die Simulation wird über DO-Files (Makros) gesteuert. Die Simulation
> soll terminieren wenn ein Testbench-internes Signal (stop_simulation,
> Typ std_logic) getriggert ist.
Hast du da mal einen einfachen Sourcecode, der das Verhalten zeigt?

von Markus (Gast)


Lesenswert?

Lothar Miller schrieb:
> Markus schrieb:
>> Das Problem ist jetzt, dass das Signal beim Compilieren rausoptimiert
>> wird und später nicht mehr als solches im Simulator verfügbar ist.
> Machst du eine Verhaltenssimulation oder eine Timingsimulation?
>

Sorry, steh gerade aufm Schlauch. Was meinst du mit Timingsimulation 
genau?

Ich verifiziere das Verhalten. Einmal auf RTL-Ebene (VHDL Code) einmal 
auf Netlist ebene (Back Annotation File nach Synthese).

>> Die Simulation wird über DO-Files (Makros) gesteuert. Die Simulation
>> soll terminieren wenn ein Testbench-internes Signal (stop_simulation,
>> Typ std_logic) getriggert ist.
> Hast du da mal einen einfachen Sourcecode, der das Verhalten zeigt?

Ist n ziemlich großes Teil, aber ich probiers mal:

Ausschnitt aus DO-Makro:
1
[...]
2
run 1 us
3
4
when -label l_break {stop_simulation='1'} { echo "Stop Simulation" stop }
5
[...]

Der Code rennt tatsächlich 1 us und dann terminiert die Simulation 
mit...
1
# ---------Loading std wave  .. 
2
# ** Error: (vsim-3561) No objects found matching 'stop_simulation'.
3
# Error in macro ./dofiles/run_test.do line 25
4
# ** Error: (vsim-3561) No objects found matching 'stop_simulation'.
5
#     while executing
6
# when -label l_break {stop_simulation='1'} { echo "Stop Simulation" stop }

Und wenn ich in der ModelSim GUI nach dem Signal schaue sehe ich auch, 
dass es nicht unter den Objects aufgelistet ist, also rausgeflogen.

Aus Synthesesicht macht das Sinn den das Signal macht im Prinzip nix.
Wird nur am Ende durch ein Flag scharf geschalten.
1
    p_stop : process
2
    begin
3
        stop_simulation <= '0';
4
        wait until (stop_simulation_flag'event and stop_simulation_flag = '1');
5
        stop_simulation <= '1';
6
        wait for 10 ns;
7
        wait;
8
  end process p_stop;

von Karl Könner (Gast)


Lesenswert?

vcom -O0 -norangecheck +acc -work {deineLib} {deinFile}


+acc steuert die Sichtbarkeit von internenen Signalen, die sonst 
wegoptimierten werden ("Enable access to certain objects which might 
otherwise be optimized away.")

MfG,

von Karl (Gast)


Lesenswert?

p_stop : process
    begin
        stop_simulation <= '0';
        wait until (stop_simulation_flag'event and stop_simulation_flag 
= '1');
        stop_simulation <= '1';
        wait for 10 ns;
        wait;
  end process p_stop;



DAS ist aber nichts synthesefähiges.

von Thomas (Gast)


Lesenswert?

Liegt es vlt. daran, dass stop_simulation_flag nirgendwo gesetzt wird... 
dann würde es auch sinn machen stop_simulation wegzuoptimieren.

Ansonsten hab ich die Vermutung, dass der Prozess eh sinnlos ist (sofern 
du nicht irgendwelche komplizierteren Bedingeng für die Beendigung der 
Simulation verwendest/brauchst).

wie wärs mit sowas in der art?
1
  -- clock process
2
  clk_gen_process : process
3
  begin
4
5
    clk <= '0';
6
7
    wait until sim_finish = '0';
8
9
    loop
10
      clk <= not clk;
11
      wait for CLOCK_CYCLE / 2.0;
12
      exit when sim_finish = '1';
13
    end loop;
14
15
    wait;
16
17
  end process clk_gen_process;
18
19
  -- test process
20
  test_process : process is
21
  begin
22
23
    sim_finish <= '0';
24
25
    <Testcases...>
26
27
    sim_finish <= '1';
28
29
    report " END OF TEST" severity note;
30
    wait;
31
    
32
  end process test_process;

von Markus (Gast)


Lesenswert?

Karl Könner schrieb:
> vcom -O0 -norangecheck +acc -work {deineLib} {deinFile}
>
>
> +acc steuert die Sichtbarkeit von internenen Signalen, die sonst
> wegoptimierten werden ("Enable access to certain objects which might
> otherwise be optimized away.")

Vielen Dank! Das werde ich mal ausprobieren.

Karl schrieb:
> p_stop : process
>     begin
>         stop_simulation <= '0';
>         wait until (stop_simulation_flag'event and stop_simulation_flag
> = '1');
>         stop_simulation <= '1';
>         wait for 10 ns;
>         wait;
>   end process p_stop;
>
>
>
> DAS ist aber nichts synthesefähiges.

Schon klar, ist ja auch nur als Simulations-Stop-Signalisierung gedacht. 
Den Sprung bezüglich "Synthesesicht" machte ich nur wegen der 
Optimierung.

Thomas schrieb:
> Liegt es vlt. daran, dass stop_simulation_flag nirgendwo gesetzt wird...
> dann würde es auch sinn machen stop_simulation wegzuoptimieren.
>
> Ansonsten hab ich die Vermutung, dass der Prozess eh sinnlos ist (sofern
> du nicht irgendwelche komplizierteren Bedingeng für die Beendigung der
> Simulation verwendest/brauchst).
>
> wie wärs mit sowas in der art?
>
> [...]

Das stop_simulation_flag wird im Code gesetzt.
Der Sinn hinter dem Prozess ist, den Inhalt der Testcases (es wird viele 
geben) von festen Simulationsteilen zu trennen. Also möglichst wenig 
Simulations-Ablaufsteuerung mit Testcase spezifischem Ablauf 
verwurschteln. Darum der separate Prozess. Am Ende des 
Testcase-Durchlaufs muss dann nur einmal das Flag gesetzt werden. 
Zumindest so der Plan ;-)

Aber falls es doch widererwarten weiter rausoptimiert wird werd ichs mal 
so versuchen.

Komme "leider" erst wieder am Dienstag dazu das zu probieren. Bis dahin 
frohe Ostern :-)

von berndl (Gast)


Lesenswert?

pack das Signal einfach mal in deinen Toplevel als Ausgang, zur Not mit 
'translate_off' und 'translate_on' (heisst, nur fuer Simulation, einfach 
mal googlen). Dann kann niemand das Signal wegoptimieren...

von Markus (Gast)


Lesenswert?

Hallo Zusammen,

habs nun mit Karls Lösung probiert.

Karl Könner schrieb:
> vcom -O0 -norangecheck +acc -work {deineLib} {deinFile}
>

Funktioniert wunderbar. Vielen Dank für alle die mir hier geholfen 
haben!

von Duke Scarring (Gast)


Lesenswert?

berndl schrieb:
> pack das Signal einfach mal in deinen Toplevel als Ausgang, zur Not mit
> 'translate_off' und 'translate_on' (heisst, nur fuer Simulation, einfach
> mal googlen). Dann kann niemand das Signal wegoptimieren...
So mache ich das auch seit geraumer Zeit. Das funktioniert auch sehr 
gut.

Duke

von Andreas (Gast)


Lesenswert?

Hallo,

in meinen Designs verhindere ich die Optimierungen zur Compilezeit mit 
dem parameter +acc=v und zusätzlich lässt sich die Simulation mit dem 
Argument -novopt starten, dass ebenfalls Optimierungen verhinern soll.

Viele Grüße
Andreas

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.