Forum: FPGA, VHDL & Co. vhdl sim: procedure in procedure aufrufen, geht das?


von berndl (Gast)


Lesenswert?

Hallo zusammen,

also ich stehe gerade voll auf dem Schlauch... Folgendes Problem:
* Simulation mit GHDL
* Ich hab' 'ne TB, in der ich eine 'procedure' aufrufe, die mir ein SR 
via SPI an ein Modul schickt und die empfangenen Daten in einem weiteren 
SR liefert. Das funktioniert wunderpraechtig

Jetzt moechte ich einige der in der TB beschriebenen Sequenzen in eine 
procedure in ein Package auslagern (damits uebersichtlicher wird). Damit 
rufe ich die o.g. 'procedure' aus einer anderen procedure auf.

Und das tut hier nicht, ich kriege nur 'U' in meinem Empfangsregister 
zurueck... Der Code ist m.M. nach der gleiche wie vorher in der TB. Ich 
'sehe' in gtkwave, dass die SPI Signale richtig an mein DUT rausgehen, 
und ich sehe auch, dass die richtigen Daten aus dem DUT rausgehen.

Hier mal der komplett runtergestrippte Code der procedure:
1
   procedure test_spi (signal nCS : out std_logic;
2
                       signal SCK : out std_logic;
3
                       signal MOSI : out std_logic;
4
                       signal MISO : in std_logic
5
                      ) is
6
               variable spi_in : std_logic_vector (31 downto 0) := (others => '0');
7
               variable spi_out : std_logic_vector (31 downto 0) := (others => '0');
8
   begin
9
      spi_in := x"B500_0000";
10
      cmd_spi_proc (spi_in, spi_out, nCS, SCK, MISO, MOSI);
11
      assert spi_out (31 downto 27) = "ZZZZZ"
12
         report "return data (31..27) is not high-Z!" severity failure;
13
      assert spi_out (26 downto 0) /= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
14
         report "SPI return data (26..0) is high-Z!" severity failure;
15
   end test_spi;

und die GHDL Fehlermeldung:
1
...:(assertion failure): SPI return data (26..0) is high-Z!
2
...:error: assertion failed
3
...:error: simulation failed
4
/usr/lib/ghdl/bin/ghdl: compilation error

Wie gesagt, wenn ich obigen Code direkt in die TB setze, dann 
funktioniert das. Es muesste also was mit 'call procedure within a 
procedure' zu tun haben...

Vlt. hat ja jemand lange Weile uebers WE und liesst das und hat 'nen 
Tipp :o)

von berndl (Gast)


Lesenswert?

oh Mann, vergesst das da oben...

ich hab' nochmal im Code rumgefuhrwerkt, jetzt tut es. Warum es jetzt 
tut weiss ich noch nicht, ich habe jetzt auch keine Lust mehr und schaue 
mir das die Tage mal genauer an (der Tag war wohl wirklich zu lang...).

Aber: Man kann in VHDL Prozeduren aus Prozeduren aufrufen. Es haette 
mich auch gewundert wenn's anderst waere...

Schoenes WE allen!

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


Lesenswert?

Natürlich kann man in Funktionen (oder Prozeduren) wieder Funktionen 
(und Prozeduren) aufrufen, denn schon die Konvertierung von unsigned 
nach  integer ist eine Funktion. Und die kann auch in einer Funktion 
(oder Prozedur) augerufen werden.

von berndl (Gast)


Lesenswert?

autsch das iss peinlich...

Ich hatte im Aufruf der Prozedur einen der falschen Indizes des 
std_logic_vector erwischt (0 anstatt 9, klassischer 10-Finger blind 
Typo). Da haette ich noch lange draufschauen koennen, erst ein 'compare' 
hat mich da schlauer gemacht...

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.