我正在尝试在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 :(得分: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
**//
恕我直言,使用命令行选项最终会更简单。