By Matthew Ballance, February 28, 2020
声明式的、基于约束的描述的使用,如何帮助您将命令序列集中在感兴趣的领域上。
行使状态机是验证设计功能的关键。实际上,状态机很重要,以至于Accellera开发的便携式激励标准(PSS)为模型活动提供了特定的功能,这些活动通过其状态对设计机进行排序。
PSS为状态机提供的支持足以行使状态机,但我们也可以在SystemVerilog中获得许多更高效的建模和自动测试创建的相同好处。
在这篇文章中,我们将展示如何在SystemVerilog中为状态机的命令序列的生成建模,并且我们将看到它是如何实现更高效的建模,以及实现更好的测试生成。
行使内存状态机
我们将为LPDDR SDRAM存储器使用状态机来阐明我们的方法。图1显示了一个通用的、略微简化的LPDDR图,并展示了引发这些转换的相关状态和命令。
图1. LPDDR状态机(Mentor)
这个状态机看似简单,然而,执行所有有效的三层命令序列绝非易事。许多复杂性均来源于这样一个事实,即我们不仅需要行使状态机,我们还需要确保设计处于可以执行状态机转换的状态。
为了编写激励以生成LPDDR命令来行使存储设备的状态机,我们将捕获与设备状态和这三个命令中每一个都相关联的约束。这些约束都是可声明的描述。以这种方式捕获合法的命令序列允许我们轻松地约束命令序列生成器以产生特定的命令序列,并且其允许我们应用自动化来生成测试序列和覆盖率。
像许多其他状态机一样,LPDDR状态机也受设备状态限制。例如,为了在其中一个库中执行写(WR_x),则该库必须处于激活状态。我们的首要任务是识别设备状态,这些设备状态决定了可以在任何给定时间点应用的有效命令。使用LPDDR,需要注意以下两个状态元素:
- 设备是否处于自刷新(self-refresh)状态
- 给定的库是否处于激活状态
我们从捕获结构中的这些状态元素开始,如图2所示(请注意,在此LPDDR存储器中,有8个储库)。
图2. LPDDR状态信息(Mentor)
我们将使用此状态来调节可以生成的命令集。
在形成命令生成约束时,我们要做的第一件事是识别命令集。图3中显示的枚举类型对全局或特定库中可以应用的每个命令进行编码。
图3. LPDDR命令集(Mentor)
接下来,我们捕获描述一个类中的单个命令所需的一切,如图4所示。
图4. 单指令类
从单指令类中可捕获以下内容:
- 执行命令之前的设备状态(状态字段);
- 要生成的命令;
- 如果目标库可适用的话,应用命令的目标库。
现在我们需要形成约束,其反映了在状态机中表达的规则将作为对当前状态的约束。
图5显示了在空闲(idle)状态和自刷新(self-refresh)状态之间对弧进行编码所需的约束。请注意,当处于自复位(self-reset)状态时,我们唯一可以做的就是保持该状态或退出自刷新状态。当我们不处于刷新状态时,我们将无法发出自刷新退出命令。最终,除非所有库都处于空闲状态,否则我们无法发出自刷新命令。
图5. 自刷新的约束(Mentor)
有一组类似的约束来控制何时可以发出库的特定命令,如图6所示。
图6. 库的特定指令约束(Mentor)
在此,约束主要确保仅在激活适当的库时才能发出特定的指令。我们可以将这些限制追溯到图1所示的状态机所描述的规则。
现在我们需要捕获围绕命令序列的规则。回想一下,我们的目标是生成三个命令的序列。因此,我们定义了已经讨论过的指令类的三层数组。
图7. 命令序列类(Mentor)
请注意,我们还捕获了先前的状态,该状态将是序列的最后一条命令执行后的设备状态(或初始状态)。
图8. 状态转换约束(Mentor)
图8中所示的约束根据所执行的命令在命令序列的每个步骤中计算状态变量的值。例如,如果最后一个命令是SRE(self-refresh enter,自刷新输入),则此命令的设计状态将为“refresh(刷新)”。另外还请注意,第一个命令的状态被设置为等于从“prev_state”字段中捕获的上一个命令序列末尾开始的状态。现在,我们已经定义了用于生成LPDDR命令的三个深度命令序列的激励模型。
命令序列建模
我们的命令序列以三个命令为单位生成,我们的测试台可能会希望分别使用这些命令。如图9所示,我们采用的集成方法是一次生成三个命令,然后通过“run_cmd”任务一次只执行一个指令,将它们应用到测试台。
图9. 集成命令序列的生成器(Mentor)
使用约束以声明方式对命令序列进行建模,使我们能够通过限制其中的元素来轻松塑造命令序列。以这种方式对命令序列进行建模还使我们能够利用自动化以理解约束关系。
我们在生成所有合法命令序列时将面临的挑战之一是收集覆盖率以证明我们这样做了。在这里,一个关键的挑战是由于命令序列上的约束,相当数量的看似有效的序列实际上是无效的。因此,手工创建功能覆盖率描述非常困难。
幸运的是,诸如西门子Mentor的inFact之类的自动化工具能理解约束关系,并可以自动生成功能覆盖率和排除仓bins,以标记约束无法达到的情况。
第一步是在CSV(comma-separated value,逗号分隔值)文件中捕获覆盖率目标,如图10所示。其描述非常高级,仅声明了必须在每个“cmd”字段上创建一个覆盖点,并且必须从这些覆盖点创建交叉覆盖。
图10. 覆盖率定义文件(Mentor)
我们的覆盖率规范仅需要捕获我们关心的目标:三层深度的命令序列数组中的三个命令之间的交叉。
因为我们的命令序列是在约束中捕获的,所以可以通过静态分析来确定可达到和不可达到的组合。这使排除仓bins(参见图11)能够自动生成,而无需手工费力地创建。与声明式指定相比,这是一笔可观的节省。
图11. 命令序列覆盖率排除(Mentor)
静态分析还可以准确地告诉我们有多少组合可以到达 —— 在该例中有187,845个组合可以达到。
在命令序列的生成中所获得的优势
如我们所见,命令序列是进行序列设计的一种强大方法,并且使用约束来生成命令序列允许我们能够进行自动化测试创建。使用基于约束的声明式描述,可以轻松地将命令序列集中在感兴趣的领域上。由于状态空间是以静态分析的方式完全建模的,因此它使诸如inFact的自动化工具能够生成SystemVerilog功能覆盖率。下次遇到命令序列生成的挑战时,这种使用命令之间的关系建模的模式可以为您带来巨大的优势。
进一步阅读
要了解关于便携式激励如何使创建可重用场景变得更加容易的更多信息,请下载白皮书,使用便携式激励构建更好的虚拟序列(加入超链接)https://www.mentor.com/products/fv/resources/overview/building-a-better-virtual-sequence-with-portable-stimulus-2dfec93d-6f89-4aeb-91e4-fea401a7e72b?cmpid=10166。在Verification Academy上能找到更多的便携式测试和激励资源,包括课程和虚拟实验室。
关于作者
Matthew Ballance是Mentor Graphics的产品工程师和便携式激励技术人员,与Questa inFact便携式激励产品一起工作。在EDA行业有20多年的经验,他曾在硬件/软件协同验证、事务级建模以及IP封装和重用领域从事产品开发、营销和管理职务。Matthew毕业于俄勒冈州立大学。
点击【阅读原文】可直达课程页面,马上试听
往期精彩:
理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够