断言(assert)是一种描述性语言,通过描述的期望结果来进行仿真验证。

断言有一个更加基础的信息,我们称为属性(property),属性可以作为断言结果,功能覆盖点,形式检查和约束随机激励生成

断言相比较与testcase的仿真验证,对设计的可见度要求比较高,可以帮助快速定位错误的根源,断言可以分布在设计各个部位。

在项目中使用断言,有两种方式(eda tool中都支持):

  1) 使用预建的断言库,如OVL,

  2) 使用SVA,PSL等断言语言来自己描述。(PSL是完全独立的断言语言,SVA被继承在SV语言中),

SVA的语言层次结构:

  

assertion分为:

  1) immediate assert,基于simulation event semantics;

      assert/assume/cover (expression)  action_block;

  2) concurrent assert,基于clock semantics;

      assert/assume/cover (expression)  action_block;

  action_block的声明:

      statement | [statement] else statement

  immediate assert的action block紧跟着assert执行,就像在procedual block中,(比如active或者NBA region)

    可以放在任何procedual中,initial,always,task,function。

  concurrent assert的action block,在当前assert的reactive region执行,所以action block中使用$sampled()采样信号值,表示evaluate时的信号值

assertion中的property,可以用来描述design的某一个行为,必须被例化在assert,assume,cover等编译选项后

        包含在module,interface,package,program,clocking,$unit中。

      sequence,用来描述high level property的abort condition或者common start point,一系列的boolean expression。

在sva中,一个property代表一个thread,表示一系列event的sequence,可能持续多个cycle。

  在property没有start的时候,thread不会起来,之后的check是不会被evaluation的。被认为是true的。

  当该property执行结束或者结果已经出错,property在这个时间点结束

SV引入了 |->表示overlapping的操作,resulting sequence (consequent) 与causing sequence (antecedent) 在同一个cycle完成。

      |=>表示non-overlapping的操作,resulting sequence在causing sequence的下一个cycle开始。

sequence:随着时间增加的SV boolean expression

  可以声明有formal args,local var;

  method方法有:ended,matched,triggered,这三个方法都表示sequence的结束;

  尽量使用named sequence,来增加代码的可读性。

  sequence支持的操作符:

    

注意:1) sequence中的formal args是untyped的;formal args可以是一个signal,sequence,sequence method

   2) sequence中的local var是不能用作setup delay或者repetition ranges的

property:可以包含formal args,可以有local var;

    

    property支持的操作符:

      

注意:1) 一个property_spec不是一个sequence,但是一个sequence可以是一个property_spec

   2) formal args可以带default value。

SVA中支持的assertion 语句以及function:

  

  

  

SVA中各个运算符之间的操作,可以是expression,sequence,property。

  expression的优先级与logic operate部分相同。

  sequence之间的优先级:

    

  property之间的优先级:

    

verilog中的#表示延时,delay,##号表示延时若干个clock cycles。

如果implication operator中,antecedent fail,property被hold为vacuous success。

property中的not operator不可以和implication operator一同使用,一般只用在sequence组成的property,表示从不true的序列。

sequence中的first_match操作符,用来消除可能发生overlap的assert result:

  1.如果property中只由一个sequence组成,则包含一个implicit first_match。

    property p_seq;   (a##1 b ##[0:5] c); endproperty

  2.consequent sequence中默认包含一个implicit first_match

    property p_seq;  a=>b##[1:2] c ## [0:4] d; endproperty

    property p_seq;  a=>## [0:3] qABC.ended; endproperty

  first_match主要用在antecedent的sequence中,一个sequence的ended是可以多触发的

    property p_seq; first_match(a##[2:3]b) |-> c;  endproperty

    property p_seq; first_match(qABC.ended) |-> c; endproperty

重复操作符,可以用于sequence和expression中。

  consecutive repetitive,  seq[*n], exp[*n]

  non-consecutive repetive,   seq[=n],  exp[=n]

  goto repetitive,non-consecutive exact repetitive, seq[->n],exp[->n]

throughtout, condition over sequence。用来保证boolean condition在sequence有效期间是正确的。

   property p_seq; @(posedge clk)  $rose(req) |-> ##[1:4] enable throughout (ack ##[1:$] done); endproperty

      其中enable throughout (ack ##[1:$] done)表示一个sequence;

      ##[1:4] seq表示一个sequence;

intersect, length-match sequence 表示两个sequence从同一个clock tick 开始并且在同一个clock tick结束。

within, 表示一个sequence在另一个sequence有效中完成。

and, not-length-matching sequence,两个sequence同时开始,但是不需要同时结束。

sequence  method:

  ended,主要用在sequence在single clock assertion中的endpoint;

    ended method方法,在observe region之外是没有意义的,所以只能用在assert evaluation。

    property p_seq;  @(psoedge clk) dmaWriteBlock(dma_done).ended |-> ##[1:5] cpu_interrupt; endproperty

  matched,主要用在sequence在multi_clocks assertion中的endpoint;

    将ended的结果进行latch and multi-clock sync,只在第一个clock的observe region有效

    sequence q_1(a, b);     @(posedge clk)   $rose(a) ##[2:3] b;     endsequence

    sequence q_2;       @(posedge sysclk)   c##1 q_1(a,b).matched[->1]##1 d; endsequence

  triggered,Level-sensitive control,主要用在disable iff,或者wait sequence.triggered中。

值采样函数,$stable(exp),表示该exp的值与上一个clock tick的值相同。

  property p_seq;    $fell(req_n) |=> ack ##1 $stable(ack)[*0:100] ##1data_valid;   endproperty。

assertion-ctrl system task;

  $asserton,  $assertoff,  $assertkill。

assert cover中,可以收集assert更多的结果,主要分为coverage for properties,coverage for sequences。

  1.coverage for properties, Number of times attempted, succeeded, failed, vacuous success.

  2.coverage for sequence, Number of times attempted, matched.

assert中的clock定义:

  1. sequence中定义,

    顶层的clock定义不影响该sequence中的clock定义

    assert property中仍需要定义clock,该sequence中定义的clock不会变为property clock

  2. concurrent property中定义,

  3. procedual block中inferred clock,

  4. 本身property定义在clocking block中,

    clocking block中的input output delay并不影响assert的执行,input,output delay只是对circuit delay的建模。

  5. 定义default clocking,

  6,声明assert的时候显式指定, assert property (@posedge clk) p_seq);

    如果此时property中也定义了clock,两个clock必须相同

SV-assertion的更多相关文章

  1. verilog断言(SVA:systemverlog assertion)语法 ---- 转载

    转载自:http://blog.sina.com.cn/s/blog_4c270c730101f6mw.html 作者:白栎旸     断言assertion被放在verilog设计中,方便在仿真时查 ...

  2. systemverilog assertion

    1.一般是单独写一个module 里面放assertion,  然后在验证平台顶层和RTL的实例化bind起来​ 2. |->表示直接进行判断,|=>表示下一拍判断,一般一个断言最好只写一 ...

  3. SV processses

    SV中的structured procedure: 1)intial procedure,keyword只有initial:最开始被调用一次: 2)always procedure,keyword包括 ...

  4. SV中的覆盖率

    SV采用CRT的激励形式,而判断验证进度的标准也就是覆盖率(coverage). 覆盖率的两种指定形式:显式的,直接通过SV来指定出的,如SVA,covergroup. 隐式的,在验证过程中,随&qu ...

  5. SV中的Interface和Program

    Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface  arb_ ...

  6. SystemVerilog Assertion 设计、调试、测试总结(2)

    上一篇博客主要写了SVA的基本语法(详细),这一篇主要写SVA语法总结,以及如何查看SVA波形等. 断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警 ...

  7. SystemVerilog Assertion 设计、调试、测试总结(1)

    暑期实习两个月的其中一个任务是:如何在设计中加入断言?以及断言的基本语法.三种应用场景下的断言(如FIFO.FSM.AXI4-lite总线).参考书籍:<System Verilog Asser ...

  8. 挣值管理(PV、EV、AC、SV、CV、SPI、CPI) 记忆

    挣值管理法中的PV.EV.AC.SV.CV.SPI.CPI这些英文简写相信把大家都搞得晕头转向的.在挣值管理法中,需要记忆理解的有三个参数:PV.AC.EV.     PV:计划值,在即定时间点前计划 ...

  9. Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]

    今天遇到了Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]这个错误,一直也没有百度,不料想却弄了一个 ...

  10. Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3318/UITableView.m:10772

    Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3 ...

随机推荐

  1. get、put、post、delete含义与区别

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  2. [Mongo]Linux上启动与关闭MongoDB

    文档地址:https://docs.mongodb.com/v3.0/tutorial/install-mongodb-on-amazon/ 默认配置下,Mongo实例会将其数据文件存放在/var/l ...

  3. 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    A. Airport Coffee 设$f_i$表示考虑前$i$个咖啡厅,且在$i$处买咖啡的最小时间,通过单调队列优化转移. 时间复杂度$O(n)$. #include<cstdio> ...

  4. BZOJ 5104

    这个模数比较有趣 可以求出 $\sqrt{5}$ 然后就可以做了 $f_n=\dfrac{\sqrt{5}}{5}[(\dfrac{\sqrt{5}+1}{2})^n-(\dfrac{1-\sqrt{ ...

  5. MongoDB 组合多个条件查询($and、$in、$gte、$lte)

    一,问题描述 数据格式: id, timeStamp,count 条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime.比如 timeS ...

  6. php 识别二维码(转载)

    近段需要写一个通过PHP来识别二维码的功能,在网上查了很久才解决问题.以此来记录下来解决问题的方法. 最开始找的方法是一个叫 php-zbarcode 的扩展,自己照着网上的安装步骤安装了 Image ...

  7. js高级的2

    BOM0级事件元素绑定多个click最后只执行最后一个click. DOM2级事件元素绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 div. ...

  8. pthread_detach()与pthread_join的区别?

    简单来说: pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收.pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源. [转]在 ...

  9. SQL 约束 索引

    --约束constraint--not null 非空约束create table demo01(empno number(4),ename varchar2(10) not null,job var ...

  10. python之str字符串

    字符串是python非常重要的数据类型,它是一个序列(列表和元组也是序列),有下标,可以通过下标遍历字符串序列:同时字符串也是一个不可变数据类型,每次使用"+"拼接字符串时都会产生 ...