SystemVerilog Assertion(SVA):是一种描述性的语言,可以很容易的描述时序相关的情况,所以主要用在协议检查和协议覆盖。SVA在systemverilog仿真器中的

调度区间在RTL之后,Testbench之前。所以同一时钟断言只能采样到上一时刻的RTL值。由于是描述性语句,所以“;”用的比较多。

断言失败后会自动打印信息到log文件,用户也可以自定义打印内容。

assertion name: assert  xxxx

$display("xxxxx");

else

$display("xxxxx");

SVA分为并发断言:基于时钟的,调度区间按assertion的调度区间,可以在过程块(always initial),模块(module),接口(interface),程序(program)中定义。

即时断言:基于事件的,本质不是时序关系,会立刻求值。进行检查。只能在过程块(always initial)中定义。

两者另一个区别是:并发断言会用property来声明,即时断言不需要。

always

begin

a_ia:  assert (a && b);  //即时断言

end

因为并发断言应用更多,所以一下均以并发断言来说:

并发断言可以自定义一个SVA块来描述自己要求的时序,两个关键字:sequence, property。

sequence  s1;             //sequence允许自己定义更小的时钟描述

a ##2 b;

endsequence

property   s2;            //property 一个assert只能有一个

@(posedg clk)  s1;

endproperty

s3 :assert property(s2);       //标准形式 name : assert property();

断言中内嵌的表示信号的上升沿和下降沿的函数:$rose(expression or signal)  $fell(expression or signal)  $stable(expression or signal)  $changed(expression)

sequence  s2;

@(posedge clk)    $rose(a);       //时钟的上升沿仍然用posedge, 信号的上升沿才用$rose();

endsequence

断言中时序延时的描述: ##表示延时,但是注意触发加.ended,否则SVA默认都是按起始时刻来对齐的,也就是说如果断言3时刻触发,5时刻succeed,但是断言

也是会报道3时刻的对错。

sequence  s2;

@(posedge clk)  a ##2 b;       //a为高电平延时2个时钟后如果b为高电平,则断言成功。

endsequence

property p12;

@(posedge clk)  (a && b) |-> ##[1:3] c;       //相当于(a && b) |-> ##1 c; 或 (a && b) |-> ##2 c;  (a && b) |-> ##3 c;

endproperty

断言中时钟的定义:一般情况下,在property中定义时钟,而保证sequence独立于时钟比较好。当然从语法角度来说,时钟可以定义在property,sequence,assert

中。但是当assert定义时钟之后,property不能再重新定义时钟。

sequence  s5a;

a ##2 b;

endsequence

property  p5a;

@(posedge clk)  s5a;      //在property中定义时钟

endproperty

a5a: assert property(p5a);    //assert不再定义时钟

断言通过蕴含操作符来作为断言的触发条件,交叠蕴含: “|->”来表示,表示在先行算子(蕴含前的表达式)有效的同一个时刻判断后续算子(蕴含后的表达式)。

非交叠蕴含: “|=>”来表示,表示在先行算子有效的下一时刻再判断后续算子。

property  p8;                                                          property  p9;

@(posedge clk)  a |-> b;     //同一时刻                        @(posedge clk)  a |=> b;     //延时一个时钟

endproperty                                                            endproperty

##m延时m个clock:

[*n]重复n次:

assert  property (@posedge clk) rst[*2]; end property         //最开始的clock连续重复两个cycle rst

[=m]重复m次,不要求连续

[->m]重复m次,与[=m]的主要区别是,在后边加延时##1时,[=m]不准确表示延时1个clock

[->m]表示准确延时1个clock

sig1  throughout   seq:throughout之前表示一个expression,之后表示一个sequence,在sequence期间,expression一直有效。

seq1  within  seq2:within前后都表示sequence,在后一sequence有效期间,sequence1必须一直有效。

seq1  and   seq2:两个sequence进行与运算,两个sequence必须同时start,但是不要求同时结束。

seq1  or    seq2:两个sequence进行或运算,只要有一个sequence有效,该语句有效。

seq1  intersect   seq2,两个seq必须完全同时开始,同时结束,同时有效。

not seq1:表示对seq的结果取反

if(expression)   seq1   else   seq2:if---else语句控制,但是好像不能用在local var的场景中。

sva提供的system  task:

1)$onehot(expression),在expression中只有一个1或者没有1时,表示结果正确

2)$isunknown(expression),在expression中包含x、z时,表示结果正确

3)$countones(expression),返回expression中1的个数,  ones=$countones(busgnt)

4)$assertoff(level, list of module)    $asserton    $assertkill

sva中可以定义local  var,

赋值与比较,前都必须有一个sequence,或者显示指明1’b1

sequence  rdc;

  ##[1:5] rdDone;

endsequence

sequence datacheck;

  int local_data;

  (rdc, local_data = rData)  ##5 (wData == (local_data + 'hff));

endseqence

baseP:assert property (@(posedge clk) RdWr |-> dataCheck) else gotoFail;

sequence s1;

  int x;

  ((1'b1, x = data) ##0 ((a ##1 b) or (d ##1 e) )  ##1 (data1 == x+1);

endsequence

延时中不可以使用参数,变量定义时,不能用参数,因为变量在elabration时,需要使用

property checkDelay;

  int lv;

  (readReq, lv=dataDelay) |=> ##[0:lv] readData;   (错误)

endproperty

endsequence

SVA描述(一)的更多相关文章

  1. [内核笔记1]内核文件结构与缓存——inode和对应描述

    由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...

  2. PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.

    PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...

  3. 杂项之python描述符协议

    杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...

  4. ASP.NET MVC 描述类型(二)

    ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...

  5. ASP.NET MVC 描述类型(一)

    ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...

  6. python描述符理解

    Python中的描述符是一个相对底层的概念 descriptor Any object which defines the methods get(), set(), or delete(). Whe ...

  7. 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

    上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...

  8. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  9. 深入学习jQuery描述文本内容的3个方法

    × 目录 [1]html() [2]text() [3]val()[4]总结 前面的话 在javascript中,描述元素内容有5个属性,分别是innerHTML.outerHTML.innerTex ...

随机推荐

  1. linux指定某非root用户执行开机启动项的方法(gogs git)

    以linux指定git用户在linux开机时执行启动gogs git为例: 以root登录linux 执行vi /etc/rc.d/rc.local 在文档末尾添加一行语句:su git -c &qu ...

  2. Spring web.xml中的配置

    转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件application ...

  3. iOS - 使用苹果自带的UIVideoEditController进行视频编辑

    UIVideoEditorController类包含了由系统提供的界面,使用户可以交互式的剪切视频.UIVideoEditorController对象处理用户的交互并且提供把编辑后的视频的文件系统路径 ...

  4. linux启动程序和关闭程序脚本

    关闭脚本: #!/bin/bash source /etc/profile log() { echo `date +[%Y-%m-%d" "%H:%M:%S]` $1 } log ...

  5. linux定时任务cron配置说明

    实现linux定时任务有:cron.anacron.at,使用最多的是cron任务 名词解释 cron--服务名:crond--linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 ...

  6. ElasticSearch 安装 elasticsearch-analysis-ik分词器

    IK version ES version master 5.x -> master 5.6.1 5.6.1 5.5.3 5.5.3 5.4.3 5.4.3 5.3.3 5.3.3 5.2.2 ...

  7. PyCharm 4.0.4 开启代码自动补全

    目前在使用的PyCharn 版本为4.0.4,在使用的过程中无法使用代码补全功能,经过Google 搜索只需要修改两处即可实现代码补全 1 选择File-Setting-Inspections 找到对 ...

  8. IntelliJ IDEA最新版完美破解激活

    IntelliJ IDEA号称是目前最好最强最智能的Java IDE,默认已经集成了几乎所有主流的开发工具和框架.目前最新版为2017.2.5(2017.2.5已经不是最新,但是写教程的时候2017. ...

  9. Query实例的ajax应用之二级联动的后台是采用php来做的

    jQuery实例的ajax应用之二级联动的后台是采用php来做的,前台通过jquery的ajax方式实现二级联动数据库表设计 csj_trade id int(11) auto_increment  ...

  10. Python内置函数之isinstance,issubclass

    isinstance判断一个变量的类型 >>> n1 = 10>>> isinstance (n1,int)True 判断n1是否是数字类型,如果是返回True如果 ...