SV Assertion

 

当时钟与信号同时跳变时,立即断言采集的是跳变后的电平,并发断言采集的是跳变前的电平。

1.立即断言 Immediate Assertions

  立即断言检查当前仿真时间的条件,相当于 if else , 需要放在过程块中。

语法:

     labels: assert(expression)  action_block;

其中:

     action block 操作块在断言表达式的求值之后立即执行 

     操作块指定在断言成功或失败时采取什么操作

     action_block: pass_statement; else fail_statement;

例子:

     assert(expression)   $display("expression evaluates to true");    else      $fatal("expression evaluates to false");

断言失败else:

      可以用$fatal      $error     $warning   $info打印 

例子:

    always @(posedge clk) begin

      check_a_and_b:assert (a&&b)       $display("a&&b is true");

      else       $error("a&&b is false");

     end

2.并发断言 Concurrent Assertions

并发断言检查跨越多个时钟周期的事件序列。

我们可以认为并发断言是一个连续运行的模块,为整个仿真过程检查信号,所以需要在并发断言内指定一个采样时钟。

       并发断言仅在有时钟周期的情况下出现

  测试表达式是基于所涉及变量的采样值在时钟边缘进行计算的

  可以在过程块、module、interface和program块内定义并发断言

  区别并发断言和立即断言的关键字是property  

并发断言格式: 

    断言名:assert property (判断条件)  actionblock;

例子:

    check_a_and_b:assert property(@(posedge clk) (a&&b)) $display("a&&b is true"); else  $error("a&&b is false");

层次结构:

    由低到高为:boolean expressions 布尔表达式     sequence序列   property属性

Sequence序列:

    特性:1.可带参数 2.在property中被调用 3.可定义局部变量 4.可定义时钟周期

    格式:sequence name_of_sequence(参数);

        ……

       endsequence

    例子:sequence seq_a_and_b;

          @(posedge clk) a&&b;

          endsequence

          // 在 断 言 的 property 中 调 用 sequence

        check_a_and_b: assert property(seq_a_and_b);

           check_a_and_b: assert property(seq_a_and_b)   $display("a&&b is true");

           else         $error("a&&b is false");

    带参数的sequence例子:

        sequence seq1(signal1,signal2);

            @(posedge clk) signal1&&signal2;

        endsequence

       // 在 断 言 的 property 中 调 用sequence

          check_a_and_b:assert property(seq1(a,b));

          check_a_and_b: assert property(seq1(a,b))   $display("a&&b is true");

          else    $error("a&&b is false");

    带时序关系的sequence :

       在SVA中时钟延时用符号"##"来表示,如"##2"表示延时两个时钟周期;

          sequence seq2;

         @(posedge clk) a ##2 b ;

          endsequence

          //在断言的property中调用sequence

               check_a_and_b: assert property(seq2);

       其实也可以这样写

                          sequence seq2;

          a ##2 b ;

          endsequence

          //在断言的property中调用sequence

               check_a_and_b: assert property(@(posedge clk)  seq2);

    sequence内可以调用其它sequence:

          sequence seq1;

          @(posedge clk) a&&b;

          endsequence

       sequence seq2;

           seq1;

          endsequence

Property 属性

  property是比sequence更高一层的单元,也是构成断言最常用的模块,其中最重要的性质是可以在property中使用蕴 含操作符(|-> |=>);

       property格式:

    property name_of_property(参数列表);

      测试表达式或复杂的sequence;

    endproperty

  SVA提供了关键字 assert 来检查属性,assert的基本语法是:

     assertion_name: assert property(property_name)

     else $display("SVA error");

property与sequence的异同 

  1.任何在sequence中的表达式都可以放到property中;

  2.任何在property中的表达式也可以搬到sequence中,但是只有在property中才能使用蕴含操作符;

  3.property中可以例化其他property和sequence,sequence中也可以调用其他的sequence,但是不能例化property;

  4.property需要用cover /assert/assume 等关键字进行实例化,而sequence直接调用即可;

 

触发判断:$rose(a);   $fell(a);  $stable();    $changed();

周期延时:##n  ##[m:n]  ##[*]   ##[+]   a[*3] 

 

多个事件行为关系:intersect(a, b)       a within b       a ##2 b a ##[1:3] b a ##[3:$] b     c throughout (a ##2 b)          @ (posedge clk) a |-> b     @ (posedge clk) a |=>##2 b

          @ (posedge clk) $past(a,2) == 1'b1       @ (posedge clk) a [*3] @ (posedge clk) a [*1:3] @ (posedge clk) a [->3]

 

总线的断言函数

 

 

  

    

 

posted @ 2022-05-25 23:26  NBI  阅读(745)  评论(0)    收藏  举报