// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: niu_rd_meta_arb.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 ============================================
/*-----------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Company: Sun Microsystems, Inc.
-- SUN CONFIDENTIAL/PROPRIETARY - Copyright 2004
-- Description: [Verilog RTL Code]
-- Project: Niagara2/Neptune
-- Module: NIU_RD_META_ARB
-- Designer: Carl Childers
-- Date Created: 07/01/2004
-- Date Modified 10/11/2004
-- Rev: 0.1; Board Rev: P1.0
-------------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
/*--------------------------------------
--------------------------------------*/
module niu_rd_meta_arb ( /*AUTOARG*/
dmc_meta1_req_cmd, dmc_meta1_req_address, dmc_meta1_req_length,
dmc_meta1_req_transID, dmc_meta1_req_port_num,
dmc_meta1_req_dma_num, dmc_meta1_req_func_num,
dmc_meta1_req_client, dmc_meta1_req, arb1_zcp_req_accept,
arb1_zcp_req_errors, arb1_txc_req_accept, arb1_txc_req_errors,
arb1_tdmc_req_accept, arb1_tdmc_req_errors, arb1_rbr_req_accept,
arb1_rbr_req_errors, arb_pio_dirtid_rdstatus, arb_pio_all_rddirty,
meta_dmc1_req_accept, meta_dmc1_req_errors, zcp_arb1_req_cmd,
zcp_arb1_req_address, zcp_arb1_req_length, zcp_arb1_req_port_num,
zcp_arb1_req_dma_num, zcp_arb1_req_func_num, zcp_arb1_req,
txc_arb1_req_cmd, txc_arb1_req_address, txc_arb1_req_length,
txc_arb1_req_port_num, txc_arb1_req_dma_num,
txc_arb1_req_func_num, txc_arb1_req, tdmc_arb1_req_cmd,
tdmc_arb1_req_address, tdmc_arb1_req_length,
tdmc_arb1_req_port_num, tdmc_arb1_req_dma_num,
tdmc_arb1_req_func_num, tdmc_arb1_req, rbr_arb1_req_cmd,
rbr_arb1_req_address, rbr_arb1_req_length, rbr_arb1_req_port_num,
rbr_arb1_req_dma_num, rbr_arb1_req_func_num, rbr_arb1_req,
meta_dmc_resp_transID, dmc_meta_resp_accept,
meta_dmc_resp_transfer_cmpl, meta_dmc_resp_cmd_status,
pio_arb_dirtid_enable, pio_arb_dirtid_clr, pio_arb_rd_threshold,
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
/*--------------------------------------
--------------------------------------*/
output [7:0] dmc_meta1_req_cmd; // Command Request
output [63:0] dmc_meta1_req_address; // Memory Address
output [13:0] dmc_meta1_req_length; // Packet Length
output [5:0] dmc_meta1_req_transID; // Transaction ID
output [1:0] dmc_meta1_req_port_num; // Port Number
output [4:0] dmc_meta1_req_dma_num; // Channel Number
output [1:0] dmc_meta1_req_func_num; // Channel Number
output [7:0] dmc_meta1_req_client; // Client [vector]
output dmc_meta1_req; // Req Command Request
output arb1_zcp_req_accept; // Response to REQ
output arb1_zcp_req_errors; // Error flag
output arb1_txc_req_accept; // Response to REQ
output arb1_txc_req_errors; // Error flag
output arb1_tdmc_req_accept; // Response to REQ
output arb1_tdmc_req_errors; // Error flag
// output arb1_rcr_req_accept; // Response to REQ
// output arb1_rcr_req_errors; // Error flag
output arb1_rbr_req_accept; // Response to REQ
output arb1_rbr_req_errors; // Error flag
output [5:0] arb_pio_dirtid_rdstatus; // count for number of read TID's dirty
output arb_pio_all_rddirty; // all dirty bin entries are dirty
input meta_dmc1_req_accept; // Response to REQ
input meta_dmc1_req_errors; // Error flag
input [7:0] zcp_arb1_req_cmd; // Command Request
input [63:0] zcp_arb1_req_address; // Memory Address
input [13:0] zcp_arb1_req_length; // Packet Length
input [1:0] zcp_arb1_req_port_num; // Port Number
input [4:0] zcp_arb1_req_dma_num; // Channel Number
input [1:0] zcp_arb1_req_func_num; // Channel Number
input zcp_arb1_req; // Req Command Request
input [7:0] txc_arb1_req_cmd; // Command Request
input [63:0] txc_arb1_req_address; // Memory Address
input [13:0] txc_arb1_req_length; // Packet Length
input [1:0] txc_arb1_req_port_num; // Port Number
input [4:0] txc_arb1_req_dma_num; // Channel Number
input [1:0] txc_arb1_req_func_num; // Channel Number
input txc_arb1_req; // Req Command Request
input [7:0] tdmc_arb1_req_cmd; // Command Request
input [63:0] tdmc_arb1_req_address; // Memory Address
input [13:0] tdmc_arb1_req_length; // Packet Length
input [1:0] tdmc_arb1_req_port_num; // Port Number
input [4:0] tdmc_arb1_req_dma_num; // Channel Number
input [1:0] tdmc_arb1_req_func_num; // Channel Number
input tdmc_arb1_req; // Req Command Request
// input [7:0] rcr_arb1_req_cmd; // Command Request
// input [63:0] rcr_arb1_req_address; // Memory Address
// input [13:0] rcr_arb1_req_length; // Packet Length
// input [1:0] rcr_arb1_req_port_num; // Port Number
// input [4:0] rcr_arb1_req_dma_num; // Channel Number
// input rcr_arb1_req; // Req Command Request
input [7:0] rbr_arb1_req_cmd; // Command Request
input [63:0] rbr_arb1_req_address; // Memory Address
input [13:0] rbr_arb1_req_length; // Packet Length
input [1:0] rbr_arb1_req_port_num; // Port Number
input [4:0] rbr_arb1_req_dma_num; // Channel Number
input [1:0] rbr_arb1_req_func_num; // Channel Number
input rbr_arb1_req; // Req Command Request
input [5:0] meta_dmc_resp_transID; // Free TransID
input [7:0] dmc_meta_resp_accept; // Valid TransID
input [7:0] meta_dmc_resp_transfer_cmpl; // Last trans of TransID
input [3:0] meta_dmc_resp_cmd_status; // status in command phase
input pio_arb_dirtid_enable; // Enable Dirty TID logic
input pio_arb_dirtid_clr; // Clear all Dirty TID Entries
input [5:0] pio_arb_rd_threshold; // read threshold
/***************************************/
/***************************************/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire arb1_fifo_not_empty; // From arb_tagfifo of arb_tagfifo.v
wire [4:0] rdtagoutR; // From arb_tagfifo of arb_tagfifo.v
wire meta_dmc_resp_transfer_cmpl_ORd;
wire dmc_meta_resp_accept_ORd;
wire transaction_timeout;
wire [5:0] dirty_tag_count;
wire dirtybinfifo_not_empty;
wire arb_pio_all_rddirty;
wire rd_threshold_reached;
/***************************************/
/***************************************/
// Beginning of automatic regs (for this module's undeclared outputs)
reg [2:0] arb_control_sel_ff,
// Transaction ID tag read and write pointer incrementer
reg [4:0] meta_dmc_resp_transID_cmpl;
reg [4:0] meta_dmc_resp_transIDR;
reg [4:0] meta_dmc_resp_transID0R;
reg [4:0] meta_dmc_resp_transID1R;
reg [4:0] meta_dmc_resp_transID2R;
reg [4:0] meta_dmc_resp_transID3R;
reg [4:0] meta_dmc_resp_transID4R;
reg [4:0] meta_dmc_resp_transID5R;
reg [4:0] meta_dmc_resp_transID6R;
reg [4:0] meta_dmc_resp_transID7R;
reg [3:0] meta_dmc_resp_cmd_statusR;
reg [4:0] reclaimed_transID;
reg [7:0] mux_dmc_meta1_req_cmd;
reg [63:0] mux_dmc_meta1_req_address;
reg [13:0] mux_dmc_meta1_req_length;
reg [1:0] mux_dmc_meta1_req_port_num;
reg [4:0] mux_dmc_meta1_req_dma_num;
reg [1:0] mux_dmc_meta1_req_func_num;
reg [7:0] mux_dmc_meta1_req_client;
reg demux_arb1_zcp_req_accept;
reg demux_arb1_zcp_req_errors;
reg demux_arb1_txc_req_accept;
reg demux_arb1_txc_req_errors;
reg demux_arb1_tdmc_req_accept;
reg demux_arb1_tdmc_req_errors;
// reg demux_arb1_rcr_req_accept;
// reg demux_arb1_rcr_req_errors;
reg demux_arb1_rbr_req_accept;
reg demux_arb1_rbr_req_errors;
reg [3:0] current_arb_control_state_ff,
reg transfer_cmpl_pending;
reg [5:0] arb_pio_dirtid_rdstatus;
reg [1:0] dirbin_state, dirbin_stateR;
reg [5:0] outstanding_tid_cnt;
wire inc_outstanding_tid_cnt= meta_dmc1_req_accept & ~meta_dmc_resp_transfer_cmpl_ORd;
wire dec_outstanding_tid_cnt= meta_dmc_resp_transfer_cmpl_ORd & ~meta_dmc1_req_accept;
wire [5:0] outstanding_tid_cnt_plus1= outstanding_tid_cnt + 1'b1;
wire [5:0] outstanding_tid_cnt_minus1= outstanding_tid_cnt - 1'b1;
wire [5:0] outstanding_tid_cnt_add_n= (outstanding_tid_cnt==6'd32)? 6'h0 : outstanding_tid_cnt_plus1;
wire [5:0] outstanding_tid_cnt_sub_n= (outstanding_tid_cnt==6'd0)? 6'h0 : outstanding_tid_cnt_minus1;
/***************************************/
/* Parameter Declaration */
/***************************************/
parameter [2:0] NULL = 3'b000,
parameter [7:0] NULL_CLIENT = 8'h00,
parameter [3:0] CACS0 = 4'b0000,
parameter [1:0] ZEROES_2 = 2'b00;
parameter [4:0] ZEROES_5 = 5'b00000;
parameter [7:0] ZEROES_8 = 8'b00000000;
parameter [13:0] ZEROES_14 = 14'b00000000000000;
parameter [63:0] ZEROES_64 = 64'h0000;
parameter ASSERT_H = 1'b1,
parameter [1:0] IDLEBIN = 2'b00,
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
assign dmc_meta1_req_cmd = mux_dmc_meta1_req_cmd;
assign dmc_meta1_req_address = mux_dmc_meta1_req_address;
assign dmc_meta1_req_length = mux_dmc_meta1_req_length;
assign dmc_meta1_req_transID = {1'b0,rdtagoutR};
assign dmc_meta1_req_port_num = mux_dmc_meta1_req_port_num;
assign dmc_meta1_req_dma_num = mux_dmc_meta1_req_dma_num;
assign dmc_meta1_req_func_num = mux_dmc_meta1_req_func_num;
assign dmc_meta1_req_client = mux_dmc_meta1_req_client;
assign dmc_meta1_req = mux_dmc_meta1_req;
assign arb1_zcp_req_accept = demux_arb1_zcp_req_accept;
assign arb1_zcp_req_errors = demux_arb1_zcp_req_errors;
assign arb1_txc_req_accept = demux_arb1_txc_req_accept;
assign arb1_txc_req_errors = demux_arb1_txc_req_errors;
assign arb1_tdmc_req_accept = demux_arb1_tdmc_req_accept;
assign arb1_tdmc_req_errors = demux_arb1_tdmc_req_errors;
// assign arb1_rcr_req_accept = demux_arb1_rcr_req_accept;
// assign arb1_rcr_req_errors = demux_arb1_rcr_req_errors;
assign arb1_rbr_req_accept = demux_arb1_rbr_req_accept;
assign arb1_rbr_req_errors = demux_arb1_rbr_req_errors;
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
/*--------------------------------------
-- Concurrent combinatorial logic: Arbitration CONTROL MUX
--------------------------------------*/
always @ (/*AUTOSENSE*/arb_control_sel_ff or meta_dmc1_req_accept
or meta_dmc1_req_errors or rbr_arb1_req
or rbr_arb1_req_address or rbr_arb1_req_cmd
or rbr_arb1_req_dma_num or rbr_arb1_req_func_num
or rbr_arb1_req_length or rbr_arb1_req_port_num
or tdmc_arb1_req or tdmc_arb1_req_address
or tdmc_arb1_req_cmd or tdmc_arb1_req_dma_num
or tdmc_arb1_req_func_num or tdmc_arb1_req_length
or tdmc_arb1_req_port_num or txc_arb1_req
or txc_arb1_req_address or txc_arb1_req_cmd
or txc_arb1_req_dma_num or txc_arb1_req_func_num
or txc_arb1_req_length or txc_arb1_req_port_num
or zcp_arb1_req or zcp_arb1_req_address
or zcp_arb1_req_cmd or zcp_arb1_req_dma_num
or zcp_arb1_req_func_num or zcp_arb1_req_length
or zcp_arb1_req_port_num)
begin: arbitration_control_mux
mux_dmc_meta1_req_cmd = ZEROES_8;
mux_dmc_meta1_req_address = ZEROES_64;
mux_dmc_meta1_req_length = ZEROES_14;
mux_dmc_meta1_req_port_num = ZEROES_2;
mux_dmc_meta1_req_dma_num = ZEROES_5;
mux_dmc_meta1_req_func_num = ZEROES_2;
mux_dmc_meta1_req_client = NULL_CLIENT;
mux_dmc_meta1_req = ZERO_1;
demux_arb1_zcp_req_accept = ZERO_1;
demux_arb1_zcp_req_errors = ZERO_1;
demux_arb1_txc_req_accept = ZERO_1;
demux_arb1_txc_req_errors = ZERO_1;
demux_arb1_tdmc_req_accept = ZERO_1;
demux_arb1_tdmc_req_errors = ZERO_1;
// demux_arb1_rcr_req_accept = ZERO_1;
// demux_arb1_rcr_req_errors = ZERO_1;
demux_arb1_rbr_req_accept = ZERO_1;
demux_arb1_rbr_req_errors = ZERO_1;
case (arb_control_sel_ff) /* synopsys parallel_case full_case */
mux_dmc_meta1_req_cmd = ZEROES_8;
mux_dmc_meta1_req_address = ZEROES_64;
mux_dmc_meta1_req_length = ZEROES_14;
mux_dmc_meta1_req_port_num = ZEROES_2;
mux_dmc_meta1_req_dma_num = ZEROES_5;
mux_dmc_meta1_req_func_num = ZEROES_2;
mux_dmc_meta1_req_client = NULL_CLIENT;
mux_dmc_meta1_req = ZERO_1;
demux_arb1_zcp_req_accept = ZERO_1;
demux_arb1_zcp_req_errors = ZERO_1;
demux_arb1_txc_req_accept = ZERO_1;
demux_arb1_txc_req_errors = ZERO_1;
demux_arb1_tdmc_req_accept = ZERO_1;
demux_arb1_tdmc_req_errors = ZERO_1;
// demux_arb1_rcr_req_accept = ZERO_1;
// demux_arb1_rcr_req_errors = ZERO_1;
demux_arb1_rbr_req_accept = ZERO_1;
demux_arb1_rbr_req_errors = ZERO_1;
mux_dmc_meta1_req_cmd = zcp_arb1_req_cmd;
mux_dmc_meta1_req_address = zcp_arb1_req_address;
mux_dmc_meta1_req_length = zcp_arb1_req_length;
mux_dmc_meta1_req_port_num = zcp_arb1_req_port_num;
mux_dmc_meta1_req_dma_num = zcp_arb1_req_dma_num;
mux_dmc_meta1_req_func_num = zcp_arb1_req_func_num;
mux_dmc_meta1_req_client = ZCP_CLIENT;
mux_dmc_meta1_req = zcp_arb1_req;
demux_arb1_zcp_req_accept = meta_dmc1_req_accept;
demux_arb1_zcp_req_errors = meta_dmc1_req_errors;
mux_dmc_meta1_req_cmd = txc_arb1_req_cmd;
mux_dmc_meta1_req_address = txc_arb1_req_address;
mux_dmc_meta1_req_length = txc_arb1_req_length;
mux_dmc_meta1_req_port_num = txc_arb1_req_port_num;
mux_dmc_meta1_req_dma_num = txc_arb1_req_dma_num;
mux_dmc_meta1_req_func_num = txc_arb1_req_func_num;
mux_dmc_meta1_req_client = TXC_CLIENT;
mux_dmc_meta1_req = txc_arb1_req;
demux_arb1_txc_req_accept = meta_dmc1_req_accept;
demux_arb1_txc_req_errors = meta_dmc1_req_errors;
mux_dmc_meta1_req_cmd = tdmc_arb1_req_cmd;
mux_dmc_meta1_req_address = tdmc_arb1_req_address;
mux_dmc_meta1_req_length = tdmc_arb1_req_length;
mux_dmc_meta1_req_port_num = tdmc_arb1_req_port_num;
mux_dmc_meta1_req_dma_num = tdmc_arb1_req_dma_num;
mux_dmc_meta1_req_func_num = tdmc_arb1_req_func_num;
mux_dmc_meta1_req_client = TDMC_CLIENT;
mux_dmc_meta1_req = tdmc_arb1_req;
demux_arb1_tdmc_req_accept = meta_dmc1_req_accept;
demux_arb1_tdmc_req_errors = meta_dmc1_req_errors;
// mux_dmc_meta1_req_cmd = rcr_arb1_req_cmd;
// mux_dmc_meta1_req_address = rcr_arb1_req_address;
// mux_dmc_meta1_req_length = rcr_arb1_req_length;
// mux_dmc_meta1_req_port_num = rcr_arb1_req_port_num;
// mux_dmc_meta1_req_dma_num = rcr_arb1_req_dma_num;
// mux_dmc_meta1_req_client = RCR_CLIENT;
// mux_dmc_meta1_req = rcr_arb1_req;
// demux_arb1_rcr_req_accept = meta_dmc1_req_accept;
// demux_arb1_rcr_req_errors = meta_dmc1_req_errors;
mux_dmc_meta1_req_cmd = rbr_arb1_req_cmd;
mux_dmc_meta1_req_address = rbr_arb1_req_address;
mux_dmc_meta1_req_length = rbr_arb1_req_length;
mux_dmc_meta1_req_port_num = rbr_arb1_req_port_num;
mux_dmc_meta1_req_dma_num = rbr_arb1_req_dma_num;
mux_dmc_meta1_req_func_num = rbr_arb1_req_func_num;
mux_dmc_meta1_req_client = RBR_CLIENT;
mux_dmc_meta1_req = rbr_arb1_req;
demux_arb1_rbr_req_accept = meta_dmc1_req_accept;
demux_arb1_rbr_req_errors = meta_dmc1_req_errors;
mux_dmc_meta1_req_cmd = ZEROES_8;
mux_dmc_meta1_req_address = ZEROES_64;
mux_dmc_meta1_req_length = ZEROES_14;
mux_dmc_meta1_req_port_num = ZEROES_2;
mux_dmc_meta1_req_dma_num = ZEROES_5;
mux_dmc_meta1_req_func_num = ZEROES_2;
mux_dmc_meta1_req_client = NULL_CLIENT;
mux_dmc_meta1_req = ZERO_1;
demux_arb1_zcp_req_accept = ZERO_1;
demux_arb1_zcp_req_errors = ZERO_1;
demux_arb1_txc_req_accept = ZERO_1;
demux_arb1_txc_req_errors = ZERO_1;
demux_arb1_tdmc_req_accept = ZERO_1;
demux_arb1_tdmc_req_errors = ZERO_1;
// demux_arb1_rcr_req_accept = ZERO_1;
// demux_arb1_rcr_req_errors = ZERO_1;
demux_arb1_rbr_req_accept = ZERO_1;
demux_arb1_rbr_req_errors = ZERO_1;
/*--------------------------------------
-- Concurrent combinatorial logic:Round Robin Arbitration CONTROL State Machine
--------------------------------------*/
always @ (/*AUTOSENSE*/arb1_fifo_not_empty
or current_arb_control_state_ff or meta_dmc1_req_accept
or rbr_arb1_req or rd_threshold_reached or tdmc_arb1_req
or txc_arb1_req or zcp_arb1_req)
begin: arbitration_control_fsm
arb_control_sel_in = NULL;
arb_control_sel_ld = DEASSERT_L;
next_arb_control_state = CACS0;
case (current_arb_control_state_ff) /* synopsys parallel_case full_case */
if (arb1_fifo_not_empty & ~rd_threshold_reached ) begin
if (zcp_arb1_req == TRUE_H) begin // ZCP Request
arb_control_sel_in = ZCP; // Select ZCP module
next_arb_control_state = CACS5; // next state
else if (txc_arb1_req == TRUE_H) begin // TXC Request
arb_control_sel_in = TXC; // Select TXC module
next_arb_control_state = CACS6; // next state
else if (tdmc_arb1_req == TRUE_H) begin // TDMC Request
arb_control_sel_in = TDMC; // Select TDMC module
next_arb_control_state = CACS7; // next state
// else if (rcr_arb1_req == TRUE_H) begin // RCR Request
// arb_control_sel_in = RCR; // Select RCR module
// next_arb_control_state = CACS8; // next state
else if (rbr_arb1_req == TRUE_H) begin // RBR Request
arb_control_sel_in = RBR; // Select RBR module
next_arb_control_state = CACS9; // next state
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS0; // loop
end // else: !if(rbr_arb1_req == TRUE_H)
end // if (arb1_fifo_not_empty)
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS0; // loop
end // else: !if(arb1_fifo_not_empty)
arb_control_sel_ld = ASSERT_H; // load register
if (arb1_fifo_not_empty & ~rd_threshold_reached) begin
if (txc_arb1_req == TRUE_H) begin // TXC Request
arb_control_sel_in = TXC; // Select TXC module
next_arb_control_state = CACS6; // next state
else if (tdmc_arb1_req == TRUE_H) begin // TDMC Request
arb_control_sel_in = TDMC; // Select TDMC module
next_arb_control_state = CACS7; // next state
// else if (rcr_arb1_req == TRUE_H) begin // RCR Request
// arb_control_sel_in = RCR; // Select RCR module
// next_arb_control_state = CACS8; // next state
else if (rbr_arb1_req == TRUE_H) begin // RBR Request
arb_control_sel_in = RBR; // Select RBR module
next_arb_control_state = CACS9; // next state
else if (zcp_arb1_req == TRUE_H) begin // ZCP Request
arb_control_sel_in = ZCP; // Select ZCP module
next_arb_control_state = CACS5; // next state
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS0; // loop
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS1; // loop
arb_control_sel_ld = ASSERT_H; // load register
if (arb1_fifo_not_empty & ~rd_threshold_reached) begin
if (tdmc_arb1_req == TRUE_H) begin // TDMC Request
arb_control_sel_in = TDMC; // Select TDMC module
next_arb_control_state = CACS7; // next state
// else if (rcr_arb1_req == TRUE_H) begin // RCR Request
// arb_control_sel_in = RCR; // Select RCR module
// next_arb_control_state = CACS8; // next state
else if (rbr_arb1_req == TRUE_H) begin // RBR Request
arb_control_sel_in = RBR; // Select RBR module
next_arb_control_state = CACS9; // next state
else if (zcp_arb1_req == TRUE_H) begin // ZCP Request
arb_control_sel_in = ZCP; // Select ZCP module
next_arb_control_state = CACS5; // next state
else if (txc_arb1_req == TRUE_H) begin // TXC Request
arb_control_sel_in = TXC; // Select TXC module
next_arb_control_state = CACS6; // next state
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS0; // loop
end // else: !if(txc_arb1_req == TRUE_H)
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS2; // loop
end // else: !if(txc_arb1_req == TRUE_H)
arb_control_sel_ld = ASSERT_H; // load register
// if (rcr_arb1_req == TRUE_H) begin // RCR Request
// arb_control_sel_in = RCR; // Select RCR module
// next_arb_control_state = CACS8; // next state
// else if (rbr_arb1_req == TRUE_H) begin // RBR Request
if (arb1_fifo_not_empty & ~rd_threshold_reached) begin
if (rbr_arb1_req == TRUE_H) begin // RBR Request
arb_control_sel_in = RBR; // Select RBR module
next_arb_control_state = CACS9; // next state
else if (zcp_arb1_req == TRUE_H) begin // ZCP Request
arb_control_sel_in = ZCP; // Select ZCP module
next_arb_control_state = CACS5; // next state
else if (txc_arb1_req == TRUE_H) begin // TXC Request
arb_control_sel_in = TXC; // Select TXC module
next_arb_control_state = CACS6; // next state
else if (tdmc_arb1_req == TRUE_H) begin // TDMC Request
arb_control_sel_in = TDMC; // Select TDMC module
next_arb_control_state = CACS7; // next state
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS3; // loop
end // else: !if(tdmc_arb1_req == TRUE_H)
end // if (arb1_fifo_not_empty)
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS3; // loop
arb_control_sel_ld = ASSERT_H; // load register
if (arb1_fifo_not_empty & ~rd_threshold_reached ) begin
if (rbr_arb1_req == TRUE_H) begin // RBR Request
arb_control_sel_in = RBR; // Select RBR module
next_arb_control_state = CACS9; // next state
else if (zcp_arb1_req == TRUE_H) begin // ZCP Request
arb_control_sel_in = ZCP; // Select ZCP module
next_arb_control_state = CACS5; // next state
else if (txc_arb1_req == TRUE_H) begin // TXC Request
arb_control_sel_in = TXC; // Select TXC module
next_arb_control_state = CACS6; // next state
else if (tdmc_arb1_req == TRUE_H) begin // TDMC Request
arb_control_sel_in = TDMC; // Select TDMC module
next_arb_control_state = CACS7; // next state
// else if (rcr_arb1_req == TRUE_H) begin // RCR Request
// arb_control_sel_in = RCR; // Select RCR module
// next_arb_control_state = CACS8; // next state
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS0; // loop
end // else: !if(tdmc_arb1_req == TRUE_H)
end // if (arb1_fifo_not_empty)
arb_control_sel_in = NULL; // Select NULL module
next_arb_control_state = CACS4; // loop
arb_control_sel_ld = ASSERT_H; // load register
if (meta_dmc1_req_accept == TRUE_H) begin // Control Complete
next_arb_control_state = CACS1; // next state
next_arb_control_state = CACS5; // loop
if (meta_dmc1_req_accept == TRUE_H) begin // Control Complete
read_tag = ASSERT_H; // Select a new TransID
next_arb_control_state = CACS2; // next state
next_arb_control_state = CACS6; // loop
if (meta_dmc1_req_accept == TRUE_H) begin // Control Complete
read_tag = ASSERT_H; // Select a new TransID
next_arb_control_state = CACS3; // next state
next_arb_control_state = CACS7; // loop
if (meta_dmc1_req_accept == TRUE_H) begin // Control Complete
read_tag = ASSERT_H; // Select a new TransID
next_arb_control_state = CACS0; // next state
next_arb_control_state = CACS8; // loop
if (meta_dmc1_req_accept == TRUE_H) begin // Control Complete
read_tag = ASSERT_H; // Select a new TransID
next_arb_control_state = CACS0; // next state
next_arb_control_state = CACS9; // loop
next_arb_control_state = CACS0; // next state
/*---------------------------------------------------------------------------
----Dirty TID handing state machine
---------------------------------------------------------------------------*/
// synopsys translate_off
reg [55:0] DIR_BIN_STATE;
IDLEBIN : DIR_BIN_STATE = "IDLEBIN";
CLRBIN : DIR_BIN_STATE = "CLRBIN";
RDBIN : DIR_BIN_STATE = "RDBIN";
default : DIR_BIN_STATE = "UNKNOWN";
always @ (/*AUTOSENSE*/dirbin_stateR or dirtybinfifo_not_empty
or pio_arb_dirtid_clr or transfer_cmpl_pending)
// set all default values here
inc_dirtybinfifo_rp = 1'b0;
dirbin_state = dirbin_stateR;
if (pio_arb_dirtid_clr ) begin
if (dirtybinfifo_not_empty) begin
if (transfer_cmpl_pending)
inc_dirtybinfifo_rp = 1'b1;
end // if (dirtybinfifo_not_empty)
inc_dirtybinfifo_rp = 1'b1;
default: dirbin_state = IDLEBIN;
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
niu_meta_rd_tagfifo niu_meta_rd_tagfifo (
.fifo_not_empty(arb1_fifo_not_empty),
.inc_wp (write_tag | return_dirty_tag),
.din (reclaimed_transID));
/*------------------------------------------------------------------------
---Dirty Bin Fifo -----------------------------
-------------------------------------------------------------------------*/
niu_meta_arb_syncfifo #(5,32,5) rddirtybinfifo (
.inc_rp (inc_dirtybinfifo_rp),
.inc_wp (write_dirty_tag),
.fifo_not_empty (dirtybinfifo_not_empty),
.fifo_full (dirtybinfifo_full),
.count (dirty_tag_count),
.din (meta_dmc_resp_transIDR),
//------------------------------------------------------------------
assign dmc_meta_resp_accept_ORd = dmc_meta_resp_accept[7] |
dmc_meta_resp_accept[6] |
dmc_meta_resp_accept[5] |
dmc_meta_resp_accept[4] |
dmc_meta_resp_accept[3] |
dmc_meta_resp_accept[2] |
dmc_meta_resp_accept[1] |
assign meta_dmc_resp_transfer_cmpl_ORd = meta_dmc_resp_transfer_cmpl[7] |
meta_dmc_resp_transfer_cmpl[6] |
meta_dmc_resp_transfer_cmpl[5] |
meta_dmc_resp_transfer_cmpl[4] |
meta_dmc_resp_transfer_cmpl[3] |
meta_dmc_resp_transfer_cmpl[2] |
meta_dmc_resp_transfer_cmpl[1] |
meta_dmc_resp_transfer_cmpl[0];
assign transaction_timeout = (meta_dmc_resp_cmd_statusR == 4'b1111);
always @ (/*AUTOSENSE*/meta_dmc_resp_transID0R
or meta_dmc_resp_transID1R or meta_dmc_resp_transID2R
or meta_dmc_resp_transID3R or meta_dmc_resp_transID4R
or meta_dmc_resp_transID5R or meta_dmc_resp_transID6R
or meta_dmc_resp_transID7R or meta_dmc_resp_transfer_cmpl) begin
if ( meta_dmc_resp_transfer_cmpl[0])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID0R;
else if (meta_dmc_resp_transfer_cmpl[1])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID1R;
else if (meta_dmc_resp_transfer_cmpl[2])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID2R;
else if (meta_dmc_resp_transfer_cmpl[3])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID3R;
else if (meta_dmc_resp_transfer_cmpl[4])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID4R;
else if (meta_dmc_resp_transfer_cmpl[5])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID5R;
else if (meta_dmc_resp_transfer_cmpl[6])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID6R;
else if (meta_dmc_resp_transfer_cmpl[7])
meta_dmc_resp_transID_cmpl = meta_dmc_resp_transID7R;
meta_dmc_resp_transID_cmpl = 5'b00000;
always @ (/*AUTOSENSE*/dirty_tag or meta_dmc_resp_transIDR
or return_dirty_tag) begin
reclaimed_transID = dirty_tag;
reclaimed_transID = meta_dmc_resp_transIDR;
/*--------------------------------------
-- Concurrent processes: State Machine Registers
--------------------------------------*/
always @ (posedge clk) begin
current_arb_control_state_ff <= 4'h0; // synchronous reset
current_arb_control_state_ff <= next_arb_control_state;
/*--------------------------------------
-- Concurrent processes: Registers
--------------------------------------*/
always @ (posedge clk) begin: arb_control_sel_reg
arb_control_sel_ff <= 3'b000; // synchronous reset
else if (arb_control_sel_ld == TRUE_H)
arb_control_sel_ff <= arb_control_sel_in;
always @ (posedge clk) begin
meta_dmc_resp_transIDR <= 5'h0;
meta_dmc_resp_transID0R <= 5'h0;
meta_dmc_resp_transID1R <= 5'h0;
meta_dmc_resp_transID2R <= 5'h0;
meta_dmc_resp_transID3R <= 5'h0;
meta_dmc_resp_transID4R <= 5'h0;
meta_dmc_resp_transID5R <= 5'h0;
meta_dmc_resp_transID6R <= 5'h0;
meta_dmc_resp_transID7R <= 5'h0;
meta_dmc_resp_cmd_statusR <= 4'h0;
transfer_cmpl_pending <= 1'b0;
arb_pio_dirtid_rdstatus <= 0;
outstanding_tid_cnt <= 0;
// if dirty tid enable only put non timed out tids in good bin
write_tag <= meta_dmc_resp_transfer_cmpl_ORd & ( pio_arb_dirtid_enable ? !transaction_timeout : 1'b1 );
write_dirty_tag <= meta_dmc_resp_transfer_cmpl_ORd & transaction_timeout & pio_arb_dirtid_enable ;
meta_dmc_resp_transIDR <= meta_dmc_resp_transID_cmpl;
meta_dmc_resp_transID0R <= dmc_meta_resp_accept[0] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID0R;
meta_dmc_resp_transID1R <= dmc_meta_resp_accept[1] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID1R;
meta_dmc_resp_transID2R <= dmc_meta_resp_accept[2] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID2R;
meta_dmc_resp_transID3R <= dmc_meta_resp_accept[3] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID3R;
meta_dmc_resp_transID4R <= dmc_meta_resp_accept[4] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID4R;
meta_dmc_resp_transID5R <= dmc_meta_resp_accept[5] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID5R;
meta_dmc_resp_transID6R <= dmc_meta_resp_accept[6] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID6R;
meta_dmc_resp_transID7R <= dmc_meta_resp_accept[7] ? meta_dmc_resp_transID[4:0] : meta_dmc_resp_transID7R;
meta_dmc_resp_cmd_statusR <= dmc_meta_resp_accept_ORd ? meta_dmc_resp_cmd_status : meta_dmc_resp_cmd_statusR ;
transfer_cmpl_pending <= dmc_meta_resp_accept_ORd ? 1'b1 : meta_dmc_resp_transfer_cmpl_ORd ? 1'b0 : transfer_cmpl_pending;
dirbin_stateR <= dirbin_state;
arb_pio_dirtid_rdstatus <= dirty_tag_count;
if(inc_outstanding_tid_cnt) outstanding_tid_cnt<= outstanding_tid_cnt_add_n;
else if(dec_outstanding_tid_cnt) outstanding_tid_cnt<= outstanding_tid_cnt_sub_n;
end // else: !if(reset == 1'b1)
// assign threshold reached
assign rd_threshold_reached = (outstanding_tid_cnt >= pio_arb_rd_threshold);
assign arb_pio_all_rddirty = dirtybinfifo_full;