路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

一种基于UVM验证图像IP的通用方法

已有 3258 次阅读| 2016-7-26 16:44 |个人分类:验证前沿资讯

引言      

有关图像处理协议IP的市场在最近几年增长十分迅速。这主要归功于图像显示仪器爆发式的增长。比如能够产生影音图像的设备电脑操作系统、手机操作系统,图像显示设备电视、投影仪以及各种显示仪器。与此同时,消费者对于图像显示技术也越来越了解,这也就触发人们对更多更好产品的需求。


由于市场对于这种复杂显示设备需求的快速增长,直接导致了对于这些设备验证工作量相应的增加。由于现在电子产品的更迭速度非常快,通常生命周期不超过一年的的情况下,验证工程师必须在非常短的时间内完成相关功能的验证,所以这次呢,我将向大家提供一种十分高效的方法,这种方法优于现在工业中使用的验证方法。它能够让工程师们通过设计结构化可复用的VIP, 从而使debug变得轻松


技术综述

通常,图像显示IP的作用就是用来传输图片以及大量不同种类的视频。不同的组织会定义不同的显示协议比如HDMI, 嵌入式显示接口,V-by-One等等。除此之外,不同的HDCP 版本还有各种各样的内容保护机制。


任何图像协议的目的都是发送图像(视频的本质就是高速传输的图片),所以所有的协议从本质上来说都是类似的。


从下我们可以看到,通常在传送图片时,其中的像素数据包含active video(帧图片有效像素,通常都是由bytes组成的数据)。除此之外还有一段blanking周期(包含帧格式帧大小等信息,同样也是由大小由bytes组成的数据)。不同的定义支持不同的像素格式,例如RGB 或者YCbCr等。

 

 

验证的挑战

为了了解验证的难点并且给出最好的解决办法,我们必须解释两个问题先:

  1. 为什么验证这种图像协议这么困难

  2. 我们是否可以用一种通用的方法来验证这些不同的工业标准


图像显示协议功能验证的主要挑战来自下面几个方面:

  1. 一开始,验证人员只想做一个简单的通路测试,但是由于协议本身的复杂度,必须消耗大量的时间去搭建一个验证环境

  2. 由于每一帧图片尺寸都比较大,所以有大量的数据需要处理

  3. 不同的协议定义会引入大量不同类型的控制数据(用于同步一帧图像中不同的行列像素),为了验证这些控制数据,我们需要支持验证不同的数据组合

  4. 显示协议里会有大量不同的编码/解码以及像加密这样的技术。因此我们在数据接口看到的往往不是真实数据,而是这种的编解码以及加密数据,这无疑增加了debug难度

        

考虑到在显示技术快速发展中所要面对的这些问题,一个好的验证方法就显得颇为重要。这个验证方法必须支持不同协议验证的可复用性,可以很好的支持基本功能与通路测试,并且可以使用单独的API来验证某个单独的特性。这些API 通过简单的改变与组合可以验证不同的显示协议。

如果我们要验证的DUT是一个图像产生模块,这个模块需要正确的发送它所支持的图片格式,并且符合协议的时序参数。及时的对存储器里的数据进行正确的读写访问。同时,所有支持的数据格式都必须被验证到,并且带有结果比对功能。

如果我们要验证的DUT图像接收模块,它必须能够正确的接收所支持格式的数据,并且对不支持的格式做出响应。同时要保证存储器的容量不被写满或者读空。


搭建验证环境

对于验证一个模块的第一步是需要搭建一个验证环境QVIP(Questa® Verification IP)提供了一些通用的组件与API 来帮助我们搭建环境。同时提供了连接模块用于产生信号激励,大大的降低了验证难度与出错的可能性。使用者可以选择QVIP作为图像产生模块,工程师仅仅需要通过端口列表来产生激励信号QVIP将会完成它跟DUT之间的自动连接。QVIPDUT的连接如图所示:


下一步是建立一个UVM的环境QVIP对于每一种协议都提供协议声明代理,我们可以通过简单的配置来实现这个功能。下图就是协议代理的工作流程。

激励的产生

当我们需要验证一个接收模块时,在验证过程中很重要的一环就是如何产生完美的激励来覆盖所有可能的功能场景。所以产生激励的过程必须足够简单使得工程师可以将更多精力集中在我们需要覆盖那些场景,而不是如何去覆盖这些场景。

 

在验证第一步,通常我们只想验证一下数据通路,并不需要知道协议的细节知识或者像素数据的具体数值。只做一些基本的时序与数据大小检查。验证工程师并不想花大量的时间去编写这种激励。我们需要的仅仅是一个简单的API,它可以发送长度不为0,数据随机的像素。QVIP为此提供了了一个叫做send_frameAPI

使用方法分两步,具体如下图所示:

  1.  <protocol>_source_seq上创建一个新类

  2. body task里面声明API send_frame()


代理序列发生器使用这个函数可以发出一帧图片,这个图片的有效像素为随机数据。这个API 完美的解决了手动生成复杂激励的问题。这个时候,使用者可能想要用一些视频数据检查一下时序。这就需要一个简单的步骤来生成各种视频格式的数据,并将这些数据以特定的频率放在空白周期。此时可以使用API set_audio功能。可以通过改变它的参数设置,然后计算生成不同格式的数据包。或者,使用者想自己调试各种变量。这个时候他们可以通过改变API 中参数的设置来实现。因此,可以通过set_audio API, 可以验证不同类型的视频数据


下一步,验证工程师需要通过发送特定数值的数据来验证像素数据

  1. 我们可以通过set_video API 来生成直接可用的像素数据

  2. 可以考虑特定帧中的png图片来替代直接产生的像素数据。或者,可以通过图片转换序列将图片格式转化为像素格式。我们可以通过protocol_source_seq 来完成这个转化过程生成一个像素文件。通过读取这个文件来而得到一张图片的像素信息。


我们可以使用具有发送图片功能的API 来生成一帧数据并发送该数据send_frame. API可以发送整帧中的所有像素信息。然后BFM通过必要的计算将像素数据按照bytes的大小发送到相应的DUT接口。DUT通过提取像素信息,然后将他们转化成一张完整的图片。这个时候可以比对DUT生成的图片与API 发送的图片数据是否一致


此外,我们还可以通过使用API来设置不同的帧参数,改变发送图片的色深与像素格式。

 

使用QVIP作为接收端/发送端

上面讨论的产生的激励主要是DUT作为接收端。在另外一种情况下,DUT是作为发送端,此时产生激励的难度很相应容易很多。API 提供的sink sequence作为接收端可以轻松的接收图片中的帧数据,然后再生成一副完成的图片数据然后就可以用这个图片数据同DUT发送的图片数据进行比对这种scoreboard方法使得数据的验证变得简单,从而确保DUT功能的正确性。


在某些图像格式定义里,会定义一个二级通道,来完成显示容量的读写(DDC/EDDC, CEC)并且请求HDCP操作,从而使得接收端或者发送端可以对HDCP操作进行相应。这个功能可以通过配置QVIP来实现。从而使得定义里的不同请求可以得到响应。同时可以测试信号的反转,从而保证接收端信号连接的正确性。


覆盖率收集

 一旦验证人员开始编写测试用例,我们就要面对一个问题:怎么样才能证明我们的验证已经完成了?” 此时覆盖率收集就变得十分重要了。如果QVIP的覆盖率收集达到100%就说明我们的设计功能已经全部被验证到并且符合设计规格的需求。QVIP提供一个通过使用激励发生器来实现功能覆盖率100%的例子,同时提供了一个XML文件用来编写验证计划。它可以十分清晰的表明你的用例是否覆盖了所有的验证需求。Questa Verification Manager可以用来查看现在的覆盖率状态,如下图所示:




 

结果检查与断言

 一个验证IP首先并且最重要的功能就是能够检查协议的正确性,并且当结果出现与协议不符合的时候给出错误信息。为了实现这个基本的需求,QVIP在实时检查接口上的协议时,能够实现断言功能,断言的结构主要包含:

  1. 能够单独的开启/关闭每个断言模块。默认所有的断言模块开启。

  2. 定义详细的错误信息描述,在验证不同的协议内容时,如果出现协议错误能够详细的显示出错误原因

  3. 具有SystemVerilog Assertion (SVA)的功能,比如在波形级别的debug和断言覆盖率。

下图是一个简单的断言报告。

尽管这些特性是所有QVIP里面一个十分普通的功能,但是断言的可调试性对于我们来说确是十分重要的。因为图片信息中巨大的数据量导致验证工程师很难分析出错误的原因。但是通过这些简单明了的错误信息报告,QVIP让验证人员可以很轻松的找到错误的原因。


Debugging 面对的问题

就像上文所提到的,图像处理协议往往由于图片含有海量的数据从而导致debug困难。更要命的是,这些数据并不是直接在端口上传输,而是经过了加密、编解码、解密的过程,然后才会将数据发送到接口。此时接口上的数据,已经变得面目全非。QVIP虽然隐藏了这些复杂的功能,但是并不代表它对case的可调试性做出任何妥协。不论什么时候,总线上如果出现错误,都可以通过断言来定位到出错的位置。此时我们就可以在抽象层看到是发送序列的那一步出了问题。

更重要的是这种方法在性能和效率方面也非常出色,可以在数据端口高效的处理非常大的帧数据。由于处理的数据过于庞大,导致我们无法快速有效的分辨出哪些是有效的帧数据,哪些是blanking数据,但是验证者可能会想在blanking时间观察观察传输的过程。

为了解决这个问题,QVIP提供了一个可配置的控制功能,在传输一帧数据过程中,可以将关键时间点的信息打印出来。比如Vertical blanking完成的时候,每行有效像素数据传输完成的时候,或者发送控制数据包的时候。下图便是一个简单的debug信息报告。

 

结论

很显然,验证任何一个图像显示相关的模块都不是一件轻松的任务。但是Questa Verification IP提供了一种方便使用,高度集成的验证功能,使得我们的验证经验变得更加富有效率的同时,能够保证各种协议都可以被正确的执行,从而使得我们能够对设计的质量充满信心。



您可以在手机移动端同步关注订阅号“路科验证”。

如需转载请联系路科验证,并注明出处“路科验证”。



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 23:28 , Processed in 0.020808 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部