/********************************************** _ _ Cook Darwin __
_ descript: author : Cook.Darwin Version: VERA.0.0 creaded: 2017/2/22 madified: ***********************************************/ `timescale 1ns/1ps import DataInterfacePkg::*; (* axi_stream = “true” *) module axi_stream_partition (
input valve, // [1] open [0] close input [31:0] partition_len, //[0] mean 1 len output logic req_new_len, //it is usefull, when last stream length is only one (* up_stream = "true" *) axi_stream_inf.slaver axis_in, (* down_stream = "true" *) axi_stream_inf.master axis_out
);
wire clock,rst_n,clk_en; assign clock = axis_in.aclk; assign rst_n = axis_in.aresetn; assign clk_en = axis_in.aclken;
// localparam DSIZE = ;
axi_stream_inf #(
.DSIZE (axis_in.DSIZE )
)axis_valve(
.aclk (clock ), .aresetn (rst_n ), .aclken (clk_en )
);
axis_valve axis_valve_inst( /* input */ .button (valve ), /* axi_stream_inf.slaver */ .axis_in (axis_valve ), /* axi_stream_inf.master */ .axis_out (axis_out ) );
assign axis_in.axis_tready = axis_valve.axis_tready;
logic [31:0] bcnt;
always@(posedge clock,negedge rst_n)
if(~rst_n) bcnt <= '0; else begin if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken && axis_valve.axis_tlast) bcnt <= '0; else if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken) if(bcnt == (partition_len-1)) bcnt <= '0; else bcnt <= bcnt+1'b1; else bcnt <= bcnt; end
logic body_new_last;
always@(posedge clock,negedge rst_n)
if(~rst_n) axis_valve.axis_tvalid <= 1'b0; else begin axis_valve.axis_tvalid <= pipe_valid_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid); // if(axis_in.axis_tvalid && axis_in.axis_tready) // axis_valve.axis_tvalid <= 1'b1; // else if(axis_valve.axis_tvalid && axis_valve.axis_tready) // axis_valve.axis_tvalid <= 1'b0; // else axis_valve.axis_tvalid <= axis_valve.axis_tvalid; end
logic last_record;
always@(posedge clock,negedge rst_n)
if(~rst_n) last_record <= 1'b0; else begin if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken && axis_valve.axis_tlast) last_record <= 1'b0; else if(axis_in.axis_tready && axis_in.axis_tvalid && axis_in.aclken && axis_in.axis_tlast) last_record <= 1'b1; else last_record <= last_record; end
always@(posedge clock,negedge rst_n)
if(~rst_n) body_new_last <= 1'b0; else begin // if(last_record) // body_new_last <= 1'b1; // else if(axis_in.axis_tready && axis_in.axis_tvalid && axis_in.aclken && axis_in.axis_tlast) body_new_last <= 1'b1; else if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken && (bcnt == (partition_len-1)) ) body_new_last <= 1'b1; else if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken && body_new_last) body_new_last <= 1'b0; else body_new_last <= body_new_last; end
assign axis_valve.axis_tlast = body_new_last;
always@(posedge clock,negedge rst_n)
if(~rst_n) axis_valve.axis_tdata = '0; else begin if(axis_in.DSIZE>axis_valve.DSIZE) // axis_valve.axis_tdata[0] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_valve.axis_tdata[0]); foreach(axis_valve.axis_tdata[i]) axis_valve.axis_tdata[i] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_in.axis_tdata[i],axis_valve.axis_tdata[i]); else // axis_valve.axis_tdata[0] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_valve.axis_tdata[0]); foreach(axis_in.axis_tdata[i]) axis_valve.axis_tdata[i] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_in.axis_tdata[i],axis_valve.axis_tdata[i]); end
always@(posedge clock,negedge rst_n)
if(~rst_n) axis_valve.axis_tkeep = '0; else begin if(axis_in.DSIZE>axis_valve.DSIZE) foreach(axis_valve.axis_tkeep[i]) axis_valve.axis_tkeep[i] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_valve.axis_tkeep[i],axis_valve.axis_tkeep[i]); else foreach(axis_in.axis_tdata[i]) axis_valve.axis_tkeep[i] <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_valve.axis_tkeep[i],axis_valve.axis_tkeep[i]); end
always@(posedge clock,negedge rst_n)
if(~rst_n) axis_valve.axis_tuser = '0; else begin axis_valve.axis_tuser <= pipe_data_func(axis_in.axis_tvalid,axis_valve.axis_tready,axis_valve.axis_tvalid,axis_valve.axis_tuser,axis_valve.axis_tuser); end
always@(posedge clock,negedge rst_n)
if(~rst_n) req_new_len <= 1'b0; else begin if(axis_valve.axis_tready && axis_valve.axis_tvalid && axis_valve.aclken) if(bcnt == (partition_len-2)) req_new_len <= 1'b1; else req_new_len <= 1'b0; else req_new_len <= 1'b0; end
endmodule