/********************************************************           
    * An interface to assemble bytes into 64 bits.         *   
    *                                                      *   
    * Author:  Wei Liu                                     *     
    ********************************************************/  
module intf_64bit (
    input clock,
    input reset,
    input enable,
    input wire [15:0] pkt_len,
    input wire [31:0] byte_index,
    input wire [7:0] byte_in,
    input wire byte_strobe,

    output reg [63:0] data_out,
    output reg output_strobe
);


    reg byte_strobe_delay ;
    reg [63:0] dout ; 
    always @ (posedge clock)
    begin
        byte_strobe_delay <= byte_strobe ;
        //data_out <= dout ;
    end
    
    always @ (posedge clock)
    begin
        if(reset) begin
            dout <= 64'h0 ;
            data_out <= 64'h0;
            output_strobe <= 1'b0 ;
        end  
        else if(enable) begin
            output_strobe <= 1'b0 ;
            data_out <= dout ;
            if(byte_strobe) begin
                dout <= {byte_in, dout[63:8]} ;
            end
            if(byte_strobe_delay) begin
                if(byte_index[2:0] == 3'b0 && byte_index[31:3] > 0 )
                    output_strobe <= 1'b1 ;
                else if (pkt_len == byte_index) begin
                    output_strobe <= 1'b1 ;
                    case (pkt_len[2:0])
                        3'b000: data_out <= dout;
                        3'b001: begin data_out <= {56'b0,dout[63:56]}; dout <= {56'b0,dout[63:56]}; end
                        3'b010: begin data_out <= {48'b0,dout[63:48]}; dout <= {48'b0,dout[63:48]}; end
                        3'b011: begin data_out <= {40'b0,dout[63:40]}; dout <= {40'b0,dout[63:40]}; end
                        3'b100: begin data_out <= {32'b0,dout[63:32]}; dout <= {32'b0,dout[63:32]}; end
                        3'b101: begin data_out <= {24'b0,dout[63:24]}; dout <= {24'b0,dout[63:24]}; end
                        3'b110: begin data_out <= {16'b0,dout[63:16]}; dout <= {16'b0,dout[63:16]}; end
                        3'b111: begin data_out <= {8'b0,dout[63:8]};   dout <= {8'b0,dout[63:8]};   end  
                        default: data_out <= dout;
                    
                    endcase
                
                end
                  
            end
        
        end
    
    end

endmodule