sv随机稳定性

随机稳定性是衡量SystemVerilog代码在修改后保持随机结果不变的能力。它对于验证平台至关重要,因为不稳定性可能导致小改动产生大差异,影响一致性结果、错误复现和修复后的验证。通过手动播种和保存恢复RNG状态,可以实现随机稳定,便于调试和协作。
摘要由CSDN通过智能技术生成

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设置为特定的已知状态,到某个点的执行路径就变得不在乎。这被称为“手动播种”,并使任何后续的随机结果只依赖于从手动播种点开始的相对执行路径。下面的代码显示了如何对一个线程或一个对象执行此操作

class my_class;
        rand int y;
        task not_random();
                process p = process::self();
                p.srandom(1); // thread reseeding
                $display("constant result %d", $urandom());
                this.srandom(2); // object reseeding
                randomize();
                $display("and another one %d", y);
        endtask
endclass
        C、保存和恢复RNG的状态
        在某些情况下,需要添加不会影响任何后续随机结果的代码,即RNG状态。为了实现这一点,SV API提供了保存和恢复和RNG状态的方法。下面的代码展示了如何使用它来保护其他对象实例化不更改$random()结果
        
class class_b;
        task main();
                class_a a;
                string rand_state;
                process p = process::self();
                rand_state = p.get_randstate();
                $display(“first random value %d”, $urandom());
                a = new();
                p.set_randstate(rand_state);
                $display(“and a second identical one %d”,$urandom());
        endtask
endclass
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值