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
相关产品推荐
相关产品推荐

