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毕业于俄勒冈州立大学。

原文链接:https://www.techdesignforums.com/practice/technique/make-it-easier-to-exercise-state-machines-with-systemverilog/

点击【阅读原文】可直达课程页面,马上试听

往期精彩:

V2Pro春季班普遍学撑了,秋季班7月报名你还敢来么

30w+还送股送房?60+IC企业2019薪资全面攀升!

UVM RAL模型:用法和应用

我们准备做第二期线下培训,依旧认真且严肃

如果你突然被裁员了,你的Plan B是什么?

[彩虹糖带你入门UVM]

理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够

使用SystemVerilog使状态机的运行更加容易相关推荐

  1. Android 4.2.2原生Launcher修改使之可以运行过程小结

    Android 4.2.2原生Launcher修改使之可以运行过程小结 要想让原生的Launcher代码能运行起来,主要有三个问题: 1.Launcher类编译不过的问题:com.android.co ...

  2. 在Intel处理器上,修改mitigations参数使Linux系统运行得更快

    您可能听说过影响了许多现代处理器,包括英特尔,AMD,System Z,Power和ARM的某些处理器.幸运的是,内核开发人员已经发布了安全补丁来解决Meltdown/Spectre问题,在最新的内核 ...

  3. linux 使进程后台运行:/nohup/disown

    在linux机器上工作,大多都是本地电脑通过xshell之类的工具连接到远端的linux主机上.当我们在终端或者控制台工作时,不希望由于运行比较耗时的作业而占用了当前屏幕: 也可能我们的电脑和远端的l ...

  4. 如何设置计划任务程序 每6小时运行一次_如何使win10系统运行的更快?

    微软推出的新操作系统Windows 10越来越受到欢迎,用户越来越多,大家是不是会有这样的感觉:同一款电脑,同样的配置,为什么有的人的电脑用起来非常的流畅,而有的人就连打开个网页都卡的要命:有的人的电 ...

  5. 怎么使计算机软件运行快w10,如何使win10系统运行的更快?

    微软推出的新操作系统Windows 10越来越受到欢迎,用户越来越多,大家是不是会有这样的感觉:同一款电脑,同样的配置,为什么有的人的电脑用起来非常的流畅,而有的人就连打开个网页都卡的要命:有的人的电 ...

  6. 如何使一个正在运行的进程慢下来?哦,不,是暂停

    sleep? renice? ionice? cpulimit? 连着上了两周班,搞的闷了一脸痘,右下巴起了个大包,现在还没好,我是谁?为了谁?为了兄弟姐妹不流泪?谁最美?谁最美? 那个周六还是我生日 ...

  7. 使用互斥体使程序只运行一个

    何为互斥体 引用了百科的话 互斥体实现了"互相排斥"(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码&qu ...

  8. 使用screen在云服务器上部署项目使其一直运行与结束该项目

    一.运行 1.安装screen centos7 yum install screen Ubuntu sudo apt-get install screen 2.创建screen窗口 screen -S ...

  9. Android变相拦截Home键,使app一直运行在前端

    首先,声明一下楼主不是流氓程序猿,也很痛恨流氓软件.主要是媳妇最近要考试,想让我写个程序把她手机锁一段时间,让她安心看书...好吧主观能动性太差的表现==.于是楼主就琢磨起来怎么能够实现这样的需求. ...

最新文章

  1. 看到这些代码,我自叹不如!!!
  2. 获取URL中 后面的参数值
  3. redis的各种数据集的列举功能
  4. Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上
  5. 工业机械人运动学正逆解,简单粗暴!!!!!!
  6. 披星戴月地辛苦割胶或成历史,海南胶园迎来这一“神器”!
  7. debugger怎么用_谷歌开发者工具,这些技巧你用过么?
  8. 前 k 条最短路径算法
  9. TOM小游戏《大球吃小球》评测报告
  10. 博士申请 | 美国明尼苏达大学葛畅教授招收隐私数据管理方向全奖博士/硕士/博后/访问学者...
  11. landesk 卸载_LANDesk软件分发在项目中的深入探索(续2)—客户端已安装应用程序的远程卸载...
  12. 统计每个日期新用户的次日留存率
  13. songtest 歌曲下载 器
  14. 计算机网络笔记(王道考研) 第三章:数据链路层
  15. pdf转换成jpg转换器教程
  16. 【AI视野·今日CV 计算机视觉论文速览 第215期】Tue, 8 Jun 2021
  17. X5腾讯内核 安装线上内核本来能用,突然报115错误问题记录
  18. android近期任务栏图片生成过程
  19. C语言进阶-高阶指针
  20. Windows 7系统盘清理

热门文章

  1. Keil C51V901安装
  2. android 页面退出动画,android Activity打开和关闭动画
  3. JavaEE——SmartTomcat的使用教程与常见错误
  4. Linux中rz -y命令和rz -E命令的区别
  5. 抓取“矢量”的实时交通流量数据
  6. SGU 103 Traffic Lights 翻译 题解
  7. 3DMarkVantage 解析
  8. 【未完待续!!!】postmarketOS跃跃欲试-欲哭无泪。。。坐等ip4脱离Non-booting devices
  9. 神经网络基本原理简明教程之基础知识之数学表达式
  10. python画人民大会堂_太震撼了,我用python画出全北京的公交线路动图