0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

聊聊形式验证中的SVA

sanyue7758 来源:验证工程师的自我修养 2023-06-14 09:31 次阅读

一、序言

SVA,即SystemVerilog Assertion,在simulation和Formal都有极为广泛的应用,这里介绍一些基本的概念和常用的语法。

二、一个简单的例子

以一个arbiter仲裁器 作为例子来阐述一些概念,这个仲裁器有4个request来自不同的agent,req的每个bit表示相应的仲裁请求发起。gnt信号每个bit表示相应的请求被允许。同时,这里还有一个opcode输入,用来override正常的请求,例如强制某个agent获得grant,或者让所有的gnt都无效一段时间。error信号表示一些错误的输入序列或者错误的opcode。模块框图如下所示:

f1a08290-0a01-11ee-962d-dac502259ad0.png

interface代码如下:

wKgZomSJGIWAA2AHAACGStX_-jQ053.jpg

三、基本概念

在介绍SVA之前,我们先来澄清几个容易混淆的概念,尤其是assertion和assumption,傻傻分不清。

3.1 Assertion

assertion一般用来表示一个表达式恒为True,比如agent0未发起request,则gnt[0]不应该被拉起来。这种情形我们可以用assertion来加以检查。

check_grant: assert property (!(gnt[0] && !req[0])) else $error(“Grant
without request for agent 0!”);

3.2 Assumption

assertion一般用于检查DUT内部的状态,而Assumption则主要用于约束验证环境,主要用于约束输入。例如我们期望opcode应该是合法的一些参数,就可以用assumption语句来进行约束。

good_opcode: assume property (opcode inside {FORCE0,FORCE1,FORCE2,
FORCE3,ACCESS_OFF,ACCESS_ON}) else $error(“Illegal opcode.”);

在simulation中,assumption跟assertion运行效果一样,都是用来检查输入。但在Formal里面,二者则有很多的区别。对于上面那个assumption,在simulation中,不断的检测opcode,不在这些数里面则报一个assertion failure。在Formal里面,这是表示opcode激励只能在这些数里面取值,大家可以将其理解成一个输入的constraint。

3.3 COVER POINTS

这个没什么好说的,在simulation和formal里面都是一致,用来表征覆盖率。

不过需要注意的是,FV通常可以全覆盖。但是因为有assumption,我们有时候会overconstraint ,这样有些东西就可能被漏掉。所以coverpoint在FV里面至关重要。

一般来说,FV上来就先写coverpoint,先规划好哪些点需要覆盖。其次还是assertion和assumption。这样就不会出现过overconstraint而不自知的情形。

四、SVA 语法介绍

SVA Asssertion 语言分为几个等级,自下而上,可以分成四个等级,即boolean、sequence、property和assertion statement,如下图所示:

f1c62a86-0a01-11ee-962d-dac502259ad0.png

Booleans

Booleans 即布尔表达式,一些与或非的逻辑,例如:

(req[0]&&req[1]&&req[2]&&req[3])

Sequences

Sequences 顾名思义,就是boolean 表达式的序列,也就是说一段时间(几个cycle)的booleans的组合,以来与clock event来定义这个区间,例如req0有效两个cycle后gnt0有效

req[0] ##2 gnt[0]

Properties

Properties 则是进一步将sequences和一些操作符组合起来,表示一个implication或者其他的。比如:

req[0] ##2 gnt[0] |-> ##1 !gnt[0]

Assertion Statements

Assertion Statements 则是用assert, assume, cover等关键词将properties例化,把SVA property 转换成真正意义的assertion, assumption, cover point. 例如:

gnt_falls: assert property(req[0] ##2 gnt[0] |-> ##1 !gnt[0]);

另外还有两个概念需要明确:

immediate assertions

Immediate assertion 简单的assertion语句,只能用于procedural 语句里面。只支持booleans,不能有clock, reset或者property语句。

imm1: assert (!(gnt[0] && !req[0]))

concurrent assertions

Concurrent assertion 语句则一般用于检查多个cycle期间段的一些property,一般我们说SVA基本代指Concurrent assertion

conc1: assert property (!(gnt[0] && !req[0]))

五、CONCURRENT 语法

concurrent assertion的一般写法如下例所示:

safe_opcode: assert property (
@(posedge clk)
disable iff (rst)
(opcode inside {FORCE0,FORCE1,FORCE2,FORCE3,ACCESS_OFF,ACCESS_ON}))
else $error(“Illegal opcode.”);

一般包含下面几点:

带关键词assert property.

带clock

可选的disable iff语句

5.1 常用函数

SVA自带了一些系统函数,这里列出一些常用的供参考。

f1f5a40a-0a01-11ee-962d-dac502259ad0.png

f22b9010-0a01-11ee-962d-dac502259ad0.png

5.2 Disable iff

Disable iff (iff表示if and only if)语句,顾名思义就是在某个条件成立的时候将assertion语句disable掉。但这里有点需要特别注意的是,diasable iff里面的逻辑采样不是基于clock的,或者说相对clock来说是异步的。建议里面只放reset逻辑,不要放其他的逻辑。我们举个例子,如果有gnt,那么铁定有个req,两种写法:

bad_assert: assert property (@(posedge clk)
disable iff
(real_rst || ($countones(gnt) == 0))
($countones(req) > 0));
good_assert: assert property (@(posedge clk)
disable iff (real_rst)
(($countones(req) > 0) ||
($countones(gnt) == 0)));

表面上看,二者似乎一样。仔细分析下,在clock 8的phase,由于gnt=0,整个assertion直接被disable,我们也就没法检测出上一个cycle的failure。

这里其实是涉及到SVA的采样时间问题,或者说systemverilog的region问题,建议翻阅<> 这本书,里面有非常详细的解读。

f2762058-0a01-11ee-962d-dac502259ad0.png

六、SEQUENCE 语法

6.1 delay

sequence 基本的操作符是#,即delay,##n (延时特定个cycle) or ##[a:b] (延时 a 到b 个cycle) 。

f2a7e746-0a01-11ee-962d-dac502259ad0.png

6.2 repetition

repetition 操作符 [*m:n] ,表示subsequence 重复多少次。

f2d2d3e8-0a01-11ee-962d-dac502259ad0.png

6.3 logical ops

Sequences 可以通过and 或者or组合起来。

and: 两个sequence同时start,但它们的结束点未必相同。

or: 两个sequence至少有一个match

throughout : Boolean expression remains true for the whole execution of a sequence

within: one sequence occurs within the execution of another

f312bada-0a01-11ee-962d-dac502259ad0.png

f3575b4a-0a01-11ee-962d-dac502259ad0.png

f38eb7c0-0a01-11ee-962d-dac502259ad0.png

6.4 go to repetetion

goto repetition 操作符,即 [- > n] 和 [ =n] ,表示有value重复了正好n次,未必是连续的cycle。

这两个操作符如果后面不接其他的东西的话,是等价的。如果后面带有其他的sequence的话,意义有点不一样:

[->n]: goto repetition, 下一个sequence必须紧接着。

[=n]: nonconsecutive goto repetition, 下一个seuquece出现前允许插入若干个cycle的空闲

f3ca41a0-0a01-11ee-962d-dac502259ad0.png

6.5 Implication

sequence |-> property :sequence match后立即检查property

sequence |=> property. :sequence match后delay一个cycle再检查property

左边称为antecedent (先决条件),必须为sequence;右边称为consequence (结果) ,可以是squence或者property。

需要强调一点,如果antecedent 在整个过程都不满足的话,这个assertion也不会fail,这种情形在formal中称为vacuously,即空的pass。

f406a852-0a01-11ee-962d-dac502259ad0.png

f42ea244-0a01-11ee-962d-dac502259ad0.png

还有一些SVA语法,不是很常用,可以用到时候翻阅手册查询

六、MULTITHREADING

MULTITHREADING,即多线程。这里需要强调下,assertion的多线程属性;每次antecedent为真,工具都将新启动一个线程来check,我们以一个例子来进行说明。

req信号有效后,10个cycle之后gnt信号应该有效。代码如下:

delayed_gnt: assert property (req[0] |->##10 gnt[0])

由于req和gnt之前隔了10个cycle,很有可能在这中间req信号再次被拉起,如果这样的话,工具会启多个线程,每个线程检查相应的req和gnt对应的关系。

f46ed134-0a01-11ee-962d-dac502259ad0.png

七、总结

SVA语法较多,需要反复练习才能掌握和精通。尤其是它的debug,需要反复实践,加以体会。不建议写很复杂的SVA,不方便debug。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SVA
    SVA
    +关注

    关注

    1

    文章

    19

    浏览量

    10096
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8164
  • DUT
    DUT
    +关注

    关注

    0

    文章

    182

    浏览量

    12000

原文标题:干货,聊聊形式验证中的SVA

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    芯片开发中形式化验证的是一个误区

    今天的形式验证工具具有更大的容量,并且许多工具能够在服务器或云上以分布式模式运行。形式验证的技术和方法也得到了扩展。
    的头像 发表于 11-29 14:31 1596次阅读

    关于功能验证、时序验证形式验证、时序建模的论文

    半定制/全定制混合设计的特点,提出并实现了一套半定制/全定制混合设计流程功能和时序验证的方法。论文从模拟验证、等价性验证和全定制设计的功能验证
    发表于 12-07 17:40

    SVA断言是基于边沿还是电平呢?

    SVA断言是一个强时序的技术,很多时候SVA的实际时序和验证工程师的期望可能不同,这种不同很难调试定位。下面是一个SVA断言的示例,验证工程
    发表于 08-25 15:57

    聊聊芯片IC验证的风险

    验证的没有验证到。这类问题表现在验证环境可能有bug,自己没发现,或是 第三条提到的验证架构的局限性,导致bug没有验证到。第六个,忽视了l
    发表于 10-21 14:25

    SVA上广电D2972-73系列彩电电路图

    SVA上广电D2972-73彩色电视机电路图,SVA上广电D2972-73彩电图纸,SVA上广电D2972-73原理图。
    发表于 05-23 10:55 175次下载
    <b class='flag-5'>SVA</b>上广电D2972-73系列彩电电路图

    SVA系列(通用)彩电电路图(1)

    SVA系列彩色电视机电路图,SVA系列彩电图纸,SVA系列原理图。
    发表于 05-25 09:25 184次下载
    <b class='flag-5'>SVA</b>系列(通用)彩电电路图(1)

    SVA系列(通用)彩电电路图(2)

    SVA系列彩色电视机电路图,SVA系列彩电图纸,SVA系列原理图。 
    发表于 05-25 09:28 90次下载
    <b class='flag-5'>SVA</b>系列(通用)彩电电路图(2)

    深层解析形式验证

      形式验证(Formal Verification)是一种IC设计的验证方法,它的主要思想是通过使用形式证明的方式来验证一个设计的功能是否
    发表于 08-06 10:05 3775次阅读
    深层解析<b class='flag-5'>形式</b><b class='flag-5'>验证</b>

    形式验证成为SoC模块验证的主流

      以对以仿真为中心的工程师有意义的方式调试形式验证代码,在很大程度上已被许多形式验证供应商解决。大多数工具可以在断言失败的情况下输出“见证”。也就是说,导致断言失败的仿真波形
    的头像 发表于 06-13 10:25 987次阅读
    <b class='flag-5'>形式</b><b class='flag-5'>验证</b>成为SoC模块<b class='flag-5'>验证</b>的主流

    形式验证简介

    形式验证是一种自动检查方法,可以捕捉许多常见的设计错误,并可以发现设计中的歧义。
    的头像 发表于 07-28 14:04 2093次阅读

    形式验证入门之基本概念和流程

    VLSI设计的功能验证有两种方法,动态仿真验证形式验证形式验证采用数学方法来比较原设计和修改
    的头像 发表于 12-27 15:18 1269次阅读

    使用SVA的几个好处

    SVA支持多时钟域(clock domain crossing (CDC))逻辑,例如异步FIFO。 2. SVA是一种描述语言,可读性比较强。
    的头像 发表于 03-21 14:49 532次阅读

    基于形式验证的高效RISC-V处理器验证方法

    随着RISC-V处理器的快速发展,如何保证其正确性成为了一个重要的问题。传统的测试方法只能覆盖一部分错误情况,而且无法完全保证处理器的正确性。因此,基于形式验证的方法成为了一个非常有前途的方法,可以更加全面地验证处理器的正确性。
    的头像 发表于 06-02 10:35 1026次阅读

    Formal Verify形式验证的流程概述

    Formal Verify,即形式验证,主要思想是通过使用数学证明的方式来验证一个修改后的设计和它原始的设计,在功能上是否等价。
    的头像 发表于 09-15 10:45 511次阅读
    Formal Verify<b class='flag-5'>形式</b><b class='flag-5'>验证</b>的流程概述

    形式验证及其在芯片工程中的应用

    形式验证不仅仅是芯片领域中的一个概念。正如文章开头提到过,形式验证强调使用严格的数学推理和形式化技术,以确保系统的行为是否符合预期的性质和规
    的头像 发表于 10-20 10:46 477次阅读