在verilog问题

时间:2017-02-09 07:10:50

标签: 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

1 个答案:

答案 0 :(得分:0)

为了重现错误,您需要“控制”随机性。所以这是你大多数时候都想要的东西。

$random系统调用受seed约束。当种子被给出时,随机调用将给出相同的序列。

我建议你保留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

编辑2

Verilog实际上(默认情况下)表现为常量种子,因此您可以重现错误(see here)

要在Verilog源中手动传递种子,您必须使用$srandom(seed)初始化下一次随机调用的种子。然后,您应该使用$urandom而不是$random (see here)

要生成初始seed,我会在设置种子之前尝试使用$urandom

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

恕我直言,使用命令行选项最终会更简单。