System verilog 使用get_randstate和set_randstate时未保留RNG状态

System verilog 使用get_randstate和set_randstate时未保留RNG状态,system-verilog,System Verilog,我试图理解为什么在下面的示例中,RNG状态没有得到保留: module test; string Seed_s = "0"; int unsigned Seed_i = 0; initial begin process p; p = process::self(); $display("Process randstate1 = ", p.get_randstate()); Seed_s = p.get_randstate(); $disp

我试图理解为什么在下面的示例中,RNG状态没有得到保留:

module test;
  string Seed_s = "0";
  int unsigned Seed_i = 0;

  initial
  begin
    process p;
    p = process::self();
    $display("Process randstate1 = ", p.get_randstate());
    Seed_s = p.get_randstate();
    $display("Process Seed_s = %s", Seed_s);
    Seed_i = Seed_s.atobin();
    $display("Process Seed_s = %s", Seed_s);
    $display("Process randstate2 = %d", Seed_i);
    p.set_randstate(Seed_s);
    $display("Process randstate3 = ", p.get_randstate());
  end
endmodule
以下是输出:

Process randstate1 = 0000000000000000000000000000000000001001011001101001101001011110
Process randstate2 =  157719134
Process randstate3 = 0X1Z00ZZXZX011Z00X0ZX01XZXZ0X111XZZXZZZXZXZXZZXZZZZXZZZZXXXXXXXX
我希望看到randstate1=randstate3。我错过了什么

编辑:在atobin()之前和之后添加了一个显示字符串


这看起来像一个模拟器bug。你用什么模拟器

当我创建您的代码的简化版本,并使用Cadence Incisive模拟器运行它时,我会在
set\u randstate
之前和之后获得相同的状态:

module tb;

string Seed_s;

initial begin
    process p;
    p = process::self();
    $display("Process randstate = ", p.get_randstate());
    Seed_s = p.get_randstate();
    p.set_randstate(Seed_s);
    $display("Process randstate = ", p.get_randstate());
end

endmodule
输出:

Process randstate = svseed=1 ; 3130931317 ; 
Process randstate = svseed=1 ; 3130931317 ; 

当我使用Synopsys VCS运行时,我会得到与您类似的结果。

这看起来像是一个模拟器错误。你用什么模拟器

当我创建您的代码的简化版本,并使用Cadence Incisive模拟器运行它时,我会在
set\u randstate
之前和之后获得相同的状态:

module tb;

string Seed_s;

initial begin
    process p;
    p = process::self();
    $display("Process randstate = ", p.get_randstate());
    Seed_s = p.get_randstate();
    p.set_randstate(Seed_s);
    $display("Process randstate = ", p.get_randstate());
end

endmodule
输出:

Process randstate = svseed=1 ; 3130931317 ; 
Process randstate = svseed=1 ; 3130931317 ; 

当我使用Synopsys VCS运行时,我得到了与您类似的结果。

您的代码在Questa中运行良好,产生以下输出

 # Process randstate1 = MS47527bb5f9e2c20661d2ea9091ed841d
 # Process randstate2 =          0
 # Process randstate3 = MS47527bb5f9e2c20661d2ea9091ed841d

我猜你的模拟器在执行Seed_.atobin()时有一个bug我将在这之前和之后显示
种子的值。

您的代码在Questa中运行良好,产生以下输出

 # Process randstate1 = MS47527bb5f9e2c20661d2ea9091ed841d
 # Process randstate2 =          0
 # Process randstate3 = MS47527bb5f9e2c20661d2ea9091ed841d

我猜你的模拟器在执行Seed_.atobin()时有一个bug
我会在这之前和之后显示
种子的值。

添加了显示语句。Seed_的值保持不变显示语句。种子的值保持不变