[SVA知识点一]: System verilog 断言(assert)的基本介绍

断言(SVA)在数字电路设计中扮演重要角色,用于检查条件和事件序列,提供功能覆盖。断言分为立即断言和并发断言,前者在当前仿真时间点检查条件,后者则在时序环境中持续监测。并发断言基于时钟周期执行,常用property关键字定义。SVA的组成包括布尔表达式、序列、属性和断言声明,这些构造块共同确保设计按预期执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

断言(System Verilog Assertion 简称SVA)可以被放在RTL设计或验证平台中,方便在仿真时查看异常情况。一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于30%。断言通常被称为序列监视器或者序列检验器,是对设计应当如何执行特定行为的描述,是一种嵌入设计检查。如果检查的属性(property)不是我们期望的表现,那么在我们期望事件序列出现异常情况,发生故障时,会产生警告或者错误提示。

 

目录

一、断言的作用

二、断言的种类

三、 并发断言SVA组成

一、断言的作用

1.检查特定条件或事件序列的出现情况。

2.提供功能覆盖

二、断言的种类

1.立即断言(Immediate Assertions)

立即断言具有非时序性特性,作为检查当前仿真时间的条件,执行时如同过程语句相当于 if else,需要放在过程块中,如:initial、always、task、function。

语法:

        labels: assert(expression) action_block;

其中:

        (1)、action_block操作块在断言表达式expression之后立即执行;

        (2)、action_block操作块指定在断言成功或失败时采取什么操作;

        (3)、action_block类型:pass_statement;else fail_statement;

        (4)、labels为断言名称;

由于断言表达式中所断言的条件必须为真,因此断言的失败将具有与之相关的“严重”程度。默认情况下,断言失败的严重程度是一个error。还可以结合$fatal/$error/$warning/$info给出不同严重级别的消息提示,严重等级依次递减。

module alu(a,b,c,en)

input a,b;
input en;

output c;
reg a,b;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        c <= 0;
    end

    else if(a == b)
    begin
        check_a_and_b assert((a>=5) || (b>=5))  $display("expression evaluates value is true");
        else
            $error("expression evaluates value is false");
    end
end

... ...

endmodule

在a和b发生变化时,断言语句被执行。

2.并发断言(Concurrent  Assertions) 

并发断言具有时序性,通常使用关键词property用来区分立即断言和并发断言。之所以称之为并发,是由于断言语句会与设计模块一同并行执行。我们可以认为并发断言是一个连续运行的模块,为整个仿真过程检查信号,因此会在并发断言内设定一个采样的时钟。

         (1)、  并发断言仅在有时钟周期的情况下出现,基于时钟周期执行;

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

         (3)、  变量的采样在预备阶段完成,而表达式的计算在调度器的观察阶段完成;

         (4)、  可以在过程块、module、interface、program块内定义并发断言;

         (5)、  区分立即断言和并发断言的关键字是property。

语法:

        labels: assert property (判断条件)

        举例:

a_b: assert property(@(posedge clk) not(a && b));

其中:

        (1)、labels为断言名称;

        (2)、property(属性)在每个时钟的上升沿都被效验,不论a和b如何变化。

三、 并发断言SVA组成

一条SVA并发断言可以看成是由四种不同层次的结构组成:

  • 建立布尔表达式(booleans)
  • 建立序列(sequence)
  • 建立属性(property)
  • 建立断言声明(assertion statements)

1、布尔表达式

        布尔表达式是构成SVA的最基本单元。其一般形式为标准的SystemVerilog的布尔表达式,它由信号及其逻辑关系运算符构成,用以表示某个逻辑事件的发生。

2、序列

        序列是布尔表达式在时间上的组合。在任何设计模型中,功能总是由多个逻辑事件的组合来表示。这些事件可以是简单的同一个时钟边缘被求值的布尔表达式,或者是经过几个时钟周期的求值的事件

        SVA中用序列(sequence)来表示这些事件,sequence可以让断言易读,复用性高。具有以下特性:可以带参数、可以在property中调用、可以使用局部变量、可以定义时钟周期。

其基本语法是:

sequence Name_of_Sequence;
    (test expression);
    ......
endsequence

许多序列可以逻辑或者有序地组合起来生成更复杂的序列。

3、属性

        SVA中用属性(property)来表示这些复杂的有序行为。property是比seuence更高一层的单元,也是构成断言最常用的模块。其中最重要的性质是可以在property中使用蕴含操作符(|-> |=>)。

其基本语法是:

property Name_of_Property;
    (test expression); or
    (complex sequence expressions)
endproperty

property就是SVA中需要用来判定的部分,用来模拟过程中被验证的单元,它必须在模拟过程中被断言来发挥作用。

4、断言

        SVA中用断言(assert)来检查这些属性。其基本语法是:

assertion_name: assert property(property name)

未完待续......

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Icer眼中的类

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

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

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

打赏作者

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

抵扣说明:

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

余额充值