Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_txc_mac_transfer.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_txc_mac_transfer.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/*********************************************************************
36 *
37 * niu_txc_mac_transfer.v
38 *
39 * MAC_ Transfer State Machine
40 *
41 * Orignal Author(s): Rahoul Puri
42 * Modifier(s):
43 * Project(s): Neptune
44 *
45 * Copyright (c) 2004 Sun Microsystems, Inc.
46 *
47 * All Rights Reserved.
48 *
49 * This verilog model is the confidential and proprietary property of
50 * Sun Microsystems, Inc., and the possession or use of this model
51 * requires a written license from Sun Microsystems, Inc.
52 *
53 **********************************************************************/
54
55`include "timescale.v"
56
57module niu_txc_mac_transfer (
58 SysClk, // Clock
59 Reset_L, // Reset_L
60 Txc_Enabled, // NTx Enable
61 EnableGMACMode, // Enable GMAC Mode only
62
63 DisableEccCheking,
64 UnCorrectError,
65 FifoEmpty, // Fifo empty signal from the fifo
66 FifoDataOut, // Data word from the Fifo
67 FifoRead, // Fifo read signal
68
69 ClearStatistics, // Clear All Statistics
70 WrPacketXmitted,
71 PioDataIn,
72 PacketsTransmitted, // Number of packets transmitted
73 BytesTransmitted, // Number of bytes in the packet transmitted
74
75 MAC_Req, // Data request from the MAC
76 MAC_Ack, // Ack signal to MAC
77 MAC_Tag, // Tag signal to MAC
78 MAC_Abort, // Abort signal to MAC
79 MAC_Status, // Status to MAC
80 MAC_Data, // Data request from the MAC
81 Mac_Xfer_State
82 );
83
84`include "txc_defines.h"
85
86// Global signals
87input SysClk;
88input Reset_L;
89input Txc_Enabled;
90input EnableGMACMode;
91
92// Control Reg Interface
93input DisableEccCheking;
94
95// Fifo Interface
96input UnCorrectError;
97input FifoEmpty;
98input [135:0] FifoDataOut;
99
100output FifoRead;
101
102reg FifoRead;
103
104// Control Register Interface
105input ClearStatistics;
106input WrPacketXmitted;
107input [31:0] PioDataIn;
108
109output [15:0] PacketsTransmitted;
110output [15:0] BytesTransmitted;
111
112reg [15:0] PacketsTransmitted;
113reg [15:0] BytesTransmitted;
114
115// MAC Interface
116input MAC_Req;
117
118output MAC_Ack;
119output MAC_Tag;
120output MAC_Abort;
121output [3:0] MAC_Status;
122output [63:0] MAC_Data;
123
124reg MAC_Ack;
125reg MAC_Tag;
126reg MAC_Abort;
127reg [3:0] MAC_Status;
128reg [63:0] MAC_Data;
129
130// MAC Interface
131output [3:0] Mac_Xfer_State;
132
133reg [3:0] Mac_Xfer_State;
134
135/*--------------------------------------------------------------*/
136// Reg & Wires
137/*--------------------------------------------------------------*/
138wire lastLineOfPacket;
139wire packetEndsOnLowBits;
140wire par_error;
141wire abortPacket;
142wire collisionXmit;
143wire collisionBytes;
144wire [3:0] straddleBytesOne;
145wire [3:0] straddleBytesTwo;
146wire [63:0] gigMACStatus;
147
148reg packetEndsOnHighBits;
149reg latchedAbort;
150reg parityError;
151reg fifoWasEmpty;
152reg detectedFifoEmpty;
153reg macAck;
154reg macTag;
155reg macAbort;
156reg ldFifoDataOut;
157reg clearAllState;
158reg setFifoWasEmpty;
159reg clrFifoWasEmpty;
160reg setDetectedFifoEmpty;
161reg clrDetectedFifoEmpty;
162reg incPacketsTransmitted;
163reg addEightBytes;
164reg addStraddleOne;
165reg addStraddleTwo;
166reg ldStatus;
167reg ldLatchedStatus;
168reg ldFifoHBits;
169reg ldGigMACStatus;
170reg [3:0] nextXferState;
171reg [3:0] latchedStatus;
172reg [63:0] fifoHBits;
173
174/*--------------------------------------------------------------*/
175// Parameters and Defines
176/*--------------------------------------------------------------*/
177parameter MAC_XFER_IDLE = 4'h0,
178 CHECK_FIFO = 4'h1,
179 XFER_LOW_BITS_0 = 4'h2,
180 XFER_HIGH_BITS_0 = 4'h3,
181 XFER_LOW_BITS_1 = 4'h4,
182 XFER_HIGH_BITS_1 = 4'h5,
183 WAIT_FOR_NO_REQ = 4'h6,
184 CHECK_FOR_BURST_REQ = 4'h7,
185 CHECK_FOR_REQ = 4'h8,
186 XFER_STATUS = 4'h9,
187 WAIT_FOR_REQ_LOW = 4'hA,
188 WAIT_FOR_COUNT_DEC = 4'hB,
189 WAIT_FOR_FIFO = 4'hF;
190
191//VCS coverage off
192// synopsys translate_off
193reg [192:1] TRANSFER_STATE;
194
195
196always @(Mac_Xfer_State)
197begin
198 case(Mac_Xfer_State)
199 MAC_XFER_IDLE : TRANSFER_STATE = "MAC_XFER_IDLE";
200 CHECK_FIFO: TRANSFER_STATE = "CHECK_FIFO";
201 XFER_LOW_BITS_0: TRANSFER_STATE = "XFER_LOW_BITS_0";
202 XFER_HIGH_BITS_0: TRANSFER_STATE = "XFER_HIGH_BITS_0";
203 XFER_LOW_BITS_1: TRANSFER_STATE = "XFER_LOW_BITS_1";
204 XFER_HIGH_BITS_1: TRANSFER_STATE = "XFER_HIGH_BITS_1";
205 WAIT_FOR_NO_REQ: TRANSFER_STATE = "WAIT_FOR_NO_REQ";
206 CHECK_FOR_BURST_REQ: TRANSFER_STATE = "CHECK_FOR_BURST_REQ";
207 CHECK_FOR_REQ: TRANSFER_STATE = "CHECK_FOR_REQ";
208 XFER_STATUS: TRANSFER_STATE = "XFER_STATUS";
209 WAIT_FOR_REQ_LOW: TRANSFER_STATE = "WAIT_FOR_REQ_LOW";
210 WAIT_FOR_COUNT_DEC: TRANSFER_STATE = "WAIT_FOR_COUNT_DEC";
211 WAIT_FOR_FIFO: TRANSFER_STATE = "WAIT_FOR_FIFO";
212 default : TRANSFER_STATE = "UNKNOWN";
213 endcase
214end
215
216// synopsys translate_on
217//VCS coverage on
218
219
220/*--------------------------------------------------------------*/
221// Zero In Checks
222/*--------------------------------------------------------------*/
223
224/*--------------------------------------------------------------*/
225// Assigns
226/*--------------------------------------------------------------*/
227assign lastLineOfPacket = (FifoDataOut[128] | FifoDataOut[135]);
228assign packetEndsOnLowBits = FifoDataOut[134];
229
230assign gigMACStatus = {(latchedAbort | parityError), latchedStatus, 59'h0};
231
232assign abortPacket = (parityError | par_error);
233
234/*--------------------------------------------------------------*/
235// Parity Check on Incoming Data
236/*--------------------------------------------------------------*/
237assign par_error = (UnCorrectError & ~DisableEccCheking);
238
239/*--------------------------------------------------------------*/
240// Straddle Bytes
241/*--------------------------------------------------------------*/
242assign straddleBytesOne = ({1'b0,FifoDataOut[132:130]} + 4'h1);
243assign straddleBytesTwo = ({1'b0,latchedStatus[2:0]} + 4'h1);
244
245/*--------------------------------------------------------------*/
246// Control Logic
247/*--------------------------------------------------------------*/
248assign collisionXmit = ClearStatistics & incPacketsTransmitted;
249assign collisionBytes = (ClearStatistics & (addEightBytes
250 |
251 addStraddleOne
252 |
253 addStraddleTwo
254 )
255 );
256
257always @ (posedge SysClk)
258 if (!Reset_L) PacketsTransmitted <= 16'b0;
259 else if (collisionXmit) PacketsTransmitted <= #`SD 16'h1;
260 else if (ClearStatistics) PacketsTransmitted <= #`SD 16'h0;
261 else if (WrPacketXmitted) PacketsTransmitted <= #`SD PioDataIn[15:0];
262 else if (incPacketsTransmitted) PacketsTransmitted <= #`SD PacketsTransmitted
263 +
264 16'b1;
265
266always @ (posedge SysClk)
267 if (!Reset_L) parityError <= 1'b0;
268 else if (ldFifoDataOut) parityError <= #`SD parityError | par_error;
269 else if (clearAllState) parityError <= #`SD 1'b0;
270
271always @ (posedge SysClk)
272 if (!Reset_L) fifoWasEmpty <= 1'b0;
273 else if (setFifoWasEmpty) fifoWasEmpty <= #`SD 1'b1;
274 else if (clrFifoWasEmpty) fifoWasEmpty <= #`SD 1'b0;
275
276always @ (posedge SysClk)
277 if (!Reset_L) detectedFifoEmpty <= 1'b0;
278 else if (setDetectedFifoEmpty) detectedFifoEmpty <= #`SD 1'b1;
279 else if (clrDetectedFifoEmpty) detectedFifoEmpty <= #`SD 1'b0;
280
281always @ (posedge SysClk)
282 if (!Reset_L) BytesTransmitted <= 16'b0;
283 else if (collisionBytes)
284 begin
285 if (addEightBytes) BytesTransmitted <= #`SD 16'd8;
286 else if (addStraddleOne) BytesTransmitted <= #`SD {12'h0,
287 straddleBytesOne};
288
289 else if (addStraddleTwo) BytesTransmitted <= #`SD {12'h0,
290 straddleBytesTwo};
291 end
292 else if (ClearStatistics) BytesTransmitted <= #`SD 16'h0;
293 else if (WrPacketXmitted) BytesTransmitted <= #`SD PioDataIn[31:16];
294 else if (addEightBytes) BytesTransmitted <= #`SD BytesTransmitted + 16'd8;
295 else if (addStraddleOne) BytesTransmitted <= #`SD BytesTransmitted
296 +
297 {12'h0, straddleBytesOne};
298
299 else if (addStraddleTwo) BytesTransmitted <= #`SD BytesTransmitted
300 +
301 {12'h0, straddleBytesTwo};
302
303always @ (posedge SysClk)
304 if (!Reset_L) packetEndsOnHighBits <= 1'b0;
305 else if (ldFifoDataOut) packetEndsOnHighBits <= #`SD lastLineOfPacket;
306 else if (clearAllState) packetEndsOnHighBits <= #`SD 1'b0;
307
308always @ (posedge SysClk)
309 if (!Reset_L) latchedAbort <= #`SD 1'b0;
310 else if (ldFifoDataOut) latchedAbort <= #`SD FifoDataOut[129];
311 else if (clearAllState) latchedAbort <= #`SD 1'b0;
312
313always @ (posedge SysClk)
314 if (!Reset_L) latchedStatus <= #`SD 4'h0;
315 else if (ldFifoDataOut) latchedStatus <= #`SD FifoDataOut[133:130];
316 else if (clearAllState) latchedStatus <= #`SD 4'h0;
317
318always @ (posedge SysClk)
319 if (!Reset_L) fifoHBits <= #`SD 64'h0;
320 else if (ldFifoDataOut) fifoHBits <= #`SD FifoDataOut[127:64];
321 else if (clearAllState) fifoHBits <= #`SD 64'b0;
322
323/*--------------------------------------------------------------*/
324// MAC Transfer Interface Logic
325/*--------------------------------------------------------------*/
326always @ (posedge SysClk)
327 if (!Reset_L) MAC_Ack <= 1'b0;
328 else MAC_Ack <= #`SD macAck;
329
330always @ (posedge SysClk)
331 if (!Reset_L) MAC_Tag <= 1'b0;
332 else MAC_Tag <= #`SD macTag;
333
334always @ (posedge SysClk)
335 if (!Reset_L) MAC_Abort <= 1'b0;
336 else MAC_Abort <= #`SD macAbort;
337
338always @ (posedge SysClk)
339 if (!Reset_L) MAC_Status <= #`SD 4'h0;
340 else if (ldStatus) MAC_Status <= #`SD FifoDataOut[133:130];
341 else if (ldLatchedStatus) MAC_Status <= #`SD latchedStatus;
342 else if (clearAllState) MAC_Status <= #`SD 4'h0;
343
344always @ (posedge SysClk)
345 if (!Reset_L) MAC_Data <= #`SD 64'h0;
346 else if (ldFifoDataOut) MAC_Data <= #`SD FifoDataOut[63:0];
347 else if (ldFifoHBits) MAC_Data <= #`SD fifoHBits;
348 else if (ldGigMACStatus) MAC_Data <= #`SD gigMACStatus;
349 else if (clearAllState) MAC_Data <= 64'h0;
350
351/*--------------------------------------------------------------*/
352// Mac Xfer State Vectors
353/*--------------------------------------------------------------*/
354always @(posedge SysClk)
355 if (!Reset_L) Mac_Xfer_State <= #`SD MAC_XFER_IDLE;
356 else Mac_Xfer_State <= #`SD nextXferState;
357
358/*--------------------------------------------------------------*/
359// MAC_ Transfer State Machine
360/*--------------------------------------------------------------*/
361function [3:0] XferDefaults;
362input [3:0] currentState;
363 begin
364 XferDefaults = currentState;
365 FifoRead = 1'b0;
366 macAck = 1'b0;
367 macTag = 1'b0;
368 macAbort = 1'b0;
369 ldFifoDataOut = 1'b0;
370 clearAllState = 1'b0;
371 setFifoWasEmpty = 1'b0;
372 clrFifoWasEmpty = 1'b0;
373 setDetectedFifoEmpty = 1'b0;
374 clrDetectedFifoEmpty = 1'b0;
375 incPacketsTransmitted = 1'b0;
376 addEightBytes = 1'b0;
377 addStraddleOne = 1'b0;
378 addStraddleTwo = 1'b0;
379 ldStatus = 1'b0;
380 ldLatchedStatus = 1'b0;
381 ldFifoHBits = 1'b0;
382 ldGigMACStatus = 1'b0;
383 end
384endfunction
385
386
387always @(/*AUTOSENSE*/Mac_Xfer_State or Txc_Enabled
388 or MAC_Req or FifoEmpty or EnableGMACMode
389 or lastLineOfPacket or packetEndsOnLowBits
390 or FifoDataOut or abortPacket
391 or packetEndsOnHighBits or detectedFifoEmpty
392 or fifoWasEmpty or parityError
393 or latchedAbort or MAC_Abort
394 )
395 begin
396 case(Mac_Xfer_State) // synopsys full_case parallel_case
397 /* 0in < case -full -parallel */
398 MAC_XFER_IDLE:
399 begin
400 nextXferState = XferDefaults(Mac_Xfer_State);
401
402 if (Txc_Enabled)
403 begin
404 if (MAC_Req)
405 begin
406 if (~FifoEmpty)
407 begin
408 FifoRead = 1'b1;
409 nextXferState = CHECK_FIFO;
410 end
411 end
412 end
413 end
414
415
416 CHECK_FIFO:
417 begin
418 nextXferState = XferDefaults(Mac_Xfer_State);
419
420 if (MAC_Req | EnableGMACMode)
421 begin
422 if (~FifoEmpty | lastLineOfPacket)
423 nextXferState = XFER_LOW_BITS_0;
424 end
425 end
426
427 XFER_LOW_BITS_0:
428 begin
429 nextXferState = XferDefaults(Mac_Xfer_State);
430 ldFifoDataOut = 1'b1;
431
432 if (MAC_Req | EnableGMACMode)
433 begin
434 macAck = 1'b1;
435
436 if (lastLineOfPacket & packetEndsOnLowBits)
437 begin
438 macAbort = (FifoDataOut[129] | abortPacket);
439 ldStatus = 1'b1;
440 macTag = 1'b1;
441 incPacketsTransmitted = 1'b1;
442 addStraddleOne = 1'b1;
443
444 if (EnableGMACMode)
445 nextXferState = XFER_STATUS;
446 else
447 nextXferState = WAIT_FOR_COUNT_DEC;
448 end
449 else
450 begin
451 nextXferState = XFER_HIGH_BITS_0;
452 addEightBytes = 1'b1;
453 end
454
455 if (~lastLineOfPacket)
456 begin
457 if (FifoEmpty)
458 setDetectedFifoEmpty = 1'b1;
459 else
460 FifoRead = 1'b1;
461 end
462 end
463 end
464
465
466 XFER_HIGH_BITS_0:
467 begin
468 nextXferState = XferDefaults(Mac_Xfer_State);
469
470 if (MAC_Req | EnableGMACMode)
471 begin
472 macAck = 1'b1;
473 ldFifoHBits = 1'b1;
474
475 if (packetEndsOnHighBits)
476 begin
477 macTag = 1'b1;
478 macAbort = (latchedAbort | parityError);
479 ldLatchedStatus = 1'b1;
480 incPacketsTransmitted = 1'b1;
481 addStraddleTwo = 1'b1;
482
483 if (EnableGMACMode)
484 nextXferState = XFER_STATUS;
485 else
486 nextXferState = WAIT_FOR_COUNT_DEC;
487 end
488 else // if (!packetEndsOnHighBits)
489 begin
490 if (EnableGMACMode)
491 nextXferState = XFER_LOW_BITS_1;
492 else if (detectedFifoEmpty)
493 nextXferState = WAIT_FOR_FIFO;
494 else
495 //else if (~FifoEmpty)
496 nextXferState = XFER_LOW_BITS_0;
497 //else
498 // nextXferState = CHECK_FIFO;
499
500 addEightBytes = 1'b1;
501 end
502 end
503 end
504
505
506 XFER_LOW_BITS_1:
507 begin
508 nextXferState = XferDefaults(Mac_Xfer_State);
509 macAck = 1'b1;
510 ldFifoDataOut = 1'b1;
511
512 if (~lastLineOfPacket)
513 begin
514 if (~FifoEmpty)
515 FifoRead = 1'b1;
516 else
517 setFifoWasEmpty = 1'b1;
518 end
519
520 if (lastLineOfPacket & packetEndsOnLowBits)
521 begin
522 macTag = 1'b1;
523 incPacketsTransmitted = 1'b1;
524 addStraddleOne = 1'b1;
525 nextXferState = XFER_STATUS;
526 end
527 else
528 begin
529 nextXferState = XFER_HIGH_BITS_1;
530 addEightBytes = 1'b1;
531 end
532 end
533
534
535 XFER_HIGH_BITS_1:
536 begin
537 nextXferState = XferDefaults(Mac_Xfer_State);
538 macAck = 1'b1;
539 ldFifoHBits = 1'b1;
540 nextXferState = WAIT_FOR_NO_REQ;
541
542 if (fifoWasEmpty & ~FifoEmpty)
543 begin
544 FifoRead = 1'b1;
545 clrFifoWasEmpty = 1'b1;
546 end
547
548 if (packetEndsOnHighBits)
549 begin
550 macTag = 1'b1;
551 incPacketsTransmitted = 1'b1;
552 addStraddleTwo = 1'b1;
553 end
554 else
555 addEightBytes = 1'b1;
556 end
557
558
559 WAIT_FOR_NO_REQ:
560 begin
561 nextXferState = XferDefaults(Mac_Xfer_State);
562
563 if (fifoWasEmpty & ~FifoEmpty)
564 begin
565 FifoRead = 1'b1;
566 clrFifoWasEmpty = 1'b0;
567 end
568
569 if (!MAC_Req)
570 begin
571 if (packetEndsOnHighBits)
572 nextXferState = CHECK_FOR_REQ;
573 else
574 nextXferState = CHECK_FOR_BURST_REQ;
575 end
576 end
577
578
579 CHECK_FOR_BURST_REQ:
580 begin
581 nextXferState = XferDefaults(Mac_Xfer_State);
582
583 if (MAC_Req)
584 begin
585 if (fifoWasEmpty)
586 begin
587 if (~FifoEmpty)
588 begin
589 FifoRead = 1'b1;
590 clrFifoWasEmpty = 1'b1;
591 nextXferState = CHECK_FIFO;
592 end
593 end
594 else if (~FifoEmpty | lastLineOfPacket)
595 nextXferState = XFER_LOW_BITS_0;
596 end
597 end
598
599
600 CHECK_FOR_REQ:
601 begin
602 nextXferState = XferDefaults(Mac_Xfer_State);
603
604 if (MAC_Req)
605 nextXferState = XFER_STATUS;
606 end
607
608
609 XFER_STATUS:
610 begin
611 nextXferState = XferDefaults(Mac_Xfer_State);
612 macAck = 1'b1;
613 macTag = 1'b1;
614 macAbort = MAC_Abort; // Don't know if need this
615 ldGigMACStatus = 1'b1;
616 nextXferState = WAIT_FOR_REQ_LOW;
617 end
618
619
620 WAIT_FOR_REQ_LOW:
621 begin
622 nextXferState = XferDefaults(Mac_Xfer_State);
623 clearAllState = 1'b1;
624
625 if (!MAC_Req)
626 nextXferState = MAC_XFER_IDLE;
627 end
628
629
630 WAIT_FOR_COUNT_DEC:
631 begin
632 nextXferState = XferDefaults(Mac_Xfer_State);
633 clearAllState = 1'b1;
634 nextXferState = MAC_XFER_IDLE;
635 end
636
637
638 WAIT_FOR_FIFO:
639 begin
640 nextXferState = XferDefaults(Mac_Xfer_State);
641 clrDetectedFifoEmpty = 1'b1;
642
643 if (MAC_Req)
644 begin
645 if (~FifoEmpty)
646 begin
647 FifoRead = 1'b1;
648 nextXferState = CHECK_FIFO;
649 end
650 end
651 end
652
653 endcase
654 end
655
656endmodule