曾经写的一个tb
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date: 20:02:30 10/12/2017
//
`define CHK_MEM_WIDTH 144
`define CHK_MEM_DEPTH 2161
module tb_Top_decoder;
// Inputs
reg clk;
wire fifo_wr_clk;
reg rst;
wire i_dv;
wire [7:0] i_data;
// Outputs
wire o_hsync;
wire o_vsync;
wire o_dv;
wire [15:0] o_ch_y;
wire [15:0] o_ch_u;
wire [15:0] o_ch_v;
reg [7:0] char,char1;
reg char_v,char_vr;
reg [15:0] data_num;
integer data_cnt;
integer data_cnt1;
integer data_cnt2;
localparam real CLK_PERIOD = 5;
localparam real blk_cycle = 2960*16/2;// 2960*16=47360 400MHz
localparam real blk_cycle_1hsync = 2960/2;// 2960*16=47360 400MHz
assign fifo_wr_clk = clk;
wire vsync_pulse;
reg o_vsync_r;
reg [7:0] cnt_vsync;
wire o_fifo_encoder_afull;
// Instantiate the Unit Under Test (UUT)
Top_decoder uut (
.clk(clk),
.fifo_wr_clk(fifo_wr_clk),
.rst(rst),
.i_dv(i_dv),
.i_data(i_data),
.o_hsync(o_hsync),
.o_vsync(o_vsync),
.o_dv(o_dv),
.o_ch_y(o_ch_y),
.o_ch_u(o_ch_u),
.o_ch_v(o_ch_v),
.o_fifo_encoder_afull(o_fifo_encoder_afull)
);
/test
reg cnt_dv;
integer fp [179:0];
reg [80*8:1] fp_path_rd;
reg [80*8:1] fp_path_wr_y;
reg [80*8:1] fp_path_wr_u;
reg [80*8:1] fp_path_wr_v;
integer m;
// integer fp_yout,fp_uout,fp_vout;
integer fp_yout444;
integer fp_uout444;
integer fp_vout444;
always @(posedge clk)begin
o_vsync_r <= o_vsync;
if(rst)
cnt_vsync <= 0;
else if(o_vsync && !o_vsync_r)
cnt_vsync <= cnt_vsync + 1;
else cnt_vsync <= cnt_vsync;
end
always @(posedge clk)begin
if (o_dv)begin
$fwrite(fp_yout444, "%d\n%d\n",o_ch_y[7:0],o_ch_y[15:8]);
end
if (o_dv)begin
$fwrite(fp_uout444, "%d\n%d\n",o_ch_u[7:0],o_ch_u[15:8]);
end
if (o_dv)begin
$fwrite(fp_vout444, "%d\n%d\n",o_ch_v[7:0],o_ch_v[15:8]);
end
end
always @(posedge clk)begin
if (rst)
cnt_dv <= 0;
else if(o_dv)
cnt_dv <= cnt_dv + 1;
else
cnt_dv <= 0;
end
// initial begin
// #22000000 $finish;
// end
initial begin
// Initialize Inputs
clk = 1;
rst = 1;
char_v = 0;
char_vr = 0;
char = 0;
data_cnt = 0;
data_cnt1 = 0;
data_cnt2 = 0;
data_num = 16'hFFFF;
// Wait 100 ns for global reset to finish
#100;
rst = 0;
// Add stimulus here
#(CLK_PERIOD*500);
/*1 FRAME*/
$sformat(fp_path_wr_y,"../txt/yuv444/y444_%1d.txt",cnt_vsync);
$sformat(fp_path_wr_u,"../txt/yuv444/u444_%1d.txt",cnt_vsync);
$sformat(fp_path_wr_v,"../txt/yuv444/v444_%1d.txt",cnt_vsync);
fp_yout444 = $fopen(fp_path_wr_y, "wb");
fp_uout444 = $fopen(fp_path_wr_u, "wb");
fp_vout444 = $fopen(fp_path_wr_v, "wb");
for (m=0;m<180;m=m+1) begin
if (m<10) $sformat(fp_path_rd,"../txt/3k/robot/%1d.bat",m);
else if (m<100) $sformat(fp_path_rd,"../txt/3k/robot/%2d.bat",m);
else $sformat(fp_path_rd,"../txt/3k/robot/%3d.bat",m);
fp[m]= $fopen(fp_path_rd, "rb");
end
for (m=0;m<180;m=m+2) read_flie1(m);
wait(o_vsync); wait(!o_vsync);
// #(CLK_PERIOD*blk_cycle_1hsync*63);
/*2 FRAME*/
$sformat(fp_path_wr_y,"../txt/yuv444/y444_%1d.txt",cnt_vsync);
$sformat(fp_path_wr_u,"../txt/yuv444/u444_%1d.txt",cnt_vsync);
$sformat(fp_path_wr_v,"../txt/yuv444/v444_%1d.txt",cnt_vsync);
fp_yout444 = $fopen(fp_path_wr_y, "wb");
fp_uout444 = $fopen(fp_path_wr_u, "wb");
fp_vout444 = $fopen(fp_path_wr_v, "wb");
for (m=0;m<180;m=m+1) begin
if (m<10) $sformat(fp_path_rd,"../txt/3k/180/%1d.bat",m);
else if (m<100) $sformat(fp_path_rd,"../txt/3k/180/%2d.bat",m);
else $sformat(fp_path_rd,"../txt/3k/180/%3d.bat",m);
fp[m]= $fopen(fp_path_rd, "rb");
end
for (m=0;m<180;m=m+2) read_flie1(m);
// #(CLK_PERIOD*blk_cycle_1hsync*63);
wait(o_vsync); wait(!o_vsync);
$finish;
end
task read_flie1;
input [7:0] file_no1;
begin
while(!$feof(fp[file_no1]))begin
if(o_fifo_encoder_afull == 0)begin
char = $fgetc(fp[file_no1]);
char_v = 1;
data_cnt1 = data_cnt1 + 1;
#(CLK_PERIOD*1);
end
else begin
char_v = 0;
data_cnt1 = data_cnt1 + 1;
#(CLK_PERIOD*1);
end
end
char_v = 0;
char = 0;
$fclose(fp[file_no1]);
#(CLK_PERIOD*1);
while(!$feof(fp[file_no1+1]))begin
if(o_fifo_encoder_afull == 0)begin
char = $fgetc(fp[file_no1+1]);
char_v = 1;
data_cnt2 = data_cnt2 + 1;
#(CLK_PERIOD*1);
end
else begin
char_v = 0;
data_cnt2 = data_cnt2 + 1;
#(CLK_PERIOD*1);
end
end
char_v = 0;
char = 0;
$fclose(fp[file_no1+1]);
// #(CLK_PERIOD*(blk_cycle - data_cnt1 - data_cnt2));
#(CLK_PERIOD*10);
data_cnt1 = 0;
data_cnt2 = 0;
end
endtask
assign i_data = char1;
assign i_dv = (char_vr);
always@(posedge clk)begin
char_vr <= char_v;
char1 <= char;
end
always begin
clk = #(CLK_PERIOD/2) ~clk;
end
endmodule