Forum: FPGA, VHDL & Co. ModelSim: Signale in Prozeduren


von Sigi (Gast)


Lesenswert?

Hi,

habe gerade noch zwei Probleme versucht zu lösen:

1. kann ModelSim keine Signale als Parameter in
Prozeduren treiben?

Beispiel:

 signal s: std_logic;
 ..
 process(...)
 begin
   ...
   proc_foo(s);  -- <== ModelSim motzt, ISim nicht
   ...
 end process;
 ..

Fehlermeldung:
 >> Cannot drive signal "tbidx" from procedure "proc_foo" <<

Unter ISim(Xilinx) ist das kein Problem, sollte auch gem.
VHDL-Spec möglich sein (Signale sind schliesslich als
Parametertyp möglich).


2: Ein kleineres Problem in einer Prozedur:

Ist v ein std_logic_vector(7 downto 0), dann meckert
ModelSim bei
  procedure(..)
  begin
    ..
    for i in v'left to v'right loop
      proc_foo2(v(i));
    end loop;
  end;
ModelSim-Error: "..v is not a static expression..",
v(5) aber z.B. wird akzeptiert (vermute mal, ModelSim
kann die Schleifenvariable nicht als Konstante umwandeln).
ISim hat auch hier kein Problem.

Gruss

von Sigi (Gast)


Lesenswert?

Edit (Fehlermeldung in 1.):

 >> Cannot drive signal "s" from procedure "proc_foo" <<

von Duke Scarring (Gast)


Lesenswert?

Sigi schrieb:
> signal s: std_logic;
>  ..
>  process(...)
>  begin
>    ...
>    proc_foo(s);  -- <== ModelSim motzt, ISim nicht
>    ...
>  end process;
>  ..
Wie ist denn proc_foo definiert?

Duke

von Sigi (Gast)


Lesenswert?

Einfaches Beispiel:

  procedure proc_foo(signal s: inout std_logic) is
  begin
    if s = '1' then
     s= '0';
    else
     s= '1';
   end if;
 end;

Wird sowohl von ISE+ISim,Quartus+ModelSim akzeptiert,
der Aufruf innerhalb eines Prozesses führt aber in
ModelSim zu einer Fehlermeldung.

von Duke Scarring (Gast)


Lesenswert?

Mein ModelSim motzt hier nicht:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
5
entity procedure_test is
6
end entity procedure_test;
7
8
9
architecture test of procedure_test is
10
11
    procedure proc_foo(signal s : inout std_logic) is
12
    begin
13
        if s = '1' then
14
            s <= '0';
15
        else
16
            s <= '1';
17
        end if;
18
    end;
19
20
    signal s : std_logic := '0';
21
22
begin
23
24
    s <= not s after 10 ns;
25
26
    process(s)
27
    begin
28
        proc_foo(s);                    -- <== ModelSim motzt, ISim nicht
29
    end process;
30
31
end architecture test;
Es macht was es soll: s nimmt den Zustand 'X' an.

Duke

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


Lesenswert?

Sigi schrieb:
> Einfaches Beispiel: ...
Duke Scarring schrieb:
> Mein ModelSim motzt hier nicht: ...
Wie man schön sieht: eine Fehlersuche ohne KOMPLETTEN Quellcode ist 
eigentlich nicht möglich und unsinnig. Und wie üblich liegt der Fehler 
ausserhalb des geposteten Quellcodeabschnitts...

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> Fehlersuche ohne KOMPLETTEN Quellcode ist
Besser wäre sogar noch ein Minimalbeispiel...

Duke

von Sigi (Gast)


Lesenswert?

Quellcode oder Minimalbeispiel sind natürlich besser, aber
leider ist die verwendete Bibliothek sehr umfangreich, und ins
Netz kann ich sie auch nicht stellen.

Nur soviel: Es geht um Testbenches.
Eine Scanner/Parser-Lib (in VHDL) liesst Testbench-Scripts ein
und generiert daraus di DUT-Signale (genau hier tritt das
Probem auf). Die Signale werden dabei sehr tief in die
Lib-Funktionen weitergereicht, ein einfaches Beispiel kann da
also oft nur schemenhaft beschrieben werden. Habe gehofft,
jemand hier ist schonmal auf ein vergleichbares Problem
gestossen.


@Duke Scarring,

habe dein Beispiel auch mal schnell eingegeben und an meinen
Kontext angepasst, klappt auch bei mir.

Ich habe aber inzwischen das Problem(1) gefunden: Die Prozedur
proc_foo wird nicht aus einem Process, sondern aus einer
Prozedur "TBProc" heraus aufgerufen (falsche Annahme von mir).
Die Prozedur TBProc selbst hat keine Parameter (muss also das
Signal "sig" kennen, was ja auch der Fall ist). Das aber
erlaubt ModelSim nicht, wohl aber ISim (habe ich auch in einem
kleinen Beispiel replizierern können).


Zu Problem(2): Leider ist ModelSim nicht in der Lage, aus
einer Schleifenvariable (als Index) und einem Signal
einen konstanten Ausdruck (~=Signal-Name) generieren.

Gruss

von Duke Scarring (Gast)


Lesenswert?

Sigi schrieb:
> Nur soviel: Es geht um Testbenches.
> Eine Scanner/Parser-Lib (in VHDL) liesst Testbench-Scripts ein
> und generiert daraus di DUT-Signale (genau hier tritt das
Das hab ich auch mal gemacht. Letztendlich macht das keinen Spass, da 
andere Sprachen besser dafür geeignet sind, Testvektoren zu erzeugen und 
die Ergebnisse zu prüfen (z.B. Python oder Matlab).
VHDL nutze ich dann nur noch um diese Stimuli einzulesen oder die 
Ergebnisse in eine Datei rauszuschreiben.

Duke

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.