SystemVerilog验证-验证导论-1
与硬件描述语言(HDL)相比,硬件验证语言(HVL)有一些典型的性质:
- 受约束的随机激励产生
- 功能覆盖率
- 更高层次的结构,尤其是面向对象的编程
- 多线程及线程间的通信
- 支持HDL数据类型,例如Verilog的四状态数值
- 集成了事件仿真器,便于对设计施加控制
硬件设计的目的在于创建一个基于设计规范并能完成特定任务的设备,作为一名验证工程师,目的是确保该设备能成功的完成预定的任务,确保该设计是对规范的一种准确表达。
验证的流程与设计流程并行。
对于每个设计模块,设计者需要首先阅读硬件规范,解析其中的自然语言表述,然后使用RTL代码之类的语言创建相应的逻辑,设计者需要知道输入格式、传输函数以及输出格式。
解析过程中总是会有模糊的地方,因为规范文档本身表述可能不清楚,遗漏了细节或者前后不一致。作为验证工程师,必须阅读硬件规范并拟定验证计划,创建测试来检查RTL代码是否准确实现了所有特性。要确认设计者和验证者对同一规范的解读是否一致。
设计中可能存在漏洞的地方:
- 代码块(block)层次,代码块由每个设计者在模块(module)内创建,这些漏洞都被包含在设计的代码块里
- ALU是否正确执行了两个数的运算
- 是否每个总线事务都得以成功完成
- 是否所有数据包都经过了网络交换机
- 代码块的边界,多个设计者在对同一规范产生不同解读
- ALU是否正确执行了两个数的运算
- 是否每个总线事务都得以成功完成
- 是否所有数据包都经过了网络交换机
为了仿真一个代码块,需要创建测试集来模拟周围代码块产生激励,低层次的仿真运行起来会很快。
但当提供激励的代码块很长时,可能会同时在设计和测试平台中同时找到漏洞。
当开始集成所有代码块时,它们会相互激励,此时多个代码块同时仿真可能会发现更多的漏洞,但是运行起来也会慢一些。
在待测设计的最高层次上,整个系统都被测试,但是仿真过程会简单很多,测试应该尽可能让所有的代码块并发活动,所有的输入输出端口都被激活,处理器正在处理数据,而高速缓存也正在载入数据,有了这些行为后,数据分配和时序上的漏洞肯定会出现。
测试平台的用途在于确定待测设计的正确性,包含下列步骤:
- 产生激励
- 把激励施加到DUT上
- 捕捉响应
- 检验正确性
- 对照整个验证目标测算进展情况
当需要验证一个设计的正确性时,传统的做法是使用定向测试:
- 阅读硬件规范,写下验证计划,计划上列有各种测试,每个测试针对一系列相关的特性
- 按照计划编写出针对待测设计具体特性的激励向量,然后使用这些向量对待测设计进行仿真
- 仿真结束后,手工查看结果文件和波形,确保设计的行为与预期的一致
- 一旦测试结果正确,就可以在验证计划中把它勾掉,然后开始下一个测试
这种渐进的方法比较容易取得稳步的进展,因而很受那些喜欢看到项目持续向前推进管理者的欢迎。由于创建每个激励向量时并不需要什么基础设施,所以定向测试的结果也会很快得到。只要给予足够的时间和人力,定向测试对于大部分设计验证来讲都是可以胜任的。
方法学的一般原则:
- 受约束的随机激励
- 功能覆盖率
- 使用事务处理器的分层测试平台
- 对所有测试通用的测试平台
- 独立于测试平台之外的个性化测试代码
随机激励对于测试复杂设计十分关键,定向测试可以找出设计中预期的漏洞,而随机测试能找出预料不到的漏洞。当使用随机激励时需要用功能覆盖率来评估验证的进展情况。一旦开始使用自动生成的激励,就需要一种能够自动预测结果的方式——通常是计分板或者参考模型。建立包括自预测在内的测试平台基础设施,是一件工作量很大的事。一个分层的测试平台能够把问题分解为容易处理的小块,这样有助于控制复杂度。事务处理器能够为构建这些小块提供有用的模式。在适当的规划下,可以建立一个测试平台所需的基础设施,它们能在所有测试中通用并且不需要经常性的修改。只需要在某些地方放置钩子,以便测试能够在这些地方执行调整激励或注入错误这样的特定操作。相反,针对单一测试的个性化代码必须与测试平台分开,这样可以避免增加基础设施的复杂度。建立这种风格的测试平台所需的时间比传统的定向测试平台多得多,尤其是自检的部分,可能需要很长的准备时间才能进行第一次可运行的测试,这会让项目管理者坐立不安。随机测试的前期准备工作很多,但是回报很高,每个随机测试都可以共享这个通用的测试平台,而不像每个定向测试都要从零开始编写,每个随机测试都会包含一部分代码,用于把激励约束到特定的方向上并触发任何期望的异常。受约束的随机测试平台找起漏洞来会比很多定向测试块很多。随着漏洞出险率的下降,应该创建新的随机约束去探索新的区域。最后的几个漏洞可能只能通过定向测试来发现,但是绝大部分的漏洞都应该会在随机测试中出现。
使用SV可以描述激励的格式,然后让仿真器产生满足约束的数值,这些数值会被发送到设计中去,同时也会被发送到一个负责预测仿真结果的高层模块中去,设计的实际输出最终需要和预测输出做对比。
一个随机测试的覆盖范围往往比一个定向测试大,多出的覆盖部分可能会与其他测试发生交叠,或者探测到事先没有预料到的新区域。对于区域的测试入股非法则需要重新编写更多的约束去阻止随机测试产生非法的功能。对于受约束的随机测试覆盖不到的地方,需要编写一些定向测试。