前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SystemVerilog中Assertions

SystemVerilog中Assertions

作者头像
数字IC小站
发布2020-07-01 10:50:19
8510
发布2020-07-01 10:50:19
举报
文章被收录于专栏:数字IC小站数字IC小站

本文部分内容是来自SV LRM书的翻译。


断言是设计的属性的描述。

● 如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。

● 如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。


SVA 是一种描述性语言,可以完美地描述时序相关的状况。语言的描述性本质提供了对时间卓越的控制。语言本身非常精确且易于维护。SVA 也提供了若干个内嵌函数来测试特定的设计情况,并且提供了一些构造来自动收集功能覆盖数据。


关于系统的论述,我后面应该会写文章更新,今天主要讲讲几个比较容易疑惑的地方。


  • 无限的时序窗口

在时序窗口的窗口上限可以用符号“$”定义,这表明时序没有上限。这叫“可能性”(eventuality)运算符。检验器不停地检查表达式是否成功直到模拟结束。因为会对模拟的性能产生巨大的负面影响,所以这不是编写SVA 的一个高效的方式。最好总是使用有限的时序窗口上限。

那么问题来了,我们是捕捉到一次成功断言就结束了呢?还是得一直捕捉下去?永不结束?

首先看个例子:

发现仿真时只会捕捉到一次断言成功就结束了,截图如下:


还是同样的,那我如果是多添加一个事件,并且采用$符号呢?

例子如下:

通过仿真,可以看出,每次都是在最一次匹配后就进入了下一阶段。


  • and 构造

可以用来逻辑地组合两个序列。当两个序列都成功时整个属性才成功。两个序列必须具有相同的起始点,但是可以有不同的结束点。检验的起始点是第一个序列的成功时的起始点,而检验的结束点是使得属性最终成功的另一个序列成功时的点。

看个例子

仿真结果如下:

这个好像很容易理解,如果同样的波形,换成intersect呢?


  • intersect 构造

例子如下:

主要注意点有两个,一个是intersect不支持直接的写法,如上图中and的写法,在intersect中是报error的,二是蕴含运算符不能在sequence中使用。

仿真结果如下:在90ns时,and是成功的,intersect是失败的。

两个序列必须在相同时刻开始且结束于同一时刻。换句话说,两个序列的长度必须相等。

or构造就不讲了,很简单,二选一成立即可。


  • first_match 构造

开始比较难理解的是first_match构造,这个在语言手册上也有一个例子,例子如下:

我试着仿了一下,然后发现,加没加first_match的结果是一样一样的...

代码如下:

在代码中添加了first_match和没添加做比较:

仿真结果一模一样...

不是说first_match没用。只能说指导手册LRM提供的案例是不适合这种情况的...

前面特意提到$运算符,是因为这儿是有个大新闻的,就是蕴含运算和$放在一起就不得了...

蕴含等效于一个if-then 结构。蕴含的左边叫作“先行算子”(antecedent),右边叫作“后续算子”(consequent)。先行算子是约束条件。当先行算子成功时,后续算子才会被计算。

我们来看点能起作用的~

前面特意没说的是下面这种情况:

有没有想过,在什么情况下会到e呢?是a满足了然后满足1次b,然后就到e了吗?

仿真结果说明一切...

仿真是没有结果的,处于一直断言的过程中,这是因为,存在$符号以后,必须保证所有的情况都是满足的才是真的断言成功,进入下一阶段。但是又因为$是无限大的,因此就不会存在真的断言成功了...当然,只有当所有的断言都是失败的,才会断言失败,但是因为无限大,谁又能保证...下一次不会成功呢?所以这就是个无解题。。。


那么这时候,first_match的作用就出来了。。。因为它只需要匹配一次就可以跳出这个阶段,进入下一阶段。

代码如下:

对比来看:

这时候就有结果了...这才是first_match真实的使用情况,当然,比如如下情况也可以看看:


代码如下:因为含有|->,所以都是等到所有情况都满足才能进入下一阶段,如果不是所有情况都满足,一直为黄色横三角。也不算断言失败。

仿真结果如图所示:

因此,我再回过头看这个代码,只更改了输入波形,再看。

由此可看出first_match的作用。


最后,回到原点,还是以LRM手册中的例子,如果添加|->会不会不一样?

仿真结果如下:

这样写,first_match也是起作用的。


  • 总结

当前者为某个区间取值,例如[1:5],如果没有|->或者|=>时,则匹配一次即可进入下一阶段或者断言成功,但是如果有|->或者|=>时,则必须保证所有情况都满足才能进入下一阶段,否则卡死。而first_match的作用就是在此时,使得只要出现一种满足情况即可进入下一阶段。

本文特别感谢β+α=γ≧θ同学提供的支持~

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字IC小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档