篇1-线程和对象的随机化机制
资料来源:
(1)公众号-芯片学堂(芯片学堂的文章很不错);
1.initialize RNG
(1)初始化RNG是产生随机数的开始,用来给RNG初始化随机种子。
(2)每一个模块实例(module instance)、接口实例(interface instance)、程序块(program)和包(package)实例都有属于自己的初始化RNG,在不指定随机种子的情况下,默认的随机种子根据不同编译器的实现决定的。
2.hierarchy seeding
(1)分层分配随机种子是随机稳定性的重要机制。
(2)在创建新的线程或者实例化对象的时候,父线程使用的RNG的下一个随机值会作为这个新线程或者新对象的RNG的随机状态,即作为新的种子传递下去。
3.thread & object stability
(1)SV中将程序(program)、模块(module)、接口(interface)、函数(function)、任务(task)等这些独立的块叫Process。
(2)每个Process都有自己的RNG。每个RNG都有自己的随机状态(random state)。
(3)可以通过process::self()这个静态方法获取当前Process的RNG句柄,再通过句柄调用get_randstate()方法来获得随机状态。不同的仿真工具返回来的随机状态的值的表现方式可能会不一样,但基本都是一段看起来没有规律的字符串,这个字符串表示下一个要产生的随机数的值。
注:在复现一个执行失败的测试用例的时候,不要改动之前布下的种子,也不要改变程序中线程和对象创建的顺序,避免更改了分层随机种子的顺序。