systemverilog assertion
1.一般是单独写一个module 里面放assertion, 然后在验证平台顶层和RTL的实例化bind起来
2. |->表示直接进行判断,|=>表示下一拍判断,一般一个断言最好只写一个蕴含。
$rose()表示该信号当前拍为1,上一拍为0,作用与 miso_oe && !past(miso_oe)一样。
3. (a [->1]) 表示 a为高出现一次,(a [->2]) 表示出现 a出现两次
4.SVA应用指南:
a. $rose, $fell, $stable
b. 交叠蕴含:|->,非交叠蕴含:|=>,蕴含的先行算子没有发生时仿真不会报错,因此是空成功。
c.禁止属性:not
d. 时间窗口,重叠的时序窗口在先行算子成功的同一个时钟沿开始计算
e. ended构造:基于序列的结束点来同步序列
f. $past构造:默认情况下它提供信号在前一个时钟周期的值
(c&&d) |-> ($past((a&&b),2)==1'b1); 该属性检查c&&d为1时其前两个时钟周期a&&b为1。
g.重复运算符:
连续重复运算符: $rose(start) |-> ##2 (a[*3]) ##1 stop ##1 !stop;
跟随重复运算符: $rose(start) |-> ##2 (a[->3]) ##1 stop ##1 !stop;
非连续重复运算符: $rose(start) |-> ##2 (a[=3]) ##1 stop ##1 !stop;
h. and构造:用来逻辑地组合两个序列,当两个序列都成功时整个属性才成功。也可以直接在property中使用。
i. intersect构造:作用与and相同,不过要求两个序列的起始点和结束点都相同
j. or构造:只要一个序列成功,整个属性就成功
k. 蕴含只在时钟边沿检验前提条件一次,然后就开始检验后续算子部分,因此它不检测先行算子是否一直保持为真。为了保证某些条件在整个序列的验证过程中一直为真,可以使用“throughout”运算符。
property p31;
@(posedge clk)
$fell(start) |-> (!start) throughout (##1 (!a&&!b) ##1 (c[->3]) ##1 (a&&b));
endproperty
在整个检查过程中start一直为低
l.SVA 提供了几个内建的函数来检查一些最常用的设计条件:
$onehot(检验在任意给定的时钟沿,表达式只有一位为高。
$onehot0 检验在任意给定的时钟沿,表达式只有一位为高或者
没有任何位为高。
$isunknown检验验表达式的任何位是否是 X或者 Z。
$countones计算向量中为高的位的数量。
a33a : assert property(@(posedge clk) $onehot(state));
a33b : assert property(@(posedge clk) $onehot0(state));
a33c : assert property(@(posedge clk) $isunknown(bus));
a33d : assert property(@(posedge clk) $countones(bus)> 1);
m. 使用“intersect”控制序列的长度 :
这个intersect 的定义检查从序列的有效开始点(信号“a”为高),到序列成功的结束点(信号“c”为高),一共经过 2~5 个时钟周期。
property p35;
(@(posedge clk)
1[*2:5] intersect (a ##[1:$] b ##[1:$] c));
endproperty
n.使用局部变量的SVA: ($rose(enable), Ivar = a) |-> 如果enable从0到1翻转了那么就执行赋值,否则不执行。
其他:嵌套的蕴含、disable iff构造。
培训的笔记:
1.sv出现之前就有assertion,最早是软件上使用
2.硬件的assertion比软件上更复杂
3.他和sv其实挺独立的,所以sv的书不讲SVA
4.systemverilog 应用指南,总共5章,细节可以参考此书。
5.在tb中,激励和检查应该独立,所以assertion是做检查的工具。
6.实际仿真中如果过多的使用$,会拖慢仿真速度。
7.sequence和property可以做成参数化的,然后调用之。
8.一个信号在特定时间内应该出现多少次:[*为严格的次数限制,[->
9.multi clock很少用
10.cover的意思是assertion在其他地方已经做过检查,现在只需要cover一次。
11.直接的assert()就是软件里面的用法,immediate assert,这一行执行完立刻消失。
12. sequence更多的是像子模块,让代码模块化。
13.assertion90%都是用于同步单时钟设计。理解这一点非常重要
14.within运算符指前面的表达式所发生的时间必须是后面表达式的子集。
15.即使某design有多个时钟,但是做assertion还是尽量用单个时钟,因为仿真器可能会对多时钟的延时判断有误,而且很难debug。
16.assert用于检查该property有没有被违反。cover用于检查蕴含前面的触发条件有没有被满足过。
17.initial和module等多数地方都可以放assertion。
18.assertion module的端口最好与design的一样,这样在bind时直接用(.*)就可以。
systemverilog assertion的更多相关文章
- SystemVerilog Assertion 设计、调试、测试总结(1)
暑期实习两个月的其中一个任务是:如何在设计中加入断言?以及断言的基本语法.三种应用场景下的断言(如FIFO.FSM.AXI4-lite总线).参考书籍:<System Verilog Asser ...
- SystemVerilog Assertion 设计、调试、测试总结(2)
上一篇博客主要写了SVA的基本语法(详细),这一篇主要写SVA语法总结,以及如何查看SVA波形等. 断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警 ...
- SystemVerilog Assertion 设计、调试、测试总结(3)
上两篇主要是讲述断言的概念,基本语法,总结等等 这一篇主要是以PPT的形式展示各个场景下关于断言的应用. 为了在设计中加入断言的功能,因此需要写一个DUT.如下: `define `define fr ...
- NC_Verilog中的工具ICC
Cadence中的Incisive Comprehensive Coverage(ICC) solusion提供在仿真中的覆盖率分析. ICC中的覆盖率类型有两大类: 1)Code Coverage: ...
- SVA描述(一)
SystemVerilog Assertion(SVA):是一种描述性的语言,可以很容易的描述时序相关的情况,所以主要用在协议检查和协议覆盖.SVA在systemverilog仿真器中的 调度区间在R ...
- verdi知识点
引用:http://blog.csdn.net/naclkcl9/article/details/5425936 1. verdi 加强了active anotation, active trace和 ...
- CDC之fast->slow (2)
1 Open-loop solution One potential solution is to assert CDC signals for a period of time that excee ...
- FPGA验证之SystemVerilog+UVM
[转载]https://blog.csdn.net/lijiuyangzilsc/article/details/50879545 数字芯片和FPGA的验证.主要是其中的功能仿真和时序仿真. ...
- systemverilog FAQ(zz)
1. What is clocking block? Ans: Clocking block can be declared using the keywords clocking and endcl ...
随机推荐
- 演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)
如注释所言 /** * Created by weiwei22 on 17/7/3. * * 这里主要是为了演示stop导致的数据不一致的问题.stop会暴力的结束线程并释放锁,所以有可能在恰好写了一 ...
- C++ allocator
C++ allocator http://www.cnblogs.com/wpcockroach/archive/2012/05/10/2493564.html 说一说C++里的allocator.我 ...
- mybaties逆向工程教程工具
http://www.cnblogs.com/wangkeai/p/6934683.html
- Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...
- guava-retrying 源码解析(阻塞策略详解)
这是一种策略,用于决定重试者应如何在重试尝试之间进行阻止.通常这只是一个thread.sleep(),但是如果需要的话,实现可能更复杂. 一.阻塞策略相关的类或接口 1.阻塞策略接口:BlockStr ...
- Matlab_audiowrite_音频生成
输出音频文件所需函数为 audiowrite .通过例程进行解释: % 生成时间序列 fs = 5000; % [Hz] 信号采样频率 T = 1; % [s] 信号长度 x = 0:1/fs:T; ...
- 周强201771010141《面向对象程序设计(java)》第一周学习总结
周强201771010141<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com ...
- Centos yum 命令行 安装KDE Desktop
1:修改yum源为本地源 (见相关随笔:centos 配置本地yum源) 2:# yum groupinstall "X Window System" ← 安装基本的X系统组件# ...
- 源代码安装-非ROOT用户安装软件的方法
0. 前言 如果你没有sudo权限,则很多程序是无法使用别人编译好的文件安装的. 还有时候,没有对应你的主机配置的安装包,这时候需要我们自己下载最原始的源代码,然后进行编译安装. 这样安装的程序 ...
- 行高(line-height)
line-height属性 设置元素中文本行高.