FPGA设计基础|FPGA设计基础06——测试文件编写

FPGA设计基础06——测试文件编写
1.什么是测试文件?
①测试文件就是给设计好的v文件做测试的文件。
②模块写好了需要验证其功能,则需要给出模块的输入信号,比如时钟、复位信号。
③总的来说,其作用是写入输出信号,也就是我们常说的激励信号
2.测试文件怎么写?
先看要测试的文件的端口列表(一会要例化以及输入信号要编写):

module text_qqnum ( clk, rst_n, qqnum//输出博主的 QQ号:841185604 );

下面开始测试文件的编写:
①时间标尺
`timescale 1 ns/1 ns//时间单位/时间精度

②测试模块名
module txet_qqnum_tb(); //可以不用里面的信号

③信号编写(由端口可知一共有2输入、1输出)
//例化的v模块的输入信号 //输入用regregclk; regrst_n; //例化的v模块的输出信号 //输出用wire wire[3:0] qqnum;

④时钟以及复位具体输入的编写
//时钟周期,单位为ns parameter CYCLE= 20; //复位时间,此时表示复位3个时钟周期的时间。 parameter RST_TIME = 3 ; //生成时钟输入信号 initial begin clk = 0; forever #(CYCLE/2) clk=~clk; end//产生复位信号 initial begin rst_n = 1; #2; rst_n = 0; #(CYCLE*RST_TIME); rst_n = 1; end

⑤ 待测文件模块例化
text_qqnum u_text_qqnum ( .clk(clk), .rst_n(rst_n), .qqnum(qqnum));

【FPGA设计基础|FPGA设计基础06——测试文件编写】⑥其他信号具体编写
//可能还会有其他输入信号赋值 //此例子没有 endmodule

至此已经完成测试文件的编写。
3.总结一下就是:时间标尺、信号定义、输入信号的具体编写、例化待测模块。
4.待测模块代码:
module text_qqnum ( clk, rst_n, qqnum ); inputclk; inputrst_n; outputqqnum; reg [3:0]x; reg [3:0]qqnum; reg [3:0]cnt; wireadd_cnt; wireend_cnt; always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin qqnum <= 4'b1000; end else begin qqnum <= x; end endalways @(posedge clk or negedge rst_n)begin if(!rst_n)begin cnt <= 0; end else if(add_cnt)begin if(end_cnt) cnt <= 0; else cnt <= cnt + 1; end endassign add_cnt = 1 ; assign end_cnt = add_cnt && cnt== 9-1 ; always@(*)begin if(cnt == 0)begin x = 4'b1000; end else if(cnt == 1)begin x = 4'b0100; end else if(cnt == 2)begin x = 4'b0001; end else if(cnt == 3)begin x = 4'b0001; end else if(cnt == 4)begin x = 4'b1000; end else if(cnt == 5)begin x = 4'b0101; end else if(cnt == 6)begin x = 4'b0110; end else if(cnt == 7)begin x = 4'b0000; end else if(cnt == 8)begin x = 4'b0100; end else begin x = 4'b1000; end end endmodule

5.测试模块代码:
`timescale 1 ns/1 ns//时间标尺时间单位/时间精度module txet_qqnum_tb(); //例化的v模块的输入信号 //输入用regregclk; regrst_n; //例化的v模块的输出信号 //输出用wirewire[3:0] qqnum; //时钟周期,单位为nsparameter CYCLE= 20; //复位时间,此时表示复位3个时钟周期的时间。parameter RST_TIME = 3 //生成本地时钟 initial begin clk = 0; forever #(CYCLE/2) clk=~clk; end//产生复位信号 initial begin rst_n = 1; #2; rst_n = 0; #(CYCLE*RST_TIME); rst_n = 1; end//待测试的模块例化text_qqnum u_text_qqnum ( .clk(clk), .rst_n(rst_n), .qqnum(qqnum)); //可能还会有其他输入信号赋值 //此例子没有endmodule

    推荐阅读