当前位置: 首页 > news >正文

SystemVerilog Assertion精华知识

前言

断言主要用于验证设计的行为。断言也可用于提供功能覆盖率,并标记用于验证的输入激励不符合假定的需求。

在验证平台中,通常进行三个主要任务:

  • 产生激励
  • 功能检查
  • 功能覆盖率度量

在当今的设计越来越复杂情况下,像波形调试这样的方式很容易出现人为错误,因此验证平台应该有一种自动和动态地检查预期结果的方式,这将使调试过程更容易,也使回归测试更有效。功能检查通常针对两个特定领域:

  • 协议检查:检查目标是控制信号,控制信号的有效性是任何设计验证的核心;
  • 数据检查:检查目标是所处理数据的完整性,比如网络传输的数据包是否有损坏;

SystemVerilog中引入的SVA在协议检查和协议覆盖率方面可以发挥重要的作用,它们更接近设计信号,通过将这些断言直接连接到设计,一方面便于管理,另一方面仿真性能可以得到极大的提高。SVA语言本身非常简洁,且提供了很好的时序控制能力。

那么什么是断言(SVA, SystemVerilog Assertion)呢?我们可以找到对它的经典解释。断言是对设计属性的描述:

  • 如果在仿真中检查的属性没有按照我们期望的方式运行,则断言失败;
  • 如果在仿真中出现了在设计中禁止发生的行为属性,则断言失败;

其实简单来说,就是该发生的一定要发生,不应该发生的就决不能发生,否则断言就失败了,进而产生报错信息

设计属性通常可以从设计的功能规范中提取,并转换为断言。这些断言一方面可以用于功能仿真期间持续监控设计行为,另一方面也可以通过使用Formal技术来验证设计。

SVA调度

SystemVerilog语言是基于事件(events)的执行模型。在每个time slot内,把所有发生的事件按顺序排序处理。关于SV events的调度,可以看下我之前写的一篇文章《详解SystemVerilog中time slot的调度》。通过遵循SV的调度算法,仿真器可以避免设计和验证平台交互过程的错乱,而且也让开发人员有迹可循,写出稳定的代码。断言的采样、评估和执行涉及time slot里的三个regions(区域)。

  • Preponed:该区域对断言变量进行采样。在这个区域内,net和variable不会改变其状态,这就允许在time slot的开始处采样到最稳定的值。
  • Observed:所有属性表达式(property expressions)都在该区域中求值。
  • Reactive:评估属性(property)的成功或失败在这个区域进行。

SystemVerilog事件调度流程图简化如图1所示。

图1 简化的SV事件调度流程图

SVA分类

SystemVerilog语言中定义了两种类型的断言:Concurrent assertions(并发断言)Immediate assertions(立即断言)。并发断言和立即断言的关键区别是property关键字

并发断言有这几个特性:

  • 基于时钟周期;
  • 基于所涉及变量在时钟边沿的采样值进行表达式求值;
  • 变量的采样是在Preponed region中完成,表达式的求值是在Observed region中完成;
  • 可以放在procedural block, module, interface, program, general block或checker定义中;
  • 可以在formal和simulation工具中使用;
  • 并发断言语句可以是assert, assume, cover或restrict
  • 可以通过其可选名称来层次引用,当未提供名称时,工具会为其自动生成;

它的定义为:

concurrent_assertion_item ::=[ block_identifier : ] concurrent_assertion_statement...
procedural_assertion_statement ::=concurrent_assertion_statement...
concurrent_assertion_statement ::=assert_property_statement| assume_property_statement| cover_property_statement| cover_sequence_statement| restrict_property_statement
assert_property_statement::=assert property ( property_spec ) action_block
assume_property_statement::=assume property ( property_spec ) action_block
cover_property_statement::=cover property ( property_spec ) statement_or_null
cover_sequence_statement::=cover sequence ( [clocking_event ] [ disable iff ( expression_or_dist ) ] sequence_expr ) statement_or_null
restrict_property_statement::=restrict property ( property_spec ) ;

图2 并发断言定义

立即断言有这几个特性:

  • 基于simulation events语义;
  • 表达式的求值与procedural block中的任何其它Verilog表达式一样,本质上是立即求值的;
  • 必须放在procedural block定义中;
  • 用于simulation工具中使用;
  • 立即断言语句可以是assert, assume或cover;

它的定义为:

procedural_assertion_statement ::=...| immediate_assertion_statement...
immediate_assertion_statement ::=simple_immediate_assertion_statement| deferred_immediate_assertion_statement
simple_immediate_assertion_statement ::=simple_immediate_assert_statement| simple_immediate_assume_statement| simple_immediate_cover_statement
simple_immediate_assert_statement ::=assert ( expression ) action_block
simple_immediate_assume_statement ::=assume ( expression ) action_block
simple_immediate_cover_statement ::=cover ( expression ) statement_or_null
deferred_immediate_assertion_item ::= [ block_identifier : ] deferred_immediate_assertion_statement
deferred_immediate_assertion_statement ::=deferred_immediate_assert_statement| deferred_immediate_assume_statement| deferred_immediate_cover_statement
deferred_immediate_assert_statement ::=assert #0 ( expression ) action_block| assert final ( expression ) action_block
deferred_immediate_assume_statement ::=assume #0 ( expression ) action_block| assume final ( expression ) action_block
deferred_immediate_cover_statement ::=cover #0 ( expression ) statement_or_null| cover final ( expression ) statement_or_null
action_block ::=statement _or_null| [ statement ] else statement_or_null

图3 立即断言定义

断言的声明关键字有以下类型:(属性大家可以把它理解成一种设计行为)

  • assert: 这个关键字是大家最常见的,它指定属性为要检查的设计行为,并验证该属性是否成立;
  • assume: 指定属性作为环境的假设。Formal工具使用该信息生成输入激励,仿真器检查属性是否成立;
  • cover: 收集属性是否被覆盖到;
  • restrict: 指定属性作为formal验证计算的约束,仿真器不需要检查该属性;(可以看出这个关键字是不用于立即断言的)

构建SVA模块

立即断言的构建比较简单,直接写上assert/assume/cover + statement就好了。这一小节主要是讲并发断言的构建,它有很多种构建方式,这里列下比较常用的方式。

在任何设计模型中,功能都由多个逻辑事件的组合表示。这些事件可以是在同一时钟边沿计算的简单布尔表达式,也可以是涉及多个时钟周期的一段时间内计算的事件。SVA提供了一个关键字来表达这些事件,称为“sequence”。sequence的基本语法如下所示:

sequence name_of_sequence;< test_ expression > ;
endsequence

图4 sequence的基本语法

许多sequences可以按逻辑或顺序组合以创建更复杂的sequences。SVA提供了一个关键字来表示这些复杂的顺序行为,称为“property”。property的基本语法如下所示:

property name_of_property;< test expression >; or< complex sequence expressions >;
endproperty

图5 property的基本语法

property是在仿真期间生效并进行验证的,SVA提供了一个“assert”的关键字来检查property。assert的基本语法如下所示:

assertion_name : assert property ( property_name ) ;

图6 assert的基本语法

因此,创建并发SVA断言所涉及的通用步骤如下图7所示。

图7 创建并发SVA断言通用步骤

例子

5.1 立即断言例子

下面代码为立即断言的一个简单例子:

always_comb beginia_blk: assert(a && b);
end

立即断言ia_blk是作为procedural块的一部分写入的,它遵循信号“a”和“b”的相同事件调度,也就是如果信号“a”和“b”发生变化,那么always_comb块就执行。ia_blk的仿真结果如图8所示。断言成功用向上蓝色箭头表示,断言失败用向下红色箭头表示。

图8 立即断言ia_blk仿真结果

5.2 并发断言例子

下面代码为并发断言的一个简单例子:

sequence s_ab;a && b;
endsequenceproperty p_ab;@(posedge clk) s_ab;
endpropertyca_blk: assert property (p_ab);

并发断言ca_blk的结果如图9所示。同样的,所有的成功用向上蓝色箭头表示,所有的失败用向下红色箭头表示。这个例子中的关键概念是,无论信号“a”和信号“b”是否改变,该属性都在时钟clk的每个上升沿上求值检查。

图9 立即断言ca_blk仿真结果

将立即断言和并发断言对a&&b的仿真检查结果放在一起,结果如图10所示。

图10 立即断言和并发断言对a&&b的仿查结果

从这个结果可以看出,立即断言procedural block中的任何其它Verilog表达式一样,都是当个cycle立即求值的。而并发断言有点像使用default input #1step的clocking block中的信号采样求值。

总结

本文主要是从大框架上梳理SVA的知识点,从为什么需要SVA,有什么好处,SVA分类,SVA调度和检查机制、以及举了两个简单直观的例子,帮忙读者们快速get到SVA的全貌。有了这个宏观了解,对于比较细节(微观)的语法,大家可以翻翻工具书看看,或者用到的时候再查找下。

往期精彩内容:

芯片验证分享系列总结及PPT分享

相关文章:

SystemVerilog Assertion精华知识

前言 断言主要用于验证设计的行为。断言也可用于提供功能覆盖率&#xff0c;并标记用于验证的输入激励不符合假定的需求。 在验证平台中&#xff0c;通常进行三个主要任务&#xff1a; 产生激励功能检查功能覆盖率度量 在当今的设计越来越复杂情况下&#xff0c;像波形调试…...

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…...

Butter Knife 8

// 部分代码省略… Override public View getView(int position, View view, ViewGroup parent) { ViewHolder holder; if (view ! null) { holder (ViewHolder) view.getTag(); } else { view inflater.inflate(R.layout.testlayout, parent, false); holder new ViewHolde…...

AMSR/ADEOS-II L1A Raw Observation Counts V003地球表面和大气微波辐射的详细观测数据

AMSR/ADEOS-II L1A Raw Observation Counts V003 简介 AMSR/ADEOS-II L1A Raw Observation Counts V003数据是由日本航空航天研究开发机构&#xff08;JAXA&#xff09;的AMSR (Advanced Microwave Scanning Radiometer)仪器收集的一组原始观测计数数据。这些数据是从ADEOS-I…...

MySQL之复制(十一)

复制 复制的问题和解决方案 数据损坏或丢失的错误 当一个二进制日志损坏时&#xff0c;能恢复多少数据取决于损坏的类型&#xff0c;有几种比较常见的类型: 1.数据改变&#xff0c;但事件仍是有效的SQL 不幸的是&#xff0c;MySQL甚至无法察觉这种损坏。因此最好还是经常检查…...

深入源码设计!Vue3.js核心API——Computed实现原理

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…...

驾考小技巧:老北京布鞋!距离高考出分还剩3天,我却看到有些孩子已经拿了“满分”——早读(逆天打工人爬取热门微信文章解读)

我20年驾校4000多块钱&#xff0c;你呢&#xff1f; 引言Python 代码第一篇 洞见 距离高考出分还剩3天&#xff0c;我却看到有些孩子已经拿了“满分”第二篇 视频新闻结尾 引言 昨天的文章顺利发出 看来“梅西” 这两个字在我们这边 不是敏感词 只是很多个罗粉搞得有点过头了 …...

java-正则表达式 2

7. 复杂的正则表达式示例&#xff08;续&#xff09; 7.1 验证日期格式 以下正则表达式用于验证日期格式&#xff0c;例如YYYY-MM-DD。 import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String[] dates {"2023-01-01&q…...

hadoop常见简单基础面试题

文章目录 hadoop简单基础面试题1. 请说下 HDFS 读写流程2. HDFS 在读取文件的时候&#xff0c;如果其中一个块突然损坏了怎么办3. HDFS 在上传文件的时候&#xff0c;如果其中一个 DataNode 突然挂掉了怎么办4. NameNode 在启动的时候会做哪些操作5.Secondary NameNode 了解吗&…...

泄漏检测(LDAR)在建档和检测过程中造假套路和不规范行为

第一章 建档环节造假和不规范 一、 企业行为&#xff1a; 企业为了节约检测费&#xff0c;采取部分建档&#xff0c;部分密封点检测的行为 二、 第三方检测公司不规范行为&#xff1a; 1、台账信息不准确&#xff0c;密封点命名不准确 &…...

Android CTS环境搭建

CTS即Compatibility Test Suite意为兼容性测试&#xff0c;是Google推出的Android平台兼容性测试机制。其目的是尽早发现不兼容性&#xff0c;并确保软件在整个开发过程中保持兼容性。只有通过CTS认证的设备才能合法的安装并使用Google market等Google应用。 搭建CTS测试环境需…...

比较Zig、Rust和C++

比较Zig、Rust和C这三种编程语言&#xff0c;我们可以从以下几个关键维度来进行&#xff1a; 设计理念 表格 语言 设计理念 Zig 简洁性、模块化、避免常见错误 Rust 内存安全、并发性、性能 C 性能优化、资源控制、可扩展性 内存安全 Zig通过严格的编译时检查、可选…...

路由的params参数,命名路由,路由的params参数,命名路由

上篇我们讲了vue路由的使用 今天我们来讲vue中路由的嵌套&#xff0c;路由的params参数,命名路由 一.路由的params参数 1.配置路由规则&#xff0c;使用children配置项&#xff1a; router:[{path:/about,component:About,},{path:component:Home,//通过children配置子路由c…...

java:CompletableFuture的简单例子

java&#xff1a;CompletableFuture的简单例子 package com.chz.myTest;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.uti…...

element的table获取当前表格行

需求&#xff1a;验证表格同一行的最低限价不能超过销售定价 思路&#xff1a;先获取当前行table的index&#xff0c;然后在做大小比较 1.局部html <el-table-column label"销售定价(元)" min-width"200px"><template slot"header"&…...

html做一个分组散点图图的软件

在HTML中创建一个分组散点图&#xff0c;可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能&#xff0c;易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例&#xff1a; 要添加文件上传功能&#xff0c;可以让用户上传包含数据的文…...

【SQL】UNION 与 UNION ALL 的区别

在 SQL 中&#xff0c;UNION 和 UNION ALL 都用于将两个或多个结果集合并为一个结果集&#xff0c;但它们在处理重复数据方面有显著区别。以下是它们的详细区别&#xff1a; 1. UNION UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c;并自动去除结果集中重复…...

分类判决界面---W-H、H-K算法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…...

Python基础教程(三十):math模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

你只是重新发现了一些东西

指北君关于另外一条思维路径的发现。 "自以为是"的顿悟时刻 有很多时候&#xff0c;我会"自以为是"的发现/发明一些东西。这种"自以为是"的时刻通常还带有一些骄傲自豪的情绪。这种感觉特别像古希腊博学家阿基米德 在苦思冥想如何测量不规则物体…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...