You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QuestaSim中无rand修饰类实例的随机稳定性是否符合LRM?

QuestaSim中类有无rand字段对线程RNG序列的影响是否符合SystemVerilog LRM?

问题重现

我在QuestaSim中做了一个随机稳定性的测试示例:

示例1:类包含rand字段

module sv_rand_stability;

    class dummy;
        rand int data;
    endclass

    initial begin
        dummy d;
        $display("%8h", $urandom());
        $display("%8h", $urandom());
        d = new();
        $display("%8h", $urandom());
        $display("%8h", $urandom());
    end

endmodule

输出:

# bedc4ae3
# e6d8f5c9
# 680855e0
# 918c7310

示例2:类无rand字段(注释掉rand修饰符)

module sv_rand_stability;

    class dummy;
        /*rand*/ int data;
    endclass

    initial begin
        dummy d;
        $display("%8h", $urandom());
        $display("%8h", $urandom());
        d = new();
        $display("%8h", $urandom());
        $display("%8h", $urandom());
    end

endmodule

输出:

# bedc4ae3
# e6d8f5c9
# e34f5f73
# 680855e0

两个示例的前两个$urandom()输出一致,但调用new()创建对象后的第三个输出发生了变化。

LRM相关条款引用

根据SystemVerilog LRM第18.14.1节:

每个类实例(对象)都拥有独立的RNG用于类中所有随机化方法。当使用new创建对象时,其RNG会被创建该对象的线程的下一个随机值初始化。

该条款并未限定类必须包含rand修饰的字段,也就是说,所有类实例在创建时都应该消耗线程RNG的下一个随机值来初始化自身的RNG。

结论:QuestaSim的行为不符合LRM规范

从测试结果来看,QuestaSim在类不包含rand字段时,跳过了“用线程RNG的下一个值初始化对象RNG”的操作,导致线程RNG的序列未被消耗,后续$urandom()的输出序列发生偏移。

而根据LRM的明确规定,无论类是否包含rand字段、是否会调用随机化方法,只要创建类实例,就必须完成对象RNG的初始化步骤,消耗线程RNG的对应随机值。因此QuestaSim的这个优化行为违反了SystemVerilog LRM的要求。

内容的提问来源于stack exchange,提问作者Sergey Chusov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:38:25