1、定义
在SystemVerilog中,随机稳定性可以定义为随机结果对代码更改的抵抗力。
任何随机化的SystemVerilog代码在某种程度上可能随机稳定或不稳定的。以不影响随机结果的方式改变它总是有可能的(例如通过添加变量声明),或者以某种方式(例如通过在正确的位置添加额外的$urandom()或randomize())。
“随机稳定验证平台”,影响随机结果的更改可以限制在有限区域,而“随机不稳定验证平台”,随机结果可能受所有任何地方代码修改的影响。
2、随机稳定性为什么重要
a、直观的结果:对于一个随机的不稳定的验证平台,验证平台代码中的小修改可能会导致与用户期望不匹配的巨大仿真差异。举个简单的例子,将一个随机事务添加到激励中,可能会触发从那时起所有随机事务的更改。
在随机稳定的测试台中,所见即所得。在激励中间添加事务将使仿真器生成相同的事务,直到插入事务的位置,以及在插入事务的位置之后。正如预期的那样,用户观察到的唯一区别是中间的额外事务。
b、一致性结果:相同用例和种子结果一致性的要求。
c、复现错误: 在当今复杂的验证环境中,debug很少是一个人的任务。一个典型的case可能涉及验证工程师、集成工程师和一些特定ip的所有者。在某些情况下,它们都可以在发现特定错误的单一工作空间中工作。在其他许多情况下,他们需要在私人工作区中复制它,并使用自己的私人设置
d、bug修复后的验证:一旦一个错误被修复,在类似于那些该错误已经被暴露的条件下测试它通常是有意义的。正如我们将在下面看到的,一个随机稳定可以很容易地编写出来,允许用户冻结某些区域的随机状态,并允许其他区域改变,有或没有额外的约束。这可能有助于创建一个定点测试,该测试旨在检查特定错误修复的健壮性.
3、sv随机稳定性的理解
在sv中有几种方法产生随机值,随机值某种程度上取决随机指令的在执行流的位置,默认情况下,随机值将取决于随机化指令的绝对位置;代码中特定已知点的相对位置依赖性可以通过sv API的手动播种特性来实现(重新指定seed),通过指定api指定seed 而不影响后续的随机值。
A、绝对路径依赖关系
sv中负责生成随机数的组件叫做随机生成器(RNG),每个线程、packege、module、class、program、interface实例都有内建的RNG,这些RNG使用$urandom、$urandom_range、randomize、shuffle来选择随机值。任何RNG的随机值取决初始化seed和随机调用次数,同样任何RNG的的初始化由取决于器父RNG的初始化和随机次数。最上面的RNG总是一个module、program、interface或package 的RNG,所有这些RNG都被初始化为相同的值,由仿真器根据仿真种子进行选择。
B、相对路径依赖关系
对绝对执行路径的依赖性会使随机结果对代码更改非常敏感,即使是在一个小规模的项目中也是如此。通过手动将RNG设置为特定的已知状态,到某个点的执行路径就变得不在乎。这被称为“手动播种”,并使任何后续的随机结果只依赖于从手动播种点开始的相对执行路径。下面的代码显示了如何对一个线程或一个对象执行此操作