验证(创建测试检查RTL代码是否准确实现所有特性)
验证目的
1.穷尽所有可能的情况给设计产生激励
(如何划分有效的测试空间,如何给出随机约束激励)
2.在可能的激励情况下判断不符合硬件描述的行为并报告。
验证了待测设计能够执行所有预期功能以后,还要看一下出现错误时待测设计会怎样操作。错误注入和处理是验证中最具挑战性的部分。
SV与Verilog
Verilog:硬件描述语言
SV:硬件验证语言,相比而言,具有受约束的随机激励生成、功能覆盖率、更高层次的结构,尤其是面向对象编程、多线程及线程间的通信、支持HDL数据类型,如四状态数值、集成了事件仿真器,便于对设计施加控制
定向测试与随机测试
定向测试可以找出设计中预期的漏洞,随机测试覆盖范围往往比定向测试覆盖范围大,能够找出预料不到的漏洞。随机测试覆盖不到的地方,需要编写一些定向测试。当使用随机激励时,需要用功能覆盖率来评估验证的进展情况。(功能覆盖率使用步骤:在测试平台中加入代码,用于监控进入设备中的激励,以及设备对激励的反应,据此确定哪些功能已经被验证过,决定如何采用新的激励达到尚未被测试到的条件和逻辑)。与定向测试相比,随机测试主要工作是构建测试平台,使他包含所有较低的层:场景、功能、命令以及信号。
漏洞位置:代码块层次和代码块边界;不同设计者对硬件逻辑存在争议的地方;
低层次仿真运行很快,高层次多个代码块并发活动。但会出现数据分配和时序等漏洞。
随机化对象
数据路径漏洞:随机激励
控制逻辑漏洞:
- 设备配置(仿真时长、设备数量、配置方式等)
- 环境配置(测试长度、错误注入比率、时延模式)
- 输入数据(对于随机激励,选取一个总线写入的事务或ATM信元,把随机数值填充到其中的数据字段)
- 协议异常、错误和违例
- 时延和同步(使用受约束的随机时延有助于捕捉协议上的漏洞。时延最短的测试运行速度最快,但产生不了所有的可能激励)
- 并行的随机测试 (目录名后加上随机种子的值产生独特的种子
创建受约束的随机测试步骤:
- 建立分层的测评平台,包括自检部分
- 按照验证计划中列举的目标创建激励(如随机约束、注入错误或协议违例)
- 功能覆盖率
测试平台
测试平台基本功能:
- 产生激励
- 把激励施加到DUT上
- 捕捉响应
- 检查正确性
- 对照整个验证目标测算进展情况
可在测试平台某些地方放置“钩子”,以便测试能够在这些地方执行调整激励或注入错误这样的特定操作;单一测试的个性化代码必须与测试平台分开以避免增加基础设施复杂度
方法学基础原则:
- 受约束的随机激励
- 功能覆盖率
- 使用事务处理器的分层测试平台
- 对所有测试通用的测试平台
- 独立于测试平台外的个性化测试代码
测试平台需要工作在一个很宽的抽象层次范围内,同时创建事务和激励序列并最终转换成比特向量。而测试仪器只工作在比特级。
信号层:包含待测设计和把待测设计连接到测试平台的信号
命令层:执行总线读或写命令的驱动器驱动了待测设计的输入。断言负责监视独立的信号以寻找穿越整个命令的信号变化。(驱动器可能会注入错误或增加时延,然后再把命令分解成一些信号的变化,如总线请求或握手,也是一种事务处理器)
功能层:代理在VMM中称为事务处理器,接收来自上层的事务,如DMA读或写,把它们分解为独立的(总线)命令。
场景层:功能层被位于场景层中的发生器驱动。场景层负责组织协调多个步骤。
对于简单的设计,场景层可能过于简单以至于可以把它合并到代理中。测试平台的层次视待测设计而定。各模块之间的连接方式不固定,比如测试层可以连接到驱动器层以迫使物理漏洞出现。
仿真环境阶段:建立(build)、运行(run)、收尾(wrap-up)
建立阶段:生成配置(配置、环境随机化)、建立环境(分配连接测试平台构件)、对待测设计复位、配置待测设计
运行阶段:启动环境、运行测试
收尾阶段:清空(清空事务)、报告
验证周期
模块级(module level)
子系统级(subsystem level)
系统级(chip level)
<按时、保质、低耗>
功能描述文档构成<接口信息、结构信息、交互信息>