testbench仿真模型
概述
在FPGA中仿真测试验证是必不可少了,验证通常又分为仿真验证和板级验证,在上篇说过了板级验证调试的几种手段,本篇主要讲述如何在设计初步完成即将上板调试前进行仿真验证。
提到仿真,我们通常会提到testbench的概念,即所谓的测试平台,就好比一个小型实验室,在这个实验室里有源,示波器等测试验证仪器,要测试的代码文件就是一个小黑盒子,这个黑盒子在实验室里测试,就需要具备源端输入接口和波形输出接口,我们要做的是给这个黑盒子添加激励和同时观察它的输出响应是否满足预期结果。
上述是初学者在刚接触仿真这个概念时,对testbench测试平台一些简单理解,但是对于大规模的设计,用波形产生激励是不现实的,比如对于一个16位输入总线,它有65536种输入组合和对应的输出组合,如果看波形肯定会“眼花缭乱”的。所以tsetbench应该有更高效和灵活的测试设计手段。
比如设计的测试结果判断也可以通过使用脚本命令将有用的输出信息打印到终端或者产生文本对比观察,也可以写一段代码让它们自动比较输出结果。总之testbench的设计是多种多样的。
基本testbench模型搭建
上图描述的是简单归纳的三个步骤,有时候,最后一步还要比较复杂一点,不一定只是简单的输出观察,可能还需要反馈一些输入值给待测试设计模块。
例化的目的就是把待测试设计和testbench进行对接,和FPGA内部例化是一个概念。那么如何去例化呢?
下面将以时序逻辑电路设计之计数器来阐述这一过程。
对于上面这个待测试模块计数器,testbench中例化需要把input转换成reg型,因为待测试模块设计的输入值是由testbench决定的,相应的output就应该转换成wire型,因为待测试设计的输出值不是由testbench决定的。如果是inout端口,在例化中也是一个wire类型。
对于激励的产生,只提最基本的时钟信号和复位信号的产生,时钟信号的产生有很多种,主要是使用initial和always语句,上面文件中列举了三种常见的时钟产生方法。
复位信号的产生上述描述也是比较简单,另一种常见的做法是封装成一个task,在需要复位的时候直接调用即可。
上图是功能仿真波形,可以看出led高低电平转换的时间均是0.5s也就是500ms,符合既定的设计要求。
由于该设计可以上板直接观察led灯反转情况,所以又添加了板级调试这一步,利用signalTap II来直接观察cnt信号和led信号的具体情况。
可以看出cnt信号在计数到2499999结束后led信号电平反转。
**推荐书籍《深入浅出玩转FPGA第三版》**
里面详细介绍了testbench如何去封装task,来打印测试时有用的报告显示(error,warning,fatal,terminate),和如何去搭建结构化testbench。,由于个人学习计划中未列入该项内容,留待后期深入学习。