2017-02-09 756 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