SystemVerilog Assertion精华知识

news2024/11/23 12:05:01

前言

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

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

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

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

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

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 begin
    ia_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;
endsequence

property p_ab;
    @(posedge clk) s_ab;
endproperty

ca_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分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1850187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据学习-Hive

介绍 分布式 SQL 计算 做数据的统计分析&#xff0c;SQL 是最方便的工具 在大数据中&#xff0c;有很多的统计分析场景&#xff0c;那么 SQL 来处理大数据是非常合适且频繁的 以后可能就是 SQL Boy 了&#xff0c;所以学习前需要有 MySQL 的基础 Hive 的功能 是一个分布式…

Microsoft Edge无法启动搜索问题的解决

今天本来想清一下电脑&#xff0c;看到visual studio2022没怎么用了就打算卸载掉。然后看到网上有篇文章说进入C盘的ProgramFiles&#xff08;x86&#xff09;目录下的microsoft目录下的microsoft visual studio目录下的install目录中&#xff0c;双击InstallCleanup.exe&#…

什么概率密度函数?

首先我们来理解一下什么是连续的随机变量&#xff0c;在此之前&#xff0c;我们要先理解什么是随机变量。所谓随机变量就是在一次随机实验中一组可能的值。比如说抛硬币&#xff0c;我们设正面100&#xff0c;反面200&#xff0c;设随机变量为X&#xff0c;那么X{100,200}。 X是…

[RK-Linux] RK3562 I2C驱动TP芯片GSL3680

TP芯片GSL3680 1、简介 GSL3680是一款电容屏多点触摸控制单芯片,其芯片内部框架图如下所示: GSL3680采用了独特的互电容感应技术,可以在1ms内测量多达192个节点,支持广泛的传感器选择,包括单层或双层ITO,玻璃或薄膜,采用了先进的抗电磁干扰信号处理技术,使其对各种干…

笑死,裁员裁到大动脉了…

近日&#xff0c;某知名科技公司的裁员事件引起了社会的广泛讨论。 “笑死&#xff0c;裁员裁到大动脉了…” 看起来是大众对裁员事件的戏谑之词&#xff0c;实际上却暗示出了“打工人”的心酸同时也揭开了企业管理层的遮羞布。 &#x1f4a1;裁员决策在项目管理视角下的分析 …

AOP应用之系统操作日志

本文演示下如何使用AOP&#xff0c;去实现系统操作日志功能。 实现步骤 引入AOP包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.6.6</version></de…

【Apache Doris】周FAQ集锦:第 7 期

【Apache Doris】周FAQ集锦&#xff1a;第 7 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

YYU-5/80-260mm型钢筋残余变形测试仪 电子引伸计

YYU-5/80-260mm型钢筋接头专用引伸计&#xff0c;是按照《JGJ 107 2010 钢筋技术连接技术规程》的技术要求设计的&#xff0c;专门用于测试钢筋接头残余变形的双向平均引伸计&#xff0c;其标距可以根据钢筋直径要求进行调整。 完全符合《JGJ 107 2010 钢筋技术连接技术规程》…

Vulnhub--OS-HACKNOS-2.1

渗透复现 目标站点为wordpress&#xff0c;通过wpscan进行漏洞扫描发现漏洞插件 通过漏洞插件存在的目录穿越漏洞成功读取/etc/passwd文件中flag用户的密码 SSH登录flag用户后在备份文件中找到rohit用户的密码 切换rohit用户&#xff0c;rohit用户能够以root权限执行任何文…

靠3个字寻求机会,情商不够,别勉强自己

之前我分享了一篇文章寻求一个自由职业的前端伙伴&#xff0c;吸引了好几位朋友来咨询合作&#xff0c;中间出现了不少插曲&#xff0c;好在结果是令人满意的。 作为一名初次创业者&#xff0c;我承认很多地方做的不是那么到位&#xff0c;比如招聘合作伙伴&#xff0c;理想的状…

监控 Prometheus源码安装实战和动态更新 Centos7

安装go环境 下载go安装包 #创建文件夹 mkdir /usr/local/software #进入文件夹 cd /usr/local/software #下载安装包 wget https://dl.google.com/go/go1.17.6.linux-amd64.tar.gz配置go环境变量 #解压 tar -zxvf go1.17.6.linux-amd64.tar.gz#配置环境变量 echo "exp…

AudioSep:从音频中分离出特定声音(人声、笑声、噪音、乐器等)本地一键整合包下载

AudioSep是一种 AI 模型&#xff0c;可以使用自然语言查询进行声音分离。这一创新性的模型由Audio-AGI开发&#xff0c;使用户能够通过简单的语言描述来分离各种声音源。 比如在嘈杂的人流车流中说话的录音中&#xff0c;可以分别提取干净的人声说话声音和嘈杂的人流车流噪声。…

集合注意事项

目录 我们为什么要用到集合中的迭代器 List实现类的循环遍历 Set集合 HashSet TreeSet Map Hashmap Treemap Hashtable map的遍历方式 Collections的一些静态方法 我们为什么要用到集合中的迭代器 List实现类的循环遍历 如图我们对arraylist中加入了三个相同的“a”…

汽车OTA--Flash RWW属性为什么这么重要

目录 1. OTA与RWW 1.1 FOTA需求解读 1.2 什么是RWW 2.主流OTA方案 2.1 单Bank升级 2.2 基于硬件A\B SWAP的FOTA方案 2.3 基于软件实现的FOTA方案 3.小结 1. OTA与RWW 1.1 FOTA需求解读 CP AUTOSAR R19-11首次提出了FOTA的概念&#xff0c;针对FOTA Target ECU提出了多…

适耳贴合的气传导耳机,带来智能生活体验,塞那Z50耳夹耳机上手

现在大家几乎每天都会用到各种AI产品&#xff0c;蓝牙耳机也是我们必不可少的装备&#xff0c;最近我发现一款很好用的分体式气传导蓝牙耳机&#xff0c;它还带有一个具备AI功能的APP端&#xff0c;大大方便了我们日常的使用。这款sanag塞那Z50耳夹耳机我用过一段时间以后&…

以太坊==使用IDE remix.ethereum搭配metamask发布合约到测试网

IDE地址 Remix - Ethereum IDE 编写代码 部署&#xff0c;选择metamask 查看 部署成功后&#xff0c;可以看到详情地址&#xff0c;查看详情&#xff0c;所以发布合约就是一个TX https://sepolia.etherscan.io/tx/0xe62a0b03ec9f55702cd06f36447fd3c50450a948d59d03c381d97…

postman测试接口使用

背景&#xff1a; 隔了一段时间没有用postman&#xff0c;有些忘记了&#xff0c;谨以此文来记录postman的使用&#xff0c;如有忘记就可以快速回忆 使用&#xff1a; 点击这个号&#xff0c;是创建接口页面 这里的复选框可供我们选择接口的rest方式 请求路径&#xff1a; …

Google trend搜索关键词

Google trend地址&#xff1a;https://trends.google.com/trends/?geoUS&hlzh-CN 1、具体的操作步骤如下&#xff1a; 2、Google trend搜索页面如下&#xff1a;

【金】?Y? python网页前端streamlit

1、如何从 Google Colab Notebook 启动 streamit参考-How to Launch Streamlit App from Google Colab Notebook !streamlit run web.py & npx localtunnel --port 8501 & curl ipv4.icanhazip.com

spire.Pdf 将pdf转成image

一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …