目的
硬件设计的目的:创建一个基于设计规范并能完成特定任务的设备
验证硬件设计的目的:确保该设备能够成功地完成预定的任务
特点
同硬件描述语言(HDL)相比,sv硬件验证语言(hardware Verification Language,HVL)具有以下的特点:
- 受约束的随机激励生成;
- 功能覆盖率;
- 更高层次的结构,尤其是面向对象的编程;
- 多线程及线程间的通信;
- 支持HDL数据类型,例如Verilog的四状态数值;
- 集成了事件仿真器,便于对设计施加控制;
同样还有其他很多有用的特性,但上述特性允许创建高度抽象的测试平台,其抽象层次比使用HDL或计算机编程语言所能达到的高度更高;
基本测试平台的功能
测试平台的用途在于确定待测设计的正确性,包括步骤如下:
1、产生激励;
2、把激励施加到DUT上;
3、捕捉响应;
4、检验正确性;
5、对照整个验证目标测算进展情况;
以上的有些步骤是测试平台自动完成的,有些则需要手动操作。而所选择的方法学则决定了上述步骤如何展开;
如何测试
对rtl代码测试时,若出现察觉不到的漏洞原因往往是因为没有尝试足够多的配置。即很多测试只是使用仅仅经过复位的设计或施加固定的初始化向量集把设计引向一个已知的状态;
为什么需要验证平台?为了测试一个设备对于每个通道的配置,往往都需要写出几十行的定向测试代码,而这种方式对人力而言是无力应对的。所以需要编写测试平台,对每个通道的参数都采用随机化的策略;
而对待测设计进行验证时,实际上就是把测试平台连接起来模仿这个环境,因此应该对整个环境的配置进行随机化,包括仿真的时长、设备的数量和其配置方式;
当产品内部逻辑遇到错误无法恢复时,如何阻止?应该尽量尝试仿真在实际的硬件中更可能出现的错误,而且应该针对所有可能出现的错误(若总线事务没有完成、遇到非法操作等)对这些情况一一尝试,然后确保设备还能继续正常运作;
如何运行测试?每个定向测试都带有一个测试平台,能产生一组特定的激励和响应向量。而随机测试的方式则包含了测试平台代码和随机种子,当运行了m次,每次都采用不同的种子,则会得到m种不同的激励集合。增大m可以增大覆盖率的同时减少工作量;
测试平台的构件
如下图所示,仿佛一个物理芯片连接在测试器上。其中测试平台和测试仪器都会产生激励并捕捉响应,但测试平台需要工作在一个很宽的抽象层次范围内,同时创建事务和激励序列并最终转换成比特向量;而测试仪器则只工作在比特级上;
分层的测试平台
信号层:在底层的信号层包含有待测设计和把待测设计连接到测试平台的信号;
命令层:执行总线读或写的驱动器驱动了待测设计的输入。待测设计的输出与监视器相连,监视器负责检测信号的变化,并把这些变化按照命令分组。断言负责监视独立信号以寻找穿越整个命令的信号变化;
功能层:功能层向下面对命令层,接收到来自上层的事务,将其分解成独立的命令。而这些命令也被送往计分板,检验器则负责比较来自监视器和计分板的命令
场景层:场景层负责组织协调前期准备时的工作(控制寄存器的读写)以及之后的写操作;
测试层:测试包含了用于创建激励的约束;
仿真环境的阶段
环境构建之后的执行部分分为三个基本的阶段:建立、运行和收尾;
建立:
- 生成配置:把待测设计的配置和周围环境随机化;
- 建立环境:基于配置来分配和连接测试平台构件;
- 对待测设计进行复位;
- 配置待测设计:基于第一步种生成的配置,载入待测设计的命令寄存器;
运行:
- 启动环境:运行测试平台构件;
- 运行测试:启动测试后等待测试完成;
收尾:
- 清空:在下层完成以后,需要等待待测设计清空最后的事务;
- 报告:一旦待测设计空闲,根据之前的信息创建最终报告;
代码重用
为了验证一个带有数百个特性的复杂设备,必须编写数百个定向测试;如果使用受约束的随机激励,则需要编写的测试就会少很多;与定向测试相比,随机测试的主要工作是构建测试平台,使他能够包含所有较低的层:场景、功能、命令以及信号。这个测试平台代码要能够被所有的测试使用,所以他需要有很好的通用性
这篇笔记参考《system verilog验证》绿皮书整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。