FPGA testbench文件编写要点

记录testbench编写使用过程中的问题,作为笔记不定时更新。

FPGA开发过程中,编写的模块如果直接使用硬件仿真,开发会特别费时费力,一般编写完一个逻辑模块后可以使用时序仿真功能,做完验证再进行集成。初期可能会花费点时间,但是和直接硬件仿真调试比起来还是会更高效。

TestBench文件就是使用硬件描述语言的方式描述激励信号,使用熟练后会比图形化的方式更方便,并且逻辑复杂后你会发现,图形化的方式根本无法操作,必须使用TextBench进行仿真。

vivado软件没有自动生成TestBench文件的功能,需要自行建立、编写。实际操作不再详细描述。先看一个例子:

`timescale 1ns / 1ps

module Uart24Wzh_sim(

    );
reg clk50m,flex_spi_clk,dsp_ce_n,dsp_we_n,dsp_re_n,read_clk;
reg reset_n;
reg [9:0]  dsp_data;
reg [11:0]   dsp_add;
wire  [31:0]   data32_out;
reg [24:1] Rs232input;
initial 
begin
    clk50m = 1'b0;
    flex_spi_clk = 1'b0;
    dsp_ce_n = 1'b1;
    dsp_we_n = 1'b1;
    dsp_re_n = 1'b1;
    reset_n = 1'b0;
    #20
    reset_n =  1'b1;
end
always
begin
    #20 clk50m = ~clk50m;    //50M时钟
    #10 flex_spi_clk = ~flex_spi_clk; //100M时钟
end
    
 Uart24Wzh  Uart24Wzh_simulation(
    .clk50m(clk50m),//50M 
    .reset_n(reset_n),
    //通信控制端口///
    .flex_spi_clk(flex_spi_clk), //flexSpi的时钟信号,
    .dsp_data(dsp_data),     //传入的设置数据,主要用于设置分频参数
    .dsp_add(dsp_add),    //设置数据地址 根据地址区分通道 
    .dsp_ce_n(dsp_ce_n),            //模拟片选
    .dsp_we_n(dsp_we_n),             //写入使能
    .dsp_re_n(dsp_re_n),             //读取使能信号
    .data32_out(data32_out),        //串口数据输出端口
    .read_clk(read_clk),           //data32_out 的读取时钟
    /
    .Rs232input(Rs232input)	        //串口输入端口
);    
    
    
endmodule

module Uart24Wzh_sim();   声明这个testbench模块,不用包含input 、output 端口;

然后是信号定义,被测模块的输入信号定义成reg型,可以在testbench中赋值,输出信号定义成wire型,用于观察输出的信号;

这个例子中被测模块是Uart24Wzh。

initial 关键字定义的是信号初始化内容,统一使用 = 赋值。

#20   表示延迟20,时间单位由开头的 `timescale 1ns / 1ps 时间尺度定义。

always 段中的信号会被反复执行,#20 clk50m = ~clk50m;   表示每隔20ns  信号clk50m会被翻转一次。

模块额调用还是和正常Verilog文件的调用方式一致。

 

你可能感兴趣的:(RT1052和Spartan7)