系统与设计
的意见

使声明式模块化建模:便携式刺激介绍动态约束

动态约束如何使便携式刺激测试意图更加灵活,模块化的、可重用的。

受欢迎程度

自然,Accellera便携式刺激标准(PSS)支持的强大功能先进的验证技术,在业界知名的今天,包括面向对象的组成和constrained-random刺激。但PSS还支持一个新的约束功能,称为动态约束。

PSS的动态约束支持关键任务使其更容易创建具有高度的可移植性测试意图和使它可以捕获测试意图在更高程度的生产力和抽象。

我们将专注于这个新动态约束特性的多个应用程序和使用例子来演示如何使您的便携式刺激试验的意图更加灵活、模块化、可重用。

先做重要的事
在类中声明的随机约束以及随机领域。随机类的实例时,可用约束限制范围的值。

假设我们生成IPV4交通,一个数据结构,代表了IPV4头。图1显示了一个SystemVerilog类和相应的PSS结构我们可以用来表示这个随机数据的集合。


图1 - IPV4头SystemVerilog和PSS

注意,我们也有一个非常基本的约束的长度场,因为所有数据包的总长度必须至少20个字节。还要注意多么类似SystemVerilog和PSS的描述这个IPV4头。所以,如果你可以写SystemVerilog数据结构和约束,您可以简单地编写PSS的描述数据结构和约束。

将随机性
SystemVerilog和PSS,我们可以定制纯数据随机化的方法。最简单的方法是添加更多的约束。我们可以添加更多的约束,宣布一个新的数据结构,继承自基本数据结构和增加了更多的约束,如图2所示。


图2 -小IPV4头数据结构

再次,SystemVerilog之间的结构和语法非常相似,Accellera PSS。

约束也可以添加“内联”当一个数据结构的一个实例是随机的。使用方法如UVM SystemVerilog时,可能出现随机化在UVM序列与数据结构实例随后被送往testbench的其余部分。在PSS模型中,行动扮演相同的角色大致相当于一个序列,数据结构的选择值字段和指定环境中的行为应该执行什么。

在这两种情况下,可以添加额外的约束内联调用随机值的数据结构字段。图3显示了UVM序列和PSS行动,创建一系列小IPV4头通过添加内联的约束。


图3 -添加串联约束

而内联约束非常方便,直接在硬编码值和关系约束块使我们的SystemVerilog和PSS的描述更为脆弱。如果我对一个小标题的定义改变一天,我需要找到每个地方testbench,我添加了一个这样的约束和更新它。如果我想暂时限制另一个领域任何时候一个小数据包被创建之后,我还需要更新我的整个测试描述。

引入动态约束
PSS添加了一个称为动态约束的新构造非常有助于解决硬编码的内联约束的限制。数据探讨约束,我们看了到目前为止在SystemVerilog和PSS被认为是静态的。具体来说,一次约束是一个类或结构体中声明应用每次随机类的实例。Accellera PSS支持静态约束内部结构和动作类型,但也引入了一种新型的约束:一个动态约束。动态约束几乎完全的镜像一个静态约束。而静态约束总是适用,一个动态约束只适用于一次用户激活它。起初,这似乎像一个无用的构造,但除了!

在PSS,我声明我IPV4头结构预测,我想创造一些特定结构的专门化。图4显示了两个动态约束我可能适用于支持创建小标题和大标题。请注意,这两个约束冲突。然而,由于动态约束不适用,直到用户激活它们,不产生任何问题。


图4 - PSS IPV4头结构与动态约束

我们可以使用一个动态约束和其他约束表达式包含内联内部约束。图5显示了一个更新版本的create_small_ipv4_headers行动使用新的动态约束。


图5 -内联动态约束的随机化

只需替换文字约束(长度< = 128)和一个象征性的(small_header_c)的代码已经传达了作者的意图。这个描述也不脆。如果我们决定,需要定义一个小标题不同,我们可以简单地更新原来的动态约束定义,以及所有使用的约束将自动使用新的定义。

可以开始看到,动态约束允许开发约束API,这样测试作家可以象征性地约束对象而不是直接引用字段和常量值。

编写动态约束
动态约束提供价值不仅仅是使代码更容易理解,更容易更新。动态约束逻辑限制,这意味着我们可以使用它们在一个有条件的约束。动态约束的值是“真正的”如果是应用,如果不是“假”。这个属性的动态约束让我们谱写更有趣的关系。

如果我们想生成一个系列的头吗?使用动态约束是布尔的知识限制,我们国家的意图很简单,如图6所示。


图6 -编写内联约束与动态约束

使用动态约束并不限于内联约束块。我们也可以使用它们内部的数据结构以及静态约束来封装共同约束和使我们的约束更模块化和容易理解。


图7 -使用动态约束内部静态约束

图7显示了使用动态约束内部静态约束的一个例子。对于本示例,我们决定,我们的应用程序,包当务之急(DSCP CS1水平)必须不平等在大小256字节。使用动态约束来将一个有意义的名字与约束表达式使代码更容易阅读和维护,一样的内联约束。

虚拟动态约束行动
像静态约束、动态约束是虚拟的。我们可以改变一个动态约束的意义(刺激),从而生成使用继承和制式类型覆盖。

如果我们想运行一组测试中,小标题的定义不同于默认的定义呢?显然是不可取的实际修改测试场景本身。使用动态约束,事实上,他们是虚拟的,允许我们定义一个新的结构,小标题的定义是不同的,如图8所示。


图8 -覆盖动态约束

我们创建一个新的头结构,继承了从现有ipv4_header small_header_c约束的结构和创建一个新的定义。就像一个静态约束,这个版本的约束将被用于所有的实例ipv4_header_larger_small_headers结构体。但是,我们如何使这结构而不是使用ipv4_header结构中使用我们的测试场景(图9)?


图9 -小标题场景

Accellera PSS为我们提供了一个非常有用的概念“覆盖”,这实际上是一个UVM工厂建在语言。就像UVM工厂,PSS覆盖构造提供了一种方法来取代与另一个派生类型给定类型的实例。PSS类型扩展构造提供了一种简便的方法将这些覆盖没有修改原始场景。


图10 -注入一个覆盖声明

图10显示了如何结合类型扩展和覆盖构造导致ipv4_header_larger_small_headers使用我们create_small_ipv4_headers场景。这将导致我们的场景中使用新定义的一个小标题没有我们需要修改任何代码。

动态约束和活动
到目前为止,我们专注于应用程序相当以数据为中心的动态约束和限制到一个数据结构。这些功能的动态约束只会增加应用上下文中的PSS的活动。如果你参加或观看一个Accellera PSS教程,您已经了解了一些关于活动。一个活动是一个declaratively-defined行为可以被静态分析。一个活动更接近的一组随机变量和约束在SystemVerilog比必要的代码。在一个活动动态约束有效支持函数式编程。

在SystemVerilog,我们只能随机调用之间传递值。例如,没有UVM序列,我们可以选择一个头尺寸小,介质,或大,那么限制这个预选的数据包大小尺寸。然而,向前传递的唯一方法认为未来的头应该是“小”独立于一个特定的值添加更多的变量进行编码,意图。动态约束提供这个功能在Accellera PSS。


图11 -使用动态约束在一个活动

图11显示了使用动态约束在一个活动。在这种情况下,select语句之间选择发送四small-header数据包,发送四个large-header数据包。然后,两个normally-constrained头被发送。最后我们使用动态约束条件容易控制这两个头的基础上,选择分支。如果我们选择发送四个小标题的分支,我们使h1发送优先级CS1 CS2和导致h2发送优先级。

建立一个便携式的未来
因为Accellera PSS是一个开放标准,验证工程师可以帮助塑造其未来功能通过参与Accellera便携式刺激工作组。您可以了解更多关于PSS在我们新的白皮书选择一个格式为便携式刺激规范。找出更多的关于使用PSS特性有效捕获测试的意图,我们邀请你参加导师赞助PSS会话DAC 2018



留下一个回复


(注意:这个名字会显示公开)

Baidu