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模块的输入信号
		//输入用reg
		
		reg          clk;
		reg          rst_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   )
		
		);

⑥其他信号具体编写

	//可能还会有其他输入信号赋值
	//此例子没有
	
	endmodule

至此已经完成测试文件的编写。

3.总结一下就是:时间标尺、信号定义、输入信号的具体编写、例化待测模块

4.待测模块代码:

			module text_qqnum
			(
			    clk,
			    rst_n,
			    qqnum
			);
						
			input           clk;
			input           rst_n;		
			
			output          qqnum;

			reg [3:0]       x;
			reg [3:0]       qqnum;    
			
			reg [3:0]       cnt;
			wire            add_cnt;
			wire            end_cnt;

			always  @(posedge clk or negedge rst_n)begin
			    if(rst_n==1'b0)begin
			        qqnum <= 4'b1000;
			    end
			    else begin
			        qqnum <= x;
			    end
			end
			
			
			always @(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
			end
			
			assign 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模块的输入信号
		//输入用reg
		
		reg          clk;
		reg          rst_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   )
		
		);
		
		//可能还会有其他输入信号赋值
		//此例子没有

		endmodule

你可能感兴趣的:(FPGA设计基础,fpga)