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;
//生成本地时钟
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#2;
rst_n = 1;
end
//待测试的模块例化
text_qqnum u_text_qqnum
(
.clk (clk ),
.rst_n (rst_n ),
.qqnum (qqnum )
);
//可能还会有其他输入信号赋值
//此例子没有
endmodule