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