Forum: FPGA, VHDL & Co. Testbench / PROCEDURE


von Markus F. (mfro)


Lesenswert?

Hallo allerseits,

mal wieder bei der Umsetzung eines Verilog DDR2-Modells in VHDL.

Da hab' ich mir selbst ein Bein gestellt. Im Verilog-Modell waren 
mehrere tasks, die ich als PROCEDURE "übersetzt" habe, ohne dabei zu 
realisieren, daß diese Tasks Signale aus dem Toplevel der Testbench 
setzen müssen.

Das geht natürlich nur, wenn die PROCEDURE innerhalb eines PROCESS 
definiert ist.

So funktioniert's dann auch:
1
init_proc : PROCESS
2
   PROCEDURE init IS
3
   BEGIN
4
      ...
5
   END init;
6
BEGIN
7
   WAIT UNTIL rising_edge(clk);
8
9
   IF r /= '0' THEN
10
      init;
11
      r <= '0';
12
   END IF;
13
END PROCESS;

Das scheint auch so zu funktionieren. Bloß: "schön" ist anders - anstatt 
einfach die Prozedur aufzurufen, muß ich nun an "r" wackeln, zusätzlich 
das Ding kopieren, wenn ich's in mehreren Prozessen brauche. Irgendwie 
nicht so, wie ich mir das gedacht habe.

Gibt's 'ne "schönere" Möglichkeit?

Danke!

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


Lesenswert?

Markus F. schrieb:
> daß diese Tasks Signale aus dem Toplevel der Testbench setzen müssen.
Wie ist das gemeint? Und warum sollte das eine Procedure nicht können?

: Bearbeitet durch Moderator
von Markus F. (mfro)


Lesenswert?

Lothar Miller schrieb:
> Markus F. schrieb:
>> daß diese Tasks Signale aus dem Toplevel der Testbench setzen müssen.
> Wie ist das gemeint? Und warum sollte das eine Procedure nicht können?

Da war ich wohl ein bißchen zu knapp mit meiner Fragestellung, sorry. Es 
handelt sich um ein - ursprünglich von Micron in Verilog geschriebenes - 
DDR2-Modell, das ich gerne als VHDL in meine Testbench einhängen würde. 
So hätt' ich's gern gehabt:
1
-- stark verkürzt
2
3
ENTITY ddr2 IS
4
   ...
5
END ENTITY ddr2;
6
7
ARCHITECTURE Behaviour OF ddr2 IS
8
   SIGNAL s1  : INTEGER;
9
   SIGNAL s2  : INTEGER;
10
11
   PROCEDURE init IS
12
   BEGIN
13
      s1 <= 0;      -- setzt Signale der ARCHITECTURE
14
      s2 <= 0;
15
   END init;
16
BEGIN
17
   init;
18
19
   -- "Rest" des DDR2-Modells
20
   ...
21
END Behaviour;

Quartus frißt das klaglos, aber ModelSim meckert:

# Error: ... : Cannot drive signal "s1" from procedure "init".

und besteht darauf, daß PROCEDUREs, die externe Signale setzen, 
innerhalb eines PROCESS definiert und aufgerufen werden - dann tut's 
(gefällt mir aber aus den o.g. Gründen nicht).

von Sigi (Gast)


Lesenswert?

Das mit Signalen und Prozeduren ist komplizierter als
in den meissten Büchern beschrieben.

Dein Problem hängt damit zusammen, dass in einer Prozedur
bzw. in den Subprozeduren potenziell Signal-Attribute beim
Zugriff verwendet werden können, Xilinx' ISE bzw. ISIM
ignoriert das (XSIM dagegen nicht!), ModelSIM hält sich an
die VHDL-Specs (QuartusII akzeptiert es auch, Diamond
ebenfalls?).

Du kannst das Problem glaube ich umgehen, indem du
in einer Prozedur nur auf Signale zugreifst, die in
der Prozedurausrufliste stehen. Bei dir also nicht auf
S1 bzw. S2 zugreifen oder dein INIT in
INIT(signal S1 : inout std_logic; ...) ...
änderst, Aufruf dann entsprechend.

von Markus F. (mfro)


Lesenswert?

Sigi schrieb:
> Bei dir also nicht auf
> S1 bzw. S2 zugreifen oder dein INIT in
> INIT(signal S1 : inout std_logic; ...) ...
> änderst, Aufruf dann entsprechend.

Danke.

Das Problem hab' ich (u.A. dank Google-Nachhilfe) schon verstanden, 
bloß:

schöner wird's davon leider auch nicht ;). Ich muß entweder alle 
Signale, die gesetzt werden sollen (das sind an die 100) in die 
Parameterliste packen oder das Ding (mit den damit verbundenen 
Einschränkungen) in einem Prozeß definieren und dort aufrufen.

Meine Frage war, ob's nicht vielleicht doch einen Trick gibt, den ich 
noch nicht probiert bzw. gefunden habe ;).

Die Reset-Task des Modells (die genauso aussieht) war insofern kein 
Problem, als daß die nur an einer Stelle gebraucht wird (da ist das mit 
dem Prozeß kein Ding), "init" wird aber mehrfach aufgerufen und dafür 
such' ich eine "schöne" Lösung.

von Duke Scarring (Gast)


Lesenswert?

Markus F. schrieb:
> alle
> Signale, die gesetzt werden sollen (das sind an die 100) in die
> Parameterliste packen
Vielleicht kannst Du Dir mit records das Leben etwas leichter machen.

Duke

von Lattice User (Gast)


Lesenswert?

Kann dein Simulator VHDL 2008?

Wenn ja, helfen dir eventuell hierarchische Namen weiter:

https://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_ease/#hierarchicalnames

von MarioStinkt (Gast)


Lesenswert?

>Es handelt sich um ein - ursprünglich von Micron in Verilog geschriebenes -
>DDR2-Modell, das ich gerne als VHDL in meine Testbench einhängen würde.

Oh je, wer macht denn sowas?

Besorg dir lieber einen Mixed-Mode-Simulator.

von Markus F. (mfro)


Lesenswert?

MarioStinkt schrieb:
> Oh je, wer macht denn sowas?

ich.

Das hat mir mehr über VHDL beigebracht als all meine kläglichen Versuche 
zuvor. Mittlerweie bin ich gar nicht mehr böse, daß Modelsim-Altera 
keine Mixed-Mode Simulation kann und ein (fast fertiges) DDR2 Modell 
hab' ich auch...

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Ich finde Dein Vorhaben gut. Ich habe damals gekniffen und habe für die 
DDR2-Simulation ISIM verwendet.

Duke

von berndl (Gast)


Lesenswert?

jemand wie ich, der @home nur GHDL verwendet, waere auch ganz froh um 
ein DDR2-Modell in VHDL. Ich mag den ISIM einfach nicht!

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.