OpenCores
URL https://opencores.org/ocsvn/esoc/esoc/trunk

Subversion Repositories esoc

[/] [esoc/] [trunk/] [Sources/] [altera/] [esoc_port_mac/] [testbench/] [esoc_port_mac/] [esoc_port_mac_tb.vhd] - Blame information for rev 42

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 42 lmaarsen
-- -------------------------------------------------------------------------
2
-- -------------------------------------------------------------------------
3
--
4
-- Revision Control Information
5
--
6
-- $RCSfile: testbench_gen_host_32.vhd,v $
7
-- $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/MAC/vhdl/testbench_gen_host_32.vhd,v $
8
--
9
-- $Revision: #2 $
10
-- $Date: 2008/09/29 $
11
-- Check in by : $Author: sc-build $
12
-- Author      : SKNg/TTChong
13
--
14
-- Project     : Triple Speed Ethernet - 10/100/1000 MAC
15
--
16
-- Description : 
17
--
18
-- Testbench for 32-Bit Core
19
--
20
-- 
21
-- ALTERA Confidential and Proprietary
22
-- Copyright 2007 (c) Altera Corporation
23
-- All rights reserved
24
--
25
-- -------------------------------------------------------------------------
26
-- -------------------------------------------------------------------------
27
 
28
library ieee;
29
use     ieee.std_logic_1164.all;
30
use     ieee.std_logic_arith.all;
31
use     ieee.std_logic_unsigned.all;
32
use     ieee.std_logic_misc.all;
33
use     std.textio.all;
34
 
35
 
36
use     work.altera_ethmodels_pack.all;
37
 
38
entity tb is
39
 
40
generic(
41
    -- Simulation Settings (Testbench)
42
    -- -------------------------------
43
        LOG_FILE                    : string(1 to 7) := "sim.log";
44
 
45
 
46
        ETH_MODE                    : integer := 1000 ; -- Ethernet Operation Mode
47
        HD_ENA                      : boolean := FALSE ; -- Enable Half Duplex Operation
48
        TB_RXFRAMES                 : integer := 0 ; -- number of frames to send in RX path - If set to 0, generator is diabled and loopbackmode is active
49
        TB_RXIPG                    : integer := 12 ; -- Inter Packet Gap used by RX generator
50
        TB_TXFRAMES                 : integer := 5 ; -- number of frames to send in TX path (set to 0 to disable)
51
        TB_PAUSECONTROL             : boolean := TRUE ; -- react on PAUSE Frames coming from MAC
52
        TB_LENSTART                 : integer := 100 ; -- length to start (incremented each new frame by TB_LENSTEP)
53
        TB_LENSTEP                  : integer := 1 ; -- steps the length should increase with each frame
54
        TB_LENMAX                   : integer := 1500 ; -- max. payload length for generation
55
        TB_ENA_PADDING              : boolean := TRUE ; -- enable padding of frames coming from RX PHY generator
56
        TB_ENA_VLAN                 : integer := 0 ; -- enable generation of a VLAN frame every x frames
57
        TB_STOPREAD                 : integer := 0 ; -- stop reading the RX fifo after x frames
58
        TB_HOLDREAD                 : integer := 1000 ; -- clock cycles to wait after stopread before continuing to read
59
        TB_TRIGGERXOFF              : integer := 0 ; -- when to trigger a pause frame using the xoff_gen command
60
        TB_TRIGGERXON               : integer := 0 ; -- when to trigger a pause frame using the xon_gen command
61
        TB_MACLENMAX                : integer := 1518 ; -- max. frame length configuration of MAC
62
        TB_MACPAUSEQ                : integer := 15 ; -- pause quanta configuration of MAC
63
        TB_MACIGNORE_PAUSE          : boolean := FALSE ; -- Ignore Pause Frames
64
        TB_MACFWD_PAUSE             : boolean := FALSE ; -- Forward Pause Frames
65
        TB_MACFWDCRC                : boolean := FALSE ; -- Forward CRC
66
        TB_MACINSERT_ADDR           : boolean := FALSE ; -- Insert MAC source address
67
        TB_MACRX_ERR_DISC           : integer := 1 ;  --MAC function discards erroneous frames received, only when rx_section_full register = 0
68
        TB_ADDR_SEL                 : integer := 0 ; -- Select MAC source address
69
        TB_MACPADEN                 : boolean := TRUE ; -- Enable Padding
70
        TB_MODPAUSEQ                : integer := 16 ; -- Pause Quanta
71
        TB_ENA_VAR_IPG              : boolean := FALSE ; -- Enable Variable IPG  
72
        RX_FIFO_SECTION_EMPTY       : integer := 0 ; -- Section Empty Threshold
73
        RX_FIFO_SECTION_FULL        : integer := 16 ; -- Section Full Threshold
74
        TX_FIFO_SECTION_EMPTY       : integer := 16 ; -- Section Empty Threshold
75
        TX_FIFO_SECTION_FULL        : integer := 16 ; -- Section Full Threshold
76
        RX_FIFO_AE                  : integer := 8 ; -- Almost Empty Threshold
77
        RX_FIFO_AF                  : integer := 8 ; -- Almost Full Threshold
78
        TX_FIFO_AE                  : integer := 8 ; -- Almost Empty Threshold
79
        TX_FIFO_AF                  : integer := 10 ; -- Almost Full Threshold
80
        RX_COL_FRM                  : integer := 0 ; -- Colision on Frame Number
81
        RX_COL_GEN                  : integer := 0 ; -- Colision on Nibble Number
82
        TX_COL_FRM                  : integer := 0 ; -- Colision on Frame Number
83
        TX_COL_GEN                  : integer := 0 ; -- Colision on Nibble Number
84
        TX_COL_NUM                  : integer := 0 ; -- Number of Concecutive Collisions
85
        TX_COL_DELAY                : integer := 0 ; -- Delay Between Concecutive Collisions
86
        TB_MDIO_ADDR0               : integer := 0 ; -- MDIO PHY 0 Address
87
        TB_MDIO_ADDR1               : integer := 1 ; -- MDIO PHY 1 Address
88
        TB_PROMIS_ENA               : boolean := true ; -- Enable Promiscuous Mode
89
        PERIOD_HASHCLK              : time := 15 ns;  -- 66MHz hash table programming
90
        TB_MDIO_SIMULATION          : boolean := FALSE ; -- Enable MDIO Simulation
91
        TB_ENA_AUTONEG              : boolean := FALSE ; -- Enable Autonegotiation
92
        TB_PCS_BYPASS               : boolean := FALSE ; -- Bypass PCS
93
        TB_IPG_LENGTH               : integer := 12 ; -- Enable Inverted Loopback
94
        LOC_HIGH                    : time := 4.0 ns ;
95
        LOC_LOW                     : time := 4.0 ns ;
96
        TB_TX_FF_ERR                : boolean := FALSE ; -- Generate Frame with Errors on Tx FIFO
97
        ENA_MAGIC                   : boolean := FALSE ; -- Enable Sleep . Wake Up Simulation
98
        ENA_SLEEP_PIN               : boolean := FALSE ; -- Sleep Activated with magic_sleep_n Pin
99
        ENA_INVERT_LB               : boolean := FALSE  -- Enable Inverted Loopback
100
 
101
); -- end generic
102
 
103
 
104
 
105
type TARGET_TYPE is (GEN) ;
106
 
107
-- Simulation Configuration
108
-- ------------------------
109
   -- Multicast addresses 
110
 
111
constant MCAST_TABLEN : integer := 9;    -- number of MAC addresses in the table
112
type mctable is array(0 to MCAST_TABLEN-1) of std_logic_vector(47 downto 0); -- rx_err/rx_en/rx_d(7:0)
113
constant MCAST_ADDRESSLIST : mctable := (
114
  X"887654332211",      -- LSB=1 is Multicast address!
115
  X"886644352611",      -- LSB=1 is Multicast address!
116
  X"ABCDEF012313",
117
  X"92456545ab15",
118
  X"432680010217",
119
  X"adb589215439",
120
  X"ffeacfe3434B",
121
  X"ffccddaa3123",
122
  X"adb358415439");
123
 
124
 
125
-- Core Settings
126
-- WARNING: DO NOT MODIFY THESE PARAMETERS
127
-- ------------------
128
        constant ENABLE_MAGIC_DETECT    : INTEGER       := 1;
129
        constant ENABLE_MDIO    : INTEGER       := 1;
130
        constant ENABLE_SHIFT16 : INTEGER       := 0;
131
        constant ENABLE_SUP_ADDR        : INTEGER       := 0;
132
        constant CORE_VERSION   : STD_LOGIC_VECTOR      := X"0800";
133
        constant CRC32GENDELAY  : INTEGER       := 6;
134
        constant MDIO_CLK_DIV   : INTEGER       := 40;
135
        constant ENA_HASH       : INTEGER       := 0;
136
        constant USE_SYNC_RESET : INTEGER       := 0;
137
        constant STAT_CNT_ENA   : INTEGER       := 1;
138
        constant ENABLE_HD_LOGIC        : INTEGER       := 1;
139
        constant REDUCED_INTERFACE_ENA  : INTEGER       := 1;
140
        constant CRC32S1L2_EXTERN       : INTEGER       := 0;
141
        constant ENABLE_GMII_LOOPBACK   : INTEGER       := 1;
142
        constant CRC32DWIDTH    : INTEGER       := 8;
143
        constant CUST_VERSION   : INTEGER       := 0;
144
        constant RESET_LEVEL    : INTEGER       := 1;
145
        constant CRC32CHECK16BIT        : INTEGER       := 0;
146
        constant ENABLE_MAC_FLOW_CTRL   : INTEGER       := 1;
147
        constant ENABLE_MAC_TXADDR_SET  : INTEGER       := 1;
148
        constant ENABLE_MAC_RX_VLAN     : INTEGER       := 0;
149
        constant ENABLE_MAC_TX_VLAN     : INTEGER       := 0;
150
        constant EG_FIFO        : INTEGER       := 2048;
151
        constant EG_ADDR        : INTEGER       := 11;
152
        constant ING_FIFO       : INTEGER       := 2048;
153
        constant ENABLE_ENA     : INTEGER       := 32;
154
        constant ING_ADDR       : INTEGER       := 11;
155
        constant RAM_TYPE       : STRING        := "AUTO";
156
        constant INSERT_TA      : INTEGER       := 0;
157
        constant ENABLE_MACLITE : INTEGER       := 0;
158
        constant MACLITE_GIGE   : INTEGER       := 0;
159
 
160
        constant MAX_CHANNELS   : INTEGER       := 0;
161
 
162
 
163
 
164
end tb ;
165
 
166
 
167
 
168
architecture a of tb is
169
 
170
 
171
-- ------------------
172
-- ------------------
173
-- COMPONENTS
174
-- ------------------
175
-- ------------------
176
 
177
         component esoc_port_mac
178
        port (
179
          ff_tx_crc_fwd : in STD_LOGIC;
180
          ff_tx_data : in STD_LOGIC_VECTOR(31 downto 0);
181
          ff_tx_eop : in STD_LOGIC;
182
          ff_tx_err : in STD_LOGIC;
183
          ff_tx_mod : in STD_LOGIC_VECTOR(1 downto 0);
184
          ff_tx_rdy : out STD_LOGIC;
185
          ff_tx_sop : in STD_LOGIC;
186
          ff_tx_wren : in STD_LOGIC;
187
          ff_tx_clk : in STD_LOGIC;
188
          ff_rx_data : out STD_LOGIC_VECTOR(31 downto 0);
189
          ff_rx_dval : out STD_LOGIC;
190
          ff_rx_eop : out STD_LOGIC;
191
          ff_rx_mod : out STD_LOGIC_VECTOR(1 downto 0);
192
          ff_rx_rdy : in STD_LOGIC;
193
          ff_rx_sop : out STD_LOGIC;
194
          rx_err : out STD_LOGIC_VECTOR(5 downto 0);
195
          rx_err_stat : out STD_LOGIC_VECTOR(17 downto 0);
196
          rx_frm_type : out STD_LOGIC_VECTOR(3 downto 0);
197
          ff_rx_dsav : out STD_LOGIC;
198
          ff_rx_clk : in STD_LOGIC;
199
          address : in STD_LOGIC_VECTOR(7 downto 0);
200
          readdata : out STD_LOGIC_VECTOR(31 downto 0);
201
          read : in STD_LOGIC;
202
          writedata : in STD_LOGIC_VECTOR(31 downto 0);
203
          write : in STD_LOGIC;
204
          waitrequest : out STD_LOGIC;
205
          clk : in STD_LOGIC;
206
          reset : in STD_LOGIC;
207
          rgmii_in : in STD_LOGIC_VECTOR(3 downto 0);
208
          rgmii_out : out STD_LOGIC_VECTOR(3 downto 0);
209
          rx_control : in STD_LOGIC;
210
          tx_control : out STD_LOGIC;
211
          tx_clk : in STD_LOGIC;
212
          rx_clk : in STD_LOGIC;
213
          set_10 : in STD_LOGIC;
214
          set_1000 : in STD_LOGIC;
215
          ena_10 : out STD_LOGIC;
216
          eth_mode : out STD_LOGIC;
217
          ff_tx_septy : out STD_LOGIC;
218
          tx_ff_uflow : out STD_LOGIC;
219
          ff_rx_a_full : out STD_LOGIC;
220
          ff_rx_a_empty : out STD_LOGIC;
221
          ff_tx_a_full : out STD_LOGIC;
222
          ff_tx_a_empty : out STD_LOGIC;
223
          xon_gen : in STD_LOGIC;
224
          xoff_gen : in STD_LOGIC;
225
          magic_wakeup : out STD_LOGIC;
226
          magic_sleep_n : in STD_LOGIC;
227
          mdio_out : out STD_LOGIC;
228
          mdio_oen : out STD_LOGIC;
229
          mdio_in : in STD_LOGIC;
230
          mdc : out STD_LOGIC
231
        );
232
         end component ;
233
 
234
 
235
 
236
        component ethgenerator2
237
            generic (
238
                    THOLD  : time := 1 ns);
239
            port (
240
 
241
                    reset           : in std_logic ;                        -- active high
242
                    rx_clk          : in std_logic ;
243
                    rxd             : out std_logic_vector(7 downto 0);
244
                    rx_dv           : out std_logic;
245
                    rx_er           : out std_logic;
246
                    sop             : out std_logic;                        -- pulse with first character
247
                    eop             : out std_logic;                        -- pulse with last  character
248
                    ethernet_speed  : in std_logic;
249
                    mii_mode        : in std_logic;                         -- 4-bit Nibbles (Fast Ethernet)
250
                    rgmii_mode      : in std_logic;                         -- 4-bit DDR (Reduced Gigabit)     
251
                    mac_reverse     : in std_logic;                         -- 1: dst/src are sent MSB first
252
                    dst             : in std_logic_vector(47 downto 0);     -- destination address
253
                    src             : in std_logic_vector(47 downto 0);     -- source address
254
                    prmble_len      : in integer range 0 to 15;             -- length of preamble
255
                    pquant          : in std_logic_vector(15 downto 0);     -- Pause Quanta value
256
                    vlan_ctl        : in std_logic_vector(15 downto 0);     -- VLAN control info
257
                    len             : in std_logic_vector(15 downto 0);     -- Length of payload
258
                    frmtype         : in std_logic_vector(15 downto 0);     -- if non-null: type field instead length
259
                    cntstart        : in integer range 0 to 255;            -- payload data counter start (first byte of payload)
260
                    cntstep         : in integer range 0 to 255;            -- payload counter step (2nd byte in paylaod)
261
                    ipg_len         : in integer range 0 to 32768;          -- inter packet gap (delay after CRC)         
262
                    payload_err     : in std_logic;                         -- generate payload pattern error (last payload byte is wrong)
263
                    prmbl_err       : in std_logic;
264
                    crc_err         : in std_logic;
265
                    vlan_en         : in std_logic;
266
                    stack_vlan      : in std_logic;
267
                    pause_gen       : in std_logic;
268
                    wrong_pause_op  : in std_logic ;                        -- Generate Pause Frame with Wrong Opcode       
269
                    wrong_pause_lgth: in std_logic ;                        -- Generate Pause Frame with Wrong Opcode       
270
                    pad_en          : in std_logic;
271
                    phy_err         : in std_logic;
272
                    end_err         : in std_logic;                         -- keep rx_dv high one cycle after end of frame                
273
                    magic           : in std_logic;
274
                    data_only       : in std_logic;                         -- if set omits preamble, padding, CRC            
275
                    start           : in  std_logic;
276
                    done            : out std_logic );
277
        end component ;
278
 
279
 
280
        component ethgenerator
281
            generic (
282
                    THOLD  : time) ;
283
            port (
284
 
285
                    reset           : in std_logic ;                        -- active high
286
                    rx_clk          : in std_logic ;
287
                    enable          : in std_logic ;
288
                    rxd             : out std_logic_vector(7 downto 0);
289
                    rx_dv           : out std_logic;
290
                    rx_er           : out std_logic;
291
                    sop             : out std_logic;                        -- pulse with first character
292
                    eop             : out std_logic;                        -- pulse with last  character
293
                    mac_reverse     : in std_logic;                         -- 1: dst/src are sent MSB first
294
                    dst             : in std_logic_vector(47 downto 0);     -- destination address
295
                    src             : in std_logic_vector(47 downto 0);     -- source address     
296
                    prmble_len      : in integer range 0 to 15;             -- length of preamble
297
                    pquant          : in std_logic_vector(15 downto 0);     -- Pause Quanta value
298
                    vlan_ctl        : in std_logic_vector(15 downto 0);     -- VLAN control info
299
                    len             : in std_logic_vector(15 downto 0);     -- Length of payload
300
                    frmtype         : in std_logic_vector(15 downto 0);     -- if non-null: type field instead length      
301
                    cntstart        : in integer range 0 to 255;            -- payload data counter start (first byte of payload)
302
                    cntstep         : in integer range 0 to 255;            -- payload counter step (2nd byte in paylaod)
303
                    ipg_len         : in integer range 0 to 32768;          -- inter packet gap (delay after CRC)         
304
                    payload_err     : in std_logic;                         -- generate payload pattern error (last payload byte is wrong)
305
                    prmbl_err       : in std_logic;
306
                    crc_err         : in std_logic;
307
                    vlan_en         : in std_logic;
308
                    stack_vlan      : in std_logic;
309
                    pause_gen       : in std_logic;
310
                    wrong_pause_op  : in std_logic ;                        -- Generate Pause Frame with Wrong Opcode       
311
                    wrong_pause_lgth: in std_logic ;                        -- Generate Pause Frame with Wrong Opcode       
312
                    pad_en          : in std_logic;
313
                    phy_err         : in std_logic;
314
                    end_err         : in std_logic;                         -- keep rx_dv high one cycle after end of frame
315
                    magic           : in std_logic;
316
                    data_only       : in std_logic;                         -- if set omits preamble, padding, CRC            
317
                    start           : in  std_logic;
318
                    done            : out std_logic );
319
        end component ;
320
 
321
 
322
        component ethgenerator32
323
            generic (
324
                    ENABLE_SHIFT16      : INTEGER := 0;
325
                    THOLD               : time;
326
                    ZERO_LATENCY        : INTEGER := 0);
327
            port (
328
 
329
                    reset           : in std_logic ;                        -- active high
330
                    clk             : in std_logic ;
331
                    enable          : in std_logic;
332
                    dout            : out std_logic_vector(31 downto 0);
333
                    dval            : out std_logic;
334
                    derror          : out std_logic;
335
                    sop             : out std_logic;                        -- pulse with first word
336
                    eop             : out std_logic;                        -- pulse with last word (tmod valid)
337
                    tmod            : out std_logic_vector(1 downto 0);     -- last word modulo
338
                    mac_reverse     : in std_logic;                         -- 1: dst/src are sent MSB first (non-standard)
339
                    dst             : in std_logic_vector(47 downto 0);     -- destination address
340
                    src             : in std_logic_vector(47 downto 0);     -- source address
341
                    prmble_len      : in integer range 0 to 15;             -- length of preamble
342
                    pquant          : in std_logic_vector(15 downto 0);     -- Pause Quanta value
343
                    vlan_ctl        : in std_logic_vector(15 downto 0);     -- VLAN control info
344
                    len             : in std_logic_vector(15 downto 0);     -- Length of payload
345
                    frmtype         : in std_logic_vector(15 downto 0);     -- if non-null: type field instead length      
346
                    cntstart        : in integer range 0 to 255;            -- payload data counter start (first byte of payload)
347
                    cntstep         : in integer range 0 to 255;            -- payload counter step (2nd byte in paylaod)
348
                    ipg_len         : in integer range 0 to 32768;
349
                    payload_err     : in std_logic;                         -- generate payload pattern error (last payload byte is wrong)
350
                    prmbl_err       : in std_logic;                         -- Send corrupt SFD in otherwise correct preamble
351
                    crc_err         : in std_logic;
352
                    vlan_en         : in std_logic;
353
                    stack_vlan      : in std_logic;
354
                    pause_gen       : in std_logic;
355
                    pad_en          : in std_logic;
356
                    phy_err         : in std_logic;                         -- Generate the well known ERROR control character
357
                    end_err         : in std_logic;                         -- Send corrupt TERMINATE character (wrong code)               
358
                    data_only       : in std_logic;                         -- if set omits preamble, padding, CRC
359
                    start           : in  std_logic;
360
                    done            : out std_logic );
361
        end component ;
362
 
363
 
364
 
365
        component ethmonitor2
366
            port (
367
                reset           : in std_logic ;
368
                tx_clk          : in std_logic ;
369
                txd             : in std_logic_vector(7 downto 0);
370
                tx_dv           : in std_logic;
371
                tx_er           : in std_logic;
372
                tx_sop          : in std_logic;
373
                tx_eop          : in std_logic;
374
                ethernet_speed  : in std_logic;
375
                mii_mode        : in std_logic;                         -- 4-bit Nibbles (Fast Ethernet)
376
                rgmii_mode      : in std_logic;                         -- 4-bit DDR (Reduced Gigabit)
377
                dst             : out std_logic_vector(47 downto 0);    -- destination address
378
                src             : out std_logic_vector(47 downto 0);    -- source address
379
                prmble_len      : out integer range 0 to 10000;         -- length of preamble
380
                pquant          : out std_logic_vector(15 downto 0);    -- Pause Quanta value
381
                vlan_ctl        : out std_logic_vector(15 downto 0);    -- VLAN control info
382
                len             : out std_logic_vector(15 downto 0);    -- Length of payload
383
                frmtype         : out std_logic_vector(15 downto 0);    -- if non-null: type field instead length
384
                payload         : out std_logic_vector(7 downto 0);
385
                payload_vld     : out std_logic;
386
                is_vlan         : out std_logic;
387
                is_stack_vlan   : out std_logic;
388
                is_pause        : out std_logic;
389
                crc_err         : out std_logic;
390
                prmbl_err       : out std_logic;
391
                len_err         : out std_logic;
392
                payload_err     : out std_logic;
393
                frame_err       : out std_logic;
394
                pause_op_err    : out std_logic;
395
                pause_dst_err   : out std_logic;
396
                mac_err         : out std_logic;
397
                end_err         : out std_logic;
398
                jumbo_en        : in std_logic;
399
                data_only       : in std_logic;
400
                frm_rcvd        : out std_logic );
401
        end component ;
402
 
403
 
404
        component ethmonitor
405
         generic (  ENABLE_SHIFT16 : integer := 0  --0 for false, 1 for true
406
               );
407
 
408
         port (
409
 
410
                reset         : in std_logic ;     -- active high
411
                tx_clk        : in std_logic ;
412
                txd           : in std_logic_vector(7 downto 0);
413
                tx_dv         : in std_logic;
414
                tx_er         : in std_logic;
415
                tx_sop        : in std_logic;
416
                tx_eop        : in std_logic;
417
                dst           : out std_logic_vector(47 downto 0); -- destination address
418
                src           : out std_logic_vector(47 downto 0); -- source address
419
                prmble_len    : out integer range 0 to 10000;         -- length of preamble
420
                pquant        : out std_logic_vector(15 downto 0); -- Pause Quanta value
421
                vlan_ctl      : out std_logic_vector(15 downto 0); -- VLAN control info
422
                len           : out std_logic_vector(15 downto 0); -- Length of payload
423
                frmtype       : out std_logic_vector(15 downto 0); -- if non-null: type field instead length
424
                payload       : out std_logic_vector(7 downto 0);
425
                payload_vld   : out std_logic;
426
                is_vlan       : out std_logic;
427
                is_stack_vlan : out std_logic;
428
                is_pause      : out std_logic;
429
                crc_err       : out std_logic;
430
                prmbl_err     : out std_logic;
431
                len_err       : out std_logic;
432
                payload_err   : out std_logic;
433
                frame_err     : out std_logic;
434
                pause_op_err  : out std_logic;
435
                pause_dst_err : out std_logic;
436
                mac_err       : out std_logic;
437
                end_err       : out std_logic;  -- dv stayed asserted after CRC       
438
                jumbo_en      : in std_logic;
439
                data_only     : in std_logic;
440
                frm_rcvd      : out std_logic );
441
 
442
        end component ;
443
 
444
 
445
        component top_ethmonitor32 is
446
         generic(
447
                 ENABLE_SHIFT16     : INTEGER := 0 );
448
         port (
449
                reset           : in std_logic ;                        -- active high
450
                clk             : in std_logic;
451
                din             : in std_logic_vector(31 downto 0);
452
                dval            : in std_logic;
453
                derror          : in std_logic;
454
                sop             : in std_logic;                         -- pulse with first word
455
                eop             : in std_logic;                         -- pulse with last word (tmod valid)
456
                tmod            : in std_logic_vector(1 downto 0);      -- last word modulo
457
                dst             : out std_logic_vector(47 downto 0);    -- destination address
458
                src             : out std_logic_vector(47 downto 0);    -- source address     
459
                prmble_len      : out integer range 0 to 10000;         -- length of preamble
460
                pquant          : out std_logic_vector(15 downto 0);    -- Pause Quanta value
461
                vlan_ctl        : out std_logic_vector(15 downto 0);    -- VLAN control info
462
                len             : out std_logic_vector(15 downto 0);    -- Length of payload
463
                frmtype         : out std_logic_vector(15 downto 0);    -- if non-null: type field instead length      
464
                payload         : out std_logic_vector(7 downto 0);
465
                payload_vld     : out std_logic;
466
                is_vlan         : out std_logic;
467
                is_stack_vlan   : out std_logic;
468
                is_pause        : out std_logic;
469
                crc_err         : out std_logic;
470
                prmbl_err       : out std_logic;
471
                len_err         : out std_logic;
472
                payload_err     : out std_logic;
473
                frame_err       : out std_logic;
474
                pause_op_err    : out std_logic;
475
                pause_dst_err   : out std_logic;
476
                mac_err         : out std_logic;
477
                end_err         : out std_logic;
478
                jumbo_en        : in std_logic;
479
                data_only       : in std_logic;
480
                frm_rcvd        : out std_logic );
481
        end component ;
482
 
483
 
484
        component top_mdio_slave is port (
485
 
486
                reset           : in std_logic ;
487
                mdc             : in std_logic ;
488
                mdio            : inout std_logic ;
489
                dev_addr        : in std_logic_vector(4 downto 0) ;
490
                conf_done       : out std_logic) ;
491
 
492
        end component ;
493
 
494
 
495
 
496
 
497
-- ------------------
498
-- ------------------
499
-- INTERCONNECTS
500
-- ------------------
501
-- ------------------
502
 
503
 
504
   -- Reset Signals
505
   -- -------------
506
 
507
        signal reset                    : std_logic ;
508
 
509
 
510
   -- Interface Control
511
   -- -----------------
512
 
513
        signal ether_mod                : std_logic ;                           -- Ethernet Mode
514
        signal ena_10                   : std_logic ;                           -- Enable 10Mbps Mode
515
        signal set_1000                 : std_logic ;                           -- Ethernet Mode Set
516
        signal set_10                   : std_logic ;                           -- Ethernet Mode Set
517
 
518
   -- FIFO and Magic Detection Status Signals
519
   -- ---------------------------------------
520
 
521
        signal magic_wakeup             : std_logic ;                           -- magic detection wakeup status
522
        signal ff_rx_a_full             : std_logic ;                           -- receive fifo almost full
523
        signal ff_rx_a_empty            : std_logic ;                           -- receive fifo almost empty
524
        signal ff_tx_a_full             : std_logic ;                           -- transmit fifo almost full
525
        signal ff_tx_a_empty            : std_logic ;                           -- transmit fifo almost empty
526
 
527
 
528
  --  RGMII Interface
529
  --  --------------
530
        signal rgmii_in                 : std_logic_vector(3 downto 0);
531
        signal rgmii_out                : std_logic_vector(3 downto 0);
532
        signal rx_control               : std_logic;
533
        signal tx_control               : std_logic;
534
 
535
  --  Atlantic II Interface
536
  --  --------------
537
        signal   rx_err                 : std_logic_vector(5 downto 0);
538
        signal   rx_err_stat            : std_logic_vector(17 downto 0);
539
        signal   rx_frm_type            : std_logic_vector(3 downto 0);
540
 
541
 
542
   -- MDIO Interface
543
   -- --------------
544
 
545
        signal mdc                      : std_logic;                            -- 2.5MHz Inteface
546
        signal mdio_in                  : std_logic;                            -- MDIO Input
547
        signal mdio_out                 : std_logic;                            -- MDIO Output
548
        signal mdio_oen                 : std_logic;                            -- MDIO Output Enable
549
        signal mdio                     : std_logic;                            -- MDIO
550
        signal phy_addr0                : std_logic_vector(4 downto 0) ;        -- PHY 0 Address
551
        signal phy_addr1                : std_logic_vector(4 downto 0) ;        -- PHY 1 Address
552
        signal mdio0_done               : std_logic ;                           -- Slave MDIO 0 Access Done
553
        signal mdio1_done               : std_logic ;                           -- Slave MDIO 1 Access Done
554
 
555
 
556
   -- Receive RGMII Interface
557
   -- ----------------------
558
 
559
        signal rgmii_rx_data            : std_logic_vector(3 downto 0) ;        -- GMII Receive data        
560
        signal rgmii_rx_ctnl            : std_logic ;                           -- GMII Receive frame enable
561
 
562
   -- Transmit RGMII Interface
563
   -- -----------------------
564
 
565
        signal rgmii_tx_data            : std_logic_vector(3 downto 0) ;         -- GMII Transmit data        
566
        signal rgmii_tx_ctnl            : std_logic ;                          -- GMII Transmit frame enable
567
 
568
   -- Receive GMII Interface
569
   -- ----------------------
570
 
571
        signal rx_clk                   : std_logic ;                           -- GMII Receive clock    
572
        signal rx_clk_tb                : std_logic ;
573
        signal rx_clk_10                : std_logic ;
574
        signal rx_clk_100               : std_logic ;
575
        signal rx_clk_1000              : std_logic ;
576
        signal gm_rx_data               : std_logic_vector(7 downto 0) ;        -- GMII Receive data        
577
        signal gm_rx_en                 : std_logic ;                           -- GMII Receive frame enable
578
        signal gm_rx_err                : std_logic ;                           -- GMII Receive frame error 
579
 
580
   -- Transmit GMII Interface
581
   -- -----------------------
582
 
583
        signal tx_clk                   : std_logic ;                           -- GMII Transmit clock       
584
        signal tx_clk_10                : std_logic ;
585
        signal tx_clk_100               : std_logic ;
586
        signal tx_clk_1000              : std_logic ;
587
        signal ref_clk                  : std_logic;                            -- 125MHz Reference Clock         
588
        signal ref_clk_10               : std_logic;                            -- 125MHz Reference Clock   
589
        signal ref_clk_100              : std_logic;                            -- 125MHz Reference Clock 
590
        signal ref_clk_1000             : std_logic;                            -- 125MHz Reference Clock                     
591
        signal gm_tx_data               : std_logic_vector(7 downto 0) ;        -- GMII Transmit data        
592
        signal gm_tx_en                 : std_logic ;                           -- GMII Transmit frame enable
593
        signal gm_tx_err                : std_logic ;                           -- GMII Transmit frame error
594
 
595
   -- Receive MII Interface
596
   -- ---------------------
597
 
598
        signal m_rx_data                : std_logic_vector(3 downto 0) ;        -- MII Receive data        
599
        signal m_rx_en                  : std_logic ;                           -- MII Receive frame enable
600
        signal m_rx_err                 : std_logic ;                           -- MII Receive frame error 
601
        signal m_rx_crs                 : std_logic;                            -- MII Carrier Sense
602
        signal m_rx_crs_fd              : std_logic;                            -- MII Carrier Sense
603
        signal m_rx_col                 : std_logic;                            -- MII Collision 
604
        signal m_rx_col_fd              : std_logic;                            -- MII Collision 
605
 
606
   -- Transmit MII Interface
607
   -- ----------------------
608
 
609
        signal m_tx_data                : std_logic_vector(3 downto 0) ;        -- MII Transmit data        
610
        signal m_tx_data_tmp            : std_logic_vector(7 downto 0) ;        -- MII Transmit data        
611
        signal m_tx_en                  : std_logic ;                           -- MII Transmit frame enable
612
        signal m_tx_err                 : std_logic ;                           -- MII Transmit frame error
613
 
614
   -- Receive User Interface
615
   -- ---------------------     
616
 
617
        signal ff_rx_clk                : std_logic ;                           -- Transmit Local Clock
618
        signal ff_rx_data               : std_logic_vector(31 downto 0) ;       -- Data Out
619
        signal ff_rx_mod                : std_logic_vector(1 downto 0) ;        -- Data Modulo
620
        signal ff_rx_sop                : std_logic ;                           -- Start of Packet
621
        signal ff_rx_eop                : std_logic ;                           -- End of Packet
622
        signal ff_rx_err                : std_logic ;                           -- Errored Packet Indication (Parity, POS-PHY Errored or Oversized Packet)
623
        signal ff_rx_err_stat           : std_logic_vector(22 downto 0) ;   -- Errored Packet Status Word
624
        signal ff_rx_rdy                : std_logic ;                           -- PHY Application Ready
625
        signal ff_rx_dval               : std_logic ;                           -- Data Valid Strobe
626
        signal ff_rx_dsav               : std_logic ;                           -- Data Available
627
        signal ff_rx_ucast              : std_logic;                            -- Unicast Frame Indication
628
        signal ff_rx_bcast              : std_logic;                            -- Broadcast Frame Indication
629
        signal ff_rx_mcast              : std_logic;                            -- Multicast Frame Indication
630
        signal ff_rx_vlan               : std_logic;                            -- VLAN Frame Indication
631
        signal ff_rx_ucast_reg          : std_logic;                            -- Unicast Frame Indication
632
        signal ff_rx_bcast_reg          : std_logic;                            -- Broadcast Frame Indication
633
        signal ff_rx_mcast_reg          : std_logic;                            -- Multicast Frame Indication
634
        signal ff_rx_vlan_reg           : std_logic;                            -- VLAN Frame Indication
635
        signal ff_rx_ucast_reg2         : std_logic;                            -- Unicast Frame Indication
636
        signal ff_rx_bcast_reg2         : std_logic;                            -- Broadcast Frame Indication
637
        signal ff_rx_mcast_reg2         : std_logic;                            -- Multicast Frame Indication
638
        signal ff_rx_vlan_reg2          : std_logic;                            -- VLAN Frame Indication
639
 
640
   -- Transmit User Interface
641
   -- -----------------------   
642
 
643
        signal ff_tx_clk                : std_logic ;                           -- Transmit Local Clock 
644
        signal ff_tx_data               : std_logic_vector(31 downto 0) ;   -- Data Out
645
        signal ff_tx_mod                : std_logic_vector(1 downto 0) ;    -- Data Modulo
646
        signal ff_tx_sop                : std_logic ;                           -- Start of Packet
647
        signal ff_tx_eop                : std_logic ;                           -- End of Packet
648
        signal ff_tx_err                : std_logic ;                           -- Errored Packet
649
        signal ff_tx_wren               : std_logic ;                           -- Write Enable
650
        signal ff_tx_crc_fwd            : std_logic ;                           -- Forward Frame with CRC from Application
651
        signal ff_tx_rdy                : std_logic ;                           -- FIFO Ready           
652
        signal ff_tx_septy              : std_logic ;                           -- FIFO section empty
653
        signal tx_ff_uflow              : std_logic;                            -- TX FIFO underflow occured (Synchronous with tx_clk)        
654
 
655
   -- Multicast Address Resolution Hash Look up Table Interface
656
   -- ---------------------------------------------------------
657
 
658
        signal sim_stop                 : std_logic ;                           -- End of Simulation
659
 
660
   -- Ethernet MAC Configuration
661
   -- --------------------------
662
 
663
        signal xoff_gen                 : std_logic;                            -- Xoff Pause frame generate 
664
        signal xon_gen                  : std_logic;                            -- Xon Pause frame generate         
665
        signal mac_addr                 : std_logic_vector(47 downto 0);        -- Device Ethernet MAC address
666
        signal sup_mac_addr_0           : std_logic_vector(47 downto 0);        -- Supplemental Ethernet MAC address
667
        signal sup_mac_addr_1           : std_logic_vector(47 downto 0);        -- Supplemental Ethernet MAC address
668
        signal sup_mac_addr_2           : std_logic_vector(47 downto 0);        -- Supplemental Ethernet MAC address
669
        signal sup_mac_addr_3           : std_logic_vector(47 downto 0);        -- Supplemental Ethernet MAC address
670
        signal promis_en                : std_logic;                            -- Enable promiscuous mode: accept any frame
671
        signal frm_length_max           : std_logic_vector(13 downto 0);        -- Maximium Received Frame length          
672
        signal ethernet_mode            : std_logic;                            -- Ethernet Mode (1 for Gigabit)
673
 
674
   -- Event Triggers
675
   -- --------------
676
 
677
        signal pause_rcv                : std_logic;                            -- Pause Frame Receive Indication
678
        signal frm_rcv                  : std_logic;                            -- Frame Receive Indication
679
        signal frm_tx                   : std_logic;                            -- Frame Transmit Indication
680
        signal frm_align_err            : std_logic;                            -- Received Frame Aligment Error Indication
681
        signal frm_type_err             : std_logic;                            -- Received Frame type Error Indication
682
        signal frm_length_err           : std_logic;                            -- Received Frame length Error Indication
683
        signal frm_crc_err              : std_logic;                            -- Received Frame CRC_32 Error Indication
684
 
685
   -- Ethernet Generator Config (GMII RX)
686
   -- -----------------------------------
687
 
688
        signal gm_rxgen_rx_d            : std_logic_vector(7 downto 0);         -- gmii receive data
689
        signal gm_rxgen_rx_en           : std_logic;                            -- gmii receive frame enable  
690
        signal gm_rxgen_rx_err          : std_logic;                            -- gmii receive frame error     
691
        signal m_rxgen_rx_d             : std_logic_vector(7 downto 0);         -- mii receive data
692
        signal m_rxgen_rx_en            : std_logic;                            -- mii receive frame enable  
693
        signal m_rxgen_rx_err           : std_logic;                            -- mii receive frame error                     
694
        signal gm_mac_reverse           : std_logic;                            -- 1: dst/src are sent MSB first
695
        signal gm_dst                   : std_logic_vector(47 downto 0);        -- destination address
696
        signal gm_src                   : std_logic_vector(47 downto 0);        -- source address     
697
        signal gm_prmble_len            : integer range 0 to 15;                -- length of preamble
698
        signal gm_pquant                : std_logic_vector(15 downto 0);        -- Pause Quanta value
699
        signal gm_vlan_ctl              : std_logic_vector(15 downto 0);        -- VLAN control info
700
        signal gm_len                   : std_logic_vector(15 downto 0);        -- Length of payload
701
        signal gm_frmtype               : std_logic_vector(15 downto 0);        -- if non-null: type field instead length      
702
        signal gm_cntstart              : integer range 0 to 255;               -- payload data counter start (first byte of payload)
703
        signal gm_cntstep               : integer range 0 to 255;               -- payload counter step (2nd byte in paylaod)
704
        signal gm_ipg_cnt               : integer range 0 to 32768;             -- inter-packet gap
705
        signal gm_payload_err           : std_logic;                            -- generate payload pattern error (last payload byte is wrong)
706
        signal gm_prmbl_err             : std_logic;
707
        signal gm_crc_err               : std_logic;
708
        signal gm_pause_gen             : std_logic;
709
        signal gm_vlan_en               : std_logic;
710
        signal gm_stack_vlan_en         : std_logic;
711
        signal gm_pad_en                : std_logic;
712
        signal gm_phy_err               : std_logic;
713
        signal gm_end_err               : std_logic;                            -- keep rx_dv high one cycle after end of frame
714
        signal gm_magic                 : std_logic;
715
 
716
   -- FIFO Generator Config (user app FIFO TX)
717
   -- ----------------------------------------
718
 
719
        signal ff_mac_reverse           : std_logic;                            -- 1: dst/src are sent MSB first
720
        signal ff_dst                   : std_logic_vector(47 downto 0);        -- destination address
721
        signal ff_src                   : std_logic_vector(47 downto 0);        -- source address     
722
        signal ff_prmble_len            : integer range 0 to 15;                -- length of preamble
723
        signal ff_pquant                : std_logic_vector(15 downto 0);        -- Pause Quanta value
724
        signal ff_vlan_ctl              : std_logic_vector(15 downto 0);        -- VLAN control info
725
        signal ff_len                   : std_logic_vector(15 downto 0);        -- Length of payload
726
        signal ff_frmtype               : std_logic_vector(15 downto 0);        -- if non-null: type field instead length      
727
        signal ff_cntstart              : integer range 0 to 255;               -- payload data counter start (first byte of payload)
728
        signal ff_cntstep               : integer range 0 to 255;               -- payload counter step (2nd byte in paylaod)
729
        signal ff_ipg_len               : integer range 0 to 32768;             -- inter packet gap (delay after CRC)         
730
        signal ff_payload_err           : std_logic;                            -- generate payload pattern error (last payload byte is wrong)
731
        signal ff_prmbl_err             : std_logic;
732
        signal ff_crc_err               : std_logic;
733
        signal ff_vlan_en               : std_logic;
734
        signal ff_stack_vlan_en         : std_logic;
735
        signal ff_pad_en                : std_logic;
736
        signal ff_phy_err               : std_logic;
737
        signal ff_end_err               : std_logic;                            -- keep rx_dv high one cycle after end of frame
738
 
739
   -- Register Interface
740
   -- ------------------
741
 
742
        signal reg_clk                  : std_logic ;                           -- 25MHz Host Interface Clock
743
        signal reg_rd                   : std_logic ;               -- Register Read Strobe
744
        signal reg_wr                   : std_logic ;               -- Register Write Strobe
745
        signal reg_addr                 : std_logic_vector(7 downto 0) ;        -- Register Address
746
        signal reg_data_in              : std_logic_vector(31 downto 0) ;   -- Write Data for Host Bus
747
        signal reg_data_out             : std_logic_vector(31 downto 0) ;   -- Read Data to Host Bus
748
        signal reg_busy                 : std_logic ;                           -- Interface Busy
749
        signal magic_sleep_n            : std_logic ;                           -- Enable Sleep Mode
750
        signal reg_wakeup               : std_logic ;                           -- Wake Up Request
751
 
752
   -- Ethernet TX Monitor
753
   -- -------------------
754
 
755
        signal  mgm_dst                 :  std_logic_vector(47 downto 0);       -- destination address
756
        signal  mgm_src                 :  std_logic_vector(47 downto 0);       -- source address
757
        signal  mgm_prmble_len          :  integer range 0 to 10000;            -- length of preamble
758
        signal  mgm_pquant              :  std_logic_vector(15 downto 0);       -- Pause Quanta value
759
        signal  mgm_vlan_ctl            :  std_logic_vector(15 downto 0);       -- VLAN control info
760
        signal  mgm_len                 :  std_logic_vector(15 downto 0);       -- Length of payload
761
        signal  mgm_frmtype             :  std_logic_vector(15 downto 0);       -- if non-null: type field instead length
762
        signal  mgm_payload             :  std_logic_vector(7 downto 0);
763
        signal  mgm_payload_vld         :  std_logic;
764
        signal  mgm_is_vlan             :  std_logic;
765
        signal  mgm_is_stack_vlan       :  std_logic;
766
        signal  mgm_is_pause            :  std_logic;
767
        signal  mgm_crc_err             :  std_logic;
768
        signal  mgm_prmbl_err           :  std_logic;
769
        signal  mgm_pad_err             :  std_logic;
770
        signal  mgm_len_err             :  std_logic;
771
        signal  mgm_payload_err         :  std_logic;
772
        signal  mgm_frame_err           :  std_logic;
773
        signal  mgm_pause_op_err        :  std_logic;
774
        signal  mgm_pause_dst_err       :  std_logic;
775
        signal  mgm_mac_err             :  std_logic;
776
        signal  mgm_end_err             :  std_logic;
777
        signal  mgm_frm_rcvd            :  std_logic;
778
 
779
   -- GMII Modintor
780
   -- -------------
781
 
782
        signal  gm_mgm_dst              :  std_logic_vector(47 downto 0);       -- destination address
783
        signal  gm_mgm_src              :  std_logic_vector(47 downto 0);       -- source address
784
        signal  gm_mgm_prmble_len       :  integer range 0 to 10000;            -- length of preamble
785
        signal  gm_mgm_pquant           :  std_logic_vector(15 downto 0);       -- Pause Quanta value
786
        signal  gm_mgm_vlan_ctl         :  std_logic_vector(15 downto 0);       -- VLAN control info
787
        signal  gm_mgm_len              :  std_logic_vector(15 downto 0);       -- Length of payload
788
        signal  gm_mgm_frmtype          :  std_logic_vector(15 downto 0);       -- if non-null: type field instead length
789
        signal  gm_mgm_payload          :  std_logic_vector(7 downto 0);
790
        signal  gm_mgm_payload_vld      :  std_logic;
791
        signal  gm_mgm_is_vlan          :  std_logic;
792
        signal  gm_mgm_is_stack_vlan    :  std_logic;
793
        signal  gm_mgm_is_pause         :  std_logic;
794
        signal  gm_mgm_crc_err          :  std_logic;
795
        signal  gm_mgm_prmbl_err        :  std_logic;
796
        signal  gm_mgm_pad_err          :  std_logic;
797
        signal  gm_mgm_len_err          :  std_logic;
798
        signal  gm_mgm_payload_err      :  std_logic;
799
        signal  gm_mgm_frame_err        :  std_logic;
800
        signal  gm_mgm_pause_op_err     :  std_logic;
801
        signal  gm_mgm_pause_dst_err    :  std_logic;
802
        signal  gm_mgm_mac_err          :  std_logic;
803
        signal  gm_mgm_end_err          :  std_logic;
804
        signal  gm_mgm_frm_rcvd         :  std_logic;                           -- if '1' all signals/indicators are valid        
805
 
806
   -- MII Monitor
807
   -- -----------
808
 
809
        signal  m_mgm_dst               :  std_logic_vector(47 downto 0);       -- destination address
810
        signal  m_mgm_src               :  std_logic_vector(47 downto 0);       -- source address
811
        signal  m_mgm_prmble_len        :  integer range 0 to 10000;            -- length of preamble
812
        signal  m_mgm_pquant            :  std_logic_vector(15 downto 0);       -- Pause Quanta value
813
        signal  m_mgm_vlan_ctl          :  std_logic_vector(15 downto 0);       -- VLAN control info
814
        signal  m_mgm_len               :  std_logic_vector(15 downto 0);       -- Length of payload
815
        signal  m_mgm_frmtype           :  std_logic_vector(15 downto 0);       -- if non-null: type field instead length
816
        signal  m_mgm_payload           :  std_logic_vector(7 downto 0);
817
        signal  m_mgm_payload_vld       :  std_logic;
818
        signal  m_mgm_is_vlan           :  std_logic;
819
        signal  m_mgm_is_stack_vlan     :  std_logic;
820
        signal  m_mgm_is_pause          :  std_logic;
821
        signal  m_mgm_crc_err           :  std_logic;
822
        signal  m_mgm_prmbl_err         :  std_logic;
823
        signal  m_mgm_pad_err           :  std_logic;
824
        signal  m_mgm_len_err           :  std_logic;
825
        signal  m_mgm_payload_err       :  std_logic;
826
        signal  m_mgm_frame_err         :  std_logic;
827
        signal  m_mgm_pause_op_err      :  std_logic;
828
        signal  m_mgm_pause_dst_err     :  std_logic;
829
        signal  m_mgm_mac_err           :  std_logic;
830
        signal  m_mgm_end_err           :  std_logic;
831
        signal  m_mgm_frm_rcvd          :  std_logic;                           -- if '1' all signals/indicators are valid         
832
 
833
   -- FIFO Monitor (Checking)
834
   -- ----------------------
835
 
836
        signal  mff_dst                 :  std_logic_vector(47 downto 0);       -- destination address
837
        signal  mff_dst_reg             :  std_logic_vector(47 downto 0);       -- destination address
838
        signal  mff_src                 :  std_logic_vector(47 downto 0);       -- source address
839
        signal  mff_prmble_len          :  integer range 0 to 10000;            -- length of preamble
840
        signal  mff_pquant              :  std_logic_vector(15 downto 0);       -- Pause Quanta value
841
        signal  mff_vlan_ctl            :  std_logic_vector(15 downto 0);       -- VLAN control info
842
        signal  mff_len                 :  std_logic_vector(15 downto 0);       -- Length of payload
843
        signal  mff_frmtype             :  std_logic_vector(15 downto 0);       -- if non-null: type field instead length
844
        signal  mff_payload             :  std_logic_vector(7 downto 0);
845
        signal  mff_payload_vld         :  std_logic;
846
        signal  mff_is_vlan             :  std_logic;
847
        signal  mff_is_stack_vlan       :  std_logic;
848
        signal  mff_is_pause            :  std_logic;
849
        signal  mff_is_pause_reg        :  std_logic;
850
        signal  mff_crc_err             :  std_logic;
851
        signal  mff_prmbl_err           :  std_logic;
852
        signal  mff_pad_err             :  std_logic;
853
        signal  mff_len_err             :  std_logic;
854
        signal  mff_payload_err         :  std_logic;
855
        signal  mff_frame_err           :  std_logic;
856
        signal  mff_pause_op_err        :  std_logic;
857
        signal  mff_pause_dst_err       :  std_logic;
858
        signal  mff_mac_err             :  std_logic;
859
        signal  mff_end_err             :  std_logic;
860
        signal  mff_end_err_reg         :  std_logic;
861
        signal  mff_frm_rcvd            :  std_logic;                           -- if '1' all signals/indicators are valid
862
        signal  ff_frmlen               :  integer;                             -- length of frame as it is coming from the FIFO
863
 
864
   -- Simulation Command Signals
865
   -- --------------------------
866
 
867
        signal gm_start_ether_gen       : std_logic ;           -- Enable Frame Generation
868
        signal m_start_ether_gen        : std_logic ;           -- Enable Frame Generation
869
        signal gm_ether_gen_done        : std_logic ;           -- Ethernet Generation Completed
870
        signal gm_gm_ether_gen_done     : std_logic ;           -- Ethernet Generation Completed
871
        signal m_gm_ether_gen_done      : std_logic ;           -- Ethernet Generation Completed
872
        signal ff_start_ether_gen       : std_logic ;           -- Enable Frame Generation
873
        signal ff_ether_gen_done        : std_logic ;           -- Ethernet Generation Completed
874
        signal jumbo_enable             : std_logic ;           -- depending on TB_MACLENMAX            
875
 
876
    -- Simulation Control
877
    -- ------------------
878
 
879
        signal sim_start                : std_logic;            -- when to start simulation
880
        signal delay_cnt                : integer := 0;         -- wait before start and after done until stop    
881
        signal hash_cnt                 : integer;              -- Hash table programming counter 
882
        signal multicast_cnt            : integer;              -- counter during setting of a multicast address
883
        signal multicast_wrong          : boolean := false;              -- true if we currently use a multicast address not from the table    
884
        signal promis_en_dly            : std_logic;
885
        signal stop_rx_fifo_read        : std_logic;            -- FIFO read should be stopped now
886
        signal ff_rx_rdy_dly            : std_logic;            -- delayed rx_rdy for message generation
887
        signal rx_hold_cnt              : integer  ;            -- timer counting cycles during fifo read stop
888
        signal rx_fifo_cnt              : integer  ;            -- incremented with each frame read from the FIFO
889
        signal tx_pause_wait            : std_logic;            -- Pause frame received. TX should stop
890
        signal tx_pause_cnt             : integer  ;            -- timer counting pause delay
891
 
892
        signal force_xoff_pause_cnt     : integer  ;            -- when to trigger a Xoff frame generation
893
        signal force_xon_pause_cnt      : integer  ;            -- when to trigger a Xon frame generation
894
 
895
   -- TX PATH simulation
896
   -- ------------------
897
 
898
        signal txframe_cnt              : integer := 0;         -- number of frames transmitted/generated
899
        signal txsim_done               : std_logic;            -- 1 when everything has finished
900
        signal ff_tx_clk_gen_en         : std_logic;            -- clock enable for TX FIFO generator    
901
        signal ff_tx_wren_gen           : std_logic;            -- write enable FIFO interface
902
 
903
        signal rgm_tx_data              : std_logic_vector(7 downto 0);
904
        signal rgm_tx_en                : std_logic;
905
        signal rgm_tx_err               : std_logic;
906
 
907
   -- TX: Verification information
908
   -- ----------------------------
909
 
910
        signal tx_good_sent             : integer;              -- valid frames sent which should be counted as good on receive
911
        signal tx_good_rcvd             : integer;              -- should be same as good_sent at end of test        
912
        signal tx_pause_rcvd            : integer;
913
        signal tx_pause_err_rcvd        : integer;              -- erroneous PAUSE frames
914
        signal tx_align_err_rcvd        : integer;              -- should NEVER happen
915
        signal gm_txcnt                 : integer;
916
        signal tx_vlan_sent             : integer;
917
        signal tx_stack_vlan_sent       : integer;
918
        signal tx_frm_all               : integer;
919
        signal tx_vlan_rcvd             : integer;              -- received by monitor
920
        signal tx_stack_vlan_rcvd       : integer;              -- received by monitor
921
        signal tx_vlan_wrong_type_sent  : integer;
922
        signal tx_phy_err_rcvd          : integer;              -- GMII tx error signal detected
923
        signal tx_crc_err_rcvd          : integer;
924
        signal tx_payload_err_sent      : integer;
925
        signal tx_payload_err_rcvd      : integer;
926
 
927
        signal tx_wrong_src_rcvd        : integer;              -- Wrong MAC SOURCE address received by monitor
928
 
929
   -- RX PATH simulation
930
   -- ------------------
931
        signal rxframe_cnt              : integer := 0;                         -- number of frames transmitted/generated
932
        signal rxsim_done               : std_logic;                            -- 1 when everything has finished
933
        signal last_err_stat            : std_logic_vector(3 downto 0);         -- latest FIFO error bits
934
        signal ff_last_length           : std_logic_vector(15 downto 0);        -- length part of ff_rx_err_stat
935
        signal gm_sop                   : std_logic;                            -- sop from GMII generator
936
        signal gm_gm_sop                : std_logic;                            -- sop from GMII generator
937
        signal m_gm_sop                 : std_logic;                            -- sop from MII generator
938
        signal gm_sop_dly               : std_logic;                            -- delayed by 1
939
        signal gm_sop_dly2              : std_logic;                            -- delayed by 1
940
        signal gm_eop                   : std_logic;                            -- eop from GMII generator
941
        signal gm_gm_eop                : std_logic;                            -- eop from GMII generator
942
        signal m_gm_eop                 : std_logic;                            -- eop from MII generator
943
        signal gm_eop_dly               : std_logic;                            -- dito delayed by 1 clk 
944
 
945
   -- RX: Determine when to expect the RX to act 
946
   -- ------------------------------------------
947
 
948
        signal expect1                  : std_logic;                            -- set after start of generator
949
        signal expect2                  : std_logic;                            -- set when we expect something, cleared if done
950
 
951
   -- RX: Verification information
952
   -- ------------------------
953
 
954
        signal rx_is_good_frame         : boolean;                              -- true if valid frame (payload error is still a valid frame)
955
        signal rx_is_good_addr          : boolean;                              -- true if valid mac address is given        
956
        signal rx_good_sent             : integer := -1;                        -- valid frames sent which should be counted as good on receive
957
        signal rx_good_rcvd             : integer := -1;                        -- should be same as good_sent at end of test        
958
        signal rx_pause_sent            : integer := -1;
959
        signal rx_pause_rcvd            : integer := -1;
960
        signal rx_align_err_sent        : integer := -1;
961
        signal rx_align_err_rcvd        : integer := -1;
962
        signal rx_crc_err_sent          : integer := -1;
963
        signal rx_crc_err_rcvd          : integer := -1;
964
        signal rx_gmii_err_sent         : integer := -1;
965
        signal rx_gmii_err_rcvd         : integer := -1;
966
        signal rx_length_err_rcvd       : integer := -1;
967
        signal rx_length_mismatch_rcvd  : integer := -1;
968
        signal rx_vlan_sent             : integer := -1;
969
        signal rx_vlan_rcvd             : integer := -1;
970
        signal rx_stack_vlan_sent       : integer := -1;
971
        signal rx_stack_vlan_rcvd       : integer := -1;
972
        signal rx_vlan_wrong_type_sent  : integer := -1;
973
        signal rx_discard_sent          : integer := -1;                        -- frame sent that should have been discarded
974
        signal rx_non_discard_rcvd      : integer := -1;                        -- frames discarded on receive
975
        signal rx_discard_rcvd          : integer := -1;                        -- frame_cnt - non_discard_rcvd    
976
        signal rx_wrong_status_sent     : integer := -1;                        -- sent frame that will be pushed into FIFO but with error status
977
        signal rx_wrong_status_rcvd     : integer := -1;
978
        signal rx_payload_err_sent      : integer := -1;
979
        signal rx_payload_err_rcvd      : integer := -1;
980
        signal mff_rxcnt                : integer := -1;
981
        signal rx_wrong_mac_sent        : integer := -1;
982
        signal rx_wrong_mac_rcvd        : integer := -1;
983
        signal rx_broadcast_sent        : integer := -1;
984
        signal rx_broadcast_rcvd        : integer := -1;
985
        signal rx_multicast_sent_total  : integer := -1;
986
        signal rx_multicast_sent        : integer := -1;
987
        signal rx_multicast_rcvd        : integer := -1;
988
        signal rx_multicast_denied      : integer := -1;
989
        signal rx_unexpected            : integer := -1;
990
        signal rx_fifo_overflow_rcvd    : integer := -1;
991
        signal rx_col_sent              : integer := -1 ;
992
        signal tx_col_sent              : integer := -1 ;
993
        signal tx_pause_sent            : integer := -1;
994
        signal rx_col_rcvd              : integer := -1 ;
995
 
996
   -- Control State Machine
997
   -- ---------------------
998
 
999
        type stm_typ is (IDLE, READ_VER, WR_SCRATCH, RD_SCRATCH, WRITE_MDIO0, READ_MDIO0, WRITE_MDIO1, READ_MDIO1,
1000
                         MAC_CONFIG, WR_MAC1, WR_MAC2, WR_RX_AE, WR_RX_AF, WR_TX_AE, WR_TX_AF,
1001
                         WR_RX_SE, WR_RX_SF, WR_TX_SE, WR_TX_SF, WR_IPG_LEN,
1002
                         LUT_PROG, LUT_PROG_INC,WR_FRM_LENGTH, WR_PAUSE_QUANTA, WR_MDIO_ADDR0, WR_MDIO_ADDR1,
1003
                         SIM, END_SIM_WAIT, WR_SUP_MAC0_0, WR_SUP_MAC0_1, WR_SUP_MAC1_0, WR_SUP_MAC1_1,
1004
                         WR_SUP_MAC2_0, WR_SUP_MAC2_1, WR_SUP_MAC3_0, WR_SUP_MAC3_1,
1005
                         RD_FRM_TX, RD_FRM_RX, RD_CRC_ERR, RD_ALIGN_ERR, RD_TX_OCTETS, RD_RX_OCTETS, RD_PAUSE_RX,
1006
                         RD_PAUSE_TX, RX_UNICAST, RX_MLTCAST, RX_BRDCAST,
1007
                         TX_FRM_DISCARD, TX_UNICAST, TX_MLTCAST, TX_BRDCAST, RX_FRM_ERR, TX_FRM_ERR,
1008
                         RX_FRM_DROP, RX_UNDERSZ_FRM, RX_OVERSZ_FRM, RX_64_FRM, RX_65_127_FRM, RX_128_255_FRM,
1009
                         RX_256_511_FRM, RX_512_1023_FRM, RX_1024_1518_FRM, RX_1519_X_FRM, RX_JABBER, RX_FRAGMENT,
1010
                         SW_RESET, RD_SW_RESET, WR_ENA_MAGIC, NODE_SLEEP1, GEN_MAGIC, NODE_SLEEP2, NODE_ON,
1011
                         END_SIM1, END_SIM) ;
1012
        signal state                    : stm_typ ;
1013
        signal nextstate                : stm_typ ;
1014
        signal sim_cnt_end              : integer ;
1015
        signal re_read_ena              : boolean := FALSE ;
1016
 
1017
   -- Hash Table Program Control
1018
   -- --------------------------
1019
 
1020
        signal lut_prog_cnt             : integer range 0 to 64 := 0 ;
1021
 
1022
   -- Half Duplex Colision Control
1023
   -- ----------------------------
1024
 
1025
        signal rx_nib_cnt               : integer ;                             -- Nibble Counter
1026
        signal tx_nib_cnt               : integer ;                             -- Nibble Counter
1027
        signal tx_col_reg               : std_logic;                            -- Packet Transmitted with Col                
1028
        signal tx_col_reg_fd            : std_logic;                            -- Packet Transmitted with Col                
1029
        signal tx_col_reg_hd            : std_logic;                            -- Packet Transmitted with Col                
1030
 
1031
 
1032
 
1033
   -- register write/read test
1034
   -- ----------------------------
1035
        signal readback_scratch         : std_logic_vector(31 downto 0) ;
1036
        signal readback_MDIO0_addr0     : std_logic_vector(15 downto 0) ;
1037
        signal readback_MDIO1_addr0     : std_logic_vector(15 downto 0) ;
1038
 
1039
        signal register_test            : integer;
1040
 
1041
    -- derived speed
1042
    -- ----------------------------
1043
        signal ETH_SPEED                : integer;
1044
 
1045
 
1046
begin
1047
 
1048
   -- global settings
1049
   -- ---------------
1050
        jumbo_enable    <= '1' when (TB_MACLENMAX >1522) else '0';   -- enable monitors for long frames
1051
 
1052
   -- Reset Control and start simulation
1053
   -- -------------
1054
 
1055
 
1056
    --  Ethernet speed selection & validation
1057
    process (reg_clk)
1058
            variable ln             : line;
1059
    begin
1060
 
1061
    if (reg_clk='0' and reg_clk'event) then
1062
       if (state=READ_VER and reg_busy='0')then
1063
        if (ENABLE_MACLITE = 0) then
1064
            ETH_SPEED <= ETH_MODE;
1065
 
1066
            writeline(output, ln) ;
1067
            write(ln, string'(" ")) ;
1068
            writeline(output, ln) ;
1069
            write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1070
            writeline(output, ln) ;
1071
            write(ln, string'(" -- Testbench for 32-Bit Core 10/100/1000 MAC -- ")) ;
1072
            writeline(output, ln) ;
1073
            write(ln, string'(" -- (c) ALTERA CORPORATION 2007 --")) ;
1074
            writeline(output, ln) ;
1075
            write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1076
            writeline(output, ln) ;
1077
            write(ln, string'(" ")) ;
1078
            writeline(output, ln);
1079
 
1080
        else
1081
            if (MACLITE_GIGE = 1) then
1082
                ETH_SPEED <= 1000;
1083
                writeline(output, ln) ;
1084
                write(ln, string'(" ")) ;
1085
                writeline(output, ln) ;
1086
                write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1087
                writeline(output, ln) ;
1088
                write(ln, string'(" -- Testbench for 32-Bit Core 1000 SMALL MAC -- ")) ;
1089
                writeline(output, ln) ;
1090
                write(ln, string'(" -- (c) ALTERA CORPORATION 2007 --")) ;
1091
                writeline(output, ln) ;
1092
                write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1093
                write(ln, string'(" ")) ;
1094
                writeline(output, ln);
1095
 
1096
                write(ln, string'("WARNING: 10/100 Operation is not supported. Allowable values for 'ETH_MODE' parameter is '1000' only.  Reseting  to \'1000\'"));
1097
                writeline(output, ln);
1098
            else
1099
                ETH_SPEED <= 100;
1100
                writeline(output, ln) ;
1101
                write(ln, string'(" ")) ;
1102
                writeline(output, ln) ;
1103
                write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1104
                writeline(output, ln) ;
1105
                write(ln, string'(" -- Testbench for 32-Bit Core 10/100 SMALL MAC -- ")) ;
1106
                writeline(output, ln) ;
1107
                write(ln, string'(" -- (c) ALTERA CORPORATION 2007 --")) ;
1108
                writeline(output, ln) ;
1109
                write(ln, string'(" - ---------------------------------------------------------------------------------------- -")) ;
1110
                writeline(output, ln) ;
1111
                write(ln, string'(" ")) ;
1112
                writeline(output, ln);
1113
 
1114
                write(ln, string'("WARNING: 1000 Operation is not supported. Allowable values for 'ETH_MODE' parameter is '100' or '10' only.  Reseting  to '100'"));
1115
                writeline(output, ln);
1116
            end if  ;
1117
        end if;
1118
        end if;
1119
 
1120
   end if;
1121
    end process ;
1122
 
1123
 
1124
        reset       <= '0', '1' after 50 ns, '0' after 2000 ns ;
1125
        sim_start   <= '0', '1' after 3000 ns;
1126
 
1127
   -- Clocks
1128
   -- ------
1129
 
1130
        ethernet_mode <= '1' when ETH_SPEED=1000 else '0';
1131
        tx_clk <= tx_clk_10 when ETH_SPEED=10 else tx_clk_100 when ETH_SPEED=100 else tx_clk_1000;
1132
        rx_clk_tb <= rx_clk_10 when ETH_SPEED=10 else rx_clk_100 when ETH_SPEED=100 else rx_clk_1000;
1133
        rx_clk <= TRANSPORT rx_clk_tb after 2 ns;
1134
        ref_clk <= ref_clk_10 when ETH_SPEED=10 else ref_clk_100 when ETH_SPEED=100 else ref_clk_1000;
1135
 
1136
 
1137
        --E1000_GEN: if (ETH_SPEED=1000) generate
1138
        --begin
1139
 
1140
                --ethernet_mode <= '1' ;
1141
 
1142
                CLK_NOLOOP: if( TB_RXFRAMES/=0) generate        -- RX extra test, generate own clock
1143
 
1144
                        process
1145
                        begin
1146
 
1147
                                rx_clk_1000 <= '0' ;
1148
                                wait for 4 ns ;
1149
                                rx_clk_1000 <= '1' ;
1150
                                wait for 4 ns ;
1151
 
1152
                        end process ;
1153
 
1154
                end generate;
1155
 
1156
                CLK_LOOPBACK: if( TB_RXFRAMES=0) generate      -- RX Loopback, use TX Clock
1157
 
1158
                        rx_clk_1000 <= tx_clk_1000;
1159
 
1160
                end generate;
1161
 
1162
                process
1163
                begin
1164
 
1165
                        tx_clk_1000  <= '1' ;
1166
                        ref_clk_1000 <= '1' ;
1167
                        wait for 4 ns ;
1168
                        tx_clk_1000  <= '0' ;
1169
                        ref_clk_1000 <= '0' ;
1170
                        wait for 4 ns ;
1171
 
1172
                end process ;
1173
 
1174
        --end generate ;
1175
 
1176
        --E100_GEN: if (ETH_SPEED=100) generate
1177
        --begin
1178
 
1179
                --ethernet_mode <= '0' ;
1180
 
1181
                CLK_NOLOOP_100: if( TB_RXFRAMES/=0) generate        -- RX extra test, generate own clock
1182
 
1183
                        process
1184
                        begin
1185
 
1186
                                rx_clk_100 <= '0' ;
1187
                                wait for 20 ns ;
1188
                                rx_clk_100 <= '1' ;
1189
                                wait for 20 ns ;
1190
 
1191
                        end process ;
1192
 
1193
                end generate;
1194
 
1195
                CLK_LOOPBACK_100: if( TB_RXFRAMES=0) generate      -- RX Loopback, use TX Clock
1196
 
1197
                        rx_clk_100 <= tx_clk_100;
1198
 
1199
                end generate;
1200
 
1201
                process
1202
                begin
1203
 
1204
                        tx_clk_100 <= '1' ;
1205
                        wait for 20 ns ;
1206
                        tx_clk_100 <= '0' ;
1207
                        wait for 20 ns ;
1208
 
1209
                end process ;
1210
 
1211
                process
1212
                begin
1213
 
1214
                        ref_clk_100 <= '1' ;
1215
                        wait for 20 ns ;
1216
                        ref_clk_100 <= '0' ;
1217
                        wait for 20 ns ;
1218
 
1219
                end process ;
1220
 
1221
        --end generate ; 
1222
 
1223
        --E10_GEN: if (ETH_SPEED=10) generate
1224
        --begin
1225
 
1226
                --ethernet_mode <= '0' ;
1227
 
1228
                CLK_NOLOOP_10: if( TB_RXFRAMES/=0) generate        -- RX extra test, generate own clock
1229
 
1230
                        process
1231
                        begin
1232
 
1233
                                rx_clk_10 <= '0' ;
1234
                                wait for 200 ns ;
1235
                                rx_clk_10 <= '1' ;
1236
                                wait for 200 ns ;
1237
 
1238
                        end process ;
1239
 
1240
                end generate;
1241
 
1242
                CLK_LOOPBACK_10: if( TB_RXFRAMES=0) generate      -- RX Loopback, use TX Clock
1243
 
1244
                        rx_clk_10 <= tx_clk_10;
1245
 
1246
                end generate;
1247
 
1248
                process
1249
                begin
1250
 
1251
                        tx_clk_10 <= '1' ;
1252
                        wait for 200 ns ;
1253
                        tx_clk_10 <= '0' ;
1254
                        wait for 200 ns ;
1255
 
1256
                end process ;
1257
 
1258
                process
1259
                begin
1260
 
1261
                        ref_clk_10 <= '1' ;
1262
                        wait for 200 ns ;
1263
                        ref_clk_10 <= '0' ;
1264
                        wait for 200 ns ;
1265
 
1266
                end process ;
1267
 
1268
        --end generate ;  
1269
 
1270
        process
1271
        begin
1272
 
1273
                ff_rx_clk <= '1' ;
1274
                wait for 4 ns;
1275
                ff_rx_clk <= '0' ;
1276
                wait for 4 ns ;
1277
 
1278
        end process ;
1279
 
1280
        process
1281
        begin
1282
 
1283
                ff_tx_clk <= '1' ;
1284
                wait for 4 ns;
1285
                ff_tx_clk <= '0' ;
1286
                wait for 4 ns;
1287
 
1288
        end process ;
1289
 
1290
   -- Collision Control
1291
   -- -----------------
1292
 
1293
        GEN_NHD: if (HD_ENA=FALSE) generate
1294
        begin
1295
 
1296
                m_rx_crs   <= '0' ;
1297
                m_rx_col   <= '0' ;
1298
                tx_col_reg <= '0' ;
1299
 
1300
        end generate ;
1301
 
1302
   -- Half Duplex Control
1303
   -- -------------------
1304
 
1305
        GEN_HD: if (HD_ENA=TRUE and ENABLE_HD_LOGIC=1) generate
1306
        begin
1307
 
1308
           -- RX
1309
           -- --
1310
 
1311
                process(reset, rx_clk_tb)
1312
                begin
1313
 
1314
                        if (reset='1') then
1315
 
1316
                                rx_nib_cnt     <= 0 ;
1317
                                rx_col_sent <= 0 ;
1318
 
1319
                        elsif (rx_clk_tb='1') and (rx_clk_tb'event) then
1320
 
1321
                                if (m_rx_en='1') then
1322
 
1323
                                        rx_nib_cnt <= rx_nib_cnt+1 ;
1324
 
1325
                                else
1326
 
1327
                                        rx_nib_cnt <= 0 ;
1328
 
1329
                                end if ;
1330
 
1331
                                if (m_rx_col='1' and rx_nib_cnt=RX_COL_GEN) then
1332
 
1333
                                        rx_col_sent <= rx_col_sent+1 ;
1334
 
1335
                                end if ;
1336
 
1337
                        end if ;
1338
 
1339
                end process ;
1340
 
1341
           -- Collision Control
1342
           -- -----------------
1343
 
1344
                process(rxframe_cnt, rx_nib_cnt, m_rx_en, tx_frm_all, tx_nib_cnt)
1345
                begin
1346
 
1347
                        if (TB_RXFRAMES>0 and rxframe_cnt=RX_COL_FRM and (rx_nib_cnt>=RX_COL_GEN and rx_nib_cnt<=RX_COL_GEN+4) and m_rx_en='1') then
1348
 
1349
                                if (RX_COL_FRM>0) then
1350
 
1351
                                        m_rx_col    <= '1' ;
1352
 
1353
                                else
1354
 
1355
                                        m_rx_col <= '0' ;
1356
 
1357
                                end if ;
1358
 
1359
                        elsif (tx_frm_all=TX_COL_FRM-1 and tx_nib_cnt>=TX_COL_GEN and tx_nib_cnt<=TX_COL_GEN+4) then
1360
 
1361
                                if (TX_COL_FRM>0) then
1362
 
1363
                                        m_rx_col    <= '1' ;
1364
 
1365
                                else
1366
 
1367
                                        m_rx_col <= '0' ;
1368
 
1369
                                end if ;
1370
 
1371
                        elsif (tx_frm_all>TX_COL_FRM-1 and tx_frm_all<TX_COL_FRM+TX_COL_NUM-1 and
1372
                               tx_nib_cnt>=TX_COL_GEN+(tx_frm_all-gm_txcnt)*TX_COL_DELAY and tx_nib_cnt<=TX_COL_GEN+(tx_frm_all-gm_txcnt)*TX_COL_DELAY+4) then
1373
 
1374
                                if (TX_COL_FRM>0) then
1375
 
1376
                                        m_rx_col    <= '1' ;
1377
 
1378
                                else
1379
 
1380
                                        m_rx_col <= '0' ;
1381
 
1382
                                end if ;
1383
 
1384
                        else
1385
 
1386
                                m_rx_col <= '0' ;
1387
 
1388
                        end if ;
1389
 
1390
                end process ;
1391
 
1392
           -- TX
1393
           -- --
1394
 
1395
                m_rx_crs <= '1' when (m_rx_en='1' or m_tx_en='1') else '0' ;
1396
 
1397
                process(reset, tx_clk)
1398
                begin
1399
 
1400
                        if (reset='1') then
1401
 
1402
                                tx_nib_cnt  <= 0 ;
1403
                                tx_col_sent <= 0 ;
1404
                                tx_col_reg  <= '0' ;
1405
 
1406
                        elsif (tx_clk='1') and (tx_clk'event) then
1407
 
1408
                                if (m_tx_en='1') then
1409
 
1410
                                        tx_nib_cnt <= tx_nib_cnt+1 ;
1411
 
1412
                                else
1413
 
1414
                                        tx_nib_cnt <= 0 ;
1415
 
1416
                                end if ;
1417
 
1418
                                if (m_rx_col='1' and tx_nib_cnt=TX_COL_GEN) then
1419
 
1420
                                        tx_col_sent <= rx_col_sent+1 ;
1421
 
1422
                                end if ;
1423
 
1424
                                if (m_rx_col='1' and m_tx_en='1') then
1425
 
1426
                                        tx_col_reg <= '1' ;
1427
 
1428
                                elsif (m_mgm_frm_rcvd='1') then
1429
 
1430
                                        tx_col_reg <= '0' ;
1431
 
1432
                                end if ;
1433
 
1434
                        end if ;
1435
 
1436
                end process ;
1437
 
1438
        end generate ;
1439
 
1440
   -- -------------------------------------------------------------------
1441
   -- Ethernet MAC Core        
1442
   -- -------------------------------------------------------------------
1443
 
1444
        ff_tx_crc_fwd <= '0' ;
1445
        set_1000      <= '0' ;
1446
        set_10        <= '0' ;
1447
        magic_sleep_n    <= '0' after 300 ns when ((nextstate=NODE_SLEEP1 or nextstate=NODE_SLEEP2 or nextstate=GEN_MAGIC) and ENA_SLEEP_PIN) else '1' ;
1448
 
1449
 
1450
        ff_rx_err_stat  <=  rx_err_stat(17) &  rx_err(5) & rx_err_stat(15 downto 0) & rx_err_stat(16) & rx_err(4 downto 1);
1451
        ff_rx_err       <=  rx_err(0);
1452
        ff_rx_vlan      <=  rx_frm_type(3);
1453
        ff_rx_bcast     <=  rx_frm_type(2);
1454
        ff_rx_mcast     <=  rx_frm_type(1);
1455
        ff_rx_ucast     <=  rx_frm_type(0);
1456
 
1457
 
1458
        dut: esoc_port_mac
1459
        port map (
1460
          ff_tx_crc_fwd => ff_tx_crc_fwd,
1461
          ff_tx_data => ff_tx_data,
1462
          ff_tx_eop => ff_tx_eop,
1463
          ff_tx_err => ff_tx_err,
1464
          ff_tx_mod => ff_tx_mod,
1465
          ff_tx_rdy => ff_tx_rdy,
1466
          ff_tx_sop => ff_tx_sop,
1467
          ff_tx_wren => ff_tx_wren,
1468
          ff_tx_clk => ff_tx_clk,
1469
          ff_rx_data => ff_rx_data,
1470
          ff_rx_dval => ff_rx_dval,
1471
          ff_rx_eop => ff_rx_eop,
1472
          ff_rx_mod => ff_rx_mod,
1473
          ff_rx_rdy => ff_rx_rdy,
1474
          ff_rx_sop => ff_rx_sop,
1475
          rx_err => rx_err,
1476
          rx_err_stat => rx_err_stat,
1477
          rx_frm_type => rx_frm_type,
1478
          ff_rx_dsav => ff_rx_dsav,
1479
          ff_rx_clk => ff_rx_clk,
1480
          address => reg_addr(7 downto 0),
1481
          readdata => reg_data_out,
1482
          read => reg_rd,
1483
          writedata => reg_data_in,
1484
          write => reg_wr,
1485
          waitrequest => reg_busy,
1486
          clk => reg_clk,
1487
          reset => reset,
1488
          rgmii_in => rgmii_in,
1489
          rgmii_out => rgmii_out,
1490
          rx_control => rx_control,
1491
          tx_control => tx_control,
1492
          tx_clk => tx_clk,
1493
          rx_clk => rx_clk,
1494
          set_10 => '0',
1495
          set_1000 => '0',
1496
          ena_10 => open,
1497
          eth_mode => open,
1498
          ff_tx_septy => ff_tx_septy,
1499
          tx_ff_uflow => open,
1500
          ff_rx_a_full => ff_rx_a_full,
1501
          ff_rx_a_empty => ff_rx_a_empty,
1502
          ff_tx_a_full => ff_tx_a_full,
1503
          ff_tx_a_empty => ff_tx_a_empty,
1504
          xon_gen => xon_gen,
1505
          xoff_gen => xoff_gen,
1506
          magic_wakeup => magic_wakeup,
1507
          magic_sleep_n => magic_sleep_n,
1508
          mdio_out => mdio_out,
1509
          mdio_oen => mdio_oen,
1510
          mdio_in => mdio_in,
1511
          mdc => mdc
1512
        );
1513
 
1514
 
1515
 
1516
   -- MAC Configuration
1517
   -- -----------------
1518
 
1519
        mac_addr        <= X"EE1122334450" ;
1520
        sup_mac_addr_0  <= X"EE2233445560" ;
1521
        sup_mac_addr_1  <= X"EE3344556670" ;
1522
        sup_mac_addr_2  <= X"EE4455667780" ;
1523
        sup_mac_addr_3  <= X"EE5566778890" ;
1524
        frm_length_max  <= conv_std_logic_vector(TB_MACLENMAX, 14) ;
1525
 
1526
   -- MDIO Slave Model
1527
   -- ----------------
1528
 
1529
   MDIO_PORT_MAP_GEN: if (ENABLE_MDIO= 1) generate
1530
        begin
1531
 
1532
        process
1533
        begin
1534
 
1535
                mdio <= 'H' ;
1536
                wait ;
1537
 
1538
        end process ;
1539
 
1540
        mdio_in <= mdio ;
1541
        mdio    <= 'H' when (mdio_oen='1') else mdio_out ;
1542
 
1543
        MDIO_0: top_mdio_slave port map (
1544
 
1545
                reset           => reset,
1546
                mdc             => mdc ,
1547
                mdio            => mdio ,
1548
                dev_addr        => phy_addr0 ,
1549
                conf_done       => mdio0_done) ;
1550
 
1551
        MDIO_1: top_mdio_slave port map (
1552
 
1553
                reset           => reset,
1554
                mdc             => mdc ,
1555
                mdio            => mdio ,
1556
                dev_addr        => phy_addr1 ,
1557
                conf_done       => mdio1_done) ;
1558
 
1559
        phy_addr0 <= conv_std_logic_vector(TB_MDIO_ADDR0, 5) ;
1560
        phy_addr1 <= conv_std_logic_vector(TB_MDIO_ADDR1, 5) ;
1561
 
1562
    end generate;
1563
 
1564
   -- Checking FIFO Signals
1565
   -- ---------------------
1566
 
1567
        process(reset, ff_rx_clk)
1568
        begin
1569
 
1570
                if (reset='1') then
1571
 
1572
                        ff_rx_ucast_reg  <= '0' ;
1573
                        ff_rx_bcast_reg  <= '0' ;
1574
                        ff_rx_mcast_reg  <= '0' ;
1575
                        ff_rx_vlan_reg   <= '0' ;
1576
                        ff_rx_ucast_reg2 <= '0' ;
1577
                        ff_rx_bcast_reg2 <= '0' ;
1578
                        ff_rx_mcast_reg2 <= '0' ;
1579
                        ff_rx_vlan_reg2  <= '0' ;
1580
 
1581
                elsif (ff_rx_clk='1') and (ff_rx_clk'event) then
1582
 
1583
                        if (ff_rx_sop='1') then
1584
 
1585
                                ff_rx_ucast_reg <= ff_rx_ucast ;
1586
                                ff_rx_bcast_reg <= ff_rx_bcast ;
1587
                                ff_rx_mcast_reg <= ff_rx_mcast ;
1588
                                ff_rx_vlan_reg  <= ff_rx_vlan ;
1589
 
1590
                        end if ;
1591
 
1592
                        ff_rx_ucast_reg2 <= ff_rx_ucast_reg ;
1593
                        ff_rx_bcast_reg2 <= ff_rx_bcast_reg ;
1594
                        ff_rx_mcast_reg2 <= ff_rx_mcast_reg ;
1595
                        ff_rx_vlan_reg2  <= ff_rx_vlan_reg ;
1596
 
1597
                end if ;
1598
 
1599
        end process ;
1600
 
1601
        process(ff_rx_clk)
1602
 
1603
                variable ln : line ;
1604
 
1605
        begin
1606
 
1607
                if (ff_rx_clk='1') and (ff_rx_clk'event) then
1608
 
1609
                        if (mff_frm_rcvd='1') then
1610
 
1611
                                if (mff_dst_reg=X"FFFFFFFFFFFF" and ff_rx_bcast_reg2='0') then
1612
 
1613
                                        write(ln, string'(" ")) ;
1614
                                        writeline(output, ln) ;
1615
                                        write(ln, NOW) ;
1616
                                        write(ln, string'(" - Error: FIFO Broadcast Frame Error")) ;
1617
                                        writeline(output, ln) ;
1618
 
1619
                                end if ;
1620
 
1621
                                if (mff_dst_reg/=X"FFFFFFFFFFFF" and mff_dst_reg(0)='1' and ff_rx_mcast_reg2='0' and mff_is_pause='0') then
1622
 
1623
                                        write(ln, string'(" ")) ;
1624
                                        writeline(output, ln) ;
1625
                                        write(ln, NOW) ;
1626
                                        write(ln, string'(" - Error: FIFO Multicast Frame Error")) ;
1627
                                        writeline(output, ln) ;
1628
 
1629
                                end if ;
1630
 
1631
                                if (mff_dst_reg(0)='0' and ff_rx_ucast_reg2='0' and mff_is_pause='0') then
1632
 
1633
                                        write(ln, string'(" ")) ;
1634
                                        writeline(output, ln) ;
1635
                                        write(ln, NOW) ;
1636
                                        write(ln, string'(" - Error: FIFO Unicast Frame Error")) ;
1637
                                        writeline(output, ln) ;
1638
 
1639
                                end if ;
1640
 
1641
                                if (ff_rx_vlan_reg2='1' and mff_is_vlan='0') then
1642
 
1643
                                        write(ln, string'(" ")) ;
1644
                                        writeline(output, ln) ;
1645
                                        write(ln, NOW) ;
1646
                                        write(ln, string'(" - Error: FIFO VLAN Frame Error")) ;
1647
                                        writeline(output, ln) ;
1648
 
1649
                                end if ;
1650
 
1651
                        end if ;
1652
 
1653
                end if ;
1654
 
1655
        end process ;
1656
 
1657
   -- Frame generator feeds GMII/RGMII/MII RX (Ethernet PHY) 
1658
   -- ------------------------------------------------
1659
 
1660
        EXT_LOOPBACK: if( TB_RXFRAMES=0 and ENABLE_GMII_LOOPBACK=0 and REDUCED_INTERFACE_ENA = 0) generate        -- NO RX Test then switch Loopback
1661
 
1662
                gm_rx_data <= gm_tx_data;
1663
                gm_rx_en   <= gm_tx_en;
1664
                gm_rx_err  <= gm_tx_err;
1665
 
1666
                m_rx_data <= m_tx_data;
1667
                m_rx_en   <= m_tx_en;
1668
                m_rx_err  <= m_tx_err;
1669
 
1670
        end generate;
1671
 
1672
 
1673
        EXT_LOOPBACK_RGMII: if( TB_RXFRAMES=0  and REDUCED_INTERFACE_ENA = 1) generate        -- NO RX Test then switch Loopback
1674
 
1675
                rgmii_tx_data <= rgmii_out;
1676
                rgmii_in <=  rgmii_rx_data;
1677
                rgmii_tx_ctnl <= tx_control;
1678
                rx_control <=  rgmii_rx_ctnl;
1679
 
1680
                rgmii_rx_data <= rgmii_tx_data;
1681
                rgmii_rx_ctnl <= rgmii_tx_ctnl;
1682
 
1683
                m_rx_data <= m_tx_data;
1684
                m_rx_en   <= m_tx_en;
1685
                m_rx_err  <= m_tx_err;
1686
 
1687
        end generate;
1688
 
1689
        INT_LOOPBACK: if( TB_RXFRAMES=0 and ENABLE_GMII_LOOPBACK=1 and REDUCED_INTERFACE_ENA = 0) generate        -- NO RX Test then switch Loopback
1690
 
1691
                gm_rx_data <= (others=>'0');
1692
                gm_rx_en   <= '0';
1693
                gm_rx_err  <= '0';
1694
 
1695
                m_rx_data <= (others=>'0');
1696
                m_rx_en   <= '0';
1697
                m_rx_err  <= '0';
1698
 
1699
        end generate;
1700
 
1701
 
1702
                NOLOOPBCK: if( TB_RXFRAMES>0 and REDUCED_INTERFACE_ENA = 0) generate  -- use RX Frame generator
1703
 
1704
                gm_rx_data <= gm_rxgen_rx_d;
1705
                gm_rx_en   <= gm_rxgen_rx_en;
1706
                gm_rx_err  <= gm_rxgen_rx_err;
1707
 
1708
                m_rx_data <= m_rxgen_rx_d(3 downto 0);
1709
                m_rx_en   <= m_rxgen_rx_en;
1710
                m_rx_err  <= m_rxgen_rx_err;
1711
 
1712
        end generate;
1713
 
1714
 
1715
    NOLOOPBCK_RGMII: if( TB_RXFRAMES>0 and REDUCED_INTERFACE_ENA=1) generate  -- use RX Frame generator
1716
 
1717
        rgmii_tx_data <= rgmii_out;
1718
        rgmii_in <=  rgmii_rx_data;
1719
        rgmii_tx_ctnl <= tx_control;
1720
                rx_control <=  rgmii_rx_ctnl;
1721
 
1722
 
1723
                rgmii_rx_data <= gm_rxgen_rx_d(3 downto 0);
1724
                rgmii_rx_ctnl <= gm_rxgen_rx_en;
1725
 
1726
                m_rx_data <= m_rxgen_rx_d(3 downto 0);
1727
                m_rx_en   <= m_rxgen_rx_en;
1728
                m_rx_err  <= m_rxgen_rx_err;
1729
 
1730
        end generate;
1731
 
1732
 
1733
    GMII_GEN_BLOCK: if( REDUCED_INTERFACE_ENA=0) generate  -- use RX Frame generator
1734
 
1735
        GMII_GEN: ethgenerator
1736
 
1737
                generic map (
1738
 
1739
 
1740
                        THOLD           => 2 ns)
1741
 
1742
                port map (
1743
 
1744
                        reset           => reset ,
1745
                        rx_clk          => rx_clk_tb ,        -- GMII RX
1746
                        enable          => '1',
1747
                        rxd             => gm_rxgen_rx_d ,
1748
                        rx_dv           => gm_rxgen_rx_en ,
1749
                        rx_er           => gm_rxgen_rx_err ,
1750
                        sop             => gm_gm_sop ,
1751
                        eop             => gm_gm_eop ,
1752
                        mac_reverse     => gm_mac_reverse ,   -- CONFIGURATION 
1753
                        dst             => gm_dst ,
1754
                        src             => gm_src ,
1755
                        prmble_len      => gm_prmble_len ,
1756
                        pquant          => gm_pquant ,
1757
                        vlan_ctl        => gm_vlan_ctl ,
1758
                        len             => gm_len ,
1759
                        frmtype         => gm_frmtype ,
1760
                        cntstart        => gm_cntstart ,
1761
                        cntstep         => gm_cntstep ,
1762
                        ipg_len         => gm_ipg_cnt ,
1763
                        payload_err     => gm_payload_err ,
1764
                        prmbl_err       => gm_prmbl_err ,
1765
                        crc_err         => gm_crc_err ,
1766
                        vlan_en         => gm_vlan_en ,
1767
                        stack_vlan      => gm_stack_vlan_en ,
1768
                        pause_gen       => gm_pause_gen ,
1769
                        wrong_pause_op  => '0' ,
1770
                        wrong_pause_lgth=> '0' ,
1771
                        pad_en          => gm_pad_en ,
1772
                        phy_err         => gm_phy_err ,
1773
                        end_err         => gm_end_err ,
1774
                        magic           => gm_magic ,
1775
                        data_only       => '0' ,
1776
                        start           => gm_start_ether_gen ,
1777
                        done            => gm_gm_ether_gen_done) ;
1778
 
1779
        MII_GEN: ethgenerator2
1780
 
1781
                generic map (
1782
 
1783
                        THOLD           => 2 ns)
1784
 
1785
                port map (
1786
 
1787
                        reset           => reset ,
1788
                        rx_clk          => rx_clk_tb ,
1789
                        rxd             => m_rxgen_rx_d ,
1790
                        rx_dv           => m_rxgen_rx_en ,
1791
                        rx_er           => m_rxgen_rx_err ,
1792
                        sop             => m_gm_sop ,
1793
                        eop             => m_gm_eop ,
1794
                        ethernet_speed  => ethernet_mode,
1795
                        mii_mode        => '1' ,
1796
                        rgmii_mode      => '0' ,
1797
                        mac_reverse     => gm_mac_reverse ,   -- CONFIGURATION  
1798
                        dst             => gm_dst ,
1799
                        src             => gm_src ,
1800
                        prmble_len      => gm_prmble_len ,
1801
                        pquant          => gm_pquant ,
1802
                        vlan_ctl        => gm_vlan_ctl ,
1803
                        len             => gm_len ,
1804
                        frmtype         => gm_frmtype ,
1805
                        cntstart        => gm_cntstart ,
1806
                        cntstep         => gm_cntstep ,
1807
                        ipg_len         => gm_ipg_cnt ,
1808
                        payload_err     => gm_payload_err ,
1809
                        prmbl_err       => gm_prmbl_err ,
1810
                        crc_err         => gm_crc_err ,
1811
                        vlan_en         => gm_vlan_en ,
1812
                        stack_vlan      => gm_stack_vlan_en ,
1813
                        pause_gen       => gm_pause_gen ,
1814
                        wrong_pause_op  => '0' ,
1815
                        wrong_pause_lgth=> '0' ,
1816
                        pad_en          => gm_pad_en ,
1817
                        phy_err         => gm_phy_err ,
1818
                        end_err         => gm_end_err ,
1819
                        magic           => gm_magic ,
1820
                        data_only       => '0' ,
1821
                        start           => m_start_ether_gen ,
1822
                        done            => m_gm_ether_gen_done) ;
1823
 
1824
 
1825
        end generate;
1826
 
1827
 
1828
    RGMII_GEN_BLOCK: if( REDUCED_INTERFACE_ENA=1) generate  -- use RX Frame generator
1829
 
1830
    gm_rx_data <= X"00";
1831
    gm_rx_en <= '0';
1832
    gm_rx_err <= '0';
1833
 
1834
        RGMII_GEN: ethgenerator2
1835
 
1836
                generic map (
1837
 
1838
                        THOLD           => 0 ns)
1839
 
1840
                port map (
1841
 
1842
                        reset           => reset ,
1843
                        rx_clk          => rx_clk_tb ,
1844
                        rxd             => gm_rxgen_rx_d ,
1845
                        rx_dv            => gm_rxgen_rx_en ,
1846
                        rx_er           => gm_rxgen_rx_err ,
1847
                        sop             => gm_gm_sop ,
1848
                        eop             => gm_gm_eop ,
1849
                        ethernet_speed  => ethernet_mode,
1850
                        mii_mode        => '0' ,
1851
                        rgmii_mode      => '1' ,
1852
                        mac_reverse     => gm_mac_reverse ,   -- CONFIGURATION  
1853
                        dst             => gm_dst ,
1854
                        src             => gm_src ,
1855
                        prmble_len      => gm_prmble_len ,
1856
                        pquant          => gm_pquant ,
1857
                        vlan_ctl        => gm_vlan_ctl ,
1858
                        len             => gm_len ,
1859
                        frmtype         => gm_frmtype ,
1860
                        cntstart        => gm_cntstart ,
1861
                        cntstep         => gm_cntstep ,
1862
                        ipg_len         => gm_ipg_cnt ,
1863
                        payload_err     => gm_payload_err ,
1864
                        prmbl_err       => gm_prmbl_err ,
1865
                        crc_err         => gm_crc_err ,
1866
                        vlan_en         => gm_vlan_en ,
1867
                        stack_vlan      => gm_stack_vlan_en ,
1868
                        pause_gen       => gm_pause_gen ,
1869
                        wrong_pause_op  => '0' ,
1870
                        wrong_pause_lgth=> '0' ,
1871
                        pad_en          => gm_pad_en ,
1872
                        phy_err         => gm_phy_err ,
1873
                        end_err         => gm_end_err ,
1874
                        magic           => gm_magic ,
1875
                        data_only       => '0' ,
1876
                        start           => gm_start_ether_gen ,
1877
                        done            => gm_gm_ether_gen_done) ;
1878
 
1879
        end generate;
1880
 
1881
        gm_sop            <= m_gm_sop when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_gm_sop;
1882
        gm_eop            <= m_gm_eop when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_gm_eop;
1883
        gm_ether_gen_done <= m_gm_ether_gen_done when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_gm_ether_gen_done;
1884
 
1885
   -- Frame Monitor connected to GMII TX (Ethernet PHY) 
1886
   -- ------------------------------------------------
1887
 
1888
    GMII_MON_BLOCK: if( REDUCED_INTERFACE_ENA=0) generate  -- use RX Frame generator
1889
 
1890
    rgm_tx_data <= x"00";
1891
    rgm_tx_en   <= '0';
1892
 
1893
 
1894
        GMII_MON: ETHMONITOR port map (
1895
 
1896
                reset         =>  reset,
1897
                tx_clk        =>  tx_clk,        -- GMII TX
1898
                txd           =>  gm_tx_data,
1899
                tx_dv         =>  gm_tx_en,
1900
                tx_er         =>  gm_tx_err,
1901
                tx_sop        =>  '0' ,
1902
                tx_eop        =>  '0' ,
1903
                dst           =>  gm_mgm_dst,          -- Analyzed Frame Indicators  
1904
                src           =>  gm_mgm_src,
1905
                prmble_len    =>  gm_mgm_prmble_len,
1906
                pquant        =>  gm_mgm_pquant,
1907
                vlan_ctl      =>  gm_mgm_vlan_ctl,
1908
                len           =>  gm_mgm_len,
1909
                frmtype       =>  gm_mgm_frmtype,
1910
                payload       =>  gm_mgm_payload,
1911
                payload_vld   =>  gm_mgm_payload_vld,
1912
                is_vlan       =>  gm_mgm_is_vlan,
1913
                is_stack_vlan =>  gm_mgm_is_stack_vlan,
1914
                is_pause      =>  gm_mgm_is_pause,
1915
                crc_err       =>  gm_mgm_crc_err,
1916
                prmbl_err     =>  gm_mgm_prmbl_err,
1917
                len_err       =>  gm_mgm_len_err,
1918
                payload_err   =>  gm_mgm_payload_err,
1919
                frame_err     =>  gm_mgm_frame_err,
1920
                pause_op_err  =>  gm_mgm_pause_op_err,
1921
                pause_dst_err =>  gm_mgm_pause_dst_err,
1922
                mac_err       =>  gm_mgm_mac_err,
1923
                end_err       =>  gm_mgm_end_err,
1924
                jumbo_en      =>  jumbo_enable,
1925
                data_only     =>  '0',
1926
                frm_rcvd      =>  gm_mgm_frm_rcvd );
1927
 
1928
        m_tx_data_tmp <= "0000"& m_tx_data ;
1929
 
1930
        MII_MON: ethmonitor2 port map (
1931
 
1932
                reset           => reset ,
1933
                tx_clk          => tx_clk ,
1934
                txd             => m_tx_data_tmp ,
1935
                tx_dv           => m_tx_en ,
1936
                tx_er           => m_tx_err ,
1937
                tx_sop          => '0' ,
1938
                tx_eop          => '0' ,
1939
                ethernet_speed  => ethernet_mode,
1940
                mii_mode        => '1' ,
1941
                rgmii_mode      => '0' ,
1942
                dst             => m_mgm_dst,
1943
                src             => m_mgm_src,
1944
                prmble_len      => m_mgm_prmble_len,
1945
                pquant          => m_mgm_pquant,
1946
                vlan_ctl        => m_mgm_vlan_ctl,
1947
                len             => m_mgm_len,
1948
                frmtype         => m_mgm_frmtype,
1949
                payload         => m_mgm_payload,
1950
                payload_vld     => m_mgm_payload_vld,
1951
                is_vlan         => m_mgm_is_vlan,
1952
                is_stack_vlan   => m_mgm_is_stack_vlan,
1953
                is_pause        => m_mgm_is_pause,
1954
                crc_err         => m_mgm_crc_err,
1955
                prmbl_err       => m_mgm_prmbl_err,
1956
                len_err         => m_mgm_len_err,
1957
                payload_err     => m_mgm_payload_err,
1958
                frame_err       => m_mgm_frame_err,
1959
                pause_op_err    => m_mgm_pause_op_err,
1960
                pause_dst_err   => m_mgm_pause_dst_err,
1961
                mac_err         => m_mgm_mac_err,
1962
                end_err         => m_mgm_end_err,
1963
                jumbo_en        => jumbo_enable,
1964
                data_only       => '0',
1965
                frm_rcvd        => m_mgm_frm_rcvd );
1966
 
1967
        end generate;
1968
 
1969
 
1970
    RGMII_MON_BLOCK: if( REDUCED_INTERFACE_ENA=1) generate  -- use RX Frame generator
1971
 
1972
    gm_tx_data <= X"00";
1973
    gm_tx_en <= '0';
1974
    gm_tx_err <= '0';
1975
 
1976
    rgm_tx_data <= "0000"&rgmii_tx_data;
1977
    rgm_tx_en   <= rgmii_tx_ctnl;
1978
 
1979
 
1980
            RGMII_MON: ethmonitor2 port map (
1981
 
1982
                reset           => reset ,
1983
                tx_clk          => tx_clk ,
1984
                txd             => rgm_tx_data ,
1985
                tx_dv              => rgm_tx_en ,
1986
                tx_er           => '0' ,
1987
                tx_sop          => '0' ,
1988
                tx_eop          => '0' ,
1989
                ethernet_speed  => ethernet_mode,
1990
                mii_mode        => '0' ,
1991
                rgmii_mode      => '1' ,
1992
                dst             => gm_mgm_dst,
1993
                src             => gm_mgm_src,
1994
                prmble_len      => gm_mgm_prmble_len,
1995
                pquant          => gm_mgm_pquant,
1996
                vlan_ctl        => gm_mgm_vlan_ctl,
1997
                len             => gm_mgm_len,
1998
                frmtype         => gm_mgm_frmtype,
1999
                payload         => gm_mgm_payload,
2000
                payload_vld     => gm_mgm_payload_vld,
2001
                is_vlan         => gm_mgm_is_vlan,
2002
                is_stack_vlan   => gm_mgm_is_stack_vlan,
2003
                is_pause        => gm_mgm_is_pause,
2004
                crc_err         => gm_mgm_crc_err,
2005
                prmbl_err       => gm_mgm_prmbl_err,
2006
                len_err         => gm_mgm_len_err,
2007
                payload_err     => gm_mgm_payload_err,
2008
                frame_err       => gm_mgm_frame_err,
2009
                pause_op_err    => gm_mgm_pause_op_err,
2010
                pause_dst_err   => gm_mgm_pause_dst_err,
2011
                mac_err         => gm_mgm_mac_err,
2012
                end_err         => gm_mgm_end_err,
2013
                jumbo_en        => jumbo_enable,
2014
                data_only       => '0',
2015
                frm_rcvd        => gm_mgm_frm_rcvd );
2016
        end generate;
2017
 
2018
 
2019
 
2020
        mgm_dst              <= m_mgm_dst when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_dst ;
2021
        mgm_src              <= m_mgm_src when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_src;
2022
        mgm_prmble_len       <= m_mgm_prmble_len when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_prmble_len;
2023
        mgm_pquant           <= m_mgm_pquant when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_pquant;
2024
        mgm_vlan_ctl         <= m_mgm_vlan_ctl when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_vlan_ctl;
2025
        mgm_len              <= m_mgm_len when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_len;
2026
        mgm_frmtype          <= m_mgm_frmtype when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_frmtype;
2027
        mgm_payload          <= m_mgm_payload when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_payload;
2028
        mgm_payload_vld      <= m_mgm_payload_vld when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_payload_vld;
2029
        mgm_is_vlan          <= m_mgm_is_vlan when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_is_vlan;
2030
        mgm_is_stack_vlan    <= m_mgm_is_stack_vlan when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_is_stack_vlan;
2031
        mgm_is_pause         <= m_mgm_is_pause when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_is_pause;
2032
        mgm_crc_err          <= m_mgm_crc_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_crc_err;
2033
        mgm_prmbl_err        <= m_mgm_prmbl_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_prmbl_err;
2034
        mgm_len_err          <= m_mgm_len_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_len_err;
2035
        mgm_payload_err      <= m_mgm_payload_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_payload_err;
2036
        mgm_frame_err        <= m_mgm_frame_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_frame_err;
2037
        mgm_pause_op_err     <= m_mgm_pause_op_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_pause_op_err;
2038
        mgm_pause_dst_err    <= m_mgm_pause_dst_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_pause_dst_err;
2039
        mgm_mac_err          <= m_mgm_mac_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_mac_err;
2040
        mgm_end_err          <= m_mgm_end_err when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0') else gm_mgm_end_err;
2041
        mgm_frm_rcvd         <= m_mgm_frm_rcvd when (REDUCED_INTERFACE_ENA=0 and ethernet_mode = '0' and tx_col_reg='0') else gm_mgm_frm_rcvd;
2042
 
2043
   -- Frame generator feeds TX FIFO (simulate user application) 
2044
   -- ---------------------------------------------------------
2045
 
2046
        FF_GEN_32: ethgenerator32
2047
 
2048
                generic map (
2049
 
2050
                        THOLD           => 2 ns,
2051
                        ENABLE_SHIFT16  => ENABLE_SHIFT16,
2052
                        ZERO_LATENCY    => ENABLE_MACLITE)
2053
 
2054
                port map (
2055
 
2056
                        reset           => reset ,
2057
                        clk             => ff_tx_clk ,
2058
                        enable          => ff_tx_rdy ,
2059
                        dout            => ff_tx_data ,
2060
                        dval            => ff_tx_wren_gen ,
2061
                        derror          => ff_tx_err ,
2062
                        sop             => ff_tx_sop ,
2063
                        eop             => ff_tx_eop ,
2064
                        tmod            => ff_tx_mod ,
2065
                        mac_reverse     => ff_mac_reverse ,
2066
                        dst             => ff_dst ,
2067
                        src             => ff_src ,
2068
                        prmble_len      => ff_prmble_len ,
2069
                        pquant          => ff_pquant ,
2070
                        vlan_ctl        => ff_vlan_ctl ,
2071
                        len             => ff_len ,
2072
                        frmtype         => ff_frmtype ,
2073
                        cntstart        => ff_cntstart ,
2074
                        cntstep         => ff_cntstep ,
2075
                        ipg_len         => ff_ipg_len ,
2076
                        payload_err     => ff_payload_err ,
2077
                        prmbl_err       => ff_prmbl_err ,
2078
                        crc_err         => ff_crc_err ,
2079
                        vlan_en         => ff_vlan_en ,
2080
                        stack_vlan      => ff_stack_vlan_en ,
2081
                        pause_gen       => '0' ,
2082
                        pad_en          => ff_pad_en ,
2083
                        phy_err         => ff_phy_err ,
2084
                        end_err         => ff_end_err ,
2085
                        data_only       => '1' ,
2086
                        start           => ff_start_ether_gen ,
2087
                        done            => ff_ether_gen_done) ;
2088
 
2089
   -- FIFO Monitor RX (user appl)
2090
   -- ----------------------------
2091
 
2092
        FF_MON_32: top_ethmonitor32
2093
 
2094
        generic map(
2095
 
2096
                 ENABLE_SHIFT16  => ENABLE_SHIFT16)
2097
 
2098
        port map (
2099
 
2100
                reset           => reset ,
2101
                clk             => ff_rx_clk ,
2102
                din             => ff_rx_data ,
2103
                dval            => ff_rx_dval ,
2104
                derror          => '0' ,
2105
                sop             => ff_rx_sop ,
2106
                eop             => ff_rx_eop ,
2107
                tmod            => ff_rx_mod ,
2108
                dst             => mff_dst ,
2109
                src             => mff_src ,
2110
                prmble_len      => mff_prmble_len ,
2111
                pquant          => mff_pquant ,
2112
                vlan_ctl        => mff_vlan_ctl ,
2113
                len             => mff_len ,
2114
                frmtype         => mff_frmtype ,
2115
                payload         => mff_payload ,
2116
                payload_vld     => mff_payload_vld ,
2117
                is_vlan         => mff_is_vlan ,
2118
                is_stack_vlan   => mff_is_stack_vlan ,
2119
                is_pause        => mff_is_pause ,
2120
                crc_err         => mff_crc_err ,
2121
                prmbl_err       => mff_prmbl_err ,
2122
                len_err         => mff_len_err ,
2123
                payload_err     => mff_payload_err ,
2124
                frame_err       => mff_frame_err ,
2125
                pause_op_err    => mff_pause_op_err ,
2126
                pause_dst_err   => mff_pause_dst_err ,
2127
                mac_err         => mff_mac_err ,
2128
                end_err         => mff_end_err ,
2129
                jumbo_en        => jumbo_enable ,
2130
                data_only       => '1' ,
2131
                frm_rcvd        => mff_frm_rcvd) ;
2132
 
2133
   -- Ethernet Generator GMII RX model configuration
2134
   -- ------------------------------------------------
2135
 
2136
        gm_mac_reverse  <= '0' ;
2137
        gm_src          <= X"0E1122334450" ;
2138
        gm_prmble_len   <= 8 ;
2139
        gm_pquant       <= conv_std_logic_vector(TB_MODPAUSEQ, 16) ;
2140
        gm_vlan_ctl     <= X"1234" ;
2141
        gm_frmtype      <= X"0000" ;
2142
        gm_cntstart     <= 0 ;
2143
        gm_cntstep      <= 1 ;
2144
        gm_payload_err  <= '1' when((rxframe_cnt mod  45) = 7 and gm_dst/=X"FFFFFFFFFFFF" and gm_phy_err='0' and TB_MACFWDCRC=FALSE) else '0' ;
2145
        gm_prmbl_err    <= '0' ;
2146
        gm_crc_err      <= '0' ;--'1' when((rxframe_cnt mod  15) = 1 and gm_phy_err='0' and gm_pause_gen='0') else '0';
2147
        gm_vlan_en      <= '1' when(TB_ENA_VLAN>0 and (rxframe_cnt mod TB_ENA_VLAN) = TB_ENA_VLAN-1) else '0';
2148
        gm_stack_vlan_en<= '1' when(TB_ENA_VLAN>0 and (rxframe_cnt mod (2*TB_ENA_VLAN)) = TB_ENA_VLAN-1) else '0';
2149
        gm_pad_en       <= '1' when TB_ENA_PADDING=true else '0';
2150
        gm_phy_err      <= '1' when((rxframe_cnt mod  61) = 17 and gm_pause_gen='0' and gm_vlan_en='0') else '0';
2151
        gm_end_err      <= '0';
2152
        gm_pause_gen    <= '1' when((rxframe_cnt mod  23) = 13 and HD_ENA=FALSE) else '0';
2153
        gm_magic        <= '1' when (rxframe_cnt=TB_RXFRAMES and nextstate=GEN_MAGIC) else '0' ;
2154
 
2155
   -- FIFO Generator model configuration (user application TX)
2156
   -- -----------------------------------------------------
2157
 
2158
        ff_mac_reverse          <= '0' ;
2159
        ff_dst                  <= X"EE1122334450" ;
2160
        ff_src                  <= X"AA6655443322" ;
2161
        ff_prmble_len           <= 8 ;
2162
        ff_pquant               <= conv_std_logic_vector(200, 16) ;
2163
        ff_vlan_ctl             <= X"1234" ;
2164
        ff_frmtype              <= X"0000" ;
2165
        ff_cntstart             <= 0 ;
2166
        ff_cntstep              <= 1 ;
2167
        ff_ipg_len              <= 0 ;
2168
        ff_payload_err          <= '0' ;
2169
        ff_prmbl_err            <= '0' ;
2170
        ff_crc_err              <= '0' ;
2171
        ff_vlan_en              <= '1' when( TB_ENA_VLAN>0 and (txframe_cnt mod  TB_ENA_VLAN)     = TB_ENA_VLAN-1) else '0';
2172
        ff_stack_vlan_en        <= '1' when( TB_ENA_VLAN>0 and (txframe_cnt mod  (3*TB_ENA_VLAN)) = TB_ENA_VLAN-1) else '0';
2173
        ff_pad_en               <= '0' ;
2174
        ff_phy_err              <= '1' when (TB_TX_FF_ERR=TRUE) else '0' ;
2175
        ff_end_err              <= '0' ;
2176
 
2177
   -- --------------------------------------------------------------------------------    
2178
   -- TX PATH Simulation
2179
   -- --------------------------------------------------------------------------------    
2180
 
2181
        ff_tx_wren    <= ff_tx_wren_gen ; --and ff_tx_clk_gen_en;   -- and stop writing during hold
2182
 
2183
        ff_start_ether_gen <= '1' after 1 us when (state=SIM and sim_start='1' and txsim_done='0' and txframe_cnt < TB_TXFRAMES and HD_ENA=FALSE and ENA_INVERT_LB=FALSE) else
2184
                              '1' after 1 us when (state=SIM and sim_start='1' and txsim_done='0' and rxframe_cnt >= TB_RXFRAMES and txframe_cnt < TB_TXFRAMES and HD_ENA=TRUE and ENA_INVERT_LB=FALSE) else '0'; -- START Generator
2185
 
2186
        process( reset, ff_tx_clk )
2187
 
2188
                variable ln: integer;
2189
 
2190
        begin
2191
 
2192
                if( reset='1' ) then
2193
 
2194
                        txframe_cnt             <= 0;
2195
                        tx_vlan_sent            <= 0;
2196
                        tx_stack_vlan_sent      <= 0;
2197
                        tx_payload_err_sent     <= 0;
2198
                        tx_good_sent            <= 0;
2199
                        txsim_done              <= '0';
2200
                        ff_tx_clk_gen_en        <= '1';
2201
                        ff_len                  <= conv_std_logic_vector(TB_LENSTART, 16);
2202
 
2203
                elsif( ff_tx_clk'event and ff_tx_clk='1' ) then
2204
 
2205
                   -- FIFO frame generator simulation finished
2206
 
2207
                        if (ENA_INVERT_LB=TRUE and txframe_cnt >= TB_RXFRAMES) then
2208
 
2209
                                txsim_done <= '1'; -- STOP after last frame sent        
2210
 
2211
                        elsif( (txframe_cnt >= TB_TXFRAMES and (gm_txcnt-tx_pause_rcvd) >= TB_TXFRAMES) and ff_ether_gen_done='1') then
2212
 
2213
                                txsim_done <= '1'; -- STOP after last frame sent
2214
 
2215
                        end if;
2216
 
2217
                   -- configure generator for every frame
2218
 
2219
                        if (ENA_INVERT_LB=TRUE) then
2220
 
2221
                                txframe_cnt <= TB_RXFRAMES ;
2222
 
2223
                        elsif( ff_tx_sop='1' and ff_tx_wren_gen='1' and ((ff_tx_clk_gen_en='1' and ENABLE_MACLITE = 1) or ENABLE_MACLITE = 0)) then
2224
 
2225
                                txframe_cnt  <= txframe_cnt + 1;                       -- TX FRAMEs sent to FIFO
2226
 
2227
                           -- increment payload length  
2228
 
2229
                                ln := (conv_integer( ff_len ) + TB_LENSTEP) mod (TB_LENMAX+1);  -- increment length for next frame
2230
 
2231
                                if (ln < 0) then  -- incase increment was negative
2232
 
2233
                                        ln := TB_LENMAX;
2234
 
2235
                                end if;
2236
 
2237
                                ff_len <= conv_std_logic_vector(ln,16);
2238
 
2239
                           -- update counters
2240
 
2241
                                if( ff_vlan_en='1' and ff_stack_vlan_en='0') then
2242
 
2243
                                        tx_vlan_sent <= tx_vlan_sent+1;
2244
 
2245
                                end if;
2246
 
2247
                                if(  ff_vlan_en='1' and  ff_stack_vlan_en='1' ) then
2248
 
2249
                                        tx_stack_vlan_sent <= tx_stack_vlan_sent+1;
2250
 
2251
                                end if;
2252
 
2253
                                if( ff_payload_err='1' ) then
2254
 
2255
                                        tx_payload_err_sent <= tx_payload_err_sent+1;
2256
 
2257
                                end if;
2258
 
2259
                                if( ff_frmtype=X"0000" and ff_phy_err = '0' and ff_end_err = '0') then
2260
 
2261
                                        tx_good_sent <= tx_good_sent+1;
2262
 
2263
                                end if;
2264
 
2265
                        end if;
2266
 
2267
                elsif( ff_tx_clk'event and ff_tx_clk='0' ) then
2268
 
2269
                        ff_tx_clk_gen_en <= ff_tx_rdy;               -- stop the generator clock if the FIFO signals "full"
2270
 
2271
                end if;
2272
 
2273
        end process;
2274
 
2275
   -- GMII TX Monitor counters
2276
   -- ------------------------
2277
 
2278
        process( reset, tx_clk )
2279
        begin
2280
 
2281
                if( reset='1' ) then
2282
 
2283
                        tx_good_rcvd       <= 0;        -- should be same as good_sent at end of test
2284
                        tx_pause_rcvd      <= 0;
2285
                        tx_pause_err_rcvd  <= 0;
2286
                        tx_align_err_rcvd  <= 0;        -- should NEVER happen
2287
                        tx_vlan_rcvd       <= 0;        -- received by monitor
2288
                        tx_stack_vlan_rcvd <= 0;        -- received by monitor
2289
                        tx_phy_err_rcvd    <= 0;        -- GMII tx error signal detected
2290
                        tx_payload_err_rcvd<= 0;
2291
                        tx_wrong_src_rcvd  <= 0;
2292
                        tx_crc_err_rcvd    <= 0;
2293
                        gm_txcnt           <= 0;
2294
 
2295
                elsif( tx_clk'event and tx_clk='1' and mgm_frm_rcvd='1' ) then
2296
 
2297
                        gm_txcnt <= gm_txcnt+1 ;
2298
 
2299
                        if( mgm_is_vlan='1' and mgm_is_stack_vlan='0') then
2300
 
2301
                                tx_vlan_rcvd <= tx_vlan_rcvd+1;
2302
 
2303
                        end if;
2304
 
2305
                        if( mgm_is_vlan='1' and mgm_is_stack_vlan='1' ) then
2306
 
2307
                                tx_stack_vlan_rcvd <= tx_stack_vlan_rcvd+1;
2308
 
2309
                        end if;
2310
 
2311
                        if( mgm_prmbl_err='1') then
2312
 
2313
                                tx_align_err_rcvd <= tx_align_err_rcvd+1;
2314
 
2315
                        end if;
2316
 
2317
                        if( mgm_mac_err='1') then
2318
 
2319
                                tx_phy_err_rcvd <= tx_phy_err_rcvd+1;
2320
 
2321
                        end if;
2322
 
2323
                        if( mgm_payload_err='1') then
2324
 
2325
                                tx_payload_err_rcvd <= tx_payload_err_rcvd+1;
2326
 
2327
                        end if;
2328
 
2329
                        if( mgm_crc_err='1') then
2330
 
2331
                                tx_crc_err_rcvd <= tx_crc_err_rcvd+1;
2332
 
2333
                        end if;
2334
 
2335
                        if( mgm_is_pause='1') then
2336
 
2337
                                if( mgm_pause_op_err='0' and mgm_pause_dst_err='0' and mgm_frame_err='0') then
2338
 
2339
                                        tx_pause_rcvd <= tx_pause_rcvd+1;
2340
 
2341
                                else
2342
 
2343
                                        tx_pause_err_rcvd <= tx_pause_err_rcvd+1;
2344
 
2345
                                end if;
2346
 
2347
                        end if;
2348
 
2349
                        if(mgm_crc_err      ='0' and
2350
                           mgm_prmbl_err    ='0' and
2351
                           mgm_len_err      ='0' and
2352
                           mgm_frame_err    ='0' and
2353
                           mgm_is_pause     ='0' and       -- ignore pause frames
2354
                           mgm_mac_err      ='0' and
2355
                           mgm_end_err      ='0' ) then
2356
 
2357
                                tx_good_rcvd <= tx_good_rcvd+1;
2358
 
2359
                                if (ENABLE_SUP_ADDR=0) then
2360
 
2361
                                        if( mgm_src /= mac_addr and TB_MACINSERT_ADDR and ENABLE_MAC_TXADDR_SET=1) then
2362
 
2363
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2364
 
2365
                                        elsif( mgm_src /= ff_src and not(TB_MACINSERT_ADDR) and ENABLE_MAC_TXADDR_SET=1) then
2366
 
2367
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2368
 
2369
                                        end if;
2370
 
2371
                                else
2372
 
2373
                                        if (TB_ADDR_SEL=4 and TB_MACINSERT_ADDR and mgm_src/=sup_mac_addr_0 and ENABLE_MAC_TXADDR_SET=1) then
2374
 
2375
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2376
 
2377
                                        elsif (TB_ADDR_SEL=5 and TB_MACINSERT_ADDR and mgm_src/=sup_mac_addr_1 and ENABLE_MAC_TXADDR_SET=1) then
2378
 
2379
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2380
 
2381
                                        elsif (TB_ADDR_SEL=6 and TB_MACINSERT_ADDR and mgm_src/=sup_mac_addr_2 and ENABLE_MAC_TXADDR_SET=1) then
2382
 
2383
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2384
 
2385
                                        elsif (TB_ADDR_SEL=7 and TB_MACINSERT_ADDR and mgm_src/=sup_mac_addr_3 and ENABLE_MAC_TXADDR_SET=1) then
2386
 
2387
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2388
 
2389
                                        elsif (TB_ADDR_SEL=0 and TB_MACINSERT_ADDR and mgm_src/=mac_addr and ENABLE_MAC_TXADDR_SET=1) then
2390
 
2391
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2392
 
2393
                                        elsif ( mgm_src /= ff_src and not(TB_MACINSERT_ADDR)) then
2394
 
2395
                                                tx_wrong_src_rcvd <= tx_wrong_src_rcvd+1;
2396
 
2397
                                        end if ;
2398
 
2399
                                end if ;
2400
 
2401
                        end if;
2402
 
2403
                end if;
2404
 
2405
        end process ;
2406
 
2407
   -- -----------------------------------------------------------------------------------
2408
   -- TX/RX Pause Frame control block
2409
   -- -----------------------------------------------------------------------------------
2410
 
2411
        process(reset, tx_clk)
2412
 
2413
                variable cnt : integer;
2414
 
2415
        begin
2416
 
2417
                if( reset='1') then
2418
 
2419
                        tx_pause_wait <= '0';
2420
                        tx_pause_cnt  <= 0;
2421
 
2422
                elsif(tx_clk'event and tx_clk='1') then
2423
 
2424
                        if( tx_pause_cnt /= 0 ) then
2425
 
2426
                                if( gm_ether_gen_done='1' ) then      -- wait for TX to finish current frame
2427
 
2428
                                        tx_pause_cnt <= tx_pause_cnt-1;
2429
 
2430
                                end if;
2431
 
2432
                        else
2433
 
2434
                                tx_pause_wait <= '0';
2435
 
2436
                        end if;
2437
 
2438
                        if(mgm_frm_rcvd='1' and mgm_is_pause='1' and mgm_frame_err='0' and mgm_crc_err='0' and
2439
                           TB_PAUSECONTROL=true) then
2440
 
2441
                                cnt := conv_integer( '0' & mgm_pquant);
2442
                                cnt := cnt * 64;
2443
 
2444
                                tx_pause_cnt  <= cnt;         -- set pause counter
2445
                                tx_pause_wait <= '1';        -- stop TX
2446
 
2447
                        end if;
2448
 
2449
                end if;
2450
 
2451
        end process;
2452
 
2453
   -- force generated pause frame
2454
   -- ---------------------------        
2455
 
2456
        process(reset, tx_clk)
2457
        begin
2458
 
2459
                if( reset='1') then
2460
 
2461
                        force_xoff_pause_cnt <= 0;
2462
                        force_xon_pause_cnt  <= 0;
2463
                        xoff_gen             <= '0';
2464
                        xon_gen              <= '0' ;
2465
 
2466
                elsif(tx_clk'event and tx_clk='1') then
2467
 
2468
                   -- Xoff Frame Generation
2469
                   -- ---------------------
2470
 
2471
                        if (force_xoff_pause_cnt < TB_TRIGGERXOFF and state=SIM) then
2472
 
2473
                                force_xoff_pause_cnt <= force_xoff_pause_cnt + 1 ;
2474
 
2475
                        elsif (force_xoff_pause_cnt=TB_TRIGGERXOFF and ETH_SPEED=1000 and state=SIM) then
2476
 
2477
                                force_xoff_pause_cnt <= force_xoff_pause_cnt + 1 ;
2478
 
2479
                        elsif ((force_xoff_pause_cnt=TB_TRIGGERXOFF or force_xoff_pause_cnt=TB_TRIGGERXOFF-1) and eth_mode/=1000 and state=SIM) then
2480
 
2481
                                force_xoff_pause_cnt <= force_xoff_pause_cnt + 1;
2482
 
2483
                        end if ;
2484
 
2485
                        if (TB_TRIGGERXOFF=0 or HD_ENA=TRUE or ETH_SPEED=10 or ETH_SPEED=100) then
2486
 
2487
                                xoff_gen <= '0' ;
2488
 
2489
                        elsif (force_xoff_pause_cnt=TB_TRIGGERXOFF and ETH_SPEED=1000 and state=SIM) then
2490
 
2491
                                xoff_gen <= '1' ;
2492
 
2493
                        elsif (state=SIM and (force_xoff_pause_cnt= TB_TRIGGERXOFF or force_xoff_pause_cnt=TB_TRIGGERXOFF-1) and (eth_mode=100 or eth_mode=10)) then
2494
 
2495
                                xoff_gen <= '1' ;
2496
 
2497
                        else
2498
 
2499
                                xoff_gen <= '0' ;
2500
 
2501
                        end if ;
2502
 
2503
                   -- Xon Frame Generation
2504
                   -- --------------------
2505
 
2506
                        if (force_xon_pause_cnt < TB_TRIGGERXON and state=SIM) then
2507
 
2508
                                force_xon_pause_cnt <= force_xon_pause_cnt + 1 ;
2509
 
2510
                        elsif (force_xon_pause_cnt=TB_TRIGGERXON and ETH_SPEED=1000 and state=SIM) then
2511
 
2512
                                force_xon_pause_cnt <= force_xon_pause_cnt + 1 ;
2513
 
2514
                        elsif ((force_xon_pause_cnt=TB_TRIGGERXON or force_xon_pause_cnt=TB_TRIGGERXON-1) and eth_mode/=1000 and state=SIM) then
2515
 
2516
                                force_xon_pause_cnt <= force_xon_pause_cnt + 1;
2517
 
2518
                        end if ;
2519
 
2520
                        if (TB_TRIGGERXON=0 or HD_ENA=TRUE or ETH_SPEED=10 or ETH_SPEED=100) then
2521
 
2522
                                xon_gen <= '0' ;
2523
 
2524
                        elsif (force_xon_pause_cnt=TB_TRIGGERXON and ETH_SPEED=1000 and state=SIM) then
2525
 
2526
                                xon_gen <= '1' ;
2527
 
2528
                        elsif (state=SIM and (force_xon_pause_cnt= TB_TRIGGERXON or force_xon_pause_cnt=TB_TRIGGERXON-1) and (eth_mode=100 or eth_mode=10)) then
2529
 
2530
                                xon_gen <= '1' ;
2531
 
2532
                        else
2533
 
2534
                                xon_gen <= '0' ;
2535
 
2536
                        end if ;
2537
 
2538
                end if;
2539
 
2540
        end process;
2541
 
2542
   -- -----------------------------------------------------------------------------------
2543
   -- RX PATH Simulation
2544
   -- -----------------------------------------------------------------------------------
2545
 
2546
        rx_is_good_frame <= (gm_prmbl_err='0') and
2547
                            (gm_crc_err='0') and
2548
                            (gm_phy_err='0') and
2549
                            (gm_end_err='0') and
2550
                            (gm_pad_en='1' or (gm_len >= 42 and gm_vlan_en='1') or
2551
                                              (gm_len >= 38 and gm_stack_vlan_en='1') or
2552
                                              (gm_len >= 46 and gm_vlan_en='0')
2553
                                              ) and
2554
                            --((gm_vlan_en='1' and gm_len < (frm_length_max-21)) or
2555
                            --(gm_stack_vlan_en='1' and gm_len < (frm_length_max-25)) or 
2556
                            --(gm_vlan_en='0' and gm_len < (frm_length_max-17)) or 
2557
                            (gm_len < (frm_length_max-17) or
2558
                            gm_pause_gen='1' );
2559
 
2560
        rx_is_good_addr  <= (promis_en='1') or (promis_en='0' and (
2561
                            (gm_dst(0)='0' and (mac_addr = gm_dst or sup_mac_addr_0 = gm_dst or sup_mac_addr_1 = gm_dst or sup_mac_addr_2 = gm_dst or sup_mac_addr_3 = gm_dst) ) or
2562
                            (gm_dst(0)='1' and (gm_dst = X"FFFFFFFFFFFF")) or
2563
                            (gm_dst(0)='1' and gm_pause_gen='0' and (multicast_wrong=false)) ) );
2564
 
2565
 
2566
    -- Stop detection and frame counter increment
2567
    -- --------------
2568
 
2569
    gm_start_ether_gen <= '1' when (state=SIM and tx_pause_wait='0' and
2570
                                    sim_start='1' and rxsim_done='0' and
2571
                                    rxframe_cnt < TB_RXFRAMES) else
2572
                          '1' when (nextstate=GEN_MAGIC and rxframe_cnt=TB_RXFRAMES)  else '0';
2573
 
2574
    m_start_ether_gen <= '1' when (state=SIM and tx_pause_wait='0' and
2575
                                    sim_start='1' and rxsim_done='0' and
2576
                                    rxframe_cnt < TB_RXFRAMES and ethernet_mode='0' and REDUCED_INTERFACE_ENA = 0) else
2577
                         '1' when (nextstate=GEN_MAGIC and rxframe_cnt=TB_RXFRAMES and ethernet_mode='0' and REDUCED_INTERFACE_ENA = 0)  else '0';
2578
 
2579
    process( reset, rx_clk_tb )
2580
 
2581
        variable ln : integer;
2582
 
2583
    begin
2584
        if( reset='1' ) then
2585
 
2586
            rxframe_cnt <= 0;
2587
            rxsim_done  <= '0';
2588
            gm_len  <= conv_std_logic_vector(TB_LENSTART, 16);  -- generated packets len
2589
            gm_eop_dly  <= '0';
2590
            gm_sop_dly  <= '0';
2591
            gm_sop_dly2 <= '0';
2592
 
2593
        elsif( rx_clk_tb'event and rx_clk_tb='1' ) then
2594
 
2595
            gm_eop_dly <= gm_eop;
2596
            gm_sop_dly <= gm_sop;
2597
            gm_sop_dly2<= gm_sop_dly;
2598
 
2599
        -- non loopback mode
2600
            if( gm_ether_gen_done='1' and rxframe_cnt >= TB_RXFRAMES and TB_RXFRAMES /= 0) then    -- last frame has been generated
2601
 
2602
 
2603
                rxsim_done <= '1';
2604
 
2605
            end if;
2606
 
2607
        -- loopback mode
2608
        if( gm_ether_gen_done='1' and rx_good_rcvd >= TB_RXFRAMES) then    -- last frame has been generated
2609
 
2610
                rxsim_done <= '1';
2611
 
2612
            end if;
2613
 
2614
 
2615
 
2616
 
2617
 
2618
            if (nextstate=GEN_MAGIC) then
2619
 
2620
                gm_len <= conv_std_logic_vector(42,16);
2621
 
2622
        elsif(gm_eop_dly='1') then
2623
            rxframe_cnt <= rxframe_cnt+1;
2624
            elsif( gm_sop_dly='1') then
2625
 
2626
                --rxframe_cnt <= rxframe_cnt+1;
2627
                ln     := (conv_integer( gm_len ) + TB_LENSTEP) mod (TB_LENMAX+1);  -- increment length for next frame
2628
 
2629
                if(ln < 0) then  -- incase increment was negative
2630
                        ln := TB_LENMAX;
2631
                end if;
2632
 
2633
                gm_len <= conv_std_logic_vector(ln,16);
2634
 
2635
            end if;
2636
 
2637
        end if;
2638
 
2639
    end process;
2640
 
2641
   -- Inter-Packet Gap Counter
2642
   -- ------------------------
2643
 
2644
        process( reset, rx_clk_tb)
2645
 
2646
                variable cnt      : integer ;
2647
                variable free_cnt : integer range 0 to 15 ;
2648
 
2649
        begin
2650
 
2651
                if( reset='1' ) then
2652
 
2653
                        gm_ipg_cnt <=  TB_RXIPG-1 ;
2654
 
2655
                elsif (rx_clk_tb='1') and (rx_clk_tb'event) then
2656
 
2657
                        free_cnt := (free_cnt+1) mod 16 ;
2658
 
2659
                        if (TB_ENA_VAR_IPG=TRUE) then
2660
 
2661
                                if( gm_sop_dly='1') then
2662
 
2663
                                        cnt := gm_ipg_cnt+free_cnt ;
2664
 
2665
                                end if ;
2666
 
2667
                                if (cnt<0) then
2668
 
2669
                                        cnt := TB_RXIPG-1 ;
2670
 
2671
                                end if ;
2672
 
2673
                                if (cnt>47) then
2674
 
2675
                                        cnt := TB_RXIPG-1 ;
2676
 
2677
                                end if ;
2678
 
2679
                                gm_ipg_cnt <= cnt ;
2680
 
2681
                        else
2682
 
2683
                                gm_ipg_cnt <= TB_RXIPG-1 ;
2684
 
2685
                        end if ;
2686
 
2687
                end if ;
2688
 
2689
        end process ;
2690
 
2691
   -- Total (Including Collision) Frames
2692
   -- ----------------------------------
2693
 
2694
        process(reset, tx_clk)
2695
        begin
2696
 
2697
                if (reset='1') then
2698
 
2699
                        tx_frm_all <= 0 ;
2700
 
2701
                elsif (tx_clk='1') and (tx_clk'event) then
2702
 
2703
                        if (m_mgm_frm_rcvd='1') then
2704
 
2705
                                tx_frm_all <= tx_frm_all+1 ;
2706
 
2707
                        end if ;
2708
 
2709
                end if ;
2710
 
2711
        end process ;
2712
 
2713
    -- Expected signals: decide when we should expect something to happen
2714
    -- ------------------------------------------------------------------
2715
 
2716
    process( rx_clk_tb, reset )
2717
    begin
2718
        if( reset='1' ) then
2719
 
2720
            expect1     <= '0';
2721
            expect2     <= '0';
2722
 
2723
        elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
2724
 
2725
            if( gm_sop='1' and expect2='0' ) then
2726
 
2727
                expect2     <= '1';  -- immediately expect something
2728
                expect1     <= '0';  -- and nothing else
2729
 
2730
            elsif( gm_sop='1' ) then
2731
 
2732
                expect1     <= '1';  -- ok, when done later, immediately expect something else coming
2733
 
2734
            end if;
2735
 
2736
            -- if a final event happend that indicates that something was received and
2737
            -- therefore some expected behaviour occured we can continue to watch
2738
            -- for new expected data
2739
 
2740
            if( pause_rcv='1' or       -- has no status fifo write
2741
                frm_type_err='1' or    -- has no status fifo write (but should have, can strip down pipeline: TODO !!!!!)
2742
                frm_align_err='1' or   -- has no status fifo write 
2743
                ff_rx_eop='1') then    -- was: rx_stat_wren
2744
 
2745
 
2746
                if( frm_align_err='1' and expect1='1' ) then
2747
 
2748
                    -- overlapped frame has an alignment error, but before the last frame
2749
                    -- has been checked... so we have to do special things here
2750
                    -- see alignment error checking behaviour.
2751
 
2752
                    expect1 <= '0';  -- clear it, as it is processed now already
2753
 
2754
                else
2755
 
2756
                    expect2     <='0';     -- pulse for at least 1 cycle    
2757
 
2758
                end if;
2759
 
2760
            end if;
2761
 
2762
            -- if a new expectation was already inserted before we were done with the old, 
2763
            -- immediately restart it now as we have processed the last expected (2)
2764
 
2765
            if( expect1='1' and expect2='0' ) then    -- there is something to expect !
2766
 
2767
                expect1 <= '0';
2768
                expect2 <= '1';
2769
 
2770
            end if;
2771
        end if;
2772
    end process;
2773
 
2774
    -- RX generator: vary the destination address of the generator
2775
 
2776
    process( rx_clk_tb, reset )
2777
        variable mdl : integer;
2778
    begin
2779
 
2780
        if( reset = '1' ) then
2781
 
2782
            gm_dst        <= mac_addr; -- (others => '0');
2783
            multicast_cnt <= 1;    -- dont put it to 0 as 0 is the PAUSE address
2784
 
2785
        elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
2786
 
2787
            if( gm_sop_dly2='1') then
2788
         -- if( gm_eop='1' and gm_eop_dly='0') then -- change it at end of sent
2789
 
2790
            mdl := rxframe_cnt mod 35;
2791
 
2792
            if( mdl = 7 ) then
2793
 
2794
                gm_dst <= X"AA123456789C";     -- different unicast mac address
2795
 
2796
            elsif( (mdl=12 or mdl=9 or mdl=20)) then
2797
 
2798
                gm_dst <= MCAST_ADDRESSLIST( multicast_cnt );
2799
 
2800
                if( multicast_cnt < MCAST_TABLEN-1 ) then
2801
                    multicast_cnt <= multicast_cnt+1;
2802
                    multicast_wrong <= false;
2803
 
2804
                else
2805
                    multicast_cnt <= 1;   -- dont use first which is PAUSE
2806
                    if (ENA_HASH = 1) then
2807
            multicast_wrong <= true;    -- send one wrong address on every wrap around
2808
                    end if;
2809
            gm_dst <= X"EEAB55EFF011";
2810
 
2811
                end if;
2812
 
2813
 
2814
            elsif( mdl = 31 or mdl=11) then
2815
 
2816
                gm_dst <= X"FFFFFFFFFFFF";     -- broadcast frame
2817
 
2818
            elsif (mdl=3) then
2819
 
2820
                if (ENABLE_SUP_ADDR=1) then
2821
 
2822
                        gm_dst <= sup_mac_addr_0;
2823
 
2824
                else
2825
 
2826
                        gm_dst <= mac_addr ;
2827
 
2828
                end if ;
2829
 
2830
            elsif (mdl=5) then
2831
 
2832
                if (ENABLE_SUP_ADDR=1) then
2833
 
2834
                        gm_dst <= sup_mac_addr_2;
2835
 
2836
                else
2837
 
2838
                        gm_dst <= mac_addr ;
2839
 
2840
                end if ;
2841
 
2842
            elsif (mdl=6) then
2843
 
2844
                if (ENABLE_SUP_ADDR=1) then
2845
 
2846
                        gm_dst <= sup_mac_addr_3;
2847
 
2848
                else
2849
 
2850
                        gm_dst <= mac_addr ;
2851
 
2852
                end if ;
2853
 
2854
            elsif (mdl=2) then
2855
 
2856
                if (ENABLE_SUP_ADDR=1) then
2857
 
2858
                        gm_dst <= sup_mac_addr_1;
2859
 
2860
                else
2861
 
2862
                        gm_dst <= mac_addr ;
2863
 
2864
                end if ;
2865
 
2866
            else
2867
 
2868
                gm_dst <= mac_addr ;
2869
 
2870
            end if;
2871
 
2872
            if( gm_pause_gen='1' ) then
2873
 
2874
                gm_dst <= X"010000c28001";
2875
 
2876
            end if;
2877
 
2878
         end if; -- gm_eop
2879
 
2880
            if (nextstate/=SIM) then
2881
 
2882
                gm_dst <= mac_addr ;
2883
 
2884
            end if ;
2885
 
2886
        end if;
2887
 
2888
    end process;
2889
 
2890
    -- ------------------------------------------------------------------- --
2891
    -- RX Generator: good frames with and without payload error statistics --
2892
    -- and all FIFO received error counters                                --
2893
    -- ------------------------------------------------------------------- --
2894
 
2895
    process( rx_clk_tb, reset )
2896
 
2897
        variable maxlen : integer;
2898
        variable payloadlen : integer;
2899
        variable payloadminlen : integer;
2900
 
2901
    begin
2902
        if( reset='1') then
2903
 
2904
            rx_good_sent <= 0;
2905
            rx_payload_err_sent <= 0;
2906
            rx_gmii_err_sent <= 0;
2907
 
2908
        elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
2909
 
2910
            if( gm_sop='1' and state=SIM) then
2911
 
2912
                -- determine maximum length of a good frame
2913
 
2914
                payloadlen    := conv_integer('0' & gm_len);
2915
                payloadminlen := 46;
2916
                maxlen        := payloadlen + 18;
2917
 
2918
                if (gm_stack_vlan_en='1' ) then
2919
                    --maxlen := maxlen + 8;
2920
                    payloadminlen := 38;
2921
                elsif( gm_vlan_en='1' ) then
2922
                    --maxlen := maxlen + 4;
2923
                    payloadminlen := 42;
2924
                end if;
2925
 
2926
                -- check if we send a good frame:
2927
                --    pause is not a good in this sense
2928
                --    wrong MAC address and non-promiscuous mode is not good in this sense       
2929
 
2930
                if( --(gm_frmtype   =0) and 
2931
                    (gm_prmble_len=8) and
2932
                    (maxlen <= conv_integer(frm_length_max)) and
2933
                    (gm_prmbl_err='0') and
2934
                    (gm_crc_err  ='0') and
2935
                    (gm_pause_gen='0') and
2936
                    ((gm_pad_en  ='1') or (payloadlen >= payloadminlen)) and -- padding off, but not necessary anyway ?
2937
                    (gm_phy_err  ='0') and
2938
                    (gm_end_err  ='0') and
2939
                    (    (gm_dst(0)='1' and gm_pause_gen='0' and multicast_wrong=false)
2940
                      or ((gm_dst(0)='0') and (mac_addr=gm_dst or sup_mac_addr_0=gm_dst or sup_mac_addr_1=gm_dst or sup_mac_addr_2=gm_dst or sup_mac_addr_3=gm_dst))
2941
                      or promis_en='1'
2942
                      or (gm_dst = X"FFFFFFFFFFFF") ) ) then  -- unicast address mismatch, or multicast always
2943
 
2944
                        rx_good_sent <= rx_good_sent + 1;
2945
 
2946
                        if( gm_payload_err='1' and gm_len>2) then
2947
 
2948
                            rx_payload_err_sent <= rx_payload_err_sent +1;
2949
 
2950
                        end if;
2951
 
2952
                end if;
2953
 
2954
                if( gm_phy_err='1' and rx_is_good_addr) then   -- ignore frames that will be discarded
2955
 
2956
                        if not(((gm_dst(0)='0') and (gm_dst /= mac_addr) and promis_en='0') or
2957
                                   ((gm_dst(0)='1') and multicast_wrong and gm_pause_gen='0' and promis_en='0' and gm_dst/=X"FFFFFFFFFFFF" ) or
2958
                                    (gm_prmbl_err='1') or
2959
                                    (gm_pause_gen='1') ) then
2960
 
2961
                                rx_gmii_err_sent <= rx_gmii_err_sent+1;
2962
 
2963
                        end if ;
2964
 
2965
                end if;
2966
 
2967
             end if; -- gm_sop
2968
 
2969
        end if; --clk
2970
    end process;
2971
 
2972
    -- FIFO INTERFACE receive statistics counters
2973
    -- ------------------------------------------
2974
 
2975
    process( ff_rx_clk, reset )
2976
    begin
2977
        if( reset='1' ) then
2978
 
2979
            rx_good_rcvd            <= 0;
2980
            rx_payload_err_rcvd     <= 0;
2981
            rx_wrong_status_rcvd    <= 0;
2982
            rx_length_err_rcvd      <= 0;
2983
            rx_crc_err_rcvd         <= 0;
2984
            rx_fifo_overflow_rcvd   <= 0;
2985
            rx_gmii_err_rcvd        <= 0;
2986
            rx_vlan_rcvd            <= 0;
2987
            rx_stack_vlan_rcvd      <= 0;
2988
            rx_broadcast_rcvd       <= 0;
2989
            rx_wrong_mac_rcvd       <= 0;
2990
            rx_multicast_rcvd       <= 0;
2991
            rx_non_discard_rcvd     <= 0;
2992
            last_err_stat           <= (others => '0' );
2993
            ff_last_length          <= (others => '0' );
2994
            rx_length_mismatch_rcvd <= 0;
2995
            ff_frmlen               <= 0;
2996
            rx_col_rcvd             <= 0 ;
2997
            mff_dst_reg             <= (others=>'0') ;
2998
            mff_is_pause_reg        <= '0' ;
2999
            mff_end_err_reg         <= '0' ;
3000
 
3001
        elsif( ff_rx_clk='1' and ff_rx_clk'event ) then
3002
 
3003
                mff_dst_reg      <= mff_dst ;
3004
                mff_is_pause_reg <= mff_is_pause ;
3005
                mff_end_err_reg  <= mff_end_err ;
3006
 
3007
          -- count number of bytes received for the frame
3008
          -- --------------------------------------------
3009
 
3010
             if(ff_rx_sop='1') then
3011
 
3012
                ff_frmlen <= 1;
3013
 
3014
             elsif(ff_rx_dval='1') then
3015
 
3016
                ff_frmlen <= ff_frmlen+1;
3017
 
3018
             end if;
3019
 
3020
             if (mff_frm_rcvd='1' and mff_end_err_reg='0' and TB_MACPADEN=TRUE) then
3021
 
3022
                    mff_rxcnt <= mff_rxcnt+1 ;
3023
 
3024
                    if(mff_payload_err='1') then
3025
 
3026
                        rx_payload_err_rcvd <= rx_payload_err_rcvd+1;
3027
 
3028
                    end if;
3029
 
3030
                  -- verify that the status word length field really matches what we find in the frame
3031
                  -- ---------------------------------------------------------------------------------
3032
 
3033
                    if( mff_len /= ff_last_length and mff_is_pause_reg='0') then
3034
 
3035
                        rx_length_mismatch_rcvd <= rx_length_mismatch_rcvd + 1;
3036
 
3037
                    end if;
3038
 
3039
                    if( last_err_stat="0000" ) then -- only good ones
3040
 
3041
                        if(mff_dst_reg=X"FFFFFFFFFFFF") then
3042
 
3043
                                rx_broadcast_rcvd <= rx_broadcast_rcvd+1;
3044
 
3045
                        elsif (ENABLE_SUP_ADDR=0) then
3046
 
3047
                                if(mff_dst_reg(0)='0' and mac_addr /= mff_dst_reg and sup_mac_addr_0 /= mff_dst_reg and sup_mac_addr_1 /= mff_dst_reg and sup_mac_addr_2 /= mff_dst_reg and sup_mac_addr_3 /= mff_dst_reg) then  -- unicast but not for me
3048
 
3049
                                        rx_wrong_mac_rcvd <= rx_wrong_mac_rcvd+1;
3050
 
3051
                                elsif(mff_dst_reg(0)='1' and mff_is_pause_reg='0') then  -- multicast, but not broadcast
3052
 
3053
                                        rx_multicast_rcvd <= rx_multicast_rcvd + 1;
3054
 
3055
                                end if;
3056
 
3057
                        else
3058
 
3059
                                if(mff_dst_reg(0)='0' and mac_addr /= mff_dst_reg and sup_mac_addr_0 /= mff_dst_reg and sup_mac_addr_1 /= mff_dst_reg and sup_mac_addr_2 /= mff_dst_reg and sup_mac_addr_3 /= mff_dst_reg) then  -- unicast but not for me
3060
 
3061
                                        rx_wrong_mac_rcvd <= rx_wrong_mac_rcvd+1;
3062
 
3063
                                elsif(mff_dst_reg(0)='1' and mff_is_pause_reg='0') then  -- multicast, but not broadcast
3064
 
3065
                                        rx_multicast_rcvd <= rx_multicast_rcvd + 1;
3066
 
3067
                                end if;
3068
 
3069
                        end if ;
3070
 
3071
                    end if;
3072
 
3073
             elsif (mff_frm_rcvd='1' and TB_MACPADEN=FALSE) then
3074
 
3075
                        mff_rxcnt <= mff_rxcnt+1 ;
3076
 
3077
                  -- verify that the status word length field really matches what we find in the frame
3078
                  -- ---------------------------------------------------------------------------------                   
3079
 
3080
                        if(mff_dst_reg=X"FFFFFFFFFFFF") then
3081
 
3082
                                rx_broadcast_rcvd <= rx_broadcast_rcvd+1;
3083
 
3084
                        elsif (ENABLE_SUP_ADDR=0) then
3085
 
3086
                                if(mff_dst_reg(0)='0' and (mac_addr /= mff_dst_reg) ) then  -- unicast but not for me
3087
 
3088
 
3089
                                        rx_wrong_mac_rcvd <= rx_wrong_mac_rcvd+1;
3090
 
3091
                                elsif(mff_dst_reg(0)='1' and mff_is_pause_reg='0') then  -- multicast, but not broadcast
3092
 
3093
                                        rx_multicast_rcvd <= rx_multicast_rcvd + 1;
3094
 
3095
                                end if;
3096
 
3097
                        else
3098
 
3099
                                if(mff_dst_reg(0)='0' and mac_addr /= mff_dst_reg and sup_mac_addr_0 /= mff_dst_reg and sup_mac_addr_1 /= mff_dst_reg and sup_mac_addr_2 /= mff_dst_reg and sup_mac_addr_3 /= mff_dst_reg) then  -- unicast but not for me
3100
 
3101
                                        rx_wrong_mac_rcvd <= rx_wrong_mac_rcvd+1;
3102
 
3103
                                elsif(mff_dst_reg(0)='1' and mff_is_pause_reg='0') then  -- multicast, but not broadcast
3104
 
3105
                                        rx_multicast_rcvd <= rx_multicast_rcvd + 1;
3106
 
3107
                                end if;
3108
 
3109
                        end if ;
3110
 
3111
             end if;
3112
 
3113
             -- now check reception of good frames on FIFO interface
3114
             -- (we have no Preamble and CRC there, so do not check these errors on the MFF status)
3115
 
3116
             if( ff_rx_eop='1' and mff_is_pause='0') then           -- good frames should come out
3117
 
3118
                rx_non_discard_rcvd <= rx_non_discard_rcvd +1;
3119
 
3120
             end if ;
3121
 
3122
             if( ff_rx_eop='1' and mff_is_pause='0') then           -- good frames should come out
3123
 
3124
                -- remember the length as it was given from the FIFO
3125
 
3126
                ff_last_length  <= ff_rx_err_stat(20 downto 5);
3127
 
3128
                rx_non_discard_rcvd <= rx_non_discard_rcvd +1;
3129
 
3130
                last_err_stat( 3 downto 0 ) <= ff_rx_err_stat(3 downto 0);  -- save it for the monitor checks
3131
 
3132
                if( ff_rx_err_stat(3 downto 0) = 0 and mff_is_pause='0') then
3133
 
3134
                    rx_good_rcvd <= rx_good_rcvd +1 ;
3135
 
3136
                    if( ff_rx_err_stat(4)='1' and ff_rx_err_stat(22)='0' ) then
3137
 
3138
                        rx_vlan_rcvd <= rx_vlan_rcvd +1;
3139
 
3140
                    end if;
3141
 
3142
                    if( ff_rx_err_stat(4)='1' and ff_rx_err_stat(22)='1' ) then
3143
 
3144
                        rx_stack_vlan_rcvd <= rx_stack_vlan_rcvd +1;
3145
 
3146
                    end if;
3147
 
3148
                    if(ff_rx_err_stat(21) ='1') then
3149
 
3150
                        rx_col_rcvd <= rx_col_rcvd+1;
3151
 
3152
                    end if;
3153
 
3154
                elsif (mff_is_pause='0') then  -- some error occured
3155
 
3156
                    rx_wrong_status_rcvd <= rx_wrong_status_rcvd+1;
3157
 
3158
                    if(ff_rx_err_stat(0) ='1' ) then
3159
 
3160
                        rx_length_err_rcvd <= rx_length_err_rcvd+1;
3161
 
3162
                    elsif(ff_rx_err_stat(1) ='1') then
3163
 
3164
                        rx_crc_err_rcvd <= rx_crc_err_rcvd+1;
3165
 
3166
                    end if;
3167
 
3168
                    if(ff_rx_err_stat(2) ='1') then
3169
 
3170
                        rx_fifo_overflow_rcvd <= rx_fifo_overflow_rcvd + 1;
3171
 
3172
                    end if;
3173
 
3174
                    if(ff_rx_err_stat(3) ='1') then
3175
 
3176
                        rx_gmii_err_rcvd <= rx_gmii_err_rcvd+1;
3177
 
3178
                    end if;
3179
 
3180
                end if;
3181
 
3182
             end if;
3183
 
3184
        end if;
3185
 
3186
    end process;
3187
 
3188
    -- Frames with different MAC address and Broadcast MAC address
3189
    -- -------------------------------------------------------------------
3190
 
3191
    promis_en <= '1' when TB_PROMIS_ENA else '0' ;
3192
 
3193
    process( rx_clk_tb, reset )
3194
    begin
3195
        if( reset='1' ) then
3196
 
3197
            rx_broadcast_sent   <= 0;
3198
            rx_wrong_mac_sent   <= 0;
3199
            rx_multicast_sent_total   <= 0;
3200
            rx_multicast_sent   <= 0;
3201
            rx_multicast_denied <= 0;
3202
 
3203
 
3204
        elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
3205
 
3206
            if( gm_sop='1' ) then
3207
 
3208
                if( gm_dst = X"FFFFFFFFFFFF") then
3209
 
3210
                    rx_broadcast_sent <= rx_broadcast_sent+1;
3211
 
3212
                elsif( rx_is_good_frame and gm_pause_gen='0' and
3213
                       ((gm_dst(0)='0') and        -- unicast address
3214
                        (gm_dst/=mac_addr and gm_dst/=sup_mac_addr_0 and gm_dst/=sup_mac_addr_1 and gm_dst/=sup_mac_addr_2 and gm_dst/=sup_mac_addr_3) and   -- and not the same
3215
                        (promis_en='1')          -- and is promiscuous, then should be received
3216
                       )    ) then
3217
 
3218
                    rx_wrong_mac_sent <= rx_wrong_mac_sent+1;
3219
 
3220
                elsif( rx_is_good_frame and (gm_dst(0)='1') and gm_pause_gen='0') then    -- Multicast Address
3221
 
3222
                    rx_multicast_sent_total <= rx_multicast_sent_total +1;
3223
 
3224
                    if( multicast_wrong and promis_en='0' and ENA_HASH=1) then
3225
 
3226
                        rx_multicast_denied <= rx_multicast_denied+1;  -- then wrong multicast should be denied
3227
 
3228
                    else
3229
 
3230
                        rx_multicast_sent <= rx_multicast_sent + 1;  -- count good frames here (which are expected to be received)
3231
 
3232
                    end if;
3233
 
3234
                end if;
3235
 
3236
            end if;
3237
 
3238
        end if;
3239
    end process;
3240
 
3241
   -- Core Statistic Registers
3242
   -- ------------------------
3243
 
3244
        process(reset, reg_clk)
3245
 
3246
                variable ln : line ;
3247
 
3248
        begin
3249
 
3250
                if (reset='1') then
3251
 
3252
                        rx_pause_rcvd <= 0 ;
3253
 
3254
                elsif (reg_clk='0') and (reg_clk'event) then
3255
 
3256
                        if (state=RD_PAUSE_RX and reg_busy='0') then
3257
 
3258
                                rx_pause_rcvd <= conv_integer(reg_data_out) ;
3259
 
3260
                                write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
3261
                                writeline(output, ln) ;
3262
                                write(ln, string'(" ")) ;
3263
                                writeline(output, ln) ;
3264
                                write(ln, string'(" Core Statistic Counters")) ;
3265
                                writeline(output, ln) ;
3266
                                write(ln, string'(" ")) ;
3267
                                writeline(output, ln) ;
3268
                                write(ln, string'("     - Number of Received Pause Frames : ")) ;
3269
                                write(ln, conv_integer(reg_data_out)) ;
3270
                                writeline(output, ln) ;
3271
 
3272
                        end if ;
3273
 
3274
                end if ;
3275
 
3276
        end process ;
3277
 
3278
        process(reg_clk)
3279
 
3280
                variable ln : line ;
3281
 
3282
        begin
3283
 
3284
                if (reg_clk='0') and (reg_clk'event) then
3285
 
3286
                        if (state=RD_PAUSE_TX and reg_busy='0') then
3287
 
3288
                                write(ln, string'("     - Number of Transmitted Pause Frames : ")) ;
3289
                                write(ln, conv_integer(reg_data_out)) ;
3290
                                writeline(output, ln) ;
3291
 
3292
                        end if ;
3293
 
3294
                end if ;
3295
 
3296
        end process ;
3297
 
3298
        process(reg_clk)
3299
 
3300
                variable ln : line ;
3301
 
3302
        begin
3303
 
3304
                if (reg_clk='0') and (reg_clk'event) then
3305
 
3306
                        if (state=RX_UNICAST and reg_busy='0') then
3307
 
3308
                                write(ln, string'("     - Number of Received Unicast Frames : ")) ;
3309
                                write(ln, conv_integer(reg_data_out)) ;
3310
                                writeline(output, ln) ;
3311
 
3312
                        end if ;
3313
 
3314
                end if ;
3315
 
3316
        end process ;
3317
 
3318
        process(reg_clk)
3319
 
3320
                variable ln : line ;
3321
 
3322
        begin
3323
 
3324
                if (reg_clk='0') and (reg_clk'event) then
3325
 
3326
                        if (state=RX_MLTCAST and reg_busy='0') then
3327
 
3328
                                write(ln, string'("     - Number of Received Multicast Frames : ")) ;
3329
                                write(ln, conv_integer(reg_data_out)) ;
3330
                                writeline(output, ln) ;
3331
 
3332
                        end if ;
3333
 
3334
                end if ;
3335
 
3336
        end process ;
3337
 
3338
        process(reg_clk)
3339
 
3340
                variable ln : line ;
3341
 
3342
        begin
3343
 
3344
                if (reg_clk='0') and (reg_clk'event) then
3345
 
3346
                        if (state=RX_BRDCAST and reg_busy='0') then
3347
 
3348
                                write(ln, string'("     - Number of Received Broadcast Frames : ")) ;
3349
                                write(ln, conv_integer(reg_data_out)) ;
3350
                                writeline(output, ln) ;
3351
 
3352
                        end if ;
3353
 
3354
                end if ;
3355
 
3356
        end process ;
3357
 
3358
        process(reg_clk)
3359
 
3360
                variable ln : line ;
3361
 
3362
        begin
3363
 
3364
                if (reg_clk='0') and (reg_clk'event) then
3365
 
3366
                        if (state=TX_UNICAST and reg_busy='0') then
3367
 
3368
                                write(ln, string'("     - Number of Transmitted Unicast Frames : ")) ;
3369
                                write(ln, conv_integer(reg_data_out)) ;
3370
                                writeline(output, ln) ;
3371
 
3372
                        end if ;
3373
 
3374
                end if ;
3375
 
3376
        end process ;
3377
 
3378
        process(reg_clk)
3379
 
3380
                variable ln : line ;
3381
 
3382
        begin
3383
 
3384
                if (reg_clk='0') and (reg_clk'event) then
3385
 
3386
                        if (state=TX_MLTCAST and reg_busy='0') then
3387
 
3388
                                write(ln, string'("     - Number of Transmitted Multicast Frames : ")) ;
3389
                                write(ln, conv_integer(reg_data_out)) ;
3390
                                writeline(output, ln) ;
3391
 
3392
                        end if ;
3393
 
3394
                end if ;
3395
 
3396
        end process ;
3397
 
3398
        process(reg_clk)
3399
 
3400
                variable ln : line ;
3401
 
3402
        begin
3403
 
3404
                if (reg_clk='0') and (reg_clk'event) then
3405
 
3406
                        if (state=TX_BRDCAST and reg_busy='0') then
3407
 
3408
                                write(ln, string'("     - Number of Transmitted Broadcast Frames : ")) ;
3409
                                write(ln, conv_integer(reg_data_out)) ;
3410
                                writeline(output, ln) ;
3411
 
3412
                        end if ;
3413
 
3414
                end if ;
3415
 
3416
        end process ;
3417
 
3418
        process(reg_clk)
3419
 
3420
                variable ln : line ;
3421
 
3422
        begin
3423
 
3424
                if (reg_clk='0') and (reg_clk'event) then
3425
 
3426
                        if (state=TX_FRM_ERR and reg_busy='0') then
3427
 
3428
                                write(ln, string'("     - Number of Frames Transmitted with an Error : ")) ;
3429
                                write(ln, conv_integer(reg_data_out)) ;
3430
                                writeline(output, ln) ;
3431
                                write(ln, string'(" ")) ;
3432
                                writeline(output, ln) ;
3433
                                write(ln, string'(" RMON Counters")) ;
3434
                                writeline(output, ln) ;
3435
                                write(ln, string'(" ")) ;
3436
                                writeline(output, ln) ;
3437
 
3438
                        end if ;
3439
 
3440
                end if ;
3441
 
3442
        end process ;
3443
 
3444
        process(reg_clk)
3445
 
3446
                variable ln : line ;
3447
 
3448
        begin
3449
 
3450
                if (reg_clk='0') and (reg_clk'event) then
3451
 
3452
                        if (state=RX_FRM_ERR and reg_busy='0') then
3453
 
3454
                                write(ln, string'("     - Number of Frames Received with an Error : ")) ;
3455
                                write(ln, conv_integer(reg_data_out)) ;
3456
                                writeline(output, ln) ;
3457
 
3458
                        end if ;
3459
 
3460
                end if ;
3461
 
3462
        end process ;
3463
 
3464
        process(reg_clk)
3465
 
3466
                variable ln : line ;
3467
 
3468
        begin
3469
 
3470
                if (reg_clk='0') and (reg_clk'event) then
3471
 
3472
                        if (state=RX_FRM_DROP and reg_busy='0') then
3473
 
3474
                                write(ln, string'("     - Number of Frames Dropped Because of FIFO Overflow : ")) ;
3475
                                write(ln, conv_integer(reg_data_out)) ;
3476
                                writeline(output, ln) ;
3477
 
3478
                        end if ;
3479
 
3480
                end if ;
3481
 
3482
        end process ;
3483
 
3484
        process(reg_clk)
3485
 
3486
                variable ln : line ;
3487
 
3488
        begin
3489
 
3490
                if (reg_clk='0') and (reg_clk'event) then
3491
 
3492
                        if (state=RX_UNDERSZ_FRM and reg_busy='0') then
3493
 
3494
                                write(ln, string'("     - Number of Received Undersized Frames : ")) ;
3495
                                write(ln, conv_integer(reg_data_out)) ;
3496
                                writeline(output, ln) ;
3497
 
3498
                        end if ;
3499
 
3500
                end if ;
3501
 
3502
        end process ;
3503
 
3504
        process(reg_clk)
3505
 
3506
                variable ln : line ;
3507
 
3508
        begin
3509
 
3510
                if (reg_clk='0') and (reg_clk'event) then
3511
 
3512
                        if (state=RX_OVERSZ_FRM and reg_busy='0') then
3513
 
3514
                                write(ln, string'("     - Number of Received Oversized Frames : ")) ;
3515
                                write(ln, conv_integer(reg_data_out)) ;
3516
                                writeline(output, ln) ;
3517
 
3518
                        end if ;
3519
 
3520
                end if ;
3521
 
3522
        end process ;
3523
 
3524
        process(reg_clk)
3525
 
3526
                variable ln : line ;
3527
 
3528
        begin
3529
 
3530
                if (reg_clk='0') and (reg_clk'event) then
3531
 
3532
                        if (state=RX_64_FRM and reg_busy='0') then
3533
 
3534
                                write(ln, string'("     - Number of Received 64-Bytes Frames : ")) ;
3535
                                write(ln, conv_integer(reg_data_out)) ;
3536
                                writeline(output, ln) ;
3537
 
3538
                        end if ;
3539
 
3540
                end if ;
3541
 
3542
        end process ;
3543
 
3544
        process(reg_clk)
3545
 
3546
                variable ln : line ;
3547
 
3548
        begin
3549
 
3550
                if (reg_clk='0') and (reg_clk'event) then
3551
 
3552
                        if (state=RX_65_127_FRM and reg_busy='0') then
3553
 
3554
                                write(ln, string'("     - Number of Received Frames with Size Between 65 and 127 Bytes : ")) ;
3555
                                write(ln, conv_integer(reg_data_out)) ;
3556
                                writeline(output, ln) ;
3557
 
3558
                        end if ;
3559
 
3560
                end if ;
3561
 
3562
        end process ;
3563
 
3564
        process(reg_clk)
3565
 
3566
                variable ln : line ;
3567
 
3568
        begin
3569
 
3570
                if (reg_clk='0') and (reg_clk'event) then
3571
 
3572
                        if (state=RX_128_255_FRM and reg_busy='0') then
3573
 
3574
                                write(ln, string'("     - Number of Received Frames with Size Between 128 and 255 Bytes : ")) ;
3575
                                write(ln, conv_integer(reg_data_out)) ;
3576
                                writeline(output, ln) ;
3577
 
3578
                        end if ;
3579
 
3580
                end if ;
3581
 
3582
        end process ;
3583
 
3584
        process(reg_clk)
3585
 
3586
                variable ln : line ;
3587
 
3588
        begin
3589
 
3590
                if (reg_clk='0') and (reg_clk'event) then
3591
 
3592
                        if (state=RX_256_511_FRM and reg_busy='0') then
3593
 
3594
                                write(ln, string'("     - Number of Received Frames with Size Between 256 and 511 Bytes : ")) ;
3595
                                write(ln, conv_integer(reg_data_out)) ;
3596
                                writeline(output, ln) ;
3597
 
3598
                        end if ;
3599
 
3600
                end if ;
3601
 
3602
        end process ;
3603
 
3604
        process(reg_clk)
3605
 
3606
                variable ln : line ;
3607
 
3608
        begin
3609
 
3610
                if (reg_clk='0') and (reg_clk'event) then
3611
 
3612
                        if (state=RX_512_1023_FRM and reg_busy='0') then
3613
 
3614
                                write(ln, string'("     - Number of Received Frames with Size Between 512 and 1023 Bytes : ")) ;
3615
                                write(ln, conv_integer(reg_data_out)) ;
3616
                                writeline(output, ln) ;
3617
 
3618
                        end if ;
3619
 
3620
                end if ;
3621
 
3622
        end process ;
3623
 
3624
        process(reg_clk)
3625
 
3626
                variable ln : line ;
3627
 
3628
        begin
3629
 
3630
                if (reg_clk='0') and (reg_clk'event) then
3631
 
3632
                        if (state=RX_1024_1518_FRM and reg_busy='0') then
3633
 
3634
                                write(ln, string'("     - Number of Received Frames with Size Between 1024 and 1518 Bytes : ")) ;
3635
                                write(ln, conv_integer(reg_data_out)) ;
3636
                                writeline(output, ln) ;
3637
 
3638
                        end if ;
3639
 
3640
                end if ;
3641
 
3642
        end process ;
3643
 
3644
        process(reg_clk)
3645
 
3646
                variable ln : line ;
3647
 
3648
        begin
3649
 
3650
                if (reg_clk='0') and (reg_clk'event) then
3651
 
3652
                        if (state=RX_1519_X_FRM and reg_busy='0') then
3653
 
3654
                                write(ln, string'("     - Number of Received Frames with Size Between 1519 and Max Frame Length : ")) ;
3655
                                write(ln, conv_integer(reg_data_out)) ;
3656
                                writeline(output, ln) ;
3657
 
3658
                        end if ;
3659
 
3660
                end if ;
3661
 
3662
        end process ;
3663
 
3664
        process(reg_clk)
3665
 
3666
                variable ln : line ;
3667
 
3668
        begin
3669
 
3670
                if (reg_clk='0') and (reg_clk'event) then
3671
 
3672
                        if (state=RX_JABBER and reg_busy='0') then
3673
 
3674
                                write(ln, string'("     - Number of Received Jabber Frames (Oversize with Wrong CRC) : ")) ;
3675
                                write(ln, conv_integer(reg_data_out)) ;
3676
                                writeline(output, ln) ;
3677
 
3678
                        end if ;
3679
 
3680
                end if ;
3681
 
3682
        end process ;
3683
 
3684
        process(reg_clk)
3685
 
3686
                variable ln : line ;
3687
 
3688
        begin
3689
 
3690
                if (reg_clk='0') and (reg_clk'event) then
3691
 
3692
                        if (state=RX_FRAGMENT and reg_busy='0') then
3693
 
3694
                                write(ln, string'("     - Number of Received Fragments (Undersized with Wrong CRC) : ")) ;
3695
                                write(ln, conv_integer(reg_data_out)) ;
3696
                                writeline(output, ln) ;
3697
                                writeline(output, ln) ;
3698
 
3699
                        end if ;
3700
 
3701
                end if ;
3702
 
3703
        end process ;
3704
 
3705
        process(reg_clk)
3706
 
3707
                variable ln : line ;
3708
 
3709
        begin
3710
 
3711
                if (reg_clk='0') and (reg_clk'event) then
3712
 
3713
                        if (state=RD_SW_RESET and reg_busy='0') then
3714
 
3715
                                write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
3716
                                writeline(output, ln) ;
3717
                                write(ln, string'(" ")) ;
3718
                                write(ln, string'("     ")) ;
3719
                                writeline(output, ln) ;
3720
 
3721
                                if (reg_data_out(13)='0') then
3722
 
3723
 
3724
                                        write(ln, string'("   - SW Reset Register Cleared")) ;
3725
                                        writeline(output, ln) ;
3726
 
3727
                                else
3728
 
3729
                                        write(ln, string'("   - Error: SW Reset Register NOT Cleared")) ;
3730
                                        writeline(output, ln) ;
3731
 
3732
                                end if ;
3733
 
3734
                                if (reg_data_out(0)='0') then
3735
 
3736
 
3737
                                        write(ln, string'("   - MAC Transmit Disabled")) ;
3738
                                        writeline(output, ln) ;
3739
 
3740
                                else
3741
 
3742
                                        write(ln, string'("   - Error: MAC Transmit NOT Disabled")) ;
3743
                                        writeline(output, ln) ;
3744
 
3745
                                end if ;
3746
 
3747
                                if (reg_data_out(1)='0') then
3748
 
3749
 
3750
                                        write(ln, string'("   - MAC Receive Disabled")) ;
3751
                                        writeline(output, ln) ;
3752
 
3753
                                else
3754
 
3755
                                        write(ln, string'("   - Error: MAC Receive NOT Disabled")) ;
3756
                                        writeline(output, ln) ;
3757
 
3758
                                end if ;
3759
 
3760
                                write(ln, string'(" ")) ;
3761
                                writeline(output, ln) ;
3762
 
3763
                        end if ;
3764
 
3765
                end if ;
3766
 
3767
        end process ;
3768
 
3769
        process(reg_clk)
3770
 
3771
                variable ln : line ;
3772
 
3773
        begin
3774
 
3775
                if (reg_clk='0') and (reg_clk'event) then
3776
 
3777
                        if (state=RD_FRM_TX and reg_busy='0') then
3778
 
3779
                                write(ln, string'("     - Number of Transmitted Correct Frames - With Pause Frames : ")) ;
3780
                                write(ln, conv_integer(reg_data_out)) ;
3781
                                writeline(output, ln) ;
3782
 
3783
                        end if ;
3784
 
3785
                end if ;
3786
 
3787
        end process ;
3788
 
3789
        process(reg_clk)
3790
 
3791
                variable ln : line ;
3792
 
3793
        begin
3794
 
3795
                if (reg_clk='0') and (reg_clk'event) then
3796
 
3797
                        if (state=RD_FRM_RX and reg_busy='0') then
3798
 
3799
                                write(ln, string'("     - Number of Received Correct Frames - With Pause Frames : ")) ;
3800
                                write(ln, conv_integer(reg_data_out)) ;
3801
                                writeline(output, ln) ;
3802
 
3803
                        end if ;
3804
 
3805
                end if ;
3806
 
3807
        end process ;
3808
 
3809
        process(reg_clk)
3810
 
3811
                variable ln : line ;
3812
 
3813
        begin
3814
 
3815
                if (reg_clk='0') and (reg_clk'event) then
3816
 
3817
                        if (state=RD_CRC_ERR and reg_busy='0') then
3818
 
3819
                                write(ln, string'("     - Number of Frames Received with CRC Error : ")) ;
3820
                                write(ln, conv_integer(reg_data_out)) ;
3821
                                writeline(output, ln) ;
3822
 
3823
                        end if ;
3824
 
3825
                end if ;
3826
 
3827
        end process ;
3828
 
3829
        process(reg_clk)
3830
 
3831
                variable ln : line ;
3832
 
3833
        begin
3834
 
3835
                if (reg_clk='0') and (reg_clk'event) then
3836
 
3837
                        if (state=RD_ALIGN_ERR and reg_busy='0') then
3838
 
3839
                                write(ln, string'("     - Number of Frames Received with an Alignment Error : ")) ;
3840
                                write(ln, conv_integer(reg_data_out)) ;
3841
                                writeline(output, ln) ;
3842
 
3843
                        end if ;
3844
 
3845
                end if ;
3846
 
3847
        end process ;
3848
 
3849
        process(reg_clk)
3850
 
3851
                variable ln : line ;
3852
 
3853
        begin
3854
 
3855
                if (reg_clk='0') and (reg_clk'event) then
3856
 
3857
                        if (state=RD_TX_OCTETS and reg_busy='0') then
3858
 
3859
                                write(ln, string'("     - Number of Transmitted Octets : ")) ;
3860
                                write(ln, conv_integer(reg_data_out)) ;
3861
                                writeline(output, ln) ;
3862
 
3863
                        end if ;
3864
 
3865
                end if ;
3866
 
3867
        end process ;
3868
 
3869
        process(reg_clk)
3870
 
3871
                variable ln : line ;
3872
 
3873
        begin
3874
 
3875
                if (reg_clk='0') and (reg_clk'event) then
3876
 
3877
                        if (state=RD_RX_OCTETS and reg_busy='0') then
3878
 
3879
                                write(ln, string'("     - Number of Received Octets : ")) ;
3880
                                write(ln, conv_integer(reg_data_out)) ;
3881
                                writeline(output, ln) ;
3882
 
3883
                        end if ;
3884
 
3885
                end if ;
3886
 
3887
        end process ;
3888
 
3889
    -- GMII RX Generator transmission statistics
3890
    -- -----------------------------------------
3891
 
3892
        process( rx_clk_tb, reset )
3893
        begin
3894
 
3895
                if( reset='1' ) then
3896
 
3897
                        rx_pause_sent           <= 0;
3898
                        rx_align_err_sent       <= 0;
3899
                        rx_align_err_rcvd       <= 0;
3900
                        rx_vlan_sent            <= 0;
3901
                        rx_stack_vlan_sent      <= 0;
3902
                        rx_vlan_wrong_type_sent <= 0;
3903
                        rx_crc_err_sent         <= 0;
3904
                        rx_wrong_status_sent    <= 0;
3905
 
3906
                elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
3907
 
3908
                        if( gm_sop='1' ) then
3909
 
3910
                           -- Pause Frame Counter
3911
                           -- -------------------
3912
 
3913
                                if( gm_pause_gen='1' and rx_is_good_frame and gm_dst=X"010000c28001") then  -- only good ones
3914
 
3915
                                        rx_pause_sent <= rx_pause_sent +1;
3916
 
3917
                                end if;
3918
 
3919
                           -- Alignment Errors Counter
3920
                           -- ------------------------
3921
 
3922
                                if( gm_prmbl_err='1' ) then
3923
 
3924
                                        rx_align_err_sent <= rx_align_err_sent+1;
3925
 
3926
                                end if;
3927
 
3928
                           -- CRC Errors Counter
3929
                           -- ------------------
3930
 
3931
                                if( gm_crc_err='1' and rx_is_good_addr) then
3932
 
3933
                                        rx_crc_err_sent <= rx_crc_err_sent +1;
3934
 
3935
                                end if;
3936
 
3937
                           -- VLAN Frames Counter
3938
                           -- -------------------
3939
 
3940
                                if(gm_vlan_en='1' and gm_stack_vlan_en='0' and gm_pause_gen='0' and rx_is_good_frame and rx_is_good_addr) then
3941
 
3942
                                        if( gm_frmtype = 0 ) then
3943
 
3944
                                                rx_vlan_sent <= rx_vlan_sent + 1;
3945
 
3946
                                        else
3947
 
3948
                                                rx_vlan_wrong_type_sent <= rx_vlan_wrong_type_sent + 1;
3949
 
3950
                                        end if;
3951
 
3952
                                end if;
3953
 
3954
                           -- Stacked VLAN Frames Counter
3955
                           -- ---------------------------
3956
 
3957
                                if(gm_vlan_en='1' and  gm_stack_vlan_en='1' and gm_pause_gen='0' and rx_is_good_frame and rx_is_good_addr) then
3958
 
3959
                                        if( gm_frmtype = 0 ) then
3960
 
3961
                                                rx_stack_vlan_sent <= rx_stack_vlan_sent + 1;
3962
 
3963
                                        end if;
3964
 
3965
                                end if;
3966
 
3967
                           -- Frames Received with Wrong Status
3968
                           -- ---------------------------------
3969
 
3970
                                if( gm_prmbl_err='0' and   -- frames with wrong preamble are never pushed
3971
                                    gm_pause_gen='0' and   -- pause frames are never delivered to the FIFO, therefore cannot cause wrong status
3972
                                    rx_is_good_addr  ) then
3973
 
3974
                                        if((gm_crc_err='1' ) or
3975
                                           (gm_end_err='1' ) or
3976
                                           (gm_phy_err='1' ) or
3977
                                           (gm_pad_en='0' and gm_vlan_en='1' and gm_len<42 ) or
3978
                                           (gm_pad_en='0' and gm_stack_vlan_en='1' and gm_len<38 ) or
3979
                                           (gm_pad_en='0' and gm_vlan_en='0' and gm_len<46 ) or
3980
                                           --(gm_stack_vlan_en='1' and gm_len > (frm_length_max-26)) or
3981
                                           --(gm_vlan_en='1' and gm_len > (frm_length_max-22)) or
3982
                                           --(gm_vlan_en='0' and gm_len > (frm_length_max-18))) then
3983
                                           (gm_len > (frm_length_max-18))) then -- new independent from VLAN
3984
                                                rx_wrong_status_sent <= rx_wrong_status_sent + 1;
3985
 
3986
                                        end if;
3987
 
3988
                                end if;
3989
 
3990
                        end if;
3991
 
3992
                        if( frm_align_err='1' ) then
3993
 
3994
                                rx_align_err_rcvd <= rx_align_err_rcvd + 1;
3995
 
3996
                        end if;
3997
 
3998
                end if;
3999
 
4000
        end process;
4001
 
4002
    -- Frames that should be discarded
4003
    -- -------------------------------
4004
 
4005
        process( rx_clk_tb, reset )
4006
        begin
4007
 
4008
                if( reset='1' ) then
4009
 
4010
                        rx_discard_sent <= 0;
4011
                        rx_discard_rcvd <= 0;
4012
 
4013
                elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
4014
 
4015
                        if( gm_sop='1' ) then
4016
 
4017
                                if(((gm_dst(0)='0') and (gm_dst /= mac_addr and gm_dst /= sup_mac_addr_0 and gm_dst /= sup_mac_addr_1 and gm_dst /= sup_mac_addr_2 and gm_dst /= sup_mac_addr_3) and promis_en='0') or  -- invalid unicast mac address ?
4018
                                   ((gm_dst(0)='1') and multicast_wrong and gm_pause_gen='0' and promis_en='0' and gm_dst/=X"FFFFFFFFFFFF" ) or
4019
                                    (gm_prmbl_err='1') or
4020
                                    --(gm_frmtype /= 0 ) or         -- TBD (pushed saving pipelines?)!!
4021
                                    (gm_pause_gen='1') ) then
4022
 
4023
                                        rx_discard_sent <= rx_discard_sent + 1;
4024
 
4025
                                end if;
4026
 
4027
                        end if;
4028
 
4029
                        rx_discard_rcvd <= rxframe_cnt - rx_non_discard_rcvd;
4030
 
4031
                end if;
4032
 
4033
        end process;
4034
 
4035
    -- Block RX FIFO Read
4036
    -- ------------------
4037
 
4038
        ff_rx_rdy <= '0' when (stop_rx_fifo_read='1' and rx_hold_cnt < TB_HOLDREAD) else '1';
4039
 
4040
        process( ff_rx_clk, reset )
4041
        begin
4042
 
4043
                if( reset='1' ) then
4044
 
4045
                        stop_rx_fifo_read <= '0';
4046
                        rx_hold_cnt       <= 0;
4047
                        rx_fifo_cnt       <= 0;
4048
 
4049
                elsif( ff_rx_clk='1' and ff_rx_clk'event ) then
4050
 
4051
                        if( ff_rx_sop='1' ) then
4052
 
4053
                                rx_fifo_cnt <= rx_fifo_cnt+1;     -- count each Frame read from the FIFO
4054
 
4055
                        end if;
4056
 
4057
                        if( TB_STOPREAD/=0 and TB_STOPREAD<rx_fifo_cnt and stop_rx_fifo_read='0')  then
4058
 
4059
                                stop_rx_fifo_read <= '1';
4060
 
4061
                        end if;
4062
 
4063
                        if( stop_rx_fifo_read='1' and rx_hold_cnt<TB_HOLDREAD ) then
4064
 
4065
                                rx_hold_cnt <= rx_hold_cnt + 1;
4066
 
4067
                        end if;
4068
 
4069
                end if;
4070
 
4071
        end process;
4072
 
4073
   -- Control State Machine
4074
   -- ---------------------
4075
 
4076
        process(reset, reg_clk)
4077
        begin
4078
 
4079
                if (reset='1') then
4080
 
4081
                        state <= IDLE ;
4082
 
4083
                elsif (reg_clk='1') and (reg_clk'event) then
4084
 
4085
                        state <= nextstate ;
4086
 
4087
                end if ;
4088
 
4089
        end process ;
4090
 
4091
        process(state,sim_start, reg_busy, lut_prog_cnt, rxsim_done, txsim_done, ff_rx_dsav, gm_tx_en, m_tx_en , rgm_tx_en,sim_cnt_end, reg_wakeup, gm_ether_gen_done)
4092
        begin
4093
 
4094
                case state is
4095
 
4096
                        when IDLE =>
4097
 
4098
                                if (sim_start='1' ) then
4099
 
4100
                                nextstate <= READ_VER ;
4101
 
4102
                                else
4103
 
4104
                                        nextstate <= IDLE ;
4105
 
4106
                                end if ;
4107
 
4108
                        when READ_VER =>
4109
 
4110
                                if (reg_busy='0' and reg_busy'event) then
4111
                                  if (ENABLE_MACLITE = 0) then
4112
                                        nextstate <= WR_SCRATCH ;
4113
                                  else
4114
                                        nextstate <= MAC_CONFIG ;
4115
                                  end if;
4116
 
4117
                                else
4118
 
4119
                                        nextstate <= READ_VER ;
4120
 
4121
                                end if ;
4122
 
4123
                        when WR_SCRATCH =>
4124
 
4125
                                if (reg_busy='0' and reg_busy'event) then
4126
 
4127
                                        nextstate <= RD_SCRATCH ;
4128
 
4129
                                else
4130
 
4131
                                        nextstate <= WR_SCRATCH ;
4132
 
4133
                                end if ;
4134
 
4135
                        when RD_SCRATCH =>
4136
 
4137
                                if (reg_busy='0' and reg_busy'event) then
4138
 
4139
                                        nextstate <= MAC_CONFIG ;
4140
 
4141
                                else
4142
 
4143
                                        nextstate <= RD_SCRATCH ;
4144
 
4145
                                end if ;
4146
 
4147
                        when MAC_CONFIG =>
4148
 
4149
                                if (reg_busy='0' and reg_busy'event) then
4150
 
4151
                                        nextstate <= WR_MAC1 ;
4152
 
4153
                                else
4154
 
4155
                                        nextstate <= MAC_CONFIG ;
4156
 
4157
                                end if ;
4158
 
4159
                        when WR_MAC1 =>
4160
 
4161
                                if (reg_busy='0' and reg_busy'event) then
4162
 
4163
                                        nextstate <= WR_MAC2 ;
4164
 
4165
                                else
4166
 
4167
                                        nextstate <= WR_MAC1 ;
4168
 
4169
                                end if ;
4170
 
4171
                        when WR_MAC2 =>
4172
 
4173
                                if (reg_busy='0' and reg_busy'event) then
4174
 
4175
                                        nextstate <= WR_IPG_LEN ;
4176
 
4177
                                else
4178
 
4179
                                        nextstate <= WR_MAC2 ;
4180
 
4181
                                end if ;
4182
 
4183
                        when WR_IPG_LEN =>
4184
 
4185
                                if (reg_busy='0' and reg_busy'event) then
4186
                                   if (ENABLE_MACLITE = 0) then
4187
                                        nextstate <= WR_FRM_LENGTH ;
4188
                                   else
4189
                                        nextstate <= LUT_PROG_INC ;
4190
                                   end if;
4191
                                else
4192
 
4193
                                        nextstate <= WR_IPG_LEN ;
4194
 
4195
                                end if ;
4196
 
4197
                        when WR_FRM_LENGTH =>
4198
 
4199
                                if (reg_busy='0' and reg_busy'event) then
4200
 
4201
                                        nextstate <= WR_PAUSE_QUANTA ;
4202
 
4203
                                else
4204
 
4205
                                        nextstate <= WR_FRM_LENGTH ;
4206
 
4207
                                end if ;
4208
 
4209
                        when WR_PAUSE_QUANTA =>
4210
 
4211
                                if (reg_busy='0' and reg_busy'event) then
4212
 
4213
                                        nextstate <= WR_RX_SE ;
4214
 
4215
                                else
4216
 
4217
                                        nextstate <= WR_PAUSE_QUANTA ;
4218
 
4219
                                end if ;
4220
 
4221
                        when WR_RX_SE =>
4222
 
4223
                                if (reg_busy='0' and reg_busy'event) then
4224
 
4225
                                        nextstate <= WR_RX_SF ;
4226
 
4227
                                else
4228
 
4229
                                        nextstate <= WR_RX_SE ;
4230
 
4231
                                end if ;
4232
 
4233
                        when WR_RX_SF =>
4234
 
4235
                                if (reg_busy='0' and reg_busy'event) then
4236
 
4237
                                        nextstate <= WR_TX_SE ;
4238
 
4239
                                else
4240
 
4241
                                        nextstate <= WR_RX_SF ;
4242
 
4243
                                end if ;
4244
 
4245
                        when WR_TX_SE =>
4246
 
4247
                                if (reg_busy='0' and reg_busy'event) then
4248
 
4249
                                        nextstate <= WR_TX_SF ;
4250
 
4251
                                else
4252
 
4253
                                        nextstate <= WR_TX_SE ;
4254
 
4255
                                end if ;
4256
 
4257
                        when WR_TX_SF =>
4258
 
4259
                                if (reg_busy='0' and reg_busy'event) then
4260
 
4261
                                        nextstate <= WR_RX_AE ;
4262
 
4263
                                else
4264
 
4265
                                        nextstate <= WR_TX_SF ;
4266
 
4267
                                end if ;
4268
 
4269
                        when WR_RX_AE =>
4270
 
4271
                                if (reg_busy='0' and reg_busy'event) then
4272
 
4273
                                        nextstate <= WR_RX_AF ;
4274
 
4275
                                else
4276
 
4277
                                        nextstate <= WR_RX_AE ;
4278
 
4279
                                end if ;
4280
 
4281
                        when WR_RX_AF =>
4282
 
4283
                                if (reg_busy='0' and reg_busy'event) then
4284
 
4285
                                        nextstate <= WR_TX_AE ;
4286
 
4287
                                else
4288
 
4289
                                        nextstate <= WR_RX_AF ;
4290
 
4291
                                end if ;
4292
 
4293
                        when WR_TX_AE =>
4294
 
4295
                                if (reg_busy='0' and reg_busy'event) then
4296
 
4297
                                        nextstate <= WR_TX_AF ;
4298
 
4299
                                else
4300
 
4301
                                        nextstate <= WR_TX_AE ;
4302
 
4303
                                end if ;
4304
 
4305
                        when WR_TX_AF =>
4306
 
4307
                                if (reg_busy='0' and reg_busy'event) then
4308
 
4309
                                        if (TB_MDIO_SIMULATION=TRUE and  ENABLE_MDIO = 1) then
4310
 
4311
                                                nextstate <= WR_MDIO_ADDR0 ;
4312
 
4313
                                        else
4314
 
4315
                                                nextstate <= LUT_PROG_INC ;
4316
 
4317
                                        end if ;
4318
 
4319
                                else
4320
 
4321
                                        nextstate <= WR_TX_AF ;
4322
 
4323
                                end if ;
4324
 
4325
                        when WR_MDIO_ADDR0 =>
4326
 
4327
                                if (reg_busy='0' and reg_busy'event) then
4328
 
4329
                                        nextstate <= WR_MDIO_ADDR1 ;
4330
 
4331
                                else
4332
 
4333
                                        nextstate <= WR_MDIO_ADDR0 ;
4334
 
4335
                                end if ;
4336
 
4337
                        when WR_MDIO_ADDR1 =>
4338
 
4339
                                if (reg_busy='0' and reg_busy'event) then
4340
 
4341
                                        nextstate <= WRITE_MDIO0 ;
4342
 
4343
                                else
4344
 
4345
                                        nextstate <= WR_MDIO_ADDR1 ;
4346
 
4347
                                end if ;
4348
 
4349
                        when WRITE_MDIO0 =>
4350
 
4351
                                if (reg_busy='0' and reg_busy'event) then
4352
 
4353
                                        nextstate <= READ_MDIO0 ;
4354
 
4355
                                else
4356
 
4357
                                        nextstate <= WRITE_MDIO0 ;
4358
 
4359
                                end if ;
4360
 
4361
                        when READ_MDIO0 =>
4362
 
4363
                                if (reg_busy='0' and reg_busy'event) then
4364
 
4365
                                        nextstate <= WRITE_MDIO1 ;
4366
 
4367
                                else
4368
 
4369
                                        nextstate <= READ_MDIO0 ;
4370
 
4371
                                end if ;
4372
 
4373
                        when WRITE_MDIO1 =>
4374
 
4375
                                if (reg_busy='0' and reg_busy'event) then
4376
 
4377
                                        nextstate <= READ_MDIO1 ;
4378
 
4379
                                else
4380
 
4381
                                        nextstate <= WRITE_MDIO1 ;
4382
 
4383
                                end if ;
4384
 
4385
                        when READ_MDIO1 =>
4386
 
4387
                                if (reg_busy='0' and reg_busy'event) then
4388
 
4389
                                        nextstate <= LUT_PROG ;
4390
 
4391
                                else
4392
 
4393
                                        nextstate <= READ_MDIO1 ;
4394
 
4395
                                end if ;
4396
 
4397
                        when LUT_PROG_INC =>
4398
                                if (ENA_HASH = 1) then
4399
                                   if (lut_prog_cnt=MCAST_TABLEN-1) then
4400
 
4401
                                           if (ENABLE_SUP_ADDR=1) then
4402
 
4403
                                                   nextstate <= WR_SUP_MAC0_0 ;
4404
 
4405
                                           else
4406
 
4407
                                                   nextstate <= SIM ;
4408
 
4409
                                           end if ;
4410
 
4411
                                   else
4412
 
4413
                                           nextstate <= LUT_PROG ;
4414
 
4415
                                   end if ;
4416
                                 else
4417
                                    nextstate <= SIM ;
4418
                                end if;
4419
                        when WR_SUP_MAC0_0 =>
4420
 
4421
                                if (reg_busy='0' and reg_busy'event) then
4422
 
4423
                                        nextstate <= WR_SUP_MAC0_1 ;
4424
 
4425
                                else
4426
 
4427
                                        nextstate <= WR_SUP_MAC0_0 ;
4428
 
4429
                                end if ;
4430
 
4431
                        when WR_SUP_MAC0_1 =>
4432
 
4433
                                if (reg_busy='0' and reg_busy'event) then
4434
 
4435
                                        nextstate <= WR_SUP_MAC1_0 ;
4436
 
4437
                                else
4438
 
4439
                                        nextstate <= WR_SUP_MAC0_1 ;
4440
 
4441
                                end if ;
4442
 
4443
                        when WR_SUP_MAC1_0 =>
4444
 
4445
                                if (reg_busy='0' and reg_busy'event) then
4446
 
4447
                                        nextstate <= WR_SUP_MAC1_1 ;
4448
 
4449
                                else
4450
 
4451
                                        nextstate <= WR_SUP_MAC1_0 ;
4452
 
4453
                                end if ;
4454
 
4455
                        when WR_SUP_MAC1_1 =>
4456
 
4457
                                if (reg_busy='0' and reg_busy'event) then
4458
 
4459
                                        nextstate <= WR_SUP_MAC2_0 ;
4460
 
4461
                                else
4462
 
4463
                                        nextstate <= WR_SUP_MAC1_1 ;
4464
 
4465
                                end if ;
4466
 
4467
                        when WR_SUP_MAC2_0 =>
4468
 
4469
                                if (reg_busy='0' and reg_busy'event) then
4470
 
4471
                                        nextstate <= WR_SUP_MAC2_1 ;
4472
 
4473
                                else
4474
 
4475
                                        nextstate <= WR_SUP_MAC2_0 ;
4476
 
4477
                                end if ;
4478
 
4479
                        when WR_SUP_MAC2_1 =>
4480
 
4481
                                if (reg_busy='0' and reg_busy'event) then
4482
 
4483
                                        nextstate <= WR_SUP_MAC3_0 ;
4484
 
4485
                                else
4486
 
4487
                                        nextstate <= WR_SUP_MAC2_1 ;
4488
 
4489
                                end if ;
4490
 
4491
                        when WR_SUP_MAC3_0 =>
4492
 
4493
                                if (reg_busy='0' and reg_busy'event) then
4494
 
4495
                                        nextstate <= WR_SUP_MAC3_1 ;
4496
 
4497
                                else
4498
 
4499
                                        nextstate <= WR_SUP_MAC3_0 ;
4500
 
4501
                                end if ;
4502
 
4503
                        when WR_SUP_MAC3_1 =>
4504
 
4505
                                if (reg_busy='0' and reg_busy'event) then
4506
 
4507
                                        nextstate <= SIM ;
4508
 
4509
                                else
4510
 
4511
                                        nextstate <= WR_SUP_MAC3_1 ;
4512
 
4513
                                end if ;
4514
 
4515
                        when LUT_PROG =>
4516
 
4517
                                if (reg_busy='0' and reg_busy'event) then
4518
 
4519
                                        nextstate <= LUT_PROG_INC ;
4520
 
4521
                                else
4522
 
4523
                                        nextstate <= LUT_PROG ;
4524
 
4525
                                end if ;
4526
 
4527
                        when SIM =>
4528
 
4529
                                if (rxsim_done='1' and txsim_done='1' and ff_rx_dsav/='1' and (gm_tx_en='0'or m_tx_en='0' or rgm_tx_en='0')) then
4530
 
4531
                                        nextstate <= END_SIM_WAIT;
4532
 
4533
                                else
4534
 
4535
                                        nextstate <= SIM ;
4536
 
4537
                                end if ;
4538
 
4539
                        when END_SIM_WAIT =>
4540
 
4541
                                if (sim_cnt_end > 1000) then
4542
 
4543
                                        nextstate <= RD_PAUSE_RX ;
4544
 
4545
                                else
4546
 
4547
                                        nextstate <= END_SIM_WAIT ;
4548
 
4549
                                end if ;
4550
 
4551
                        when RD_PAUSE_RX =>
4552
 
4553
                                if (reg_busy='0' and reg_busy'event) then
4554
 
4555
                                        if (STAT_CNT_ENA=1) then
4556
 
4557
                                                nextstate <= RD_FRM_TX ;
4558
 
4559
                                        else
4560
 
4561
                                                nextstate <= END_SIM ;
4562
 
4563
                                        end if ;
4564
 
4565
                                else
4566
 
4567
                                        nextstate <= RD_PAUSE_RX ;
4568
 
4569
                                end if ;
4570
 
4571
                        when RD_FRM_TX =>
4572
 
4573
                                if (reg_busy='0' and reg_busy'event) then
4574
 
4575
                                        nextstate <= RD_FRM_RX ;
4576
 
4577
                                else
4578
 
4579
                                        nextstate <= RD_FRM_TX ;
4580
 
4581
                                end if ;
4582
 
4583
                        when RD_FRM_RX =>
4584
 
4585
                                if (reg_busy='0' and reg_busy'event) then
4586
 
4587
                                        nextstate <= RD_CRC_ERR ;
4588
 
4589
                                else
4590
 
4591
                                        nextstate <= RD_FRM_RX ;
4592
 
4593
                                end if ;
4594
 
4595
                        when RD_CRC_ERR =>
4596
 
4597
                                if (reg_busy='0' and reg_busy'event) then
4598
 
4599
                                        nextstate <= RD_TX_OCTETS ;
4600
 
4601
                                else
4602
 
4603
                                        nextstate <= RD_CRC_ERR ;
4604
 
4605
                                end if ;
4606
 
4607
                        when RD_TX_OCTETS =>
4608
 
4609
                                if (reg_busy='0' and reg_busy'event) then
4610
 
4611
                                        nextstate <= RD_RX_OCTETS ;
4612
 
4613
                                else
4614
 
4615
                                        nextstate <= RD_TX_OCTETS ;
4616
 
4617
                                end if ;
4618
 
4619
                        when RD_RX_OCTETS =>
4620
 
4621
                                if (reg_busy='0' and reg_busy'event) then
4622
 
4623
                                        nextstate <= RD_ALIGN_ERR ;
4624
 
4625
                                else
4626
 
4627
                                        nextstate <= RD_RX_OCTETS ;
4628
 
4629
                                end if ;
4630
 
4631
                        when RD_ALIGN_ERR =>
4632
 
4633
                                if (reg_busy='0' and reg_busy'event) then
4634
 
4635
                                        nextstate <= RD_PAUSE_TX ;
4636
 
4637
                                else
4638
 
4639
                                        nextstate <= RD_ALIGN_ERR ;
4640
 
4641
                                end if ;
4642
 
4643
                        when RD_PAUSE_TX =>
4644
 
4645
                                if (reg_busy='0' and reg_busy'event) then
4646
 
4647
                                        nextstate <= RX_UNICAST ;
4648
 
4649
                                else
4650
 
4651
                                        nextstate <= RD_PAUSE_TX ;
4652
 
4653
                                end if ;
4654
 
4655
                        when RX_UNICAST =>
4656
 
4657
                                if (reg_busy='0' and reg_busy'event) then
4658
 
4659
                                        nextstate <= RX_MLTCAST ;
4660
 
4661
                                else
4662
 
4663
                                        nextstate <= RX_UNICAST ;
4664
 
4665
                                end if ;
4666
 
4667
                        when RX_MLTCAST =>
4668
 
4669
                                if (reg_busy='0' and reg_busy'event) then
4670
 
4671
                                        nextstate <= RX_BRDCAST ;
4672
 
4673
                                else
4674
 
4675
                                        nextstate <= RX_MLTCAST ;
4676
 
4677
                                end if ;
4678
 
4679
                        when RX_BRDCAST =>
4680
 
4681
                                if (reg_busy='0' and reg_busy'event) then
4682
 
4683
                                        nextstate <= TX_FRM_DISCARD ;
4684
 
4685
                                else
4686
 
4687
                                        nextstate <= RX_BRDCAST ;
4688
 
4689
                                end if ;
4690
 
4691
                        when TX_FRM_DISCARD =>
4692
 
4693
                                if (reg_busy='0' and reg_busy'event) then
4694
 
4695
                                        nextstate <= TX_UNICAST ;
4696
 
4697
                                else
4698
 
4699
                                        nextstate <= TX_FRM_DISCARD ;
4700
 
4701
                                end if ;
4702
 
4703
                        when TX_UNICAST =>
4704
 
4705
                                if (reg_busy='0' and reg_busy'event) then
4706
 
4707
                                        nextstate <= TX_MLTCAST ;
4708
 
4709
                                else
4710
 
4711
                                        nextstate <= TX_UNICAST ;
4712
 
4713
                                end if ;
4714
 
4715
                        when TX_MLTCAST =>
4716
 
4717
                                if (reg_busy='0' and reg_busy'event) then
4718
 
4719
                                        nextstate <= TX_BRDCAST ;
4720
 
4721
                                else
4722
 
4723
                                        nextstate <= TX_MLTCAST ;
4724
 
4725
                                end if ;
4726
 
4727
                        when TX_BRDCAST =>
4728
 
4729
                                if (reg_busy='0' and reg_busy'event) then
4730
 
4731
                                        nextstate <= RX_FRM_ERR ;
4732
 
4733
                                else
4734
 
4735
                                        nextstate <= TX_BRDCAST ;
4736
 
4737
                                end if ;
4738
 
4739
                        when RX_FRM_ERR =>
4740
 
4741
                                if (reg_busy='0' and reg_busy'event) then
4742
 
4743
                                        nextstate <= TX_FRM_ERR ;
4744
 
4745
                                else
4746
 
4747
                                        nextstate <= RX_FRM_ERR ;
4748
 
4749
                                end if ;
4750
 
4751
                        when TX_FRM_ERR =>
4752
 
4753
                                if (reg_busy='0' and reg_busy'event) then
4754
 
4755
                                        nextstate <= RX_FRM_DROP ;
4756
 
4757
                                else
4758
 
4759
                                        nextstate <= TX_FRM_ERR ;
4760
 
4761
                                end if ;
4762
 
4763
                        when RX_FRM_DROP =>
4764
 
4765
                                if (reg_busy='0' and reg_busy'event) then
4766
 
4767
                                        nextstate <= RX_UNDERSZ_FRM ;
4768
 
4769
                                else
4770
 
4771
                                        nextstate <= RX_FRM_DROP ;
4772
 
4773
                                end if ;
4774
 
4775
                        when RX_UNDERSZ_FRM =>
4776
 
4777
                                if (reg_busy='0' and reg_busy'event) then
4778
 
4779
                                        nextstate <= RX_OVERSZ_FRM ;
4780
 
4781
                                else
4782
 
4783
                                        nextstate <= RX_UNDERSZ_FRM ;
4784
 
4785
                                end if ;
4786
 
4787
                        when RX_OVERSZ_FRM =>
4788
 
4789
                                if (reg_busy='0' and reg_busy'event) then
4790
 
4791
                                        nextstate <= RX_64_FRM ;
4792
 
4793
                                else
4794
 
4795
                                        nextstate <= RX_OVERSZ_FRM ;
4796
 
4797
                                end if ;
4798
 
4799
                        when RX_64_FRM =>
4800
 
4801
                                if (reg_busy='0' and reg_busy'event) then
4802
 
4803
                                        nextstate <= RX_65_127_FRM ;
4804
 
4805
                                else
4806
 
4807
                                        nextstate <= RX_64_FRM ;
4808
 
4809
                                end if ;
4810
 
4811
                        when RX_65_127_FRM =>
4812
 
4813
                                if (reg_busy='0' and reg_busy'event) then
4814
 
4815
                                        nextstate <= RX_128_255_FRM ;
4816
 
4817
                                else
4818
 
4819
                                        nextstate <= RX_65_127_FRM ;
4820
 
4821
                                end if ;
4822
 
4823
                        when RX_128_255_FRM =>
4824
 
4825
                                if (reg_busy='0' and reg_busy'event) then
4826
 
4827
                                        nextstate <= RX_256_511_FRM ;
4828
 
4829
                                else
4830
 
4831
                                        nextstate <= RX_128_255_FRM ;
4832
 
4833
                                end if ;
4834
 
4835
                        when RX_256_511_FRM =>
4836
 
4837
                                if (reg_busy='0' and reg_busy'event) then
4838
 
4839
                                        nextstate <= RX_512_1023_FRM ;
4840
 
4841
                                else
4842
 
4843
                                        nextstate <= RX_256_511_FRM ;
4844
 
4845
                                end if ;
4846
 
4847
                        when RX_512_1023_FRM =>
4848
 
4849
                                if (reg_busy='0' and reg_busy'event) then
4850
 
4851
                                        nextstate <= RX_1024_1518_FRM ;
4852
 
4853
                                else
4854
 
4855
                                        nextstate <= RX_512_1023_FRM ;
4856
 
4857
                                end if ;
4858
 
4859
                        when RX_1024_1518_FRM =>
4860
 
4861
                                if (reg_busy='0' and reg_busy'event) then
4862
 
4863
                                        nextstate <= RX_1519_X_FRM ;
4864
 
4865
                                else
4866
 
4867
                                        nextstate <= RX_1024_1518_FRM ;
4868
 
4869
                                end if ;
4870
 
4871
                        when RX_1519_X_FRM =>
4872
 
4873
                                if (reg_busy='0' and reg_busy'event) then
4874
 
4875
                                        nextstate <= RX_JABBER ;
4876
 
4877
                                else
4878
 
4879
                                        nextstate <= RX_1519_X_FRM ;
4880
 
4881
                                end if ;
4882
 
4883
                        when RX_JABBER =>
4884
 
4885
                                if (reg_busy='0' and reg_busy'event) then
4886
 
4887
                                        nextstate <= RX_FRAGMENT ;
4888
 
4889
                                else
4890
 
4891
                                        nextstate <= RX_JABBER ;
4892
 
4893
                                end if ;
4894
 
4895
                        when RX_FRAGMENT =>
4896
 
4897
                                if (reg_busy='0' and reg_busy'event) then
4898
 
4899
                                        if (re_read_ena=TRUE) then
4900
 
4901
                                                nextstate <= RD_SW_RESET ;
4902
 
4903
                                        else
4904
 
4905
                                                nextstate   <= SW_RESET ;
4906
                                                re_read_ena <= TRUE ;
4907
 
4908
                                        end if ;
4909
 
4910
                                else
4911
 
4912
                                        nextstate   <= RX_FRAGMENT ;
4913
 
4914
                                end if ;
4915
 
4916
                        when SW_RESET =>
4917
 
4918
                                if (reg_busy='0' and reg_busy'event) then
4919
 
4920
                                        nextstate <= RD_PAUSE_RX ;
4921
 
4922
                                else
4923
 
4924
                                        nextstate <= SW_RESET ;
4925
 
4926
                                end if ;
4927
 
4928
                        when RD_SW_RESET =>
4929
 
4930
                                if (reg_busy='0' and reg_busy'event) then
4931
 
4932
                                        if (ENA_MAGIC=TRUE and TB_RXFRAMES/=0) then
4933
 
4934
                                                nextstate <= WR_ENA_MAGIC ;
4935
 
4936
                                        else
4937
 
4938
                                                nextstate <= END_SIM ;
4939
 
4940
                                        end if ;
4941
 
4942
                                else
4943
 
4944
                                        nextstate <= RD_SW_RESET ;
4945
 
4946
                                end if ;
4947
 
4948
                        when WR_ENA_MAGIC =>
4949
 
4950
                                if (reg_busy='0' and reg_busy'event) then
4951
 
4952
                                        nextstate <= NODE_SLEEP1 ;
4953
 
4954
                                else
4955
 
4956
                                        nextstate   <= WR_ENA_MAGIC ;
4957
 
4958
                                end if ;
4959
 
4960
                        when NODE_SLEEP1 =>
4961
 
4962
                                if (sim_cnt_end=50) then
4963
 
4964
                                        nextstate <= GEN_MAGIC ;
4965
 
4966
                                else
4967
 
4968
                                        nextstate <= NODE_SLEEP1 ;
4969
 
4970
                                end if ;
4971
 
4972
                        when GEN_MAGIC =>
4973
 
4974
                                if (gm_ether_gen_done='0') then
4975
 
4976
                                        nextstate <= NODE_SLEEP2 ;
4977
 
4978
                                else
4979
 
4980
                                        nextstate <= GEN_MAGIC ;
4981
 
4982
                                end if ;
4983
 
4984
                        when NODE_SLEEP2 =>
4985
 
4986
                                if (reg_wakeup='1') then
4987
 
4988
                                        nextstate <= NODE_ON ;
4989
 
4990
                                else
4991
 
4992
                                        nextstate <= NODE_SLEEP2 ;
4993
 
4994
                                end if ;
4995
 
4996
                        when NODE_ON =>
4997
 
4998
                                if (ENA_SLEEP_PIN) then
4999
 
5000
                                        if (reg_wakeup='0') then
5001
 
5002
                                                nextstate <= END_SIM ;
5003
 
5004
                                        else
5005
 
5006
                                                nextstate <= NODE_ON ;
5007
 
5008
                                        end if ;
5009
 
5010
                                else
5011
 
5012
                                        if (reg_busy='0' and reg_busy'event) then
5013
 
5014
                                                nextstate <= END_SIM ;
5015
 
5016
                                        else
5017
 
5018
                                                nextstate   <= END_SIM1 ;
5019
 
5020
                                        end if ;
5021
 
5022
                                end if ;
5023
 
5024
                        when END_SIM1 =>
5025
 
5026
                                if (reg_wakeup='0') then
5027
 
5028
                                        nextstate <= END_SIM ;
5029
 
5030
                                else
5031
 
5032
                                        nextstate <= END_SIM1 ;
5033
 
5034
                                end if ;
5035
 
5036
                        when END_SIM =>
5037
 
5038
                                nextstate <= END_SIM ;
5039
 
5040
                end case ;
5041
 
5042
        end process ;
5043
 
5044
   -- End of Simulation Delay
5045
   -- -----------------------
5046
 
5047
        process(reset, reg_clk)
5048
        begin
5049
 
5050
                if (reset='1') then
5051
 
5052
                        sim_cnt_end <= 0 ;
5053
 
5054
                elsif (reg_clk='1') and (reg_clk'event) then
5055
 
5056
                        if (nextstate=NODE_SLEEP1) then
5057
 
5058
                                sim_cnt_end <= sim_cnt_end+1 ;
5059
 
5060
                        elsif (nextstate=END_SIM_WAIT) then
5061
 
5062
                                sim_cnt_end <= sim_cnt_end+1 ;
5063
 
5064
                        else
5065
 
5066
                                sim_cnt_end <= 0 ;
5067
 
5068
                        end if ;
5069
 
5070
                end if ;
5071
 
5072
        end process ;
5073
 
5074
   -- LUT Table Address and PHY Port Counter
5075
   -- --------------------------------------
5076
 
5077
        process(reset, reg_clk)
5078
        begin
5079
 
5080
                if (reset='1') then
5081
 
5082
                        lut_prog_cnt <= 0 ;
5083
 
5084
                elsif (reg_clk='1') and (reg_clk'event) then
5085
 
5086
                        if (state=LUT_PROG_INC) then
5087
 
5088
                                lut_prog_cnt <= lut_prog_cnt+1 ;
5089
 
5090
                        end if ;
5091
 
5092
                end if ;
5093
 
5094
        end process ;
5095
 
5096
    -- Register Interface
5097
    -- ------------------
5098
 
5099
        process
5100
        begin
5101
 
5102
                reg_clk <= '1' ;
5103
                wait for 25 ns ;
5104
                reg_clk <= '0' ;
5105
                wait for 25 ns ;
5106
 
5107
        end process ;
5108
 
5109
        process(reset, reg_clk)
5110
 
5111
                variable hash_code  : std_logic_vector(5 downto 0) ;
5112
                variable mcast_addr : std_logic_vector(47 downto 0) ;
5113
 
5114
        begin
5115
 
5116
                if (reset='1') then
5117
 
5118
                        reg_wr      <= '0' ;
5119
                        reg_rd      <= '0' ;
5120
                        reg_addr    <= (others=>'0') ;
5121
                        reg_data_in <= (others=>'0') ;
5122
 
5123
                elsif (reg_clk='1') and (reg_clk'event) then
5124
 
5125
                        if (nextstate=READ_VER) then
5126
 
5127
                                reg_wr      <= '0' after 5 ns ;
5128
                                reg_rd      <= '1' after 5 ns ;
5129
                                reg_addr    <= conv_std_logic_vector(0, 8) after 5 ns;
5130
                                reg_data_in <= (others=>'0') after 5 ns;
5131
 
5132
                        elsif (nextstate=WR_SCRATCH) then
5133
 
5134
                                reg_wr      <= '1' after 5 ns;
5135
                                reg_rd      <= '0' after 5 ns;
5136
                                reg_addr    <= conv_std_logic_vector(1, 8) after 5 ns;
5137
                                reg_data_in <= X"AAAAAAAA" after 5 ns;
5138
 
5139
                        elsif (nextstate=RD_SCRATCH) then
5140
 
5141
                                reg_wr      <= '0' after 5 ns;
5142
                                reg_rd      <= '1' after 5 ns;
5143
                                reg_addr    <= conv_std_logic_vector(1, 8) after 5 ns;
5144
                                reg_data_in <= X"00000000" after 5 ns;
5145
 
5146
                        elsif (nextstate=MAC_CONFIG or nextstate=WR_ENA_MAGIC or (nextstate=NODE_ON and ENA_SLEEP_PIN=FALSE)) then
5147
 
5148
                                reg_wr      <= '1' after 5 ns;
5149
                                reg_rd      <= '0' after 5 ns;
5150
                                reg_addr    <= conv_std_logic_vector(2, 8) after 5 ns;
5151
                                reg_data_in <= (others=>'0') ;
5152
 
5153
                           -- Enable Tx and Rx
5154
                           -- ----------------
5155
 
5156
                                reg_data_in(0) <= '1' after 5 ns;
5157
                                reg_data_in(1) <= '1' after 5 ns;
5158
 
5159
                           -- XON_Gen
5160
                                reg_data_in(2) <= xon_gen after 5 ns;
5161
 
5162
                           -- Speed Selection
5163
                           -- ---------------
5164
 
5165
                                if (ETH_SPEED=1000) then
5166
 
5167
                                        reg_data_in(3) <= '1' after 5 ns;
5168
 
5169
                                else
5170
 
5171
                                        reg_data_in(3) <= '0' after 5 ns;
5172
 
5173
                                end if ;
5174
 
5175
 
5176
                           -- Unicast Filtering
5177
                           -- -----------------
5178
 
5179
                                if (TB_PROMIS_ENA=TRUE) then
5180
 
5181
                                        reg_data_in(4) <= '1' after 5 ns;
5182
 
5183
                                else
5184
 
5185
                                        reg_data_in(4) <= '0' after 5 ns;
5186
 
5187
                                end if ;
5188
 
5189
                           -- Enable Padding
5190
                           -- --------------
5191
 
5192
                                if (TB_MACPADEN=TRUE) then
5193
 
5194
                                        reg_data_in(5) <= '1' after 5 ns;
5195
 
5196
                                else
5197
 
5198
                                        reg_data_in(5) <= '0' after 5 ns;
5199
 
5200
                                end if ;
5201
 
5202
                           -- CRC Forwarding Enable
5203
                           -- ---------------------
5204
 
5205
                                if (TB_MACFWDCRC=TRUE) then
5206
 
5207
                                        reg_data_in(6) <= '1' after 5 ns;
5208
 
5209
                                else
5210
 
5211
                                        reg_data_in(6) <= '0' after 5 ns;
5212
 
5213
                                end if ;
5214
 
5215
                           -- Enable Pause Frame Forwarding
5216
                           -- -----------------------------
5217
 
5218
                                if (TB_MACFWD_PAUSE=TRUE) then
5219
 
5220
                                        reg_data_in(7) <= '1' after 5 ns;
5221
 
5222
                                else
5223
 
5224
                                        reg_data_in(7) <= '0' after 5 ns;
5225
 
5226
                                end if ;
5227
 
5228
                           -- Ignore Pause Frames
5229
                           -- -------------------
5230
 
5231
                                if (TB_MACIGNORE_PAUSE=TRUE) then
5232
 
5233
                                        reg_data_in(8) <= '1' after 5 ns;
5234
 
5235
                                else
5236
 
5237
                                        reg_data_in(8) <= '0' after 5 ns;
5238
 
5239
                                end if ;
5240
 
5241
                           -- Source MAC Address Insertion
5242
                           -- ----------------------------
5243
 
5244
                                if (TB_MACINSERT_ADDR=TRUE and ENABLE_MAC_TXADDR_SET=1) then
5245
 
5246
                                        reg_data_in(9) <= '1' after 5 ns;
5247
 
5248
                                else
5249
 
5250
                                        reg_data_in(9) <= '0' after 5 ns;
5251
 
5252
                                end if ;
5253
 
5254
 
5255
                           -- Enable Half Duplex
5256
                           -- ------------------
5257
 
5258
                                if (HD_ENA=TRUE and ENABLE_HD_LOGIC=1) then
5259
 
5260
                                        reg_data_in(10) <= '1' after 5 ns;
5261
 
5262
                                else
5263
 
5264
                                        reg_data_in(10) <= '0' after 5 ns;
5265
 
5266
                                end if ;
5267
 
5268
                           -- Internal Loopback
5269
                           -- -----------------
5270
 
5271
                                if (ENABLE_GMII_LOOPBACK=1 and TB_RXFRAMES=0) then
5272
 
5273
                                        reg_data_in(15) <= '1' after 5 ns;
5274
 
5275
                                else
5276
 
5277
                                        reg_data_in(15) <= '0' after 5 ns;
5278
 
5279
                                end if ;
5280
 
5281
                           -- Source MAC Address Selection 
5282
                           -- -----------------------------
5283
 
5284
                                if (ENABLE_SUP_ADDR=1) then
5285
 
5286
                                        reg_data_in(18 downto 16) <= conv_std_logic_vector(TB_ADDR_SEL, 3) after 5 ns;
5287
 
5288
                                else
5289
 
5290
                                        reg_data_in(18 downto 16) <= "000" after 5 ns;
5291
 
5292
                                end if ;
5293
 
5294
                                reg_data_in(14) <= '0' ;
5295
 
5296
                           -- Magic Packet Enable
5297
                           -- -------------------
5298
 
5299
                                if (ENA_MAGIC=TRUE and ENABLE_MAGIC_DETECT=1) then
5300
 
5301
                                        reg_data_in(19) <= '1' ;
5302
 
5303
                                else
5304
 
5305
                                        reg_data_in(19) <= '0' ;
5306
 
5307
                                end if ;
5308
 
5309
                                if (nextstate=WR_ENA_MAGIC and ENA_SLEEP_PIN=FALSE) then
5310
 
5311
                                        reg_data_in(20) <= '1' ;
5312
 
5313
                                else
5314
 
5315
                                        reg_data_in(20) <= '0' ;
5316
 
5317
                                end if ;
5318
 
5319
                                reg_data_in(21) <= '0' ;
5320
 
5321
                           -- XOFF_Gen
5322
                                reg_data_in(22) <= xoff_gen after 5 ns;
5323
 
5324
                           -- 10Mbps Speed Selection
5325
                           -- ---------------
5326
 
5327
                                if (ETH_SPEED=10) then
5328
 
5329
                                        reg_data_in(25) <= '1' after 5 ns;
5330
 
5331
                                else
5332
 
5333
                                        reg_data_in(25) <= '0' after 5 ns;
5334
 
5335
                                end if ;
5336
 
5337
               -- Discard any errored in received frames
5338
                           -- ---------------
5339
 
5340
                                if (TB_MACRX_ERR_DISC=1) then
5341
 
5342
                                        reg_data_in(26) <= '1' after 5 ns;
5343
 
5344
                                else
5345
 
5346
                                        reg_data_in(26) <= '0' after 5 ns;
5347
 
5348
                                end if ;
5349
 
5350
                        elsif (nextstate=WR_MAC1) then
5351
 
5352
                                reg_wr      <= '1' after 5 ns;
5353
                                reg_rd      <= '0' after 5 ns;
5354
                                reg_addr    <= conv_std_logic_vector(3, 8) after 5 ns;
5355
                                reg_data_in <= mac_addr(31 downto 0) after 5 ns;
5356
 
5357
                        elsif (nextstate=WR_MAC2) then
5358
 
5359
                                reg_wr                    <= '1' after 5 ns;
5360
                                reg_rd                    <= '0' after 5 ns;
5361
                                reg_addr                  <= conv_std_logic_vector(4, 8) after 5 ns;
5362
                                reg_data_in(15 downto 0)  <= mac_addr(47 downto 32) after 5 ns;
5363
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5364
 
5365
                        elsif (nextstate=WR_IPG_LEN) then
5366
 
5367
                                reg_wr                    <= '1' after 5 ns;
5368
                                reg_rd                    <= '0' after 5 ns;
5369
                                reg_addr                  <= conv_std_logic_vector(23, 8) after 5 ns;
5370
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(TB_IPG_LENGTH, 16) after 5 ns;
5371
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5372
 
5373
                        elsif (nextstate=WR_SUP_MAC0_0) then
5374
 
5375
                                reg_wr      <= '1' after 5 ns;
5376
                                reg_rd      <= '0' after 5 ns;
5377
                                reg_addr    <= conv_std_logic_vector(192, 8) after 5 ns;
5378
                                reg_data_in <= sup_mac_addr_0(31 downto 0)   after 5 ns;
5379
 
5380
                        elsif (nextstate=WR_SUP_MAC0_1) then
5381
 
5382
                                reg_wr                    <= '1' after 5 ns;
5383
                                reg_rd                    <= '0' after 5 ns;
5384
                                reg_addr                  <= conv_std_logic_vector(193, 8) after 5 ns;
5385
                                reg_data_in(15 downto 0)  <= sup_mac_addr_0(47 downto 32) after 5 ns;
5386
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5387
 
5388
                        elsif (nextstate=WR_SUP_MAC1_0) then
5389
 
5390
                                reg_wr      <= '1' after 5 ns;
5391
                                reg_rd      <= '0' after 5 ns;
5392
                                reg_addr    <= conv_std_logic_vector(194, 8) after 5 ns;
5393
                                reg_data_in <= sup_mac_addr_1(31 downto 0)   after 5 ns;
5394
 
5395
                        elsif (nextstate=WR_SUP_MAC1_1) then
5396
 
5397
                                reg_wr                    <= '1' after 5 ns;
5398
                                reg_rd                    <= '0' after 5 ns;
5399
                                reg_addr                  <= conv_std_logic_vector(195, 8) after 5 ns;
5400
                                reg_data_in(15 downto 0)  <= sup_mac_addr_1(47 downto 32) after 5 ns;
5401
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5402
 
5403
                        elsif (nextstate=WR_SUP_MAC2_0) then
5404
 
5405
                                reg_wr      <= '1' after 5 ns;
5406
                                reg_rd      <= '0' after 5 ns;
5407
                                reg_addr    <= conv_std_logic_vector(196, 8) after 5 ns;
5408
                                reg_data_in <= sup_mac_addr_2(31 downto 0)   after 5 ns;
5409
 
5410
                        elsif (nextstate=WR_SUP_MAC2_1) then
5411
 
5412
                                reg_wr                    <= '1' after 5 ns;
5413
                                reg_rd                    <= '0' after 5 ns;
5414
                                reg_addr                  <= conv_std_logic_vector(197, 8) after 5 ns;
5415
                                reg_data_in(15 downto 0)  <= sup_mac_addr_2(47 downto 32) after 5 ns;
5416
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5417
 
5418
                        elsif (nextstate=WR_SUP_MAC3_0) then
5419
 
5420
                                reg_wr      <= '1' after 5 ns;
5421
                                reg_rd      <= '0' after 5 ns;
5422
                                reg_addr    <= conv_std_logic_vector(198, 8) after 5 ns;
5423
                                reg_data_in <= sup_mac_addr_3(31 downto 0)   after 5 ns;
5424
 
5425
                        elsif (nextstate=WR_SUP_MAC3_1) then
5426
 
5427
                                reg_wr                    <= '1' after 5 ns;
5428
                                reg_rd                    <= '0' after 5 ns;
5429
                                reg_addr                  <= conv_std_logic_vector(199, 8) after 5 ns;
5430
                                reg_data_in(15 downto 0)  <= sup_mac_addr_3(47 downto 32) after 5 ns;
5431
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5432
 
5433
                        elsif (nextstate=WR_FRM_LENGTH) then
5434
 
5435
                                reg_wr                    <= '1' after 5 ns;
5436
                                reg_rd                    <= '0' after 5 ns;
5437
                                reg_addr                  <= conv_std_logic_vector(5, 8) after 5 ns;
5438
                                reg_data_in(13 downto 0)  <= conv_std_logic_vector(TB_MACLENMAX, 14) after 5 ns;
5439
                                reg_data_in(31 downto 14) <= (others=>'0') after 5 ns;
5440
 
5441
                        elsif (nextstate=WR_PAUSE_QUANTA) then
5442
 
5443
                                reg_wr                    <= '1' after 5 ns;
5444
                                reg_rd                    <= '0' after 5 ns;
5445
                                reg_addr                  <= conv_std_logic_vector(6, 8) after 5 ns;
5446
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(TB_MACPAUSEQ, 16) after 5 ns;
5447
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5448
 
5449
                        elsif (nextstate=WR_RX_SE) then
5450
 
5451
                                reg_wr                    <= '1' after 5 ns;
5452
                                reg_rd                    <= '0' after 5 ns;
5453
                                reg_addr                  <= conv_std_logic_vector(7, 8) after 5 ns;
5454
                                reg_data_in               <= conv_std_logic_vector(RX_FIFO_SECTION_EMPTY, 32) after 5 ns;
5455
 
5456
                        elsif (nextstate=WR_RX_SF) then
5457
 
5458
                                reg_wr                    <= '1' after 5 ns;
5459
                                reg_rd                    <= '0' after 5 ns;
5460
                                reg_addr                  <= conv_std_logic_vector(8, 8) after 5 ns;
5461
                                reg_data_in               <= conv_std_logic_vector(RX_FIFO_SECTION_FULL, 32) after 5 ns;
5462
 
5463
                        elsif (nextstate=WR_TX_SE) then
5464
 
5465
                                reg_wr                    <= '1' after 5 ns;
5466
                                reg_rd                    <= '0' after 5 ns;
5467
                                reg_addr                  <= conv_std_logic_vector(9, 8) after 5 ns;
5468
                                reg_data_in               <= conv_std_logic_vector(TX_FIFO_SECTION_EMPTY, 32) after 5 ns;
5469
 
5470
                        elsif (nextstate=WR_TX_SF) then
5471
 
5472
                                reg_wr                    <= '1' after 5 ns;
5473
                                reg_rd                    <= '0' after 5 ns;
5474
                                reg_addr                  <= conv_std_logic_vector(10, 8) after 5 ns;
5475
                                reg_data_in               <= conv_std_logic_vector(TX_FIFO_SECTION_FULL, 32) after 5 ns;
5476
 
5477
                        elsif (nextstate=WR_RX_AE) then
5478
 
5479
                                reg_wr                    <= '1' after 5 ns;
5480
                                reg_rd                    <= '0' after 5 ns;
5481
                                reg_addr                  <= conv_std_logic_vector(11, 8) after 5 ns;
5482
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(RX_FIFO_AE, 16) after 5 ns;
5483
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5484
 
5485
                        elsif (nextstate=WR_RX_AF) then
5486
 
5487
                                reg_wr                    <= '1' after 5 ns;
5488
                                reg_rd                    <= '0' after 5 ns;
5489
                                reg_addr                  <= conv_std_logic_vector(12, 8) after 5 ns;
5490
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(RX_FIFO_AF, 16) after 5 ns;
5491
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5492
 
5493
                        elsif (nextstate=WR_TX_AE) then
5494
 
5495
                                reg_wr                    <= '1' after 5 ns;
5496
                                reg_rd                    <= '0' after 5 ns;
5497
                                reg_addr                  <= conv_std_logic_vector(13, 8) after 5 ns;
5498
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(TX_FIFO_AE, 16) after 5 ns;
5499
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5500
 
5501
                        elsif (nextstate=WR_TX_AF) then
5502
 
5503
                                reg_wr                    <= '1' after 5 ns;
5504
                                reg_rd                    <= '0' after 5 ns;
5505
                                reg_addr                  <= conv_std_logic_vector(14, 8) after 5 ns;
5506
                                reg_data_in(15 downto 0)  <= conv_std_logic_vector(TX_FIFO_AF, 16) after 5 ns;
5507
                                reg_data_in(31 downto 16) <= (others=>'0') after 5 ns;
5508
 
5509
                        elsif (nextstate=WR_MDIO_ADDR0) then
5510
 
5511
                                reg_wr                   <= '1' after 5 ns;
5512
                                reg_rd                   <= '0' after 5 ns;
5513
                                reg_addr                 <= conv_std_logic_vector(15, 8) after 5 ns;
5514
                                reg_data_in(4 downto 0)  <= conv_std_logic_vector(TB_MDIO_ADDR0, 5) after 5 ns;
5515
                                reg_data_in(31 downto 5) <= (others=>'0') after 5 ns;
5516
 
5517
                        elsif (nextstate=WR_MDIO_ADDR1) then
5518
 
5519
                                reg_wr                   <= '1' after 5 ns;
5520
                                reg_rd                   <= '0' after 5 ns;
5521
                                reg_addr                 <= conv_std_logic_vector(16, 8) after 5 ns;
5522
                                reg_data_in(4 downto 0)  <= conv_std_logic_vector(TB_MDIO_ADDR1, 5) after 5 ns;
5523
                                reg_data_in(31 downto 5) <= (others=>'0') after 5 ns;
5524
 
5525
                        elsif (nextstate=WRITE_MDIO0) then
5526
 
5527
                                reg_wr      <= '1' after 5 ns;
5528
                                reg_rd      <= '0' after 5 ns;
5529
                                reg_addr    <= conv_std_logic_vector(128, 8) after 5 ns;
5530
                                reg_data_in <= X"AAAAAAAA" after 5 ns;
5531
 
5532
                        elsif (nextstate=READ_MDIO0) then
5533
 
5534
                                reg_wr      <= '0' after 5 ns;
5535
                                reg_rd      <= '1' after 5 ns;
5536
                                reg_addr    <= conv_std_logic_vector(128, 8) after 5 ns;
5537
                                reg_data_in <= X"00000000" after 5 ns;
5538
 
5539
                        elsif (nextstate=WRITE_MDIO1) then
5540
 
5541
                                reg_wr      <= '1' after 5 ns;
5542
                                reg_rd      <= '0' after 5 ns;
5543
                                reg_addr    <= conv_std_logic_vector(160, 8) after 5 ns;
5544
                                reg_data_in <= X"55555555" after 5 ns;
5545
 
5546
                        elsif (nextstate=READ_MDIO1) then
5547
 
5548
                                reg_wr      <= '0' after 5 ns;
5549
                                reg_rd      <= '1' after 5 ns;
5550
                                reg_addr    <= conv_std_logic_vector(160, 8) after 5 ns;
5551
                                reg_data_in <= X"00000000" after 5 ns;
5552
 
5553
                        elsif (nextstate=LUT_PROG) then
5554
 
5555
                                mcast_addr :=  MCAST_ADDRESSLIST(lut_prog_cnt);
5556
 
5557
                                for i in 0 to 5 loop
5558
 
5559
                                        hash_code(i) := xor_reduce(mcast_addr((i*8)+7 downto i*8)) ;
5560
 
5561
                                end loop ;
5562
 
5563
                                reg_wr               <= '1' after 5 ns;
5564
                                reg_rd               <= '0' after 5 ns;
5565
                                reg_addr(7 downto 6) <= "01" after 5 ns;
5566
                                reg_addr(5 downto 0) <= hash_code after 5 ns;
5567
                                reg_data_in          <= X"00000001" after 5 ns;
5568
 
5569
                        elsif (nextstate=RD_FRM_TX) then
5570
 
5571
                                reg_wr      <= '0' after 5 ns;
5572
                                reg_rd      <= '1' after 5 ns;
5573
                                reg_addr    <= conv_std_logic_vector(26, 8) after 5 ns;
5574
                                reg_data_in <= X"00000000" after 5 ns;
5575
 
5576
                        elsif (nextstate=RD_FRM_RX) then
5577
 
5578
                                reg_wr      <= '0' after 5 ns;
5579
                                reg_rd      <= '1' after 5 ns;
5580
                                reg_addr    <= conv_std_logic_vector(27, 8) after 5 ns;
5581
                                reg_data_in <= X"00000000" after 5 ns;
5582
 
5583
                        elsif (nextstate=RD_CRC_ERR) then
5584
 
5585
                                reg_wr      <= '0' after 5 ns;
5586
                                reg_rd      <= '1' after 5 ns;
5587
                                reg_addr    <= conv_std_logic_vector(28, 8) after 5 ns;
5588
                                reg_data_in <= X"00000000" after 5 ns;
5589
 
5590
                        elsif (nextstate=RD_ALIGN_ERR) then
5591
 
5592
                                reg_wr      <= '0' after 5 ns;
5593
                                reg_rd      <= '1' after 5 ns;
5594
                                reg_addr    <= conv_std_logic_vector(29, 8) after 5 ns;
5595
                                reg_data_in <= X"00000000" after 5 ns;
5596
 
5597
                        elsif (nextstate=RD_TX_OCTETS) then
5598
 
5599
                                reg_wr      <= '0' after 5 ns;
5600
                                reg_rd      <= '1' after 5 ns;
5601
                                reg_addr    <= conv_std_logic_vector(30, 8) after 5 ns;
5602
                                reg_data_in <= X"00000000" after 5 ns;
5603
 
5604
                        elsif (nextstate=RD_RX_OCTETS) then
5605
 
5606
                                reg_wr      <= '0' after 5 ns;
5607
                                reg_rd      <= '1' after 5 ns;
5608
                                reg_addr    <= conv_std_logic_vector(31, 8) after 5 ns;
5609
                                reg_data_in <= X"00000000" after 5 ns;
5610
 
5611
                        elsif (nextstate=RD_PAUSE_TX) then
5612
 
5613
                                reg_wr      <= '0' after 5 ns;
5614
                                reg_rd      <= '1' after 5 ns;
5615
                                reg_addr    <= conv_std_logic_vector(32, 8) after 5 ns;
5616
                                reg_data_in <= X"00000000" after 5 ns;
5617
 
5618
                        elsif (nextstate=RD_PAUSE_RX) then
5619
 
5620
                                reg_wr      <= '0' after 5 ns;
5621
                                reg_rd      <= '1' after 5 ns;
5622
                                reg_addr    <= conv_std_logic_vector(33, 8) after 5 ns;
5623
                                reg_data_in <= X"00000000" after 5 ns;
5624
 
5625
                        elsif (nextstate=RX_UNICAST) then
5626
 
5627
                                reg_wr      <= '0' after 5 ns;
5628
                                reg_rd      <= '1' after 5 ns;
5629
                                reg_addr    <= conv_std_logic_vector(36, 8) after 5 ns;
5630
                                reg_data_in <= X"00000000" after 5 ns;
5631
 
5632
                        elsif (nextstate=RX_MLTCAST) then
5633
 
5634
                                reg_wr      <= '0' after 5 ns;
5635
                                reg_rd      <= '1' after 5 ns;
5636
                                reg_addr    <= conv_std_logic_vector(37, 8) after 5 ns;
5637
                                reg_data_in <= X"00000000" after 5 ns;
5638
 
5639
                        elsif (nextstate=RX_BRDCAST) then
5640
 
5641
                                reg_wr      <= '0' after 5 ns;
5642
                                reg_rd      <= '1' after 5 ns;
5643
                                reg_addr    <= conv_std_logic_vector(38, 8) after 5 ns;
5644
                                reg_data_in <= X"00000000" after 5 ns;
5645
 
5646
                        elsif (nextstate=TX_FRM_DISCARD) then
5647
 
5648
                                reg_wr      <= '0' after 5 ns;
5649
                                reg_rd      <= '1' after 5 ns;
5650
                                reg_addr    <= conv_std_logic_vector(39, 8) after 5 ns;
5651
                                reg_data_in <= X"00000000" after 5 ns;
5652
 
5653
                        elsif (nextstate=TX_UNICAST) then
5654
 
5655
                                reg_wr      <= '0' after 5 ns;
5656
                                reg_rd      <= '1' after 5 ns;
5657
                                reg_addr    <= conv_std_logic_vector(40, 8) after 5 ns;
5658
                                reg_data_in <= X"00000000" after 5 ns;
5659
 
5660
                        elsif (nextstate=TX_MLTCAST) then
5661
 
5662
                                reg_wr      <= '0' after 5 ns;
5663
                                reg_rd      <= '1' after 5 ns;
5664
                                reg_addr    <= conv_std_logic_vector(41, 8) after 5 ns;
5665
                                reg_data_in <= X"00000000" after 5 ns;
5666
 
5667
                        elsif (nextstate=TX_BRDCAST) then
5668
 
5669
                                reg_wr      <= '0' after 5 ns;
5670
                                reg_rd      <= '1' after 5 ns;
5671
                                reg_addr    <= conv_std_logic_vector(42, 8) after 5 ns;
5672
                                reg_data_in <= X"00000000" after 5 ns;
5673
 
5674
                        elsif (nextstate=RX_FRM_ERR) then
5675
 
5676
                                reg_wr      <= '0' after 5 ns;
5677
                                reg_rd      <= '1' after 5 ns;
5678
                                reg_addr    <= conv_std_logic_vector(34, 8) after 5 ns;
5679
                                reg_data_in <= X"00000000" after 5 ns;
5680
 
5681
                        elsif (nextstate=TX_FRM_ERR) then
5682
 
5683
                                reg_wr      <= '0' after 5 ns;
5684
                                reg_rd      <= '1' after 5 ns;
5685
                                reg_addr    <= conv_std_logic_vector(35, 8) after 5 ns;
5686
                                reg_data_in <= X"00000000" after 5 ns;
5687
 
5688
                        elsif (nextstate=RX_FRM_DROP) then
5689
 
5690
                                reg_wr      <= '0' after 5 ns;
5691
                                reg_rd      <= '1' after 5 ns;
5692
                                reg_addr    <= conv_std_logic_vector(43, 8) after 5 ns;
5693
                                reg_data_in <= X"00000000" after 5 ns;
5694
 
5695
                        elsif (nextstate=RX_UNDERSZ_FRM) then
5696
 
5697
                                reg_wr      <= '0' after 5 ns;
5698
                                reg_rd      <= '1' after 5 ns;
5699
                                reg_addr    <= conv_std_logic_vector(46, 8) after 5 ns;
5700
                                reg_data_in <= X"00000000" after 5 ns;
5701
 
5702
                        elsif (nextstate=RX_OVERSZ_FRM) then
5703
 
5704
                                reg_wr      <= '0' after 5 ns;
5705
                                reg_rd      <= '1' after 5 ns;
5706
                                reg_addr    <= conv_std_logic_vector(47, 8) after 5 ns;
5707
                                reg_data_in <= X"00000000" after 5 ns;
5708
 
5709
                        elsif (nextstate=RX_64_FRM) then
5710
 
5711
                                reg_wr      <= '0' after 5 ns;
5712
                                reg_rd      <= '1' after 5 ns;
5713
                                reg_addr    <= conv_std_logic_vector(48, 8) after 5 ns;
5714
                                reg_data_in <= X"00000000" after 5 ns;
5715
 
5716
                        elsif (nextstate=RX_65_127_FRM) then
5717
 
5718
                                reg_wr      <= '0' after 5 ns;
5719
                                reg_rd      <= '1' after 5 ns;
5720
                                reg_addr    <= conv_std_logic_vector(49, 8) after 5 ns;
5721
                                reg_data_in <= X"00000000" after 5 ns;
5722
 
5723
                        elsif (nextstate=RX_128_255_FRM) then
5724
 
5725
                                reg_wr      <= '0' after 5 ns;
5726
                                reg_rd      <= '1' after 5 ns;
5727
                                reg_addr    <= conv_std_logic_vector(50, 8) after 5 ns;
5728
                                reg_data_in <= X"00000000" after 5 ns;
5729
 
5730
                        elsif (nextstate=RX_256_511_FRM) then
5731
 
5732
                                reg_wr      <= '0' after 5 ns;
5733
                                reg_rd      <= '1' after 5 ns;
5734
                                reg_addr    <= conv_std_logic_vector(51, 8) after 5 ns;
5735
                                reg_data_in <= X"00000000" after 5 ns;
5736
 
5737
                        elsif (nextstate=RX_512_1023_FRM) then
5738
 
5739
                                reg_wr      <= '0' after 5 ns;
5740
                                reg_rd      <= '1' after 5 ns;
5741
                                reg_addr    <= conv_std_logic_vector(52, 8) after 5 ns;
5742
                                reg_data_in <= X"00000000" after 5 ns;
5743
 
5744
                        elsif (nextstate=RX_1024_1518_FRM) then
5745
 
5746
                                reg_wr      <= '0' after 5 ns;
5747
                                reg_rd      <= '1' after 5 ns;
5748
                                reg_addr    <= conv_std_logic_vector(53, 8) after 5 ns;
5749
                                reg_data_in <= X"00000000" after 5 ns;
5750
 
5751
                        elsif (nextstate=RX_1519_X_FRM) then
5752
 
5753
                                reg_wr      <= '0' after 5 ns;
5754
                                reg_rd      <= '1' after 5 ns;
5755
                                reg_addr    <= conv_std_logic_vector(54, 8) after 5 ns;
5756
                                reg_data_in <= X"00000000" after 5 ns;
5757
 
5758
                        elsif (nextstate=RX_JABBER) then
5759
 
5760
                                reg_wr      <= '0' after 5 ns;
5761
                                reg_rd      <= '1' after 5 ns;
5762
                                reg_addr    <= conv_std_logic_vector(55, 8) after 5 ns;
5763
                                reg_data_in <= X"00000000" after 5 ns;
5764
 
5765
                        elsif (nextstate=RX_FRAGMENT) then
5766
 
5767
                                reg_wr      <= '0' after 5 ns;
5768
                                reg_rd      <= '1' after 5 ns;
5769
                                reg_addr    <= conv_std_logic_vector(56, 8) after 5 ns;
5770
                                reg_data_in <= X"00000000" after 5 ns;
5771
 
5772
                        elsif (nextstate=SW_RESET) then
5773
 
5774
                                reg_wr          <= '1' after 5 ns;
5775
                                reg_rd          <= '0' after 5 ns;
5776
                                reg_addr        <= conv_std_logic_vector(2, 8) after 5 ns;
5777
 
5778
                                reg_data_in(12 downto 0)  <= (others=>'0') ;
5779
                                reg_data_in(13)           <= '1' ;
5780
                                reg_data_in(31 downto 14) <= (others=>'0') ;
5781
 
5782
                        elsif (nextstate=RD_SW_RESET) then
5783
 
5784
                                reg_wr      <= '0' after 5 ns;
5785
                                reg_rd      <= '1' after 5 ns;
5786
                                reg_addr    <= conv_std_logic_vector(2, 8) after 5 ns;
5787
                                reg_data_in <= X"00000000" after 5 ns;
5788
 
5789
                        else
5790
 
5791
                                reg_wr      <= '0' after 5 ns;
5792
                                reg_rd      <= '0' after 5 ns;
5793
                                reg_addr    <= (others=>'0') after 5 ns;
5794
                                reg_data_in <= (others=>'0') after 5 ns;
5795
 
5796
                        end if ;
5797
 
5798
                end if ;
5799
 
5800
        end process ;
5801
 
5802
   -- Colision Detection
5803
   -- ------------------
5804
 
5805
        process(m_rx_col)
5806
 
5807
                variable ln : line ;
5808
 
5809
        begin
5810
 
5811
                if (m_rx_col='1' and m_rx_col'event and m_tx_en='1') then
5812
 
5813
                        writeline(OUTPUT, ln);
5814
                        write(ln, NOW );
5815
                        write(ln, string'(" - Collision, Frame Re-Transmitted after Back Off Period"));
5816
                        writeline(OUTPUT, ln);
5817
 
5818
                end if ;
5819
 
5820
        end process ;
5821
 
5822
    -- Version
5823
    -- -------
5824
 
5825
        process(reg_clk)
5826
 
5827
                variable ln : line ;
5828
 
5829
        begin
5830
 
5831
                if (reg_clk='0' and reg_clk'event) then
5832
 
5833
                        if (state=READ_VER and reg_busy='0') then
5834
 
5835
 
5836
                                        write(ln, string'("   - Altera Design Version : ")) ;
5837
                                        write(ln, conv_integer(reg_data_out(15 downto 8))) ;
5838
                                        write(ln, string'(".")) ;
5839
                                        write(ln, conv_integer(reg_data_out(7 downto 0))) ;
5840
                                        writeline(output, ln) ;
5841
                                        write(ln, string'(" ")) ;
5842
                                        writeline(output, ln) ;
5843
 
5844
 
5845
 
5846
                                if (ETH_SPEED=1000 and HD_ENA=TRUE) then
5847
 
5848
                                        write(ln, string'(" Error: Half Duplex must Disabled for Gigabit Operation")) ;
5849
                                        writeline(output, ln) ;
5850
                                        write(ln, string'(" ")) ;
5851
                                        writeline(output, ln) ;
5852
                                        assert false report "Simulation Set Up Error" severity failure ;
5853
 
5854
                                end if ;
5855
 
5856
                                if (HD_ENA=TRUE and ENABLE_HD_LOGIC=0) then
5857
 
5858
                                        write(ln, string'(" Error: Half Duplex Logic is Disabled, Design Operates only Support Full Duplex Operation")) ;
5859
                                        writeline(output, ln) ;
5860
                                        write(ln, string'(" ")) ;
5861
                                        writeline(output, ln) ;
5862
                                        assert false report "Design Set Up Error" severity failure ;
5863
 
5864
                                end if ;
5865
 
5866
                                if (ENABLE_SUP_ADDR=1 and (TB_ADDR_SEL=1 or TB_ADDR_SEL=2 or TB_ADDR_SEL=3)) then
5867
 
5868
                                        write(ln, string'(" Error: Address Selection must be 0, 4, 5, 6 or 7")) ;
5869
                                        writeline(output, ln) ;
5870
                                        write(ln, string'(" ")) ;
5871
                                        writeline(output, ln) ;
5872
                                        assert false report "Design Set Up Error" severity failure ;
5873
 
5874
                                end if ;
5875
 
5876
                                if (TB_MACPADEN=TRUE and TB_MACFWDCRC=TRUE) then
5877
 
5878
                                        write(ln, string'(" Warning: Setting Padding Termination and Forward CRC Options may Results in Simulation Errors")) ;
5879
                                        writeline(output, ln) ;
5880
 
5881
                                end if ;
5882
 
5883
                        end if ;
5884
 
5885
                end if ;
5886
 
5887
        end process ;
5888
 
5889
   -- Simulation Info
5890
   -- --------------- 
5891
 
5892
        process(mff_is_pause)
5893
 
5894
                variable ln : line ;
5895
 
5896
        begin
5897
 
5898
                if (mff_is_pause='1') then
5899
 
5900
                        write(ln, NOW) ;
5901
                        write(ln, string'(" - Pause Frame Received on FIFO Interface")) ;
5902
                        writeline(output, ln) ;
5903
 
5904
                end if ;
5905
 
5906
        end process ;
5907
 
5908
        process(xoff_gen)
5909
 
5910
                variable ln    : line;
5911
                file     log   : text open write_mode is LOG_FILE;
5912
 
5913
        begin
5914
 
5915
           -- Forced Xoff Frame tranmsitted
5916
           -- -----------------------------
5917
 
5918
                if (xoff_gen='1' and xoff_gen'event) then
5919
 
5920
                        write(ln, NOW );
5921
                        write(ln, string'(" - Xoff Pause Frame Generation Requested with Command Pin"));
5922
                        writeline_log(log,ln);
5923
                        write(ln, string'(" ")) ;
5924
                        writeline(output, ln) ;
5925
 
5926
                end if;
5927
 
5928
        end process ;
5929
 
5930
        process(xon_gen)
5931
 
5932
                variable ln    : line;
5933
                file     log   : text open write_mode is LOG_FILE;
5934
 
5935
        begin
5936
 
5937
           -- Forced Xoff Frame tranmsitted
5938
           -- -----------------------------
5939
 
5940
                if (xon_gen='1' and xon_gen'event) then
5941
 
5942
                        write(ln, NOW );
5943
                        write(ln, string'(" - Xon Pause Frame Generation Requested with Command Pin"));
5944
                        writeline_log(log,ln);
5945
 
5946
                end if;
5947
 
5948
        end process ;
5949
 
5950
    -- Scratch Register
5951
    -- ----------------
5952
 
5953
        process(state)
5954
 
5955
                variable ln : line ;
5956
 
5957
        begin
5958
 
5959
                if (state=WR_SCRATCH ) then
5960
 
5961
                        write(ln, string'("   - Write Scratch : 0xaaaaaaaa")) ;
5962
                        writeline(output, ln) ;
5963
 
5964
                end if ;
5965
 
5966
        end process ;
5967
 
5968
        process(reg_clk)
5969
 
5970
                variable ln : line ;
5971
 
5972
        begin
5973
 
5974
                if (reg_clk='0' and reg_clk'event) then
5975
 
5976
                        if (state=RD_SCRATCH and reg_busy='0' ) then
5977
 
5978
                                write(ln, string'("   - Read Scratch: 0x")) ;
5979
                                WRITE_HEX(ln, reg_data_out) ;
5980
                                writeline(output, ln) ;
5981
                                write(ln, string'(" ")) ;
5982
                                writeline(output, ln) ;
5983
                                readback_scratch <= reg_data_out;
5984
                        end if ;
5985
 
5986
                end if ;
5987
 
5988
        end process ;
5989
 
5990
    -- Core Configuration
5991
    -- ------------------
5992
 
5993
        process(state)
5994
 
5995
                variable ln : line ;
5996
 
5997
        begin
5998
 
5999
                if (state=MAC_CONFIG ) then
6000
 
6001
                        write(ln, string'("   - MAC Configuration")) ;
6002
                        writeline(output, ln) ;
6003
                        write(ln, string'(" ")) ;
6004
                        writeline(output, ln) ;
6005
 
6006
                end if ;
6007
 
6008
        end process ;
6009
 
6010
 
6011
        process(state)
6012
 
6013
                variable ln : line ;
6014
 
6015
        begin
6016
 
6017
                if (state=WR_MAC1 ) then
6018
 
6019
                        write(ln, string'("   - Write MAC Address")) ;
6020
                        writeline(output, ln) ;
6021
                        write(ln, string'(" ")) ;
6022
                        writeline(output, ln) ;
6023
 
6024
                end if ;
6025
 
6026
        end process ;
6027
 
6028
 
6029
        process(state)
6030
 
6031
                variable ln : line ;
6032
 
6033
        begin
6034
 
6035
                if (state=WR_SUP_MAC0_0 ) then
6036
 
6037
                        write(ln, string'("   - Setting Supplemental MAC Addresses")) ;
6038
                        writeline(output, ln) ;
6039
                        write(ln, string'(" ")) ;
6040
                        writeline(output, ln) ;
6041
 
6042
                end if ;
6043
 
6044
        end process ;
6045
 
6046
        process(state)
6047
 
6048
                variable ln : line ;
6049
 
6050
        begin
6051
 
6052
                if (state=LUT_PROG and lut_prog_cnt=1) then
6053
 
6054
                        write(ln, string'("   - Load Hash Table")) ;
6055
                        writeline(output, ln) ;
6056
                        write(ln, string'(" ")) ;
6057
                        writeline(output, ln) ;
6058
 
6059
                end if ;
6060
 
6061
        end process ;
6062
 
6063
        process(state)
6064
 
6065
                variable ln : line ;
6066
 
6067
        begin
6068
 
6069
                if (state=WR_FRM_LENGTH ) then
6070
 
6071
                        write(ln, string'("   - Write Maximum Frame Length")) ;
6072
                        writeline(output, ln) ;
6073
                        write(ln, string'(" ")) ;
6074
                        writeline(output, ln) ;
6075
 
6076
                end if ;
6077
 
6078
        end process ;
6079
 
6080
        process(state)
6081
 
6082
                variable ln : line ;
6083
 
6084
        begin
6085
 
6086
                if (state=WR_PAUSE_QUANTA ) then
6087
 
6088
                        write(ln, string'("   - Write Pause Quanta")) ;
6089
                        writeline(output, ln) ;
6090
                        write(ln, string'(" ")) ;
6091
                        writeline(output, ln) ;
6092
 
6093
                end if ;
6094
 
6095
        end process ;
6096
 
6097
        process(state)
6098
 
6099
                variable ln : line ;
6100
 
6101
        begin
6102
 
6103
                if (state=WR_RX_SE ) then
6104
 
6105
                        write(ln, string'("   - Setting FIFO thresholds")) ;
6106
                        writeline(output, ln) ;
6107
                        write(ln, string'(" ")) ;
6108
                        writeline(output, ln) ;
6109
 
6110
                end if ;
6111
 
6112
        end process ;
6113
 
6114
    -- MDIO Test
6115
    -- ---------
6116
 
6117
        process(state)
6118
 
6119
                variable ln : line ;
6120
 
6121
        begin
6122
 
6123
                if (state=WR_MDIO_ADDR0) then
6124
 
6125
                        write(ln, string'("   - Programming MDIO Base Address 0")) ;
6126
                        writeline(output, ln) ;
6127
                        write(ln, string'(" ")) ;
6128
                        writeline(output, ln) ;
6129
 
6130
                end if ;
6131
 
6132
        end process ;
6133
 
6134
        process(state)
6135
 
6136
                variable ln : line ;
6137
 
6138
        begin
6139
 
6140
                if (state=WR_MDIO_ADDR1) then
6141
 
6142
                        write(ln, string'("   - Programming MDIO Base Address 1")) ;
6143
                        writeline(output, ln) ;
6144
                        write(ln, string'(" ")) ;
6145
                        writeline(output, ln) ;
6146
 
6147
                end if ;
6148
 
6149
        end process ;
6150
 
6151
        process(state)
6152
 
6153
                variable ln : line ;
6154
 
6155
        begin
6156
 
6157
                if (state=WRITE_MDIO0) then
6158
 
6159
                        write(ln, string'("   - Write MDIO Slave 0 Register 0 : 0xaaaa")) ;
6160
                        writeline(output, ln) ;
6161
 
6162
                end if ;
6163
 
6164
        end process ;
6165
 
6166
        process(state)
6167
 
6168
                variable ln : line ;
6169
 
6170
        begin
6171
 
6172
                if (state=WRITE_MDIO1) then
6173
 
6174
                        write(ln, string'("   - Write MDIO Slave 1 Register 0 : 0x5555")) ;
6175
                        writeline(output, ln) ;
6176
 
6177
                end if ;
6178
 
6179
        end process ;
6180
 
6181
        process(reg_clk)
6182
 
6183
                variable ln : line ;
6184
 
6185
        begin
6186
 
6187
                if (reg_clk='1' and reg_clk'event) then
6188
 
6189
                        if (state=READ_MDIO0 and reg_busy='0') then
6190
 
6191
                                write(ln, string'("   - Read MDIO Slave 0 Register 0 : 0x")) ;
6192
                                write_hex(ln, (reg_data_out(15 downto 0))) ;
6193
                                writeline(output, ln) ;
6194
                                write(ln, string'(" ")) ;
6195
                                writeline(output, ln) ;
6196
                                readback_MDIO0_addr0(15 downto 0) <= reg_data_out(15 downto 0);
6197
                        end if ;
6198
 
6199
                end if ;
6200
 
6201
        end process ;
6202
 
6203
        process(reg_clk)
6204
 
6205
                variable ln : line ;
6206
 
6207
        begin
6208
 
6209
                if (reg_clk='1' and reg_clk'event) then
6210
 
6211
                        if (state=READ_MDIO1 and reg_busy='0') then
6212
 
6213
                                write(ln, string'("   - Read MDIO Slave 1 Register 0 : 0x")) ;
6214
                                write_hex(ln, (reg_data_out(15 downto 0))) ;
6215
                                writeline(output, ln) ;
6216
                                write(ln, string'(" ")) ;
6217
                                writeline(output, ln) ;
6218
                                readback_MDIO1_addr0(15 downto 0) <= reg_data_out(15 downto 0);
6219
                        end if ;
6220
 
6221
                end if ;
6222
 
6223
        end process ;
6224
 
6225
        process(state)
6226
 
6227
                variable ln : line ;
6228
 
6229
        begin
6230
 
6231
                if (state=SIM) then
6232
 
6233
                        write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6234
                        writeline(output, ln) ;
6235
                        write(ln, string'(" ")) ;
6236
                        writeline(output, ln) ;
6237
 
6238
                end if ;
6239
 
6240
                if (state=END_SIM) then
6241
 
6242
                        write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6243
                        writeline(output, ln) ;
6244
                        write(ln, string'(" ")) ;
6245
                        writeline(output, ln) ;
6246
 
6247
                end if ;
6248
 
6249
        end process ;
6250
 
6251
        process(state)
6252
 
6253
                variable ln : line ;
6254
 
6255
        begin
6256
 
6257
                if (state=SW_RESET) then
6258
 
6259
                        write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6260
                        writeline(output, ln) ;
6261
                        write(ln, string'(" ")) ;
6262
                        writeline(output, ln) ;
6263
                        write(ln, string'("   - Clearing Statistics")) ;
6264
                        writeline(output, ln) ;
6265
                        write(ln, string'(" ")) ;
6266
                        writeline(output, ln) ;
6267
                        write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6268
                        writeline(output, ln) ;
6269
                        write(ln, string'(" ")) ;
6270
                        writeline(output, ln) ;
6271
 
6272
                end if ;
6273
 
6274
        end process ;
6275
 
6276
   -- Magic Packet Detection
6277
   -- ----------------------
6278
 
6279
        process(state)
6280
 
6281
                variable ln : line ;
6282
 
6283
        begin
6284
 
6285
                if (state=WR_ENA_MAGIC) then
6286
 
6287
                        write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6288
                        writeline(output, ln) ;
6289
                        write(ln, string'(" ")) ;
6290
                        writeline(output, ln) ;
6291
                        write(ln, string'("   - Magic Packet Detection Test")) ;
6292
                        writeline(output, ln) ;
6293
                        write(ln, string'(" ")) ;
6294
                        writeline(output, ln) ;
6295
 
6296
                end if ;
6297
 
6298
        end process ;
6299
 
6300
        process(magic_sleep_n)
6301
 
6302
                variable ln : line ;
6303
 
6304
        begin
6305
 
6306
                if (magic_sleep_n='0' and magic_sleep_n'event) then
6307
 
6308
                        write(ln, string'("       Set Core in Sleep Mode with External Pin")) ;
6309
                        writeline(output, ln) ;
6310
                        write(ln, string'(" ")) ;
6311
                        writeline(output, ln) ;
6312
 
6313
                end if ;
6314
 
6315
                if (magic_sleep_n='1' and magic_sleep_n'event) then
6316
 
6317
                        write(ln, string'("       Set Core in Normal Mode with External Pin")) ;
6318
                        writeline(output, ln) ;
6319
                        write(ln, string'(" ")) ;
6320
                        writeline(output, ln) ;
6321
 
6322
                end if ;
6323
 
6324
        end process ;
6325
 
6326
        process(state)
6327
 
6328
                variable ln : line ;
6329
 
6330
        begin
6331
 
6332
                if (state=WR_ENA_MAGIC) then
6333
 
6334
                        write(ln, string'("       Set Core in Sleep Mode with Register Access")) ;
6335
                        writeline(output, ln) ;
6336
                        write(ln, string'(" ")) ;
6337
                        writeline(output, ln) ;
6338
 
6339
                end if ;
6340
 
6341
                if (state=NODE_ON) then
6342
 
6343
                        write(ln, string'("       Set Core in Normal Mode with Register Access")) ;
6344
                        writeline(output, ln) ;
6345
                        write(ln, string'(" ")) ;
6346
                        writeline(output, ln) ;
6347
 
6348
                end if ;
6349
 
6350
        end process ;
6351
 
6352
        process(reg_wakeup)
6353
 
6354
                variable ln : line ;
6355
 
6356
        begin
6357
 
6358
                if (reg_wakeup='1' and reg_wakeup'event) then
6359
 
6360
                        write(ln, string'("       Magic Packet Detected, Wakeup Request Asserted")) ;
6361
                        writeline(output, ln) ;
6362
                        write(ln, string'(" ")) ;
6363
                        writeline(output, ln) ;
6364
 
6365
                end if ;
6366
 
6367
                if (reg_wakeup='0' and reg_wakeup'event and NOW>100 ns) then
6368
 
6369
                        write(ln, string'("       Wakeup Request De-Asserted")) ;
6370
                        writeline(output, ln) ;
6371
                        write(ln, string'(" ")) ;
6372
                        writeline(output, ln) ;
6373
 
6374
                end if ;
6375
 
6376
        end process ;
6377
 
6378
 
6379
   --  register test status
6380
   --  -----------------------
6381
   process (reset,state,nextstate)
6382
       variable ln : line ;
6383
   begin
6384
 
6385
       if (reset = '1') then
6386
          register_test <= 0;
6387
       else
6388
          if (nextstate = END_SIM_WAIT and state = SIM) then
6389
                -- expected scratch register readback is 0xaaaaaaaa
6390
                -- expected MDIO slave 0 address 0 register readback is 0x0000aaaa
6391
                -- expected MDIO slave 1 address 0 register readback is 0x00005555
6392
                --
6393
                if (readback_scratch /= x"aaaaaaaa" and ENABLE_MACLITE = 0) then
6394
                     write(ln, string'("      Register test failed on SCRATCH registers")) ;
6395
                     writeline(output, ln) ;
6396
                     register_test <= 1;
6397
                end if;
6398
 
6399
                 if (TB_MDIO_SIMULATION=TRUE and  ENABLE_MDIO = 1) then
6400
                   if ( (readback_MDIO0_addr0 /= x"aaaa") or (readback_MDIO1_addr0/= x"5555") ) then
6401
 
6402
                     write(ln, string'("      Register test failed on MDIO registers")) ;
6403
                     writeline(output, ln) ;
6404
                     register_test <= 1;
6405
 
6406
                   end if;
6407
                 end if;
6408
          end if;
6409
       end if;
6410
   end process;
6411
 
6412
 
6413
    -- End of Simulation Status
6414
    -- ------------------------
6415
 
6416
        process( rx_clk_tb, reset )
6417
 
6418
                variable ln             : line;
6419
                file log                : text open write_mode is LOG_FILE;
6420
                variable rx_no_errs     : boolean;
6421
                variable tx_no_errs     : boolean;
6422
 
6423
        begin
6424
 
6425
                if( reset='1' ) then
6426
 
6427
                        promis_en_dly <= '0';
6428
                        ff_rx_rdy_dly <= '1';
6429
 
6430
                elsif( rx_clk_tb='1' and rx_clk_tb'event ) then
6431
 
6432
                        if( sim_stop='1' ) then
6433
 
6434
                                if (TB_MACPADEN=TRUE) then
6435
 
6436
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=1 and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6437
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6438
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6439
                                                      (rx_pause_sent           = rx_pause_rcvd) and
6440
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6441
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6442
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6443
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6444
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6445
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6446
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6447
                    end if;
6448
 
6449
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=0 and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6450
                                    rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6451
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6452
                                                      (rx_pause_rcvd           = 0) and
6453
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6454
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6455
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6456
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6457
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6458
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6459
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6460
                    end if;
6461
 
6462
 
6463
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=0 and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6464
                                    rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6465
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6466
                                                      (rx_pause_rcvd           = 0) and
6467
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6468
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6469
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6470
                                                      (rx_vlan_rcvd            = 0) and
6471
                                                      (rx_stack_vlan_rcvd      = 0) and
6472
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6473
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6474
                    end if;
6475
 
6476
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=1 and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6477
                                    rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6478
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6479
                                                      (rx_pause_sent           = rx_pause_rcvd) and
6480
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6481
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6482
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6483
                                                      (rx_vlan_rcvd            = 0) and
6484
                                                      (rx_stack_vlan_rcvd      = 0) and
6485
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6486
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6487
                    end if;
6488
 
6489
                    if(STAT_CNT_ENA = 0  and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6490
                                    rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6491
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6492
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6493
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6494
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6495
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6496
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6497
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6498
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6499
                    end if;
6500
 
6501
                    if(STAT_CNT_ENA = 0  and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6502
                                    rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6503
                                                      (rx_payload_err_sent     = rx_payload_err_rcvd) and
6504
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6505
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6506
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6507
                                                      (rx_vlan_rcvd            = 0) and
6508
                                                      (rx_stack_vlan_rcvd      = 0) and
6509
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6510
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6511
                    end if;
6512
 
6513
 
6514
                                else
6515
 
6516
 
6517
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=1 and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6518
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6519
                                                      (rx_pause_sent           = rx_pause_rcvd) and
6520
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6521
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6522
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6523
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6524
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6525
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6526
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6527
                    end if;
6528
 
6529
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=0 and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6530
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6531
                                                      (rx_pause_rcvd           = 0) and
6532
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6533
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6534
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6535
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6536
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6537
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6538
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6539
                    end if;
6540
 
6541
 
6542
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=0 and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6543
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6544
                                                      (rx_pause_rcvd           = 0) and
6545
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6546
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6547
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6548
                                                      (rx_vlan_rcvd            = 0) and
6549
                                                      (rx_stack_vlan_rcvd      = 0) and
6550
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6551
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6552
                    end if;
6553
 
6554
                    if(STAT_CNT_ENA = 1 and ENABLE_MAC_FLOW_CTRL=1 and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6555
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6556
                                                      (rx_pause_sent           = rx_pause_rcvd) and
6557
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6558
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6559
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6560
                                                      (rx_vlan_rcvd            = 0) and
6561
                                                      (rx_stack_vlan_rcvd      = 0) and
6562
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6563
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6564
                    end if;
6565
 
6566
                    if(STAT_CNT_ENA = 0  and ENABLE_MAC_RX_VLAN=1 and ENABLE_MAC_TX_VLAN=1) then
6567
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6568
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6569
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6570
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6571
                                                      (rx_vlan_sent            = rx_vlan_rcvd) and
6572
                                                      (rx_stack_vlan_sent      = rx_stack_vlan_rcvd) and
6573
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6574
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6575
                    end if;
6576
 
6577
                    if(STAT_CNT_ENA = 0  and ENABLE_MAC_RX_VLAN=0 and ENABLE_MAC_TX_VLAN=0) then
6578
                                        rx_no_errs := (rx_good_sent            = rx_good_rcvd) and
6579
                                                      (rx_align_err_sent       = rx_align_err_rcvd) and
6580
                                                      (rx_discard_sent         = rx_discard_rcvd) and
6581
                                                      (rx_wrong_status_sent    = rx_wrong_status_rcvd) and
6582
                                                      (rx_vlan_rcvd            = 0) and
6583
                                                      (rx_stack_vlan_rcvd      = 0) and
6584
                                                      (rx_wrong_mac_sent       = rx_wrong_mac_rcvd) and
6585
                                                      (rx_multicast_sent_total = rx_multicast_rcvd + rx_multicast_denied);
6586
                    end if;
6587
 
6588
 
6589
                                end if ;
6590
 
6591
                           -- Loopback Simulation
6592
                           -- -------------------
6593
 
6594
                                if( TB_RXFRAMES=0 ) then
6595
 
6596
                                        rx_no_errs := (rx_good_rcvd = tx_good_rcvd) and      -- THE RX monitor should have received all the TX monitor got
6597
                                                      (rx_payload_err_rcvd = tx_payload_err_rcvd);
6598
 
6599
                                end if;
6600
 
6601
                                if (ENA_INVERT_LB=FALSE) then
6602
 
6603
                                        tx_no_errs := (((tx_good_sent      = tx_good_rcvd) and TB_TX_FF_ERR=FALSE) or ((tx_good_sent = tx_phy_err_rcvd) and TB_TX_FF_ERR=TRUE))and
6604
                                              (tx_payload_err_sent = tx_payload_err_rcvd) and
6605
                                              (tx_align_err_rcvd   = 0) and
6606
                                              (tx_crc_err_rcvd     = 0) and
6607
                                              (tx_pause_err_rcvd   = 0) and
6608
                          (tx_vlan_sent = tx_vlan_rcvd) and
6609
                              (tx_stack_vlan_sent = tx_stack_vlan_rcvd) and
6610
                                              (tx_wrong_src_rcvd   = 0);
6611
 
6612
                                else
6613
 
6614
                                        tx_no_errs := (tx_good_rcvd = rx_good_sent) and
6615
                                              (tx_align_err_rcvd   = 0) and
6616
                                              (tx_crc_err_rcvd     = rx_crc_err_sent) and
6617
                                              (tx_pause_err_rcvd   = 0) ;
6618
 
6619
                                end if ;
6620
 
6621
                                if( TB_RXFRAMES > 0) then
6622
 
6623
                                        write(ln, string'(" Statistics MAC Rx Path") );
6624
 
6625
                                        writeline(output, ln) ;
6626
                                        writeline(output, ln) ;
6627
                                        write(ln, string'(" "));
6628
                                        writeline(output, ln) ;
6629
 
6630
                                        write(ln, string'("     - Frames sent in RX path total: "));
6631
                                        write(ln, rxframe_cnt);
6632
                                        writeline(output, ln) ;
6633
 
6634
                                        write(ln, string'("      - Broadcast sent total: "));
6635
                                        write(ln, rx_broadcast_sent);
6636
                                        writeline(output, ln) ;
6637
 
6638
                                        write(ln, string'("      - Broadcast received: "));
6639
                                        write(ln, rx_broadcast_rcvd);
6640
                                        writeline(output, ln) ;
6641
 
6642
                                        write(ln, string'("      - wrong_mac_sent (good during promiscuous): "));
6643
                                        write(ln, rx_wrong_mac_sent);
6644
                                        writeline(output, ln) ;
6645
 
6646
                                        write(ln, string'("      - wrong_mac_rcvd: "));
6647
                                        write(ln, rx_wrong_mac_rcvd);
6648
                                        writeline(output, ln) ;
6649
 
6650
                                        write(ln, string'("      - multicast_sent_total: "));
6651
                                        write(ln, rx_multicast_sent_total);
6652
                                        writeline(output, ln) ;
6653
 
6654
                                        write(ln, string'("      - multicast_sent (good): "));
6655
                                        write(ln, rx_multicast_sent);
6656
                                        writeline(output, ln) ;
6657
 
6658
                                        write(ln, string'("      - multicast_rcvd (good): "));
6659
                                        write(ln, rx_multicast_rcvd);
6660
                                        writeline(output, ln) ;
6661
 
6662
                                        write(ln, string'("      - multicast_denied: "));
6663
                                        write(ln, rx_multicast_denied);
6664
                                        writeline(output, ln) ;
6665
 
6666
                                        write(ln, string'("      - good_sent: ") );
6667
                                        write(ln, rx_good_sent);
6668
                                        writeline(output, ln) ;
6669
 
6670
                                        write(ln, string'("      - good_rcvd: ") );
6671
                                        write(ln, rx_good_rcvd);
6672
                                        writeline(output, ln) ;
6673
 
6674
                                        write(ln, string'("      - wrong_status_sent: ") );
6675
                                        write(ln, rx_wrong_status_sent);
6676
                                        writeline(output, ln) ;
6677
 
6678
                                        write(ln, string'("      - wrong_status_rcvd: ") );
6679
                                        write(ln, rx_wrong_status_rcvd);
6680
                                        writeline(output, ln) ;
6681
 
6682
                                        write(ln, string'("      - pause_sent: ") );
6683
                                        write(ln, rx_pause_sent);
6684
                                        writeline(output, ln) ;
6685
 
6686
                                        write(ln, string'("      - pause_rcvd: ") );
6687
                                        write(ln, rx_pause_rcvd);
6688
                                        writeline(output, ln) ;
6689
 
6690
                                        write(ln, string'("      - vlan_sent: ") );
6691
                                        write(ln, rx_vlan_sent);
6692
                                        writeline(output, ln) ;
6693
 
6694
                                        write(ln, string'("      - vlan_rcvd: ") );
6695
                                        write(ln, rx_vlan_rcvd);
6696
                                        writeline(output, ln) ;
6697
 
6698
                                        write(ln, string'("      - stack_vlan_sent: ") );
6699
                                        write(ln, rx_stack_vlan_sent);
6700
                                        writeline(output, ln) ;
6701
 
6702
                                        write(ln, string'("      - stack_vlan_rcvd: ") );
6703
                                        write(ln, rx_stack_vlan_rcvd);
6704
                                        writeline(output, ln) ;
6705
 
6706
                                        write(ln, string'("      - vlan_wrong_type_sent: ") );
6707
                                        write(ln, rx_vlan_wrong_type_sent);
6708
                                        writeline(output, ln) ;
6709
 
6710
                                        write(ln, string'("      - discard_sent: ") );
6711
                                        write(ln, rx_discard_sent);
6712
                                        writeline(output, ln) ;
6713
 
6714
                                        write(ln, string'("      - discard_rcvd: ") );
6715
                                        write(ln, rx_discard_rcvd);
6716
                                        writeline(output, ln) ;
6717
 
6718
                                        write(ln, string'("      - align_err_sent: ") );
6719
                                        write(ln, rx_align_err_sent);
6720
                                        writeline(output, ln) ;
6721
 
6722
                                        write(ln, string'("      - align_err_rcvd: ") );
6723
                                        write(ln, rx_align_err_rcvd);
6724
                                        writeline(output, ln) ;
6725
 
6726
                                        write(ln, string'("      - length_err_rcvd: ") );
6727
                                        write(ln, rx_length_err_rcvd);
6728
                                        writeline(output, ln) ;
6729
 
6730
                                        write(ln, string'("      - length_mismatch_rcvd: ") );
6731
                                        write(ln, rx_length_mismatch_rcvd);
6732
                                        writeline(output, ln) ;
6733
 
6734
                                        write(ln, string'("      - crc_err_sent: ") );
6735
                                        write(ln, rx_crc_err_sent);
6736
                                        writeline(output, ln) ;
6737
 
6738
                                        write(ln, string'("      - crc_err_rcvd: ") );
6739
                                        write(ln, rx_crc_err_rcvd);
6740
                                        writeline(output, ln) ;
6741
 
6742
                                        if (TB_MACPADEN=TRUE) then
6743
 
6744
                                                write(ln, string'("      - payload_err_sent: ") );
6745
                                                write(ln, rx_payload_err_sent);
6746
                                                writeline(output, ln) ;
6747
 
6748
                                                write(ln, string'("      - payload_err_rcvd: ") );
6749
                                                write(ln, rx_payload_err_rcvd);
6750
                                                writeline(output, ln) ;
6751
 
6752
                                        end if ;
6753
 
6754
                                        write(ln, string'("      - fifo_overflow_rcvd: ") );
6755
                                        write(ln, rx_fifo_overflow_rcvd);
6756
                                        writeline(output, ln) ;
6757
 
6758
                                        write(ln, string'("      - rx_gmii_err_sent: ") );
6759
                                        write(ln, rx_gmii_err_sent);
6760
                                        writeline(output, ln) ;
6761
 
6762
                                        write(ln, string'("      - rx_gmii_err_rcvd: ") );
6763
                                        write(ln, rx_gmii_err_rcvd);
6764
                                        writeline(output, ln) ;
6765
 
6766
                                        if (HD_ENA) then
6767
 
6768
                                                write(ln, string'("      - rx_col_sent: ") );
6769
                                                write(ln, rx_col_sent);
6770
                                                writeline(output, ln) ;
6771
 
6772
                                                write(ln, string'("      - rx_col_rcvd: ") );
6773
                                                write(ln, rx_col_rcvd);
6774
                                                writeline(output, ln) ;
6775
 
6776
                                        end if ;
6777
 
6778
                                end if;
6779
 
6780
                                if( TB_TXFRAMES > 0) then
6781
 
6782
                                        write(ln, string'("  "));
6783
                                        writeline(output, ln) ;
6784
 
6785
                                        write(ln, string'(" Statistics MAC Tx Path") );
6786
 
6787
                                        writeline(output, ln) ;
6788
                                        write(ln, string'("  "));
6789
                                        writeline(output, ln) ;
6790
 
6791
                                        write(ln, string'("     - Frames sent in TX path total: "));
6792
                                        write(ln, txframe_cnt);
6793
                                        writeline(output, ln) ;
6794
 
6795
                                        if (TB_TX_FF_ERR=FALSE) then
6796
 
6797
                                                write(ln, string'("      - tx_good_sent: "));
6798
                                                write(ln, tx_good_sent);
6799
                                                writeline(output, ln) ;
6800
 
6801
                                        else
6802
 
6803
                                                write(ln, string'("      - tx_error_sent: "));
6804
                                                write(ln, tx_good_sent);
6805
                                                writeline(output, ln) ;
6806
 
6807
                                        end if ;
6808
 
6809
                                        write(ln, string'("      - tx_good_rcvd: "));
6810
                                        write(ln, tx_good_rcvd);
6811
                                        writeline(output, ln) ;
6812
 
6813
                                        write(ln, string'("      - tx_align_err_rcvd: "));
6814
                                        write(ln, tx_align_err_rcvd);
6815
                                        writeline(output, ln) ;
6816
 
6817
                                        write(ln, string'("      - tx_crc_err_rcvd: "));
6818
                                        write(ln, tx_crc_err_rcvd);
6819
                                        writeline(output, ln) ;
6820
 
6821
                                        write(ln, string'("      - tx_vlan_sent: "));
6822
                                        write(ln, tx_vlan_sent);
6823
                                        writeline(output, ln) ;
6824
 
6825
                                        write(ln, string'("      - tx_vlan_rcvd: "));
6826
                                        write(ln, tx_vlan_rcvd);
6827
                                        writeline(output, ln) ;
6828
 
6829
                                        write(ln, string'("      - tx_stack_vlan_sent: "));
6830
                                        write(ln, tx_stack_vlan_sent);
6831
                                        writeline(output, ln) ;
6832
 
6833
                                        write(ln, string'("      - tx_stack_vlan_rcvd: "));
6834
                                        write(ln, tx_stack_vlan_rcvd);
6835
                                        writeline(output, ln) ;
6836
 
6837
                                        write(ln, string'("      - tx_phy_err_rcvd: "));
6838
                                        write(ln, tx_phy_err_rcvd);
6839
                                        writeline(output, ln) ;
6840
 
6841
                                        write(ln, string'("      - payload_err_sent: "));
6842
                                        write(ln, tx_payload_err_sent);
6843
                                        writeline(output, ln) ;
6844
 
6845
                                        write(ln, string'("      - payload_err_rcvd: "));
6846
                                        write(ln, tx_payload_err_rcvd);
6847
                                        writeline(output, ln) ;
6848
 
6849
                                        if (ENA_INVERT_LB=FALSE) then
6850
 
6851
                                                write(ln, string'("      - wrong src MAC address: "));
6852
                                                write(ln, tx_wrong_src_rcvd);
6853
                                                writeline_log(log,ln);
6854
 
6855
                                        end if ;
6856
 
6857
                                end if; -- TB_TXFRAMES
6858
 
6859
 
6860
                                write(ln, string'("      - tx_pause_rcvd: "));         -- Pause can be received in both cases
6861
                                write(ln, tx_pause_rcvd);
6862
                                writeline(output, ln) ;
6863
 
6864
                                write(ln, string'("      - tx_pause_err_rcvd: "));
6865
                                write(ln, tx_pause_err_rcvd);
6866
                                writeline(output, ln) ;
6867
 
6868
                                if(TB_RXFRAMES=0) then
6869
 
6870
                                        write(ln, string'(" "));
6871
                                        writeline(output, ln) ;
6872
 
6873
                                        write(ln, string'("  Statistics MAC Rx Path - Loopback Test"));
6874
                                        writeline(output, ln) ;
6875
 
6876
                                        write(ln, string'(" "));
6877
                                        writeline(output, ln) ;
6878
 
6879
                                        write(ln, string'("      - rx_good_rcvd: ") );
6880
                                        write(ln, rx_good_rcvd);
6881
                                        writeline(output, ln) ;
6882
 
6883
                                        write(ln, string'("      - rx_fifo_overflow_rcvd: ") );
6884
                                        write(ln, rx_fifo_overflow_rcvd);
6885
                                        writeline(output, ln) ;
6886
 
6887
                                        write(ln, string'("      - rx_payload_err_rcvd: ") );
6888
                                        write(ln, rx_payload_err_rcvd);
6889
                                        writeline(output, ln) ;
6890
 
6891
                                        write(ln, string'("      - rx_crc_err_rcvd: ") );
6892
                                        write(ln, rx_crc_err_rcvd);
6893
                                        writeline(output, ln) ;
6894
 
6895
                                        if( tx_pause_rcvd=0 and TB_TRIGGERXOFF>0) then
6896
 
6897
                                                write(ln, string'("ERROR: Pause Frame Generation (pin pause_gen) had no effect") );
6898
                                                writeline(output, ln) ;
6899
 
6900
                                        end if;
6901
 
6902
                                        writeline(output, ln) ;
6903
                                        write(ln, string'(" "));
6904
                                        writeline(output, ln) ;
6905
 
6906
                                        if (rx_no_errs = false or register_test /= 0) then
6907
                                                write(ln, string'("-- Loopback Simulation Ended with Error(s) !"));
6908
                                        else
6909
                                          write(ln, string'("-- Loopback Simulation Ended with no Error"));
6910
                                        end if;
6911
                                        writeline(output, ln) ;
6912
 
6913
 
6914
                                end if;
6915
 
6916
 
6917
                                if(TB_RXFRAMES>0) then
6918
                                        writeline(output, ln) ;
6919
                                write(ln, string'(" "));
6920
                                writeline(output, ln) ;
6921
 
6922
                                        if (rx_no_errs = false or tx_no_errs=false or register_test /= 0) then
6923
                                                write(ln, string'("-- Simulation Ended with Error(s) !"));
6924
                                        else
6925
                                          write(ln, string'("-- Simulation Ended with no Error"));
6926
                                        end if;
6927
                                writeline(output, ln) ;
6928
 
6929
                                end if;
6930
 
6931
 
6932
                                write(ln, string'(" ")) ;
6933
                                writeline(output, ln) ;
6934
                                write(ln, string'("- ---------------------------------------------------------------------------------------- -")) ;
6935
                                writeline(output, ln) ;
6936
                                assert false report "End of Simulation - Break" severity failure  ;
6937
 
6938
 
6939
                        end if;
6940
 
6941
 
6942
                   -- Inform of Unexpected Signals Behaviour
6943
                   -- --------------------------------------
6944
 
6945
                        if( expect2='0' and TB_RXFRAMES/=0) then  -- RX test is active and nothing is expected to happen
6946
 
6947
                                if( (pause_rcv or frm_align_err or frm_type_err or frm_length_err or frm_crc_err) = '1' ) then
6948
 
6949
                                        write(ln, NOW);
6950
                                        write(ln, string'("    - Warning :"));
6951
 
6952
                                        if( pause_rcv='1' ) then
6953
 
6954
                                                write(ln, string'(" Unexpected RX pause_rcv") );
6955
                                                writeline(output, ln) ;
6956
 
6957
                                        end if;
6958
 
6959
                                        if( frm_align_err='1') then
6960
 
6961
                                                write(ln, string'(" Unexpected RX frm_align_err") );
6962
                                                writeline(output, ln) ;
6963
                                        end if;
6964
 
6965
                                        if( frm_type_err='1' ) then
6966
 
6967
                                                write(ln, string'(" Unexpected RX frm_type_err") );
6968
                                                writeline(output, ln) ;
6969
 
6970
                                        end if;
6971
 
6972
                                        if( frm_length_err='1')then
6973
 
6974
                                                write(ln, string'(" Unexpected RX frm_length_err") );
6975
                                                writeline(output, ln) ;
6976
 
6977
                                        end if;
6978
 
6979
                                        if( frm_crc_err   ='1')then
6980
 
6981
                                                write(ln, string'(" Unexpected RX frm_crc_err") );
6982
                                                writeline(output, ln) ;
6983
 
6984
                                        end if;
6985
 
6986
                                end if;
6987
 
6988
                      end if;
6989
 
6990
                   -- Promiscuous Mode Change
6991
                   -- -----------------------
6992
 
6993
                        promis_en_dly <= promis_en;
6994
 
6995
                        if(promis_en /= promis_en_dly) then
6996
 
6997
                                write(ln, NOW );
6998
 
6999
                                if( promis_en='1' and NOW>100 ns) then
7000
 
7001
                                        write(ln, string'(" - Promiscuous Mode enabled with multicast sent: ") );
7002
                                        write(ln, rx_multicast_sent );
7003
                                        write(ln, string'(", rcvd:"));
7004
                                        write(ln, rx_multicast_rcvd );
7005
                                        write(ln, string'(", denied:"));
7006
                                        write(ln, rx_multicast_denied );
7007
                                        writeline(output, ln) ;
7008
 
7009
                                else
7010
 
7011
                                        write(ln, string'(" - Promiscuous Mode disabled") );
7012
                                        writeline(output, ln) ;
7013
 
7014
                                end if;
7015
 
7016
                        end if;
7017
 
7018
                   -- FIFO Read Stop
7019
                   -- --------------
7020
 
7021
                        ff_rx_rdy_dly <= ff_rx_rdy;
7022
 
7023
                        if( ff_rx_rdy_dly /= ff_rx_rdy ) then
7024
 
7025
                                write(ln, NOW );
7026
 
7027
                                if( ff_rx_rdy='0' ) then
7028
 
7029
                                        write(ln, string'("    - RX FIFO Read Stop"));
7030
 
7031
                                else
7032
 
7033
                                        write(ln, string'("    - RX FIFO Read Start"));
7034
 
7035
                                end if;
7036
 
7037
                                writeline(output, ln) ;
7038
 
7039
                        end if;
7040
 
7041
                end if;
7042
 
7043
        end process;
7044
 
7045
    -- Global Simulation STOP
7046
    -- -----------------------
7047
 
7048
        process( reset, rx_clk_tb )
7049
        begin
7050
 
7051
                if( reset='1' ) then
7052
 
7053
                        delay_cnt <= 0;
7054
                        sim_stop  <= '0' ;
7055
 
7056
                elsif( rx_clk_tb='1' and rx_clk_tb'event) then
7057
 
7058
                        if(state=END_SIM) then
7059
 
7060
                                delay_cnt <= delay_cnt + 1;
7061
 
7062
                                if (delay_cnt=150) then
7063
 
7064
                                        sim_stop <= '1' ;
7065
 
7066
                                end if ;
7067
 
7068
                                if( delay_cnt > 200 ) then
7069
 
7070
                                        assert false severity failure  ;
7071
 
7072
                                end if;
7073
 
7074
                        elsif(gm_tx_en='1' or m_tx_en='1' or rgm_tx_en='1') then
7075
 
7076
                                delay_cnt <= 0;
7077
 
7078
                        end if;
7079
 
7080
                end if;
7081
 
7082
        end process;
7083
 
7084
end a ;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.