FPGA testbench文件编写要点

记录testbench编写使用过程中的问题,作为笔记不定时更新。
FPGA开发过程中,编写的模块如果直接使用硬件仿真,开发会特别费时费力,一般编写完一个逻辑模块后可以使用时序仿真功能,做完验证再进行集成。初期可能会花费点时间,但是和直接硬件仿真调试比起来还是会更高效。
TestBench文件就是使用硬件描述语言的方式描述激励信号,使用熟练后会比图形化的方式更方便,并且逻辑复杂后你会发现,图形化的方式根本无法操作,必须使用TextBench进行仿真。
vivado软件没有自动生成TestBench文件的功能,需要自行建立、编写。实际操作不再详细描述。先看一个例子:

`timescale 1ns / 1psmodule 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 Uart24WzhUart24Wzh_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文件的调用方式一致。
【FPGA testbench文件编写要点】

    推荐阅读