返回介绍

第十二章 随机约束

发布于 2020-09-09 22:55:50 字数 4075 浏览 1085 评论 0 收藏 0

主题
主题描述
12.1 简介(一般信息)约束驱动的测试生成方法使得用户能够自动地为功能验证产生测试。随机测试比一个传统的、直接的测试方法更有效率。通过指定约束,我们可以很容易地为难于到达的边界条件产生测试。SystemVerilog允许用户以一种紧凑、明了的方式指定约束。约束接下来会被一个求解器处理,这个求解器用来产生满足约束的随机值。

典型情况下,随机约束在一个面向对象的数据抽象之上指定。它将需要被随机化的数据建模成包含随机变量和用户定义约束的对象。约束确定了可以被赋值给随机变量的有效值。对象很适合于表示复杂的集合数据类型以及诸如以太网包之类的协议。

第12.2节提供了基于对象的随机化和约束编程的概述。本章余下的部分提供了有关随机变量、约束块、以及处理它们的机制的详细信息。
12.2 概述本章介绍了在对象内产生随机激励的基本概念和用法。SystemVerilog使用一个面向对象的方法来为对象的成员变量赋随机值,它以用户定义的约束为准。例如:
12.3 随机变量类变量可以使用rand和randc类型修饰符关键字声明成随机的。

在一个类中声明随机变量的语法如下:
12.4 约束块随机变量的值通过由约束块声明的约束表达式来确定。像任务、函数和变量一样,随机块是类的成员。在一个类中,约束块的名字必须是唯一的。

声明约束块的语法如下:
12.5 随机化方法
12.6 内联约束 — randomize() with通过使用randomize()...with结构,用户可以在randomize()方法的调用点上声明内联约束。这些额外的约束与对象约束一起应用。

randomize()...with的语法如下:
12.7 使用rand_mode()关闭随机变量rand_mode()可以用来控制激活或关闭一个随机变量。当一个随机变量处于未激活状态的时候,这个随机变量就好像没有使用rand或randc声明一样。未激活的随机变量不会被rand_mode()方法随机化,并且它们的值会被求解器当作状态变量。所有的随机变量最初都是激活的。

rand_mode()方法的语法如下:
12.8 使用constraint_mode()控制约束constraint_mode()方法可以用来控制激活或关闭一个约束。当约束处于未激活(关闭)状态时,它不会被randomize()方法所考虑。所有的约束最初都是激活的。

constraint_mode()方法的语法如下:
12.9 动态的约束修改SystemVerilog中提供了几种方法来动态地修改随机化方法:

  • 蕴涵以及if...else风格的约束允许声明具有判决条件的约束。
  • 可以使用contraint_mode()内建方法来激活或关闭约束块。初始情况下,所有的约束块均处于激活状态。未激活的约束会被randomize()函数忽略。
  • 可以使用rand_mode()内建方法来激活或关闭随机变量。初始情况下,所有的rand和randc变量都处于激活状态。未激活的随机变量会被randomize()函数忽略。
  • 在dist约束中的权重可以被改变,从而影响了被选定集合中特定值出现的概率。

12.10 内联随机变量控制randomize()方法可以用来临时性地控制一个类实例或对象中的随机变量和状态变量的集合。当调用无参数的randomize方法的时候,它的行为就像前一节所描述的那样,也就是说,它会为对象中所有使用rand或randc声明的随机变量赋新的值,这样所有的约束都会被满足。当调用带有参数的randomize的时候,它的参数指定了该对象内随机变量的完整集合;对象中的所有其它变量都被认为是状态变量。例如,考虑下面的类以及对randomize方法的调用:
12.11 范围变量的随机化 — std::randomize()内建的类随机化方法对类成员变量执行专有的操作。使用类来对需要随机化的数据建模是一种强大的机制,它使得我们能够产生通用、可复用的包含随机变量的对象,并能够产生可以在以后扩展、继承、约束、过载、使能、关闭、以及从其它对象合并或分离的约束。类及与其关联的随机变量和约束在处理上的方便性使得类非常适合描述和处理随机数据和约束。然而,某些要求较少的问题并不需要类的这些完整的灵活性,它可以使用一个较为简单的机制来随机化不属于一个类的数据。范围随机函数(std::randomize())使得用户能够随机化当前范围内的数据,而无需定义一个类或实例化一个类对象。

范围随机化函数的语法如下:
12.12 随机数系统函数与方法
12.13 随机稳定性随机数发生器(RNG)对于线程和对象是本地的。因为被一个线程或对象返回的随机值序列独立于其它线程或对象的RNG,所以这个特性被称为随机稳定性。随机稳定性应用于:

  • 系统随机化调用,$urandom()和$urandom_range()。
  • 对象和进程随机播种方法,srandom()。
  • 对象随机化方法,randomize()。

在面对用户代码小的改变的时候,具有这种特点的测试平台能够展示更加稳定的RNG行为。另外,对于通过手工设置种子的线程和对象,它能够更精确地控制随机值的产生。

12.14 为随机化手工设置种子每一个对象维护了它自己的内部随机数发生器,这个随机数发生器它的randomize()方法所专用。这就使得对象能够各自独立地被随机化并能够相对于其它的随机化函数独立地调用。当产生一个对象的时候,它的随机数发生器(RNG)能够使用来自产生这个对象的线程的RNG的下一个值设置种子。这个过程被称为层次化的对象播种。

有时我们希望能够使用srandom()方法手工地设置种子。这种功能或者在一个类方法中,或者在类定义的外部完成。

作为一个类方法在内部为RNG设置种子的例子如下:
12.15 随机加权的条件 — randcase
12.16 随机序列产生 — randsequence分析程序生成器,例如yacc,使用巴科斯-诺尔范式(BNF)或类似的符号来描述被分析语言的文法。因此文法被用来产生一个程序,它能够检查一个标记流是否代表了该语言中一个语法正确的表达方式。SystemVerilog的序列产生器反转了这个过程。它使用文法来随机地产生一个文法所描述的语言的正确的表达方式(也就是一个标记流)。随机序列发生器对于随机地产生结构化的激励序列(例如指令或网络流量模式)非常有用。

序列发生器使用个randsequence块内的一组规则和生成式。randsequence块的语法如下:
链接 主题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文