2017-02-09 2 views
-1

Ich versuche, die Zufallszahlen in Verilog in Verilog zu generieren. Aber das Problem ist, wenn ich die Simulation erneut ausführen, wird dieser zufällige Wert behoben. , so dass der vorherige Simulationswert und der aktuelle simulierte Zufallswert identisch sind.Zufallsgenerierung die gleichen Zahlen in Verilog Ausgabe

reg [20:0] temp; 

integer seed; 
reg [31:0] rand; 

initial fork 

seed = $random; 

for (i=0; i<10; i=i+1)begin 

temp = $random(seed) %10 ; 
end 

wait(verif_fcnt == 3) begin 
temp = $random(seed) %10 ; 
task1(temp[0],temp[7:0]); 
end 
wait(verif_fcnt == 3) begin 
temp = $random(seed) %10; 
task2(temp[0],temp[7:0]); 
end 
wait(verif_fcnt == 3) begin 
temp = $random(seed) %10; 
task3(temp[0],temp[7:0]); 
end 

join 

Antwort

0

Um einen Fehler zu reproduzieren, möchten Sie die Zufälligkeit "kontrollieren". Das ist also etwas, was du die meiste Zeit willst.

Der Systemaufruf $random wird durch seed eingeschränkt. Wenn ein Seed gegeben ist, geben die zufälligen Aufrufe dieselbe Sequenz an.

Ich würde Ihnen empfehlen, den Seed-Parameter zu behalten und durch einen $random Aufruf (ohne Seed) zu erzeugen. Achten Sie darauf, die Variable seed zu drucken, die für den Fall verwendet wird, dass Sie auf einen Fehler stoßen.

Statt:

seed = 0; 

Verwendung:

seed = $random; 
$display("Seed used: %d",seed); 

EDIT

Seed-Wert kann auch in dem Simulationsbefehlszeilen eingestellt werden. In NCsim zum Beispiel ist es die -seed integer Option, die es einstellt.

In diesem Fall können Sie in Ihrem Simulation Skript hinzufügen:

#!/bin/bash 
export SEED=$RANDOM 
echo "Seed used: $SEED" 
ncsim ...various command line options... -seed $SEED 

EDIT 2

Verilog verhält sich tatsächlich (standardmäßig) wie konstant ein Samen gegeben ist, so dass Sie Fehler reproduzieren können (see here) .

Um manuell einen Ausgangswert in der Verilog-Quelle zu übergeben, müssen Sie verwenden, um den Anfangswert der nächsten zufälligen Aufrufe zu initialisieren. Dann sind Sie $urandom statt $random(see here)

verwenden sollten die inital seed zu erzeugen, würde ich versuchen, $urandom zu verwenden, bevor die Samen zu setzen.

integer seed; 
initial begin 
seed = $urandom(); 
$srandom(seed); 
end 
//** 
    ... tests with $urandom() calls 
**// 

IMHO, wird es endlich einfacher sein, die Befehlszeilenoption zu verwenden.

+0

Wenn ich neu starte, ist der Startwert immer gleich – grander3

+0

In Ihrem Simulationsbefehl ist es möglich, einen Startwert zu definieren, z. in der NCsim-Befehlsnummer "-seed NUMBER". Dieser Seed wird die Zufallsaufrufe in Ihrer Simulation automatisch einschränken. – Krouitch

+0

Gibt es Optionen, die in dem Verilog nicht Tool behandelt werden? – grander3