【发布时间】:2021-11-20 08:58:45
【问题描述】:
最近我不得不使用 Verilog-A 来生成一组随机数(sigmaX、sigmaY、sigmaZ)。从统计上看,它们每个都有mean=0和std=1,sigmaX^2+sigmaY^2+sigmaZ^2=1。 test_solver.va 文件中的以下代码是用 Verilog-A 编写的,用于在每个时间步实现这样的随机数集:
`include "disciplines.h"
`include "constants.h"
module test_va(p,n,mb,mc,md,me,mf,mg);
inout p,n;
output mb,mc,md,me,mf,mg;
electrical p,n,mb,mc,md,me,mf,mg;
real randomX,randomY,randomZ; // Gaussian random variables with mean = 0, stdev = 1
real sigmaX,sigmaY,sigmaZ; // Normalized thermal noise vector components
integer seedX,seedY,seedZ; // Seed variables for RNG
integer random_seed;
//------------------------------------------------------------------//
// Define mag(x, y, z)
//------------------------------------------------------------------//
analog function real mag;
input x, y, z;
real x, y, z;
begin
mag = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
end
endfunction
analog begin
random_seed = 1;
seedX = $random+random_seed;
seedY = $random+random_seed;
seedZ = $random+random_seed;
randomX = $rdist_normal(seedX, 0.0, 1.0);
randomY = $rdist_normal(seedY, 0.0, 1.0);
randomZ = $rdist_normal(seedZ, 0.0, 1.0);
sigmaX = randomX/mag(randomX, randomY, randomZ);
sigmaY = randomY/mag(randomX, randomY, randomZ);
sigmaZ = randomZ/mag(randomX, randomY, randomZ);
V(mb) <+ randomX;
V(mc) <+ randomY;
V(md) <+ randomZ;
V(me) <+ sigmaX;
V(mf) <+ sigmaY;
V(mg) <+ sigmaZ;
end
endmodule
我使用 HSPICE 2019 通过运行以下 test_solver.sp 文件来测试每个模拟步骤的随机数输出:
Title Simple
.option post=1
.option probe=0
*.option runlvl=4
.option ingold=2
*.option accurate=1
*.option method=bdf
*.option bdfrtol=1e-5
*.option bdfatol=1e-5
.option numdgt=4
.option brief
.option measfile=1
.option lis_new=1
.option vaopts=str('-G')
.save
.hdl ./test_solver.va
vin 1 0 PULSE(0 0.5 2NS 1NS 1NS 10NS 20NS)
X 1 0 2 3 4 5 6 7 test_va
.tran 0.01n 20.0n 1E-10 uic
.print tran V(1) V(2) V(3) V(4) V(5) V(6) V(7)
.end
但是,我注意到如果我连续在 HSPICE 中运行,它总是会生成相同的随机数集(sigmaX、sigmaY、sigmaZ)。但我的要求是在连续运行相同的代码时有不同的随机数集。
我还注意到,如果我将 test_solver.va 文件中的 random_seed=1 更改为 random_seed=2(或 3 或 4 ...)并在 HSPICE 中运行,它将生成与前。但是在连续运行相同的代码时仍然会生成相同的集合。
所以我想知道我的 test_solver.va 代码是否有任何问题,或者我们每次都必须更改“random_seed=1”。那么如果我把这段代码集成到其他代码中运行多次,可能不太容易实现。
【问题讨论】:
标签: verilog random-seed