Forum: FPGA, VHDL & Co. Zufallsgenerator für Resetlänge für die Testbench


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


Lesenswert?

Ich will in einer Testbench mit einem Zufallsgenerator die Resetlänge 
variieren.

Eine Funktion random habe ich nicht gefunden. Dafür die Funktion 
uniform(..,..,..). Diese nicht so toll, weil sie drei Übergabeparameter 
hat. Zwei davon haben sich mir noch nicht erschlossen. Der dritte ist 
der Zufallswert. Um nicht so viele Variablen in der Testbench zu 
deklarieren, habe ich mir die Funktion Random geschrieben.

1
  
2
  function random return real;
3
4
end; -- package mlite_pack
5
6
7
package body mlite_pack is
8
9
 function random return real is
10
  variable seed1,seed2 :positive;
11
  variable rand:real;
12
 begin
13
     --   uniform(seed1,seed2,rand);
14
      --  return rand;
15
      return 10.0;
16
end;

Die Einbindung in die Testbench erfolgt in dem process
1
  reset_p :process
2
  variable seed1,seed2: positive;
3
  variable rand: real;
4
  begin
5
       wait for 20 ns;
6
      reset<='1';
7
8
     wait for rand * 0.5 us;    
9
          reset<='0';
10
     
11
      wait;
12
   end process;

Jetzt bekomme ich in GHDL folgende Fehlermeldung:

work.mlite_pack [package]
./tb_inst_fetch:error: negative timeout clause
./tb_inst_fetch:error: simulation failed
ghdl: compilation error
make: *** [inst_fetch] Error 1

Die Fehlermeldung bekomme ich auch, wenn ich einen statischen Wert, wie 
oben festgelegt mit 10.0 habe. Der ist positiv. real hat zwar einen 
Wertebereich der negativ sein kann.

Ich habe zwei Fragen,

1. Was ist falsch?
2. Wer kennt einen Code für die Generierung Signalen, der auch 
Variationen/Strörungen beinhalt?

von berndl (Gast)


Lesenswert?

du musst das denke ich schon mit einer 'procedure' machen, z.B. so:
1
   procedure rnd_data ( variable s1 : inout positive;
2
      variable s2 : inout positive;
3
                        variable data : out std_logic_vector (15 downto 0)
4
                     ) is
5
      variable randNum : real;
6
   begin
7
      for i in 0 to 15 loop
8
      uniform (s1, s2, randNum);   -- 0.0 =< randNum < 1.0
9
         if randNum < 0.5 then
10
            data (i) := '0';
11
         else
12
            data (i) := '1';
13
         end if;
14
      end loop;
15
   end procedure;
seed1/2 muessen inout sein wenn man die Prozedure mehrfach aufruft und 
jeweils neue Werte generiert werden sollen. So mache ich das auf jeden 
Fall immer und es funktioniert mit allen Simulatoren, auch GHDL

von berndl (Gast)


Lesenswert?

achja, und in deinem reset-process rufst du ja die Funktion gar nicht 
auf!

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


Lesenswert?

berndl schrieb:
> achja, und in deinem reset-process rufst du ja die Funktion gar nicht
> auf!

Bei Wait for wirs sie nicht aufgerufen?

Ich denke es gibt auch Funtktionen ohne Parameter. Ich wusste nur nicht 
ob ich rand oder rand() dann schreiben muss.

Dan gab es noch da Problem ob es eine pure oder impure Funktion ist. Da 
bin ich mir nicht sicher ob es eine impure Funktion sein sollte.


bei deinem Vorschlag habe ich wieder so viele Parameter beim Aufruf.

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


Lesenswert?

René D. schrieb:
> wait for rand * 0.5 us;
Dort im Beitrag "Re: Frage zur Testbench" wurde eine 
Lösung für variable Zeiten (Clock mit Jitter) aufgezeigt.

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


Lesenswert?

Lothar Miller schrieb:

> Dort im Beitrag "Re: Frage zur Testbench" wurde eine
> Lösung für variable Zeiten (Clock mit Jitter) aufgezeigt.

Danke für den Link. Den kannte ich noch nicht. Hier ist das gleiche es 
sind mehr Codezeilen für Hilfsvariablen zur Zufallszahlerzeugung als für 
die Signalzuweisung. Es wird sehr schnell unübersichtlich, Deshalb 
wollte ich meine Funktion haben, dann ist der Prozess übersichtlicher.

von Joe (Gast)


Lesenswert?

>Bei Wait for wirs sie nicht aufgerufen?

Bin ich blind oder verpasse ich gerade etwas?

von berndl (Gast)


Lesenswert?

René D. schrieb:
> Bei Wait for wirs sie nicht aufgerufen?

Dann musst du aber auch random anstelle von rand hinschreiben.
Bzgl. impure functions: 
http://www.velocityreviews.com/forums/t26725-the-impure-construct.html

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


Lesenswert?

berndl schrieb:
> René D. schrieb:
>> Bei Wait for wirs sie nicht aufgerufen?
>
> Dann musst du aber auch random anstelle von rand hinschreiben.
> Bzgl. impure functions:
> http://www.velocityreviews.com/forums/t26725-the-impure-construct.html

Och so ein Mist, das habe ich noch nicht bemerkt. Jetzt verstehe ich 
dein Beitrag. Halt eigene Fehler findet man am schlechtsten.

Das muss ich gleich heute ausprobieren.

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.