crazybird

【SystemVerilog断言学习笔记6】禁止属性的使用

1
阅读(2791)

    当我们期望属性永远为假时,可以用关键字“not”来禁止属性,即当属性为真时断言失败。接下来验证“not”是如何运作的。

    测试代码:

/*******************************************************
作者   :  CrazyBird
文件   :  assert_test2.sv
日期   :  2015-5-7
功能   :  禁止属性“not”的测试
********************************************************/
`timescale 1ns/1ps
module  assert_test2(
    output reg  clk,
    output reg  a,
    output reg  b
    );
    
    //  产生时钟
    parameter   PERIOD = 10;
    
    initial
    begin
        clk = 0;
        forever #(PERIOD/2)
            clk = ~clk;  
    end
    
    //  产生激励
    initial
    begin
        a = 1;
        b = 1;
        repeat(20)@(negedge clk)
        begin
            a = {$random()}%2;
            b = {$random()}%2;
        end
        @(negedge clk);
        $stop;
    end
    
    //  建立序列
    sequence  s1;
        a ##2 b;
    endsequence
    
    //  建立属性
    property  p1;
         @(posedge clk) not(s1);
    endproperty

    //  断言属性
    a1 : assert property(p1);

endmodule

    注意“not”所在的位置,如果是下面的写法,编译将报错:

//  建立序列
sequence  s1;
    a ##2 b;
endsequence

//  建立属性
property  p1;
    not(@(posedge clk) s1);
endproperty

    或者

//  建立序列
sequence  s1;
    @(posedge clk) a ##2 b;
endsequence

//  建立属性
property  p1;
    not(s1);
endproperty

7

    测试结果:

8

# ** Error: Assertion error.
#    Time: 25 ns Started: 5 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49
# ** Error: Assertion error.
#    Time: 55 ns Started: 35 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49
# ** Error: Assertion error.
#    Time: 65 ns Started: 45 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49
# ** Error: Assertion error.
#    Time: 105 ns Started: 85 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49
# ** Error: Assertion error.
#    Time: 115 ns Started: 95 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49
# ** Error: Assertion error.
#    Time: 185 ns Started: 165 ns  Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49

9

    很明显,当时钟上升沿到来时,若a为高电平,2个时钟周期后,若b也为高电平,则断言失败,且失败标注在序列的结束位置。当时钟上升沿到来时,若a为低电平,则断言直接成功;若a为高电平,2个时钟周期后b为低电平,则断言成功。这刚好跟“a ##2 b”的属性相反,故验证了“not”是可以禁止属性的。

 

    待续~~~