System Verilog:初始时每个实例的随机化
System Verilog: randomization per instance at initial
我想模拟一个具有随机起始条件的多个锁存器,但我希望每个实例都有自己的初始条件
这是代码的简化版本。我希望两种情况下的值都不同,无需更改接口
module random_usage();
integer addr1;
real data;
initial begin
addr1 = $urandom();
data = $urandom();
$display("addr1=%0d, data=%0d",addr1,data);
end
endmodule
module tb();
integer seed = 1;
random_usage a();
random_usage b();
initial
begin
#5;
seed = $get_initial_random_seed();
$display("seed=%0d", seed);
end
endmodule
我目前看到的:
Instance specific $urandom in system-verilog
解决方案在初始条件下不工作,甚至当你喂同一个时钟时
https://www.systemverilog.io/randomization
我有模块,所以我不知道如何应用这些解决方案,或者即使它可以在这里工作
https://www.reddit.com/r/FPGA/comments/jd0dmu/system_verilog_force_randomization_different_per/
好像是同一个问题,也没有直解,不过最后一个人给了一个VCS flag。我正在使用 VCS,但我无法让标志正常工作
IEEE 1800-2017 SystemVerilog LRM 部分 18.14.1 随机稳定性属性 相当天真地说每个实例都使用相同的初始化种子播种。
大多数工具现在都有一个开关,通过使用分层路径名为每个实例播种来更改该行为。一些工具甚至将其设为默认设置。如果你想要独立于工具的行为,你可以使用这个包:
package seed_instance;
int initial_seed = $urandom;
function automatic void srandom(string path);
static int hash[int];
int hash_value = initial_seed;
process p = process::self();
for(int i=0;i<path.len();i++)
hash_value+=path[i]*(i*7);
if (!hash.exists(hash_value))
hash[hash_value] = hash_value;
else
hash[hash_value]+=$urandom; // next seed
p.srandom(hash[hash_value]);
endfunction
endpackage
module random_usage();
integer addr1;
real data;
initial begin
seed_instance::srandom($sformatf("%m"));
addr1 = $urandom();
data = $urandom();
$display("1: addr1=%0d, data=%0d",addr1,data);
end
initial begin
seed_instance::srandom($sformatf("%m"));
addr1 = $urandom();
data = $urandom();
$display("2: addr1=%0d, data=%0d",addr1,data);
end
endmodule
module tb();
integer seed = 1;
random_usage a();
random_usage b();
endmodule
我想模拟一个具有随机起始条件的多个锁存器,但我希望每个实例都有自己的初始条件
这是代码的简化版本。我希望两种情况下的值都不同,无需更改接口
module random_usage();
integer addr1;
real data;
initial begin
addr1 = $urandom();
data = $urandom();
$display("addr1=%0d, data=%0d",addr1,data);
end
endmodule
module tb();
integer seed = 1;
random_usage a();
random_usage b();
initial
begin
#5;
seed = $get_initial_random_seed();
$display("seed=%0d", seed);
end
endmodule
我目前看到的:
Instance specific $urandom in system-verilog
解决方案在初始条件下不工作,甚至当你喂同一个时钟时
https://www.systemverilog.io/randomization
我有模块,所以我不知道如何应用这些解决方案,或者即使它可以在这里工作
https://www.reddit.com/r/FPGA/comments/jd0dmu/system_verilog_force_randomization_different_per/
好像是同一个问题,也没有直解,不过最后一个人给了一个VCS flag。我正在使用 VCS,但我无法让标志正常工作
IEEE 1800-2017 SystemVerilog LRM 部分 18.14.1 随机稳定性属性 相当天真地说每个实例都使用相同的初始化种子播种。
大多数工具现在都有一个开关,通过使用分层路径名为每个实例播种来更改该行为。一些工具甚至将其设为默认设置。如果你想要独立于工具的行为,你可以使用这个包:
package seed_instance;
int initial_seed = $urandom;
function automatic void srandom(string path);
static int hash[int];
int hash_value = initial_seed;
process p = process::self();
for(int i=0;i<path.len();i++)
hash_value+=path[i]*(i*7);
if (!hash.exists(hash_value))
hash[hash_value] = hash_value;
else
hash[hash_value]+=$urandom; // next seed
p.srandom(hash[hash_value]);
endfunction
endpackage
module random_usage();
integer addr1;
real data;
initial begin
seed_instance::srandom($sformatf("%m"));
addr1 = $urandom();
data = $urandom();
$display("1: addr1=%0d, data=%0d",addr1,data);
end
initial begin
seed_instance::srandom($sformatf("%m"));
addr1 = $urandom();
data = $urandom();
$display("2: addr1=%0d, data=%0d",addr1,data);
end
endmodule
module tb();
integer seed = 1;
random_usage a();
random_usage b();
endmodule