覆盖率

RTL代码覆盖率衡量测试案例验证覆盖了哪些设计规格在RTL中实现了,而不能衡量验证计划行(Line Coverage):RTL中的代码行有限状态机(FSM Coverage):RTL代码中的有限状态机的状态和状态之间的转化路径(Path Coverage):RTL中的路径分支(if-else语句)信号翻转(Toggle Coverage):RTL中的一个信号从0跳变到1,以及从1跳变到0表达式(Expression coverage):RTL代码中的条件表达式,例如if(a&b&c)所有的结果
Assertion Coverage断言覆盖率断言是一种声明性的代码,用于检查RTL代码中的信号之间的关系断言可以使用过程性的代码或者使用SystemVerilog Assertion断言可以检查信号的值或者设计的状态
covergroup封装覆盖率模型每个covergroup包含以下内容一个时钟时间,用于同步采样覆盖率一组覆盖点覆盖点之间的交叉覆盖可选的形式参数覆盖率选项Covergroup是用户定义的一种结构类型定义好类型之后,可以在不同的程序中多次例化跟class类似,定义完成后,可以通过构造函数new()生成covergroup的实例covergroup可以定义在module,program,interface,或者class中一个covergroup可以包含一个或多个覆盖点一个覆盖点可以是一个变量或者一个表达式每个覆盖点有一组bin值,这个值跟采样的变量或者变量的转换有关Bins的值可以由用户自己定义,或者EDA工具自动生成Covergroup的命名要清晰明了,通过名称就可以确认覆盖的功能是什么,最好跟验证计划统一
定义覆盖点:bins采样数据:bins私有bins和总覆盖率SystemVerilog自动为覆盖点创建bins一个N位的表达式有2**n个有效值一个3bit的变量port有8个有效值限制自动生成的bins的数量cover group选项auto_bin_max指定自动生成的bins的最大数量,默认值为64bins用户自定义bins用户限制覆盖率统计时需要的数值SystemVerilog不再自动创建bins,并且忽略非用户定义的bins值只用用户定义的bins值来计算功能覆盖率用户默认bins值可能被遗忘条件覆盖率:使用关键字iff为覆盖点添加条件使用start和stop函数

断言Assertion

断言的表达SystemVerilog断言是通过关键字property来体现的,它定义了设计的意图,可以对设计中的语句进行检查
定义:断言是一种语言,用于描述一个熟悉必须为真,也是一种指示性符号,使用验证工具可以对属性进行检查。
使用基于断言的验证方法的原因(ABV)1、断言用于描述复杂设计的行为和属性2、ABV可以指导验证工作,加速验证进度,因为ABV通过白盒验证提供反馈信息,简化验证平台,将大量的检查任务转换为断言,替代用户自己定义的模型3、SVA(SystemVerilog Assertion)允许验证平台具有被动行为,也就说根据断言的成功或失败可以采取不同的行为
目的:根据设计的可观察性,对RTL内部状态进行白盒测试断言类型:Application AssertionInterface AssertionStructural Assertion验证协议描述时序和组合电路属性定义信号的值,以及信号的关系
Assertion PropertyProperty:属性是描述RTL设计中的行为、规则和特性的一组信号和信号之间的关系在逻辑设计中,属性一般可以分为功能和结构。属性包括以下信息:- 死锁状态DeadLock states(两个FSM彼此等待)- 终止状态Terminal states (一个状态不能退出)- 不可达状态Unreachable states(不能进入某一状态)- 跨时钟域信号不稳定Clock crossing domain instability(亚稳态)- Full case/parallel case问题- Lint(编程风格违例)断言定义的属性是RTL设计必须遵守的特性属性可以用于验证,作为假设条件、检查器或者覆盖率,关键字为:assert、assume、cover属性可以自我声明一个属性,而不产生任何结果属性可以声明在Moduleinterfaceclocking blockpacket属性演进的结果为真或假Sequeence:断言提供一种化整为零的方式,管理横跨较长的仿真时间断言序列可以描述的常见场景是:- 复位(reset)结束- 高层属性结束条件(abort)- 多个属性的共同起点Thread:在SVA中,线程是 一个组相关的事件序列,持续一个或多个时钟周期,表示一种设计属性例如,一个总线请求,会在1到5个时钟周期内,得到一个确认信号,这称为一个线程。每个时钟周期都可以启动一个线程,每一个线程都是独立的,跟前期启动的线程没有关系SVA在每一个时钟周期都会检查asserted/assumed/covered的属性如果一个属性由一个多时钟周期的表达式组成,每一个属性的起始点都是一个线程很多应用都会触发一个事件,这个事件会启动一个线程,如果触发的事件没有发生,那么属性 不会演进,可以认为是伪真Antecedent/Consequent:SVA中的线程具有因果关系,有两种操作符:|->Overlapped:起因和结果处于同一个时钟周期|=>Mon-overlapped:结果处于起因的下一个时钟周期
断言分类Immediate Assertion:立即断言立即断言的执行遵循仿真事件的语法,在过程语句块中执行方式类似于语句立即断言主要用于仿真Concurrent Assertion:并发断言并发断言是基于时钟周期的,使用变量的采样值并发断言用于描述一个跨一定时间的行为立即断言检查一个过程代码中表达式的执行结果immediate_assert_statement::=assert(expression)action_block表达式是非时间性的,等同于if语句中的条件表达式因为断言是一种语句,用于检查表达式的值是否为真,当断言失败时必须采取相应的仿真行为默认情况下,断言失败的行为是error。其他行为等级如下:$fatal 仿真时出现致命错误$error 仿真时出错错误$warning 仿真时出现警告$info 提供断言失败的信息,不影响仿真并发断言描述一个跨一段时间的行为基于时钟周期的演进模型关键字property用于区分并发断言和立即断言assert_property_statement:=assert property(property_spec)action_block;assume_property_statement:=assume property(property_spec);cover_property_statement:=cover property(property_spec)statement_or_null;验证指示符- assert:指定属性是一个检查器,确保设计必须满足该属性- assume :指定属性是验证环境的一个假设或前提条件- cover :为覆盖率监视属性的演进并发断言是基于时钟周期的用户显示指定时钟clock tick是时钟周期clock tick在一个时钟周期内只能使能一次,仿真时间内采样的值用于计算并发断言在断言中,只有在clock tick采样的值才有效确保定义的时钟没有毛刺,否则采样值有误如果变量即出现在clock表达式中,也同时出现在断言表达式中,变量的值在两个地方可能不同时钟表达式的当前值,是断言中的采样值
Assertion SequeenceProperties 常用于构建时序电路行为sequence 提供构建和管理时序行为的能力最简单的时序行为是线性的lineaar sequence是按照时间线性增加的一组SV布尔表达式的列表对于线性序列,在一个时钟周期,序列的第一个布尔表达式的值要为真,在第二个时钟周期,序列的第二个表达式的布尔逻辑要为真,以此类崔,直到最后一个时钟时,最后一个布尔逻辑值要为真序列发生的内容决定了序列的演进在第一个时钟周期,首先检查序列中的第一个表达式,该值为真时,触发整个序列的演进在之后的仿真时钟周期内,会连续检查序列中的每一个布尔逻辑sequence 匹配:req ##1 gnt ##1 !req在当前仿真时间内req必须为真,在下一个时钟周期gnt必须为真,在第三个时钟周期,req必须为假sequence s1;@(posedge clk) a ##1 b ## [0:3] c;endsequence在clk的上升沿a为真开始匹配(此时为当前时间),下一个时钟周期b为真,经过0,1,2或者3个时钟周期之后c为真sequence重复操作符:[*n]a ##1 b ##1 b ##1 b ##1 c 等价于 a ##1 b[*3] ##1 c[*min:max]可能有min到max种匹配情况a ##1 b[*3:4] 等价于 (a ##1 b[*3] ##1 c 或 a ##1 b[*4] ##1 c)[->n]a ##1 b[->2] ##1 c 等价于 a ##1 !b[*0:$] ##1 b ##1 !b[*0:$] ##1 b ##1 c[->min:max]a ##1 b[->2:10] ##1 c 等价于 a ##1 ((!b[*0:$] ##1 b)[*2:10]) ##1 c[=n]a ##1 b[=2] ##1 c 等价于 a ##1 !b[*0:$] ##1 b ##1 !b[*0:$] ##1 b ##1 !b[*0:$] ##1 c[=min:max]sequence 采样函数$sampled:在时钟事件的最后时刻采样的表达式的值$rose:判断上升沿,如果表达式的值跳变为1,$rose函数返回真,否则返回假$fell :判断下降沿,如果表达式的值跳变为0,$fell函数返回真,否则返回假$stable:判断信号的稳定不变,如果表达式的值保持稳定不跳变,$stable函数返回真,否则返回假$past:返回当前时钟周期之前的一个时钟周期表达式的采样值序列and操作and操作符表示两个序列是匹配的,但是他们的结束时间不一致两个序列具有相同的起点当一个序列匹配时,它就等待其他的序列匹配组合序列的结束时间是由最后结束的序列决定的两个序列and操作之后仍是序列。and操作要求两个序列必须匹配。intersection交互操作符insertion用于描述两个序列匹配并且两个序列的结束时间必须一致两个序列必须匹配两个序列的长度是一样的序列or操作符操作符or用于描述两个序列至少有一个是匹配的如果有两个序列s1和s2,那么在任何一个时刻s1和s2是操作符or匹配,是至少有一个序列为真first_match操作符如果有多个匹配序列时,序列操作符first_match只返回第一个匹配序列这样可以根据需要放弃后续的匹配序列特殊情况下,当一个序列是另外一个序列的子序列时,使用first_match操作符会影响序列的结束throughout跨越序列在假设前提下,一个序列才会发生正确的行为逻辑假设前提条件必须为真检查和使用一个序列的结束点不管序列匹配的起始点是什么,当到达序列匹配的时钟点时,就是序列的结束点使用ended关键字可以测试任何序列是否到达结束点
断言属性assertion property|->implication:从起始点,原因序列(先行算子)sequence_expr可以匹配0,1或多次如果先行算子没有匹配成功,那么从起始点|->implication是伪真,返回值为真(序列没有被触发)当先行算子匹配成功时,后行算子进行仿真,先行算子序列匹配的结束点时后行算子序列仿真的起始点对每一个起始点,当先行算子没匹配成功一次,|->操作符之后的结果序列匹配时返回真
多时钟周期序列多时钟周期序列的结果可能是真或假多时钟周期序列的结果是由单一时钟的子序列组合而成,使用##1作为延迟信息##1不重叠,用于两个序列间时钟的同步##1是单一延迟,表示从第一个时钟的序列结束点到最近的第二个时钟的序列开始多时钟属性布尔属性操作符(not、and、or)可以自由组合单一或者多时钟属性操作符|=>可以同步先行算子的时钟结束点和子序列的多个时钟点因为操作符|->要求原因序列的结束点和结果序列的起始点必须处于同一个时钟周期,所以原因序列的结束点必须与结果序列的起始点一致

【SV】SystemVerilog语法总结 3.0相关推荐

  1. [SV]SystemVerilog枚举型变量语法详解及应用举例

    SystemVerilog枚举型变量语法详解及应用举例 This section provides the examples to declare SystemVerilog enum of logi ...

  2. vim加载systemverilog语法高亮

    需要加载systemVerilog.vim的脚本,该脚本的下载路径为 systemVerilog的vim语法高亮脚本https://download.csdn.net/download/cy41302 ...

  3. [SV]SystemVerilog 断言(SVA)检查器库(OVL)

    SystemVerilog 断言(SVA)检查器库(OVL) 前言:SystemVerilog 断言(SVA)检查器库由如下两部分组成: 由检查器组成的SystemVerilog验证库(SVL),这些 ...

  4. [SV]SystemVerilog Constraints(1)

    SystemVerilog Constraints(1) 一.Soft Constraints SystemVerilog constraints declared with the keyword ...

  5. [SV]SystemVerilog学习笔记之struct union

    SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...

  6. Android.bp 语法浅析-Android10.0编译系统(八)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  7. mysql8 create table 语法错误_MySQL8.0 Window Function 剖析

    title: $MySQL8.0 Window Functions 剖析 author: $马腾 什么是window function window function 是在满足某种条件的记录集合上执行 ...

  8. 前端语法重温从0到1入门

    文章目录 前言 一.HTML是什么? 二.HTML标签 三.HTML文档=网页 四.HTML编辑器 五.HTML 标题 六.HTML 段落 七.HTML 链接 八.HTML 图像 九.HTML 元素 ...

  9. [SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)

    SystemVerilog压缩数组和非压缩数组 The term packed array is used to refer to the dimensions declared before the ...

最新文章

  1. wget抓取数据,需要用户登录验证
  2. 每日一皮:宿舍阿姨眼中的单身狗...
  3. 不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
  4. linux重新安装mysql步骤_Linux下MySQL安装及相关操作过程
  5. Java:一个分数类的简单设计
  6. Java线程:新特征-有返回值的线程(转)
  7. 云企业网CEN-TR打造企业级私有网络
  8. iTOP-4418开发板支持动态调频,AXP228电源管理,预留锂电池接口,内置充放电电路及电量计...
  9. Oracle 日期加减运算
  10. verilog之门级相关知识
  11. 查看Linux是Redhat 还是centos 还是...
  12. 使用MonkeyTest对Android客户端进行压力测试 自动化代码
  13. 通过网易云歌单链接下载网易云歌曲
  14. Lena图像原图及由来
  15. 阿里云建站备案必要性
  16. 参数的点估计问题与矩估计法
  17. 【Android容器组件—LinearLayout】
  18. windows.old是什么文件,如何删除
  19. 【云周刊】第209期:Perseus(擎天):统一深度学习分布式通信框架 [弹性人工智能]...
  20. 路由器DMZ简单解说

热门文章

  1. 开发框架-Spring
  2. Excel中的HLOOKUP、VLOOKUP、XLOOKUP函数
  3. php 药 网站 源码,医药药品医疗保健行业网站织梦模板源码 v5.7
  4. Spring Cloud Zuul之ZuulFilter详解
  5. linux服务器的物理CPU,CPU核数,逻辑CPU及Hadoop的Vcore
  6. 基于pboc的电子钱包的圈存过程
  7. php uniqid 纯数字,使用PHP uniqid函数生成唯一ID
  8. 聊聊分布式存储系统中的心跳机制以及主节点下发指令给从节点
  9. Linux:Ubuntu 国内源介绍
  10. 大四考研没上岸怎么快速获得大厂offer呢?