0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述SystemVerilog的各种随机化方法

jf_78858299 来源:芯片学堂 作者:JKZHAN 2023-01-21 16:59 次阅读

我习惯将验证空间理解为:验证中原则上需要覆盖的芯片所有有可能出现的工作状态的集合。为了探索这片广袤的验证空间,验证的时候搞出了带有约束的随机测试(constrainted-random testing),并搞了覆盖率(coverage)作为评估机制。这也是一套成熟可信的工程学方法。

因为约束和随机化可以讲的干货太多,于是我做了拆分。本文要介绍的内容就仅涉及SV的随机化处理,包括伪随机数的产生、随机稳定性和编程示例。

伪随机数的产生

SystemVerilog提供了很多生成伪随机数的方法,比如产生随机数的内建函数**random, **urandom, $urandom_range,对象随机方法object.randomize(),标准库随机函数std::randomize()等等。这些函数的用法在很多教程中都会提到,而本文要做的,是要挖一挖这些函数的“玄机”。

图片

1. Probabilistic Distribution System Functions

第一类随机函数是概率分布系统函数(probabilistic distribution system funtions),这类函数在LRM中明确包括**random, **dist_uniform, **dist_normal, **dist_exponential, $dist_poisson等可以产生满足不同概率分布的随机数的函数,并且在附录N中用C代码给出了这些函数的实现算法。这就意味着,使用相同的种子,这些函数在不同的仿真软件中产生出来的随机数序列应该是一致的。这也是这类函数跟其他类函数的主要区别。

2. Object and Scope Randomization Method

再来看对象随机方法object.randomize(),这个函数在LRM中被称为“the object and scope randomization method”。顾名思义,它专门被用来随机化对象。它是所有SV类中都会默认存在的内置虚函数(原型是virtual function int randomize()),但是它不能被覆盖(overridden)。当你使用object.randomize() 来对对象进行随机化的时候,注意它只会随机化类中有rand关键词修饰的成员变量,并且在成功随机化之后会返回1,失败则返回0。除此之外,每个类中还有randomize的两个回调函数pre_randomize()和post_randomize(),这两个函数分别会在执行randomize()的前后自动被调用。注意,这两个函数并不是虚函数(其函数原型没有virtual关键字),但他们是由虚函数randomize()来自动调用的,因此也表现为虚函数的多态行为。

这套使用类来描述和控制随机数据及其约束的机制相当强大。之所以这么说,一方面是因为有了类的继承特性的加持,随机变量可以方便地继承和扩展;另一方面是因为SV还提供了约束的覆盖、扩展、使能和禁用等功能。但这里有一个问题,就是object.randomize()还是只能随机化类的成员变量,不能随机化局部变量。为了解决这个问题,SV又搞来了一个可用于当前范围内,且不限于对象成员的随机化函数std::randomize(),它在LRM中的定性是scope randomize function。

Std lib下的std::randomize()的适用性比object.randomize()要好,不过它不能自动随机对象中的rand成员变量,也没有pre和post函数可以调用,毕竟鱼和熊掌不可兼得呀。std::randomize()在某些场景下前面的“std::”是可以省略的,但还是建议使用的时候加上比较好,能与上面讲的object.randomize()做出区分。除了可以随机化当前范围内变量,std::randomize()使用的时候可以将需要随机化的多个变量同时放到参数列表中一起做随机,且能适配这些变量的位宽。该函数返回结果跟object.randomize()一样,成功返回1,失败返回0。

3. Random Number System Function

最后要将讲的是SV中比较古老的随机函数和方法urandom()和urandom_range()。后者只是在前者的基础上增加了范围限制。**urandom的函数原型是function int unsigned **urandom [(int seed)]。可以看出来,这两个函数的返回值都是32bit的无符号数。如果初始随机种子一样,则相同工具的每一次仿真跑出来的随机数是一致的,这是涉及到下小节要讲的一个重要的特性:随机稳定性。

随机稳定性(Random stability)

在SV中,不同线程(thread)或对象(object)在随机化时使用的随机数产生器(RNG)是相互独立的。另一方面,相同线程或相同对象在相同随机种子的情况下,每一次仿真中产生的随机数序列是一样的。这个属性就叫random stability。

随机稳定性之所以重要,是因为在芯片验证中,随机验证方法是很重要的一部分,在用例回归之后,那些Failed的测试用例通常需要使用触发错误的随机种子来重现,比如把波形Dump出来。因此,有必要了解线程和对象的随机化机制。下面从三个层面看这套机制是怎么运作的。

**Initialization RNG:**初始化RNG是产生随机数的开始,用来给RNG初始化随机种子。每一个模块实例(module instance)、接口实例(interface instance)、程序块(program)和包(package)实例都有属于自己的初始化RNG,在不指定随机种子的情况下,默认的随机种子根据不同编译器的实现决定的。上小节讲的每一种伪随机数的产生方法都有自己指定随机种子的函数

**Hierarchy seeding:**分层分配随机种子是随机稳定性的重要机制。在创建新的线程或者实例化对象的时候,父线程使用的RNG的下一个随机值会作为这个新线程或者新对象的RNG的随机状态,即作为新的种子传递下去。

**Thread and Object Stability:**SV中将程序(program)、模块(module)、接口(interface)、函数(function)、任务(task)等这些独立的块叫Process。每个Process都有自己的RNG。每个RNG都有自己的随机状态(random state)。我们可以通过process::self()这个静态方法获取当前Process的RNG句柄,在通过句柄调用get_randstate()方法来获得随机状态。不同的仿真工具返回来的随机状态的值的表现方式可能会不一样,但基本都是一段看起来没有规律的字符串,这个字符串表示下一个要产生的随机数的值。

SV的这套随机稳定性机制,尽管通常不需要我们去做什么,但是要知道:在我们要复现一个执行失败的测试用例的时候,不要改动之前布下的种子,也不要改变程序中线程和对象创建的顺序,避免更改了分层随机种子的顺序。

编程示例

下面的例程和仿真结果展示了以上介绍到的随机函数和特性,代码中也附有必要的注释。如果需要源码,可以在公众号中直接回复"SV随机"获得下载链接。

图片

仿真结果如下图所示:

图片

参考文献

[1] IEEE Standard Association. "IEEE Standard for SystemVerilog-Unified Hardware Design, Specification, and Verification Language." (2013).

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    452

    文章

    50117

    浏览量

    420341
  • Verilog
    +关注

    关注

    28

    文章

    1340

    浏览量

    109905
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36819
收藏 人收藏

    评论

    相关推荐

    求教!!LabVIEW怎样数据的随机化

    数据的随机化是通过伪随机二进制序列生成器作用于输入数据来实现的,其中随机器的生成多项式为:1+X^15+X^14,请问怎样用LabVIEW实现这个过程呢?谢谢各位的帮助!!
    发表于 02-18 20:32

    高速ADC的数字输出随机化

    ADC输出频谱中引起不良的音调。通过在将数字输出传输到芯片外之前对数字输出进行随机化,我们可以避免最麻烦的数字输出转换-即在中档输入电压下发生的从全1到全零的转换。通过在LSB和所有其他数据输出位之间
    发表于 11-11 10:07

    缓冲区溢出的危害及避免缓冲区溢出的三种方法

    1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲区溢出的三种方法7.1 栈随机化7.2 ...
    发表于 03-30 14:01

    新的随机化广播加密方案

    提出一种新的随机化广播加密方案,通过构建随机函数族为用户分配密钥,可以使合法用户以概率1 获取解密密钥,而用户的密钥存储仅为(l +1) 个,与其他基于二叉树结构的方案相
    发表于 03-24 09:40 10次下载

    SystemVerilog中的随机化激励

    随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。在SystemV
    发表于 12-14 10:55 14次下载

    System Verilog中的随机化激励

    在SystemVeri log更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。本文以VMM库为例,阐述了如何在SystemVeri 1og中使用随机化函数来编写高效率的测试代码,重点介
    发表于 04-01 15:03 30次下载
    System Verilog中的<b class='flag-5'>随机化</b>激励

    基于System Verilog中的随机化激励

    基于System Verilog中的随机化激励
    发表于 10-31 09:25 9次下载
    基于System Verilog中的<b class='flag-5'>随机化</b>激励

    一种随机化的软件模型生成方法

    .提出一种随机化的模型生成方法,该方法能够根据元模型的定义以及用户输入的约束条件随机且正确地生成模型文件.实验结果表明:该方法与其他
    发表于 12-30 12:06 0次下载
    一种<b class='flag-5'>随机化</b>的软件模型生成<b class='flag-5'>方法</b>

    华为手机已经开启了MAC地址随机化功能可以有效的防范WiFi探针

    华为EMUI官方微信称,华为手机EMUI 8.0以上版本已经默认开启了MAC地址随机化功能,MAC地址随机化是指手机WiFi开启后,每次在扫描周围WiFi热点时携带的MAC地址都是随机生成的,就算被WiFi探针获取也无法做正确的
    发表于 03-18 09:43 1.4w次阅读

    华为手机EMUI 8.0及以上版本已经默认开启了MAC地址随机化功能

    华为EMUI官方微信称,华为手机EMUI 8.0及以上版本已经默认开启了MAC地址随机化功能,MAC地址随机化是指手机WiFi开启后,每次在扫描周围WiFi热点时携带的MAC地址都是随机生成的,就算被WiFi探针获取也无法做正确
    发表于 03-20 08:56 8279次阅读

    固态硬盘的顺序读写和随机读写有何区别

    顺序与随机指的是每次数据存取请求对应的地址是否连续。Windows系统采取“见缝插针”的策略进行数据写入,多任务系统下各进程对硬盘位置的读写请求也变得更为随机化
    发表于 09-28 06:34 2.3w次阅读

    简述SystemVerilog随机约束方法

    上一篇文章介绍了SystemVerilog各种随机化方法,本文将在其基础上引入SystemVerilog
    的头像 发表于 01-21 17:03 1965次阅读

    UVM中的uvm_do宏简析

    uvm_do宏及其变体提供了创建、随机化和发送transaction items或者sequence的方法
    的头像 发表于 06-09 09:36 4723次阅读
    UVM中的uvm_do宏简析

    SystemVerilog随机约束方法

    上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog各种随机化方法,本文将在其基础上引入
    的头像 发表于 09-24 12:15 1493次阅读

    SV约束随机化总结

    constraint 约束随机化类中的变量 在main_phase 之前就已经提前产生一个变量的随机值。 用法:一般在类中定义一个rand 类型的变量, 然后根据需求写约束就可以
    的头像 发表于 12-14 14:30 747次阅读
    SV约束<b class='flag-5'>随机化</b>总结