// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: niu_rdmc_wr_dp_sm.v
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program 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; version 2 of the License.
// This program 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, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
module niu_rdmc_wr_dp_sm (
input rdmc_wr_req_accept_hdr;
input rdmc_wr_req_accept_zcp;
input muxed_ipp_data_ack;
input pkt_req_cnt_done_r;
input pkt_req_cnt_done_r1;
input pkt_req_cnt_done_r2;
input[1:0] jmb_pkt_type; //01:use one buf, 10:use two buf, 11:use three buf
input[1:0] zcp_wr_type; //00:one dmaw, ... 11:four dmaw
output[1:0] rdmc_wr_data_sel;
output rdmc_wr_data_valid_sm;
output rdmc_wr_data_comp_sm;
output rdmc_wr_last_comp_sm;
output[4:0] wr_dp_sm_state;
reg[1:0] rdmc_wr_data_sel;
reg rdmc_wr_data_valid_sm;
reg rdmc_wr_data_comp_sm;
reg rdmc_wr_last_comp_sm;
reg is_rdmc_wr_req_accept;
wire[4:0] wr_dp_sm_state = state;
WAIT_ZCP_HDR_LAST = 5'd7,
WAIT_ZCP_MID_LAST = 5'd11,
WAIT_ZCP_DATA_LAST = 5'd14,
ZCP_WR_DATA_LAST = 5'd15;
always @ (state or full_hdr_r1 or ipp_data_req_dly2 or
jmb_pkt_type or jmb_pkt_done or
zcopy_mode or zcp_wr_done or
rdmc_wr_req_accept_hdr or rdmc_wr_req_accept_zcp or
is_rdmc_wr_req_accept or muxed_ipp_data_ack or
pkt_req_cnt_done or pkt_req_cnt_done_r or
pkt_req_cnt_done_r1 or pkt_req_cnt_done_r2 or
rdmc_cal_eop_r or ipp_next_eop or ipp_fzcp_eop)
rdmc_wr_data_sel = 2'b00;
rdmc_wr_data_valid_sm = 1'b0;
rdmc_wr_data_comp_sm = 1'b0;
rdmc_wr_last_comp_sm = 1'b0;
case (state) //synopsys parallel_case full_case
if (rdmc_wr_req_accept_hdr)
if (ipp_data_req_dly2 & full_hdr_r1)
rdmc_wr_data_sel = 2'b00;
rdmc_wr_data_valid_sm = 1'b1;
else if (muxed_ipp_data_ack & ipp_data_req_dly2)
rdmc_wr_data_sel = 2'b01;
rdmc_wr_data_valid_sm = 1'b1;
else if (jmb_pkt_type[1])
next_state = JMB_WR_DATA;
rdmc_wr_data_sel = 2'b01;
rdmc_wr_data_valid_sm = 1'b1;
next_state = JMB_WR_DATA;
if (muxed_ipp_data_ack & pkt_req_cnt_done_r2 & rdmc_cal_eop_r)//second buf has only one transfer,
begin //no need to read ipp
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
next_state = WAIT_DATA_LAST;
else if (muxed_ipp_data_ack & pkt_req_cnt_done_r2 & jmb_pkt_type[0] & !jmb_pkt_done)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
else if (muxed_ipp_data_ack & pkt_req_cnt_done_r2)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
else if (muxed_ipp_data_ack)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b0;
if (muxed_ipp_data_ack & rdmc_cal_eop_r & pkt_req_cnt_done_r1)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = WR_DATA_LAST;
else if (muxed_ipp_data_ack & rdmc_cal_eop_r & pkt_req_cnt_done_r2)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
rdmc_wr_last_comp_sm = 1'b1;
if (rdmc_wr_req_accept_hdr | is_rdmc_wr_req_accept)
else if (muxed_ipp_data_ack & rdmc_cal_eop_r)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = WAIT_DATA_LAST;
else if (muxed_ipp_data_ack)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b0;
if (pkt_req_cnt_done_r | pkt_req_cnt_done_r1 | pkt_req_cnt_done)
next_state = WR_DATA_LAST;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
rdmc_wr_last_comp_sm = 1'b1;
if (rdmc_wr_req_accept_hdr | is_rdmc_wr_req_accept)
if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r1)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = ZCP_WR_HDR_LAST;
else if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r2)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
else if (muxed_ipp_data_ack & ipp_fzcp_eop)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = WAIT_ZCP_HDR_LAST;
else if (muxed_ipp_data_ack)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b0;
if (pkt_req_cnt_done_r | pkt_req_cnt_done_r1 | pkt_req_cnt_done)
next_state = ZCP_WR_HDR_LAST;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
if (rdmc_wr_req_accept_zcp & zcp_wr_done & ipp_next_eop)
next_state = WAIT_ZCP_DATA_LAST;
else if (rdmc_wr_req_accept_zcp & zcp_wr_done)
next_state = ZCP_WR_DATA;
else if (rdmc_wr_req_accept_zcp & ipp_next_eop)
next_state = WAIT_ZCP_MID_LAST;
else if (rdmc_wr_req_accept_zcp)
if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r1)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = ZCP_WR_MID_LAST;
else if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r2)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
else if (muxed_ipp_data_ack & ipp_fzcp_eop)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = WAIT_ZCP_MID_LAST;
else if (muxed_ipp_data_ack)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b0;
if (pkt_req_cnt_done_r | pkt_req_cnt_done_r1 | pkt_req_cnt_done)
next_state = ZCP_WR_MID_LAST;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r1)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = ZCP_WR_DATA_LAST;
else if (muxed_ipp_data_ack & ipp_fzcp_eop & pkt_req_cnt_done_r2)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
rdmc_wr_last_comp_sm = 1'b1;
if (rdmc_wr_req_accept_hdr | is_rdmc_wr_req_accept)
else if (muxed_ipp_data_ack & ipp_fzcp_eop)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
next_state = WAIT_ZCP_DATA_LAST;
else if (muxed_ipp_data_ack)
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b0;
if (pkt_req_cnt_done_r | pkt_req_cnt_done_r1 | pkt_req_cnt_done)
next_state = ZCP_WR_DATA_LAST;
rdmc_wr_data_sel = 2'b10;
rdmc_wr_data_valid_sm = 1'b1;
rdmc_wr_data_comp_sm = 1'b1;
rdmc_wr_last_comp_sm = 1'b1;
if (rdmc_wr_req_accept_hdr | is_rdmc_wr_req_accept)
ready_cycle_reg <= ready_cycle;
wire ready_cycle_p = ready_cycle & !ready_cycle_reg;
is_rdmc_wr_req_accept <= 1'b0;
else if (rdmc_wr_req_accept_hdr)
is_rdmc_wr_req_accept <= 1'b1;
is_rdmc_wr_req_accept <= 1'b0;
is_rdmc_wr_req_accept <= is_rdmc_wr_req_accept;
zcp_wr_cnt <= zcp_wr_cnt + 2'd1;
zcp_wr_cnt <= zcp_wr_cnt;
assign zcp_wr_done = (zcp_wr_cnt == zcp_wr_type);
else if (jmb_pkt_done_sm)
jmb_pkt_done <= jmb_pkt_done;