/********************************************** _ _ Cook Darwin __

_______________________________________descript: author : Cook.Darwin Version: VERA.0.0

build from axi_streams_scaler

Version: VERA.0.1

use data combin VERA.1.0

creaded: 2016/12/9 madified: ***********************************************/ `timescale 1ns/1ps (* axi_stream = “true” *) module axi_streams_combin #(

parameter   MODE = "BOTH",      //HEAD END
parameter   CUT_OR_COMBIN_BODY  = "ON", //ON OFF
parameter   DSIZE = 8

)(

input [15:0]               new_body_len,
input                      trigger_signal,
axi_stream_inf.slaver      head_inf,
(* up_stream = "true" *)
axi_stream_inf.slaver      body_inf,
axi_stream_inf.slaver      end_inf,
(* down_stream = "true" *)
axi_stream_inf.master      m00

);

initial begin

$error("The module `axi_streams_combin` has be abandon, please use `axi_streams_combin_A1`");
$stop;

end

import DataInterfacePkg::*;

wire clock,rst_n,clk_en; assign clock = head_inf.aclk; assign rst_n = head_inf.aresetn; assign clk_en = head_inf.aclken;

localparam KSIZE = (DSIZE/8 > 0)? DSIZE/8 : 1;

data_inf #(.DSIZE(DSIZE+1+1+KSIZE) ) s00_data_inf (); data_inf #(.DSIZE(DSIZE+1+1+KSIZE) ) s01_data_inf (); data_inf #(.DSIZE(DSIZE+1+1+KSIZE) ) s02_data_inf (); data_inf #(.DSIZE(DSIZE+1+1+KSIZE) ) m00_data_inf ();

logic body_new_last; logic body_mix_last; logic body_pass_last; logic body_ctrl_last;

assign body_mix_last = (CUT_OR_COMBIN_BODY==“OFF” || (MODE==“HEAD”)) ? body_inf.axis_tlast : body_new_last;

always@(*)

if(MODE=="HEAD")begin
    if(CUT_OR_COMBIN_BODY == "OFF")
            body_pass_last  = body_inf.axis_tlast;
    else    body_pass_last  = body_new_last;
end else    body_pass_last  = 1'b0;

always@(*)

if(MODE=="HEAD")begin
    if(CUT_OR_COMBIN_BODY=="OFF")
            body_ctrl_last  = body_inf.axis_tlast;
    else    body_ctrl_last  = body_new_last;
end else begin
    if(CUT_OR_COMBIN_BODY=="OFF")
            body_ctrl_last  = body_inf.axis_tlast;
    else    body_ctrl_last  = body_new_last;
end

assign s00_data_inf.valid = head_inf.axis_tvalid; assign s00_data_inf.data = head_inf.axis_tdata; assign s00_data_inf.data = 1'b0; assign s00_data_inf.data = head_inf.axis_tuser; assign s00_data_inf.data = head_inf.axis_tkeep; assign head_inf.axis_tready = s00_data_inf.ready;

assign s01_data_inf.valid = body_inf.axis_tvalid; assign s01_data_inf.data = body_inf.axis_tdata; assign s01_data_inf.data = body_pass_last; assign s01_data_inf.data = body_inf.axis_tuser; assign s01_data_inf.data = body_inf.axis_tkeep; assign body_inf.axis_tready = s01_data_inf.ready;

assign s02_data_inf.valid = end_inf.axis_tvalid; assign s02_data_inf.data = end_inf.axis_tdata; assign s02_data_inf.data = end_inf.axis_tlast; assign s02_data_inf.data = end_inf.axis_tuser; assign s02_data_inf.data = end_inf.axis_tkeep; assign end_inf.axis_tready = s02_data_inf.ready;

logic bcnt;

always@(posedge clock/*,negedge rst_n*/)

if(~rst_n)  bcnt    <= 16'd0;
else begin
    if(CUT_OR_COMBIN_BODY=="ON")begin
        if(body_inf.axis_tready && body_inf.axis_tvalid && body_inf.aclken)
            if(bcnt == (new_body_len-1))
                    bcnt    <= 16'd0;
            else    bcnt    <= bcnt+1'b1;
        else
            bcnt   <= bcnt;
    end else begin
        bcnt <= 16'd0;
    end
end

always@(posedge clock/*,negedge rst_n*/)

if(~rst_n)  body_new_last   <= 1'b0;
else begin
    // if((bcnt==(new_body_len-2) && body_inf.axis_tvalid && body_inf.axis_tready))
    //         body_new_last   <= 1'b1;
    // else    body_new_last   <= 1'b0;
    if(new_body_len < 2)
            body_new_last <= 1'b1;  
    else    body_new_last <= pipe_last_func(body_inf.axis_tvalid,body_inf.axis_tready,body_new_last,(bcnt==(new_body_len-2)));
end

// // data_streams_combin #( data_streams_combin_A1 #(

.MODE       (MODE   ),       //HEAD END BOTH
.DSIZE      (DSIZE+1+1+KSIZE  )

)data_streams_combin_inst( /* input */ .clock (clock ), /* input */ .rst_n (rst_n ), /* input */ .clk_en (clk_en ), /* input */ .trigger_signal (trigger_signal ), /* input */ .head_last (head_inf.axis_tlast ), /* input */ .body_last (body_ctrl_last ), /* input */ .end_last (end_inf.axis_tlast ), /* data_inf.slaver */ .head_inf (s00_data_inf ), /* data_inf.slaver */ .body_inf (s01_data_inf ), /* data_inf.slaver */ .end_inf (s02_data_inf ), /* data_inf.master */ .m00 (m00_data_inf ) );

assign m00.axis_tdata = m00_data_inf.data; assign m00.axis_tvalid = m00_data_inf.valid; assign m00.axis_tlast = m00_data_inf.data; assign m00.axis_tuser = m00_data_inf.data; assign m00_data_inf.ready = m00.axis_tready; assign m00.axis_tkeep = m00_data_inf.data;

endmodule