断言操作符介绍

这篇具有很好参考价值的文章主要介绍了断言操作符介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.延时操作符(##)

1.1 ##m

1.2 ##[m:n]

2.蕴含操作符(|=>,|->)

2.1 |=>操作符

2.2 |->操作符 

3 重复操作符 ([*m][->m][=m])

3.1 连续重复操作符([*m][*m:n])

3.2 跟随重复操作符([->m][->m:n])

3.3 非连续重复操作符([=m])

3.4 小结

4 SVA关键字

4.1 与或非

4.2 动态控制函数

4.3 SVA内嵌函数

4.4 SVA 序列表达式操作符

 4.5 SVA 周期表达式操作符


1.延时操作符(##)

1.1 ##m

带时序关系的sequence :在SVA中时钟延时用符号"##"来表示,如"##2"表示延时两个时钟周期;
示例:
sequence seq2;
        @(posedge clk) a ##2 b ;
endsequence
//在断言的property中调用sequence
check_a_and_b: assert property(seq2);
提示:##0  表示 sig1 sig2 必须同时发生才算成功 ,可见,在具体使用过程中,可以使用 ##0 表示两个事件在同一采样时刻同时发生

波形展示:

断言操作符介绍 sequence只有在时钟上升沿到来后检查a是否为1才会继续检查后面连续x个时钟后的b的值

1.2 ##[m:n]

##[m:n] 其中m和n都是非负数,m可以为0,n可以为$,n必须大于m,当n为$时,比 较耗费仿真资源,一般不建议使用.
示例:
sequence seq2;
        @(posedge clk) a ##[2:4] b ;
endsequence
//在断言的property中调用sequence
check_a_and_b: assert property(seq2);
波形展示:
断言操作符介绍

 ##[m:n]”采取的是“就近匹配”原则,在第一个序列匹配后将不会在进行后续序列的匹配。

2.蕴含操作符(|=>,|->)

2.1 |=>操作符

示例:
property p1;
        @(posedge clk) sig1 |=> sig2;
endproperty // p1

波形展示:

断言操作符介绍

 表示sig1在时钟上升沿时为高,在当前时钟上升沿的下一个时钟上升沿时sig2也必须为高

2.2 |->操作符 

示例:
property p1;
        @(posedge clk) sig1 |-> sig2;
endproperty // p1
波形展示:
断言操作符介绍

sig1在时钟上升沿时为高,在当前时钟上升沿sig2也必须为高 

NOTE:在编写断言时尽量使用“|->”而不是“|=>”,因为你可以通过“|->”后增加时钟数实现“|=>”的功能, 但是不能通过“|=>”实现“|->”的功能。

断言操作符介绍

 断言时序判断note:例如(cat ##1 dog)|=> mouse

1. 首先判断cat是否为真,只有在cat为真的情况下才会进行后续判断,才会开启以上断言;

2. 遇到如果第二个clk如果依旧为cat,则将其作为初始cat进行判断(上图条件3);

3 重复操作符 ([*m][->m][=m])

当需要检查某个信号保持一种状态多个采样周期时,虽然在SVA中可以使用连续 ##1逐个指定该信号,如下例,sig1要在sig0为上升沿之后保持4个时钟周期的高电平。
示例:
……
@(posedge clk) $rose(sig0) |-> ##1 sig1 ##1 sig1 ##1 sig1##1 sig1;
……
虽然实现了特定的要求,但是这种实现方式明显很繁琐,为此,在 SVA 中提供了重复运算符,从而可以缩减繁琐的表达式。

3.1 连续重复操作符([*m][*m:n])

[*m]使用时表达式或者序列每次匹配间隔为一个采样周期,表达式或者序列必须连续重复匹配m次,m不能为$。
[*m:n]使用时表达式或者序列每次匹配间隔为一个采样周期,表达式或者序列重复m到n次,
当m次匹配后,即认为[*m:n]匹配成功,不会再对表达式进行后续的匹配判断,即其本身匹配
采取的是“就近匹配”原则。当然n的存在也是有一定意义的,如果[*m:n]后还存在其他表达
式或者序列,那么其他表达式或者序列的匹配检查点将不能超过第n次匹配。

断言操作符介绍

断言操作符介绍

 示例:

property p;
        @(posedge clk) $rose(a) |-> ##1 b[*2];
endproperty // p
波形展示:
断言操作符介绍

提示:

在仿真中$rose并不是单纯的判断信号的跳边沿,而是判断时钟采样信号前后是否存在0->1/x->1/z->1的变化。

在仿真中$fell并不是单纯的判断信号的跳边沿,而是判断时钟采样信号前后是否存在1->/x->0/z->0的变化。

3.2 跟随重复操作符([->m][->m:n])

[->m]使用时表示表达式重复或者连续出现m次,但是整个重复表达式的最后一次匹配必须发生在其后续表达式匹配前的一个采样周期.
断言操作符介绍

 示例:

property p;
        @(posedge clk) a |-> ##1 b[->3] ##1 a;
endproperty // p

波形展示:

断言操作符介绍

[->m]也有对应的[->m:n]方式,其差别与[*m][*m:n]差别类似,不再赘述 .

3.3 非连续重复操作符([=m])

[=m] [->m] 工作情况类似,唯一的区别是 [->m] 要求整个重复表达式的最后一次匹配必须发
生在其后续表达式匹配的前一个相邻采样周期,而 [=m] 并没有要求整个重复表达式的最后一
次匹配必须发生在一定的条件下.
断言操作符介绍

跟随重复的最后一次重复必须和下一个信号紧挨,例如上边的第一种情况,非连续重复则不需要。

示例:
property p1;
@(posedge clk) a |-> ##1 b[=3] ##1 a;
endproperty // p1
波形展示:
断言操作符介绍

3.4 小结

重复运算符
说明
格式
连续重复
表达式或者序列在指定数量的采样
周期内连续的匹配,表达式或者序
列的每次匹配之间都有一个采样周
期的延迟
expror
sequence_name[*n]expror
sequence_name[*m:n]
跟随重复
表达式匹配达到指定的次数,而且
每次匹配不一定在连续的采样周期
上,被检验的重复表达式的最后一
个匹配应该发生在整个序列匹配结
束之前
expr[->n]expr[->m:n]
非连续重复
与跟随重复类似,除了它并不要求
信号的最后一次匹配发生在整个序
列匹配前的那个采样周期
expr[=n]expr[=m:n]

4 SVA关键字

4.1 与或非

1.and

and”可以按照逻辑与的方式组合两个序列,当两个序列都匹配时,整个属性成功。使用方式如下:
property p;
        sequence_1 and sequence_2;
endproperty //p
【注意】 sequence_1和sequence_2的检查起始点必须一样,但是两者结束的结束点可以不一样,整个属性的成功点以两个sequence中最后一个成功的sequence的匹配点为属性的成功点。

断言操作符介绍

2. or 

“or”可以按照逻辑或的方式组合两个序列,当两个序列有一个匹配时,整个属性成功。使用方式如下:
property p;
        sequence_1 or sequence_2;
endproperty //p
【注意】 sequence_1和sequence_2的检查起始点必须一样,但是两者结束的结束点可以不一样,整个属性的成功点取决于最早匹配成功的sequence,只要两个序列有一个匹配成功,整个属性就认为匹配。

断言操作符介绍

 3 not

“not” 虽然只是对序列结果取反,但是在 SVA 中,理解 not 时必须注意反向思维,否则可能混乱。因为not操作的对象为一个序列,所以 not 操作的起始和结束点与其操作的对象一致。使用方式如下:
property p;
        not (sequence);
endproperty //p

断言操作符介绍

4.2 动态控制函数

$ assert_task [(level[,list_of_modules_or_assertions])];
其中
assert_task 可以是 assertion assertoff assertkill 中的任何一个;
level 用于指定层以下哪几层设计受到函数的影响,如果 level 0 ,函数将影响指定层以下所有的设计;
list_of_modules_or_assertions 指定该函数作用于哪些模块或者断言(不能指向序列,但是可以指向属性);
这几个函数的具体意义如下:
$assertoff 暂时关闭所有断言的执行,如果该函数执行时断言正在执行,正在执行的断言不会被终止;
$asserton 重新启动断言执行;
$assertkill 将会终止设计中所有的断言,包括已经执行的断言。当遇到下一个断言需要开始执行时,该断言不会启动,除非使用 $asserton 启动;

4.3 SVA内嵌函数

常用的内嵌函数 :
$onehot(expression) : 该函数主要用于在任意给定的采样事件,表达式最终结果中不管其他位为不定态还是高阻态,只要有一位且仅有一位为高时,该函数即返回真。
$onehot0(expression) : 该函数主要用于在任意给定的采样事件,表达式最终结果中不管其他位为不定态还是高阻态,只要有一位为高或者没有任何位为高时,该函数即返回真。
$isunknown(expression) : 该函数用于检验表达式最终结果中的各位中是否有 x 或者z
$countones(expression) : 该函数主要用于获得信号中电平为高的位的个数。

4.4 SVA 序列表达式操作符

1 intersect

intersect两侧的表达式都是sequence,不能是property,使用intersect时需要 确保其两侧的sequence必须同时开始,且当两个sequence最终同时匹配时才认为两个序列的intersect匹配,即两个sequence匹配的长度必须相同 ,intersect操作符和and操作符很相似,但是and没有要求两个序列最终匹配时同时匹配。

断言操作符介绍

2 within 

within右侧sequence的起止点必须位于左侧sequence的起止点之外,当然within左右两侧sequence的起止点可以一样,整个“sequence_1 within sequence_2”匹配成功的结束点与右侧sequence的结束点一致。

断言操作符介绍

3 throughout 

在SVA中有时需要某些信号在一个序列的检查过程中一直保持一个状态,此时就可以使用throughout操作符,当这些信号的状态发生不期望的变化时,序列的检查即认为失败。

断言操作符介绍

 4.5 SVA 周期表达式操作符

1 $rose文章来源地址https://www.toymoban.com/news/detail-495065.html

在仿真中$rose并不是单纯的判断信号的跳边沿,而是判断时钟 采样信号前后 是否存在0->1/x->1/z->1的变化。其格式如下:
$rose(expression);
2 $fell
在仿真中$fell并不是单纯的判断信号的跳边沿,而是判断时钟 采样信号前后 是否存在1->/x->0/z->0的变化。其格式如下:
$fell(expression);
3 $stable
当表达式在连续两个采样时钟周期保持不变时返回真。其格式如下:
$stable(expression);
4 $past
$past主要用于检查当前表达式前一个时钟周期(如果不指定number_of_ticks,默认指向前一个时钟周期)值是否为真,如果位真则$past返回为真。其格式如下: $past(expression[,number_of_ticks]);
其中number_of_ticks可以指定检查当前时刻之前number_of_ticks个周期的采样值.
5 $changed
格式:
$changed(expression);
当表达式在前一个周期发生变化(不管是高低变化还是低高变化)时返回真,返回值类型为布尔类型。

到了这里,关于断言操作符介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学了那么长时间的编程,C语言的各种操作符都搞不懂?点开这里有详细的介绍—>

    目录 前言 一、原码、反码、补码的基础概念 1.原码 2.反码 3.补码 二、原码、反码、补码的计算方法 1.原码 2.反码 3.补码 三、算术操作符 四、移位操作符 1. 左移操作符 移位规则: 2. 右移操作符 移位规则: (1) 逻辑移位 (2) 算术移位 五、位操作符 1. 按位与运算(AND)

    2024年02月10日
    浏览(30)
  • 【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期恢复正常更新。 今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废

    2024年02月11日
    浏览(32)
  • 【PostgreSQL】函数与操作符-比较函数和操作符

    PostgreSQL中的比较函数和操作符用于比较两个表达式的值。它们的作用是确定表达式的值是否满足某种条件,例如等于、大于、小于等。 比较函数是一个接受两个参数的函数,返回一个布尔值,表示两个参数是否满足某种条件。例如,equal()函数用于判断两个参数是否相等,

    2024年01月17日
    浏览(43)
  • 初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(43)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(57)
  • Js中.?和??语法(可选链操作符和双问号操作符)

    Tips:为啥起这么一个标题呢,因为我自己当时看代码,看到这个语法的时候就感觉有些遗忘,但是又不知道他叫做什么名字,所以只能直接搜索.?和??这样搜索,哈哈哈相信不少人可能跟我一样,不知道他叫做什么名字嘿嘿。 可选链 操作符( ?. )允许读取位于连接对象链深

    2024年01月21日
    浏览(38)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(40)
  • ES6...扩展操作符骚操作

    复制和合并数组变得更为简洁。不需要使用 concat() 方法或 slice() 方法,一个 … 操作符已经足够: 将数组作为一个需要单独一个个传入参数的函数的参数 对象属性展开复制 如果存在相同的值 后者覆盖前者 合并对象 类似于object.assign 不过,扩展属性并不总能生成与 Object.as

    2024年02月14日
    浏览(31)
  • 前端JS实用操作符,一些骚操作✨

             目录 0、!!  双重逻辑非操作符  📚 1、?? 操作符 空值合并/空判断  ✅ 2、?. 可选链运算符🔍 3、??= 操作符 逻辑空值赋值运算符 💚 4、三元运算符 📗 5、~~ 操作符 双位运算符 🔨 6、与 ||或 短路运算符 🚂 7、| 0 取整 🚁 8、 1 判断奇偶数 🎨 9、_ 数值分割

    2024年02月14日
    浏览(35)
  • JavaScript 操作符

    在 JavaScript 中,有一些操作符可以使代码更简洁、易读和高效。以下是一些常见的操作符: ?. 是 可选链操作符(optional chaining operator) 。 ?. 可选链操作符 用于访问可能为空或未定义的属性或方法,它允许我们安全地访问嵌套对象的属性,如果中间的属性为空或未定义,则不

    2023年04月19日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包