当前位置:首页>科技 >内容

自动生成testbench,使用三种自动化testbench验证方法

2024-02-20 18:51:01科技漂亮的斑马

很多朋友对自动生成testbench,使用三种自动化testbench验证方法不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。Te

自动生成testbench,使用三种自动化testbench验证方法

很多朋友对自动生成testbench,使用三种自动化testbench验证方法不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。

Testbench编写指南(四)自动化验证方法

自动验证测试台结果可以减少手动检查时间和可能的错误,特别是对于相对较大的设计。目前,常用的自动化测试台验证方法有3种:

数据库比较:首先创建一个包含预期输出的数据库文件(称为goldenvector 文件),然后捕获模拟输出以与该文件中的参考向量进行比较。但由于没有提供从输出到输入文件的指针,因此该方法的缺点是难以追踪导致错误输出的错误来源。

波形比较:将测试台输出波形与预期波形进行比较。 Xilinx推出了HDLBencher工具,可以进行自动波形比较,但由于这种方法很少使用,所以Xilinx也删除了该工具。

自检查测试台设计:与前两种方法不同,该方法实时检查预期结果和实际结果,而不是在仿真结束后检查。将错误跟踪插入测试平台可以显示设计失败的位置,从而减少调试时间。

本文将介绍最后一种自动验证方法。将一系列期望向量(例如由MATLAB等软件生成的向量)放入testbench文件中,并在运行时间间隔与实际仿真结果进行比较。如果匹配,则模拟成功;如果不匹配,结果将被报告为不一致。

比较时间可以选择在每个时钟沿,也可以选择每n个时钟周期,总之必须与设计一致。例如,内存I/O测试平台应该在读取或写入新数据后进行比较;如何设计和使用大量的组合逻辑模块,在选择比较时间时必须考虑组合逻辑的延迟。对于中小型设计,自检查测试平台设计方法是一个不错的选择,但对于复杂的大型设计,可能的输出组合呈指数级增长,编写自检查测试平台会困难得多。这是一个自检测试台的设计示例(来自xapp199):

`时间刻度1 ns/1 ps 模块test_sc; //信号声明reg tbreset, tbstrtstop;注册tbclk; [6:0] 线[6:0]电线[9:0] tbtenthsout;参数周期=25; reg [9:0] Data_in_t [0:cycles]; //实例化设计秒表UUT(.CLK(tbclk),RESET(tbreset),STRTSTOP(tbstrtstop),ONESOUT(onesout),TENSOUT(tensout),TENTHSOUT(tbtenthsout));线[4:0] tbonesout , tbtensout;分配tbtensout=led2hex(tensout);分配tbonesout=led2hex(onesout); //----------------------------------------- ------------------- - - - - - - - //预期结果//- - - - - - - - - - - - - - - - ------------------------------ 初始开始Data_in_t[1]=10'b1111111110; data_in_t[2]=10'b1111111101; data_in_t[3]=10'b1111111011; data_in_t[4]=10'b1111110111; data_in_t[5]=10'b1111101111; data_in_t[6]=10'b1111011111; data_in_t[7]=10'b1110111111; data_in_t[8]=10'b1101111111; data_in_t[9]=10'b1011111111; data_in_t[10]=10'b0111111111; data_in_t[11]=10'b1111111110; data_in_t[12]=10'b1111111110; data_in_t[13]=10'b111111101; data_in_t[14]=10'b1111111011; data_in_t[15]=10'b1111110111; data_in_t[16]=10'b11111011 11; Data_in_t[17]=10'b1111011111; data_in_t[18]=10'b1110111111; data_in_t[19]=10'b1101111111; data_in_t[20]=10'b1011111111; data_in_t[21]=10'b0111111111; 22]=10'b1111111110; data_in_t[23]=10'b1111111110; data_in_t[24]=10'b1111111101; data_in_t[25]=10'b1111111011;结束寄存器GSR;赋值glbl.GSR=GSR;初始开始GSR=1; //等待全局重置结束# 100 GSR=0; end //创建时钟初始begin tbclk=0; //全局复位后开始生成时钟信号#100 永远#60 tbclk=~tbclk; end //给予设计激励初始begin tbreset=1; #240 tbreset=0; tbstrtstop=0; #5000 tbstrtstop=1; #8125 tbstrtstop=0; #500 tbstrtstop=1; #875 tbreset=1; #375 tbreset=0; #700 tbstrtstop=0; #550 tbstrtstop=1; #100000 $停止;结尾//- - - - - - - - - - - - - - - - - - - - - - - - ------------ //在时钟的每个下降沿将预期结果与实际结果进行比较//-------- ------------ -------------------------------------- --- 整数i,错误;总是@ (posege tbclk) 开始如果(tbstrtstop) 开始i=0;错误=0; end else begin for (i=1; i 1) $display('%0d 错误!有关详细信息,请参阅上面的日志。',errors); else $display('错误!有关详细信息,请参阅上面的日志。'); #100 $停止;结束结束结束模块

上面的代码中,将预期结果与实际结果的比较结果显示在终端上。该代码模板可应用于任何需要修改实例化接口和预期输出值的设计的自检测试台。如果不需要每个时钟沿都检查数据,请修改for循环的执行条件。

以上知识分享希望能够帮助到大家!

声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们

Top