// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: niu_txc_mac_transfer.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 ============================================
/*********************************************************************
* MAC_ Transfer State Machine
* Orignal Author(s): Rahoul Puri
* Copyright (c) 2004 Sun Microsystems, Inc.
* This verilog model is the confidential and proprietary property of
* Sun Microsystems, Inc., and the possession or use of this model
* requires a written license from Sun Microsystems, Inc.
**********************************************************************/
module niu_txc_mac_transfer (
Txc_Enabled, // NTx Enable
EnableGMACMode, // Enable GMAC Mode only
FifoEmpty, // Fifo empty signal from the fifo
FifoDataOut, // Data word from the Fifo
FifoRead, // Fifo read signal
ClearStatistics, // Clear All Statistics
PacketsTransmitted, // Number of packets transmitted
BytesTransmitted, // Number of bytes in the packet transmitted
MAC_Req, // Data request from the MAC
MAC_Ack, // Ack signal to MAC
MAC_Tag, // Tag signal to MAC
MAC_Abort, // Abort signal to MAC
MAC_Status, // Status to MAC
MAC_Data, // Data request from the MAC
input [135:0] FifoDataOut;
// Control Register Interface
output [15:0] PacketsTransmitted;
output [15:0] BytesTransmitted;
reg [15:0] PacketsTransmitted;
reg [15:0] BytesTransmitted;
output [3:0] Mac_Xfer_State;
reg [3:0] Mac_Xfer_State;
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
wire packetEndsOnLowBits;
wire [3:0] straddleBytesOne;
wire [3:0] straddleBytesTwo;
wire [63:0] gigMACStatus;
reg packetEndsOnHighBits;
reg setDetectedFifoEmpty;
reg clrDetectedFifoEmpty;
reg incPacketsTransmitted;
/*--------------------------------------------------------------*/
// Parameters and Defines
/*--------------------------------------------------------------*/
parameter MAC_XFER_IDLE = 4'h0,
CHECK_FOR_BURST_REQ = 4'h7,
WAIT_FOR_COUNT_DEC = 4'hB,
// synopsys translate_off
reg [192:1] TRANSFER_STATE;
MAC_XFER_IDLE : TRANSFER_STATE = "MAC_XFER_IDLE";
CHECK_FIFO: TRANSFER_STATE = "CHECK_FIFO";
XFER_LOW_BITS_0: TRANSFER_STATE = "XFER_LOW_BITS_0";
XFER_HIGH_BITS_0: TRANSFER_STATE = "XFER_HIGH_BITS_0";
XFER_LOW_BITS_1: TRANSFER_STATE = "XFER_LOW_BITS_1";
XFER_HIGH_BITS_1: TRANSFER_STATE = "XFER_HIGH_BITS_1";
WAIT_FOR_NO_REQ: TRANSFER_STATE = "WAIT_FOR_NO_REQ";
CHECK_FOR_BURST_REQ: TRANSFER_STATE = "CHECK_FOR_BURST_REQ";
CHECK_FOR_REQ: TRANSFER_STATE = "CHECK_FOR_REQ";
XFER_STATUS: TRANSFER_STATE = "XFER_STATUS";
WAIT_FOR_REQ_LOW: TRANSFER_STATE = "WAIT_FOR_REQ_LOW";
WAIT_FOR_COUNT_DEC: TRANSFER_STATE = "WAIT_FOR_COUNT_DEC";
WAIT_FOR_FIFO: TRANSFER_STATE = "WAIT_FOR_FIFO";
default : TRANSFER_STATE = "UNKNOWN";
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
assign lastLineOfPacket = (FifoDataOut[128] | FifoDataOut[135]);
assign packetEndsOnLowBits = FifoDataOut[134];
assign gigMACStatus = {(latchedAbort | parityError), latchedStatus, 59'h0};
assign abortPacket = (parityError | par_error);
/*--------------------------------------------------------------*/
// Parity Check on Incoming Data
/*--------------------------------------------------------------*/
assign par_error = (UnCorrectError & ~DisableEccCheking);
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
assign straddleBytesOne = ({1'b0,FifoDataOut[132:130]} + 4'h1);
assign straddleBytesTwo = ({1'b0,latchedStatus[2:0]} + 4'h1);
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
assign collisionXmit = ClearStatistics & incPacketsTransmitted;
assign collisionBytes = (ClearStatistics & (addEightBytes
always @ (posedge SysClk)
if (!Reset_L) PacketsTransmitted <= 16'b0;
else if (collisionXmit) PacketsTransmitted <= #`SD 16'h1;
else if (ClearStatistics) PacketsTransmitted <= #`SD 16'h0;
else if (WrPacketXmitted) PacketsTransmitted <= #`SD PioDataIn[15:0];
else if (incPacketsTransmitted) PacketsTransmitted <= #`SD PacketsTransmitted
always @ (posedge SysClk)
if (!Reset_L) parityError <= 1'b0;
else if (ldFifoDataOut) parityError <= #`SD parityError | par_error;
else if (clearAllState) parityError <= #`SD 1'b0;
always @ (posedge SysClk)
if (!Reset_L) fifoWasEmpty <= 1'b0;
else if (setFifoWasEmpty) fifoWasEmpty <= #`SD 1'b1;
else if (clrFifoWasEmpty) fifoWasEmpty <= #`SD 1'b0;
always @ (posedge SysClk)
if (!Reset_L) detectedFifoEmpty <= 1'b0;
else if (setDetectedFifoEmpty) detectedFifoEmpty <= #`SD 1'b1;
else if (clrDetectedFifoEmpty) detectedFifoEmpty <= #`SD 1'b0;
always @ (posedge SysClk)
if (!Reset_L) BytesTransmitted <= 16'b0;
if (addEightBytes) BytesTransmitted <= #`SD 16'd8;
else if (addStraddleOne) BytesTransmitted <= #`SD {12'h0,
else if (addStraddleTwo) BytesTransmitted <= #`SD {12'h0,
else if (ClearStatistics) BytesTransmitted <= #`SD 16'h0;
else if (WrPacketXmitted) BytesTransmitted <= #`SD PioDataIn[31:16];
else if (addEightBytes) BytesTransmitted <= #`SD BytesTransmitted + 16'd8;
else if (addStraddleOne) BytesTransmitted <= #`SD BytesTransmitted
{12'h0, straddleBytesOne};
else if (addStraddleTwo) BytesTransmitted <= #`SD BytesTransmitted
{12'h0, straddleBytesTwo};
always @ (posedge SysClk)
if (!Reset_L) packetEndsOnHighBits <= 1'b0;
else if (ldFifoDataOut) packetEndsOnHighBits <= #`SD lastLineOfPacket;
else if (clearAllState) packetEndsOnHighBits <= #`SD 1'b0;
always @ (posedge SysClk)
if (!Reset_L) latchedAbort <= #`SD 1'b0;
else if (ldFifoDataOut) latchedAbort <= #`SD FifoDataOut[129];
else if (clearAllState) latchedAbort <= #`SD 1'b0;
always @ (posedge SysClk)
if (!Reset_L) latchedStatus <= #`SD 4'h0;
else if (ldFifoDataOut) latchedStatus <= #`SD FifoDataOut[133:130];
else if (clearAllState) latchedStatus <= #`SD 4'h0;
always @ (posedge SysClk)
if (!Reset_L) fifoHBits <= #`SD 64'h0;
else if (ldFifoDataOut) fifoHBits <= #`SD FifoDataOut[127:64];
else if (clearAllState) fifoHBits <= #`SD 64'b0;
/*--------------------------------------------------------------*/
// MAC Transfer Interface Logic
/*--------------------------------------------------------------*/
always @ (posedge SysClk)
if (!Reset_L) MAC_Ack <= 1'b0;
else MAC_Ack <= #`SD macAck;
always @ (posedge SysClk)
if (!Reset_L) MAC_Tag <= 1'b0;
else MAC_Tag <= #`SD macTag;
always @ (posedge SysClk)
if (!Reset_L) MAC_Abort <= 1'b0;
else MAC_Abort <= #`SD macAbort;
always @ (posedge SysClk)
if (!Reset_L) MAC_Status <= #`SD 4'h0;
else if (ldStatus) MAC_Status <= #`SD FifoDataOut[133:130];
else if (ldLatchedStatus) MAC_Status <= #`SD latchedStatus;
else if (clearAllState) MAC_Status <= #`SD 4'h0;
always @ (posedge SysClk)
if (!Reset_L) MAC_Data <= #`SD 64'h0;
else if (ldFifoDataOut) MAC_Data <= #`SD FifoDataOut[63:0];
else if (ldFifoHBits) MAC_Data <= #`SD fifoHBits;
else if (ldGigMACStatus) MAC_Data <= #`SD gigMACStatus;
else if (clearAllState) MAC_Data <= 64'h0;
/*--------------------------------------------------------------*/
// Mac Xfer State Vectors
/*--------------------------------------------------------------*/
if (!Reset_L) Mac_Xfer_State <= #`SD MAC_XFER_IDLE;
else Mac_Xfer_State <= #`SD nextXferState;
/*--------------------------------------------------------------*/
// MAC_ Transfer State Machine
/*--------------------------------------------------------------*/
function [3:0] XferDefaults;
input [3:0] currentState;
XferDefaults = currentState;
setDetectedFifoEmpty = 1'b0;
clrDetectedFifoEmpty = 1'b0;
incPacketsTransmitted = 1'b0;
always @(/*AUTOSENSE*/Mac_Xfer_State or Txc_Enabled
or MAC_Req or FifoEmpty or EnableGMACMode
or lastLineOfPacket or packetEndsOnLowBits
or FifoDataOut or abortPacket
or packetEndsOnHighBits or detectedFifoEmpty
or fifoWasEmpty or parityError
or latchedAbort or MAC_Abort
case(Mac_Xfer_State) // synopsys full_case parallel_case
/* 0in < case -full -parallel */
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = CHECK_FIFO;
nextXferState = XferDefaults(Mac_Xfer_State);
if (MAC_Req | EnableGMACMode)
if (~FifoEmpty | lastLineOfPacket)
nextXferState = XFER_LOW_BITS_0;
nextXferState = XferDefaults(Mac_Xfer_State);
if (MAC_Req | EnableGMACMode)
if (lastLineOfPacket & packetEndsOnLowBits)
macAbort = (FifoDataOut[129] | abortPacket);
incPacketsTransmitted = 1'b1;
nextXferState = XFER_STATUS;
nextXferState = WAIT_FOR_COUNT_DEC;
nextXferState = XFER_HIGH_BITS_0;
setDetectedFifoEmpty = 1'b1;
nextXferState = XferDefaults(Mac_Xfer_State);
if (MAC_Req | EnableGMACMode)
if (packetEndsOnHighBits)
macAbort = (latchedAbort | parityError);
incPacketsTransmitted = 1'b1;
nextXferState = XFER_STATUS;
nextXferState = WAIT_FOR_COUNT_DEC;
else // if (!packetEndsOnHighBits)
nextXferState = XFER_LOW_BITS_1;
else if (detectedFifoEmpty)
nextXferState = WAIT_FOR_FIFO;
nextXferState = XFER_LOW_BITS_0;
// nextXferState = CHECK_FIFO;
nextXferState = XferDefaults(Mac_Xfer_State);
if (lastLineOfPacket & packetEndsOnLowBits)
incPacketsTransmitted = 1'b1;
nextXferState = XFER_STATUS;
nextXferState = XFER_HIGH_BITS_1;
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = WAIT_FOR_NO_REQ;
if (fifoWasEmpty & ~FifoEmpty)
if (packetEndsOnHighBits)
incPacketsTransmitted = 1'b1;
nextXferState = XferDefaults(Mac_Xfer_State);
if (fifoWasEmpty & ~FifoEmpty)
if (packetEndsOnHighBits)
nextXferState = CHECK_FOR_REQ;
nextXferState = CHECK_FOR_BURST_REQ;
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = CHECK_FIFO;
else if (~FifoEmpty | lastLineOfPacket)
nextXferState = XFER_LOW_BITS_0;
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = XFER_STATUS;
nextXferState = XferDefaults(Mac_Xfer_State);
macAbort = MAC_Abort; // Don't know if need this
nextXferState = WAIT_FOR_REQ_LOW;
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = MAC_XFER_IDLE;
nextXferState = XferDefaults(Mac_Xfer_State);
nextXferState = MAC_XFER_IDLE;
nextXferState = XferDefaults(Mac_Xfer_State);
clrDetectedFifoEmpty = 1'b1;
nextXferState = CHECK_FIFO;