【system verilog】SV Assertion 断言

这篇具有很好参考价值的文章主要介绍了【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);

在一些常用的属性中定义形参,可以达到重用的目的
system verilog 断言,system verilog,硬件工程

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

时钟定义

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

禁止属性

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

执行块

SystemVerilog 语言被定义成每当一个断言检查失败,模拟器在默认情况下都会打印出一条错误信息。模拟器不需要对成功的断言打印任何东西。读者同样可以打印自定义自定义的成功或失败信息。
system verilog 断言,system verilog,硬件工程
断言有可选的 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结构。蕴含的左边叫作“先行算子”,右边叫作"后续算子”。当先行算子成功时,后续算子才会被计算。如果先行算子不成功,那么整个属性就默认地被认为成功。这叫作"空成功”
蕴含结构只能被用在属性定义中,不能在序列中使用。

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

非交叠蕴含用符号(“I=>”)表示。如果先行算子匹配,那么在下一个时钟周期计算后续算子表达式。后续算子表达式的计算总是有一个时钟周期的延迟。 例如:
system verilog 断言,system verilog,硬件工程
蕴含操作

后续算子固定延迟的蕴含

system verilog 断言,system verilog,硬件工程

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

system verilog 断言,system verilog,硬件工程

嵌套的蕴含

SVA允许使用嵌套的蕴含。当我们有多个门限条件指向一个最终的后续算子时,这种构造十分有用。例如:
system verilog 断言,system verilog,硬件工程

在蕴含中使用if else

system verilog 断言,system verilog,硬件工程
在先行算子成功匹配时,后续算子有两个可能的路径。

.上例中,如果不使用f…else,那么需要使用三个独立的属性来实现。
system verilog 断言,system verilog,硬件工程

时序窗口

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

重叠的时序窗口

如下例所示,后续算子时序窗口中,左边最小值为0,表示后续算子在先行算子成功的同一个时钟沿开始计算。
system verilog 断言,system verilog,硬件工程

语法之ended结构

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

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

$past构造

SVA提供了一个内嵌的系统任务"$past", 它可以得到信号在几个时钟周期之前的值。在默认情况下,它提供信号在前一个时钟周期的值。结构的基本语法如下:
$past (signal name, number of clock cycles)
这个任务能够有效地验证设计到达当前时钟周期的状态所采用的通路是正确的。
system verilog 断言,system verilog,硬件工程
只有当控制信号’'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);

system verilog 断言,system verilog,硬件工程

system verilog 断言,system verilog,硬件工程

下面这个断言代码等待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); 

system verilog 断言,system verilog,硬件工程

断言实例


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

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

到了这里,关于【system verilog】SV Assertion 断言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (十二)SV的断言

    断言又被称为监视器或者检验器,在设计验证流程中被广泛使用, 用于描述设计的属(property),可以完美地描述时序相关的状况,用于描述设计期望的行为,从而检验设计实际行为是否与设计意图相符 ,如果允许的设计属性不符合我们的期望,则断言失败;如果被禁止的设计

    2024年02月09日
    浏览(42)
  • Unitest单元测试,常用断言方法Assertion

    unittest库提供了很多实用方法来检测程序运行的结果和预期。包括三种类型的方法,每一种都覆盖了典型的类型,比如: 检查相等值、逻辑比较、异常 如果给定的Assertion通过了,那么测试会执行下一行代码。如果给定的assertion没有通过,测试会暂停并且生成错误信息。unitt

    2024年02月05日
    浏览(57)
  • 【Java高级特性】(二)断言机制 Assertion:关于断言机制最全面的讲解来了~

    掌握断言机制的概念、作用与使用; 掌握如何自定义异常; 1.1 概念 断言机制是一种编程技术,用于在程序中检查和验证假设或前提条件是否为真。在软件开发过程中,断言常被用于确保程序代码按照预期执行,并且在遇到错误或异常情况时能够提供有用的诊断信息。 断言

    2024年02月12日
    浏览(33)
  • 【Verilog刷题篇】硬件工程师进阶1|序列检测

    硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和! - 本期是【Verilog刷题篇】硬件工程师进阶1|序列检测,有不懂的地方可以评论进行讨论! 推荐给大家一款刷题、面试的神器 ,我也是用这一款神器进行学习 Verilog硬件

    2024年02月03日
    浏览(48)
  • FPGA硬件工程师Verilog面试题(基础篇一)

    ✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步! 📃个人主页:嵌入式基地 🔥系列专栏:FPGA Verilog 习题专栏 微信公众号:嵌入式基地 点击进行在线练习 描述 制作一个四选一的多路选择器,要求输出定义上为线网类型 状态转换:

    2023年04月26日
    浏览(44)
  • go 笔记 十二章 断言 assertion 和 反射 reflect

    断言 把一个接口类型指定为它的原始类型 反射 官方说法:在编译时不知道类型的情况下,可更新变量、运行时查看值、调用方法以及直接对他们的布局进行操作的机制,称为反射。 通俗说法:可以知道变量原始数据类型和内容、方法等,并且可以进行一定的操作 为什么要

    2024年02月17日
    浏览(50)
  • 保姆级教程超硬核包会,SystemVerilog SV 断言

    前言 :仿真的时候,需要观察某些程序运行的结果是否符合预期,这一需求一般是通过断言来实现。 对于程序的检查。 断言是设计的属性的描述 。 如果被检查的属性与期望不同断言失败 。 如果被禁止在设计中出现的属性在仿真中出现,也断言失败。 断言可以在功能仿真

    2024年02月12日
    浏览(36)
  • 【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门

    硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和! - 本期是【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门,有不懂的地方可以评论进行讨论! 推荐给大家一款刷题、面试的神器 ,我也是用这一款

    2024年02月03日
    浏览(39)
  • sv,verilog

    在 Verilog 中,敏感列表(Sensitive List)指的是在 always 语句块中使用时钟信号的列表。敏感列表用于指定 always 块所监控的输入信号,在这些信号状态发生变化时, always 块会被触发执行。 在 Verilog 中, always 块有两种敏感列表: 电平敏感列表(Level-Sensitive List):较早的 Ver

    2024年02月04日
    浏览(38)
  • MCDF实验3:群鸦的盛宴(从verilog到SV的入门lab3)

    前言 :在实验3添加了随机约束来随机化产生的数据,使用了信箱来完成类之间的通信,添加了monitor、checker让验证的组件越来越完整。 种一棵树最好的时间是十年前,其次是现在。不是吗? 实验3需要用到随机化、信箱、类的多态这几个主要知识,大家可以先去学习哦! 在

    2024年02月06日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包