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

_ descript: author : Cook.Darwin Version: creaded: 2016/9/22 madified:2017/2/24 ***********************************************/

package DataInterfacePkg;

function logic pipe_valid_func(input up_vld,input down_ready,input curr_vld);

logic   next_vld;
case({up_vld,down_ready,curr_vld})
3'b000: next_vld    = 1'b0;
3'b001: next_vld    = 1'b1;
3'b010: next_vld    = 1'b0;
3'b011: next_vld    = 1'b0;
3'b100: next_vld    = 1'b0;
3'b101: next_vld    = 1'b1;
3'b110: next_vld    = 1'b1;
3'b111: next_vld    = 1'b1;
default:next_vld    = 1'b0;
endcase
return next_vld;

endfunction:pipe_valid_func

function logic pipe_valid_func_force(input up_vld,input down_ready,input curr_vld);

logic   next_vld;
case({up_vld,down_ready,curr_vld})
3'b000: next_vld    = 1'b0;
3'b001: next_vld    = 1'b1;
3'b010: next_vld    = 1'b0;
3'b011: next_vld    = 1'b0;
3'b100: next_vld    = 1'b1;
3'b101: next_vld    = 1'b1;
3'b110: next_vld    = 1'b1;
3'b111: next_vld    = 1'b1;
default:next_vld    = 1'b0;
endcase
return next_vld;

endfunction:pipe_valid_func_force

function logic pipe_data_func(input up_vld,input down_ready,input curr_vld,input up_data,input curr_data);

logic   next_data;
case({up_vld,down_ready,curr_vld})
3'b000: next_data    = curr_data;
3'b001: next_data    = curr_data;
3'b010: next_data    = curr_data;
3'b011: next_data    = curr_data;
3'b100: next_data    = curr_data;
3'b101: next_data    = curr_data;
3'b110: next_data    = up_data;
3'b111: next_data    = up_data;
default:next_data    = curr_data;
endcase
return next_data;

endfunction:pipe_data_func

function logic pipe_last_func(input vld,input ready,input curr_last,input condition);

logic next_last;

if(curr_last)begin
    if(ready && vld)
            next_last     = 1'b0;
    else    next_last     = 1'b1;
end else begin
    if(condition && ready && vld)
            next_last     = 1'b1;
    else    next_last     = 1'b0;
end
return next_last;

endfunction:pipe_last_func

endpackage:DataInterfacePkg