Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_txc_packetAssy.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_txc_packetAssy.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_packetAssy.v.v
38 *
39 * Packet Assembly 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_packetAssy (
58 SysClk, // Clock
59 Reset_L, // Reset_L
60 PacketAssyDead,
61 Txc_Enabled, // Txc Enable
62 MAC_Enabled,
63
64 StoreForwardFifoRead,
65 StoreForwardEccControl,
66 StoreForwardFifoEmpty,
67 StoreForward_CorruptECCSingle,
68 StoreForward_CorruptECCDouble,
69 StoreForwardFifoWrite,
70 StoreForwardFifoReadStrobe,
71 StoreForwardReadPtr,
72 StoreForwardWritePtr,
73 PacketAssyEngineDataOut,
74
75 ReOrderFifoEmpty,
76 ReOrderUnCorrectError,
77 ReOrderFifoAlmostEmpty,
78 ReOrderFifoDataValid,
79 DisableEccCheking,
80 PacketAssyEngineDataIn,
81
82 ReOrderFifoRead,
83
84 CheckSumValid,
85 ChecksumValue,
86 StartTCPChecksum,
87 ChecksumPacketDone,
88 PacketType,
89 Layer3Version,
90 Layer3Start,
91 IPv4IPHeaderLen,
92
93 ClearStatistics,
94 WrPacketRequested,
95 WrPacketStuffed,
96 PioDataIn,
97 PacketsStuffed,
98 PktErrAbortCount,
99
100 PacketAssy_State
101 );
102
103`include "txc_defines.h"
104
105// MAC Global Signals
106input SysClk;
107input Reset_L;
108
109output PacketAssyDead;
110
111// Control Registers
112input Txc_Enabled;
113input MAC_Enabled;
114
115// Store and Forward Fifo
116input StoreForwardFifoRead;
117input [31:0] StoreForwardEccControl;
118
119output StoreForwardFifoEmpty;
120output StoreForward_CorruptECCSingle;
121output StoreForward_CorruptECCDouble;
122output StoreForwardFifoWrite;
123output StoreForwardFifoReadStrobe;
124output [9:0] StoreForwardReadPtr;
125output [9:0] StoreForwardWritePtr;
126output [135:0] PacketAssyEngineDataOut;
127
128// reg [9:0] StoreForwardWritePtr;
129
130// Re-Order Fifo
131input ReOrderFifoEmpty;
132input ReOrderUnCorrectError;
133input ReOrderFifoAlmostEmpty;
134input ReOrderFifoDataValid;
135input DisableEccCheking;
136input [135:0] PacketAssyEngineDataIn;
137
138output ReOrderFifoRead;
139
140reg ReOrderFifoRead;
141
142// CRC and Checksum Interface
143input CheckSumValid;
144input [15:0] ChecksumValue;
145
146output StartTCPChecksum;
147reg StartTCPChecksum;
148
149output ChecksumPacketDone;
150reg ChecksumPacketDone;
151
152output [1:0] PacketType;
153output [1:0] Layer3Version;
154output [1:0] Layer3Start;
155output [3:0] IPv4IPHeaderLen;
156
157//reg [1:0] Layer3Start;
158//reg [3:0] IPv4IPHeaderLen;
159//wire [4:0] IPv4IPHeaderLen_tmp;
160
161input ClearStatistics;
162input WrPacketRequested;
163input WrPacketStuffed;
164input [15:0] PioDataIn;
165
166output [15:0] PacketsStuffed;
167output [15:0] PktErrAbortCount;
168
169reg [15:0] PacketsStuffed;
170reg [15:0] PktErrAbortCount;
171
172// State machine registers
173output [3:0] PacketAssy_State;
174
175reg [3:0] PacketAssy_State;
176
177/*--------------------------------------------------------------*/
178// Reg & Wires
179/*--------------------------------------------------------------*/
180wire collisionRequested;
181wire ipVersion;
182wire noQueuedWrites;
183wire collision;
184wire collisionStuffed;
185wire incQueuedWrites;
186wire decQueuedWrites;
187wire loadControlHeader;
188wire decPacketLength;
189wire lastLineOfPacket;
190reg dropPacket;
191wire set_dropPacket_n;
192wire rst_dropPacket_n;
193wire insertLowWord;
194wire stuff_status;
195wire low_word_pkt_end;
196wire fifo_mac_abort;
197wire storeForwardfifoAlmostFull;
198reg storeForwardWriteConfirm;
199reg storeForwardWriteConfirm_r;
200reg StoreForwardFifoWrite;
201wire StoreForwardFifoWrite_n;
202wire llc_snap_pkt;
203wire vlan_pkt;
204wire [3:0] fifo_mac_stat;
205wire [3:0] ififo_mac_stat;
206wire [1:0] PacketType;
207wire [5:0] l4_start;
208wire [5:0] l4_stuff;
209reg [5:0] l4_stuff_dup_1;
210reg [5:0] l4_stuff_dup_2;
211reg [5:0] l4_stuff_dup_3;
212wire [6:0] pipeLineDelay;
213wire [6:0] memoryMode;
214wire [10:0] pointerDifference;
215wire [127:0] sfFifoDataIn;
216wire [7:0] msb_sfFifoDataIn;
217wire [9:0] cksStoreFwdffWptr_plus1_n;
218wire cks_stuffat_lastline;
219reg [7:0] msb_sfFifoDataIn_for_cks;
220
221reg readFifo;
222reg setLdControlHdr;
223reg ldControlHdr;
224reg enableFifoWrite;
225reg setEnableFifoWrite;
226reg setEnableFifoWrite_r;
227reg [15:0] setEnableFifoWrite_mr;
228reg clrEnableFifoWrite;
229reg storeForwardFifoFull;
230reg [2:0] lastByteBoundary;
231reg [3:0] nextPacketState;
232reg [5:0] queuedWrites;
233reg [9:0] readPtr;
234reg [9:0] shadowFifoWrPtr;
235reg [10:0] storeForwardSpaceAvailable;
236reg [13:0] packetLength;
237reg [13:0] readLength;
238reg [127:0] controlHeader;
239
240 // byteAlign data valid output
241wire ba_dv;
242wire [15:0] ba_dv_dup;
243wire ba_qwr_dv;
244wire ba_sop, ba_eop;
245wire [127:0] ba_data;
246
247 // byteAlign checksum ctrl output
248reg writeCks;
249reg [9:0] cksStoreFwdffWptr; // pktdata with cks write ptr position
250reg [127:0] pktDataWithCks; // pktData to have cksum overwrites
251wire cksen;
252wire StartTCPChecksum_n;
253wire ChecksumPacketDone_n;
254
255 // storeForward write ptr select data/cks_insert
256reg [9:0] ffStoreForwardWritePtr;
257wire [9:0] StoreForwardWritePtr_n;
258reg [9:0] StoreForwardWritePtr;
259
260 // read roff control output
261wire rcvEQorder;
262wire orderEnable;
263wire pktRdDone;
264wire roff_ok_n;
265
266 // input to byteAlign logic
267reg writeCks_n;
268reg sfConfirm_n; // from sm
269reg roff_dv_r;
270reg [17:0] roff_dv_r_dup;
271reg [135:0] roff_data_r;
272reg roff_data_abort_r;
273reg roff_uc_r; // registered uncorr ecc err
274reg roff_dv_nc_r; // non-conditioned roff data valid
275
276 // pad ctrl
277wire [4:0] ff_pktpad_n;
278
279 // pkt abort logic
280wire set_pktAbort_n;
281wire [17:0] set_pktAbort_dup_n;
282reg rst_pktAbort_n;
283reg pktAbort;
284//wire roff_parity_err_n;
285reg [9:0] rdFifoCnt;
286reg [9:0] rcvFifoCnt;
287wire rdEQrcvFifoCnt_n= (rdFifoCnt == rcvFifoCnt);
288reg noWrite;
289reg set_noWrite_n;
290reg rst_noWrite_n;
291reg errWrite, errWrite_n;
292reg force_ld_ControlHdr;
293wire missing_sop_err_n; // calc exp sop; roff not sop;
294wire premature_sop_err_n; // midl of pkt; roff sop;
295wire eop_err_n; // eop not match between calc, roff;
296
297reg PacketAssyDead;
298reg hdr_ecc_err_n;
299reg StoreForward_CorruptECCSingle;
300wire StoreForward_CorruptECCSingle_n;
301reg StoreForward_CorruptECCDouble;
302wire StoreForward_CorruptECCDouble_n;
303
304reg [135:0] PacketAssyEngineDataOut;
305wire [135:0] PacketAssyEngineDataOut_n;
306
307/*--------------------------------------------------------------*/
308// Parameters and Defines
309/*--------------------------------------------------------------*/
310parameter WRITE_PACKET_IDLE = 4'h0,
311 LOAD_CONTROL_HDR = 4'h1,
312 DECODE_CONTROL_HDR = 4'h2,
313 WRITE_PACKET_DATA = 4'h3,
314 FLUSH_PIPELINE = 4'h4,
315 WAIT_FOR_REORDER_FIFO = 4'h5,
316 WAIT_FOR_SF_FIFO = 4'h6;
317
318 // ??? not need WAIT_FOR_REORDER_FIFO/WAIT_FOR_SF_FIFO ??
319
320parameter WAIT_FOR_CKS_DONE = 4'h7,
321 PKT_CONFIRM = 4'h8,
322 ERR_HANDLE_0 = 4'h9,
323 ERR_HANDLE_1 = 4'ha,
324 ENABLE_FIFO_WRITE = 4'hb;
325
326
327//VCS coverage off
328// synopsys translate_off
329reg [192:1] PACKET_ASSY;
330
331
332always @(PacketAssy_State)
333begin
334 case(PacketAssy_State)
335 WRITE_PACKET_IDLE: PACKET_ASSY = "WRITE_PACKET_IDLE";
336 LOAD_CONTROL_HDR: PACKET_ASSY = "LOAD_CONTROL_HDR";
337 DECODE_CONTROL_HDR: PACKET_ASSY = "DECODE_CONTROL_HDR";
338 WRITE_PACKET_DATA: PACKET_ASSY = "WRITE_PACKET_DATA";
339 FLUSH_PIPELINE: PACKET_ASSY = "FLUSH_PIPELINE";
340 WAIT_FOR_REORDER_FIFO: PACKET_ASSY = "WAIT_FOR_REORDER_FIFO";
341 WAIT_FOR_SF_FIFO: PACKET_ASSY = "WAIT_FOR_SF_FIFO";
342 WAIT_FOR_CKS_DONE: PACKET_ASSY = "WAIT_FOR_CKS_DONE";
343 PKT_CONFIRM: PACKET_ASSY = "PKT_CONFIRM";
344 ERR_HANDLE_0: PACKET_ASSY = "ERR_HANDLE_0";
345 ERR_HANDLE_1: PACKET_ASSY = "ERR_HANDLE_1";
346 ENABLE_FIFO_WRITE: PACKET_ASSY = "ENABLE_FIFO_WRITE";
347 default: PACKET_ASSY = "UNKNOWN";
348 endcase
349end
350
351
352// synopsys translate_on
353//VCS coverage on
354
355/*--------------------------------------------------------------*/
356// Zero In Checks
357/*--------------------------------------------------------------*/
358// ??? dropPacket make flag ; @ parity, set; @ abort set;
359// rst flag at next new pkt
360always @ (posedge SysClk)
361 if (!Reset_L)
362 dropPacket<= #`SD 1'b0;
363 else if (set_dropPacket_n) dropPacket<= #`SD 1'b1;
364 else if (rst_dropPacket_n) dropPacket<= #`SD 1'b0;
365
366assign set_dropPacket_n= roff_dv_nc_r & roff_uc_r;
367 // set drop on every nc ecc err
368assign rst_dropPacket_n= setLdControlHdr; // reset flag at every state start
369
370/*--------------------------------------------------------------*/
371// Assigns
372/*--------------------------------------------------------------*/
373// assign PacketAssyDead = 1'b0;
374// assign StoreForward_CorruptECCSingle = 1'b0;
375// assign StoreForward_CorruptECCDouble = 1'b0;
376assign loadControlHeader = (ldControlHdr & ReOrderFifoDataValid);
377
378// *** original *******
379//assign decPacketLength = (StoreForwardFifoWrite && (packetLength != 14'h0));
380// *** original *******
381
382 // dec per ba_dv;
383 // don't wanna use StoreForwardFifoWrite since includes cksum write
384assign decPacketLength = ((enableFifoWrite & ba_dv) && (packetLength != 14'h0));
385
386assign lastLineOfPacket = (packetLength <= 14'd16);
387
388
389assign StoreForwardFifoReadStrobe = StoreForwardFifoRead;
390assign StoreForwardReadPtr = readPtr;
391
392
393/*--------------------------------------------------------------*/
394// Read logic
395/*--------------------------------------------------------------*/
396assign StoreForwardFifoEmpty = !Reset_L ? 1'b0
397 : (readPtr == shadowFifoWrPtr);
398
399always @ (posedge SysClk)
400 if (!Reset_L)
401 readPtr <= #`SD 10'h0;
402 else if (StoreForwardFifoRead && !StoreForwardFifoEmpty)
403 begin
404 if ({1'b0, readPtr} == `FIFO_SIZE_640_MINUS_1)
405 readPtr <= #`SD 10'h0;
406 else
407 readPtr <= #`SD readPtr + 10'd1;
408 end
409
410
411/*--------------------------------------------------------------*/
412// Write logic
413/*--------------------------------------------------------------*/
414 // chg StoreForwardWritePtr to ffStoreForwardWritePtr (fifo wptr value);
415 // StoreForwardWritePtr mux from ff wptr, cks wptr,
416assign StoreForwardWritePtr_n= (writeCks)?
417 cksStoreFwdffWptr : ffStoreForwardWritePtr;
418
419always @(posedge SysClk)
420 if (!Reset_L) StoreForwardWritePtr <= #`SD 10'h0;
421 else StoreForwardWritePtr <= #`SD StoreForwardWritePtr_n;
422 // this one align with added stage on storeForward fifo write
423 // synth fix
424
425
426always @ (posedge SysClk)
427 begin
428 if (!Reset_L)
429 storeForwardFifoFull <= 1'b0;
430 else if (ffStoreForwardWritePtr > readPtr)
431 begin
432 if ((ffStoreForwardWritePtr - readPtr) > 10'd638)
433 storeForwardFifoFull <= #`SD 1'b1;
434 else
435 storeForwardFifoFull <= #`SD 1'b0;
436 end
437 else if (ffStoreForwardWritePtr < readPtr)
438 begin
439 if ((readPtr - ffStoreForwardWritePtr) <= 10'd2)
440 storeForwardFifoFull <= #`SD 1'b1;
441 else
442 storeForwardFifoFull <= #`SD 1'b0;
443 end
444 else if (readPtr == ffStoreForwardWritePtr)
445 storeForwardFifoFull <= #`SD 1'b0;
446 end
447
448assign pointerDifference = (ffStoreForwardWritePtr < readPtr)
449 ? {1'b0, (ffStoreForwardWritePtr + 10'd640)}
450 -
451 {1'b0, readPtr}
452 : {1'b0, ffStoreForwardWritePtr} - {1'b0, readPtr};
453
454
455always @ (posedge SysClk)
456 if (!Reset_L)
457 storeForwardSpaceAvailable <= 11'h0;
458 else
459 storeForwardSpaceAvailable <= #`SD {
460 (`FIFO_SIZE_640 - {1'b0, pointerDifference[9:0]}
461 -
462 {10'h0, StoreForwardFifoWrite_n}
463 +
464 {10'h0, StoreForwardFifoRead})
465 };
466
467always @ (posedge SysClk)
468 if (!Reset_L)
469 ffStoreForwardWritePtr <= 10'h0;
470 else if (StoreForwardFifoWrite_n && !storeForwardFifoFull && !writeCks)
471 begin // do not incr if inserting checksum
472 if ({1'b0, ffStoreForwardWritePtr} == `FIFO_SIZE_640_MINUS_1)
473 ffStoreForwardWritePtr <= #`SD 10'h0;
474 else
475 ffStoreForwardWritePtr <= #`SD ffStoreForwardWritePtr + 10'd1;
476 end
477
478always @ (posedge SysClk)
479 if (!Reset_L)
480 shadowFifoWrPtr <= 10'h0;
481 else if (StoreForwardFifoWrite && storeForwardWriteConfirm_r)
482 shadowFifoWrPtr <= #`SD ffStoreForwardWritePtr + 10'd1;
483 else if (storeForwardWriteConfirm_r)
484 shadowFifoWrPtr <= #`SD ffStoreForwardWritePtr;
485 // confirm align with store fifo write at ram;
486 // current storeForwardWriteConfirm is a cycle later
487 // than writeCks, storeForwardWrite_n;
488 // confirm needs to be after or same time as ram
489 // write since it affects empty flag
490
491
492
493
494/*--------------------------------------------------------------*/
495// Load Header Control Word
496/*--------------------------------------------------------------*/
497always @ (posedge SysClk)
498 if (!Reset_L) controlHeader <= 128'h0;
499 else if (loadControlHeader) controlHeader <= #`SD PacketAssyEngineDataIn[127:0];
500 else if (force_ld_ControlHdr) controlHeader <= #`SD roff_data_r[127:0];
501
502/*--------------------------------------------------------------*/
503// Control Header Word Fields
504//
505// CKSUM_EN_PKT_TYPE[63:62]: Checksum PacketType
506// NOP => 00
507// TCP => 01
508// UDP => 10
509// RSVD => 11
510//
511// IP_VER[61]: IP Version
512// IPv4 => 0
513// IPv6 => 1
514//
515// LLC[57]: Logical Link Control
516// LLC/SNAP Encapsulated => 1
517//
518// VLAN[56]: Virtual Local Area Network
519// VLAN PKT => 1
520//
521// IHL[55:52]: IP Header Length in Quadlets (4 Bytes)
522// IPV4 Header Length => 5-15 => 20 -> 60 Bytes
523// IPV6 Header Length => 10 => 40 Bytes
524//
525// The three following L3START, L4START & L4STUFF are in multiples of 2 bytes,
526// starting from the L2 frame.
527//
528// L3START[51:48]: Layer 3 Start
529// L4START[45:40]: Layer 4 Start
530// L4STUFF[37:32]: Layer 4 Checksum stuff offset
531//
532// TOT_XFER_LENGTH[29:16]: Total transfer length, sum of all gathers including
533// control header in bytes.
534//
535// PAD[2:0]: Number of pad bytes in multiples of two bytes between transmit
536// header and the start of the L2 Frame.Tota
537//
538/*--------------------------------------------------------------*/
539assign PacketType = controlHeader[`CKSUM_EN_PKT_TYPE];
540assign ipVersion = controlHeader[`IP_VER];
541assign llc_snap_pkt = controlHeader[`LLC_SNAP_PACKET];
542assign vlan_pkt = controlHeader[`VLAN_PACKET];
543assign IPv4IPHeaderLen = controlHeader[`IHL];
544assign l4_start = controlHeader[`L4START];
545assign l4_stuff = controlHeader[`L4STUFF];
546
547
548assign Layer3Version = ipVersion ? `IPV6 : `IPV4;
549assign Layer3Start = {llc_snap_pkt, vlan_pkt};
550
551// assign IPv4IPHeaderLen = 4'd5; // ??? constant ???
552//assign IPv4IPHeaderLen_tmp = l4_start - controlHeader[`L3START];// ??? constant ???
553//assign IPv4IPHeaderLen = {1'b0,IPv4IPHeaderLen_tmp[4:1]};
554//assign cksen= !(PacketType==2'b00);
555assign cksen = ((PacketType==2'b01) || (PacketType==2'b10));
556
557always @ (posedge SysClk)
558 if (!Reset_L)
559 begin
560 l4_stuff_dup_1 <= 6'h0;
561 l4_stuff_dup_2 <= 6'h0;
562 l4_stuff_dup_3 <= 6'h0;
563 end
564 else
565 begin
566 l4_stuff_dup_1<= #`SD controlHeader[`L4STUFF];
567 l4_stuff_dup_2<= #`SD controlHeader[`L4STUFF];
568 l4_stuff_dup_3<= #`SD controlHeader[`L4STUFF];
569 end
570
571/*--------------------------------------------------------------*/
572// controlHeader[`L3START] in two byte offsets, including Type
573/*--------------------------------------------------------------*/
574//always @ (controlHeader)
575// begin
576// case (controlHeader[`L3START]) // synopsys full_case parallel_case
577// /* 0in < case -full -parallel */
578// 4'd7: Layer3Start = `ETHERNET_PKT;
579// 4'd9: Layer3Start = `VLAN_ONLY;
580// 4'd11: Layer3Start = `LLC_SNAP_ONLY;
581// 4'd13: Layer3Start = `LLC_SNAP_PLUS_VLAN;
582// default: Layer3Start = 2'b00;
583// endcase
584// end
585
586/*--------------------------------------------------------------*/
587// Packet Length
588/*--------------------------------------------------------------*/
589assign pipeLineDelay = 7'd2;
590assign memoryMode = ({1'b0, queuedWrites} + pipeLineDelay);
591assign storeForwardfifoAlmostFull = (storeForwardSpaceAvailable
592 <=
593 (11'd2 + {4'h0, memoryMode}));
594
595/*--------------------------------------------------------------*/
596// Packet Length
597/*--------------------------------------------------------------*/
598// wire [13:0] adj_ctrlhdr_pktlen_n= controlHeader[`TOT_XFER_LENGTH];
599
600wire [13:0] adj_ctrlhdr_pktlen_n= controlHeader[`TOT_XFER_LENGTH]-
601 {9'h0, ff_pktpad_n};
602 // tb len is ntw_pktlen + pad
603/*
604 use this when tb updated
605wire [13:0] adj_ctrlhdr_pktlen_n= controlHeader[`TOT_XFER_LENGTH]-
606 {9'h0, 5'd16} - {9'h0, ff_pktpad_n};
607*/
608
609 // ???? gather list is ntw_pktlen + ctrlHdr + pad
610 // controlHeader[`TOT_XFER_LENGTH] - {9'h0, 5'd16} - {9'h0, ff_pktpad_n};
611 // right now tb's pktlen in ctrlhdr field is ntw_pktlen
612 // this is used in load of :
613 // packetLength - sf_fifo data in (16B - aligned)
614 // readLength - ro_fifo read cnt ctrl (non-16B)
615 // pktLength - ro_fifo data out (dv) cnt (non-16Bs)
616 //
617
618 // use ctrlHeader (reg out) to do len calc instead of data from ram
619always @ (posedge SysClk)
620 if (!Reset_L) packetLength <= 14'h0;
621 else if (setEnableFifoWrite_r)
622 packetLength <= #`SD adj_ctrlhdr_pktlen_n;
623 else if (decPacketLength)
624 begin
625 if (lastLineOfPacket)
626 packetLength <= #`SD 14'd0;
627 else if (decPacketLength)
628 packetLength <= #`SD packetLength - 14'd16;
629 end
630
631always @ (posedge SysClk)
632 if (!Reset_L) readLength <= 14'h0;
633 else if (setEnableFifoWrite_r)
634 readLength <= #`SD adj_ctrlhdr_pktlen_n;
635
636/*--------------------------------------------------------------*/
637// Packet Data Write
638/*--------------------------------------------------------------*/
639
640// ecc error force
641reg firstline, secondline;
642wire rst_firstline_n= firstline & ba_dv;
643wire rst_secondline_n= secondline & ba_dv;
644
645always @(posedge SysClk)
646 if (!Reset_L) begin
647 firstline <= #`SD 1'b0;
648 secondline <= #`SD 1'b0;
649 end
650 else begin
651 if(setEnableFifoWrite_r) firstline <= #`SD 1'b1;
652 else if(rst_firstline_n) firstline <= #`SD 1'b0;
653
654 if(rst_firstline_n) secondline <= #`SD 1'b1;
655 else if(rst_secondline_n) secondline <= #`SD 1'b0;
656 end
657
658reg pkt_toggle_flag;
659reg pkt_one_forced_flag;
660
661always @(posedge SysClk)
662 if (!Reset_L) begin
663 pkt_toggle_flag<= #`SD 1'b0;
664 pkt_one_forced_flag<= #`SD 1'b0;
665 end
666 else begin
667 if(setEnableFifoWrite_r) pkt_toggle_flag<= #`SD ~pkt_toggle_flag;
668
669 if(!pkt_one_forced_flag && (StoreForward_CorruptECCSingle_n || StoreForward_CorruptECCDouble_n))
670 pkt_one_forced_flag<= #`SD 1'b1;
671 else if(setEnableFifoWrite_r && !StoreForwardEccControl[8]) // reset forced if ctrl off
672 pkt_one_forced_flag<= #`SD 1'b0;
673 end
674
675wire force_err_en_n= (~pkt_one_forced_flag & StoreForwardEccControl[8]) || // force at first one
676 (pkt_toggle_flag & StoreForwardEccControl[9]) || // force at toggle=1
677 (StoreForwardEccControl[10]); // all pkts
678
679assign StoreForward_CorruptECCSingle_n= StoreForwardFifoWrite_n & StoreForwardEccControl[16] &
680 force_err_en_n &
681 ((StoreForwardEccControl[0] & firstline) ||
682 (StoreForwardEccControl[1] & secondline) ||
683 (StoreForwardEccControl[2] & stuff_status));
684
685assign StoreForward_CorruptECCDouble_n= StoreForwardFifoWrite_n & StoreForwardEccControl[17] &
686 force_err_en_n &
687 ((StoreForwardEccControl[0] & firstline) ||
688 (StoreForwardEccControl[1] & secondline) ||
689 (StoreForwardEccControl[2] & stuff_status));
690
691always @(posedge SysClk)
692 if (!Reset_L)
693 StoreForward_CorruptECCSingle<= #`SD 1'b0;
694 else
695 StoreForward_CorruptECCSingle<= #`SD StoreForward_CorruptECCSingle_n;
696
697always @(posedge SysClk)
698 if (!Reset_L)
699 StoreForward_CorruptECCDouble<= #`SD 1'b0;
700 else
701 StoreForward_CorruptECCDouble<= #`SD StoreForward_CorruptECCDouble_n;
702
703
704always @(posedge SysClk)
705 if (!Reset_L) begin
706 PacketAssyDead<= #`SD 1'b0;
707 end
708 else begin
709 PacketAssyDead<= #`SD hdr_ecc_err_n;
710 end
711
712// *** original *******
713// assign stuff_status = (lastLineOfPacket & enableFifoWrite & ReOrderFifoDataValid);
714// *** original *******
715
716assign collisionStuffed = ClearStatistics & storeForwardWriteConfirm;
717
718always @(posedge SysClk)
719 if (!Reset_L)
720 PacketsStuffed <= #`SD 16'h0;
721 else if(collisionStuffed)
722 PacketsStuffed <= #`SD 16'h1;
723 else if(ClearStatistics)
724 PacketsStuffed <= #`SD 16'h0;
725 else if(WrPacketStuffed)
726 PacketsStuffed <= #`SD PioDataIn[15:0];
727 else if(storeForwardWriteConfirm)
728 PacketsStuffed <= #`SD PacketsStuffed + 16'h1;
729
730
731 // align with new valid
732assign stuff_status = (lastLineOfPacket & enableFifoWrite & ba_dv);
733
734assign low_word_pkt_end = stuff_status & insertLowWord;
735assign fifo_mac_abort = stuff_status & dropPacket;
736assign fifo_mac_stat = stuff_status ? ififo_mac_stat : 4'h0;
737
738assign insertLowWord = (lastLineOfPacket
739 &&
740 ((packetLength <= 14'd8) && (packetLength >= 14'h0))
741 );
742
743assign ififo_mac_stat = {1'b0, lastByteBoundary};
744
745
746always @ (packetLength)
747 begin
748 case ({4'h0, packetLength[2:0]}) // synopsys full_case parallel_case
749 /* 0in < case -full -parallel */
750 `ONE_BYTE: lastByteBoundary = `OFFSET_ZERO;
751 `TWO_BYTES: lastByteBoundary = `OFFSET_ONE;
752 `THREE_BYTES: lastByteBoundary = `OFFSET_TWO;
753 `FOUR_BYTES: lastByteBoundary = `OFFSET_THREE;
754 `FIVE_BYTES: lastByteBoundary = `OFFSET_FOUR;
755 `SIX_BYTES: lastByteBoundary = `OFFSET_FIVE;
756 `SEVEN_BYTES: lastByteBoundary = `OFFSET_SIX;
757 default: lastByteBoundary = `OFFSET_SEVEN;
758 endcase
759 end
760
761
762/*--------------------------------------------------------------*/
763// Packet Write variables
764/*--------------------------------------------------------------*/
765
766// *** original *******
767/*
768 assign StoreForwardFifoWrite = (enableFifoWrite & ReOrderFifoDataValid);
769 assign sfFifoDataIn = enableFifoWrite
770 ? PacketAssyEngineDataIn[127:0] : 128'h0;
771*/
772// *** original *******
773
774 // align with new valid; cksum add
775assign StoreForwardFifoWrite_n = (enableFifoWrite & ba_dv) | writeCks | errWrite_n;
776assign sfFifoDataIn = (enableFifoWrite) ? ba_data: pktDataWithCks;
777
778// editing ....??
779 // check if cks stuff occurs at lastline of a pkt
780 // align with writeCks
781assign cksStoreFwdffWptr_plus1_n= ({1'b0, cksStoreFwdffWptr}==`FIFO_SIZE_640_MINUS_1)?
782 10'h0 : (cksStoreFwdffWptr + 10'h1);
783assign cks_stuffat_lastline= (cksStoreFwdffWptr_plus1_n == StoreForwardWritePtr);
784 // StoreForwardWritePtr already pointing to next location;
785 // therefore needs to compare with plus1
786
787assign msb_sfFifoDataIn= (enableFifoWrite)?
788 {stuff_status, low_word_pkt_end,
789 fifo_mac_stat, fifo_mac_abort,stuff_status} :
790 ((cks_stuffat_lastline)? msb_sfFifoDataIn_for_cks : 8'h0);
791
792
793
794assign PacketAssyEngineDataOut_n = (errWrite_n)? {1'b1, 1'b0, 4'h0, 1'b1, 1'b1, 128'h0} :
795 {msb_sfFifoDataIn, sfFifoDataIn};
796
797/* positon of sffdata bits
798 {stuff_status, //[135]
799 low_word_pkt_end, //[134]
800 fifo_mac_stat, //[133:130]
801 fifo_mac_abort, //[129]
802 stuff_status, //[128]
803 sfFifoDataIn}; //[127:0]
804*/
805
806always @(posedge SysClk)
807 if (!Reset_L)
808 msb_sfFifoDataIn_for_cks<= #`SD 8'h0;
809 else
810 if(stuff_status) msb_sfFifoDataIn_for_cks<= #`SD msb_sfFifoDataIn;
811 // store status field in case stuff cks at last line
812
813
814always @(posedge SysClk)
815 if (!Reset_L)
816 PacketAssyEngineDataOut <= #`SD 136'h0;
817 else
818 PacketAssyEngineDataOut <= #`SD PacketAssyEngineDataOut_n;
819
820always @(posedge SysClk)
821 if (!Reset_L) StoreForwardFifoWrite <= #`SD 1'b0;
822 else StoreForwardFifoWrite <= #`SD StoreForwardFifoWrite_n;
823
824// *** original *******
825// assign storeForwardWriteConfirm = clrEnableFifoWrite;
826// *** original *******
827
828 // move confirm to after cks insert
829always @(posedge SysClk)
830 if (!Reset_L) storeForwardWriteConfirm <= #`SD 1'b0;
831 else storeForwardWriteConfirm <= #`SD sfConfirm_n | errWrite;
832
833always @(posedge SysClk)
834 if (!Reset_L) storeForwardWriteConfirm_r <= #`SD 1'b0;
835 else storeForwardWriteConfirm_r <= #`SD storeForwardWriteConfirm;
836
837// *** original *******
838// assign collision = (readFifo & ReOrderFifoDataValid);
839//assign decQueuedWrites = (ReOrderFifoDataValid && (queuedWrites != 6'h0));
840// *** original *******
841
842 // align with new dv
843assign collision = (readFifo & ba_qwr_dv);
844
845assign noQueuedWrites = (queuedWrites == 6'h0);
846
847assign incQueuedWrites = readFifo;
848
849assign decQueuedWrites = (ba_qwr_dv && (queuedWrites != 6'h0));
850
851always @(posedge SysClk)
852 if (!Reset_L) ReOrderFifoRead <= #`SD 1'b0;
853 else ReOrderFifoRead <= #`SD readFifo;
854
855
856always @(posedge SysClk)
857 if (!Reset_L) ldControlHdr <= #`SD 1'b0;
858 else if (setLdControlHdr) ldControlHdr <= #`SD 1'b1;
859 else if (ReOrderFifoDataValid) ldControlHdr <= #`SD 1'b0;
860
861always @(posedge SysClk)
862 if (!Reset_L) enableFifoWrite <= #`SD 1'b0;
863 else if (setEnableFifoWrite) enableFifoWrite <= #`SD 1'b1;
864 else if (clrEnableFifoWrite) enableFifoWrite <= #`SD 1'b0;
865
866always @(posedge SysClk)
867 if (!Reset_L) queuedWrites <= #`SD 6'h0;
868 else if (collision) queuedWrites <= #`SD queuedWrites;
869 else if (incQueuedWrites) queuedWrites <= #`SD queuedWrites + 1;
870 else if (decQueuedWrites) queuedWrites <= #`SD queuedWrites - 1;
871
872
873/*--------------------------------------------------------------*/
874// Packet Assembly State Vector
875/*--------------------------------------------------------------*/
876always @(posedge SysClk)
877 if (!Reset_L) PacketAssy_State <= #`SD WRITE_PACKET_IDLE;
878 else PacketAssy_State <= #`SD nextPacketState;
879
880always @(posedge SysClk)
881 if (!Reset_L) setEnableFifoWrite_r <= #`SD 1'b0;
882 else setEnableFifoWrite_r <= #`SD setEnableFifoWrite;
883
884always @(posedge SysClk)
885 if (!Reset_L) setEnableFifoWrite_mr <= #`SD 16'h0;
886 else setEnableFifoWrite_mr <= #`SD {16{setEnableFifoWrite}};
887
888/*--------------------------------------------------------------*/
889// Packet Assembly State Machine
890/*--------------------------------------------------------------*/
891/*
892function [3:0] AssemblyDefaults;
893input [3:0] currentState;
894 begin
895 AssemblyDefaults = currentState;
896 readFifo = 1'b0;
897 setLdControlHdr = 1'b0;
898 setEnableFifoWrite = 1'b0;
899 clrEnableFifoWrite = 1'b0;
900 writeCks_n= 1'b0;
901 sfConfirm_n= 1'b0;
902 set_noWrite_n= 1'b0; // err handle
903 rst_noWrite_n= 1'b0; // err handle
904 rst_pktAbort_n= 1'b0;
905 errWrite_n= 1'b0;
906 force_ld_ControlHdr= 1'b0;
907 end
908endfunction
909*/
910
911assign roff_ok_n= ({ReOrderFifoAlmostEmpty,ReOrderFifoEmpty} == 2'b00) || // sth in roff
912 (({ReOrderFifoAlmostEmpty,ReOrderFifoEmpty} == 2'b10) && rcvEQorder);
913 // in case of residual: leftover dataline sitting between
914 // empty and almostEmpty; instead of waiting next
915 // new data to push it out of almostEmpty, read
916 // one line at a time till empty;
917
918always @(/*AUTOSENSE*/CheckSumValid or MAC_Enabled or PacketAssy_State
919 or ReOrderFifoAlmostEmpty or ReOrderFifoDataValid
920 or ReOrderFifoEmpty or Txc_Enabled
921 or cksen or noQueuedWrites or noWrite
922 or orderEnable or pktRdDone or rcvFifoCnt or rdEQrcvFifoCnt_n
923 or roff_data_r or roff_ok_n or ReOrderUnCorrectError
924 or DisableEccCheking or roff_uc_r
925 or set_pktAbort_dup_n or storeForwardfifoAlmostFull) begin
926
927 nextPacketState = PacketAssy_State;
928 readFifo = 1'b0;
929 setLdControlHdr = 1'b0;
930 setEnableFifoWrite = 1'b0;
931 clrEnableFifoWrite = 1'b0;
932 writeCks_n= 1'b0;
933 sfConfirm_n= 1'b0;
934 set_noWrite_n= 1'b0; // err handle
935 rst_noWrite_n= 1'b0; // err handle
936 rst_pktAbort_n= 1'b0;
937 errWrite_n= 1'b0;
938 force_ld_ControlHdr= 1'b0;
939 hdr_ecc_err_n= 1'b0;
940 case(PacketAssy_State)
941 /* 0in < case -full -parallel*/
942 WRITE_PACKET_IDLE:
943 begin
944 // nextPacketState = AssemblyDefaults(PacketAssy_State);
945
946 if (Txc_Enabled)
947 begin
948 if (MAC_Enabled)
949 begin
950 if (~(ReOrderFifoEmpty | ReOrderFifoAlmostEmpty))
951 begin
952 readFifo = 1'b1;
953 setLdControlHdr = 1'b1;
954 nextPacketState = LOAD_CONTROL_HDR;
955 end
956 end
957 end
958 end
959
960 LOAD_CONTROL_HDR: // load roff data (non-reg) to controlHeader
961 begin
962 // nextPacketState = AssemblyDefaults(PacketAssy_State);
963
964 if (ReOrderFifoDataValid) begin
965 hdr_ecc_err_n= ReOrderUnCorrectError & ~DisableEccCheking;
966 nextPacketState = DECODE_CONTROL_HDR;
967 end
968 end
969
970 DECODE_CONTROL_HDR: // decode loaded controlHeader;
971 begin // ctrl header loaded in roff_data_r; check for err
972 if(set_pktAbort_dup_n[16]) begin
973 set_noWrite_n= 1'b1; // @soh, no pkt write
974 nextPacketState= ERR_HANDLE_0;
975 end
976 else begin
977 setEnableFifoWrite = 1'b1;
978 nextPacketState = ENABLE_FIFO_WRITE;
979 end
980 end
981
982 ENABLE_FIFO_WRITE:
983 begin // flop in setEnableFifoWrite; timing fix
984 // nextPacketState = AssemblyDefaults(PacketAssy_State);
985 nextPacketState = WRITE_PACKET_DATA;
986 end
987
988 WRITE_PACKET_DATA:
989 begin
990 // nextPacketState = AssemblyDefaults(PacketAssy_State);
991
992 if(set_pktAbort_dup_n[17]) begin
993 if(rcvFifoCnt==10'h2) set_noWrite_n= 1'b1; // @sop
994 nextPacketState= ERR_HANDLE_0;
995 end
996 else begin
997 readFifo= roff_ok_n & (~storeForwardfifoAlmostFull) &
998 orderEnable;
999
1000 if (pktRdDone) nextPacketState = FLUSH_PIPELINE;
1001 end
1002 end
1003
1004 FLUSH_PIPELINE:
1005 begin
1006 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1007
1008 if (noQueuedWrites)
1009 begin
1010 clrEnableFifoWrite = 1'b1;
1011 nextPacketState = (cksen)? WAIT_FOR_CKS_DONE : PKT_CONFIRM;
1012
1013 end
1014 end
1015
1016 WAIT_FOR_REORDER_FIFO:
1017 begin
1018 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1019
1020 if (~(ReOrderFifoEmpty | ReOrderFifoAlmostEmpty))
1021 begin
1022 if (~storeForwardfifoAlmostFull)
1023 nextPacketState = WRITE_PACKET_DATA;
1024 else
1025 nextPacketState = WAIT_FOR_SF_FIFO;
1026 end
1027 else
1028 nextPacketState = WAIT_FOR_REORDER_FIFO;
1029 end
1030
1031 WAIT_FOR_SF_FIFO:
1032 begin
1033 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1034
1035 if (~storeForwardfifoAlmostFull)
1036 begin
1037 if (~(ReOrderFifoEmpty | ReOrderFifoAlmostEmpty))
1038 nextPacketState = WRITE_PACKET_DATA;
1039 else
1040 nextPacketState = WAIT_FOR_REORDER_FIFO;
1041 end
1042 else
1043 nextPacketState = WAIT_FOR_SF_FIFO;
1044 end
1045
1046 WAIT_FOR_CKS_DONE:
1047 begin
1048 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1049
1050 if(CheckSumValid) begin
1051 writeCks_n= 1'b1;
1052 nextPacketState = PKT_CONFIRM;
1053 end
1054 end
1055
1056 PKT_CONFIRM:
1057 begin
1058 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1059
1060 sfConfirm_n= 1'b1;
1061 nextPacketState = WRITE_PACKET_IDLE;
1062 end
1063
1064 ERR_HANDLE_0: // wait read/rcv equal and flushed;
1065 // write sf_ff with drop if err not at sop;
1066 begin
1067 // nextPacketState = AssemblyDefaults(PacketAssy_State);
1068 if(rdEQrcvFifoCnt_n && noQueuedWrites) begin
1069 // Cnt align with roff_data_r
1070 errWrite_n= ~noWrite; // confirm at nxt cycle errWrite
1071 rst_noWrite_n= noWrite;
1072 nextPacketState = ERR_HANDLE_1;
1073 end
1074 end
1075
1076 ERR_HANDLE_1: // read off roff until good sop
1077 begin
1078 if(rdEQrcvFifoCnt_n) begin
1079 // Cnt align with roff_data_r
1080 // check if next sop (good pkt)
1081 if(roff_data_r[`ROFF_SOP] & ~roff_data_r[`ROFF_ABORT]
1082 & ~roff_data_r[`ROFF_EOP] & ~roff_uc_r) begin
1083 rst_pktAbort_n= 1'b1;
1084 force_ld_ControlHdr= 1'b1;
1085 nextPacketState = DECODE_CONTROL_HDR;
1086 clrEnableFifoWrite = 1'b1;
1087 end
1088 else readFifo= ~ReOrderFifoEmpty; // continue to read
1089 end
1090 end
1091 endcase
1092 end
1093
1094/*--------------------------------------------------------------*/
1095// End of Packet Assembly State Machine
1096/*--------------------------------------------------------------*/
1097
1098
1099 always @(posedge SysClk) begin
1100 if(!Reset_L) begin
1101 roff_dv_r<= #`SD 1'b0;
1102 roff_dv_r_dup<= #`SD 18'h0;
1103 roff_data_abort_r<= #`SD 1'b0;
1104 roff_uc_r<= #`SD 1'b0;
1105 roff_dv_nc_r<= #`SD 1'b0;
1106 end
1107 else begin
1108 roff_dv_r<= #`SD ReOrderFifoDataValid & ~set_pktAbort_n & ~pktAbort;
1109 // stop valid data to proc pipe if in abort mode
1110 roff_dv_r_dup<= #`SD {18{(ReOrderFifoDataValid & ~set_pktAbort_n & ~pktAbort)}};
1111 // stop valid data to proc pipe if in abort mode
1112 roff_data_abort_r<= #`SD PacketAssyEngineDataIn[`ROFF_ABORT];
1113 roff_uc_r<= #`SD ReOrderUnCorrectError & ~DisableEccCheking;
1114 roff_dv_nc_r<= #`SD ReOrderFifoDataValid; // non-conditioned roff data valid
1115 end
1116 end
1117
1118 always @(posedge SysClk)
1119 if (!Reset_L) roff_data_r<= #`SD 136'h0;
1120 else if (ReOrderFifoDataValid) roff_data_r<= #`SD PacketAssyEngineDataIn;
1121
1122 assign StartTCPChecksum_n= ba_sop & cksen;
1123 assign ChecksumPacketDone_n= ba_eop & cksen;
1124
1125 always @(posedge SysClk)
1126 if(!Reset_L) begin
1127 StartTCPChecksum<= #`SD 1'b0;
1128 ChecksumPacketDone<= #`SD 1'b0;
1129 end
1130 else begin // add stage to match StoreForwardFifoWrite
1131 // stage added to reduce logic stage for synth timing purpose
1132 StartTCPChecksum<= #`SD StartTCPChecksum_n;
1133 ChecksumPacketDone<= #`SD ChecksumPacketDone_n;
1134 end
1135
1136
1137wire roffDataValid= roff_dv_r;
1138wire [135:0] roffDataOut= roff_data_r;
1139wire [17:0] roffDataValid_dup= roff_dv_r_dup;
1140
1141
1142// *****************************
1143// ff sop (ctrl_hdr, pkt_data)
1144// *****************************
1145 reg startOfPkt;
1146 always @(posedge SysClk) begin
1147 if (!Reset_L) startOfPkt <= #`SD 1'b0;
1148 else if (setEnableFifoWrite_r) startOfPkt <= #`SD 1'b1;
1149 // current ff_data is ctrl hdr; next ff_data is sop;
1150 else if (roffDataValid) startOfPkt <= #`SD 1'b0;
1151 end
1152
1153
1154// *****************************
1155// pkt data sop
1156// *****************************
1157 reg startHdr;
1158 always @(posedge SysClk) begin
1159 if (!Reset_L) startHdr <= #`SD 1'b0;
1160 else if (loadControlHeader) startHdr <= #`SD 1'b1;
1161 // current ff_data (non-flop) is ctrl hdr;
1162 // next ff_data (non-flop) is sop;
1163 // loading ff_data (non-flop) to ctrlHeader reg;
1164 // eval logic look at roffData (flopped) at
1165 // startHdr assert cycle
1166 else if (roffDataValid) startHdr <= #`SD 1'b0;
1167 end
1168
1169
1170// *****************************
1171// ff eop
1172// *****************************
1173 reg pktProc; // use pktProc to avoid sampling roffDataValid of ctrl_hdr's
1174 // hdr...data_sop_r....data_eop_r
1175 // |------------------------|
1176 //
1177 reg [15:0] pktProc_dup;
1178
1179 wire [4:0] ff_byteOffset;
1180 wire [4:0] force_ff_byteOffset_n= (roffDataValid)? // zero out in invalid data state
1181 {~(|ff_byteOffset[3:0]), ff_byteOffset[3:0]} : 5'h0;
1182 // force 5'd16 if 0
1183
1184 reg [13:0] pktLength; // pktlen at each ro_fifo read
1185
1186 wire [13:0] pktLength_n= pktLength - {9'h0, force_ff_byteOffset_n};
1187 // pktLength_n can also be used in readFifo logic;
1188 // at time when (rcv==order) && (rdCnt==0), if remain length >16B,
1189 // update rdCnt to remain 16B in order to make bursty reads;
1190 //
1191
1192 // pktLength valid only after setEnableFifoWrite
1193 wire endOfPkt_n= pktProc && roffDataValid && (pktLength <= {9'h0, force_ff_byteOffset_n});
1194 wire decPktLength= pktProc & roffDataValid & !endOfPkt_n;
1195
1196
1197 always @ (posedge SysClk) begin
1198 if (!Reset_L) pktLength <= 14'h0;
1199 else if(setEnableFifoWrite_r)
1200 pktLength <= #`SD adj_ctrlhdr_pktlen_n;
1201 // control header pktlen field load
1202 // ???? gather list is ntw_pktlen + ctrlHdr + pad
1203 // controlHeader[`TOT_XFER_LENGTH] - {9'h0, 5'd16} - {9'h0, ff_pktpad_n};
1204 // right now tb's pktlen in ctrlhdr field is ntw_pktlen
1205 //
1206 else if(decPktLength)
1207 pktLength <= #`SD pktLength_n;
1208 end // always
1209
1210// *****************************
1211// pkt proc bit; valid after pkt ctrl_hdr;
1212// ctrl_hdr...sop... eop; include ..or.. before sop
1213// pkt proc deassert when pkt abort (one cycle later)
1214// *****************************
1215 always @(posedge SysClk) begin
1216 if (!Reset_L) begin
1217 pktProc <= #`SD 1'b0;
1218 pktProc_dup <= #`SD 16'h0;
1219 end
1220 else begin
1221 if (setEnableFifoWrite_r) begin
1222 pktProc <= #`SD 1'b1;
1223 pktProc_dup <= #`SD 16'hffff;
1224 end
1225 else begin
1226 if ((endOfPkt_n & pktProc) || set_pktAbort_n) begin
1227 pktProc <= #`SD 1'b0;
1228 pktProc_dup <= #`SD 16'h0;
1229 end
1230 end
1231 end
1232 end
1233
1234// *****************************
1235// pkt abort
1236// *****************************
1237 assign set_pktAbort_n= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1238 premature_sop_err_n | eop_err_n) & roffDataValid;
1239 // roffDataValid (roff_dv_r) reset by set_pktAbort_n,
1240 // pktAbort in subsequent cycles;
1241 assign set_pktAbort_dup_n[0]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1242 premature_sop_err_n | eop_err_n) & roffDataValid_dup[0];
1243 assign set_pktAbort_dup_n[1]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1244 premature_sop_err_n | eop_err_n) & roffDataValid_dup[1];
1245 assign set_pktAbort_dup_n[2]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1246 premature_sop_err_n | eop_err_n) & roffDataValid_dup[2];
1247 assign set_pktAbort_dup_n[3]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1248 premature_sop_err_n | eop_err_n) & roffDataValid_dup[3];
1249 assign set_pktAbort_dup_n[4]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1250 premature_sop_err_n | eop_err_n) & roffDataValid_dup[4];
1251 assign set_pktAbort_dup_n[5]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1252 premature_sop_err_n | eop_err_n) & roffDataValid_dup[5];
1253 assign set_pktAbort_dup_n[6]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1254 premature_sop_err_n | eop_err_n) & roffDataValid_dup[6];
1255 assign set_pktAbort_dup_n[7]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1256 premature_sop_err_n | eop_err_n) & roffDataValid_dup[7];
1257 assign set_pktAbort_dup_n[8]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1258 premature_sop_err_n | eop_err_n) & roffDataValid_dup[8];
1259 assign set_pktAbort_dup_n[9]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1260 premature_sop_err_n | eop_err_n) & roffDataValid_dup[9];
1261 assign set_pktAbort_dup_n[10]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1262 premature_sop_err_n | eop_err_n) & roffDataValid_dup[10];
1263 assign set_pktAbort_dup_n[11]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1264 premature_sop_err_n | eop_err_n) & roffDataValid_dup[11];
1265 assign set_pktAbort_dup_n[12]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1266 premature_sop_err_n | eop_err_n) & roffDataValid_dup[12];
1267 assign set_pktAbort_dup_n[13]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1268 premature_sop_err_n | eop_err_n) & roffDataValid_dup[13];
1269 assign set_pktAbort_dup_n[14]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1270 premature_sop_err_n | eop_err_n) & roffDataValid_dup[14];
1271 assign set_pktAbort_dup_n[15]= (roffDataOut[`ROFF_ABORT] | missing_sop_err_n |
1272 premature_sop_err_n | eop_err_n) & roffDataValid_dup[15];
1273 assign set_pktAbort_dup_n[16]= (roff_data_abort_r | missing_sop_err_n |
1274 premature_sop_err_n | eop_err_n) & roffDataValid_dup[16];
1275 assign set_pktAbort_dup_n[17]= (roff_data_abort_r | missing_sop_err_n |
1276 premature_sop_err_n | eop_err_n) & roffDataValid_dup[17];
1277
1278 always @(posedge SysClk) begin
1279 if (!Reset_L) pktAbort <= #`SD 1'b0;
1280 else if (set_pktAbort_n) pktAbort <= #`SD 1'b1;
1281 else if (rst_pktAbort_n) pktAbort <= #`SD 1'b0;
1282 end
1283
1284// *****************************
1285// assign roff
1286// *****************************
1287 wire roff_soh_n= roffDataOut[`ROFF_SOP] & roffDataValid;
1288
1289 // temp put 0; use below when ro_fifo sop fix ????
1290 // assign missing_sop_err_n= 1'b0;
1291 // assign premature_sop_err_n= 1'b0;
1292 assign missing_sop_err_n= roffDataValid & startHdr & (~roffDataOut[`ROFF_SOP] | roff_uc_r);
1293 // start of pkt hdr; no sop at ff;
1294 // ignore this error at pktAbort state;
1295 // roffDataValid is conditioned to '0' in pktAbort state;
1296 // sop in roff align with ctrlHeader
1297 // err if data (ctrl hdr) not shown sop
1298 assign premature_sop_err_n= roff_soh_n & pktProc;
1299 // mid of pkt process; not expecting sop;
1300 // err valid only if in pktProc mode;
1301 // pktProc also get reset at set_pktAbort_n
1302
1303 wire ff_sop= startOfPkt; // calc version of sop (start of pkt data)
1304 // use by data pipe
1305
1306 wire roff_eop_n= (roffDataOut[`ROFF_EOP] & roffDataValid);
1307 wire ff_eop= endOfPkt_n; // calc version of eop
1308
1309 // temp put 0; use below when ro_fifo eop fix ????
1310 // assign eop_err_n= 1'b0;
1311 assign eop_err_n= (roff_eop_n ^ endOfPkt_n) & pktProc & roffDataValid;
1312 // eop not match between calc and roff;
1313 // err valid only if in pktProc mode and roff dv;
1314 // pktProc also get reset at set_pktAbort_n
1315
1316 // ??? at sop, start of ethernet pkt might have pad;
1317 // ctrlHeader[2:0] in 2 bytes unit -> byteOffset to load
1318 // to byteOffset_1
1319 // also need to rotatte data to right align
1320 //
1321 assign ff_pktpad_n= {1'b0, controlHeader[`CTRLHDR_STARTPKT_PAD], 1'b0};
1322 // convert to bytes;
1323 // original field in 2B unit
1324 wire ff_pad_n= |ff_pktpad_n; // pkt is padded
1325
1326 wire [127:0] ff_pktData_padshift_n= genRemInPkt(ff_pktpad_n, roffDataOut[`ROFF_PKTDATA]);
1327 // right align data if padded
1328
1329 wire [127:0] ff_pktData= (ff_sop & ff_pad_n)? ff_pktData_padshift_n :
1330 roffDataOut[`ROFF_PKTDATA];
1331
1332 assign ff_byteOffset= (ff_sop & ff_pad_n)?
1333 (5'd16 - ff_pktpad_n) : // convert pad to valid byte offset
1334 roffDataOut[`ROFF_BYTEOFFSET];
1335
1336/*
1337 // without pad
1338 wire [127:0] ff_pktData= roffDataOut[`ROFF_PKTDATA];
1339 assign ff_byteOffset= roffDataOut[`ROFF_BYTEOFFSET];
1340*/
1341
1342 // detect bad parity on inbound roff_data_r
1343// wire [15:0] ff_pktDataEcc= roffDataOut[`ROFF_PKTDATA_ECC];
1344// assign roff_parity_err_n= |(ff_pktDataEcc ^ calc_roff_parity_n);
1345 // ??? currently this field is zero
1346
1347
1348// *****************************
1349// registered roff; stage 1
1350// *****************************
1351 reg dv_1;
1352 reg [15:0] dv_dup_1;
1353 reg sop_1;
1354 reg eop_1;
1355 reg [4:0] byteOffset_1;
1356 reg [127:0] pktData_1;
1357 always @(posedge SysClk) begin
1358 if(!Reset_L) begin
1359 dv_1 <= #`SD 1'b0;
1360 dv_dup_1 <= #`SD 16'h0;
1361 sop_1 <= #`SD 1'b0;
1362 eop_1 <= #`SD 1'b0;
1363 byteOffset_1 <= #`SD 5'h0;
1364 pktData_1 <= #`SD 128'h0;
1365 end
1366 else begin
1367 dv_1 <= #`SD roffDataValid & pktProc & ~set_pktAbort_n;
1368 dv_dup_1 <= #`SD {16{roffDataValid & pktProc & ~set_pktAbort_n}};
1369 // do not want bad pkt to go into pipe
1370 sop_1 <= #`SD ff_sop & roffDataValid & pktProc & ~set_pktAbort_n;
1371 eop_1 <= #`SD ff_eop & roffDataValid & pktProc & ~set_pktAbort_n;
1372 if(roffDataValid & pktProc & ~set_pktAbort_n) begin
1373 byteOffset_1 <= #`SD force_ff_byteOffset_n; // force 5'd16 if 0
1374 end
1375 if(roffDataValid_dup[0] & pktProc_dup[0] & ~set_pktAbort_dup_n[0]) begin
1376 pktData_1[`TXC_B0] <= #`SD ff_pktData[`TXC_B0];
1377 end
1378 if(roffDataValid_dup[1] & pktProc_dup[1] & ~set_pktAbort_dup_n[1]) begin
1379 pktData_1[`TXC_B1] <= #`SD ff_pktData[`TXC_B1];
1380 end
1381 if(roffDataValid_dup[2] & pktProc_dup[2] & ~set_pktAbort_dup_n[2]) begin
1382 pktData_1[`TXC_B2] <= #`SD ff_pktData[`TXC_B2];
1383 end
1384 if(roffDataValid_dup[3] & pktProc_dup[3] & ~set_pktAbort_dup_n[3]) begin
1385 pktData_1[`TXC_B3] <= #`SD ff_pktData[`TXC_B3];
1386 end
1387 if(roffDataValid_dup[4] & pktProc_dup[4] & ~set_pktAbort_dup_n[4]) begin
1388 pktData_1[`TXC_B4] <= #`SD ff_pktData[`TXC_B4];
1389 end
1390 if(roffDataValid_dup[5] & pktProc_dup[5] & ~set_pktAbort_dup_n[5]) begin
1391 pktData_1[`TXC_B5] <= #`SD ff_pktData[`TXC_B5];
1392 end
1393 if(roffDataValid_dup[6] & pktProc_dup[6] & ~set_pktAbort_dup_n[6]) begin
1394 pktData_1[`TXC_B6] <= #`SD ff_pktData[`TXC_B6];
1395 end
1396 if(roffDataValid_dup[7] & pktProc_dup[7] & ~set_pktAbort_dup_n[7]) begin
1397 pktData_1[`TXC_B7] <= #`SD ff_pktData[`TXC_B7];
1398 end
1399 if(roffDataValid_dup[8] & pktProc_dup[8] & ~set_pktAbort_dup_n[8]) begin
1400 pktData_1[`TXC_B8] <= #`SD ff_pktData[`TXC_B8];
1401 end
1402 if(roffDataValid_dup[9] & pktProc_dup[9] & ~set_pktAbort_dup_n[9]) begin
1403 pktData_1[`TXC_B9] <= #`SD ff_pktData[`TXC_B9];
1404 end
1405 if(roffDataValid_dup[10] & pktProc_dup[10] & ~set_pktAbort_dup_n[10]) begin
1406 pktData_1[`TXC_B10] <= #`SD ff_pktData[`TXC_B10];
1407 end
1408 if(roffDataValid_dup[11] & pktProc_dup[11] & ~set_pktAbort_dup_n[11]) begin
1409 pktData_1[`TXC_B11] <= #`SD ff_pktData[`TXC_B11];
1410 end
1411 if(roffDataValid_dup[12] & pktProc_dup[12] & ~set_pktAbort_dup_n[12]) begin
1412 pktData_1[`TXC_B12] <= #`SD ff_pktData[`TXC_B12];
1413 end
1414 if(roffDataValid_dup[13] & pktProc_dup[13] & ~set_pktAbort_dup_n[13]) begin
1415 pktData_1[`TXC_B13] <= #`SD ff_pktData[`TXC_B13];
1416 end
1417 if(roffDataValid_dup[14] & pktProc_dup[14] & ~set_pktAbort_dup_n[14]) begin
1418 pktData_1[`TXC_B14] <= #`SD ff_pktData[`TXC_B14];
1419 end
1420 if(roffDataValid_dup[15] & pktProc_dup[15] & ~set_pktAbort_dup_n[15]) begin
1421 pktData_1[`TXC_B15] <= #`SD ff_pktData[`TXC_B15];
1422 end
1423 end
1424 end
1425
1426// *****************************
1427// registered stage 2; mux data
1428// *****************************
1429 reg dv_2;
1430 reg sop_2;
1431 reg eop_2;
1432// reg [4:0] byteOffset_2;
1433 reg [127:0] pktData_2;
1434 always @(posedge SysClk) begin
1435 if(!Reset_L) begin
1436 dv_2 <= #`SD 1'b0;
1437 sop_2 <= #`SD 1'b0;
1438 eop_2 <= #`SD 1'b0;
1439// byteOffset_2 <= #`SD 5'h0;
1440 pktData_2 <= #`SD 128'h0;
1441 end
1442 else begin
1443 dv_2 <= #`SD dv_1;
1444 sop_2 <= #`SD sop_1;
1445 eop_2 <= #`SD eop_1;
1446/*
1447 if(dv_1) begin
1448 byteOffset_2 <= #`SD byteOffset_1;
1449 end
1450*/
1451 if(dv_dup_1[0]) pktData_2[`TXC_B0] <= #`SD pktData_1[`TXC_B0];
1452 if(dv_dup_1[1]) pktData_2[`TXC_B1] <= #`SD pktData_1[`TXC_B1];
1453 if(dv_dup_1[2]) pktData_2[`TXC_B2] <= #`SD pktData_1[`TXC_B2];
1454 if(dv_dup_1[3]) pktData_2[`TXC_B3] <= #`SD pktData_1[`TXC_B3];
1455 if(dv_dup_1[4]) pktData_2[`TXC_B4] <= #`SD pktData_1[`TXC_B4];
1456 if(dv_dup_1[5]) pktData_2[`TXC_B5] <= #`SD pktData_1[`TXC_B5];
1457 if(dv_dup_1[6]) pktData_2[`TXC_B6] <= #`SD pktData_1[`TXC_B6];
1458 if(dv_dup_1[7]) pktData_2[`TXC_B7] <= #`SD pktData_1[`TXC_B7];
1459 if(dv_dup_1[8]) pktData_2[`TXC_B8] <= #`SD pktData_1[`TXC_B8];
1460 if(dv_dup_1[9]) pktData_2[`TXC_B9] <= #`SD pktData_1[`TXC_B9];
1461 if(dv_dup_1[10]) pktData_2[`TXC_B10] <= #`SD pktData_1[`TXC_B10];
1462 if(dv_dup_1[11]) pktData_2[`TXC_B11] <= #`SD pktData_1[`TXC_B11];
1463 if(dv_dup_1[12]) pktData_2[`TXC_B12] <= #`SD pktData_1[`TXC_B12];
1464 if(dv_dup_1[13]) pktData_2[`TXC_B13] <= #`SD pktData_1[`TXC_B13];
1465 if(dv_dup_1[14]) pktData_2[`TXC_B14] <= #`SD pktData_1[`TXC_B14];
1466 if(dv_dup_1[15]) pktData_2[`TXC_B15] <= #`SD pktData_1[`TXC_B15];
1467 end
1468 end
1469
1470// *****************************
1471// byteOffsetStored
1472// *****************************
1473 reg [4:0] byteOffsetStored_1; // update at stage 1
1474 reg [4:0] byteOffsetStored_2; // use with stage 2
1475
1476 wire [4:0] byteOffsetSum_n= byteOffsetStored_1 + byteOffset_1;
1477 wire sumGT16_n= byteOffsetSum_n[4] & (|byteOffsetSum_n[3:0]);
1478 wire sumEQ16_n= (byteOffsetSum_n==5'h10) ||
1479 (byteOffsetSum_n==5'h0); // in case 0==16B
1480 wire sumLT16_n= ~byteOffsetSum_n[4] & (|byteOffsetSum_n[3:0]);
1481 // lt 16B and not 0
1482 wire [4:0] sumDiff_n= (sumGT16_n)?
1483 (byteOffsetSum_n - 5'h10):
1484 (5'h10 - byteOffsetSum_n);
1485
1486 // value to update byteOffsetStored_1
1487 wire [4:0] byteOffsetStored_n= (sumEQ16_n)? 5'h0 :
1488 ((sumLT16_n)? byteOffsetSum_n : sumDiff_n);
1489
1490
1491 always @(posedge SysClk) begin
1492 if(!Reset_L) begin
1493 byteOffsetStored_1<= #`SD 5'h0;
1494 byteOffsetStored_2<= #`SD 5'h0;
1495 end
1496 else begin
1497 if(roffDataValid & ff_sop) begin // reset at sop
1498 byteOffsetStored_1<= #`SD 5'h0;
1499 end
1500 else begin // update on each dv1
1501 if(dv_1) byteOffsetStored_1<= #`SD byteOffsetStored_n;
1502 end
1503 byteOffsetStored_2<= #`SD byteOffsetStored_1;
1504 end
1505 end
1506
1507// *****************************
1508// control to update pktDataStored
1509// *****************************
1510 reg mergeStored_2;
1511 reg replaceStored_2; // replace with remain in pktData_2
1512 reg clearStored_2;
1513 wire [4:0] byteToUseInPktData_n= 5'h10 - byteOffsetStored_1;
1514 reg [4:0] byteToUseInPktData_2; // use in pktData select
1515
1516 always @(posedge SysClk) begin
1517 if(!Reset_L) begin
1518 mergeStored_2<= #`SD 1'b0;
1519 replaceStored_2<= #`SD 1'b0;
1520 clearStored_2<= #`SD 1'b0;
1521 byteToUseInPktData_2<= #`SD 5'h0;
1522 end
1523 else begin
1524 if(dv_1) begin
1525 mergeStored_2<= #`SD sumLT16_n;
1526 replaceStored_2<= #`SD sumGT16_n;
1527 clearStored_2<= #`SD sumEQ16_n;
1528 byteToUseInPktData_2<= #`SD byteToUseInPktData_n;
1529 end
1530 end
1531 end
1532
1533 reg dv_3; // dv fwd to chksum
1534 reg [15:0] dv_dup_3;
1535 reg sop_3; // sop fwd to chksum
1536 reg eop_3; // eop fwd to chksum
1537
1538// *****************************
1539// stored pkt and info for next alignment
1540// *****************************
1541 reg sopStored_2; // use with stage 2
1542 reg eopStored_2; // use with stage 2
1543 reg [15:0] eopStored_2_dup;
1544 reg [127:0] pktDataStored_2; // use with stage 2
1545
1546
1547 // pkt data to forward to next stage
1548wire[127:0] pktData_n= genPktData(byteToUseInPktData_2,
1549 pktData_2, pktDataStored_2);
1550wire [127:0] mergePkt_n= genMergePkt(byteOffsetStored_2,
1551 pktData_2, pktDataStored_2);
1552wire [127:0] remInPkt_n= genRemInPkt(byteToUseInPktData_2, pktData_2);
1553
1554 wire sopStored_n= (sop_2 & mergeStored_2 & ~eop_2); // current is sop
1555 wire eopStored_n= eop_2 & replaceStored_2;
1556
1557 wire sop_3_n= (dv_2 & sop_2 & ~sopStored_n) | // current is sop_2
1558 (dv_2 & sopStored_2 & ~mergeStored_2) | // current not sop_2; use sopStored_2
1559 (dv_2 & sopStored_2 & eop_2); // if eop_2, push sopStored
1560 wire eop_3_n= (dv_2 & eop_2 & ~eopStored_n) | // current is eop_2
1561 (eopStored_2); // (not eop_2) use last remain line
1562 wire dv_3_n= (dv_2 & ~(mergeStored_2 & ~eop_2)); // skip dv only if merge and not eop
1563 // no dv for extra eop cycle; use eopStored
1564
1565 always @(posedge SysClk) begin
1566 if(!Reset_L) begin
1567 sopStored_2<= #`SD 1'b0;
1568 eopStored_2<= #`SD 1'b0;
1569 eopStored_2_dup<= #`SD 16'h0;
1570 pktDataStored_2<= #`SD 128'h0;
1571 end
1572 else begin
1573 if((sop_3_n && dv_3_n) || setEnableFifoWrite_r) begin // reset stored sop
1574 // clear bit at start
1575 sopStored_2<= #`SD 1'b0;
1576 end
1577 else if(sop_2 & dv_2) sopStored_2<= #`SD sopStored_n;
1578
1579 if(eop_3_n || setEnableFifoWrite_r) begin // reset for next pkt
1580 // clear bit at start
1581 eopStored_2<= #`SD 1'b0;
1582 eopStored_2_dup<= #`SD 16'h0;
1583 end
1584 else if(eop_2 & dv_2) begin
1585 eopStored_2<= #`SD eopStored_n;
1586 eopStored_2_dup<= #`SD {16{eopStored_n}};
1587 end
1588
1589 if(eop_3_n || setEnableFifoWrite_mr[0]) begin // reset for next pkt
1590 // clear bit at start
1591 pktDataStored_2[`TXC_B0]<= #`SD 8'h0;
1592 end
1593 else if(dv_2) pktDataStored_2[`TXC_B0]<= #`SD (clearStored_2)? 8'h0 :
1594 ((mergeStored_2)? mergePkt_n[`TXC_B0] : remInPkt_n[`TXC_B0]);
1595
1596 if(eop_3_n || setEnableFifoWrite_mr[1]) begin // reset for next pkt
1597 // clear bit at start
1598 pktDataStored_2[`TXC_B1]<= #`SD 8'h0;
1599 end
1600 else if(dv_2) pktDataStored_2[`TXC_B1]<= #`SD (clearStored_2)? 8'h0 :
1601 ((mergeStored_2)? mergePkt_n[`TXC_B1] : remInPkt_n[`TXC_B1]);
1602
1603 if(eop_3_n || setEnableFifoWrite_mr[2]) begin // reset for next pkt
1604 // clear bit at start
1605 pktDataStored_2[`TXC_B2]<= #`SD 8'h0;
1606 end
1607 else if(dv_2) pktDataStored_2[`TXC_B2]<= #`SD (clearStored_2)? 8'h0 :
1608 ((mergeStored_2)? mergePkt_n[`TXC_B2] : remInPkt_n[`TXC_B2]);
1609
1610 if(eop_3_n || setEnableFifoWrite_mr[3]) begin // reset for next pkt
1611 // clear bit at start
1612 pktDataStored_2[`TXC_B3]<= #`SD 8'h0;
1613 end
1614 else if(dv_2) pktDataStored_2[`TXC_B3]<= #`SD (clearStored_2)? 8'h0 :
1615 ((mergeStored_2)? mergePkt_n[`TXC_B3] : remInPkt_n[`TXC_B3]);
1616
1617 if(eop_3_n || setEnableFifoWrite_mr[4]) begin // reset for next pkt
1618 // clear bit at start
1619 pktDataStored_2[`TXC_B4]<= #`SD 8'h0;
1620 end
1621 else if(dv_2) pktDataStored_2[`TXC_B4]<= #`SD (clearStored_2)? 8'h0 :
1622 ((mergeStored_2)? mergePkt_n[`TXC_B4] : remInPkt_n[`TXC_B4]);
1623
1624 if(eop_3_n || setEnableFifoWrite_mr[5]) begin // reset for next pkt
1625 // clear bit at start
1626 pktDataStored_2[`TXC_B5]<= #`SD 8'h0;
1627 end
1628 else if(dv_2) pktDataStored_2[`TXC_B5]<= #`SD (clearStored_2)? 8'h0 :
1629 ((mergeStored_2)? mergePkt_n[`TXC_B5] : remInPkt_n[`TXC_B5]);
1630
1631 if(eop_3_n || setEnableFifoWrite_mr[6]) begin // reset for next pkt
1632 // clear bit at start
1633 pktDataStored_2[`TXC_B6]<= #`SD 8'h0;
1634 end
1635 else if(dv_2) pktDataStored_2[`TXC_B6]<= #`SD (clearStored_2)? 8'h0 :
1636 ((mergeStored_2)? mergePkt_n[`TXC_B6] : remInPkt_n[`TXC_B6]);
1637
1638 if(eop_3_n || setEnableFifoWrite_mr[7]) begin // reset for next pkt
1639 // clear bit at start
1640 pktDataStored_2[`TXC_B7]<= #`SD 8'h0;
1641 end
1642 else if(dv_2) pktDataStored_2[`TXC_B7]<= #`SD (clearStored_2)? 8'h0 :
1643 ((mergeStored_2)? mergePkt_n[`TXC_B7] : remInPkt_n[`TXC_B7]);
1644
1645 if(eop_3_n || setEnableFifoWrite_mr[8]) begin // reset for next pkt
1646 // clear bit at start
1647 pktDataStored_2[`TXC_B8]<= #`SD 8'h0;
1648 end
1649 else if(dv_2) pktDataStored_2[`TXC_B8]<= #`SD (clearStored_2)? 8'h0 :
1650 ((mergeStored_2)? mergePkt_n[`TXC_B8] : remInPkt_n[`TXC_B8]);
1651
1652 if(eop_3_n || setEnableFifoWrite_mr[9]) begin // reset for next pkt
1653 // clear bit at start
1654 pktDataStored_2[`TXC_B9]<= #`SD 8'h0;
1655 end
1656 else if(dv_2) pktDataStored_2[`TXC_B9]<= #`SD (clearStored_2)? 8'h0 :
1657 ((mergeStored_2)? mergePkt_n[`TXC_B9] : remInPkt_n[`TXC_B9]);
1658
1659 if(eop_3_n || setEnableFifoWrite_mr[10]) begin // reset for next pkt
1660 // clear bit at start
1661 pktDataStored_2[`TXC_B10]<= #`SD 8'h0;
1662 end
1663 else if(dv_2) pktDataStored_2[`TXC_B10]<= #`SD (clearStored_2)? 8'h0 :
1664 ((mergeStored_2)? mergePkt_n[`TXC_B10] : remInPkt_n[`TXC_B10]);
1665
1666 if(eop_3_n || setEnableFifoWrite_mr[11]) begin // reset for next pkt
1667 // clear bit at start
1668 pktDataStored_2[`TXC_B11]<= #`SD 8'h0;
1669 end
1670 else if(dv_2) pktDataStored_2[`TXC_B11]<= #`SD (clearStored_2)? 8'h0 :
1671 ((mergeStored_2)? mergePkt_n[`TXC_B11] : remInPkt_n[`TXC_B11]);
1672
1673 if(eop_3_n || setEnableFifoWrite_mr[12]) begin // reset for next pkt
1674 // clear bit at start
1675 pktDataStored_2[`TXC_B12]<= #`SD 8'h0;
1676 end
1677 else if(dv_2) pktDataStored_2[`TXC_B12]<= #`SD (clearStored_2)? 8'h0 :
1678 ((mergeStored_2)? mergePkt_n[`TXC_B12] : remInPkt_n[`TXC_B12]);
1679
1680 if(eop_3_n || setEnableFifoWrite_mr[13]) begin // reset for next pkt
1681 // clear bit at start
1682 pktDataStored_2[`TXC_B13]<= #`SD 8'h0;
1683 end
1684 else if(dv_2) pktDataStored_2[`TXC_B13]<= #`SD (clearStored_2)? 8'h0 :
1685 ((mergeStored_2)? mergePkt_n[`TXC_B13] : remInPkt_n[`TXC_B13]);
1686
1687 if(eop_3_n || setEnableFifoWrite_mr[14]) begin // reset for next pkt
1688 // clear bit at start
1689 pktDataStored_2[`TXC_B14]<= #`SD 8'h0;
1690 end
1691 else if(dv_2) pktDataStored_2[`TXC_B14]<= #`SD (clearStored_2)? 8'h0 :
1692 ((mergeStored_2)? mergePkt_n[`TXC_B14] : remInPkt_n[`TXC_B14]);
1693
1694 if(eop_3_n || setEnableFifoWrite_mr[15]) begin // reset for next pkt
1695 // clear bit at start
1696 pktDataStored_2[`TXC_B15]<= #`SD 8'h0;
1697 end
1698 else if(dv_2) pktDataStored_2[`TXC_B15]<= #`SD (clearStored_2)? 8'h0 :
1699 ((mergeStored_2)? mergePkt_n[`TXC_B15] : remInPkt_n[`TXC_B15]);
1700 end // not reset
1701 end // always
1702
1703
1704// *****************************
1705// pkt forward to sf_fifo, chksum; stage 3
1706// *****************************
1707 wire remLastInStored_n= eopStored_2;
1708 wire [15:0] remLastInStored_dup_n= eopStored_2_dup;
1709// wire ld_pktData_3_n= dv_3_n | remLastInStored_n;
1710 wire [15:0] ld_pktData_3_dup_n;
1711
1712 assign ld_pktData_3_dup_n= {16{dv_3_n}} | remLastInStored_dup_n;
1713
1714 wire [127:0] pktData_3_n;
1715 assign pktData_3_n [7:0]= (remLastInStored_dup_n[0])?
1716 pktDataStored_2 [7:0]: pktData_n [7:0];
1717
1718 assign pktData_3_n [15:8]= (remLastInStored_dup_n[1])?
1719 pktDataStored_2 [15:8]: pktData_n [15:8];
1720
1721 assign pktData_3_n [23:16]= (remLastInStored_dup_n[2])?
1722 pktDataStored_2 [23:16]: pktData_n [23:16];
1723
1724 assign pktData_3_n [31:24]= (remLastInStored_dup_n[3])?
1725 pktDataStored_2 [31:24]: pktData_n [31:24];
1726
1727 assign pktData_3_n [39:32]= (remLastInStored_dup_n[4])?
1728 pktDataStored_2 [39:32]: pktData_n [39:32];
1729
1730 assign pktData_3_n [47:40]= (remLastInStored_dup_n[5])?
1731 pktDataStored_2 [47:40]: pktData_n [47:40];
1732
1733 assign pktData_3_n [55:48]= (remLastInStored_dup_n[6])?
1734 pktDataStored_2 [55:48]: pktData_n [55:48];
1735
1736 assign pktData_3_n [63:56]= (remLastInStored_dup_n[7])?
1737 pktDataStored_2 [63:56]: pktData_n [63:56];
1738
1739 assign pktData_3_n [71:64]= (remLastInStored_dup_n[8])?
1740 pktDataStored_2 [71:64]: pktData_n [71:64];
1741
1742 assign pktData_3_n [79:72]= (remLastInStored_dup_n[9])?
1743 pktDataStored_2 [79:72]: pktData_n [79:72];
1744
1745 assign pktData_3_n [87:80]= (remLastInStored_dup_n[10])?
1746 pktDataStored_2 [87:80]: pktData_n [87:80];
1747
1748 assign pktData_3_n [95:88]= (remLastInStored_dup_n[11])?
1749 pktDataStored_2 [95:88]: pktData_n [95:88];
1750
1751 assign pktData_3_n [103:96]= (remLastInStored_dup_n[12])?
1752 pktDataStored_2 [103:96]: pktData_n [103:96];
1753
1754 assign pktData_3_n [111:104]= (remLastInStored_dup_n[13])?
1755 pktDataStored_2 [111:104]: pktData_n [111:104];
1756
1757 assign pktData_3_n [119:112]= (remLastInStored_dup_n[14])?
1758 pktDataStored_2 [119:112]: pktData_n [119:112];
1759
1760 assign pktData_3_n [127:120]= (remLastInStored_dup_n[15])?
1761 pktDataStored_2 [127:120]: pktData_n [127:120];
1762
1763
1764 reg [127:0] pktData_3;
1765 always @(posedge SysClk) begin
1766 if(!Reset_L) begin
1767 sop_3<= #`SD 1'b0;
1768 eop_3<= #`SD 1'b0;
1769 dv_3<= #`SD 1'b0;
1770 dv_dup_3<= #`SD 16'h0;
1771 pktData_3<= #`SD 128'h0;
1772 end
1773 else begin
1774 sop_3<= #`SD sop_3_n;
1775 eop_3<= #`SD eop_3_n;
1776 dv_3<= #`SD dv_3_n | remLastInStored_n;
1777 dv_dup_3<= #`SD {16{dv_3_n | remLastInStored_n}};
1778 if(ld_pktData_3_dup_n[0]) pktData_3[7:0]<= #`SD pktData_3_n[7:0];
1779 if(ld_pktData_3_dup_n[1]) pktData_3[15:8]<= #`SD pktData_3_n[15:8];
1780 if(ld_pktData_3_dup_n[2]) pktData_3[23:16]<= #`SD pktData_3_n[23:16];
1781 if(ld_pktData_3_dup_n[3]) pktData_3[31:24]<= #`SD pktData_3_n[31:24];
1782 if(ld_pktData_3_dup_n[4]) pktData_3[39:32]<= #`SD pktData_3_n[39:32];
1783 if(ld_pktData_3_dup_n[5]) pktData_3[47:40]<= #`SD pktData_3_n[47:40];
1784 if(ld_pktData_3_dup_n[6]) pktData_3[55:48]<= #`SD pktData_3_n[55:48];
1785 if(ld_pktData_3_dup_n[7]) pktData_3[63:56]<= #`SD pktData_3_n[63:56];
1786 if(ld_pktData_3_dup_n[8]) pktData_3[71:64]<= #`SD pktData_3_n[71:64];
1787 if(ld_pktData_3_dup_n[9]) pktData_3[79:72]<= #`SD pktData_3_n[79:72];
1788 if(ld_pktData_3_dup_n[10]) pktData_3[87:80]<= #`SD pktData_3_n[87:80];
1789 if(ld_pktData_3_dup_n[11]) pktData_3[95:88]<= #`SD pktData_3_n[95:88];
1790 if(ld_pktData_3_dup_n[12]) pktData_3[103:96]<= #`SD pktData_3_n[103:96];
1791 if(ld_pktData_3_dup_n[13]) pktData_3[111:104]<= #`SD pktData_3_n[111:104];
1792 if(ld_pktData_3_dup_n[14]) pktData_3[119:112]<= #`SD pktData_3_n[119:112];
1793 if(ld_pktData_3_dup_n[15]) pktData_3[127:120]<= #`SD pktData_3_n[127:120];
1794 end
1795 end
1796
1797
1798 reg qwr_dv_1;
1799 reg qwr_dv_2;
1800 reg qwr_dv_3;
1801
1802 always @(posedge SysClk) begin
1803 if(!Reset_L) begin
1804 qwr_dv_1<= #`SD 1'b0;
1805 qwr_dv_2<= #`SD 1'b0;
1806 qwr_dv_3<= #`SD 1'b0;
1807 end
1808 else begin
1809 qwr_dv_1<= #`SD roff_dv_nc_r; // use uncondition dv since
1810 // queueWrites used in pktAbort case
1811 qwr_dv_2<= #`SD qwr_dv_1;
1812 qwr_dv_3<= #`SD qwr_dv_2;
1813 end
1814 end
1815
1816/*--------------------------------------------------------------*/
1817// data rotation function
1818/*--------------------------------------------------------------*/
1819
1820
1821function [127:0] genPktData; // LE
1822 input[4:0] byteOffset;
1823 input[127:0] pkt_a; // pktData
1824 input[127:0] pkt_b; // pktDataStored
1825 reg [127:0] pktData_n;
1826 begin
1827 case(byteOffset)
1828 5'h0: pktData_n= {pkt_b};
1829 5'h1: pktData_n= {pkt_a[`TXC_B0], pkt_b[`TXC_B14_B0]} ;
1830 5'h2: pktData_n= {pkt_a[`TXC_B1_B0], pkt_b[`TXC_B13_B0]} ;
1831 5'h3: pktData_n= {pkt_a[`TXC_B2_B0], pkt_b[`TXC_B12_B0]} ;
1832 5'h4: pktData_n= {pkt_a[`TXC_B3_B0], pkt_b[`TXC_B11_B0]} ;
1833 5'h5: pktData_n= {pkt_a[`TXC_B4_B0], pkt_b[`TXC_B10_B0]} ;
1834 5'h6: pktData_n= {pkt_a[`TXC_B5_B0], pkt_b[`TXC_B9_B0]} ;
1835 5'h7: pktData_n= {pkt_a[`TXC_B6_B0], pkt_b[`TXC_B8_B0]} ;
1836 5'h8: pktData_n= {pkt_a[`TXC_B7_B0], pkt_b[`TXC_B7_B0]} ;
1837 5'h9: pktData_n= {pkt_a[`TXC_B8_B0], pkt_b[`TXC_B6_B0]} ;
1838 5'ha: pktData_n= {pkt_a[`TXC_B9_B0], pkt_b[`TXC_B5_B0]} ;
1839 5'hb: pktData_n= {pkt_a[`TXC_B10_B0], pkt_b[`TXC_B4_B0]} ;
1840 5'hc: pktData_n= {pkt_a[`TXC_B11_B0], pkt_b[`TXC_B3_B0]} ;
1841 5'hd: pktData_n= {pkt_a[`TXC_B12_B0], pkt_b[`TXC_B2_B0]} ;
1842 5'he: pktData_n= {pkt_a[`TXC_B13_B0], pkt_b[`TXC_B1_B0]} ;
1843 5'hf: pktData_n= {pkt_a[`TXC_B14_B0], pkt_b[`TXC_B0]} ;
1844 5'h10: pktData_n= {pkt_a};
1845 default: pktData_n= {pkt_b};
1846 endcase
1847 genPktData= pktData_n;
1848 end
1849endfunction
1850
1851 // pkt data to store for next byte align
1852 // choose either from mergePkt_n or remIn1Pkt_n
1853 // merge stored and pktData_1
1854
1855function [127:0] genMergePkt; // LE
1856 input[4:0] byteOffset;
1857 input[127:0] pkt_a;
1858 input[127:0] pkt_b;
1859 reg [127:0] mergePkt_n;
1860
1861 begin
1862 case(byteOffset)
1863 5'h0: mergePkt_n= {pkt_a};
1864 5'h1: mergePkt_n= {pkt_a[`TXC_B14_B0], pkt_b[`TXC_B0]};
1865 5'h2: mergePkt_n= {pkt_a[`TXC_B13_B0], pkt_b[`TXC_B1_B0]};
1866 5'h3: mergePkt_n= {pkt_a[`TXC_B12_B0], pkt_b[`TXC_B2_B0]};
1867 5'h4: mergePkt_n= {pkt_a[`TXC_B11_B0], pkt_b[`TXC_B3_B0]};
1868 5'h5: mergePkt_n= {pkt_a[`TXC_B10_B0], pkt_b[`TXC_B4_B0]};
1869 5'h6: mergePkt_n= {pkt_a[`TXC_B9_B0], pkt_b[`TXC_B5_B0]};
1870 5'h7: mergePkt_n= {pkt_a[`TXC_B8_B0], pkt_b[`TXC_B6_B0]};
1871 5'h8: mergePkt_n= {pkt_a[`TXC_B7_B0], pkt_b[`TXC_B7_B0]};
1872 5'h9: mergePkt_n= {pkt_a[`TXC_B6_B0], pkt_b[`TXC_B8_B0]};
1873 5'ha: mergePkt_n= {pkt_a[`TXC_B5_B0], pkt_b[`TXC_B9_B0]};
1874 5'hb: mergePkt_n= {pkt_a[`TXC_B4_B0], pkt_b[`TXC_B10_B0]};
1875 5'hc: mergePkt_n= {pkt_a[`TXC_B3_B0], pkt_b[`TXC_B11_B0]};
1876 5'hd: mergePkt_n= {pkt_a[`TXC_B2_B0], pkt_b[`TXC_B12_B0]};
1877 5'he: mergePkt_n= {pkt_a[`TXC_B1_B0], pkt_b[`TXC_B13_B0]};
1878 5'hf: mergePkt_n= {pkt_a[`TXC_B0], pkt_b[`TXC_B14_B0]};
1879 default: mergePkt_n= {pkt_b};
1880 endcase
1881 genMergePkt= mergePkt_n;
1882 end
1883endfunction
1884
1885
1886function [127:0] genRemInPkt; // LE
1887 input [4:0] byteOffset;
1888 input [127:0] pkt_a;
1889 reg [127:0] remInPkt_n;
1890
1891 begin
1892 case(byteOffset)
1893 5'h0: remInPkt_n= {pkt_a};
1894 5'h1: remInPkt_n= {8'h0, pkt_a[`TXC_B15_B1]};
1895 5'h2: remInPkt_n= {16'h0, pkt_a[`TXC_B15_B2]};
1896 5'h3: remInPkt_n= {24'h0, pkt_a[`TXC_B15_B3]};
1897 5'h4: remInPkt_n= {32'h0, pkt_a[`TXC_B15_B4]};
1898 5'h5: remInPkt_n= {40'h0, pkt_a[`TXC_B15_B5]};
1899 5'h6: remInPkt_n= {48'h0, pkt_a[`TXC_B15_B6]};
1900 5'h7: remInPkt_n= {56'h0, pkt_a[`TXC_B15_B7]};
1901 5'h8: remInPkt_n= {64'h0, pkt_a[`TXC_B15_B8]};
1902 5'h9: remInPkt_n= {72'h0, pkt_a[`TXC_B15_B9]};
1903 5'ha: remInPkt_n= {80'h0, pkt_a[`TXC_B15_B10]};
1904 5'hb: remInPkt_n= {88'h0, pkt_a[`TXC_B15_B11]};
1905 5'hc: remInPkt_n= {96'h0, pkt_a[`TXC_B15_B12]};
1906 5'hd: remInPkt_n= {104'h0, pkt_a[`TXC_B15_B13]};
1907 5'he: remInPkt_n= {112'h0, pkt_a[`TXC_B15_B14]};
1908 5'hf: remInPkt_n= {120'h0, pkt_a[`TXC_B15]};
1909 default: remInPkt_n= {pkt_a};
1910 endcase
1911 genRemInPkt= remInPkt_n;
1912 end
1913endfunction
1914
1915assign ba_sop= sop_3; // StartTCPChecksum= sop_3;
1916assign ba_eop= eop_3; // ChecksumPacketDone= eop_3;
1917assign ba_dv= dv_3; //dChecksumValid= dv_3;
1918assign ba_dv_dup= dv_dup_3; //dChecksumValid= dv_3;
1919assign ba_qwr_dv= qwr_dv_3;
1920assign ba_data= pktData_3; //ChecksumDataIn= pktData_3;
1921
1922
1923/*--------------------------------------------------------------*/
1924// CheckSum insertion function
1925/*--------------------------------------------------------------*/
1926
1927 function [127:0] getCksReplPktData; // LE
1928 input [3:0] byteOffset;
1929 input [127:0] data;
1930 input [15:0] cks;
1931 begin
1932 case(byteOffset)
1933 4'h0: getCksReplPktData= {data[`TXC_B15_B2], cks};
1934 4'h1: getCksReplPktData= {data[`TXC_B15_B3], cks, data[`TXC_B0]};
1935 4'h2: getCksReplPktData= {data[`TXC_B15_B4], cks, data[`TXC_B1_B0]};
1936 4'h3: getCksReplPktData= {data[`TXC_B15_B5], cks, data[`TXC_B2_B0]};
1937 4'h4: getCksReplPktData= {data[`TXC_B15_B6], cks, data[`TXC_B3_B0]};
1938 4'h5: getCksReplPktData= {data[`TXC_B15_B7], cks, data[`TXC_B4_B0]};
1939 4'h6: getCksReplPktData= {data[`TXC_B15_B8], cks, data[`TXC_B5_B0]};
1940 4'h7: getCksReplPktData= {data[`TXC_B15_B9], cks, data[`TXC_B6_B0]};
1941 4'h8: getCksReplPktData= {data[`TXC_B15_B10], cks, data[`TXC_B7_B0]};
1942 4'h9: getCksReplPktData= {data[`TXC_B15_B11], cks, data[`TXC_B8_B0]};
1943 4'ha: getCksReplPktData= {data[`TXC_B15_B12], cks, data[`TXC_B9_B0]};
1944 4'hb: getCksReplPktData= {data[`TXC_B15_B13], cks, data[`TXC_B10_B0]};
1945 4'hc: getCksReplPktData= {data[`TXC_B15_B14], cks, data[`TXC_B11_B0]};
1946 4'hd: getCksReplPktData= {data[`TXC_B15], cks, data[`TXC_B12_B0]};
1947 4'he: getCksReplPktData= {cks, data[`TXC_B13_B0]};
1948 4'hf: getCksReplPktData= {cks, data[`TXC_B13_B0]};
1949 default: getCksReplPktData= {data};
1950 endcase
1951 end
1952 endfunction
1953
1954 wire [6:0] tcpStuffInByte= {l4_stuff[5:0], 1'b0};
1955 wire [2:0] tcpStuffIn16B= tcpStuffInByte[6:4]; // ??
1956
1957 wire [6:0] tcpStuffInByte_dup_1= {l4_stuff_dup_1[5:0], 1'b0};
1958 wire [2:0] tcpStuffIn16B_dup_1= tcpStuffInByte_dup_1[6:4]; // ??
1959
1960 wire [6:0] tcpStuffInByte_dup_2= {l4_stuff_dup_2[5:0], 1'b0};
1961 wire [2:0] tcpStuffIn16B_dup_2= tcpStuffInByte_dup_2[6:4]; // ??
1962
1963 wire [6:0] tcpStuffInByte_dup_3= {l4_stuff_dup_3[5:0], 1'b0};
1964 wire [2:0] tcpStuffIn16B_dup_3= tcpStuffInByte_dup_3[6:4]; // ??
1965
1966 wire [9:0] curStoreFwdffWptr= StoreForwardWritePtr_n; // wptr position at sop
1967 reg [4:0] cksStuffByteOffset; // stuff pos byte offset
1968 // 0 - stuff at B0, 1- stuff at B1 ..
1969 reg [9:0] bawrCnt; // inc per ba_dv
1970 reg [9:0] bawrCnt_dup_1; // inc per ba_dv
1971 reg [9:0] bawrCnt_dup_2; // inc per ba_dv
1972 reg [9:0] bawrCnt_dup_3; // inc per ba_dv
1973
1974 // load at cks pos line
1975 wire [15:0] ld_pktDataWithCks_dup_n;
1976// wire ld_pktDataWithCks_n= ba_dv && (bawrCnt == {7'h0, tcpStuffIn16B});
1977
1978 assign ld_pktDataWithCks_dup_n[0]= ba_dv_dup[0] && (bawrCnt == {7'h0, tcpStuffIn16B});
1979 assign ld_pktDataWithCks_dup_n[1]= ba_dv_dup[1] && (bawrCnt == {7'h0, tcpStuffIn16B});
1980 assign ld_pktDataWithCks_dup_n[2]= ba_dv_dup[2] && (bawrCnt == {7'h0, tcpStuffIn16B});
1981 assign ld_pktDataWithCks_dup_n[3]= ba_dv_dup[3] && (bawrCnt == {7'h0, tcpStuffIn16B});
1982 assign ld_pktDataWithCks_dup_n[4]= ba_dv_dup[4] && (bawrCnt_dup_1 == {7'h0, tcpStuffIn16B_dup_1});
1983 assign ld_pktDataWithCks_dup_n[5]= ba_dv_dup[5] && (bawrCnt_dup_1 == {7'h0, tcpStuffIn16B_dup_1});
1984 assign ld_pktDataWithCks_dup_n[6]= ba_dv_dup[6] && (bawrCnt_dup_1 == {7'h0, tcpStuffIn16B_dup_1});
1985 assign ld_pktDataWithCks_dup_n[7]= ba_dv_dup[7] && (bawrCnt_dup_1 == {7'h0, tcpStuffIn16B_dup_1});
1986 assign ld_pktDataWithCks_dup_n[8]= ba_dv_dup[8] && (bawrCnt_dup_2 == {7'h0, tcpStuffIn16B_dup_2});
1987 assign ld_pktDataWithCks_dup_n[9]= ba_dv_dup[9] && (bawrCnt_dup_2 == {7'h0, tcpStuffIn16B_dup_2});
1988 assign ld_pktDataWithCks_dup_n[10]= ba_dv_dup[10] && (bawrCnt_dup_2 == {7'h0, tcpStuffIn16B_dup_2});
1989 assign ld_pktDataWithCks_dup_n[11]= ba_dv_dup[11] && (bawrCnt_dup_2 == {7'h0, tcpStuffIn16B_dup_2});
1990 assign ld_pktDataWithCks_dup_n[12]= ba_dv_dup[12] && (bawrCnt_dup_3 == {7'h0, tcpStuffIn16B_dup_3});
1991 assign ld_pktDataWithCks_dup_n[13]= ba_dv_dup[13] && (bawrCnt_dup_3 == {7'h0, tcpStuffIn16B_dup_3});
1992 assign ld_pktDataWithCks_dup_n[14]= ba_dv_dup[14] && (bawrCnt_dup_3 == {7'h0, tcpStuffIn16B_dup_3});
1993 assign ld_pktDataWithCks_dup_n[15]= ba_dv_dup[15] && (bawrCnt_dup_3 == {7'h0, tcpStuffIn16B_dup_3});
1994
1995 // insert cks
1996 wire[127:0] pktDataWithCks_n= getCksReplPktData(cksStuffByteOffset[3:0],
1997 pktDataWithCks, {ChecksumValue[7:0],ChecksumValue[15:8]});
1998
1999 wire[9:0] cksffwptr_n= curStoreFwdffWptr + {7'h0, tcpStuffIn16B};
2000 wire [9:0] adj_cksffwptr_n= cksffwptr_n - 10'd640;
2001
2002 always @(posedge SysClk) begin
2003 if(!Reset_L) begin
2004 cksStoreFwdffWptr<= #`SD 10'h0;
2005 cksStuffByteOffset<= #`SD 5'h0;
2006 pktDataWithCks<= #`SD 128'h0;
2007 bawrCnt<= #`SD 10'h0;
2008 bawrCnt_dup_1<= #`SD 10'h0;
2009 bawrCnt_dup_2<= #`SD 10'h0;
2010 bawrCnt_dup_3<= #`SD 10'h0;
2011 writeCks<= #`SD 1'b0;
2012 end
2013 else begin
2014 if(setEnableFifoWrite_r) begin // start of a pkt write
2015 cksStoreFwdffWptr<= #`SD (cksffwptr_n < 10'd640)? cksffwptr_n : adj_cksffwptr_n;
2016 cksStuffByteOffset<= #`SD tcpStuffInByte[4:0]; // wrap at FIFO_SIZE_640
2017 end
2018 if(setEnableFifoWrite_r) begin
2019 bawrCnt<= #`SD 10'h0;
2020 end
2021 else if(ba_dv) bawrCnt<= #`SD bawrCnt + 1'b1;
2022
2023 if(setEnableFifoWrite_r) begin
2024 bawrCnt_dup_1<= #`SD 10'h0;
2025 end
2026 else if(ba_dv_dup[1]) bawrCnt_dup_1<= #`SD bawrCnt_dup_1 + 1'b1;
2027
2028 if(setEnableFifoWrite_r) begin
2029 bawrCnt_dup_2<= #`SD 10'h0;
2030 end
2031 else if(ba_dv_dup[2]) bawrCnt_dup_2<= #`SD bawrCnt_dup_2 + 1'b1;
2032
2033 if(setEnableFifoWrite_r) begin
2034 bawrCnt_dup_3<= #`SD 10'h0;
2035 end
2036 else if(ba_dv_dup[3]) bawrCnt_dup_3<= #`SD bawrCnt_dup_3 + 1'b1;
2037
2038
2039 if(ld_pktDataWithCks_dup_n[0]) begin // load at cks pos line
2040 pktDataWithCks[`TXC_B0]<= #`SD ba_data[`TXC_B0];
2041 end
2042 else if(writeCks_n) pktDataWithCks[`TXC_B0]<= #`SD pktDataWithCks_n[`TXC_B0];
2043
2044 if(ld_pktDataWithCks_dup_n[1]) begin // load at cks pos line
2045 pktDataWithCks[`TXC_B1]<= #`SD ba_data[`TXC_B1];
2046 end
2047 else if(writeCks_n) pktDataWithCks[`TXC_B1]<= #`SD pktDataWithCks_n[`TXC_B1];
2048
2049 if(ld_pktDataWithCks_dup_n[2]) begin // load at cks pos line
2050 pktDataWithCks[`TXC_B2]<= #`SD ba_data[`TXC_B2];
2051 end
2052 else if(writeCks_n) pktDataWithCks[`TXC_B2]<= #`SD pktDataWithCks_n[`TXC_B2];
2053
2054 if(ld_pktDataWithCks_dup_n[3]) begin // load at cks pos line
2055 pktDataWithCks[`TXC_B3]<= #`SD ba_data[`TXC_B3];
2056 end
2057 else if(writeCks_n) pktDataWithCks[`TXC_B3]<= #`SD pktDataWithCks_n[`TXC_B3];
2058
2059 if(ld_pktDataWithCks_dup_n[4]) begin // load at cks pos line
2060 pktDataWithCks[`TXC_B4]<= #`SD ba_data[`TXC_B4];
2061 end
2062 else if(writeCks_n) pktDataWithCks[`TXC_B4]<= #`SD pktDataWithCks_n[`TXC_B4];
2063
2064 if(ld_pktDataWithCks_dup_n[5]) begin // load at cks pos line
2065 pktDataWithCks[`TXC_B5]<= #`SD ba_data[`TXC_B5];
2066 end
2067 else if(writeCks_n) pktDataWithCks[`TXC_B5]<= #`SD pktDataWithCks_n[`TXC_B5];
2068
2069 if(ld_pktDataWithCks_dup_n[6]) begin // load at cks pos line
2070 pktDataWithCks[`TXC_B6]<= #`SD ba_data[`TXC_B6];
2071 end
2072 else if(writeCks_n) pktDataWithCks[`TXC_B6]<= #`SD pktDataWithCks_n[`TXC_B6];
2073
2074 if(ld_pktDataWithCks_dup_n[7]) begin // load at cks pos line
2075 pktDataWithCks[`TXC_B7]<= #`SD ba_data[`TXC_B7];
2076 end
2077 else if(writeCks_n) pktDataWithCks[`TXC_B7]<= #`SD pktDataWithCks_n[`TXC_B7];
2078
2079 if(ld_pktDataWithCks_dup_n[8]) begin // load at cks pos line
2080 pktDataWithCks[`TXC_B8]<= #`SD ba_data[`TXC_B8];
2081 end
2082 else if(writeCks_n) pktDataWithCks[`TXC_B8]<= #`SD pktDataWithCks_n[`TXC_B8];
2083
2084 if(ld_pktDataWithCks_dup_n[9]) begin // load at cks pos line
2085 pktDataWithCks[`TXC_B9]<= #`SD ba_data[`TXC_B9];
2086 end
2087 else if(writeCks_n) pktDataWithCks[`TXC_B9]<= #`SD pktDataWithCks_n[`TXC_B9];
2088
2089 if(ld_pktDataWithCks_dup_n[10]) begin // load at cks pos line
2090 pktDataWithCks[`TXC_B10]<= #`SD ba_data[`TXC_B10];
2091 end
2092 else if(writeCks_n) pktDataWithCks[`TXC_B10]<= #`SD pktDataWithCks_n[`TXC_B10];
2093
2094 if(ld_pktDataWithCks_dup_n[11]) begin // load at cks pos line
2095 pktDataWithCks[`TXC_B11]<= #`SD ba_data[`TXC_B11];
2096 end
2097 else if(writeCks_n) pktDataWithCks[`TXC_B11]<= #`SD pktDataWithCks_n[`TXC_B11];
2098
2099 if(ld_pktDataWithCks_dup_n[12]) begin // load at cks pos line
2100 pktDataWithCks[`TXC_B12]<= #`SD ba_data[`TXC_B12];
2101 end
2102 else if(writeCks_n) pktDataWithCks[`TXC_B12]<= #`SD pktDataWithCks_n[`TXC_B12];
2103
2104 if(ld_pktDataWithCks_dup_n[13]) begin // load at cks pos line
2105 pktDataWithCks[`TXC_B13]<= #`SD ba_data[`TXC_B13];
2106 end
2107 else if(writeCks_n) pktDataWithCks[`TXC_B13]<= #`SD pktDataWithCks_n[`TXC_B13];
2108
2109 if(ld_pktDataWithCks_dup_n[14]) begin // load at cks pos line
2110 pktDataWithCks[`TXC_B14]<= #`SD ba_data[`TXC_B14];
2111 end
2112 else if(writeCks_n) pktDataWithCks[`TXC_B14]<= #`SD pktDataWithCks_n[`TXC_B14];
2113
2114 if(ld_pktDataWithCks_dup_n[15]) begin // load at cks pos line
2115 pktDataWithCks[`TXC_B15]<= #`SD ba_data[`TXC_B15];
2116 end
2117 else if(writeCks_n) pktDataWithCks[`TXC_B15]<= #`SD pktDataWithCks_n[`TXC_B15];
2118
2119 writeCks<= #`SD (writeCks_n & cksen);
2120
2121 end
2122 end
2123
2124/*--------------------------------------------------------------*/
2125// readLength control
2126/*--------------------------------------------------------------*/
2127
2128reg [9:0] rdCnt_16B; // readLength -> 16B chunks
2129reg [9:0] rcvCnt_16B; // rcv'd 16B dataline count (per read)
2130reg [13:0] rcvCnt_1B; // rcv'd count in bytes
2131 // pkt done if rcvCnt_1B==readLength
2132reg [9:0] orderCnt_16B; // 16B dataline ordered (per read)
2133
2134reg [4:0] bytesNotRcv; // for each 16B ordered, accumulate partial bytes
2135 // not rcv'd from data read
2136wire [4:0] bytesNotRcv_toadd_n= 5'h10 - force_ff_byteOffset_n;
2137wire [4:0] bytesNotRcv_sum_n= bytesNotRcv + bytesNotRcv_toadd_n;
2138wire inc_bytesNotRcv_n= pktProc & roffDataValid; // update per dataline
2139 // and during pkt data process phase
2140
2141wire inc_orderCnt_16B= pktProc & readFifo;
2142wire rcvEQorder_n= (rcvCnt_16B==orderCnt_16B);
2143assign rcvEQorder= rcvEQorder_n;
2144wire rdNotDone_n= (|rdCnt_16B);
2145
2146wire extraToOrder_n= roffDataValid & bytesNotRcv_sum_n[4] & ~rcvEQorder_n;
2147 // order extra when bytes ordered but not rcv'd >= 16B;
2148 // stop when no more to order (rcv==order) since
2149 // in (rcv==order) case, extra dataline req is governed by
2150 // each rcvbytes read; one read, check/order,...
2151 // this is because each dataline read in can be partial bytes
2152 // and this logic is designed not to read cross a pkt.
2153wire dec_rdCnt_n= pktProc & readFifo & ~extraToOrder_n & rdNotDone_n;
2154 // dec only if non-zero (for read at a time case);
2155wire inc_rdCnt_n= pktProc & extraToOrder_n & ~readFifo;
2156
2157
2158 // implement this only if wanna improve for bursty read
2159 // in (rcv==order) with no more rdCnt case; this
2160 // happens when partial bytes spreaded among datalines;
2161 // assumption is this doesn't happen that often;
2162wire ld_rdCnt_n= pktProc & ~rdNotDone_n & rcvEQorder_n & (|pktLength_n[6:4]);
2163 // remain pktlength >=16B at (rcv==order) with no more rdCnt
2164 // ld in extra 16B needed in order to make bursty reads;
2165 // orderEnable= ... (rcvPktNotDone_n & rcvEQorder_n & ~ld_rdCnt_n)
2166 // let rdCnt do the ordering; [6:4] -> assume remain rdCnt<7;
2167
2168
2169wire inc_rcvCnt_16B= pktProc & ReOrderFifoDataValid; // use one stage ahead so that updated
2170 // rcvCnt align with roffDataValid
2171
2172wire inc_rcvCnt_1B= pktProc & roffDataValid; // this needs to align with roff_byteOffset
2173wire [13:0] rcvCnt_1B_sum_n= rcvCnt_1B + {9'h0, force_ff_byteOffset_n};
2174 // ff_byteOffset align with roffDataValid
2175
2176wire rcvPktNotDone_n= (rcvCnt_1B_sum_n < readLength);
2177
2178assign orderEnable= pktProc &
2179 (rdNotDone_n | // rdCnt non zero
2180 (rcvPktNotDone_n & rcvEQorder_n &
2181 ~ld_rdCnt_n)); // in remain >=16B case, let rdCnt continue;
2182 // wanna do burst read if can
2183 // if <16B, needs to be
2184 // one read at a time (rd,rcv..rd,rcv)
2185 // caused these are partial bytes in a line
2186 // and we don't wanna cross next pkt;
2187
2188assign pktRdDone= pktProc & ~rcvPktNotDone_n;
2189
2190always @(posedge SysClk) begin
2191 if(!Reset_L) begin
2192 rdCnt_16B<= #`SD 10'h0;
2193 rcvCnt_16B<= #`SD 10'h0;
2194 rcvCnt_1B<= #`SD 14'h0;
2195 orderCnt_16B<= #`SD 10'h0;
2196 end
2197 else begin
2198 if(setEnableFifoWrite_r)
2199 rdCnt_16B<= #`SD adj_ctrlhdr_pktlen_n[13:4] +
2200 ((|adj_ctrlhdr_pktlen_n[3:0])? 10'h1 : 10'h0);
2201 else if(inc_rdCnt_n) rdCnt_16B<= #`SD rdCnt_16B + 1'b1;
2202 else if(dec_rdCnt_n) rdCnt_16B<= #`SD rdCnt_16B - 1'b1;
2203 else if(ld_rdCnt_n) rdCnt_16B<= #`SD pktLength_n[13:4];
2204
2205 if(setEnableFifoWrite_r)
2206 rcvCnt_16B<= #`SD 10'h0;
2207 else if(inc_rcvCnt_16B) rcvCnt_16B<= #`SD rcvCnt_16B + 1'b1;
2208
2209 if(setEnableFifoWrite_r)
2210 rcvCnt_1B<= #`SD 14'h0;
2211 else if(inc_rcvCnt_1B) rcvCnt_1B<= #`SD rcvCnt_1B_sum_n;
2212
2213 if(setEnableFifoWrite_r)
2214 orderCnt_16B<= #`SD 10'h0;
2215 else if(inc_orderCnt_16B) orderCnt_16B<= #`SD orderCnt_16B + 1'b1;
2216 end
2217end
2218
2219
2220always @(posedge SysClk) begin
2221 if(!Reset_L) begin
2222 bytesNotRcv<= #`SD 5'h0;
2223 end
2224 else begin
2225 if(setEnableFifoWrite_r)
2226 bytesNotRcv<= #`SD 5'h0;
2227 else if(inc_bytesNotRcv_n) bytesNotRcv<= #`SD {1'b0, bytesNotRcv_sum_n[3:0]};
2228 end
2229
2230end
2231
2232
2233
2234// err handling
2235
2236 // rcvFifoCnt; use for err handling
2237always @(posedge SysClk)
2238 if (!Reset_L) rcvFifoCnt <= #`SD 10'h0;
2239 else if(ReOrderFifoDataValid) rcvFifoCnt <= #`SD rcvFifoCnt + 1'b1;
2240 else if(clrEnableFifoWrite) rcvFifoCnt <= #`SD 10'h0;
2241
2242 // rdFifoCnt; use for err handling
2243always @(posedge SysClk)
2244 if (!Reset_L) rdFifoCnt <= #`SD 10'h0;
2245 else if(readFifo) rdFifoCnt<= #`SD rdFifoCnt + 1'b1;
2246 else if(clrEnableFifoWrite) rdFifoCnt <= #`SD 10'h0;
2247
2248always @(posedge SysClk)
2249 if (!Reset_L) noWrite <= #`SD 1'b0;
2250 else if(set_noWrite_n) noWrite<= #`SD 1'b1;
2251 else if(rst_noWrite_n) noWrite<= #`SD 1'b0;
2252
2253always @(posedge SysClk)
2254 if (!Reset_L) errWrite <= #`SD 1'b0;
2255 else errWrite <= #`SD errWrite_n;
2256
2257assign collisionRequested = ClearStatistics & set_pktAbort_n;
2258
2259always @(posedge SysClk) begin
2260 if (!Reset_L) PktErrAbortCount <= #`SD 16'h0;
2261 else if (collisionRequested) PktErrAbortCount <= #`SD 16'h1;
2262 else if (ClearStatistics) PktErrAbortCount <= #`SD 16'h0;
2263 else if (WrPacketRequested) PktErrAbortCount <= #`SD PioDataIn[15:0];
2264 else if (set_pktAbort_n) PktErrAbortCount <= #`SD PktErrAbortCount +16'b1;
2265end
2266
2267/*
2268niu_txc_byteAlign byteAlign(
2269 .SysClk (SysClk),
2270 .Reset_L (Reset_L),
2271 .ReOrderFifoDataValid (ReOrderFifoDataValid), // pre-reg version
2272 .roffDataValid (roff_dv_r),
2273 .roffDataOut (roff_data_r[151:0]),
2274 .loadControlHeader (loadControlHeader),
2275 .controlHeader (controlHeader [127:0]),
2276 .setEnableFifoWrite (setEnableFifoWrite), // start data fifo read signal
2277 .writeCks_n (writeCks_n), // signal time to write checksum
2278 .StoreForwardWritePtr (ffStoreForwardWritePtr [9:0]), //
2279 .ChecksumValue (ChecksumValue[15:0]),
2280 .writeCks (writeCks),
2281 .cksStoreFwdffWptr (cksStoreFwdffWptr [9:0]),
2282 .pktDataWithCks (pktDataWithCks [127:0]),
2283 .ba_dv (ba_dv),
2284 .ba_sop (ba_sop),
2285 .ba_eop (ba_eop),
2286 .ba_qwr_dv (ba_qwr_dv),
2287 .ba_data (ba_data[127:0]),
2288 .readFifo (readFifo),
2289 .readLength (readLength [13:0]),
2290 .rcvEQorder (rcvEQorder),
2291 .orderEnable (orderEnable),
2292 .pktRdDone (pktRdDone)
2293);
2294*/
2295
2296
2297
2298endmodule