source: XOpenSparcT1/trunk/OC-Ethernet/eth_top.v @ 6

Revision 6, 35.7 KB checked in by pntsvt00, 13 years ago (diff)

versione iniziale opensparc

Line 
1//////////////////////////////////////////////////////////////////////
2////                                                              ////
3////  eth_top.v                                                   ////
4////                                                              ////
5////  This file is part of the Ethernet IP core project           ////
6////  http://www.opencores.org/projects/ethmac/                   ////
7////                                                              ////
8////  Author(s):                                                  ////
9////      - Igor Mohor (igorM@opencores.org)                      ////
10////                                                              ////
11////  All additional information is available in the Readme.txt   ////
12////  file.                                                       ////
13////                                                              ////
14//////////////////////////////////////////////////////////////////////
15////                                                              ////
16//// Copyright (C) 2001, 2002 Authors                             ////
17////                                                              ////
18//// This source file may be used and distributed without         ////
19//// restriction provided that this copyright statement is not    ////
20//// removed from the file and that any derivative work contains  ////
21//// the original copyright notice and the associated disclaimer. ////
22////                                                              ////
23//// This source file is free software; you can redistribute it   ////
24//// and/or modify it under the terms of the GNU Lesser General   ////
25//// Public License as published by the Free Software Foundation; ////
26//// either version 2.1 of the License, or (at your option) any   ////
27//// later version.                                               ////
28////                                                              ////
29//// This source is distributed in the hope that it will be       ////
30//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
31//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
32//// PURPOSE.  See the GNU Lesser General Public License for more ////
33//// details.                                                     ////
34////                                                              ////
35//// You should have received a copy of the GNU Lesser General    ////
36//// Public License along with this source; if not, download it   ////
37//// from http://www.opencores.org/lgpl.shtml                     ////
38////                                                              ////
39//////////////////////////////////////////////////////////////////////
40//
41// CVS Revision History
42//
43// $Log: not supported by cvs2svn $
44// Revision 1.51  2005/02/21 11:13:17  igorm
45// Defer indication fixed.
46//
47// Revision 1.50  2004/04/26 15:26:23  igorm
48// - Bug connected to the TX_BD_NUM_Wr signal fixed (bug came in with the
49//   previous update of the core.
50// - TxBDAddress is set to 0 after the TX is enabled in the MODER register.
51// - RxBDAddress is set to r_TxBDNum<<1 after the RX is enabled in the MODER
52//   register. (thanks to Mathias and Torbjorn)
53// - Multicast reception was fixed. Thanks to Ulrich Gries
54//
55// Revision 1.49  2003/11/12 18:24:59  tadejm
56// WISHBONE slave changed and tested from only 32-bit accesss to byte access.
57//
58// Revision 1.48  2003/10/17 07:46:16  markom
59// mbist signals updated according to newest convention
60//
61// Revision 1.47  2003/10/06 15:43:45  knguyen
62// Update RxEnSync only when mrxdv_pad_i is inactive (LOW).
63//
64// Revision 1.46  2003/01/30 13:30:22  tadejm
65// Defer indication changed.
66//
67// Revision 1.45  2003/01/22 13:49:26  tadejm
68// When control packets were received, they were ignored in some cases.
69//
70// Revision 1.44  2003/01/21 12:09:40  mohor
71// When receiving normal data frame and RxFlow control was switched on, RXB
72// interrupt was not set.
73//
74// Revision 1.43  2002/11/22 01:57:06  mohor
75// Rx Flow control fixed. CF flag added to the RX buffer descriptor. RxAbort
76// synchronized.
77//
78// Revision 1.42  2002/11/21 00:09:19  mohor
79// TPauseRq synchronized to tx_clk.
80//
81// Revision 1.41  2002/11/19 18:13:49  mohor
82// r_MiiMRst is not used for resetting the MIIM module. wb_rst used instead.
83//
84// Revision 1.40  2002/11/19 17:34:25  mohor
85// AddressMiss status is connecting to the Rx BD. AddressMiss is identifying
86// that a frame was received because of the promiscous mode.
87//
88// Revision 1.39  2002/11/18 17:31:55  mohor
89// wb_rst_i is used for MIIM reset.
90//
91// Revision 1.38  2002/11/14 18:37:20  mohor
92// r_Rst signal does not reset any module any more and is removed from the design.
93//
94// Revision 1.37  2002/11/13 22:25:36  tadejm
95// All modules are reset with wb_rst instead of the r_Rst. Exception is MII module.
96//
97// Revision 1.36  2002/10/18 17:04:20  tadejm
98// Changed BIST scan signals.
99//
100// Revision 1.35  2002/10/11 13:36:58  mohor
101// Typo error fixed. (When using Bist)
102//
103// Revision 1.34  2002/10/10 16:49:50  mohor
104// Signals for WISHBONE B3 compliant interface added.
105//
106// Revision 1.33  2002/10/10 16:29:30  mohor
107// BIST added.
108//
109// Revision 1.32  2002/09/20 17:12:58  mohor
110// CsMiss added. When address between 0x800 and 0xfff is accessed within
111// Ethernet Core, error acknowledge is generated.
112//
113// Revision 1.31  2002/09/12 14:50:17  mohor
114// CarrierSenseLost bug fixed when operating in full duplex mode.
115//
116// Revision 1.30  2002/09/10 10:35:23  mohor
117// Ethernet debug registers removed.
118//
119// Revision 1.29  2002/09/09 13:03:13  mohor
120// Error acknowledge is generated when accessing BDs and RST bit in the
121// MODER register (r_Rst) is set.
122//
123// Revision 1.28  2002/09/04 18:44:10  mohor
124// Signals related to the control frames connected. Debug registers reg1, 2, 3, 4
125// connected.
126//
127// Revision 1.27  2002/07/25 18:15:37  mohor
128// RxAbort changed. Packets received with MRxErr (from PHY) are also
129// aborted.
130//
131// Revision 1.26  2002/07/17 18:51:50  mohor
132// EXTERNAL_DMA removed. External DMA not supported.
133//
134// Revision 1.25  2002/05/03 10:15:50  mohor
135// Outputs registered. Reset changed for eth_wishbone module.
136//
137// Revision 1.24  2002/04/22 14:15:42  mohor
138// Wishbone signals are registered when ETH_REGISTERED_OUTPUTS is
139// selected in eth_defines.v
140//
141// Revision 1.23  2002/03/25 13:33:53  mohor
142// md_padoen_o changed to md_padoe_o. Signal was always active high, just
143// name was incorrect.
144//
145// Revision 1.22  2002/02/26 16:59:54  mohor
146// Small fixes for external/internal DMA missmatches.
147//
148// Revision 1.21  2002/02/26 16:21:00  mohor
149// Interrupts changed in the top file
150//
151// Revision 1.20  2002/02/18 10:40:17  mohor
152// Small fixes.
153//
154// Revision 1.19  2002/02/16 14:03:44  mohor
155// Registered trimmed. Unused registers removed.
156//
157// Revision 1.18  2002/02/16 13:06:33  mohor
158// EXTERNAL_DMA used instead of WISHBONE_DMA.
159//
160// Revision 1.17  2002/02/16 07:15:27  mohor
161// Testbench fixed, code simplified, unused signals removed.
162//
163// Revision 1.16  2002/02/15 13:49:39  mohor
164// RxAbort is connected differently.
165//
166// Revision 1.15  2002/02/15 11:38:26  mohor
167// Changes that were lost when updating from 1.11 to 1.14 fixed.
168//
169// Revision 1.14  2002/02/14 20:19:11  billditt
170// Modified for Address Checking,
171// addition of eth_addrcheck.v
172//
173// Revision 1.13  2002/02/12 17:03:03  mohor
174// HASH0 and HASH1 registers added. Registers address width was
175// changed to 8 bits.
176//
177// Revision 1.12  2002/02/11 09:18:22  mohor
178// Tx status is written back to the BD.
179//
180// Revision 1.11  2002/02/08 16:21:54  mohor
181// Rx status is written back to the BD.
182//
183// Revision 1.10  2002/02/06 14:10:21  mohor
184// non-DMA host interface added. Select the right configutation in eth_defines.
185//
186// Revision 1.9  2002/01/23 10:28:16  mohor
187// Link in the header changed.
188//
189// Revision 1.8  2001/12/05 15:00:16  mohor
190// RX_BD_NUM changed to TX_BD_NUM (holds number of TX descriptors
191// instead of the number of RX descriptors).
192//
193// Revision 1.7  2001/12/05 10:45:59  mohor
194// ETH_RX_BD_ADR register deleted. ETH_RX_BD_NUM is used instead.
195//
196// Revision 1.6  2001/10/19 11:24:29  mohor
197// Number of addresses (wb_adr_i) minimized.
198//
199// Revision 1.5  2001/10/19 08:43:51  mohor
200// eth_timescale.v changed to timescale.v This is done because of the
201// simulation of the few cores in a one joined project.
202//
203// Revision 1.4  2001/10/18 12:07:11  mohor
204// Status signals changed, Adress decoding changed, interrupt controller
205// added.
206//
207// Revision 1.3  2001/09/24 15:02:56  mohor
208// Defines changed (All precede with ETH_). Small changes because some
209// tools generate warnings when two operands are together. Synchronization
210// between two clocks domains in eth_wishbonedma.v is changed (due to ASIC
211// demands).
212//
213// Revision 1.2  2001/08/15 14:03:59  mohor
214// Signal names changed on the top level for easier pad insertion (ASIC).
215//
216// Revision 1.1  2001/08/06 14:44:29  mohor
217// A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
218// Include files fixed to contain no path.
219// File names and module names changed ta have a eth_ prologue in the name.
220// File eth_timescale.v is used to define timescale
221// All pin names on the top module are changed to contain _I, _O or _OE at the end.
222// Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
223// and Mdo_OE. The bidirectional signal must be created on the top level. This
224// is done due to the ASIC tools.
225//
226// Revision 1.2  2001/08/02 09:25:31  mohor
227// Unconnected signals are now connected.
228//
229// Revision 1.1  2001/07/30 21:23:42  mohor
230// Directory structure changed. Files checked and joind together.
231//
232//
233//
234//
235
236
237`include "eth_defines.v"
238`include "timescale.v"
239
240
241module eth_top
242(
243  // WISHBONE common
244  wb_clk_i, wb_rst_i, wb_dat_i, wb_dat_o, 
245
246  // WISHBONE slave
247  wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, wb_ack_o, wb_err_o, 
248
249  // WISHBONE master
250  m_wb_adr_o, m_wb_sel_o, m_wb_we_o, 
251  m_wb_dat_o, m_wb_dat_i, m_wb_cyc_o, 
252  m_wb_stb_o, m_wb_ack_i, m_wb_err_i, 
253
254`ifdef ETH_WISHBONE_B3
255  m_wb_cti_o, m_wb_bte_o, 
256`endif
257
258  //TX
259  mtx_clk_pad_i, mtxd_pad_o, mtxen_pad_o, mtxerr_pad_o,
260
261  //RX
262  mrx_clk_pad_i, mrxd_pad_i, mrxdv_pad_i, mrxerr_pad_i, mcoll_pad_i, mcrs_pad_i, 
263 
264  // MIIM
265  mdc_pad_o, md_pad_i, md_pad_o, md_padoe_o,
266
267  int_o
268
269  // Bist
270`ifdef ETH_BIST
271  ,
272  // debug chain signals
273  mbist_si_i,       // bist scan serial in
274  mbist_so_o,       // bist scan serial out
275  mbist_ctrl_i        // bist chain shift control
276`endif
277
278);
279
280
281parameter Tp = 1;
282
283
284// WISHBONE common
285input           wb_clk_i;     // WISHBONE clock
286input           wb_rst_i;     // WISHBONE reset
287input   [31:0]  wb_dat_i;     // WISHBONE data input
288output  [31:0]  wb_dat_o;     // WISHBONE data output
289output          wb_err_o;     // WISHBONE error output
290
291// WISHBONE slave
292input   [11:2]  wb_adr_i;     // WISHBONE address input
293input    [3:0]  wb_sel_i;     // WISHBONE byte select input
294input           wb_we_i;      // WISHBONE write enable input
295input           wb_cyc_i;     // WISHBONE cycle input
296input           wb_stb_i;     // WISHBONE strobe input
297output          wb_ack_o;     // WISHBONE acknowledge output
298
299// WISHBONE master
300output  [31:0]  m_wb_adr_o;
301output   [3:0]  m_wb_sel_o;
302output          m_wb_we_o;
303input   [31:0]  m_wb_dat_i;
304output  [31:0]  m_wb_dat_o;
305output          m_wb_cyc_o;
306output          m_wb_stb_o;
307input           m_wb_ack_i;
308input           m_wb_err_i;
309
310wire    [29:0]  m_wb_adr_tmp;
311
312`ifdef ETH_WISHBONE_B3
313output   [2:0]  m_wb_cti_o;   // Cycle Type Identifier
314output   [1:0]  m_wb_bte_o;   // Burst Type Extension
315`endif
316
317// Tx
318input           mtx_clk_pad_i; // Transmit clock (from PHY)
319output   [3:0]  mtxd_pad_o;    // Transmit nibble (to PHY)
320output          mtxen_pad_o;   // Transmit enable (to PHY)
321output          mtxerr_pad_o;  // Transmit error (to PHY)
322
323// Rx
324input           mrx_clk_pad_i; // Receive clock (from PHY)
325input    [3:0]  mrxd_pad_i;    // Receive nibble (from PHY)
326input           mrxdv_pad_i;   // Receive data valid (from PHY)
327input           mrxerr_pad_i;  // Receive data error (from PHY)
328
329// Common Tx and Rx
330input           mcoll_pad_i;   // Collision (from PHY)
331input           mcrs_pad_i;    // Carrier sense (from PHY)
332
333// MII Management interface
334input           md_pad_i;      // MII data input (from I/O cell)
335output          mdc_pad_o;     // MII Management data clock (to PHY)
336output          md_pad_o;      // MII data output (to I/O cell)
337output          md_padoe_o;    // MII data output enable (to I/O cell)
338
339output          int_o;         // Interrupt output
340
341// Bist
342`ifdef ETH_BIST
343input   mbist_si_i;       // bist scan serial in
344output  mbist_so_o;       // bist scan serial out
345input [`ETH_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i;       // bist chain shift control
346`endif
347
348wire     [7:0]  r_ClkDiv;
349wire            r_MiiNoPre;
350wire    [15:0]  r_CtrlData;
351wire     [4:0]  r_FIAD;
352wire     [4:0]  r_RGAD;
353wire            r_WCtrlData;
354wire            r_RStat;
355wire            r_ScanStat;
356wire            NValid_stat;
357wire            Busy_stat;
358wire            LinkFail;
359wire    [15:0]  Prsd;             // Read Status Data (data read from the PHY)
360wire            WCtrlDataStart;
361wire            RStatStart;
362wire            UpdateMIIRX_DATAReg;
363
364wire            TxStartFrm;
365wire            TxEndFrm;
366wire            TxUsedData;
367wire     [7:0]  TxData;
368wire            TxRetry;
369wire            TxAbort;
370wire            TxUnderRun;
371wire            TxDone;
372
373
374reg             WillSendControlFrame_sync1;
375reg             WillSendControlFrame_sync2;
376reg             WillSendControlFrame_sync3;
377reg             RstTxPauseRq;
378
379reg             TxPauseRq_sync1;
380reg             TxPauseRq_sync2;
381reg             TxPauseRq_sync3;
382reg             TPauseRq;
383
384
385// Connecting Miim module
386eth_miim miim1
387(
388  .Clk(wb_clk_i),                         .Reset(wb_rst_i),                   .Divider(r_ClkDiv), 
389  .NoPre(r_MiiNoPre),                     .CtrlData(r_CtrlData),              .Rgad(r_RGAD), 
390  .Fiad(r_FIAD),                          .WCtrlData(r_WCtrlData),            .RStat(r_RStat), 
391  .ScanStat(r_ScanStat),                  .Mdi(md_pad_i),                     .Mdo(md_pad_o), 
392  .MdoEn(md_padoe_o),                     .Mdc(mdc_pad_o),                    .Busy(Busy_stat), 
393  .Prsd(Prsd),                            .LinkFail(LinkFail),                .Nvalid(NValid_stat), 
394  .WCtrlDataStart(WCtrlDataStart),        .RStatStart(RStatStart),            .UpdateMIIRX_DATAReg(UpdateMIIRX_DATAReg)
395);
396
397
398
399
400wire  [3:0] RegCs;          // Connected to registers
401wire [31:0] RegDataOut;     // Multiplexed to wb_dat_o
402wire        r_RecSmall;     // Receive small frames
403wire        r_LoopBck;      // Loopback
404wire        r_TxEn;         // Tx Enable
405wire        r_RxEn;         // Rx Enable
406
407wire        MRxDV_Lb;       // Muxed MII receive data valid
408wire        MRxErr_Lb;      // Muxed MII Receive Error
409wire  [3:0] MRxD_Lb;        // Muxed MII Receive Data
410wire        Transmitting;   // Indication that TxEthMAC is transmitting
411wire        r_HugEn;        // Huge packet enable
412wire        r_DlyCrcEn;     // Delayed CRC enabled
413wire [15:0] r_MaxFL;        // Maximum frame length
414
415wire [15:0] r_MinFL;        // Minimum frame length
416wire        ShortFrame;
417wire        DribbleNibble;  // Extra nibble received
418wire        ReceivedPacketTooBig; // Received packet is too big
419wire [47:0] r_MAC;          // MAC address
420wire        LoadRxStatus;   // Rx status was loaded
421wire [31:0] r_HASH0;        // HASH table, lower 4 bytes
422wire [31:0] r_HASH1;        // HASH table, upper 4 bytes
423wire  [7:0] r_TxBDNum;      // Receive buffer descriptor number
424wire  [6:0] r_IPGT;         //
425wire  [6:0] r_IPGR1;        //
426wire  [6:0] r_IPGR2;        //
427wire  [5:0] r_CollValid;    //
428wire [15:0] r_TxPauseTV;    // Transmit PAUSE value
429wire        r_TxPauseRq;    // Transmit PAUSE request
430
431wire  [3:0] r_MaxRet;       //
432wire        r_NoBckof;      //
433wire        r_ExDfrEn;      //
434wire        r_TxFlow;       // Tx flow control enable
435wire        r_IFG;          // Minimum interframe gap for incoming packets
436
437wire        TxB_IRQ;        // Interrupt Tx Buffer
438wire        TxE_IRQ;        // Interrupt Tx Error
439wire        RxB_IRQ;        // Interrupt Rx Buffer
440wire        RxE_IRQ;        // Interrupt Rx Error
441wire        Busy_IRQ;       // Interrupt Busy (lack of buffers)
442
443//wire        DWord;
444wire        ByteSelected;
445wire        BDAck;
446wire [31:0] BD_WB_DAT_O;    // wb_dat_o that comes from the Wishbone module (for buffer descriptors read/write)
447wire  [3:0] BDCs;           // Buffer descriptor CS
448wire        CsMiss;         // When access to the address between 0x800 and 0xfff occurs, acknowledge is set
449                            // but data is not valid.
450wire        r_Pad;
451wire        r_CrcEn;
452wire        r_FullD;
453wire        r_Pro;
454wire        r_Bro;
455wire        r_NoPre;
456wire        r_RxFlow;
457wire        r_PassAll;
458wire        TxCtrlEndFrm;
459wire        StartTxDone;
460wire        SetPauseTimer;
461wire        TxUsedDataIn;
462wire        TxDoneIn;
463wire        TxAbortIn;
464wire        PerPacketPad;
465wire        PadOut;
466wire        PerPacketCrcEn;
467wire        CrcEnOut;
468wire        TxStartFrmOut;
469wire        TxEndFrmOut;
470wire        ReceivedPauseFrm;
471wire        ControlFrmAddressOK;
472wire        RxStatusWriteLatched_sync2;
473wire        LateCollision;
474wire        DeferIndication;
475wire        LateCollLatched;
476wire        DeferLatched;
477wire        RstDeferLatched;
478wire        CarrierSenseLost;
479
480wire        temp_wb_ack_o;
481wire [31:0] temp_wb_dat_o;
482wire        temp_wb_err_o;
483
484`ifdef ETH_REGISTERED_OUTPUTS
485  reg         temp_wb_ack_o_reg;
486  reg [31:0]  temp_wb_dat_o_reg;
487  reg         temp_wb_err_o_reg;
488`endif
489
490//assign DWord = &wb_sel_i;
491assign ByteSelected = |wb_sel_i;
492assign RegCs[3] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[3];   // 0x0   - 0x3FF
493assign RegCs[2] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[2];   // 0x0   - 0x3FF
494assign RegCs[1] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[1];   // 0x0   - 0x3FF
495assign RegCs[0] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[0];   // 0x0   - 0x3FF
496assign BDCs[3]  = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] &  wb_adr_i[10] & wb_sel_i[3];   // 0x400 - 0x7FF
497assign BDCs[2]  = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] &  wb_adr_i[10] & wb_sel_i[2];   // 0x400 - 0x7FF
498assign BDCs[1]  = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] &  wb_adr_i[10] & wb_sel_i[1];   // 0x400 - 0x7FF
499assign BDCs[0]  = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] &  wb_adr_i[10] & wb_sel_i[0];   // 0x400 - 0x7FF
500assign CsMiss = wb_stb_i & wb_cyc_i & ByteSelected & wb_adr_i[11];                   // 0x800 - 0xfFF
501assign temp_wb_dat_o = ((|RegCs) & ~wb_we_i)? RegDataOut : BD_WB_DAT_O;
502assign temp_wb_err_o = wb_stb_i & wb_cyc_i & (~ByteSelected | CsMiss);
503
504`ifdef ETH_REGISTERED_OUTPUTS
505  assign wb_ack_o = temp_wb_ack_o_reg;
506  assign wb_dat_o[31:0] = temp_wb_dat_o_reg;
507  assign wb_err_o = temp_wb_err_o_reg;
508`else
509  assign wb_ack_o = temp_wb_ack_o;
510  assign wb_dat_o[31:0] = temp_wb_dat_o;
511  assign wb_err_o = temp_wb_err_o;
512`endif
513
514`ifdef ETH_AVALON_BUS
515  // As Avalon has no corresponding "error" signal, I (erroneously) will
516  // send an ack to Avalon, even when accessing undefined memory. This
517  // is a grey area in Avalon vs. Wishbone specs: My understanding
518  // is that Avalon expects all memory addressable by the addr bus feeding
519  // a slave to be, at the very minimum, readable.
520  assign temp_wb_ack_o = (|RegCs) | BDAck | CsMiss;
521`else // WISHBONE
522  assign temp_wb_ack_o = (|RegCs) | BDAck;
523`endif
524
525`ifdef ETH_REGISTERED_OUTPUTS
526  always @ (posedge wb_clk_i or posedge wb_rst_i)
527  begin
528    if(wb_rst_i)
529      begin
530        temp_wb_ack_o_reg <=#Tp 1'b0;
531        temp_wb_dat_o_reg <=#Tp 32'h0;
532        temp_wb_err_o_reg <=#Tp 1'b0;
533      end
534    else
535      begin
536        temp_wb_ack_o_reg <=#Tp temp_wb_ack_o & ~temp_wb_ack_o_reg;
537        temp_wb_dat_o_reg <=#Tp temp_wb_dat_o;
538        temp_wb_err_o_reg <=#Tp temp_wb_err_o & ~temp_wb_err_o_reg;
539      end
540  end
541`endif
542
543
544// Connecting Ethernet registers
545eth_registers ethreg1
546(
547  .DataIn(wb_dat_i),                      .Address(wb_adr_i[9:2]),                    .Rw(wb_we_i), 
548  .Cs(RegCs),                             .Clk(wb_clk_i),                             .Reset(wb_rst_i), 
549  .DataOut(RegDataOut),                   .r_RecSmall(r_RecSmall), 
550  .r_Pad(r_Pad),                          .r_HugEn(r_HugEn),                          .r_CrcEn(r_CrcEn), 
551  .r_DlyCrcEn(r_DlyCrcEn),                .r_FullD(r_FullD), 
552  .r_ExDfrEn(r_ExDfrEn),                  .r_NoBckof(r_NoBckof),                      .r_LoopBck(r_LoopBck), 
553  .r_IFG(r_IFG),                          .r_Pro(r_Pro),                              .r_Iam(), 
554  .r_Bro(r_Bro),                          .r_NoPre(r_NoPre),                          .r_TxEn(r_TxEn), 
555  .r_RxEn(r_RxEn),                        .Busy_IRQ(Busy_IRQ),                        .RxE_IRQ(RxE_IRQ), 
556  .RxB_IRQ(RxB_IRQ),                      .TxE_IRQ(TxE_IRQ),                          .TxB_IRQ(TxB_IRQ), 
557  .r_IPGT(r_IPGT), 
558  .r_IPGR1(r_IPGR1),                      .r_IPGR2(r_IPGR2),                          .r_MinFL(r_MinFL), 
559  .r_MaxFL(r_MaxFL),                      .r_MaxRet(r_MaxRet),                        .r_CollValid(r_CollValid), 
560  .r_TxFlow(r_TxFlow),                    .r_RxFlow(r_RxFlow),                        .r_PassAll(r_PassAll), 
561  .r_MiiNoPre(r_MiiNoPre),                .r_ClkDiv(r_ClkDiv), 
562  .r_WCtrlData(r_WCtrlData),              .r_RStat(r_RStat),                          .r_ScanStat(r_ScanStat), 
563  .r_RGAD(r_RGAD),                        .r_FIAD(r_FIAD),                            .r_CtrlData(r_CtrlData), 
564  .NValid_stat(NValid_stat),              .Busy_stat(Busy_stat),                   
565  .LinkFail(LinkFail),                    .r_MAC(r_MAC),                              .WCtrlDataStart(WCtrlDataStart),
566  .RStatStart(RStatStart),                .UpdateMIIRX_DATAReg(UpdateMIIRX_DATAReg),  .Prsd(Prsd), 
567  .r_TxBDNum(r_TxBDNum),                  .int_o(int_o),
568  .r_HASH0(r_HASH0),                      .r_HASH1(r_HASH1),                          .r_TxPauseRq(r_TxPauseRq), 
569  .r_TxPauseTV(r_TxPauseTV),              .RstTxPauseRq(RstTxPauseRq),                .TxCtrlEndFrm(TxCtrlEndFrm), 
570  .StartTxDone(StartTxDone),              .TxClk(mtx_clk_pad_i),                      .RxClk(mrx_clk_pad_i), 
571  .SetPauseTimer(SetPauseTimer)
572 
573);
574
575
576
577wire  [7:0] RxData;
578wire        RxValid;
579wire        RxStartFrm;
580wire        RxEndFrm;
581wire        RxAbort;
582
583wire        WillTransmit;            // Will transmit (to RxEthMAC)
584wire        ResetCollision;          // Reset Collision (for synchronizing collision)
585wire  [7:0] TxDataOut;               // Transmit Packet Data (to TxEthMAC)
586wire        WillSendControlFrame;
587wire        ReceiveEnd;
588wire        ReceivedPacketGood;
589wire        ReceivedLengthOK;
590wire        InvalidSymbol;
591wire        LatchedCrcError;
592wire        RxLateCollision;
593wire  [3:0] RetryCntLatched;   
594wire  [3:0] RetryCnt;   
595wire        StartTxAbort;   
596wire        MaxCollisionOccured;   
597wire        RetryLimit;   
598wire        StatePreamble;   
599wire  [1:0] StateData; 
600
601// Connecting MACControl
602eth_maccontrol maccontrol1
603(
604  .MTxClk(mtx_clk_pad_i),                       .TPauseRq(TPauseRq), 
605  .TxPauseTV(r_TxPauseTV),                      .TxDataIn(TxData), 
606  .TxStartFrmIn(TxStartFrm),                    .TxEndFrmIn(TxEndFrm), 
607  .TxUsedDataIn(TxUsedDataIn),                  .TxDoneIn(TxDoneIn), 
608  .TxAbortIn(TxAbortIn),                        .MRxClk(mrx_clk_pad_i), 
609  .RxData(RxData),                              .RxValid(RxValid), 
610  .RxStartFrm(RxStartFrm),                      .RxEndFrm(RxEndFrm),
611  .ReceiveEnd(ReceiveEnd),                      .ReceivedPacketGood(ReceivedPacketGood),
612  .TxFlow(r_TxFlow), 
613  .RxFlow(r_RxFlow),                            .DlyCrcEn(r_DlyCrcEn),
614  .MAC(r_MAC),                                  .PadIn(r_Pad | PerPacketPad), 
615  .PadOut(PadOut),                              .CrcEnIn(r_CrcEn | PerPacketCrcEn), 
616  .CrcEnOut(CrcEnOut),                          .TxReset(wb_rst_i), 
617  .RxReset(wb_rst_i),                           .ReceivedLengthOK(ReceivedLengthOK),
618  .TxDataOut(TxDataOut),                        .TxStartFrmOut(TxStartFrmOut), 
619  .TxEndFrmOut(TxEndFrmOut),                    .TxUsedDataOut(TxUsedData), 
620  .TxDoneOut(TxDone),                           .TxAbortOut(TxAbort), 
621  .WillSendControlFrame(WillSendControlFrame),  .TxCtrlEndFrm(TxCtrlEndFrm), 
622  .ReceivedPauseFrm(ReceivedPauseFrm),          .ControlFrmAddressOK(ControlFrmAddressOK),
623  .SetPauseTimer(SetPauseTimer),
624  .RxStatusWriteLatched_sync2(RxStatusWriteLatched_sync2),                .r_PassAll(r_PassAll)
625);
626
627
628
629wire TxCarrierSense;          // Synchronized CarrierSense (to Tx clock)
630wire Collision;               // Synchronized Collision
631
632reg CarrierSense_Tx1;
633reg CarrierSense_Tx2;
634reg Collision_Tx1;
635reg Collision_Tx2;
636
637reg RxEnSync;                 // Synchronized Receive Enable
638reg WillTransmit_q;
639reg WillTransmit_q2;
640
641
642
643// Muxed MII receive data valid
644assign MRxDV_Lb = r_LoopBck? mtxen_pad_o : mrxdv_pad_i & RxEnSync;
645
646// Muxed MII Receive Error
647assign MRxErr_Lb = r_LoopBck? mtxerr_pad_o : mrxerr_pad_i & RxEnSync;
648
649// Muxed MII Receive Data
650assign MRxD_Lb[3:0] = r_LoopBck? mtxd_pad_o[3:0] : mrxd_pad_i[3:0];
651
652
653
654// Connecting TxEthMAC
655eth_txethmac txethmac1
656(
657  .MTxClk(mtx_clk_pad_i),             .Reset(wb_rst_i),                   .CarrierSense(TxCarrierSense), 
658  .Collision(Collision),              .TxData(TxDataOut),                 .TxStartFrm(TxStartFrmOut), 
659  .TxUnderRun(TxUnderRun),            .TxEndFrm(TxEndFrmOut),             .Pad(PadOut), 
660  .MinFL(r_MinFL),                    .CrcEn(CrcEnOut),                   .FullD(r_FullD), 
661  .HugEn(r_HugEn),                    .DlyCrcEn(r_DlyCrcEn),              .IPGT(r_IPGT), 
662  .IPGR1(r_IPGR1),                    .IPGR2(r_IPGR2),                    .CollValid(r_CollValid), 
663  .MaxRet(r_MaxRet),                  .NoBckof(r_NoBckof),                .ExDfrEn(r_ExDfrEn), 
664  .MaxFL(r_MaxFL),                    .MTxEn(mtxen_pad_o),                .MTxD(mtxd_pad_o), 
665  .MTxErr(mtxerr_pad_o),              .TxUsedData(TxUsedDataIn),          .TxDone(TxDoneIn), 
666  .TxRetry(TxRetry),                  .TxAbort(TxAbortIn),                .WillTransmit(WillTransmit), 
667  .ResetCollision(ResetCollision),    .RetryCnt(RetryCnt),                .StartTxDone(StartTxDone), 
668  .StartTxAbort(StartTxAbort),        .MaxCollisionOccured(MaxCollisionOccured), .LateCollision(LateCollision),   
669  .DeferIndication(DeferIndication),  .StatePreamble(StatePreamble),      .StateData(StateData)   
670);
671
672
673
674
675wire  [15:0]  RxByteCnt;
676wire          RxByteCntEq0;
677wire          RxByteCntGreat2;
678wire          RxByteCntMaxFrame;
679wire          RxCrcError;
680wire          RxStateIdle;
681wire          RxStatePreamble;
682wire          RxStateSFD;
683wire   [1:0]  RxStateData;
684wire          AddressMiss;
685
686
687
688// Connecting RxEthMAC
689eth_rxethmac rxethmac1
690(
691  .MRxClk(mrx_clk_pad_i),               .MRxDV(MRxDV_Lb),                     .MRxD(MRxD_Lb),
692  .Transmitting(Transmitting),          .HugEn(r_HugEn),                      .DlyCrcEn(r_DlyCrcEn), 
693  .MaxFL(r_MaxFL),                      .r_IFG(r_IFG),                        .Reset(wb_rst_i),
694  .RxData(RxData),                      .RxValid(RxValid),                    .RxStartFrm(RxStartFrm), 
695  .RxEndFrm(RxEndFrm),                  .ByteCnt(RxByteCnt), 
696  .ByteCntEq0(RxByteCntEq0),            .ByteCntGreat2(RxByteCntGreat2),      .ByteCntMaxFrame(RxByteCntMaxFrame), 
697  .CrcError(RxCrcError),                .StateIdle(RxStateIdle),              .StatePreamble(RxStatePreamble), 
698  .StateSFD(RxStateSFD),                .StateData(RxStateData),
699  .MAC(r_MAC),                          .r_Pro(r_Pro),                        .r_Bro(r_Bro),
700  .r_HASH0(r_HASH0),                    .r_HASH1(r_HASH1),                    .RxAbort(RxAbort), 
701  .AddressMiss(AddressMiss),            .PassAll(r_PassAll),                  .ControlFrmAddressOK(ControlFrmAddressOK)
702);
703
704
705// MII Carrier Sense Synchronization
706always @ (posedge mtx_clk_pad_i or posedge wb_rst_i)
707begin
708  if(wb_rst_i)
709    begin
710      CarrierSense_Tx1 <= #Tp 1'b0;
711      CarrierSense_Tx2 <= #Tp 1'b0;
712    end
713  else
714    begin
715      CarrierSense_Tx1 <= #Tp mcrs_pad_i;
716      CarrierSense_Tx2 <= #Tp CarrierSense_Tx1;
717    end
718end
719
720assign TxCarrierSense = ~r_FullD & CarrierSense_Tx2;
721
722
723// MII Collision Synchronization
724always @ (posedge mtx_clk_pad_i or posedge wb_rst_i)
725begin
726  if(wb_rst_i)
727    begin
728      Collision_Tx1 <= #Tp 1'b0;
729      Collision_Tx2 <= #Tp 1'b0;
730    end
731  else
732    begin
733      Collision_Tx1 <= #Tp mcoll_pad_i;
734      if(ResetCollision)
735        Collision_Tx2 <= #Tp 1'b0;
736      else
737      if(Collision_Tx1)
738        Collision_Tx2 <= #Tp 1'b1;
739    end
740end
741
742
743// Synchronized Collision
744assign Collision = ~r_FullD & Collision_Tx2;
745
746
747
748// Delayed WillTransmit
749always @ (posedge mrx_clk_pad_i)
750begin
751  WillTransmit_q <= #Tp WillTransmit;
752  WillTransmit_q2 <= #Tp WillTransmit_q;
753end 
754
755
756assign Transmitting = ~r_FullD & WillTransmit_q2;
757
758
759
760// Synchronized Receive Enable
761always @ (posedge mrx_clk_pad_i or posedge wb_rst_i)
762begin
763  if(wb_rst_i)
764    RxEnSync <= #Tp 1'b0;
765  else
766  if(~mrxdv_pad_i)
767    RxEnSync <= #Tp r_RxEn;
768end 
769
770
771
772// Synchronizing WillSendControlFrame to WB_CLK;
773always @ (posedge wb_clk_i or posedge wb_rst_i)
774begin
775  if(wb_rst_i)
776    WillSendControlFrame_sync1 <= 1'b0;
777  else
778    WillSendControlFrame_sync1 <=#Tp WillSendControlFrame;
779end
780
781always @ (posedge wb_clk_i or posedge wb_rst_i)
782begin
783  if(wb_rst_i)
784    WillSendControlFrame_sync2 <= 1'b0;
785  else
786    WillSendControlFrame_sync2 <=#Tp WillSendControlFrame_sync1;
787end
788
789always @ (posedge wb_clk_i or posedge wb_rst_i)
790begin
791  if(wb_rst_i)
792    WillSendControlFrame_sync3 <= 1'b0;
793  else
794    WillSendControlFrame_sync3 <=#Tp WillSendControlFrame_sync2;
795end
796
797always @ (posedge wb_clk_i or posedge wb_rst_i)
798begin
799  if(wb_rst_i)
800    RstTxPauseRq <= 1'b0;
801  else
802    RstTxPauseRq <=#Tp WillSendControlFrame_sync2 & ~WillSendControlFrame_sync3;
803end
804
805
806
807
808// TX Pause request Synchronization
809always @ (posedge mtx_clk_pad_i or posedge wb_rst_i)
810begin
811  if(wb_rst_i)
812    begin
813      TxPauseRq_sync1 <= #Tp 1'b0;
814      TxPauseRq_sync2 <= #Tp 1'b0;
815      TxPauseRq_sync3 <= #Tp 1'b0;
816    end
817  else
818    begin
819      TxPauseRq_sync1 <= #Tp (r_TxPauseRq & r_TxFlow);
820      TxPauseRq_sync2 <= #Tp TxPauseRq_sync1;
821      TxPauseRq_sync3 <= #Tp TxPauseRq_sync2;
822    end
823end
824
825
826always @ (posedge mtx_clk_pad_i or posedge wb_rst_i)
827begin
828  if(wb_rst_i)
829    TPauseRq <= #Tp 1'b0;
830  else
831    TPauseRq <= #Tp TxPauseRq_sync2 & (~TxPauseRq_sync3);
832end
833
834
835wire LatchedMRxErr;
836reg RxAbort_latch;
837reg RxAbort_sync1;
838reg RxAbort_wb;
839reg RxAbortRst_sync1;
840reg RxAbortRst;
841
842// Synchronizing RxAbort to the WISHBONE clock
843always @ (posedge mrx_clk_pad_i or posedge wb_rst_i)
844begin
845  if(wb_rst_i)
846    RxAbort_latch <= #Tp 1'b0;
847  else if(RxAbort | (ShortFrame & ~r_RecSmall) | LatchedMRxErr & ~InvalidSymbol | (ReceivedPauseFrm & (~r_PassAll)))
848    RxAbort_latch <= #Tp 1'b1;
849  else if(RxAbortRst)
850    RxAbort_latch <= #Tp 1'b0;
851end
852
853always @ (posedge wb_clk_i or posedge wb_rst_i)
854begin
855  if(wb_rst_i)
856    begin
857      RxAbort_sync1 <= #Tp 1'b0;
858      RxAbort_wb    <= #Tp 1'b0;
859      RxAbort_wb    <= #Tp 1'b0;
860    end
861  else
862    begin
863      RxAbort_sync1 <= #Tp RxAbort_latch;
864      RxAbort_wb    <= #Tp RxAbort_sync1;
865    end
866end
867
868always @ (posedge mrx_clk_pad_i or posedge wb_rst_i)
869begin
870  if(wb_rst_i)
871    begin
872      RxAbortRst_sync1 <= #Tp 1'b0;
873      RxAbortRst       <= #Tp 1'b0;
874    end
875  else
876    begin
877      RxAbortRst_sync1 <= #Tp RxAbort_wb;
878      RxAbortRst       <= #Tp RxAbortRst_sync1;
879    end
880end
881
882
883
884// Connecting Wishbone module
885eth_wishbone wishbone
886(
887  .WB_CLK_I(wb_clk_i),                .WB_DAT_I(wb_dat_i), 
888  .WB_DAT_O(BD_WB_DAT_O), 
889
890  // WISHBONE slave
891  .WB_ADR_I(wb_adr_i[9:2]),           .WB_WE_I(wb_we_i), 
892  .BDCs(BDCs),                        .WB_ACK_O(BDAck), 
893
894  .Reset(wb_rst_i), 
895
896  // WISHBONE master
897  .m_wb_adr_o(m_wb_adr_tmp),          .m_wb_sel_o(m_wb_sel_o),                  .m_wb_we_o(m_wb_we_o), 
898  .m_wb_dat_i(m_wb_dat_i),            .m_wb_dat_o(m_wb_dat_o),                  .m_wb_cyc_o(m_wb_cyc_o), 
899  .m_wb_stb_o(m_wb_stb_o),            .m_wb_ack_i(m_wb_ack_i),                  .m_wb_err_i(m_wb_err_i), 
900 
901`ifdef ETH_WISHBONE_B3
902  .m_wb_cti_o(m_wb_cti_o),            .m_wb_bte_o(m_wb_bte_o), 
903`endif
904 
905
906    //TX
907  .MTxClk(mtx_clk_pad_i),             .TxStartFrm(TxStartFrm),                  .TxEndFrm(TxEndFrm), 
908  .TxUsedData(TxUsedData),            .TxData(TxData), 
909  .TxRetry(TxRetry),                  .TxAbort(TxAbort),                        .TxUnderRun(TxUnderRun), 
910  .TxDone(TxDone), 
911  .PerPacketCrcEn(PerPacketCrcEn),    .PerPacketPad(PerPacketPad), 
912
913  // Register
914  .r_TxEn(r_TxEn),                    .r_RxEn(r_RxEn),                          .r_TxBDNum(r_TxBDNum), 
915  .r_RxFlow(r_RxFlow),                      .r_PassAll(r_PassAll), 
916
917  //RX
918  .MRxClk(mrx_clk_pad_i),             .RxData(RxData),                          .RxValid(RxValid), 
919  .RxStartFrm(RxStartFrm),            .RxEndFrm(RxEndFrm),                     
920  .Busy_IRQ(Busy_IRQ),                .RxE_IRQ(RxE_IRQ),                        .RxB_IRQ(RxB_IRQ), 
921  .TxE_IRQ(TxE_IRQ),                  .TxB_IRQ(TxB_IRQ), 
922
923  .RxAbort(RxAbort_wb),               .RxStatusWriteLatched_sync2(RxStatusWriteLatched_sync2), 
924
925  .InvalidSymbol(InvalidSymbol),      .LatchedCrcError(LatchedCrcError),        .RxLength(RxByteCnt),
926  .RxLateCollision(RxLateCollision),  .ShortFrame(ShortFrame),                  .DribbleNibble(DribbleNibble),
927  .ReceivedPacketTooBig(ReceivedPacketTooBig), .LoadRxStatus(LoadRxStatus),     .RetryCntLatched(RetryCntLatched),
928  .RetryLimit(RetryLimit),            .LateCollLatched(LateCollLatched),        .DeferLatched(DeferLatched),   
929  .RstDeferLatched(RstDeferLatched), 
930  .CarrierSenseLost(CarrierSenseLost),.ReceivedPacketGood(ReceivedPacketGood),  .AddressMiss(AddressMiss),
931  .ReceivedPauseFrm(ReceivedPauseFrm)
932 
933`ifdef ETH_BIST
934  ,
935  .mbist_si_i       (mbist_si_i),
936  .mbist_so_o       (mbist_so_o),
937  .mbist_ctrl_i       (mbist_ctrl_i)
938`endif
939);
940
941assign m_wb_adr_o = {m_wb_adr_tmp, 2'h0};
942
943// Connecting MacStatus module
944eth_macstatus macstatus1
945(
946  .MRxClk(mrx_clk_pad_i),             .Reset(wb_rst_i),
947  .ReceiveEnd(ReceiveEnd),            .ReceivedPacketGood(ReceivedPacketGood),     .ReceivedLengthOK(ReceivedLengthOK), 
948  .RxCrcError(RxCrcError),            .MRxErr(MRxErr_Lb),                          .MRxDV(MRxDV_Lb), 
949  .RxStateSFD(RxStateSFD),            .RxStateData(RxStateData),                   .RxStatePreamble(RxStatePreamble), 
950  .RxStateIdle(RxStateIdle),          .Transmitting(Transmitting),                 .RxByteCnt(RxByteCnt), 
951  .RxByteCntEq0(RxByteCntEq0),        .RxByteCntGreat2(RxByteCntGreat2),           .RxByteCntMaxFrame(RxByteCntMaxFrame), 
952  .InvalidSymbol(InvalidSymbol),
953  .MRxD(MRxD_Lb),                     .LatchedCrcError(LatchedCrcError),           .Collision(mcoll_pad_i),
954  .CollValid(r_CollValid),            .RxLateCollision(RxLateCollision),           .r_RecSmall(r_RecSmall),
955  .r_MinFL(r_MinFL),                  .r_MaxFL(r_MaxFL),                           .ShortFrame(ShortFrame),
956  .DribbleNibble(DribbleNibble),      .ReceivedPacketTooBig(ReceivedPacketTooBig), .r_HugEn(r_HugEn),
957  .LoadRxStatus(LoadRxStatus),        .RetryCnt(RetryCnt),                         .StartTxDone(StartTxDone),
958  .StartTxAbort(StartTxAbort),        .RetryCntLatched(RetryCntLatched),           .MTxClk(mtx_clk_pad_i),
959  .MaxCollisionOccured(MaxCollisionOccured), .RetryLimit(RetryLimit),              .LateCollision(LateCollision),
960  .LateCollLatched(LateCollLatched),  .DeferIndication(DeferIndication),           .DeferLatched(DeferLatched),
961  .RstDeferLatched(RstDeferLatched), 
962  .TxStartFrm(TxStartFrmOut),         .StatePreamble(StatePreamble),               .StateData(StateData),
963  .CarrierSense(CarrierSense_Tx2),    .CarrierSenseLost(CarrierSenseLost),         .TxUsedData(TxUsedDataIn),
964  .LatchedMRxErr(LatchedMRxErr),      .Loopback(r_LoopBck),                        .r_FullD(r_FullD)
965);
966
967
968endmodule
Note: See TracBrowser for help on using the repository browser.