记录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文件编写要点】