写作时间:2021-03-12
使用的FPGA开发板:xilinx KC705
开发环境: vivado2019.1

Readme:
昨天在流水灯的代码中添加了“按键消抖”功能。上板也进行了测试,测试结果OK。
但是对于有些上板测试,有时候还不能完全反应出逻辑设计时的意思。
因此,还是需要testbench测试下仿真的波形,通过波形来看,是不是真的完全表达了设计的初衷。
本文以按键消抖为例

本文目录:
1.编写测试文件的思路
2.怎么写以及文件结构
3.仿真结果

正文:
1.编写测试文件的思路
通常,编写测试文件的过程如下:
1)产生模拟激励(波形);
2)将产生的激励加入到被测试模块中并观察其响应;
3) 将输出响应与期望值相比较

2.怎么写
1)建立仿真文件

文件命名:文件命名保持一致,后边加一个尾缀“tb”,表示testbench.

此时,出来一个空文件:

  1. 编写内容
    了解下testbench 的基本架构
module Test_bench();//通常无输入无输出
//信号或变量声明定义
//逻辑设计中输入对应 reg 型
//逻辑设计中输出对应 wire 型
    reg  key_in;//逻辑设计中输入对应 reg 型
    reg  rst_n;
    reg  clk;
    reg [7:0] cnt;
    wire key_out;//逻辑设计中输出对应 wire 型
//1.使用 initial 或 always 语句产生激励
// 一般包括:时钟,复位,以及(模拟)产生测试的输入信号
//2.例化待测试模块
 key_noshake
#(
    .cnt_max(8'd100)
)
key_noshake_inst
(
    .key_in(key_in),
    .rst_n(rst_n),
    .clk(clk),
    .key_out(key_out)
);  


//3.监控和比较输出响应

//观察仿真后的输出波形即可
endmodule

3)完整代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/03/12 10:58:46
// Design Name: 
// Module Name: key_noshake_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_noshake_tb();//通常无输入无输出

//信号或变量声明定义
    reg  key_in;//逻辑设计中输入对应 reg 型
    reg  rst_n;
    reg  clk;
    reg [7:0] cnt;
    wire key_out;//逻辑设计中输出对应 wire 型
//1.使用 initial 或 always 语句产生激励    
initial 
    begin
        clk=1'b1;
        rst_n=1'b0;
        #50
        rst_n=1'b1;
    end

always #10  clk=~clk;//生成(模拟)时钟信号

always@(posedge clk or negedge rst_n)
    if( rst_n==1'b0)
        cnt<=8'b0;
    else if(cnt==8'd249)
        cnt<=8'b0;
    else
         cnt<=cnt+8'b1;
                
always@(posedge clk or negedge rst_n)//模拟按键key_in的前抖动,后抖动,以及稳定段
    if( rst_n==1'b0)
        key_in<=1'b1;
    else  if (cnt>=8'd02 &&  cnt<=8'd19)
        key_in<={$random} %2;
    else  if (cnt>=8'd129 &&  cnt<=8'd149)
        key_in<={$random} %2;
    else
        key_in<=1'b0;

// 2.例化待测试模块  

 key_noshake
#(
    .cnt_max(8'd100)
)
key_noshake_inst
(
    .key_in(key_in),
    .rst_n(rst_n),
    .clk(clk),
    .key_out(key_out)
);     
//3.监控和比较输出响应
    
endmodule

注:

3.仿真结果


放大(局部特写)

OK~ 大功告成~


THE END~

更多推荐

【FPGA】06_如何写testbench的verilog 代码?