Zufallsgenerator für Resetlänge für die Testbench

OP (Firma: www.dossmatik.de) #2457995
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?
Gast #2458085
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
OP (Firma: www.dossmatik.de) #2458116
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.
OP (Firma: www.dossmatik.de) #2458174
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.
OP (Firma: www.dossmatik.de) #2458580
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren