前言
断言主要用于验证设计的行为。断言也可用于提供功能覆盖率,并标记用于验证的输入激励不符合假定的需求。
在验证平台中,通常进行三个主要任务:
- 产生激励
- 功能检查
- 功能覆盖率度量
在当今的设计越来越复杂情况下,像波形调试这样的方式很容易出现人为错误,因此验证平台应该有一种自动和动态地检查预期结果的方式,这将使调试过程更容易,也使回归测试更有效。功能检查通常针对两个特定领域:
- 协议检查:检查目标是控制信号,控制信号的有效性是任何设计验证的核心;
- 数据检查:检查目标是所处理数据的完整性,比如网络传输的数据包是否有损坏;
SystemVerilog中引入的SVA在协议检查和协议覆盖率方面可以发挥重要的作用,它们更接近设计信号,通过将这些断言直接连接到设计,一方面便于管理,另一方面仿真性能可以得到极大的提高。SVA语言本身非常简洁,且提供了很好的时序控制能力。
那么什么是断言(SVA, SystemVerilog Assertion)呢?我们可以找到对它的经典解释。断言是对设计属性的描述:
- 如果在仿真中检查的属性没有按照我们期望的方式运行,则断言失败;
- 如果在仿真中出现了在设计中禁止发生的行为属性,则断言失败;
其实简单来说,就是该发生的一定要发生,不应该发生的就决不能发生,否则断言就失败了,进而产生报错信息。
设计属性通常可以从设计的功能规范中提取,并转换为断言。这些断言一方面可以用于功能仿真期间持续监控设计行为,另一方面也可以通过使用Formal技术来验证设计。
SVA调度
SystemVerilog语言是基于事件(events)的执行模型。在每个time slot内,把所有发生的事件按顺序排序处理。关于SV events的调度,可以看下我之前写的一篇文章《详解SystemVerilog中time slot的调度》。通过遵循SV的调度算法,仿真器可以避免设计和验证平台交互过程的错乱,而且也让开发人员有迹可循,写出稳定的代码。断言的采样、评估和执行涉及time slot里的三个regions(区域)。
- Preponed:该区域对断言变量进行采样。在这个区域内,net和variable不会改变其状态,这就允许在time slot的开始处采样到最稳定的值。
- Observed:所有属性表达式(property expressions)都在该区域中求值。
- Reactive:评估属性(property)的成功或失败在这个区域进行。