【问题标题】:Same random number sequence generated by Verilog-A code when running the code consecutivelyVerilog-A代码在连续运行代码时生成的相同随机数序列
【发布时间】: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


    【解决方案1】:

    首先,伪随机数生成器是确定性的。这意味着如果您从相同的种子开始,您将始终得到相同的结果。

    我不知道有什么方法可以直接在 Verilog-A 中做你想做的事。我认为您需要在“C”中编写自己的函数。一种经常使用的技术是调用高分辨率计时器并假设以微秒或纳秒为单位的时间基本上是随机的。或者,您可以调用 getrandom() 之类的函数。

    下一个问题是将“C”随机值返回到您的 Verilog-A。我不熟悉 HSPICE,但这可以在其他一些模拟器上使用 Verilog PLI 完成。

    或者,您可以将模拟包装在 shell 脚本中并执行类似的操作

    • 脚本:读取 /dev/urandom 并将随机数写入文件
    • 运行 hspice
    • 在您的 Verilog-A 中使用 $fread 之类的系统任务来读取脚本生成的文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多