// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: dmu_clu_ctm_cmdctlfsm.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 dmu_clu_ctm_cmdctlfsm
proc_pio_err, // BP n2 4-28-05
cl2di_rd_en, // BP n2 5-12-05
// synopsys sync_set_reset "rst_l"
// >>>>>>>>>>>>>>>>>>>>>>>>> Parameter Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------
// --------------------------------------------------------
// parameter STATE_NUM = 10;
parameter STATE_NUM = 13;
// --------------------------------------------------------
// --------------------------------------------------------
parameter // summit enum cur_enum
// --------------------------------------------------------
// ICR-TCR ARBITER PARAMETERS
// --------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> Port Declarations <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------
// --------------------------------------------------------
// --------------------------------------------------------
// --------------------------------------------------------
input diu_dma_bufmgmt_bsy;
input diu_eqw_bufmgmt_bsy;
input uns_req_crdt_avail;
input ds2cl_stall; // for N2 dmu quiescing
// --------------------------------------------------------
// --------------------------------------------------------
output proc_pio_err; // BP n2 4-28-05, force 0 data on pio err cpl
output cl2di_rd_en; // BP n2 5-12-05, rd enable to diu ram for power savings
output [3:0] cmdctlfsm_state;
// >>>>>>>>>>>>>>>>>>>>>>>>> Data Type Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
// ~~~~~~~~~~~~~~~~~~~~~~~~~ REGISTERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ********** Flops **********
reg [(STATE_NUM - 1):0] cur_state;
// ********** Non-Flops ******
reg [(STATE_NUM - 1):0] nxt_state;
// ~~~~~~~~~~~~~~~~~~~~~~~~~ NETS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wire [(N-1):0] higher_pri_reqs;
// >>>>>>>>>>>>>>>>>>>>>>>>> 0-in Checkers <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// ----- ARBITER CHECKER ------------------------------------------
// ----- STATE-MACHINE CHECKERS -----------------------------------
// 0in one_hot -var cur_state
-val (13'b1 << REQ_4DB_WAIT1)
-next (13'b1 << REQ_4DB_WAIT2)
-val (13'b1 << REQ_4DB_WAIT2)
-next (13'b1 << REQ_4DB_WAIT2)
-val (13'b1 << REQ_4DB_ENQ)
-val (13'b1 << REQ_1DB_WAIT1)
-next (13'b1 << REQ_1DB_WAIT2)
-val (13'b1 << REQ_1DB_WAIT2)
-next (13'b1 << REQ_1DB_WAIT2)
-val (13'b1 << REQ_1DB_ENQ)
-val (13'b1 << CPL_4DB_WAIT1)
-next (13'b1 << CPL_4DB_WAIT2)
-val (13'b1 << CPL_4DB_WAIT2)
-next (13'b1 << CPL_4DB_WAIT2)
-val (13'b1 << CPL_4DB_ENQ)
-val (13'b1 << CPL_1DB_WAIT1)
-next (13'b1 << CPL_1DB_WAIT2)
-val (13'b1 << CPL_1DB_WAIT2)
-next (13'b1 << CPL_1DB_WAIT2)
-val (13'b1 << CPL_1DB_ENQ)
// >>>>>>>>>>>>>>>>>>>>>>>>> RTL Model <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------
// --------------------------------------------------------
assign cmdctlfsm_idle = (cur_state[IDLE] & ~d2j_data_vld &
(mm2cl_tcr_req ~^ cl2mm_tcr_ack));
// --------------------------------------------------------
// --------------------------------------------------------
// encode one-hot current_state vector for debug port
always @(cur_state[(STATE_NUM - 1):1])
enc_state[0] = (cur_state[1] | cur_state[3] | cur_state[5] |
cur_state[7] | cur_state[9]);
enc_state[1] = (cur_state[2] | cur_state[3] | cur_state[6] |
enc_state[2] = (cur_state[4] | cur_state[5] | cur_state[6] |
enc_state[3] = (cur_state[8] | cur_state[9] | cur_state[10] |
cur_state[11] | cur_state[12]);
// output cmdctlfsm debug bus
assign cmdctlfsm_state = enc_state;
// --------------------------------------------------------
// ICR-TCR Priority Arbiter
// --------------------------------------------------------
// assign cur_state_no_grnt = ( d2j_dvld_s3 & ~d2j_dvld_s2);
//BP n2 4-27-05 added in pio err because sio expects data for all pio cpl's
assign cur_state_no_grnt = ( d2j_dvld_s3 & ~d2j_dvld_s2) | (proc_pio_err_d);
// BP 2-14-05 for N2 dbg quiescing, added ds2cl_stall
assign icr_req = (~icr_fifo_empty && ~ds2cl_stall) && ~cur_state_no_grnt;
assign tcr_req = (mm2cl_tcr_req ^ cl2mm_tcr_ack) & nxt_tag_avail & ~ds2cl_stall;
// assign icr_req = ~icr_fifo_empty && ~cur_state_no_grnt;
// assign tcr_req = (mm2cl_tcr_req ^ cl2mm_tcr_ack) & nxt_tag_avail;
assign req = {icr_req, tcr_req};
// simple priority arbiter
assign higher_pri_reqs[N-1:1] = higher_pri_reqs[N-2:0] | req[N-2:0];
assign higher_pri_reqs[0] = 1'b0;
assign grant[N-1:0] = req[N-1:0] & ~higher_pri_reqs[N-1:0];
assign {icr_grnt, tcr_grnt} = grant;
// --------------------------------------------------------
// --------------------------------------------------------
assign proc_mwr = mwr_vld & ~diu_dma_empty;
assign proc_p16 = pio16_vld & ~diu_pio_empty;
assign proc_p64 = pio64_vld & ~diu_pio_empty;
// assign proc_4db_req = proc_mwr | eqwr_vld | mdo_vld;
assign proc_4db_req = proc_mwr | eqwr_vld ;
assign proc_1db_req = mdo_vld ;
// --------------------------------------------------------
// --------------------------------------------------------
always @(cur_state or icr_grnt or icr_fifo_empty or proc_p16 or proc_p64 or
proc_4db_req or nxt_tag_avail or proc_1db_req)
nxt_state = {STATE_NUM{1'b0}};
case (1'b1) // synopsys parallel_case
///////////////////////////////////////////////////////////////////////
casez ({icr_fifo_empty, proc_p16, proc_p64, proc_4db_req,proc_1db_req})
// 0in < case -parallel -full
5'b0_0000 : nxt_state[IDLE] = 1'b1;
5'b0_0010 : nxt_state[REQ_4DB_WAIT1] = 1'b1;
5'b0_0100 : nxt_state[CPL_4DB_WAIT1] = 1'b1;
5'b0_1000 : nxt_state[CPL_1DB_WAIT1] = 1'b1;
5'b0_0001 : nxt_state[REQ_1DB_WAIT1] = 1'b1;
///////////////////////////////////////////////////////////////////////
// ---------- 4 Data-Beat Request ---------------------------
cur_state[REQ_4DB_WAIT1] :
nxt_state[REQ_4DB_WAIT2] = 1'b1;
cur_state[REQ_4DB_WAIT2] :
casez ({icr_grnt, nxt_tag_avail})
// 0in < case -parallel -full
2'b10 : nxt_state[REQ_4DB_WAIT2] = 1'b1;
2'b11 : nxt_state[REQ_4DB_ENQ] = 1'b1;
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// ---------- 1 Data-Beat Request ---------------------------
cur_state[REQ_1DB_WAIT1] :
nxt_state[REQ_1DB_WAIT2] = 1'b1;
cur_state[REQ_1DB_WAIT2] :
casez ({icr_grnt, nxt_tag_avail})
// 0in < case -parallel -full
2'b10 : nxt_state[REQ_1DB_WAIT2] = 1'b1;
2'b11 : nxt_state[REQ_1DB_ENQ] = 1'b1;
///////////////////////////////////////////////////////////////////////
// ---------- 4 Data-Beat Completion ------------------------
cur_state[CPL_4DB_WAIT1] :
nxt_state[CPL_4DB_WAIT2] = 1'b1;
cur_state[CPL_4DB_WAIT2] :
nxt_state[CPL_4DB_ENQ] = 1'b1;
nxt_state[CPL_4DB_WAIT2] = 1'b1;
///////////////////////////////////////////////////////////////////////
// ---------- 1 Data-Beat Completion ------------------------
cur_state[CPL_1DB_WAIT1] :
nxt_state[CPL_1DB_WAIT2] = 1'b1;
cur_state[CPL_1DB_WAIT2] :
nxt_state[CPL_1DB_ENQ] = 1'b1;
nxt_state[CPL_1DB_WAIT2] = 1'b1;
///////////////////////////////////////////////////////////////////////
// --------------------------------------------------------
// --------------------------------------------------------
// summit state_vector cur_state enum cur_enum
// current state assignment
cur_state <= {STATE_NUM{1'b0}};
// --------------------------------------------------------
// --------------------------------------------------------
// ----- process tablewalk request -------------------------
// assign proc_tcr = (tcr_grnt & ~d2j_dvld_s2);
assign proc_tcr = (tcr_grnt & ~d2j_dvld_s3);
// ----- process unsupported request -----------------------
assign proc_uns = ~icr_fifo_empty & uns_vld & uns_req_crdt_avail;
// ----- process dma mem read request ----------------------
// process a valid dma read command record
// assign proc_dma_rd = (icr_grnt & mrd_vld & nxt_tag_avail & ~d2j_dvld_s2);
assign proc_dma_rd = (icr_grnt & mrd_vld & nxt_tag_avail & ~d2j_dvld_s3);
// current dma read is for the first CL of a packet
assign proc_dma_rd_1stcl = (icr_clsts & proc_dma_rd & dou_space_avail);
// current dma read is for a remaining CL of a packet
assign proc_dma_rd_clrmdr = (~icr_clsts & proc_dma_rd);
assign dma_dptr_req = (proc_dma_rd_1stcl | proc_dma_rd_clrmdr);
// ----- process termination records -----------------------
assign drop_rcd = (~icr_fifo_empty &
((~diu_dma_bufmgmt_bsy & mwr_err) |
(~diu_eqw_bufmgmt_bsy & (eqwr_err | null_vld))));
// ----- process pio cpl errors ----------------------------
// assign proc_pio_err = icr_grnt & pio_err & ~d2j_dvld_s2;
assign proc_pio_err = icr_grnt & pio_err & ~d2j_dvld_s3;
//BP 4-27-05 add an extra cycle after pio err cpl's because sii expects this
proc_pio_err_d <= proc_pio_err;
// ----- generate icr fifo dequeue -------------------------
assign icr_fifo_rd = (nxt_state[REQ_4DB_ENQ] | nxt_state[CPL_4DB_ENQ] |
nxt_state[CPL_1DB_ENQ] | proc_uns | dma_dptr_req |
//BP 4-27-05 nxt_state[REQ_1DB_ENQ] | drop_rcd | proc_pio_err);
nxt_state[REQ_1DB_ENQ] | drop_rcd | proc_pio_err_d);
// ----- ctm control ---------------------------------------
// fetch next tag - update request credits
assign nxt_tag_req = nxt_state[REQ_4DB_ENQ] | nxt_state[REQ_1DB_ENQ] | proc_tcr | dma_dptr_req;
// select for cmd/addr/ctag gen; icr = 1'b0, tcr = 1'b1
assign cmd_req_sel = proc_tcr;
// unsupported request enq
ctm2crm_rcd_enq <= proc_uns;
// ----- dmc-2-jbc interface control -----------------------
d2j_cmd_vld <= (nxt_state[REQ_4DB_ENQ] | nxt_state[CPL_4DB_ENQ] |
nxt_state[CPL_1DB_ENQ] | proc_tcr | dma_dptr_req |
nxt_state[REQ_1DB_ENQ] | proc_pio_err);
// shift reg to generate d2j_data_vld : 1 or 4 cycles
else if (nxt_state[REQ_4DB_ENQ] | nxt_state[CPL_4DB_ENQ])
begin // dmawr(full/part), eqwr, mdo, pio64_cpl - 4 cycles
else if (nxt_state[CPL_1DB_ENQ] | nxt_state[REQ_1DB_ENQ])
begin // pio16_cpl - 1 cycle, and new mondo int's
d2j_dvld_s1 <= d2j_dvld_s0;
d2j_dvld_s2 <= d2j_dvld_s1;
d2j_dvld_s3 <= d2j_dvld_s2;
// BP n2 5-13-05 create a rd enable for the diu ram for power savings
assign cl2di_rd_en = ~cmdctlfsm_idle; // 0in assert_leader -leader cl2di_rd_en -follower d2j_data_vld -min 2 -max 2
assign d2j_data_vld = d2j_dvld_s3;
// ----- clu-2-mmu interface control -----------------------
// generate tcr acknowledge
cl2mm_tcr_ack <= ~cl2mm_tcr_ack;
endmodule // dmu_clu_ctm_cmdctlfsm