`timescale 1ns / 1ps module isp_tb(); parameter IN_WIDTH = 50; parameter IN_HEIGHT = 50; parameter OFFSET_X = 7; parameter OFFSET_Y = 3; parameter OUT_WIDTH = 30; parameter OUT_HEIGHT = 30; parameter COLOR_DEPTH = 8; parameter RAW_TYPE = 3; reg clk; initial clk = 0; always #20 clk <= ~clk; reg[31:0] cnt_www; reg reset; initial begin reset = 1; cnt_www = 700; #500 reset = 0; #5000000 reset = 1; cnt_www = 2000; #500 reset = 0; end reg [15:0] in_data[3]; wire [23:0]out_data; reg in_valid; wire out_valid; reg in_ready; wire out_ready; reg[31:0] cnt_valid, cnt_ready; integer i; always @(posedge clk) begin if(reset) begin in_valid <= 0; in_ready <= 0; cnt_valid <= 10; cnt_ready <= 0; for(i=0;i<3;i=i+1) in_data[i] <= 0; end else begin cnt_valid <= cnt_valid+1; cnt_ready <= cnt_ready+1; if(cnt_ready==cnt_www)begin cnt_ready <= 0; in_ready <= ~in_ready; end if(cnt_valid==500)begin cnt_valid <= 200; in_valid <= ~in_valid; end if(in_valid && out_ready)begin in_data[0] <= in_data[0] + 1; for(i=1;i<3;i=i+1) in_data[i] <= in_data[i-1]; end end end reg [23:0] data_out_temp[8192*5]; reg [31:0] now; reg flag_ifdataerror; always @(posedge clk) begin if(reset) begin flag_ifdataerror <= 0; if(cnt_www==700) for(i=0;i<(1<<32);i=i+1) data_out_temp[i] <= 0; now <= 0; end else if(out_valid && in_ready)begin now <= now + 1; if(cnt_www==700)begin data_out_temp[now] <= out_data; end else if(cnt_www==2000)begin flag_ifdataerror <= (data_out_temp[now] != out_data); end else flag_ifdataerror <= flag_ifdataerror; end end isp_nofifo #( .IN_WIDTH (IN_WIDTH ), .IN_HEIGHT (IN_HEIGHT ), .OFFSET_X (OFFSET_X ), .OFFSET_Y (OFFSET_Y ), .OUT_WIDTH (OUT_WIDTH ), .OUT_HEIGHT (OUT_HEIGHT ), .COLOR_DEPTH (COLOR_DEPTH ), .RAW_TYPE (RAW_TYPE ) ) u_isp( .clk (clk ), .reset (reset ), .in_data (in_data ), .out_data (out_data ), .in_valid (in_valid ), .out_valid (out_valid ), .in_ready (in_ready ), .out_ready (out_ready ), .gain_red (50 ), .gain_green (50 ), .gain_blue (50 ), .blender_enable (0 ) ); endmodule