傻白入门芯片设计,SVA常用系统函数(二十三)

 


一、常用系统函数

  • $rose(boolean expression or signal_name)

当信号/表达式由上一个时钟周期的‘0’变成当前周期的‘1’时返回真。

  • $fell(boolean expression or signal_name)

当信号/表达式由上一个时钟周期的‘1’变成当前周期的‘0’返回真。

  • $stable(boolean expression or signal_name)

当信号/表达式的值和上一个时钟周期相同返回真。

  • $changed(boolean expression or signal_name)

当信号/表达式的值改变返回真。(=== ~$stable())

  • $past(signal_name,number of clock cycles)

可以得到信号在几个时钟周期之前的值。在默认情况下,它提供信号在前一个时钟周期的值。

  • $isunknown(expression)

检验表达式的任何位是否是X或者Z。

  • $onehot(expression)

在任意给定的时钟沿,表达式只有一位为高。

safe_gnts = $onehot(gnt)
  • $onehot0(expression)

在任意给定的时钟沿,表达式只有一位为高或者没有任何位为高。

safe_or_no_gnts = $onehot0(gnt)
  • $countones(expression)

计数等于1的位。

num_gnts = $countones(gnt)
  • $countbits(expression, val1, val2,...)

计数指定位的出现次数。

num_gnts = $countbits(gnt, 1'b1)
  • expression inside list

当且仅当表达式在列表中返回真。

safe_opcode = opcode inside {ADD,SUB,MUL}

二、在“时序逻辑”中判断多个序列/信号的行为关系

(1)表示序列间的关系:

  • s1 and s2: 当两个序列都成功时整个属性才成功。两个序列必须具有相同的起始点,但是可以有不同的结束点。检验的起始点是第一个序列的成功时的起始点,而检验的结束点是使得属性最终成功的另一个序列成功时的点。
  • s1 or s2:只要其中一个序列成功,整个属性就成功。
  • s1 intersect s2:断定两个序列在相同时刻开始,且结束于同一时刻。(两个序列的长度必须相等)
  • s1 within s2:表示在s2的整个序列内出现过s1
  • s1 throughout s2:表示在s2整个序列内,s1一直成立。(蕴含只在时钟边沿检验前提条件一次,然后就开始检验后续算子部分,因此它不检测先行算子是否一直保持为真。为了保证某些条件在整个序列的验证过程中一直为真,可以使用“throughout”运算符。)

(2)延迟的用法:

  • a ##2 b 断定a事件发生后2个单位时间内b事件一定会发生。
  • a ##[1:3] b 断定a事件发生后1~3个单位时间内b事件一定会发生。
  • a ##[1:$] b $表示无穷大。断定a事件发生后b事件一定会发生。

(3)重复运算符:

  • 连续重复运算符:

a[*n]:信号a在连续n个时钟周期内都成立。

a[*n:m]:表示a连续出现n到m次,这里n,m为常数。

  • 跟随重复运算符:

a[->3] a连续或间断地出现3次为高,在最后一个a结束的时间点。

  • 非连续重复运算符:

a[=3]表示在信号a出现了3次之后的任意时间点。

非连续重复与跟随重复相似,除了它并不要求信号的最后一次重复匹配发生在整个序列匹配前的那个时钟周期。

(4)蕴含操作符:

蕴含等效于一个if-then结构。蕴含的左边叫作“先行算子”(antecedent),右边叫作“后续算子”(consequent)。先行算子是约束条件。当先行算子成功时,后续算子才会被计算。如果先行算子不成功,那么整个属性就默认地被认为成功。这叫作“空成功”(vacuous success)。蕴含结构只能被用在属性定义中,不能在序列中使用。

蕴含可以分为两类:交叠蕴含(Overlapped implication)和非交叠蕴含(Non-overlapped implication)。

  • 交叠蕴含:

|->: s1 |-> s2 表示s1为真的同一时刻,s2必须为真,s1为假的时候,s2可真可假。

相当于:

if a
  b;
else
  succeed;
  • 非交叠蕴含:

|=>: s1 |=> s2 表示在s1为真的下一个时钟周期s2必须为真,s1为假的下一个时钟周期,s2可真可假。

等价于:s1 |-> ##1 s2

(5)“disable iff”构造

在某些设计情况中,如果一些条件为真,则我们不想执行检验。换句话说,这就像是一个异步的复位,使得检验在当前时刻不工作。SVA提供了关键词“disable iff”来实现这种检验器的异步复位。

“disable iff”的基本语法如下:

disable iff(expression)<property definition0>

二、检查器

(1)检查器列表

 (2)高级检查器

 

参考链接:

(64条消息) [SV]SystemVerilog 断言(SVA)检查器库(OVL)_ovl断言_元直数字电路验证的博客-CSDN博客

SystemVerilog Assertion(SVA)学习笔记(一):知识点总结 - 知乎 (zhihu.com)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: SVA (SystemVerilog Assertions)是一种用于验证硬件设计的语言扩展,其中包括属性(property)的定义和使用。属性是一种描述设计行为的语句,可以用于检查设计是否满足特定的规范或约束。 在SVA中,属性可以使用蕴含(implication)结构来定义。蕴含结构由先行算子(antecedent)和后续算子(consequent)组成,先行算子是约束条件,只有约束条件成功时,后续算子才会被计算。蕴含结构可以分为交叠蕴含和非交叠蕴含两种形式。 交叠蕴含使用符号"|->"表示,表示如果先行算子匹配,在固定个时钟周期后计算后续算子表达式。例如,在每个时钟上升沿,检查信号a是否为高电平,如果a为高,那么b在接下来两个时钟沿后也必须为高。\[2\] 非交叠蕴含使用符号"|=>"表示,表示如果先行算子匹配,在下一个时钟周期计算后续算子表达式。例如,在每个时钟上升沿,检查信号a是否为高电平,如果a为高,那么b在下一个时钟沿也必须为高。\[3\] 通过使用蕴含结构,我们可以在属性定义中指定约束条件和期望的行为,以便进行设计验证。 #### 引用[.reference_title] - *1* *2* *3* [SVA介绍----蕴含操作符](https://blog.csdn.net/qq_39556143/article/details/94591578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值