傻白入门芯片设计,SystemVerilog Assertion(SVA)学习(二十一)

目录

一、什么是断言?

二、断言分类?

(一)从断言的功能上来说,广义的断言分为四类,分别满足不同的验证需要。

(二)从断言的触发方式上来分,断言又可以分成两大类:即时断言和并发断言。

三、如何在 RTL 设计中嵌入 SVA 断言

四、assert和cover的查看、删除和恢复

(一)show_prop查看

(二)rm_prop删除

(三)add_prop恢复

 五、约束及其种类

(一)常量

(二)SVA约束

(三)时钟域约束

六、检查COI

 (一)分析信号的COI

(二)分析某一条断言的 COI

(三)分析所有 assert 断言的 COI 集合,并且报告出在 COI 之外的电路:


一、什么是断言?

断言语法,是一类主要用于描述设计电路行为的语言。无论在动态仿真还是形式化验证中,断言都可以用来描述需要验证的电路行为规范。除此之外,断言还可以用来描述功能覆盖点和约束输入激励。在形式化验证中,几乎所有的验证目标和输入约束都是用断言来实现的,而SystemVerilog Assertion 是一种基于 SystemVerilog 的断言语法。
一条SVA并发断言可以看成是由四种不同层次的结构组成:
  1. 布尔表达式(booleans):构成SVA的最基本单元。其一般形式为标准的SystemVerilog的布尔表达式,它由信号及其逻辑关系运算符构成,用以表示某个逻辑事件的发生。
  2. 序列(sequence):布尔表达式在时间上的组合。
  3. 属性(property)是在仿真或者形式验证中被验证的单元。属性将序列通过逻辑或者有序地组合起来生成更复杂的序列,SVA提供关键词“property”来表达这些复杂的有序行为。
  4. 断言声明(assertion statements)属性要在断言声明中被调用才能发挥作用,否则它们会被编译器忽略掉。

二、断言分类?

(一)从断言的功能上来说,广义的断言分为四类,分别满足不同的验证需要。

  • assert :通常直接被称为断言,也是狭义范畴所指的断言。Assert 是断言中最常见的用法用于描述电路的逻辑行为和属性这类断言无论在形式化验证还是动态仿真中,都作为一个待验证的目标,并且期望这个断言在整个验证过程中和所有的验证场景中,永远为真。否则,验证工具会给出验证错误的结果。
  • cover:覆盖断言。在形式化验证和动态仿真中,都用来检验验证工作的完备性。与 assert 类似,cover 也是一类验证目标。但是和 assert 不同的是,cover 不要求在所有的验证场景中永远为真,只要在某些验证场景中 cover 可以出现真的情况(哪怕只出现了一次),这个 cover 的验证结果即是通过,否则验证出错。
  • assume:约束断言。在形式化验证中,assume 断言所描述的电路行为在整个验证过程中,也必须永远为真。但是和 assert 不同的是,assume 所描述的电路行为由工具来保证其永远为真,即是说形式化验证工具不会去验证导致 assume 为假的验证场景。通常 assume 是用来规范电路的输入激励的
  • restrict:restrict 断言在形式化验证中的作用和 assume 完全一致,通常不会使用。

(二)从断言的触发方式上来分,断言又可以分成两大类:即时断言和并发断言。

  • 即时断言即时断言一般出现在 always 顺序执行块中,于其他的 RTL 语句混在一起,只有当该顺序语句所在的分支被执行的时候才会被触发,其触发条件和顺序语句的触发条件完全一致。即时断言在形式化验证中并不常用
  • 并发断言并发断言是形式化验证中常用的一类的断言。并发断言可以出现在 always 顺序块中或者在always 块之外单独出现。并发断言的触发条件一定是某一个时钟的跳变沿。因此,在并发断言中通常会用@(clock event)来定义断言的触发条件,而即时断言不能在断言中定义触发条件。
  • 举个例子: 

ast_con : assert property(@(posedge clk) !a ##1 a |-> ##2 b==2‘b0);

除了出现的位置不同,是否需要定义触发时钟沿,并发断言和即时断言在语法上最重要的区别是并发断言需要有关键词”property”,而即时断言没有。因为即时断言的内容只能是一个简单的布尔表达式,而并发断言的内容通常由以下四部分组成:

  • 布尔表达式(boolean)。表示信号的组合逻辑关系。比如上面例子中的!a、a、b==2’b0都是布尔表达式。
  • 序列(sequence)。表达信号间的时序关系,比如上面例子中的!a ##1 a 以及##2 b==2‘b0。
  • 属性(property)。表示序列间的相互关系,比如上面例子中的@(psoedge clk) !a ##1 a |-> ##2 b==2’b0。
  • 断言(assert)。最后需要将属性声明成 assert、cover、assume、restrict 中的某一种。

三、如何在 RTL 设计中嵌入 SVA 断言

  • 有两种方式将 SVA 断言和 RTL 结合到一起。
  • 方法一:直接在 RTL 模块里写入 SVA 断言。
  • 方法二:单独写一个 SVA 检查模块,将所需要用到的 RTL 信号全部当作检查模块的 input

举个例子:

generate
genvar ii;
for(ii=0 ; ii<NUM_PORTS; ii=ii+1) 
begin
    asm_request_stable : assume property(
        @(posedge clk) disable iff(rst)
            request[ii] && !grant[ii] |-> ##1 request[ii]);
    asm_request_cancel : assume property(
        @(posedge clk) disable iff(rst)
            request[ii] && grant[ii] |-> ##1 !request[ii]);
end
endgenerate
module arbiter(…) …
arbiter_checker my_checker(.clk(clk), rst(rst), request(request) … ); …
Endmodule

四、assert和cover的查看、删除和恢复

(一)show_prop查看

assert 和 cover 都是形式化验证的目标,需要在形式化验证中检验其正确性, show_prop 命令查看 cover 和 assert。可选参数:
  • -only_cover
  • -only_assert
  • -summary(会显示所有的assertion+最后的汇总消息)
  • -only_summary(只显示最后的汇总消息)

(二)rm_prop删除

删除 assert 和 cover 操作并不会真的从验证环境中删除这些验证目标,而是将其设置为无效状态,在验证中不再验证这些验证目标。用户可以随时恢复这些验证目标。默认删除assert,要对cover操作,需加上-cover,不能同时操作assert和cover,可以使用通配符。可选参数:

  • -cover

(三)add_prop恢复

默认我们会将某条删除的断言恢复成 assert(不管它删除前是 assert 还是 cover)。如果加上 -cover 选项,则会将删除的断言恢复成 cover。如果用户需要在恢复的时候恢复成和删除前一样的断言类型,则使用 -restore 选项。可选参数:
  • -cover
  • -restore

 五、约束及其种类

在形式化验证中约束用来保证某些场景在整个验证过程中一定成立,以此来排除一些可能造成假错的非法场景。

(一)常量

AveMC 支持将顶层输入或者无驱动信号约束成常量。添加(删除)约束使用的命令及格式为:
add_cons <信号名> -pinvalue <常量值>
rm_cons -pin <信号名> -postreset
可选参数:
  • -postreset ,表示该常量只在复位后的形式化验证阶段有效,不影响复位阶段寄存器初始值的生成。
  • -reset ,表示该常量只在复位阶段有效,只影响寄存器初始值的生成,不影响形式化证明。
如果这两个选项都不加,则在两个阶段都有效。

(二)SVA约束

SVA 约束即是在 SVA 章节中提到的 assume 断言。也是形式化验证中最常用的约束形式。这种约束方式最灵活多变,几乎可以满足所有的验证需求。SVA assume 断言约束会随着验证文件一起读入,被 AveMC 识别。同样地,使用add_cons和rm_cons进行添加何删除约束

(三)时钟域约束

当设计存在多个时钟时,AveMC 可以根据电路逻辑,进行综合分析,识别内部寄存器所在的时钟域。但是对于顶层的输入信号,如果不指定其时钟域,默认所有信号会跟随最快的系统时钟进行跳变,有时候会发生误报。这时候需要用户对于输入信号和无驱动进行时钟域的说明。定义时钟域的命令为 strobe,可选参数

  • -all 表示将为所有的非时钟和非复位信号定义时钟域
  • -clock 是所属时钟域的时钟名称
  • -edge posedge/negedge 表示信号在时钟域上沿跳变还是下沿跳变。

用户可以进行多次 strobe 约束操作,但是同一个信号只能被约束一次,否则 AveMC 会报出错误信息并忽略第二次操作,注意 strobe 命令只能对顶层输入和无驱动信号进行约束移除strobe 约束,可以使用 unstrobe 命令。

(四)SVA断言在不同声明类型中的转换

SVA 断言主要有三种类型:assert、cover、assume。这三类断言可以在验证过程中相互转
换,转换思路主要分成两步:
  1. rm_prop/rm_prop -cover/rm_cons 命令将需要改变类型的 SVA 断言移除
  2. add_prop/add_prop -cover/add_cons 命令将移除的 SVA 断言添加成需要改变的类

六、检查COI

COI(Core of Influence),是指 驱动某些信号或者某些 assert 断言的逻辑锥 。在形式化验证中,查看信号的逻辑锥可以帮助用户理解电路设计。而对于断言生成的 COI,对于形式化验证尤其重要,可以帮助验证者判断 assert 断言的质量,理论上,所有 assert 断言的 COI 集合应该可以覆盖所有的电路逻辑,否则 COI 之外的电路逻辑如果存在 bug,就一定能被当前的任何一条 assert 所发因此,断言 COI 也是形式化验证交付的一个重要指标。 无论是对信号生成 COI 还是对 assert 断言生成 COI,在 AveMC 中都使用同一条命令 fanin
  • -assertion : 表示对指定断言分析其 COI。
  • -cover : 表示分析所有断言的 COI 行程 COI 集合,最后列出不在这个 COI 集合内的所有信
  • -cover+: 分析过程同-cover,但是最后会列出所有的信号,无论其在不在 COI 集合内。
  • -depth N : 表示只分析目标往前推 N 级时序寄存器,默认为无限,即一直追踪到顶层输入止。
  • -dump : 把 COI 分析结果存到结果目录的 fanin.rep 文件中,多次执行 fanin -dump 命令会覆盖之前的文件。
  • -dump+ : 和-dump 类似,但是会将分析结果添加而不是覆盖之前的文件。
  • -list : 显示 COI 分析结果的信号列表。
  • -net : 表示分析指定信号的 COI。
  • -type : 用来指定分析的 COI 报告中需要列出的信号类型。

 (一)分析信号的COI

fanin -net <信号名> -list

(二)分析某一条断言的 COI

分析单个断言的 COI,有助于帮助验证者了解这条断言的复杂程度,以此来评估这条断言能否被完整证明。如果这条断言不能被完全证明,也可以从 COI 信息中发现验证难点。
fanin -assertion <断言名> -list

(三)分析所有 assert 断言的 COI 集合,并且报告出在 COI 之外的电路:

所有 assert 断言的 COI 集合是形式化验证最终交付的重要指标之一,通常项目管理者会要求 COI 的覆盖率能够到达百分之一百,这样才能保证存在于设计中的任何 bug 都有机会被当前的 assert 断言抓到。 使用的命令一般为:
fanin -cover -list
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemVerilog assertion 是一种用于验证设计的属性的语言和方法。它在设计的不同阶段都有广泛的应用,从功能验证形式验证。下面是一些关于 SystemVerilog assertion 应用的指南: 1. 语法和语义:了解 SystemVerilog assertion 的基本语法和语义是必要的。它的语法类似于其他硬件描述语言,但有一些独特的特性和用法。熟悉这些特性并理解其语义是使用 SystemVerilog assertion 的基础。 2. 功能验证:SystemVerilog assertion 可以用于功能验证,通过检查设计是否满足特定的属性来验证其行为。在功能验证中,可以使用属性描述设计的预期行为,并编写验证代码来检查这些属性是否得到满足。这有助于发现设计中的问题并提前修复它们。 3. 形式验证:SystemVerilog assertion 还可以用于形式验证,用于证明设计在给定约束下是否满足某些属性。形式验证通常使用形式化验证工具,它可以自动地分析设计,并生成验证结果。使用形式验证可以提供更高的覆盖率和更全面的验证结果。 4. 属性编写:编写良好的属性是成功使用 SystemVerilog assertion 的关键。属性应该具备明确的描述设计行为和目标的特点。良好的属性应该容易验证,避免模糊和歧义的描述,并覆盖设计中的所有关键方面。 5. 覆盖率评估:评估 SystemVerilog assertion 的覆盖率是非常重要的。覆盖率评估可以确定设计中是否存在未覆盖的行为或属性。如果存在未覆盖的属性,可能需要进一步修改验证代码来增加覆盖率。 总之,了解 SystemVerilog assertion 的语法和语义,熟悉属性编写的技巧,以及进行有效的功能验证形式验证是使用它的关键。通过正确地应用 SystemVerilog assertion,可以提高设计的可靠性和验证的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值