硬件验证专题(二)测试平台

测试平台(testbench)是在硬件验证中最基础也是最重要的部分。测试平台的质量将严重影响到整个硬件验证的质量。如何编写一个高效的测试平台是一个重大的课题。


测试平台

测试平台,英文原文是testbench,由test和bench两个英文词组成。bench英文原意为长凳,在这里只是形象地说明了testbench的结构。如图2-1所示,测试平台包围在被测元件(DUT,Device Under Testing,也有人写做DUV[1]。在公司里使用DUT习惯了,还是用这个词吧)周围,形状就像一个长凳。

在测试平台中,最重要的四个部分是数据生成单元(Data Generator)、数据传输单元(Data Transactor)、数据对比单元(Data Comparator)和参考模型(Reference Model)。如图2-2所示。

在测试过程中,由测试方案(testcase)控制数据生成单元生成输入数据,然后通过数据传输单元将激励送至DUT(也可以叫做设计模型)和参考模型。参考模型预测出相应的结果,连同DUT响应一并送入数据对比单元。数据对比单元对比预测结果和实际结果,如果结果一致则表明DUT响应正确;如果不一致则表示至少有一方面结果是错误的,此时测试平台会发出错误警报。

注意:在数据不一致的情况下,并不一定是DUT响应错误,也有可能是参考模型预测错误,这时需要根据功能设计(Functional Specification)来判断。同样的,如果DUT响应和参考模型预测一致,也不能保证他们是正确的,有可能设计工程师和验证工程师犯了同样的错误,从而导致结果一致。

由于设计模型和参考模型由不同人员开发的,所以出现相同错误(对于同样的输入给出同样的错误结果)的可能性很小,这样也保证了测试平台的正确性和高效。如果出现同样的错误,大部分也会在覆盖验证中被发现,这个以后再讲。

数据生成单元(Data Generator)

顾名思义,数据生成单元就是生成数据用的。一般来说,数据生成单元中会包含一些约束条件(constraints),用来生成符合规定的数据。

这里插一段,对于硬件验证,容错性并不重要。硬件的本质是对数据的处理,而不是对错误的检测和恢复。对于一个完善的硬件来说,最重要的是数据通路(datapath),因为数据通路直接关系到数据处理的正确性;但是对于错误的处理,很简单,遇到错误的数据记录下来并给一个中断(interrupt)就行了。也可以这么理解,如果容错做得多了,芯片必然会变得很庞大,成本也会增加。所以,在做硬件验证时,绝大多数时间都是在验证符合规定的激励,错误情况已经包含在对中断的验证中了。

再回到数据生成单元。虽然说只有数据生成单元也能生成我们想要的数据,但是当我们需要做针对性验证(Deterministic Verification)的时候,我们要把我们不太关心的一些情况给去掉。这个时候就需要在测试方案中加入更多的约束条件。前面提到过,Vera是面向对象的编程语言,这里要用到的就是“继承”。我们可以在测试方案中建立一个数据生成单元的子类,继承原数据生成单元的所有属性、方法和约束条件,同时加入自己的约束条件和对数据的处理。这样一来,新的数据生成单元就可以生成我们需要的数据了。

数据传输单元(Data Transactor)

数据传输单元用来将数据生成单元生成的数据传送到DUT和参考模型中(见图2-3)。一般我们提到的BFM(Bus Function Module,总线功能模块)就属于数据传输单元。有些时候,数据传输单元并不直接将数据送入参考模型,而是通过参考模型中的监视单元(monitor)进行数据采样。具体结构见图2-4。

参考模型(Reference Model)

前面已经说过,参考模型根据从数据传输单元传入的输入激励来预测相应的DUT响应,然后将预测结果传入数据对比单元。参考模型是测试平台中最重要的部分。自动验证需要完善的参考模型,所以参考模型的制作也是一项很浩大的工程,可以认为是把设计模型用HVL重写一遍。

参考模型中比较特殊的是寄存器驱动(Register Decoder)。这个在后面将详细说明。

数据对比单元(Data Comparator)

数据对比单元接收到来自DUT的相应和来自参考模型的预测(predict)之后,将两者相比较。如果一致,则说明DUT通过相应验证,但并不保证DUT相应正确;如果不一致,则报告错误。

这里将会出现一个时序的问题。首先要明确的是DUT是按照时钟周期(clockcycle)工作的,每一个时钟周期做一个工作;但是参考模型没有时钟的概念。或许对软件工程比较了解的人会说程序是按照时间片(time slice)来运行的,但是要明确,模拟器(simulator,或者称作仿真器)也是按照时间片来生成时钟周期的。所以,当参考模型完成预测之后,我们并不知道DUT响应是否已经到达。

这个时候,聪明的数据对比单元会将刚刚送入的DUT响应或者参考模型预测保存在相应的队列(queue)中,然后进行无序对比(compare without order)。保存DUT响应的是实际结果队列(actual queue),保存参考模型预测的是期望结果队列(expected queue)。DUT响应进入数据对比单元时会在期望结果队列中查找对应的值(matching),参考模型预测进入数据对比单元时会在实际结果队列中查找对应的值。如果找到对应的值,则将对应值从队列中删除(remove);如果找不到,则将自己保存到相应的队列中。

在验证结束的时候,测试平台会检查实际结果队列和期望结果队列。如果都为空,则说明全部的实际和预测数据都相吻合,验证没有问题。如果其中有一个队列不为空,则说明验证出现不相吻合的情况,这时候要根据相应的情况来进行调试(debug)。

 

这一部分先讲到这里,下一部分将会讲到测试方案(testcase)。


[1] 参见《编写测试平台(第二版)》

添加新评论