在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2575|回复: 2

[原创] FPGA实战演练逻辑篇67:测试脚本编写

[复制链接]
发表于 2015-8-25 21:24:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

测试脚本编写

本文节选自特权同学的图书《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)

      );


对于激励的产生,只提最基本的时钟信号和复位信号的产生。时钟信号产生方式有很多,使用initialalways语句都是可以的。下面列出比较典型的两种产生方式供大家参考。(特权同学,版权所有)

//时钟产生

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语法方面的书籍都会有相应的行为级语法的部分,只要依葫芦画瓢就能学会。(特权同学,版权所有)


对于这个简单的设计,有abc三个输入,他们相与的结果d每个时钟周期输出一次最新的结果。因此,我们可以预见,若想完全覆盖这个设计的测试分支,那么要产生8个不同的测试项,即分别改变abc的取值,观察他们输出的结果是否符合预期。测试脚本的编写如下所示。(特权同学,版权所有)

//复位产生

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种不同的设计输入情况下,输出是否和预期一致。若一致,则可以继续后面的设计流程完成设计,若不一致,则设计中一定存在问题,需要查找问题原因并对设计进行修改直到仿真结果达到预期结果。(特权同学,版权所有)





发表于 2018-8-23 11:08:55 | 显示全部楼层
链接过期了
发表于 2020-1-1 12:35:15 | 显示全部楼层
学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-5-4 16:38 , Processed in 0.018818 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表