2017-02-09 28 views
-1

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

バグを再現するには、ランダム性を「制御する」必要があります。だからこそあなたが大切にしたいものです。

$randomシステムコールはseedによって制約されます。種が与えられると、ランダムな呼び出しは同じシーケンスを与えます。

シードパラメータを保持し、$randomコール(シードなし)で生成することをお勧めします。バグに遭遇した場合に使用する変数seedを必ず印刷してください。

の代わりに:

seed = 0; 

用途:

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

EDIT

シード値は、シミュレーションコマンドラインで設定することができます。 例えばNCsimでは、それを設定するのは-seed integerオプションです。

この場合

、あなたのシミュレーションスクリプトに追加することができます。

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

EDIT 2

Verilogのは実際には定数のようにシードがあなたがバグを再現することができるように与えられている(デフォルトでは)動作します(see here)

Verilogソースで手動でシードを渡すには、次のランダム呼び出しのシードを初期化するために$srandom(seed)を使用する必要があります。そして、あなたはinital seedを生成するには$random(see here)

の代わりに$urandomを使用する必要があり、私はシードを設定する前に$urandomを使用しようとするだろう。

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

IMHO、最終的にコマンドラインオプションを使用する方が簡単になります。

+0

再実行すると、シード値は常に同じ – grander3

+0

です。シミュレーションコマンドでは、シード値を常に定義することができます。 NCsim '-seed $ NUMBER'コマンドラインオプションで指定します。このシードは自動的にランダム呼び出しを制限します。 – Krouitch

+0

Verilog not toolで扱えるオプションはありますか? – grander3

関連する問題