Forum: FPGA, VHDL & Co. Simulation oder Synthese?


von dito (Gast)


Lesenswert?

Hallo,

ich möchte gerne in VHDL ein Signal setzen. Für Simulation und Synthese 
soll aber jeweils ein anderer Wert gesetzt werden.

Geht das? Bzw. wie kann ich in VHDL herausfinden, ob ich mich gerade in 
der Simulation oder in der Synthese befinde?

MfG

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


Lesenswert?

dito schrieb:
> ich möchte gerne in VHDL ein Signal setzen. Für Simulation und Synthese
> soll aber jeweils ein anderer Wert gesetzt werden.
Warum?
Was willst du mit sowas denn eigentlich erreichen?

von Duke Scarring (Gast)


Lesenswert?

Ich mache das, damit z.B. mein Softcore in der Simulation ein paar 
lange/langweilige Initialisierungen wegläßt und gleich in sein 
Testprogramm springt.

Genausogut, kann man damit einen UART schneller laufen lassen, damit man 
schneller was sieht:
1
    function simulation_active return std_ulogic is
2
        variable result : std_ulogic;
3
    begin
4
        result := '0';
5
        -- pragma translate_off
6
        result := '1';
7
        -- pragma translate_on
8
        return result;
9
    end function simulation_active;
10
    
11
    -- ...
12
13
    gpio.data_in(31)           <= simulation_active;

Duke

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Wie Duke Scarring schon sagt.
Hier zum Bsp. die I2C Baudrate in der Simu beschleunigen:
1
  constant TCM8230MD_I2C_BAUD : natural := 400000
2
-- synthesis translate_off
3
                                           *10
4
-- synthesis translate_on
5
;

Auch schön:

Zuerst die Konstante SIMULATION deklarieren:
1
  --! This constant provides a means to differ between simulation and synthesis.
2
  --! When simulation is active, the constant SIMULATION is TRUE. During
3
  --! synthesis, SIMULATION is FALSE.
4
  constant SIMULATION : boolean := false
5
-- synthesis translate_off
6
                                   or true
7
-- synthesis translate_on
8
;
Nun einen Typ für ein Array mit 2 std_logic_vector(7 downto 0) Elementen 
anlegen:
1
  type     config_reg3_array is array (0 to 1) of std_logic_vector(7 downto 0);
Und nun eine Konstante dieses Typs erzeugen, die in Element 0 die Werte 
für die Synthese, und in Element 1 die Werte für die Simulation entrhält
1
  constant REG_3_ARRAY : config_reg3_array :=
2
    (0           =>
3
     (
4
       CM        => CM_BLACKWHITE,
5
       --PICFMT    => PICFMT_RGB,
6
       PICFMT    => PICFMT_YUV,
7
       PICSIZ    => PICSIZ_VGA,
8
       --PICSIZ    => PICSIZ_QCIF_f,       
9
       DATAHZ    => DATAHZ_OUT,
10
       DATAOUTSW => DATASW_ON
11
       ),
12
     1           =>
13
     (
14
       --CM        => CM_COLOR,
15
       CM        => CM_BLACKWHITE,
16
       --PICFMT    => PICFMT_RGB,
17
       PICFMT    => PICFMT_YUV,
18
       --PICSIZ    => PICSIZ_SUBQCIF_z,
19
       PICSIZ    => PICSIZ_SIMULATION,
20
       DATAHZ    => DATAHZ_OUT,
21
       DATAOUTSW => DATASW_ON
22
       ));
Eine Funktion übernimmt die Wandlung von boolean nach integer.
1
  function to_integer_f (constant bool : boolean) return integer;
2
3
  -- Converts a boolean value to an integer.
4
  function to_integer_f (constant bool : boolean) return integer is
5
  begin
6
    case bool is
7
      when true =>
8
        return 1;
9
      when others =>
10
        return 0;
11
    end case;
12
    return 0;
13
  end;
... und zuallerletzt wird, in Abhängigkeit von SIMULATION = true/false, 
automatisch eine Konstante initialisiert:
1
  -- Choose the appropiate setting, depending on SIMULATION = true/false
2
  constant REG_3 : config_reg3_t := REG_3_ARRAY(to_integer_f(SIMULATION));

von Klaus (Gast)


Lesenswert?

Noch schöner gehts mit VHDL 2008: Da kann man mit den so genannten 
"Hierarchical names" aus der Testbench heraus direkt die entsprechenden 
Signale in seinem Design überschreiben. Dadurch hat man keinen 
Simulationscode im eigentlichen Design, sondern kann alles 
zusammengefasst in die Testbench schreiben.

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Klaus schrieb:
> Noch schöner gehts mit VHDL 2008: Da kann man mit den so genannten
> "Hierarchical names" aus der Testbench heraus direkt die entsprechenden
> Signale in seinem Design überschreiben. Dadurch hat man keinen
> Simulationscode im eigentlichen Design, sondern kann alles
> zusammengefasst in die Testbench schreiben.
Ich erkenne den Zusammenhang mit der Frage nicht...

von dito (Gast)


Lesenswert?

Danke Leute! Ich werde das so machen wie Duke Scarring. Genau das habe 
ich gesucht.

von Klaus (Gast)


Lesenswert?

Heinrich H. schrieb:
> Ich erkenne den Zusammenhang mit der Frage nicht...

Das ist schade für dich, ändert aber nicht an der Korrektheit meiner 
Antwort ;-)

Also nochmal anders formuliert: Es ging darum eine Variable (oder 
Signal, oder was auch immer) in der Simulation mit einem anderen Wert zu 
versehen, also bei der Synthese. Dazu kann man den Synthese-Wert ganz 
normal ins Design schreiben. Für die Simulation wird dieser Wert einfach 
aus der Testbench heraus mit einem anderen Wert überschrieben. Dies ist 
unter VHDL 2008 möglich, da man über hierarchische Signalnamen direkt 
auf Signale untergeordneter Module zugreifen kann, obwohl die Signal auf 
der oberen Ebene eigentlich gar nicht sichtbar wären. Und man kann nicht 
nur einfach lesend drauf zugreifen, man kann den Wert des Signal 
überschreiben.

von Klaus (Gast)


Lesenswert?

Mist, Korrektur:

Klaus schrieb:
> in der Simulation mit einem anderen Wert zu
> versehen, als bei der Synthese

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


Lesenswert?

>> Dadurch hat man keinen Simulationscode im eigentlichen Design,
>> sondern kann alles zusammengefasst in die Testbench schreiben.
> Ich erkenne den Zusammenhang mit der Frage nicht...
Naja, die Originalaufgabe war ja:
>>>> Für Simulation und Synthese soll aber jeweils ein anderer Wert
>>>> gesetzt werden.
Wenn in der Synthese ein Signal statisch anders gesetzt wird, dann wird 
das (hoffentlich) irgendwie rausoptimiert. Und deshalb ist es in jedem 
Fall der bessere Weg, die Beschriebung für die Synthese "korrekt und 
konsistent" zu halten, und irgendwelche Simulationstricks "aussen rum" 
zu basteln.

EDIT: zu spät... ;-)

von dito (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wenn in der Synthese ein Signal statisch anders gesetzt wird, dann wird
> das (hoffentlich) irgendwie rausoptimiert. Und deshalb ist es in jedem
> Fall der bessere Weg, die Beschriebung für die Synthese "korrekt und
> konsistent" zu halten, und irgendwelche Simulationstricks "aussen rum"
> zu basteln.

Genau das war auch meine Absicht... ;-)

von berndl (Gast)


Lesenswert?

mich wundert, dass noch niemand GENERICS im Toplevel und darunter 
erwaehnt hat...
Einfach in der TB die GENERICS anders setzen und gut ists

von Christian R. (supachris)


Lesenswert?

Echt mal, einfach einen Generic. Du kannst bei XST sogar gleich den Wert 
der Generics mit angeben. Wird ja auch beim MGT beispielsweise so 
gemacht, um die lange Init- und Reset-Sequenz für die Simulation 
abzukürzen.

von Duke Scarring (Gast)


Lesenswert?

Wie man sieht, viele Wege führen nach Rom (oder Athen?).

Die reine Lehre den Simulationscode getrennt vom Synthesecode zu halten, 
habe ich auch einmal verfolgt. Aber spätestens bei einem komplexen 
Design, wo man sich mal ein paar Zwischenergebnisse in einer Datei 
mitloggen möchte (Filterausgang, Instruction o.ä.) will ich nicht mehr 
alles über's Toplevel nach draußen führen. Da werden dann Instanzen 
belästigt, die nix damit zu tun haben. Ich weiß, es gibt Lösungen dafür: 
Modelsim-Signalspy (fällt, aus, da proprietär) und die erwähnten 
deep-names in VHDL-2008 (noch relativ jung). Ein global-package wäre 
auch noch eine Variante, die aber auch nicht wirklich elegant ist.

Deshalb kommt ein Teil des Simulationscode mit in den Synthesecode und 
gut ist.

Schönes Wochenende!
Duke

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Duke Scarring schrieb:
> Schönes Wochenende!
> Duke

Ebenso.

von dito (Gast)


Lesenswert?

berndl schrieb:
> mich wundert, dass noch niemand GENERICS im Toplevel und darunter
> erwaehnt hat...

An Generics habe ich schon gedacht. Nur wollte ich diese nicht durch 
alle Hierachien des Designs (von TB zu betreffender Komponente), wenn 
ich es genauso mit einer Anweisung (wie Duke oben beschrieben lösen 
kann).

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

dito schrieb:
> berndl schrieb:
>> mich wundert, dass noch niemand GENERICS im Toplevel und darunter
>> erwaehnt hat...
>
> An Generics habe ich schon gedacht. Nur wollte ich diese nicht durch
> alle Hierachien des Designs (von TB zu betreffender Komponente), wenn
> ich es genauso mit einer Anweisung (wie Duke oben beschrieben lösen
> kann).

Das ist eine Schwäche von VHDL. Bei größeren Designs von Vorteil, dass 
es kein Chaos gibt.

Ich hätte auch manchmal auch gerne ein paar Möglichkeiten, die in 
objektorientierten Programmiersprachen gibt.

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.