SVA断言介绍
数字电路的规模和复杂度的不断增长,使得功能验证成为一项巨大的挑战。验证的目标的彻底地验证被测设计(DUT),确保其中没有功能缺陷。
断言是设计的属性的描述,主要用于验证设计必须满足的属性。断言可以用来提供功能覆盖,并标记输入激励,用于验证不符合假设的要求。
- 如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。
- 如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。
断言又被成为RTL代码检验器。
并发断言(concurrent assertions)
- 基于时钟周期
- 在时钟边缘根据调用的变量的采样值计算测试表达式,
- 变量的采样在预备阶段完成,而表达式的计算在调度器的观察阶段完成。
- 可以被放到过程块(procedural block)、模块(module)、接口(interface),或者一个程序(program)的定义中
- 可以在静态(形式的)验证和动态验证(模拟)工具中使用
并发断言实例:
仿真结果:
仿真中所有的成功显示成向上的箭头,所有的失败显示成向下的箭头。这个例子中属性在每一个时钟的上升沿都被检验。
即时断言
即时断言(immediate assertions)
- 基于模拟事件的语义
- 测试表达式的求值就像在过程块中的其他verilog的表达式一样。他们本质不是时序相关的,而是立即被求值。
- 必须放在过程块的定义中
- 只能用于动态模拟
即时断言实例:
仿真结果:
可见,即时断言a_ia被写成一个过程块的一部分,它遵循和信号a、b相同的事件调度。当信号a或者信号b发生变化时,always块被执行。区别即时断言和并发断言的关键词是“property”。
SVA块的建立
建立SVA检验器由以下四个步骤组成:
- 建立布尔表达式
- 建立序列表达式
- 建立属性
- 断言属性
- 布尔表达式
布尔表达式是构成SVA的基本单元,由信号及其逻辑关系运算符构成,用以表示某个逻辑事件的发生。
序列sequence
是布尔表达式在时间上的组合,SVA用关键词“sequence”来表示这些事件。
序列的基本语法:
序列举例:
序列s1检查信号“a“在每个时钟上升沿都为高电平,因此如果”a”在任何一个时钟上升沿不为高电平,断言将失败。
仿真结果:
属性property
属性是在仿真或者形式验证中被验证的单元。
属性将序列通过逻辑或者有序地组合起来生成更复杂的序列。SVA用关键词“property”来表达这些复杂的有序行为。
属性的基本语法:
断言assert
属性是在模拟过程中被验证的单元。它必须在模拟过程中被断言来发挥作用。SVA提供了关键词“assert”来检查属性。
断言的基本语法:
内嵌函数 r o s e 、 rose、 rose、fell、$stable
$rose | 当信号/表达式的最低位变成1时返回真
$fell | 当信号/表达式的最低位变成0时返回真
$stable | 当信号/表达式不发生变化时返回真
$rose实例:
序列s2检查信号”a“在每个时钟上升沿都跳变为1。如果跳变没有发生,断言失败。
仿真结果:当信号从0跳变至1时,断言成功。
需要注意的是,在信号a跳变至X/Z态时,$rose断言失败;从X/Z态跳变至1时,断言成功。
时序关系的序列
简单的布尔表达式在每个时钟边缘都会被检查。很多时候,我们关心的是检查需要几个时钟周期才能完成的事件,也就是所谓的“时序检查”。在SVA中,时钟周期延迟用“##”来表示。例如,##2表示2个时钟周期。
实例:序列s4检查信号a在每个时钟上升沿是否为高电平,若是则检查两个时钟周期之后b是否为高电平,若是则断言成功。
仿真结果:
禁止属性
属性可以被禁止发生,即我们期望属性永远为假,当属性为真时,断言失败。SVA提供了关键词“not”用来表示属性应该永远不为真。
禁止属性实例:a6表示在某时钟上升沿a为高电平,且2个时钟周期后信号b为高电平时,则断言失败,否则断言成功。
仿真结果:
好了,今天就先到这了。欢迎留言讨论。