Commit 060ba228 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

new set of test fixtures

parent cb389afb
Loading
Loading
Loading
Loading

dsp/mclt_test_03.tf

0 → 100644
+573 −0
Original line number Original line Diff line number Diff line
/*!
 * <b>Module:</b>mclt_test_01
 * @file mclt_test_01.tf
 * @date 2016-12-02  
 * @author  Andrey Filippov
 *     
 * @brief testing MCLT 16x16 -> 4*8*8 transform
 * Uses 2 DSP blocks 
 *
 * @copyright Copyright (c) 2016 Elphel, Inc.
 *
 * <b>License:</b>
 *
 *mclt_test_01.tf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  mclt_test_01.tf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/> .
 *
 * Additional permission under GNU GPL version 3 section 7:
 * If you modify this Program, or any covered work, by linking or combining it
 * with independent modules provided by the FPGA vendor only (this permission
 * does not extend to any 3-rd party modules, "soft cores" or macros) under
 * different license terms solely for the purpose of generating binary "bitstream"
 * files and/or simulating the code, the copyright holders of this Program give
 * you the right to distribute the covered work without those independent modules
 * as long as the source code for them is available from the FPGA vendor free of
 * charge, and there is no dependence on any encrypted modules for simulating of
 * the combined code. This permission applies to you if the distributed code
 * contains all the components and scripts required to completely simulate it
 * with at least one of the Free Software programs.
 */
`timescale 1ns/1ps
`include "system_defines.vh"
//  `define INSTANTIATE_DSP48E1
//  `define PRELOAD_BRAMS
//  `define ROUND 
module  mclt_test_03 ();
`ifdef IVERILOG              
    `ifdef NON_VDT_ENVIROMENT
        parameter fstname="mclt_test_03.fst";
    `else
        `include "IVERILOG_INCLUDE.v"
    `endif // NON_VDT_ENVIROMENT
`else // IVERILOG
    `ifdef CVC
        `ifdef NON_VDT_ENVIROMENT
            parameter fstname = "x393.fst";
        `else // NON_VDT_ENVIROMENT
            `include "IVERILOG_INCLUDE.v"
        `endif // NON_VDT_ENVIROMENT
    `else
        parameter fstname = "mclt_test_03.fst";
    `endif // CVC
`endif // IVERILOG
    
    parameter CLK_PERIOD =      10; // ns
//    parameter WIDTH =           25; //4; // input data width
    parameter SHIFT_WIDTH =      7; // bits in shift (7 bits - fractional)
    parameter COORD_WIDTH =     10; // bits in full coordinate 10 for 18K RAM
    parameter PIXEL_WIDTH =     16; // input pixel width (unsigned) 
    parameter WND_WIDTH =       18; // input pixel width (unsigned) 
    parameter OUT_WIDTH =       25; // bits in dtt output
    parameter DTT_IN_WIDTH =    25; // bits in DTT input
    parameter TRANSPOSE_WIDTH = 25; // width of the transpose memory (intermediate results)    
    parameter OUT_RSHIFT =       2; // overall right shift of the result from input, aligned by MSB (>=3 will never cause saturation)
    parameter OUT_RSHIFT2 =      0; // overall right shift for the second (vertical) pass
    parameter DSP_B_WIDTH =     18; // signed, output from sin/cos ROM
    parameter DSP_A_WIDTH =     25;
    parameter DSP_P_WIDTH =     48;
    parameter DEAD_CYCLES =     14;  // start next block immedaitely, or with longer pause
    
    //parameter DCT_GAP = 16; // between runs            
    
    //parameter SAME_BITS=4; // (3) to match 24-bit widths
    
    reg              RST = 1'b1;
    reg              CLK = 1'b0;
    
    reg   [PIXEL_WIDTH-1 : 0]   tile_shift[0:258];  // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg   [PIXEL_WIDTH-1 : 0]   tiles[0:1023];
    reg   [SHIFT_WIDTH-1 : 0]   shifts_x[0:3]; 
    reg   [SHIFT_WIDTH-1 : 0]   shifts_y[0:3]; 
    reg               [3 : 0]   bayer[0:3]; 
    
    reg                 [3:0]   java_wnd_signs[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg                 [7:0]   java_fold_index[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg     [WND_WIDTH - 1:0]   java_tiles_wnd[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task

    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_in0[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task

    reg     [WND_WIDTH - 1:0]   tiles_wnd[0:1023];    // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_in[0:1023];  // SuppressThisWarning VEditor : assigned in $readmem() system task

    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_out0[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_out[0:1023]; // SuppressThisWarning VEditor : assigned in $readmem() system task

    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_rot0[0:255]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    reg  [DTT_IN_WIDTH - 1:0]   java_dtt_rot[0:1023]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    integer   i, n, n_out;
    initial begin
        $readmemh("input_data/clt_wnd_signs.dat",  java_wnd_signs);
        $readmemh("input_data/clt_fold_index.dat", java_fold_index);
    
//        $readmemh("input_data/tile_01.dat",tile_shift);
        //============ tile 0
        $readmemh("input_data/clt_tile_00_2_x1489_y951.dat",tile_shift);
        shifts_x[0] = tile_shift[0][SHIFT_WIDTH-1:0];
        shifts_y[0] = tile_shift[1][SHIFT_WIDTH-1:0];
        bayer[0] =    tile_shift[2][3:0];
        for (i=0; i<256; i=i+1) begin
            tiles['h000 + i] = tile_shift[i+3]; 
        end
        $readmemh("input_data/clt_wnd_00_2_x1489_y951.dat",java_tiles_wnd);
        for (i=0; i<256; i=i+1) begin
            tiles_wnd['h000 + i] = java_tiles_wnd[i]; 
        end

        $readmemh("input_data/clt_dtt_in_00_2_x1489_y951.dat",java_dtt_in0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_in['h000 + i] = java_dtt_in0[i]; 
        end

        $readmemh("input_data/clt_dtt_out_00_2_x1489_y951.dat",java_dtt_out0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_out['h000 + i] = java_dtt_out0[i]; 
        end
        
        $readmemh("input_data/clt_dtt_rot_00_2_x1489_y951.dat",java_dtt_rot0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_rot['h000 + i] = java_dtt_rot0[i]; 
        end
        
        //============ tile 1
        
        $readmemh("input_data/clt_tile_01_2_x1489_y951.dat",tile_shift);
        shifts_x[1] = tile_shift[0][SHIFT_WIDTH-1:0];
        shifts_y[1] = tile_shift[1][SHIFT_WIDTH-1:0];
        bayer[1] =    tile_shift[2][3:0];
        for (i=0; i<256; i=i+1) begin
            tiles['h100 + i] = tile_shift[i+3]; 
        end
        
        $readmemh("input_data/clt_wnd_01_2_x1489_y951.dat",java_tiles_wnd);
        for (i=0; i<256; i=i+1) begin
            tiles_wnd['h100 + i] = java_tiles_wnd[i]; 
        end

        $readmemh("input_data/clt_dtt_in_01_2_x1489_y951.dat",java_dtt_in0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_in['h100 + i] = java_dtt_in0[i]; 
        end

        $readmemh("input_data/clt_dtt_out_01_2_x1489_y951.dat",java_dtt_out0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_out['h100 + i] = java_dtt_out0[i]; 
        end
        
        $readmemh("input_data/clt_dtt_rot_01_2_x1489_y951.dat",java_dtt_rot0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_rot['h100 + i] = java_dtt_rot0[i]; 
        end
        
        //============ tile 2
        
        $readmemh("input_data/clt_tile_02_2_x1489_y951.dat",tile_shift);
        shifts_x[2] = tile_shift[0][SHIFT_WIDTH-1:0];
        shifts_y[2] = tile_shift[1][SHIFT_WIDTH-1:0];
        bayer[2] =    tile_shift[2][3:0];
        for (i=0; i<256; i=i+1) begin
            tiles['h200 + i] = tile_shift[i+3]; 
        end
        
        $readmemh("input_data/clt_wnd_02_2_x1489_y951.dat",java_tiles_wnd);
        for (i=0; i<256; i=i+1) begin
            tiles_wnd['h200 + i] = java_tiles_wnd[i]; 
        end

        $readmemh("input_data/clt_dtt_in_02_2_x1489_y951.dat",java_dtt_in0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_in['h200 + i] = java_dtt_in0[i]; 
        end

        $readmemh("input_data/clt_dtt_out_02_2_x1489_y951.dat",java_dtt_out0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_out['h200 + i] = java_dtt_out0[i]; 
        end
        
        $readmemh("input_data/clt_dtt_rot_02_2_x1489_y951.dat",java_dtt_rot0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_rot['h200 + i] = java_dtt_rot0[i]; 
        end
        
        //============ tile 3
        
        $readmemh("input_data/clt_tile_00_2_x1489_y951.dat",tile_shift);
        shifts_x[3] = tile_shift[0][SHIFT_WIDTH-1:0];
        shifts_y[3] = tile_shift[1][SHIFT_WIDTH-1:0];
        bayer[3] =    tile_shift[2][3:0];
        for (i=0; i<256; i=i+1) begin
            tiles['h300 + i] = tile_shift[i+3]; 
        end
        $readmemh("input_data/clt_wnd_00_2_x1489_y951.dat",java_tiles_wnd);
        for (i=0; i<256; i=i+1) begin
            tiles_wnd['h300 + i] = java_tiles_wnd[i]; 
        end

        $readmemh("input_data/clt_dtt_in_00_2_x1489_y951.dat",java_dtt_in0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_in['h300 + i] = java_dtt_in0[i]; 
        end

        $readmemh("input_data/clt_dtt_out_00_2_x1489_y951.dat",java_dtt_out0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_out['h300 + i] = java_dtt_out0[i]; 
        end
        
        $readmemh("input_data/clt_dtt_rot_00_2_x1489_y951.dat",java_dtt_rot0);
        for (i=0; i<256; i=i+1) begin
            java_dtt_rot['h300 + i] = java_dtt_rot0[i]; 
        end
        
        for (n=0;n<4;n=n+1) begin
            $display("Tile %d: shift x = %h, shift_y = %h, bayer = %h", 0, shifts_x[n], shifts_y[n], bayer[n]);
            for (i = 256 * n; i < 256 * (n + 1); i = i + 16) begin
                $display ("%h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h, %h",
                    tiles[i+ 0],tiles[i+ 1],tiles[i+ 2],tiles[i+ 3],
                    tiles[i+ 4],tiles[i+ 5],tiles[i+ 6],tiles[i+ 7],
                    tiles[i+ 8],tiles[i+ 9],tiles[i+10],tiles[i+11],
                    tiles[i+12],tiles[i+13],tiles[i+14],tiles[i+15]);
            end
            $display("");
        end
        
    end

    reg                         start;
    reg       [SHIFT_WIDTH-1:0] x_shft; 
    reg       [SHIFT_WIDTH-1:0] y_shft;
    reg                   [3:0] bayer_r;
    reg                   [1:0] page_in; 
    wire                        pre_busy_w;
    wire                        pre_busy;
    reg                         LATE = 0;
    wire                        mpixel_re;
    wire                        mpixel_page;    
    reg                         mpixel_reg;
    reg                         mpixel_valid;
    wire                  [7:0] mpixel_a;
    reg     [PIXEL_WIDTH-1 : 0] pixel_r;
    reg     [PIXEL_WIDTH-1 : 0] pixel_r2;
    wire    [PIXEL_WIDTH-1 : 0] mpixel_d = mpixel_valid ? pixel_r2 : {PIXEL_WIDTH{1'bz}};  
    
    wire                        pre_last_in;   // SuppressThisWarning VEditor - output only
    wire                        pre_first_out; // SuppressThisWarning VEditor - output only
    wire                        pre_last_out;  // SuppressThisWarning VEditor - output only
    wire                  [7:0] out_addr;      // SuppressThisWarning VEditor - output only
    wire                        dv;            // SuppressThisWarning VEditor - output only
    wire        [OUT_WIDTH-1:0] dout;          // SuppressThisWarning VEditor - output only
    
    assign  #(1)  pre_busy = pre_busy_w;
    
    
    always #(CLK_PERIOD/2) CLK = ~CLK;    
    initial begin
        $dumpfile(fstname);
        $dumpvars(0,mclt_test_03); // SuppressThisWarning VEditor
        #100;
        start =  0;
        page_in = 0;
        LATE = 0;
        RST = 0;
        #100;
        repeat (10) @(posedge CLK);
//        #1;
        for (n = 0; n < 4; n = n+1) begin
            if (n>2) LATE = 1;
            while (pre_busy || LATE) begin
                if (!pre_busy) LATE = 0;
                @(posedge CLK);
                #1;
            end
            start = 1;
            x_shft = shifts_x[n];
            y_shft = shifts_y[n];
            bayer_r = bayer[n];
            @(posedge CLK);
            #1;
            start = 0; 
            x_shft = 'bz;
            y_shft = 'bz;
            bayer_r = 'bz;                    
            @(posedge CLK);
//            #1;
        end 
        // emergency finish
        repeat (1024) @(posedge CLK);
        $finish; 
        //pre_last_out
    end
    
    always @ (posedge CLK) if (!RST) begin
        mpixel_reg <=     mpixel_re;
        mpixel_valid <=   mpixel_reg; 
        if (mpixel_re)    pixel_r <= tiles[{page_in,mpixel_a}];
        if (mpixel_reg)   pixel_r2 <= pixel_r; 
        if (mpixel_page)  page_in <= page_in + 1;
        if (pre_last_out) n_out <= n_out + 1;

    end

    initial begin
        n_out = 0;
        while (n_out < 4)  @(posedge CLK);
        repeat (32)        @(posedge CLK);
        $finish;
    
    end

    integer n1, cntr1, diff1;// SuppressThisWarning VEditor : assigned in $readmem() system task
    wire           [7:0] mpix_a_w = mclt16x16_i.mpix_a_w;
    wire           [7:0] java_fi_w = java_fold_index[cntr1];  
    initial begin
        while (RST) @(negedge CLK);
        for (n1 = 0; n1 < 4; n1 = n1+1) begin
            while (mclt16x16_i.in_cntr != 2) begin
                @(negedge CLK);
            end
            for (cntr1 = 0; cntr1 < 256; cntr1 = cntr1 + 1) begin
                diff1 = mpix_a_w - java_fi_w; // java_fold_index[cntr1];
                @(negedge CLK);
            end
        end
    end

    integer n2, cntr2, diff2, diff2a; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire [WND_WIDTH-1:0] window_r = mclt16x16_i.window_r;
//    reg            [7:0] java_fi_r;  
    wire [WND_WIDTH-1:0] java_window_w = tiles_wnd[n2 * 256 + cntr2]; //  java_tiles_wnd[cntr2];  
    initial begin
        while (RST) @(negedge CLK);
        for (n2 = 0; n2 < 4; n2 = n2+1) begin
            while (mclt16x16_i.in_cntr != 9) begin
                @(negedge CLK);
            end
            for (cntr2 = 0; cntr2 < 256; cntr2 = cntr2 + 1) begin
                diff2 = window_r - java_window_w;
                if (n2 < 1) diff2a = window_r - java_window_w; // TEMPORARY, while no other data
                @(negedge CLK);
            end
        end
    end

//Compare window signs
    integer n3, cntr3, diff3; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire           [3:0] mpix_sgn_w =  mclt16x16_i.mpix_sgn_w; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire           [3:0] java_sgn_w =  { //java_wnd_signs[java_fold_index[cntr3]];  // SuppressThisWarning VEditor : assigned in $readmem() system task
    java_wnd_signs[{2'b11,cntr3[7:2]}][cntr3[1:0]],
    java_wnd_signs[{2'b10,cntr3[7:2]}][cntr3[1:0]],
    java_wnd_signs[{2'b01,cntr3[7:2]}][cntr3[1:0]],
    java_wnd_signs[{2'b00,cntr3[7:2]}][cntr3[1:0]] 
    };
    initial begin
        while (RST) @(negedge CLK);
        for (n3 = 0; n3 < 4; n3 = n3+1) begin
            while (mclt16x16_i.in_cntr != 2) begin
                @(negedge CLK);
            end
            for (cntr3 = 0; cntr3 < 256; cntr3 = cntr3 + 1) begin
                #1;
                diff3 = mpix_sgn_w - java_sgn_w; // java_fold_index[cntr1];
                @(negedge CLK);
            end
        end
    end

//Compare DTT inputs

    integer n4, cntr4, diff4, diff4a; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire [DTT_IN_WIDTH-1:0] data_dtt_in = mclt16x16_i.data_dtt_in;
    wire [DTT_IN_WIDTH-1:0] java_data_dtt_in = java_dtt_in[{n4[1:0], cntr4[1:0],cntr4[7:2]}]; // java_dtt_in0[{cntr4[1:0],cntr4[7:2]}]  
    initial begin
        while (RST) @(negedge CLK);
        for (n4 = 0; n4 < 4; n4 = n4+1) begin
            while (mclt16x16_i.in_cntr != 16) begin
                @(negedge CLK);
            end
            for (cntr4 = 0; cntr4 < 256; cntr4 = cntr4 + 1) begin
                #1;
                diff4 = data_dtt_in - java_data_dtt_in;
                if (n4 < 1) diff4a = data_dtt_in - java_data_dtt_in; // TEMPORARY, while no other data
                @(negedge CLK);
            end
        end
    end

    integer n5, cntr5, diff5, diff5a; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire [DTT_IN_WIDTH-1:0] dtt_r_data = mclt16x16_i.dtt_r_data;
    wire [DTT_IN_WIDTH-1:0] java_dtt_r_data =  java_dtt_in[{n5[1:0], cntr5[7:0]}]; // java_dtt_in0[cntr5[7:0]];
    
    wire                           dtt_r_regen = mclt16x16_i.dtt_r_regen;
    reg                            dtt_r_dv; // SuppressThisWarning VEditor just for simulation
    always @ (posedge CLK) begin
        if (RST) dtt_r_dv <= 0;
        else     dtt_r_dv <= dtt_r_regen;
    end
    
      
    initial begin
        while (RST) @(negedge CLK);
        for (n5 = 0; n5 < 4; n5 = n5+1) begin
            while ((!dtt_r_dv) || (mclt16x16_i.dtt_r_cntr[7:0] != 2)) begin
                @(negedge CLK);
            end
            for (cntr5 = 0; cntr5 < 256; cntr5 = cntr5 + 1) begin
                #1;
                diff5 = dtt_r_data - java_dtt_r_data;
                if (n5 < 1) diff5a = dtt_r_data - java_dtt_r_data; // TEMPORARY, while no other data
                @(negedge CLK);
            end
        end
    end




    integer n6, cntr6, diff6, diff6a; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire [DTT_IN_WIDTH-1:0] data_dtt_out = mclt16x16_i.dtt_rd_data;
//    wire [DTT_IN_WIDTH-1:0] java_data_dtt_out = java_dtt_out0[{cntr6[1:0],cntr6[7:2]}]; // java_dtt_in[n2 * 256 + cntr2];  
    wire [DTT_IN_WIDTH-1:0] java_data_dtt_out = java_dtt_out[{n6[1:0], cntr6[0],cntr6[1], cntr6[7:2]}]; //java_dtt_out0[{cntr6[0],cntr6[1],cntr6[7:2]}];  
    initial begin
        while (RST) @(negedge CLK);
        for (n6 = 0; n6 < 4; n6 = n6+1) begin
            while ((!mclt16x16_i.dtt_rd_regen_dv[2]) || (mclt16x16_i.dtt_rd_cntr[7:0] != 2)) begin
                @(negedge CLK);
            end
            for (cntr6 = 0; cntr6 < 256; cntr6 = cntr6 + 1) begin
                #1;
                diff6 = data_dtt_out - java_data_dtt_out;
                if (n6 < 1) diff6a = data_dtt_out - java_data_dtt_out; // TEMPORARY, while no other data
                @(negedge CLK);
            end
        end
    end

    reg FIRST_OUT;
    always @(posedge CLK) FIRST_OUT <= mclt16x16_i.pre_first_out;
    
    integer n7, cntr7, diff7, diff7a; // SuppressThisWarning VEditor : assigned in $readmem() system task
    wire [OUT_WIDTH-1:0] java_data_dtt_rot = java_dtt_rot[{n7[1:0], cntr7[1],cntr7[0],cntr7[7:2]}];  //java_dtt_rot0[{cntr7[1],cntr7[0],cntr7[7:2]}];
    initial begin
        while (RST) @(negedge CLK);
        for (n7 = 0; n7 < 4; n7 = n7+1) begin
            while (!FIRST_OUT) begin
                @(negedge CLK);
            end
            for (cntr7 = 0; cntr7 < 256; cntr7 = cntr7 + 1) begin
                #1;
                diff7 = dout - java_data_dtt_rot;
                if (n7 < 1) diff7a = dout - java_data_dtt_rot; // TEMPORARY, while no other data
                @(negedge CLK);
            end
        end
    end
    
    
    
    mclt16x16 #(
        .SHIFT_WIDTH     (SHIFT_WIDTH),
        .COORD_WIDTH     (COORD_WIDTH),
        .PIXEL_WIDTH     (PIXEL_WIDTH),
        .WND_WIDTH       (WND_WIDTH),
        .OUT_WIDTH       (OUT_WIDTH),
        .DTT_IN_WIDTH    (DTT_IN_WIDTH),
        .TRANSPOSE_WIDTH (TRANSPOSE_WIDTH),
        .OUT_RSHIFT      (OUT_RSHIFT),
        .OUT_RSHIFT2     (OUT_RSHIFT2),
        .DSP_B_WIDTH     (DSP_B_WIDTH),
        .DSP_A_WIDTH     (DSP_A_WIDTH),
        .DSP_P_WIDTH     (DSP_P_WIDTH),
        .DEAD_CYCLES     (DEAD_CYCLES)
    ) mclt16x16_i (
        .clk             (CLK),         // input
        .rst             (RST),         // input
        .start           (start),       // input
        .x_shft          (x_shft),      // input[6:0] 
        .y_shft          (y_shft),      // input[6:0] 
        .bayer           (bayer_r),     // input[3:0] 
        .mpixel_re       (mpixel_re),   // output
        .mpixel_page     (mpixel_page), // output  //!< increment pixel page after this
        
        .mpixel_a        (mpixel_a),    // output[7:0] 
        .mpixel_d        (mpixel_d),    // input[15:0] 
        .pre_busy        (pre_busy_w),    // output
        .pre_last_in     (pre_last_in), // output reg 
        .pre_first_out   (pre_first_out), // output
        .pre_last_out    (pre_last_out), // output
        .out_addr        (out_addr), // output[7:0] 
        .dv              (dv), // output
        .dout            (dout) // output[24:0] signed 
    );

    localparam PIX_ADDR_WIDTH = 9;
    localparam ADDR_DLY = 2;
    reg                   [1:0] TILE_SIZE =   3; // 22;
    reg                         INV_CHECKER = 0;
    reg                   [7:0] TOP_LEFT =    69; // center
    reg                   [1:0] VALID_ROWS =  3;  // for green component
    reg                   [6:0] CLT_SHIFT_X = 'h62; // shift_x, 7 bits
    reg                   [6:0] CLT_SHIFT_Y = 'h0a;  // shift_y, 7 bits
    wire                  [8:0] PIX_ADDR9;
    wire                        PIX_RE;
    wire                        PIX_PAGE; // copy page address // SuppressThisWarning VEditor - not yet used
    wire    [PIXEL_WIDTH-1 : 0] PIX_D = PIX_VALID ? PIX_R2 : {PIXEL_WIDTH{1'bz}};  
    reg     [PIXEL_WIDTH-1 : 0] PIX_R;
    reg     [PIXEL_WIDTH-1 : 0] PIX_R2;
    reg                         PIX_REG;
    reg                         PIX_VALID;
    reg   [PIXEL_WIDTH-1 : 0]   bayer_tiles[0:1023]; // SuppressThisWarning VEditor : assigned in $readmem() system task
    

    always @ (posedge CLK) if (!RST) begin
        PIX_REG <=        PIX_RE;
        PIX_VALID <=      PIX_REG; 
        if (PIX_RE)    PIX_R <= bayer_tiles[{1'b0, PIX_ADDR9}];
        if (PIX_REG)   PIX_R2 <= PIX_R; 
    end

    initial begin
        $readmemh("input_data/clt_tile22_x1489_y951.dat",bayer_tiles);
    end
    
    mclt16x16_bayer #(
        .SHIFT_WIDTH     (SHIFT_WIDTH),
        .PIX_ADDR_WIDTH  (PIX_ADDR_WIDTH),
        .COORD_WIDTH     (COORD_WIDTH),
        .PIXEL_WIDTH     (PIXEL_WIDTH),
        .WND_WIDTH       (WND_WIDTH),
        .OUT_WIDTH       (OUT_WIDTH),
        .DTT_IN_WIDTH    (DTT_IN_WIDTH),
        .TRANSPOSE_WIDTH (TRANSPOSE_WIDTH),
        .OUT_RSHIFT      (OUT_RSHIFT),
        .OUT_RSHIFT2     (OUT_RSHIFT2),
        .DSP_B_WIDTH     (DSP_B_WIDTH),
        .DSP_A_WIDTH     (DSP_A_WIDTH),
        .DSP_P_WIDTH     (DSP_P_WIDTH),
        .DEAD_CYCLES     (DEAD_CYCLES)
    ) mclt_bayer_fold_i (
        .clk         (CLK),         // input
        .rst         (RST),         // input
        .start       (start),       // input
        .tile_size   (TILE_SIZE),   // input[1:0] 
        .inv_checker (INV_CHECKER), // input
        .top_left    (TOP_LEFT),    // input[7:0] 
        .valid_rows  (VALID_ROWS),  // input[1:0] 
        .x_shft      (CLT_SHIFT_X), // input[6:0] 
        .y_shft      (CLT_SHIFT_Y), // input[6:0] 
        .pix_addr    (PIX_ADDR9),   // output[8:0] 
        .pix_re      (PIX_RE),      // output
        .pix_page    (PIX_PAGE),    // output
        .pix_d       (PIX_D)        // input[15:0] 
    );



endmodule

mclt_test_03.sav

0 → 100644
+1729 −0

File added.

Preview size limit exceeded, changes collapsed.