ModelSim optimiert Signale weg - wie verhindern?

Gast #3106747
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.
Moderator (Firma: Titel) Persönliche Seite #3106751
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?
Gast #3106768
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;
Gast #3106784
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,
Gast #3106814
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.
Gast #3106838
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;
Gast #3107765
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 :-)
Gast #3107878
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...
Gast #3112346
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
Gast #3112476
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

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