1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
测试脚本编写 本文节选自特权同学的图书《FPGA设计实战演练(逻辑篇)》 配套例程下载链接:http://pan.baidu.com/s/1pJ5bCtt Testbench的编写其实也没有想象中那么神秘,笔者简单的将其归纳为3个步骤。(特权同学,版权所有) ① 对被测试设计的顶层接口进行例化。(特权同学,版权所有) ② 给被测试设计的输入接口添加激励。(特权同学,版权所有) ③ 判断被测试设计的输出响应是否满足设计要求。(特权同学,版权所有) 相对而言,最后一步还要复杂一些,有时不一定只是简单的输出观察,可能还需要反馈一些输入值给待测试设计。(特权同学,版权所有) 例化的目的就是把待测试设计和testbench进行对接,和FPGA内部的例化是一个概念。那么如何进行例化呢?下面用一个简单实例来说明。(特权同学,版权所有) //待测试的设计 module fpga_design( clk,rst_n,a,b,c,d ); input clk; input rst_n; input a,b,c; output d; always @(posedge clk or negedge rst_n)begin if(!rst_n)d <= 1’b0; elsed <= a & b & c; end endmodule 对于上面这个待测试的设计,testbench中的例化应该把input转换成reg,因为待测试设计的输入值是由testbench决定的。相应的output就应该转换成wire,因为待测试设计的输出值不是由testbench决定的。如果是inout端口,在例化中也是一个wire类型,在testbench中使用时和RTL代码设计中使用是一样的。(特权同学,版权所有) //例化待测试设计 reg clk; reg rst_n; reg a,b,c; wire d; fpga_design( .clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(c), .d(d) ); 对于激励的产生,只提最基本的时钟信号和复位信号的产生。时钟信号产生方式有很多,使用initial和always语句都是可以的。下面列出比较典型的两种产生方式供大家参考。(特权同学,版权所有) //时钟产生 parameter PERIOD = 20; //定义时钟周期为20ns,已定义“`timescale 1ns/1ps” initial begin clk= 0; forever #(PERIOD/2)clk = ~clk; end //时钟产生 parameter PERIOD = 20; //定义时钟周期为20ns,已定义“`timescale 1ns/1ps” always begin #(PERIOD/2)clk = 0; #(PERIOD/2)clk = 1; end 复位信号的产生也很简单,比较常用的做法是封装成一个task,直接在需要复位的时候调用即可。(特权同学,版权所有) //复位产生 initial begin reset_task(100); //复位100ns,已定义“`timescale 1ns/1ps” …… end task reset_task; input[15:0] reset_time; //复位时间 begin reset= 0; #reset_time; reset= 1; end 至于对测试的响应如何进行观察处理,这里不作太多描述,大家随便找本verilog语法方面的书籍都会有相应的行为级语法的部分,只要依葫芦画瓢就能学会。(特权同学,版权所有) 对于这个简单的设计,有a、b和c三个输入,他们相与的结果d每个时钟周期输出一次最新的结果。因此,我们可以预见,若想完全覆盖这个设计的测试分支,那么要产生8个不同的测试项,即分别改变a、b和c的取值,观察他们输出的结果是否符合预期。测试脚本的编写如下所示。(特权同学,版权所有) //复位产生 timescale 1ns/1ps module tb_fpga_design; //例化待测试设计 reg clk; reg rst_n; reg a,b,c; wire d; fpga_design( .clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(c), .d(d) ); initial begin reset_task(100); //复位100ns,已定义“`timescale 1ns/1ps” @(posedgeclk); #2; a= 1’b0; b= 1’b0; c= 1’b0; @(posedgeclk); #2; a= 1’b0; b= 1’b0; c= 1’b1; @(posedgeclk); #2; a= 1’b0; b= 1’b1; c= 1’b0; @(posedgeclk); #2; a= 1’b0; b= 1’b1; c= 1’b1; @(posedgeclk); #2; a= 1’b1; b= 1’b0; c= 1’b0; @(posedgeclk); #2; a= 1’b1; b= 1’b0; c= 1’b1; @(posedgeclk); #2; a= 1’b1; b= 1’b1; c= 1’b0; @(posedgeclk); #2; a= 1’b1; b= 1’b1; c= 1’b1; @(posedgeclk); #2; $stop; end task reset_task; input[15:0] reset_time; //复位时间 begin reset= 0; #reset_time; reset= 1; end //时钟产生 parameter PERIOD = 20; //定义时钟周期为20ns,已定义“`timescale 1ns/1ps” always begin #(PERIOD/2)clk = 0; #(PERIOD/2)clk = 1; end endmodule 使用这个脚本对设计进行仿真,我们观察结果输出,在8种不同的设计输入情况下,输出是否和预期一致。若一致,则可以继续后面的设计流程完成设计,若不一致,则设计中一定存在问题,需要查找问题原因并对设计进行修改直到仿真结果达到预期结果。(特权同学,版权所有) |
|
相关推荐
2个回答
|
|
谢谢分享 希望有更多好的文章分享给我们
|
|
|
|
还真不错喔,这知识
|
|
|
|
只有小组成员才能发言,加入小组>>
885个成员聚集在这个小组
加入小组4533 浏览 0 评论
特权同学 Verilog边码边学 Lesson01 Vivado下载与安装
2646 浏览 1 评论
玩转Zynq连载50——[ex69] FIR滤波器IP仿真实例
4330 浏览 2 评论
玩转Zynq连载49——[ex68] MT9V034摄像头的图像FFT滤波处理
5268 浏览 1 评论
玩转Zynq连载48——[ex67] Vivado FFT和IFFT IP核应用实例
5314 浏览 0 评论
1943浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 22:14 , Processed in 0.515524 second(s), Total 79, Slave 61 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号