【system verilog】SV Assertion 断言


SystemVerilog Assertion(SVA)–断言

SV断言是什么?有什么用?

SV断言是什么?

一言以蔽之:断言是设计属性的描述。

如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。
如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。

一系列的属性可以从设计的功能描述中推知,并且被转换成断言。这些断言能在功能的模拟中不断地被监视,从而可以得知设计的功能是否正确。

SV断言有什么用?

SV断言可以作为checker检查DUT中某些电路的正确性,SV断言可以收集DUT中某些行为,即收集功能覆盖率;

断言是一个“观测员”,它可以观测程序的状态,但它不会改变代码本身。

SystemVerilog集成了断言并且能够将它们与设计余下的部分或验证代码紧密地结合起。SystemVerilog断言的一一个主要特点就是它们是语言本身的组成部分。这也就意味着我们可以将它们与其它语言结构内联使用,而不需要产生特殊的程序及其它类似的限制。另外,SystemVerilog中的断言还可以用来提供功能覆盖。

SV断言怎么用?

SV断言语法

即时断言与并发断言

SystemVerilog具有两种类型的断言并发断言和即时断言。

即时断言

即时断言就像过程块中的一条语句一 样执行。
基于模拟事件的语义。测试表达式的求值就像在过程块中的其他Verilog的表达式一样。它们本质不是时序相关的,而且立即被求值。必须放在过程块的定义中。
只能用于动态模拟。

并发断言

并发断言:
基于时钟周期
在时钟边缘根据调用的变量的采样值计算测试表达式
变量的采样在预备阶段完成,而表达式的计算在调度器的观察阶段完成
可以被放到过程块(procedural block)、模块(module)、 接口(interface), 或者一个程序(program)的定义中。

序列 sequence

序列由sequence… endsequence声明
功能特性经常由有序的行为构建,sequence功能提供了一种能力来构建和处理有序的行为。
在一系列的布尔逻辑表达式中,如果每个布尔表达式的计算都为真,那么关于这个序列的断言为真,否则为假。

sequence s1;//无参数
	@(posedge clk) a ##1 b ##1 c;//##1指的是延时一个周期	
endsequence//上面的意思是先a是1,一个周期后b是1,一个周期c是1

sequence s2(data,en);//带参数
	@(posedge clk)(!a && (data == data_bus) ##1 c[0:3] == en )
endsequence

边缘表达式

SVA也内嵌了边缘表达式,以便用户监视信号值从一个时钟周期到另一时钟周期的跳变。这使得用户能检查边沿敏感的信号。(前后信号不一致才是属于跳变)
$rose(boolean expression or signal name):当信号/表达式为1时返回真。
$fell(boolean expression or signal_ name):当信号/表达式为0时返回真。
$stable(boolean"expression or signal_ name):当信号/表达式不发生变化时返回真。

时钟周期延迟

时钟关系的序列
很多时候,我们关心的是检查需要几个时钟周期才能完成的事件。也就是所谓的“时序检查”。在SVA中,时钟周期延迟用"#" 来表示。例如,#3表示3个时钟周期。举个例子:

sequence s1;
	@(posedge clk) a ##2 b;
endsequence 	

序列s4检查信号"a"在一一个给定的时钟上升沿是否为高电平:
如果信号"a"不是高电平,序列失败,断言失败。
如果信号"a"在任何一一个给定的时钟上升沿为高电平,信号"b” 在两个时钟周期后为高电平,则断言成功。
如果信号"a"在任何一一个给定的时钟上升沿为高电平,信号"b" 在两个时钟周期后为不为高电平,断言失败。
在仿真后结果显示中,成功的序列总是标注在序列开始的位置

属性 property

许多序列可以有序地组合起来生成更复杂的序列。SVA 提供了一个关键词"property" 来表示这些复杂的有序行为。属性(property)的基本语法是:
property name_ of_ property;
; or
;
endproperty
属性是在模拟过程中被验证的单元。它必须在模拟过程中被断言来发挥作用。 SVA提供了关键"assert"来检查属性。断言(assert)的基本语法是:
assertion_ name: assert property (property_ name);

在一些常用的属性中定义形参,可以达到重用的目的
在这里插入图片描述

arb为带形参的属性,通过形参可以重用一些常用的属性,假设a b c d四个信号是相似设备上,相同功能的信号,那么通过形参重用属性arb是一个不错的选择。

时钟定义

定义一个序列并不能发挥作用,它必须被断言才能发挥作用。例如:
在这里插入图片描述
上例中在序列s5中指定了时钟。SVA在序列、 属性,甚至一个断言的语句中都可以定义时钟。例如:
在这里插入图片描述
通常情况下,在属性(property)的定义中指定时钟,并保持通常情况下,在属性(property)的定义中指定时钟,并保持可以提高基本序列定义的可重用性。在sequence描述行为,在property描述时钟;

禁止属性

属性可以禁止发生,即我们期望属性永远为假,永远不要为真,当属性为真时,断言失败。
序列s6检查当信号"a"在给定的时钟上升沿为高电平,那么两个时钟周期以后,信号"b"不允许是高电平。关键词"not" 用来表示属性应该永远不为真。
在这里插入图片描述

执行块

SystemVerilog 语言被定义成每当一个断言检查失败,模拟器在默认情况下都会打印出一条错误信息。模拟器不需要对成功的断言打印任何东西。读者同样可以打印自定义自定义的成功或失败信息。
在这里插入图片描述
断言有可选的 then 和 else 分句,可以定制你自己的输出消息,例如创建一个定制的错误消息:

u_assert: assert(u_bus.u_clocking.grant==2'b01)
          		grants_rec++;  //成功则运行这句
    	  else
        		$error("grant not asserted !"); //否则输出错误信息

蕴含操作

对于@(posedge clk) a #2 b这样的属性,它在每个时钟上升沿检查信号"a" 是否为高。寻找是否为一个断言的有效开始。

如果信号"a"在给定的任何时钟上升沿不为高,检验器将产生一个错误信息。这并不是一个有效的错误信息因为我们不只关心a,更加关心a和b的关系。这个错误只表明这个时钟周期没有得到有效起始点。它们会在一段时间内产生大量的错误信息。

基于以上问题,SVA提供了蕴含操作。
蕴含等效于一个if-then结构。蕴含的左边叫作“先行算子”,右边叫作"后续算子”。当先行算子成功时,后续算子才会被计算。如果先行算子不成功,那么整个属性就默认地被认为成功。这叫作"空成功”
蕴含结构只能被用在属性定义中,不能在序列中使用。

蕴含分为两类:交叠蕴含非交叠蕴含
交叠蕴含用符号"|->” 表示。如果先行算子匹配,在同一个时钟周期计算后续算子表达式。例如:
在这里插入图片描述
当信号"a" 为高,而且信号"b" 在同一个时钟沿也为高,这是一个真正的成功。若信号"a"不为高,断言默认自动成功,称为空成功。信号"a" 为高且,并且在同一个时钟沿信号"b" 未能检测为有效的高电平,则断言失败。

非交叠蕴含用符号(“I=>”)表示。如果先行算子匹配,那么在下一个时钟周期计算后续算子表达式。后续算子表达式的计算总是有一个时钟周期的延迟。 例如:
在这里插入图片描述
蕴含操作

后续算子固定延迟的蕴含

在这里插入图片描述

使用序列作为先行算子的蕴含

在这里插入图片描述

嵌套的蕴含

SVA允许使用嵌套的蕴含。当我们有多个门限条件指向一个最终的后续算子时,这种构造十分有用。例如:
在这里插入图片描述

在蕴含中使用if else

在这里插入图片描述
在先行算子成功匹配时,后续算子有两个可能的路径。

.上例中,如果不使用f…else,那么需要使用三个独立的属性来实现。
在这里插入图片描述

时序窗口

SVA的延迟可以支持固定的正延迟,也可以支持一个时间窗口。例如:
在这里插入图片描述
在这里插入图片描述
p12先行算子在任何给定的时钟上升沿为真,那么在接下去的1~3周期内,信号"c" 应该至少在一个时钟周期为高,SVA允许使用时序窗口来匹配后续算子。时序窗口表达式左手边的值必须小于右手边的值。每声明一个时序窗口,就会在每个时钟沿上触发多个线程来检查所有可能的成功。p12 实际上展开了三个线程。

重叠的时序窗口

如下例所示,后续算子时序窗口中,左边最小值为0,表示后续算子在先行算子成功的同一个时钟沿开始计算。
在这里插入图片描述

语法之ended结构

默认情况下,多重sequence的组合是以sequence的起始时间作为同步标志的,就是以序列的起始点作为同步点,来组合成时间上连续的检查。
SVA提供ended结构以sequence的结束时间作为序列同步点。关键字ended存储一 个反映在指定时钟处序列是否匹配成功的布尔值。
ended代表匹配的完成,是匹配的结束点,而不是匹配的起点。

默认情况下,多重sequence的组合是以sequence的起始时间作为同步标志的,就是以序列的起始点作点作为同步点,来组合成时间上连续的检查。SVA 还提供了另一种使用序列的结束点作为同步点的连接机制。
在这里插入图片描述
在这里插入图片描述
使用true表达式,可以在时间上延长SVA检验器。这代表一种忽略的状态,它使得序列延长了几个时钟周期。这可以用来实现同时监视多个属性且需要同时成功的复杂协议。
在这里插入图片描述
与断言a18比较,断言a18_ ext 的起始点被推迟了-一个时钟周期。

$past构造

SVA提供了一个内嵌的系统任务"$past", 它可以得到信号在几个时钟周期之前的值。在默认情况下,它提供信号在前一个时钟周期的值。结构的基本语法如下:
$past (signal name, number of clock cycles)
这个任务能够有效地验证设计到达当前时钟周期的状态所采用的通路是正确的。
在这里插入图片描述
只有当控制信号’'e"在任意给定的时钟上升沿有效时检验才被激活。

跟随重复运算符[->]

如下断言代码用例检查c连续或间断之后3次和4次为高的断言,波形如下面图所示:

 property syp_test_2;
    @(posedge clk_zy) disable iff(~en)
    $rose(a) |-> b throughout c[->3] ;
  endproperty
  sva_test_2: assert property(syp_test_2);

  property syp_test_2_1;
    @(posedge clk_zy) disable iff(~en)
    $rose(a) |-> b throughout c[->4] ;
  endproperty
  sva_test_2_1: assert property(syp_test_2_1);

在这里插入图片描述

跟随运算符

下面这个断言代码等待c 2个时钟周期为高后又过1个时钟周期检查d是否为高,波形如下面所属,可以看到第一次检查失败了,后面2次检查都成功了;

 property syp_test_4_1;
    @(posedge clk_zy) disable iff(~en)
    $rose(a) |-> b throughout c[->2] ##1 d;
  endproperty
  sva_test_4_1: assert property(syp_test_4_1); 

在这里插入图片描述

断言实例


本文部分资料参考来源网络,以示致谢,如有侵权,请联系本人!
SystemVerilog Assertion 设计、调试、测试总结(1)

————————————————
版权声明:本文为CSDN博主「龙卷风席卷停车场」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiyieba/article/details/106797416

  • 24
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SystemVerilog Assertion 应用指南电子版提供了对于SystemVerilog AssertionSVA)在硬件验证中的应用的详细指导和建议。 SVA是一种在硬件验证中使用的特殊语言,用于对设计规范和行为进行验证。它与Verilog HDL结合使用,可以对设计中的时序和功能进行表达和验证。SVA在验证过程中可以帮助设计人员更好地发现和排除设计中的错误,并提高验证效率。 在SystemVerilog Assertion 应用指南电子版中,主要包括以下内容: 1. SVA基础知识:介绍SVA的语法和基本语句,包括property语句、assertion语句、sequence语句等。通过学习这些基础知识,读者可以了解SVA的基本用法和功能。 2. SVA高级应用:介绍一些复杂的SVA用法和技巧,如时序检查、复杂约束、错误定位等。这些高级应用可以帮助读者更好地应用SVA进行验证。 3. SVA调试技巧:提供了一些在验证过程中调试SVA的实用技巧和方法,帮助读者定位问题和提高调试效率。 4. SVA实例:给出了一些实际的SVA验证案例,在实例中展示了如何使用SVA进行验证,并提供了相关的代码和解释。 通过阅读SystemVerilog Assertion 应用指南电子版,读者可以全面了解SVA的应用和使用方法,掌握SVA在硬件验证中的关键技巧,提高验证效率和准确性。无论是初学者还是有一定经验的验证工程师,都可以从中获得实用的知识和指导,提高自己在硬件验证中的能力。 ### 回答2: SystemVerilog是一种硬件描述语言,它支持断言Assertion)的应用。系统级别验证是确保设计和验证的正确性的重要步骤,断言在此过程中起着关键作用。断言是一种用于描述设计预期行为和验证目标的形式规范。以下是SystemVerilog断言的应用指南。 1.断言语法:SystemVerilog提供了一种断言语言来描述设计和验证要求。断言语句使用assert、assume和cover等关键字来定义,可以包含条件表达式和时序属性。 2.时序属性:时序属性是断言的重要组成部分。它们描述了信号行为在时间上的相对顺序。SystemVerilog提供了丰富的时序属性,如延迟(delay)、周期周期(repeat)和到达(property)等。 3.设计验证目标:在使用断言时,首先需要明确验证目标。验证目标可以是功能、性能、时序或其他特定方面的需求。这有助于确定需要编写的断言类型和属性。 4.模块划分:将设计划分为多个模块可以更好地管理断言。根据设计功能不同,可以设计独立的断言来验证每个模块的功能。 5.调试和报告:SystemVerilog断言提供了一种检测设计错误的方法。在验证过程中,可以通过断言的报告和调试信息来定位错误。根据断言的触发条件和时序属性,可以确定错误出现的位置。 6.性能优化:断言的数量和复杂性可能会对验证过程产生负面影响。因此,应该根据设计的规模和复杂性进行性能优化,以确保验证效率。 7.仿真和形式验证:SystemVerilog断言可以用于仿真和形式验证。在仿真中,通过断言验证设计行为的正确性。在形式验证中,断言可以指导形式验证工具进行验证,以寻找潜在错误。 总结:使用SystemVerilog断言,可以更好地管理系统级别验证的过程。它提供了丰富的语法和时序属性,用于描述设计预期行为和验证目标。通过模块划分和性能优化,可以提高验证效率。同时,以断言为基础的调试和报告方法可以快速定位设计错误,从而加快验证过程。无论是在仿真还是形式验证中,断言都是验证流程中不可或缺的一部分。 ### 回答3: 《SystemVerilog 断言应用指南》是一本非常有用的电子书,旨在帮助工程师们更好地理解和应用 SystemVerilog 断言。以下是对该电子书的简要回答。 该电子书通过简单明了的方式解释了 SystemVerilog 断言的基本概念和语法,并提供了丰富的示例来帮助读者快速上手。它深入讲解了断言的不同类型和用法,例如基本断言、连续断言和并发断言等。对于初学者来说,这些示例有助于更好地理解断言在各种情况下的实际应用。 此外,该电子书还介绍了断言的调试技巧和最佳实践。通过详细讲解断言的调试过程和常见的问题,读者可以了解到如何有效地调试断言并解决相关问题。此外,最佳实践部分提供了一些建议和技巧,包括如何编写清晰、可读性强的断言以及如何在实际项目中集成断言等。 除了基本内容之外,这本电子书还提供了一些高级主题,如在面向对象设计中使用断言、如何使用参数化断言以及如何在验证环境中使用断言等。这些主题对于有一定经验的工程师来说非常有价值,可以帮助他们进一步提升断言的应用水平。 总的来说,《SystemVerilog 断言应用指南》是一本全面而实用的电子书,对于想要学习和应用 SystemVerilog 断言工程师来说是一本不可或缺的参考书。无论你是初学者还是有经验的工程师,这本电子书都能够帮助你更好地理解和应用断言,并提升你的设计和验证能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值