2017-02-09 797 views
-1

我試圖在verilog中的verilog中生成隨機數字。 但問題是當我重新運行模擬時,隨機值是固定的。 所以以前的仿真值和當前的仿真隨機值是一樣的。在verilog問題中隨機生成相同的數字

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 

回答

0

爲了重現一個bug,你想'控制'隨機性。所以這是你大部分時間想要的。

$random系統調用受到seed的限制。當一個種子給予隨機電話會給出相同的順序。

我會建議你保留種子參數,並通過$random調用(無種子)生成它。只要確定打印出seed變量,以防偶然發現錯誤。

相反的:

seed = 0; 

用途:

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

編輯

種子值還可以在模擬命令行設置。 例如,在NCsim中,設置它的是-seed integer選項。

在這種情況下,您可以添加在你的模擬腳本:

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

EDIT 2

Verilog的實際(默認),如恆定的種子被賦予這樣你就可以重現bug行爲(see here)

要在Verilog源代碼中手動傳遞種子,必須使用$srandom(seed)來初始化下一個隨機調用的種子。那麼你應該使用$urandom代替$random(see here)

要生成inital seed,我會嘗試設置種子前使用$urandom

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

恕我直言,它最終會更簡單的使用命令行選項。

+0

當我重新運行時,種子值總是相同 – grander3

+0

在你的模擬命令中,可以定義一個種子,例如在NCsim中使用「$ NUMBER」命令行選項。此種子將自動約束您模擬中的隨機呼叫。 – Krouitch

+0

是否有任何選項可以在verilog not tool中處理? – grander3