Asssertion断言入门(一)——简介

概要

Assertion是用来与设计功能和时序作比较的属性描述。比如grant信号应该在request信号拉高后的第二个周期拉起,但是却在第三个周期才拉起,这就是时序的违例,不符合协议。

  • assertion可以用来完成:检查设计的内容;提高设计的可视度和调试能力;检查设计特性在验证中是否被覆盖。
  • 可读性好,因此也可以用来服务于设计文档;
  • 用来检查算法模型的断言在形式验证中可以穷尽计算,找出可能的违例;
  • 可以自由地打开或者关闭
  • 一小部分子集甚至可以用来综合或者移植到emulation中,用来完成跨平台的移植。

在verilog中不支持断言,断言语言通过不断地进化,发张成独立的语言分支——SVA


断言的类型:

1.立即断言

  • 非时序的
  • 执行时如同过程语句
  • 可以在过程快或者函数与方法中调用

2.并行断言

  • 时序性的
  • 关键词property用来区分立即断言和并行断言
  • 之所以称为并行,是指他们与设计模块一同并行执行。

立即断言

立即断言可以结合$fata、$error、$warning、$info给出不同严重级别的消息提示。

[name:] assert(expression)[pass_statement][else fail_statement]  
    
    always@(posedge clk)begin
        if(state == REQ)
            assert(req1||req2)//立即断言
            else begin
               t = $time;
               #5$error("assert failed at time %0t",t);
            end     
    end
                                           
   assert (y==0) else flag=1;      
       

并行断言

并行断言只会在时钟的边沿激活,变量的值是采样到的值。并行断言可以在过程块、module、interface 和program中定义。

base_rule1:assert property(cont_prop(rst,in1,in2)) pass_state else fail_state;
//Rquest-Grant协议描述:request拉高,在2个周期后,grant 拉高,在一个周期后property拉低,在一个周期后,grant拉低。
property req_grant_prop
    @(posedge clk) 
    req 
    ##2 grant 
    ##1 !req 
    ## !grant
endproperty
assert property req_grant_prop else $error("Req-Gnt Protocol violation");

断言中的property

  • 结合sequence序列对时序和逻辑的描述,property可以用来描述设计的确切行为。

  • property可以在验证中用来做assumption、checker或者coverage

    1. 当时用assert关键词时,可以用作checker来检查设计是否遵循property的描述
    2. 当时用assume做关键词时,可以作为环境的假设条件,对于仿真环境和形式验证均起到对激励进行假设的作用
    3. 当时用cover关键词时,可以将property是否通过 作为断言覆盖率来衡量
  • property可以在module、interface、clocking块或者package中声明。

  • property也可以同sequence一样具备形式参数

  • 共有七种property:

    分类用途
    sequence只有满足sequence条件,property才可以通过
    negation不期望出现这个negation条件,property通过;可以用NOT关键词
    disjunction至少要有一个满足,property通过;可以用OR关键词
    conjunction例如exp1 and exp2,只有两个exp都满足时,property通过;可以用AND关键词
    if…else条件选择
    implication蕴含,同sequence中用法一致
    instantiation命名一个property后,可以在另外一个property中使用

断言中的sequence

  • 用来表示在一个或者多个时钟周期内的时序描述。
  • 是property的基本构成模块,并经过组合来描述复杂的功能属性。

suqence 用来提供下列的场景描述:

  • 第一个时钟周期,第一个表达式成立
  • 接下来若干个时钟周期后,第二个表达式成立
  • 类推,在接下来若干时钟周期,后续的表示式也成立。

sequence可以在module、interface、program、clocking块和package中声明,但不能在类里面声明。

sequence可以提供形式参数,用来提高复用性:

​ 如下代码:

sequence s20_1(data,en);//data 和 en是形式参数
    (!frame && (data == data_bus) ##1 (c_be[0:3] == en))  
endsequence

后续精彩:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值