2016-04-18 14 views
3

Ich bin verwirrt zwischen diesen drei Funktionen und ich fragte mich nach einer Erklärung. Wenn ich den Bereich festlege, wie mache ich den Bereich exklusiv oder inklusive? Sind die Bereiche inklusive oder exklusiv, wenn ich den Bereich nicht festlege?urandom_range(), urandom(), random() in Verilog

+0

Diese sind vollständig in der freien IEEE Std 1800-2012 angegeben. Siehe Abschnitt 18.13 Systemfunktionen und Methoden für Zufallszahlen. – toolic

+0

'$ urandom_range()' und '$ urandom()' stammen aus SystemVerilog [IEEE Std 1800-2012] (http://standards.ieee.org/getieee/1800/download/1800-2012.pdf). Verilog ist sein Vorgänger – Greg

Antwort

5

Neben der Antwort von @ dave_59, gibt es weitere wichtige Unterschiede:

i) $random gibt eine 32-Bit-Integer; $urandom und $urandom_range geben vorzeichenlose 32-Bit-Ganzzahlen zurück.

ii) Der Zufallszahlengenerator für $random wird in IEEE Std 1800-2012 angegeben. Mit demselben Seed erhalten Sie in jedem SystemVerilog-Simulator genau die gleiche Sequenz von Zufallszahlen. Dies ist bei $urandom und $urandom_range nicht der Fall, wo das Design des Zufallsgenerators dem EDA-Anbieter überlassen ist.

iii) Jeder Thread verfügt über einen eigenen Zufallszahlengenerator für $urandom und $urandom_range, während es nur einen Zufallszahlengenerator für $random zwischen allen Threads (dh nur ein für die gesamte Simulation) geteilt wird. Dies ist sehr wichtig, da es für jeden Thread separate Zufallszahlengeneratoren gibt, die Ihnen bei der Simulation helfen, eine Eigenschaft mit der Bezeichnung zufällige Stabilität zu verbessern. Angenommen, Sie verwenden einen Zufallszahlengenerator, um einen zufälligen Stimulus zu erzeugen. Angenommen, Sie finden einen Fehler und beheben ihn. Dies könnte leicht die Reihenfolge ändern, in der die Threads (dh initial undBlöcke) ausgeführt werden. Wenn diese Änderung die Reihenfolge geändert hat, in der Zufallszahlen generiert wurden, würden Sie nie wissen, ob der Fehler behoben wurde, weil Sie ihn behoben haben oder weil sich der Stimulus geändert hat. Wenn Sie für jeden Thread einen Zufallszahlengenerator haben, ist Ihr Testbench weit weniger anfällig für einen solchen Effekt - Sie können viel sicherer sein, dass der Bug verschwunden ist, weil Sie ihn behoben haben. Diese Eigenschaft heißt zufällige Stabilität.

Also, wie @ dave_59 sagt, sollten Sie nur $urandom und $urandom_range verwenden.

+0

Vielen Dank für die Einsicht! –

+0

@ Matthew Taylor - aber wenn es ein Problem mit einer Nummer gibt, würden Sie nicht wissen, die Samen (im Falle von $ urandom und $ urandom_rang), so wird es schwierig, den Bug zu repreduce. – sara8d

+0

@ sara8d können Sie den Seed für jeden Thread festlegen. –

5

Sie sollten nur $urandom und $urandom_range verwenden. Diese beiden Funktionen bieten eine bessere Qualität der Zufallszahlen und eine bessere Initialisierung und Stabilität der Seeds als $random. Der durch $ urandom_range angegebene Bereich ist immer inklusive.

Obwohl $random die exakt gleiche Folge von Zufallszahlen für jeden Aufruf generiert, ist es äußerst schwierig, dieselbe Aufrufreihenfolge beizubehalten, sobald Änderungen am Design oder an der Testbench vorgenommen werden. Noch schwieriger, wenn mehrere Threads gleichzeitig Zufallszahlen generieren.