// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: pcie_common_dcc.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 ============================================
csr_ring_out, // ring output
csrbus_wr_data, // csr write data
csrbus_addr, // csr address
csrbus_valid, // csr valid
csrbus_src_bus, // csr source bus
csr_ring_in, // ring input
csrbus_read_data, // csr read data
csrbus_mapped, // csr mapped
csrbus_acc_vio // csr access violation
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
parameter IDLE = 3'b000, // state machine states
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
output [`FIRE_CSR_RING_BITS] csr_ring_out;
output [`FIRE_CSR_DATA_BITS] csrbus_wr_data;
output [`FIRE_CSR_ADDR_BITS] csrbus_addr;
output [`FIRE_CSR_SRCB_BITS] csrbus_src_bus;
input [`FIRE_CSR_RING_BITS] csr_ring_in;
input [`FIRE_CSR_DATA_BITS] csrbus_read_data;
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
wire [`FIRE_CSR_ADDR_BITS] csrbus_addr;
wire [`FIRE_CSR_DATA_BITS] csrbus_wr_data;
wire [`FIRE_CSR_SRCB_BITS] csrbus_src_bus;
wire [`FIRE_CSR_CMND_BITS] rng_cmnd, new_cmnd;
reg [`FIRE_CSR_RING_BITS] rsp_addr, csr_ring_out, nxt_ring_out;
reg [`FIRE_CSR_DATA_BITS] data, rsp_data;
reg [`FIRE_CSR_ADDR_BITS] addr;
reg [`FIRE_CSR_SRCB_BITS] srcb;
reg [`FIRE_CSR_CMND_BITS] rsp_cmnd;
reg [2:0] state, nxt_state;
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// 0in known_driven -var csrbus_wr_data -active csrbus_valid
// 0in change_window -start csrbus_valid -stop ~csrbus_valid -not_in csrbus_wr_data -exclude_stop
// 0in known_driven -var csrbus_addr -active csrbus_valid
// 0in change_window -start csrbus_valid -stop ~csrbus_valid -not_in csrbus_addr -exclude_stop
// 0in known_driven -var csrbus_wr -active csrbus_valid
// 0in change_window -start csrbus_valid -stop ~csrbus_valid -not_in csrbus_wr -exclude_stop
// 0in known_driven -var csrbus_src_bus -active csrbus_valid
// 0in change_window -start csrbus_valid -stop ~csrbus_valid -not_in csrbus_src_bus -exclude_stop
// 0in assert_timer -var (csrbus_valid && csrbus_mapped) -min 1 -active csrbus_valid
// 0in assert_timer -var (csrbus_valid && csrbus_done) -min 1 -active csrbus_valid
// 0in state_transition -var state -val IDLE -next REQ0 RSP0
// 0in state_transition -var state -val REQ0 -next REQ1
// 0in state_transition -var state -val REQ1 -next WAIT
// 0in state_transition -var state -val WAIT -next IDLE REQ0 RSP0 MAPD DONE
// 0in state_transition -var state -val MAPD -next IDLE REQ0 RSP0 DONE
// 0in state_transition -var state -val DONE -next RSP0
// 0in state_transition -var state -val RSP0 -next RSP1
// 0in state_transition -var state -val RSP1 -next IDLE
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
assign rng_cmnd = csr_ring_in[`FIRE_CSR_RING_CMND_BITS];
always @ (state or rng_cmnd or csrbus_mapped or csrbus_done or csrbus_acc_vio) begin
case (state) // synopsys parallel_case
case (rng_cmnd) // synopsys parallel_case
`FIRE_CSR_CMND_RREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_WREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_RRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_WRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_RERR : nxt_state = RSP0;
`FIRE_CSR_CMND_WERR : nxt_state = RSP0;
default : nxt_state = IDLE;
case (rng_cmnd) // synopsys parallel_case
`FIRE_CSR_CMND_RSET : nxt_state = IDLE;
`FIRE_CSR_CMND_RREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_WREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_RRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_WRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_RERR : nxt_state = RSP0;
`FIRE_CSR_CMND_WERR : nxt_state = RSP0;
case ({csrbus_mapped, csrbus_done, csrbus_acc_vio}) // synopsys parallel_case
3'b000 : nxt_state = WAIT;
3'b001 : nxt_state = DONE;
3'b010 : nxt_state = DONE;
3'b011 : nxt_state = DONE;
3'b100 : nxt_state = MAPD;
3'b101 : nxt_state = DONE;
3'b110 : nxt_state = DONE;
3'b111 : nxt_state = DONE;
case (rng_cmnd) // synopsys parallel_case
`FIRE_CSR_CMND_RSET : nxt_state = IDLE;
`FIRE_CSR_CMND_RREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_WREQ : nxt_state = REQ0;
`FIRE_CSR_CMND_RRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_WRSP : nxt_state = RSP0;
`FIRE_CSR_CMND_RERR : nxt_state = RSP0;
`FIRE_CSR_CMND_WERR : nxt_state = RSP0;
case ({csrbus_done, csrbus_acc_vio}) // synopsys parallel_case
2'b00 : nxt_state = MAPD;
2'b01 : nxt_state = DONE;
2'b10 : nxt_state = DONE;
2'b11 : nxt_state = DONE;
always @ (state or nxt_state or sel or wrt) begin
case (state) // synopsys parallel_case
case (nxt_state) // synopsys parallel_case
case (nxt_state) // synopsys parallel_case
assign new_cmnd[2] = csrbus_done | csrbus_acc_vio;
assign new_cmnd[1] = csrbus_acc_vio;
assign new_cmnd[0] = wrt;
always @ (rsp_cmnd or srcb or addr) begin
rsp_addr[`FIRE_CSR_RING_CMND_BITS] = rsp_cmnd;
rsp_addr[`FIRE_CSR_RING_SRCB_BITS] = srcb;
rsp_addr[`FIRE_CSR_RING_ADDR_BITS] = addr;
always @ (sel_out or csr_ring_in or rsp_addr or rsp_data) begin
case (sel_out) // synopsys infer_mux
2'b00 : nxt_ring_out = csr_ring_in;
2'b01 : nxt_ring_out = rsp_addr;
2'b10 : nxt_ring_out = rsp_data[`FIRE_CSR_RDMS_BITS];
2'b11 : nxt_ring_out = rsp_data[`FIRE_CSR_RDLS_BITS];
assign csrbus_addr = addr;
assign csrbus_wr_data = data;
assign csrbus_src_bus = srcb;
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
always @ (posedge clk) begin
rsp_data <= csrbus_read_data;
addr <= csr_ring_in[`FIRE_CSR_RING_ADDR_BITS];
wrt <= csr_ring_in[`FIRE_CSR_RING_WRIT_BITS];
srcb <= csr_ring_in[`FIRE_CSR_RING_SRCB_BITS];
data[`FIRE_CSR_RDMS_BITS] <= {32{1'b0}};
if (req_vld[1]) data[`FIRE_CSR_RDMS_BITS] <= csr_ring_in;
data[`FIRE_CSR_RDLS_BITS] <= {32{1'b0}};
if (req_vld[0]) data[`FIRE_CSR_RDLS_BITS] <= csr_ring_in;
csr_ring_out <= {32{1'b0}};
csr_ring_out <= nxt_ring_out;
endmodule // pcie_common_dcc