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

Subversion Repositories ethmac

[/] [ethmac/] [trunk/] [bench/] [verilog/] [tb_ethernet.v] - Blame information for rev 302

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 116 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  tb_ethernet.v                                               ////
4
////                                                              ////
5
////  This file is part of the Ethernet IP core project           ////
6
////  http://www.opencores.org/projects/ethmac/                   ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9 169 mohor
////      - Tadej Markovic, tadej@opencores.org                   ////
10 243 tadejm
////      - Igor Mohor,     igorM@opencores.org                  ////
11 116 mohor
////                                                              ////
12 169 mohor
////  All additional information is available in the Readme.txt   ////
13 116 mohor
////  file.                                                       ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2001, 2002 Authors                             ////
18
////                                                              ////
19
//// This source file may be used and distributed without         ////
20
//// restriction provided that this copyright statement is not    ////
21
//// removed from the file and that any derivative work contains  ////
22
//// the original copyright notice and the associated disclaimer. ////
23
////                                                              ////
24
//// This source file is free software; you can redistribute it   ////
25
//// and/or modify it under the terms of the GNU Lesser General   ////
26
//// Public License as published by the Free Software Foundation; ////
27
//// either version 2.1 of the License, or (at your option) any   ////
28
//// later version.                                               ////
29
////                                                              ////
30
//// This source is distributed in the hope that it will be       ////
31
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
32
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
33
//// PURPOSE.  See the GNU Lesser General Public License for more ////
34
//// details.                                                     ////
35
////                                                              ////
36
//// You should have received a copy of the GNU Lesser General    ////
37
//// Public License along with this source; if not, download it   ////
38
//// from http://www.opencores.org/lgpl.shtml                     ////
39
////                                                              ////
40
//////////////////////////////////////////////////////////////////////
41
//
42
// CVS Revision History
43
//
44
// $Log: not supported by cvs2svn $
45 302 markom
// Revision 1.29  2003/08/20 12:06:24  mohor
46
// Artisan RAMs added.
47
//
48 299 mohor
// Revision 1.28  2003/01/31 15:58:27  mohor
49
// Tests test_mac_full_duplex_receive 4-7  fixed to proper BD.
50
//
51 281 mohor
// Revision 1.27  2003/01/30 13:38:15  mohor
52
// Underrun test fixed. Many other tests fixed.
53
//
54 279 mohor
// Revision 1.26  2003/01/22 19:40:10  tadejm
55
// Backup version. Not fully working.
56
//
57 274 tadejm
// Revision 1.25  2002/11/27 16:21:55  mohor
58
// Full duplex control frames tested.
59
//
60 267 mohor
// Revision 1.24  2002/11/22 17:29:42  mohor
61
// Flow control test almost finished.
62
//
63 266 mohor
// Revision 1.23  2002/11/22 02:12:16  mohor
64
// test_mac_full_duplex_flow_control tests pretty much finished.
65
// TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL
66
// FRM. AT 4 TX BD ( 10Mbps ) finished.
67
// TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION
68
// TURNED OFF AT ONE RX BD ( 10Mbps ) finished.
69
//
70 263 mohor
// Revision 1.22  2002/11/21 13:56:50  mohor
71
// test_mac_full_duplex_flow test 0 finished. Sending the control (PAUSE) frame
72
// finished.
73
//
74 260 mohor
// Revision 1.21  2002/11/19 20:27:45  mohor
75
// Temp version.
76
//
77 254 mohor
// Revision 1.20  2002/11/19 17:41:19  tadejm
78
// Just some updates.
79
//
80 252 tadejm
// Revision 1.19  2002/11/14 13:12:47  tadejm
81
// Late collision is not reported any more.
82
//
83 243 tadejm
// Revision 1.18  2002/10/18 17:03:34  tadejm
84
// Changed BIST scan signals.
85
//
86 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
87
// Some code changed due to bug fixes.
88
//
89 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
90
// Just back-up; not completed testbench and some testcases are not
91
// wotking properly yet.
92
//
93 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
94
// Full duplex tests modified and testbench bug repaired.
95
//
96 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
97
// Some additional reports added
98
//
99 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
100
// Full duplex test improved.
101
//
102 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
103
// MIIM test look better.
104
//
105 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
106
// Bench outputs data to display every 128 bytes.
107
//
108 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
109
// Beautiful tests merget together
110
//
111 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
112
// Rearanged testcases
113
//
114 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
115
// Bug in MIIM fixed.
116
//
117 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
118
// Headers changed.
119
//
120 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
121
// New testbench. Thanks to Tadej M - "The Spammer".
122
//
123 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
124
// Clock mrx_clk set to 2.5 MHz.
125
//
126 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
127
// Testing environment also includes traffic cop, memory interface and host
128
// interface.
129 116 mohor
//
130
//
131
//
132
//
133 117 mohor
//
134 116 mohor
 
135
 
136 169 mohor
`include "eth_phy_defines.v"
137
`include "wb_model_defines.v"
138 116 mohor
`include "tb_eth_defines.v"
139
`include "eth_defines.v"
140
`include "timescale.v"
141
 
142
module tb_ethernet();
143
 
144
 
145 169 mohor
reg           wb_clk;
146
reg           wb_rst;
147
wire          wb_int;
148 116 mohor
 
149 169 mohor
wire          mtx_clk;  // This goes to PHY
150
wire          mrx_clk;  // This goes to PHY
151 116 mohor
 
152
wire   [3:0]  MTxD;
153
wire          MTxEn;
154
wire          MTxErr;
155
 
156 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
157
wire          MRxDV;    // This goes to PHY
158
wire          MRxErr;   // This goes to PHY
159
wire          MColl;    // This goes to PHY
160
wire          MCrs;     // This goes to PHY
161 116 mohor
 
162
wire          Mdi_I;
163
wire          Mdo_O;
164
wire          Mdo_OE;
165 169 mohor
tri           Mdio_IO;
166 116 mohor
wire          Mdc_O;
167
 
168
 
169 169 mohor
parameter Tp = 1;
170 116 mohor
 
171 121 mohor
 
172 116 mohor
// Ethernet Slave Interface signals
173 169 mohor
wire [31:0] eth_sl_wb_adr;
174 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
175
wire  [3:0] eth_sl_wb_sel_i;
176
wire        eth_sl_wb_we_i, eth_sl_wb_cyc_i, eth_sl_wb_stb_i, eth_sl_wb_ack_o, eth_sl_wb_err_o;
177
 
178
// Ethernet Master Interface signals
179
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
180
wire  [3:0] eth_ma_wb_sel_o;
181
wire        eth_ma_wb_we_o, eth_ma_wb_cyc_o, eth_ma_wb_stb_o, eth_ma_wb_ack_i, eth_ma_wb_err_i;
182
 
183
 
184
 
185
 
186
// Connecting Ethernet top module
187 169 mohor
eth_top eth_top
188 116 mohor
(
189
  // WISHBONE common
190 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
191 116 mohor
 
192
  // WISHBONE slave
193 169 mohor
  .wb_adr_i(eth_sl_wb_adr_i[11:2]), .wb_sel_i(eth_sl_wb_sel_i),   .wb_we_i(eth_sl_wb_we_i),
194
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
195
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
196 116 mohor
 
197
  // WISHBONE master
198
  .m_wb_adr_o(eth_ma_wb_adr_o),     .m_wb_sel_o(eth_ma_wb_sel_o), .m_wb_we_o(eth_ma_wb_we_o),
199
  .m_wb_dat_i(eth_ma_wb_dat_i),     .m_wb_dat_o(eth_ma_wb_dat_o), .m_wb_cyc_o(eth_ma_wb_cyc_o),
200
  .m_wb_stb_o(eth_ma_wb_stb_o),     .m_wb_ack_i(eth_ma_wb_ack_i), .m_wb_err_i(eth_ma_wb_err_i),
201
 
202
  //TX
203
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
204
 
205
  //RX
206
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
207
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
208
 
209
  // MIIM
210
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
211
 
212 169 mohor
  .int_o(wb_int)
213 227 tadejm
 
214
  // Bist
215
`ifdef ETH_BIST
216
  ,
217 302 markom
  .mbist_si_i       (1'b0),
218
  .mbist_so_o       (),
219
  .mbist_ctrl_i       (3'b001) // {enable, clock, reset}
220 227 tadejm
`endif
221 116 mohor
);
222
 
223
 
224
 
225 169 mohor
// Connecting Ethernet PHY Module
226
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
227
assign Mdi_I   = Mdio_IO;
228
integer phy_log_file_desc;
229
 
230
eth_phy eth_phy
231 116 mohor
(
232 169 mohor
  // WISHBONE reset
233
  .m_rst_n_i(!wb_rst),
234 116 mohor
 
235 169 mohor
  // MAC TX
236
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
237
 
238
  // MAC RX
239
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
240
  .mcoll_o(MColl),        .mcrs_o(MCrs),
241
 
242
  // MIIM
243
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
244
 
245
  // SYSTEM
246
  .phy_log(phy_log_file_desc)
247 116 mohor
);
248
 
249
 
250 169 mohor
 
251
// Connecting WB Master as Host Interface
252
integer host_log_file_desc;
253
 
254
WB_MASTER_BEHAVIORAL wb_master
255 116 mohor
(
256 169 mohor
    .CLK_I(wb_clk),
257
    .RST_I(wb_rst),
258
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
259
    .TAG_O(),
260
    .ACK_I(eth_sl_wb_ack_o),
261
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
262
    .CYC_O(eth_sl_wb_cyc_i),
263
    .DAT_I(eth_sl_wb_dat_o),
264
    .DAT_O(eth_sl_wb_dat_i),
265
    .ERR_I(eth_sl_wb_err_o),
266
    .RTY_I(1'b0),  // inactive (1'b0)
267
    .SEL_O(eth_sl_wb_sel_i),
268
    .STB_O(eth_sl_wb_stb_i),
269
    .WE_O (eth_sl_wb_we_i),
270
    .CAB_O()       // NOT USED for now!
271
);
272
 
273
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
274
 
275
 
276
 
277
// Connecting WB Slave as Memory Interface Module
278
integer memory_log_file_desc;
279
 
280
WB_SLAVE_BEHAVIORAL wb_slave
281
(
282
    .CLK_I(wb_clk),
283
    .RST_I(wb_rst),
284
    .ACK_O(eth_ma_wb_ack_i),
285
    .ADR_I(eth_ma_wb_adr_o),
286
    .CYC_I(eth_ma_wb_cyc_o),
287
    .DAT_O(eth_ma_wb_dat_i),
288
    .DAT_I(eth_ma_wb_dat_o),
289
    .ERR_O(eth_ma_wb_err_i),
290
    .RTY_O(),      // NOT USED for now!
291
    .SEL_I(eth_ma_wb_sel_o),
292
    .STB_I(eth_ma_wb_stb_o),
293
    .WE_I (eth_ma_wb_we_o),
294
    .CAB_I(1'b0)   // inactive (1'b0)
295
);
296
 
297
 
298
 
299
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
300
integer wb_s_mon_log_file_desc ;
301
integer wb_m_mon_log_file_desc ;
302
 
303
WB_BUS_MON wb_eth_slave_bus_mon
304
(
305 116 mohor
  // WISHBONE common
306 169 mohor
  .CLK_I(wb_clk),
307
  .RST_I(wb_rst),
308 116 mohor
 
309 169 mohor
  // WISHBONE slave
310
  .ACK_I(eth_sl_wb_ack_o),
311
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
312
  .CYC_O(eth_sl_wb_cyc_i),
313
  .DAT_I(eth_sl_wb_dat_o),
314
  .DAT_O(eth_sl_wb_dat_i),
315
  .ERR_I(eth_sl_wb_err_o),
316
  .RTY_I(1'b0),
317
  .SEL_O(eth_sl_wb_sel_i),
318
  .STB_O(eth_sl_wb_stb_i),
319
  .WE_O (eth_sl_wb_we_i),
320
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
321
  .TAG_O(),
322
  .CAB_O(1'b0),
323
  .log_file_desc (wb_s_mon_log_file_desc)
324
);
325
 
326
WB_BUS_MON wb_eth_master_bus_mon
327
(
328
  // WISHBONE common
329
  .CLK_I(wb_clk),
330
  .RST_I(wb_rst),
331
 
332 116 mohor
  // WISHBONE master
333 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
334
  .ADDR_O(eth_ma_wb_adr_o),
335
  .CYC_O(eth_ma_wb_cyc_o),
336
  .DAT_I(eth_ma_wb_dat_i),
337
  .DAT_O(eth_ma_wb_dat_o),
338
  .ERR_I(eth_ma_wb_err_i),
339
  .RTY_I(1'b0),
340
  .SEL_O(eth_ma_wb_sel_o),
341
  .STB_O(eth_ma_wb_stb_o),
342
  .WE_O (eth_ma_wb_we_o),
343
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
344
  .TAG_O(),
345
  .CAB_O(1'b0),
346
  .log_file_desc(wb_m_mon_log_file_desc)
347 116 mohor
);
348
 
349
 
350
 
351 169 mohor
reg         StartTB;
352
integer     tb_log_file;
353 116 mohor
 
354 169 mohor
initial
355
begin
356
  tb_log_file = $fopen("../log/eth_tb.log");
357
  if (tb_log_file < 2)
358
  begin
359
    $display("*E Could not open/create testbench log file in ../log/ directory!");
360
    $finish;
361
  end
362
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
363
  $fdisplay(tb_log_file, " ");
364 116 mohor
 
365 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
366
  if (phy_log_file_desc < 2)
367
  begin
368
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
369
    $finish;
370
  end
371
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
372
  $fdisplay(phy_log_file_desc, " ");
373
 
374
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
375
  if (memory_log_file_desc < 2)
376
  begin
377
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
378
    $finish;
379
  end
380
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
381
  $fdisplay(memory_log_file_desc, " ");
382
 
383
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
384
  if (host_log_file_desc < 2)
385
  begin
386
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
387
    $finish;
388
  end
389
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
390
  $fdisplay(host_log_file_desc, " ");
391
 
392
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
393
  if (wb_s_mon_log_file_desc < 2)
394
  begin
395
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
396
    $finish;
397
  end
398
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
399
  $fdisplay(wb_s_mon_log_file_desc, " ");
400
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
401
  $fdisplay(wb_s_mon_log_file_desc, " ");
402
 
403
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
404
  if (wb_m_mon_log_file_desc < 2)
405
  begin
406
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
407
    $finish;
408
  end
409
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
410
  $fdisplay(wb_m_mon_log_file_desc, " ");
411
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
412
  $fdisplay(wb_m_mon_log_file_desc, " ");
413
 
414 243 tadejm
  // Reset pulse
415
  wb_rst =  1'b1;
416
  #423 wb_rst =  1'b0;
417
 
418 169 mohor
  // Clear memories
419
  clear_memories;
420 243 tadejm
  clear_buffer_descriptors;
421 169 mohor
 
422
  #423 StartTB  =  1'b1;
423
end
424
 
425
 
426
 
427
// Generating wb_clk clock
428 116 mohor
initial
429
begin
430 169 mohor
  wb_clk=0;
431
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
432 274 tadejm
//  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
433 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
434
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
435 274 tadejm
  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
436 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
437 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
438
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
439
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
440
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
441 116 mohor
end
442
 
443
 
444
 
445 169 mohor
integer      tests_successfull;
446
integer      tests_failed;
447
reg [799:0]  test_name; // used for tb_log_file
448 121 mohor
 
449 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
450
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
451
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
452
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
453
 
454 274 tadejm
reg          wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
455
 
456
 
457 116 mohor
initial
458
begin
459 169 mohor
  wait(StartTB);  // Start of testbench
460
 
461
  // Initial global values
462
  tests_successfull = 0;
463
  tests_failed = 0;
464 274 tadejm
 
465
  wbm_working = 0;
466 169 mohor
 
467
  wbm_init_waits = 4'h1;
468
  wbm_subseq_waits = 4'h3;
469
  wbs_waits = 4'h1;
470
  wbs_retries = 8'h2;
471
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
472
 
473 274 tadejm
  // set DIFFERENT mrx_clk to mtx_clk!
474
//  eth_phy.set_mrx_equal_mtx = 1'b0;
475 169 mohor
 
476
  //  Call tests
477
  //  ----------
478 274 tadejm
//    test_access_to_mac_reg(0, 0);           // 0 - 3
479 194 tadej
//    test_mii(0, 17);                        // 0 - 17
480 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
481
  eth_phy.carrier_sense_real_delay(0);
482 279 mohor
    test_mac_full_duplex_transmit(0, 21);    // 0 - (21)
483 281 mohor
    test_mac_full_duplex_receive(0, 13);     // 0 - 13
484
    test_mac_full_duplex_flow_control(0, 4);  // 0 - 4
485 274 tadejm
                                              // 4 is executed, everything is OK
486
//    test_mac_half_duplex_flow(0, 0);
487 169 mohor
 
488 243 tadejm
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
489 169 mohor
  eth_phy.carrier_sense_real_delay(1);
490
 
491
 
492
  // Finish test's logs
493
  test_summary;
494
  $display("\n\n END of SIMULATION");
495
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
496
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
497
 
498
  $stop;
499 116 mohor
end
500 169 mohor
 
501 116 mohor
 
502 169 mohor
 
503
//////////////////////////////////////////////////////////////
504
// Test tasks
505
//////////////////////////////////////////////////////////////
506
 
507
task test_access_to_mac_reg;
508
  input  [31:0]  start_task;
509
  input  [31:0]  end_task;
510
  integer        bit_start_1;
511
  integer        bit_end_1;
512
  integer        bit_start_2;
513
  integer        bit_end_2;
514
  integer        num_of_reg;
515
  integer        i_addr;
516
  integer        i_data;
517
  integer        i_length;
518
  integer        tmp_data;
519
  reg    [31:0]  tx_bd_num;
520
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
521
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
522
  integer        i;
523
  integer        i1;
524
  integer        i2;
525
  integer        i3;
526
  integer        fail;
527 178 mohor
  integer        test_num;
528 169 mohor
  reg    [31:0]  addr;
529
  reg    [31:0]  data;
530
  reg    [31:0]  data_max;
531 116 mohor
begin
532 169 mohor
// ACCESS TO MAC REGISTERS TEST
533
test_heading("ACCESS TO MAC REGISTERS TEST");
534
$display(" ");
535
$display("ACCESS TO MAC REGISTERS TEST");
536
fail = 0;
537
 
538 192 tadej
// reset MAC registers
539
hard_reset;
540
// reset MAC and MII LOGIC with soft reset
541 274 tadejm
//reset_mac;
542
//reset_mii;
543 169 mohor
 
544 192 tadej
 
545 178 mohor
//////////////////////////////////////////////////////////////////////
546
////                                                              ////
547
////  test_access_to_mac_reg:                                     ////
548
////                                                              ////
549
////  0: Walking 1 with single cycles across MAC regs.            ////
550
////  1: Walking 1 with single cycles across MAC buffer descript. ////
551
////  2: Test max reg. values and reg. values after writing       ////
552
////     inverse reset values and hard reset of the MAC           ////
553
////  3: Test buffer desc. RAM preserving values after hard reset ////
554
////     of the MAC and resetting the logic                       ////
555
////                                                              ////
556
//////////////////////////////////////////////////////////////////////
557 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
558 169 mohor
begin
559
 
560 178 mohor
  ////////////////////////////////////////////////////////////////////
561
  ////                                                            ////
562
  ////  Walking 1 with single cycles across MAC regs.             ////
563
  ////                                                            ////
564
  ////////////////////////////////////////////////////////////////////
565
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
566 194 tadej
  begin
567
    // TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
568
    test_name   = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
569
    `TIME; $display("  TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
570 178 mohor
 
571 194 tadej
    data = 0;
572
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
573
      begin
574
        wbm_init_waits = i;
575
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
576
        for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
577
          begin
578
            addr = `ETH_BASE + i_addr;
579
            // set ranges of R/W bits
580
            case (addr)
581
              `ETH_MODER:
582
                begin
583
                  bit_start_1 = 0;
584
                  bit_end_1   = 16;
585
                  bit_start_2 = 32; // not used
586
                  bit_end_2   = 32; // not used
587
                end
588
              `ETH_INT: // READONLY - tested within INT test
589
                begin
590
                  bit_start_1 = 32; // not used
591
                  bit_end_1   = 32; // not used
592
                  bit_start_2 = 32; // not used
593
                  bit_end_2   = 32; // not used
594
                end
595
              `ETH_INT_MASK:
596
                begin
597
                  bit_start_1 = 0;
598
                  bit_end_1   = 6;
599
                  bit_start_2 = 32; // not used
600
                  bit_end_2   = 32; // not used
601
                end
602
              `ETH_IPGT:
603
                begin
604
                  bit_start_1 = 0;
605
                  bit_end_1   = 6;
606
                  bit_start_2 = 32; // not used
607
                  bit_end_2   = 32; // not used
608
                end
609
              `ETH_IPGR1:
610
                begin
611
                  bit_start_1 = 0;
612
                  bit_end_1   = 6;
613
                  bit_start_2 = 32; // not used
614
                  bit_end_2   = 32; // not used
615
                end
616
              `ETH_IPGR2:
617
                begin
618
                  bit_start_1 = 0;
619
                  bit_end_1   = 6;
620
                  bit_start_2 = 32; // not used
621
                  bit_end_2   = 32; // not used
622
                end
623
              `ETH_PACKETLEN:
624
                begin
625
                  bit_start_1 = 0;
626
                  bit_end_1   = 31;
627
                  bit_start_2 = 32; // not used
628
                  bit_end_2   = 32; // not used
629
                end
630
              `ETH_COLLCONF:
631
                begin
632
                  bit_start_1 = 0;
633
                  bit_end_1   = 5;
634
                  bit_start_2 = 16;
635
                  bit_end_2   = 19;
636
                end
637
              `ETH_TX_BD_NUM:
638
                begin
639
                  bit_start_1 = 0;
640
                  bit_end_1   = 7;
641
                  bit_start_2 = 32; // not used
642
                  bit_end_2   = 32; // not used
643
                end
644
              `ETH_CTRLMODER:
645
                begin
646
                  bit_start_1 = 0;
647
                  bit_end_1   = 2;
648
                  bit_start_2 = 32; // not used
649
                  bit_end_2   = 32; // not used
650
                end
651
              `ETH_MIIMODER:
652
                begin
653
                  bit_start_1 = 0;
654
                  bit_end_1   = 9;
655
                  bit_start_2 = 32; // not used
656
                  bit_end_2   = 32; // not used
657
                end
658
              `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
659
                begin
660
                  bit_start_1 = 32; // not used
661
                  bit_end_1   = 32; // not used
662
                  bit_start_2 = 32; // not used
663
                  bit_end_2   = 32; // not used
664
                end
665
              `ETH_MIIADDRESS:
666
                begin
667
                  bit_start_1 = 0;
668
                  bit_end_1   = 4;
669
                  bit_start_2 = 8;
670
                  bit_end_2   = 12;
671
                end
672
              `ETH_MIITX_DATA:
673
                begin
674
                  bit_start_1 = 0;
675
                  bit_end_1   = 15;
676
                  bit_start_2 = 32; // not used
677
                  bit_end_2   = 32; // not used
678
                end
679
              `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
680
                begin
681
                  bit_start_1 = 32; // not used
682
                  bit_end_1   = 32; // not used
683
                  bit_start_2 = 32; // not used
684
                  bit_end_2   = 32; // not used
685
                end
686
              `ETH_MIISTATUS: // READONLY - tested within MIIM test
687
                begin
688
                  bit_start_1 = 32; // not used
689
                  bit_end_1   = 32; // not used
690
                  bit_start_2 = 32; // not used
691
                  bit_end_2   = 32; // not used
692
                end
693
              `ETH_MAC_ADDR0:
694
                begin
695
                  bit_start_1 = 0;
696
                  bit_end_1   = 31;
697
                  bit_start_2 = 32; // not used
698
                  bit_end_2   = 32; // not used
699 178 mohor
                  end
700 194 tadej
              `ETH_MAC_ADDR1:
701
                begin
702
                  bit_start_1 = 0;
703
                  bit_end_1   = 15;
704
                  bit_start_2 = 32; // not used
705
                  bit_end_2   = 32; // not used
706
                end
707
              `ETH_HASH_ADDR0:
708
                begin
709
                  bit_start_1 = 0;
710
                  bit_end_1   = 31;
711
                  bit_start_2 = 32; // not used
712
                  bit_end_2   = 32; // not used
713
                end
714
              default: // `ETH_HASH_ADDR1:
715
                begin
716
                  bit_start_1 = 0;
717
                  bit_end_1   = 31;
718
                  bit_start_2 = 32; // not used
719
                  bit_end_2   = 32; // not used
720
                end
721
            endcase
722
 
723
            for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
724
              begin
725
                data = 1'b1 << i_data;
726
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
727
                  ;
728
                else
729 178 mohor
                  begin
730 194 tadej
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
731 274 tadejm
                    wait (wbm_working == 0);
732 194 tadej
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
733
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
734
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
735
                      begin
736
                        if (tmp_data !== data)
737 178 mohor
                        begin
738 194 tadej
                          fail = fail + 1;
739
                          test_fail("RW bit of the MAC register was not written or not read");
740
                          `TIME;
741
                          $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
742
                                    wbm_init_waits, addr, data, tmp_data);
743
                        end
744
                      end
745
                    else // data should not be equal to tmp_data
746
                      begin
747
                        if (tmp_data === data)
748 178 mohor
                          begin
749
                            fail = fail + 1;
750 194 tadej
                            test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
751 178 mohor
                            `TIME;
752 194 tadej
                            $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
753 178 mohor
                                      wbm_init_waits, addr, data, tmp_data);
754
                          end
755 194 tadej
                      end
756
                  end
757
              end
758
          end
759
      end
760 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
761
    $display("    ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
762 194 tadej
    if(fail == 0)
763
      test_ok;
764
    else
765
      fail = 0;    // Errors were reported previously
766
  end
767 178 mohor
 
768
 
769
  ////////////////////////////////////////////////////////////////////
770
  ////                                                            ////
771
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
772
  ////                                                            ////
773
  ////////////////////////////////////////////////////////////////////
774
  if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
775 169 mohor
  begin
776 194 tadej
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
777
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
778
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
779 178 mohor
 
780
    data = 0;
781
    // set TX and RX buffer descriptors
782
    tx_bd_num = 32'h40;
783
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
784
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
785
    begin
786 169 mohor
      wbm_init_waits = i;
787
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
788 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
789 169 mohor
      begin
790
        addr = `ETH_BASE + i_addr;
791 178 mohor
        if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
792
        begin
793
          // set ranges of R/W bits
794
          case (addr[3])
795
            1'b0: // buffer control bits
796
            begin
797
              bit_start_1 = 0;
798
              bit_end_1   = 31; // 8;
799
              bit_start_2 = 11;
800
              bit_end_2   = 31;
801
            end
802
            default: // 1'b1: // buffer pointer
803
            begin
804
              bit_start_1 = 0;
805
              bit_end_1   = 31;
806
              bit_start_2 = 32; // not used
807
              bit_end_2   = 32; // not used
808
            end
809
          endcase
810
        end
811
        else // RX buffer descriptors
812
        begin
813
          // set ranges of R/W bits
814
          case (addr[3])
815
            1'b0: // buffer control bits
816
            begin
817
              bit_start_1 = 0;
818
              bit_end_1   = 31; // 7;
819
              bit_start_2 = 13;
820
              bit_end_2   = 31;
821
            end
822
            default: // 1'b1: // buffer pointer
823
            begin
824
              bit_start_1 = 0;
825
              bit_end_1   = 31;
826
              bit_start_2 = 32; // not used
827
              bit_end_2   = 32; // not used
828
            end
829
          endcase
830
        end
831
 
832 169 mohor
        for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
833
        begin
834
          data = 1'b1 << i_data;
835 178 mohor
          if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
836
            ;
837 169 mohor
          else
838
          begin
839
            wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
840
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
841
            if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
842
                 ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
843
            begin
844
              if (tmp_data !== data)
845
              begin
846
                fail = fail + 1;
847 178 mohor
                test_fail("RW bit of the MAC buffer descriptors was not written or not read");
848 169 mohor
                `TIME;
849
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
850
                          wbm_init_waits, addr, data, tmp_data);
851
              end
852
            end
853
            else // data should not be equal to tmp_data
854
            begin
855
              if (tmp_data === data)
856
              begin
857
                fail = fail + 1;
858 178 mohor
                test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
859 169 mohor
                `TIME;
860
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
861
                          wbm_init_waits, addr, data, tmp_data);
862
              end
863
            end
864
          end
865
        end
866
      end
867 178 mohor
      // INTERMEDIATE DISPLAYS
868
      case (i)
869 209 tadejm
        0:       $display("    ->buffer descriptors tested with 0 bus delay");
870
        1:       $display("    ->buffer descriptors tested with 1 bus delay cycle");
871
        2:       $display("    ->buffer descriptors tested with 2 bus delay cycles");
872
        3:       $display("    ->buffer descriptors tested with 3 bus delay cycles");
873
        default: $display("    ->buffer descriptors tested with 4 bus delay cycles");
874 178 mohor
      endcase
875
    end
876
    if(fail == 0)
877
      test_ok;
878
    else
879
      fail = 0;
880 169 mohor
  end
881 178 mohor
 
882
 
883
  ////////////////////////////////////////////////////////////////////
884
  ////                                                            ////
885
  ////  Test max reg. values and reg. values after writing        ////
886
  ////  inverse reset values and hard reset of the MAC            ////
887
  ////                                                            ////
888
  ////////////////////////////////////////////////////////////////////
889
  if (test_num == 2) // Start this task
890 169 mohor
  begin
891 194 tadej
    // TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
892 178 mohor
    test_name   =
893 194 tadej
      "TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
894 178 mohor
    `TIME; $display(
895 194 tadej
      "  TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
896 178 mohor
 
897
    // reset MAC registers
898
    hard_reset;
899
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
900 169 mohor
    begin
901 178 mohor
      for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
902 169 mohor
      begin
903 178 mohor
        addr = `ETH_BASE + i_addr;
904
        // set ranges of R/W bits
905
        case (addr)
906
          `ETH_MODER:
907 169 mohor
          begin
908 178 mohor
            data = 32'h0000_A800;
909
            data_max = 32'h0001_FFFF;
910 169 mohor
          end
911 178 mohor
          `ETH_INT: // READONLY - tested within INT test
912 169 mohor
          begin
913 178 mohor
            data = 32'h0000_0000;
914
            data_max = 32'h0000_0000;
915 169 mohor
          end
916
          `ETH_INT_MASK:
917 178 mohor
          begin
918
            data = 32'h0000_0000;
919
            data_max = 32'h0000_007F;
920
          end
921 169 mohor
          `ETH_IPGT:
922 178 mohor
          begin
923
            data = 32'h0000_0012;
924
            data_max = 32'h0000_007F;
925
          end
926 169 mohor
          `ETH_IPGR1:
927 178 mohor
          begin
928
            data = 32'h0000_000C;
929
            data_max = 32'h0000_007F;
930
          end
931 169 mohor
          `ETH_IPGR2:
932 178 mohor
          begin
933
            data = 32'h0000_0012;
934
            data_max = 32'h0000_007F;
935
          end
936 169 mohor
          `ETH_PACKETLEN:
937 178 mohor
          begin
938
            data = 32'h0040_0600;
939
            data_max = 32'hFFFF_FFFF;
940
          end
941 169 mohor
          `ETH_COLLCONF:
942 178 mohor
          begin
943
            data = 32'h000F_003F;
944
            data_max = 32'h000F_003F;
945
          end
946 169 mohor
          `ETH_TX_BD_NUM:
947 178 mohor
          begin
948
            data = 32'h0000_0040;
949
            data_max = 32'h0000_0080;
950
          end
951 169 mohor
          `ETH_CTRLMODER:
952 178 mohor
          begin
953
            data = 32'h0000_0000;
954
            data_max = 32'h0000_0007;
955
          end
956 169 mohor
          `ETH_MIIMODER:
957 178 mohor
          begin
958
            data = 32'h0000_0064;
959
            data_max = 32'h0000_03FF;
960
          end
961 169 mohor
          `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
962 178 mohor
          begin
963
            data = 32'h0000_0000;
964
            data_max = 32'h0000_0007;
965
          end
966 169 mohor
          `ETH_MIIADDRESS:
967 178 mohor
          begin
968
            data = 32'h0000_0000;
969
            data_max = 32'h0000_1F1F;
970
          end
971 169 mohor
          `ETH_MIITX_DATA:
972 178 mohor
          begin
973
            data = 32'h0000_0000;
974
            data_max = 32'h0000_FFFF;
975
          end
976 169 mohor
          `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
977
          begin
978 178 mohor
            data = 32'h0000_0000;
979
            data_max = 32'h0000_0000;
980 169 mohor
          end
981 178 mohor
          `ETH_MIISTATUS: // READONLY - tested within MIIM test
982 169 mohor
          begin
983 178 mohor
            data = 32'h0000_0000;
984
            data_max = 32'h0000_0000;
985 169 mohor
          end
986 178 mohor
          `ETH_MAC_ADDR0:
987 169 mohor
          begin
988 178 mohor
            data = 32'h0000_0000;
989
            data_max = 32'hFFFF_FFFF;
990 169 mohor
          end
991 178 mohor
          `ETH_MAC_ADDR1:
992 169 mohor
          begin
993 178 mohor
            data = 32'h0000_0000;
994
            data_max = 32'h0000_FFFF;
995 169 mohor
          end
996 178 mohor
          `ETH_HASH_ADDR0:
997 169 mohor
          begin
998 178 mohor
            data = 32'h0000_0000;
999
            data_max = 32'hFFFF_FFFF;
1000 169 mohor
          end
1001 178 mohor
          default: // `ETH_HASH_ADDR1:
1002 169 mohor
          begin
1003 178 mohor
            data = 32'h0000_0000;
1004
            data_max = 32'hFFFF_FFFF;
1005 169 mohor
          end
1006
        endcase
1007 178 mohor
 
1008
        wbm_init_waits = {$random} % 3;
1009
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1010
        if (i == 0)
1011 274 tadejm
        begin
1012 178 mohor
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1013 274 tadejm
        end
1014 178 mohor
        else if (i == 2)
1015 274 tadejm
        begin
1016 178 mohor
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1017 274 tadejm
        end
1018 178 mohor
        else if ((i == 1) || (i == 4))
1019 169 mohor
        begin
1020 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1021
          if (tmp_data !== data)
1022
          begin
1023
            fail = fail + 1;
1024
            test_fail("RESET value of the MAC register is not correct");
1025
            `TIME;
1026
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1027
          end
1028 169 mohor
        end
1029 178 mohor
        else // check maximum values
1030 169 mohor
        begin
1031
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1032 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
1033 169 mohor
          begin
1034
            if (tmp_data !== data)
1035
            begin
1036
              fail = fail + 1;
1037 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1038 169 mohor
              `TIME;
1039 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1040 169 mohor
            end
1041 178 mohor
            // try maximum (80)
1042
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1043
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1044
            if (tmp_data !== data_max)
1045
            begin
1046
              fail = fail + 1;
1047
              test_fail("MAX value of the TX_BD_NUM register is not correct");
1048
              `TIME;
1049
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1050
            end
1051
            // try one less than maximum (80)
1052
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1053
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1054
            if (tmp_data !== (data_max - 1))
1055
            begin
1056
              fail = fail + 1;
1057
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1058
              `TIME;
1059
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1060
            end
1061
            // try one more than maximum (80)
1062
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1063
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1064
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1065
            begin
1066
              fail = fail + 1;
1067
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1068
              `TIME;
1069
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1070
            end
1071 169 mohor
          end
1072 178 mohor
          else
1073 169 mohor
          begin
1074 178 mohor
            if (tmp_data !== data_max)
1075 169 mohor
            begin
1076
              fail = fail + 1;
1077 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1078 169 mohor
              `TIME;
1079 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1080 169 mohor
            end
1081
          end
1082
        end
1083
      end
1084 178 mohor
      // reset MAC registers
1085
      if ((i == 0) || (i == 3))
1086
        hard_reset;
1087 169 mohor
    end
1088 178 mohor
    if(fail == 0)
1089
      test_ok;
1090
    else
1091
      fail = 0;
1092 169 mohor
  end
1093 116 mohor
 
1094 156 mohor
 
1095 181 mohor
  ////////////////////////////////////////////////////////////////////
1096
  ////                                                            ////
1097
  ////  Test buffer desc. ram preserving values after hard reset  ////
1098
  ////  of the mac and reseting the logic                         ////
1099
  ////                                                            ////
1100
  ////////////////////////////////////////////////////////////////////
1101 178 mohor
  if (test_num == 3) // Start this task
1102 169 mohor
  begin
1103 194 tadej
    // TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1104
    test_name   = "TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1105 178 mohor
    `TIME;
1106 194 tadej
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1107 178 mohor
 
1108
    // reset MAC registers
1109
    hard_reset;
1110
    // reset LOGIC with soft reset
1111 274 tadejm
//    reset_mac;
1112
//    reset_mii;
1113 178 mohor
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1114 169 mohor
    begin
1115 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1116 169 mohor
      begin
1117 178 mohor
        addr = `ETH_BASE + i_addr;
1118
 
1119
        wbm_init_waits = {$random} % 3;
1120
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1121
        if (i == 0)
1122 169 mohor
        begin
1123 178 mohor
          data = 32'hFFFFFFFF;
1124
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1125 169 mohor
        end
1126 178 mohor
        else if (i == 2)
1127 169 mohor
        begin
1128 178 mohor
          data = 32'h00000000;
1129
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1130 169 mohor
        end
1131
        else
1132
        begin
1133 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1134
          if (tmp_data !== data)
1135 169 mohor
          begin
1136
            fail = fail + 1;
1137 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1138 169 mohor
            `TIME;
1139 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1140 169 mohor
          end
1141
        end
1142
      end
1143 178 mohor
      if ((i == 0) || (i == 2))
1144
      begin
1145
        // reset MAC registers
1146
        hard_reset;
1147
        // reset LOGIC with soft reset
1148 274 tadejm
//        reset_mac;
1149
//        reset_mii;
1150 178 mohor
      end
1151 169 mohor
    end
1152 178 mohor
    if(fail == 0)
1153
      test_ok;
1154
    else
1155
    fail = 0;
1156 169 mohor
  end
1157 116 mohor
 
1158
 
1159 178 mohor
  if (test_num == 4) // Start this task
1160 169 mohor
  begin
1161 194 tadej
        /*  // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1162
          test_name   = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1163
          `TIME; $display("  TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1164 178 mohor
 
1165
          data = 0;
1166
          burst_data = 0;
1167
          burst_tmp_data = 0;
1168
          i_length = 10; // two bursts for length 20
1169
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1170
          begin
1171
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1172
            begin
1173
              wbm_init_waits = i;
1174
              wbm_subseq_waits = i1;
1175
              #1;
1176
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1177
              begin
1178
                data = 1'b1 << i_data;
1179
                #1;
1180
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1181
                begin
1182
                  burst_data = burst_data << 32;
1183
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1184
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1185
                  begin
1186
                    #1 burst_data[31:0] = 0;
1187
                  end
1188
                  else
1189
                  begin
1190
                    #1 burst_data[31:0] = data;
1191
                  end
1192
                end
1193
                #1;
1194
                // 2 burst writes
1195
                addr = `ETH_BASE; // address of a first burst
1196
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1197
                burst_tmp_data = burst_data >> (32 * i_length);
1198
                addr = addr + 32'h28; // address of a second burst
1199
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1200
                #1;
1201
                // 2 burst reads
1202
                addr = `ETH_BASE; // address of a first burst
1203
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1204
                         wbm_init_waits, wbm_subseq_waits); // first burst
1205
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1206
                addr = addr + 32'h28; // address of a second burst
1207
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1208
                         wbm_init_waits, wbm_subseq_waits); // second burst
1209
                #1;
1210
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1211
                begin
1212
                  // set ranges of R/W bits
1213
                  case (`ETH_BASE + i2)
1214
                  `ETH_MODER:
1215
                    begin
1216
                      bit_start_1 = 0;
1217
                      bit_end_1   = 16;
1218
                      bit_start_2 = 32; // not used
1219
                      bit_end_2   = 32; // not used
1220
                    end
1221
                  `ETH_INT: // READONLY - tested within INT test
1222
                    begin
1223
                      bit_start_1 = 32; // not used
1224
                      bit_end_1   = 32; // not used
1225
                      bit_start_2 = 32; // not used
1226
                      bit_end_2   = 32; // not used
1227
                    end
1228
                  `ETH_INT_MASK:
1229
                    begin
1230
                      bit_start_1 = 0;
1231
                      bit_end_1   = 6;
1232
                      bit_start_2 = 32; // not used
1233
                      bit_end_2   = 32; // not used
1234
                    end
1235
                  `ETH_IPGT:
1236
                    begin
1237
                      bit_start_1 = 0;
1238
                      bit_end_1   = 6;
1239
                      bit_start_2 = 32; // not used
1240
                      bit_end_2   = 32; // not used
1241
                    end
1242
                  `ETH_IPGR1:
1243
                    begin
1244
                      bit_start_1 = 0;
1245
                      bit_end_1   = 6;
1246
                      bit_start_2 = 32; // not used
1247
                      bit_end_2   = 32; // not used
1248
                    end
1249
                  `ETH_IPGR2:
1250
                    begin
1251
                      bit_start_1 = 0;
1252
                      bit_end_1   = 6;
1253
                      bit_start_2 = 32; // not used
1254
                      bit_end_2   = 32; // not used
1255
                    end
1256
                  `ETH_PACKETLEN:
1257
                    begin
1258
                      bit_start_1 = 0;
1259
                      bit_end_1   = 31;
1260
                      bit_start_2 = 32; // not used
1261
                      bit_end_2   = 32; // not used
1262
                    end
1263
                  `ETH_COLLCONF:
1264
                    begin
1265
                      bit_start_1 = 0;
1266
                      bit_end_1   = 5;
1267
                      bit_start_2 = 16;
1268
                      bit_end_2   = 19;
1269
                    end
1270
                  `ETH_TX_BD_NUM:
1271
                    begin
1272
                      bit_start_1 = 0;
1273
                      bit_end_1   = 7;
1274
                      bit_start_2 = 32; // not used
1275
                      bit_end_2   = 32; // not used
1276
                    end
1277
                  `ETH_CTRLMODER:
1278
                    begin
1279
                      bit_start_1 = 0;
1280
                      bit_end_1   = 2;
1281
                      bit_start_2 = 32; // not used
1282
                      bit_end_2   = 32; // not used
1283
                    end
1284
                  `ETH_MIIMODER:
1285
                    begin
1286
                      bit_start_1 = 0;
1287
                      bit_end_1   = 9;
1288
                      bit_start_2 = 32; // not used
1289
                      bit_end_2   = 32; // not used
1290
                    end
1291
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1292
                    begin
1293
                      bit_start_1 = 32; // not used
1294
                      bit_end_1   = 32; // not used
1295
                      bit_start_2 = 32; // not used
1296
                      bit_end_2   = 32; // not used
1297
                    end
1298
                  `ETH_MIIADDRESS:
1299
                    begin
1300
                      bit_start_1 = 0;
1301
                      bit_end_1   = 4;
1302
                      bit_start_2 = 8;
1303
                      bit_end_2   = 12;
1304
                    end
1305
                  `ETH_MIITX_DATA:
1306
                    begin
1307
                      bit_start_1 = 0;
1308
                      bit_end_1   = 15;
1309
                      bit_start_2 = 32; // not used
1310
                      bit_end_2   = 32; // not used
1311
                    end
1312
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1313
                    begin
1314
                      bit_start_1 = 32; // not used
1315
                      bit_end_1   = 32; // not used
1316
                      bit_start_2 = 32; // not used
1317
                      bit_end_2   = 32; // not used
1318
                    end
1319
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1320
                    begin
1321
                      bit_start_1 = 32; // not used
1322
                      bit_end_1   = 32; // not used
1323
                      bit_start_2 = 32; // not used
1324
                      bit_end_2   = 32; // not used
1325
                    end
1326
                  `ETH_MAC_ADDR0:
1327
                    begin
1328
                      bit_start_1 = 0;
1329
                      bit_end_1   = 31;
1330
                      bit_start_2 = 32; // not used
1331
                      bit_end_2   = 32; // not used
1332
                    end
1333
                  `ETH_MAC_ADDR1:
1334
                    begin
1335
                      bit_start_1 = 0;
1336
                      bit_end_1   = 15;
1337
                      bit_start_2 = 32; // not used
1338
                      bit_end_2   = 32; // not used
1339
                    end
1340
                  `ETH_HASH_ADDR0:
1341
                    begin
1342
                      bit_start_1 = 0;
1343
                      bit_end_1   = 31;
1344
                      bit_start_2 = 32; // not used
1345
                      bit_end_2   = 32; // not used
1346
                    end
1347
                  default: // `ETH_HASH_ADDR1:
1348
                    begin
1349
                      bit_start_1 = 0;
1350
                      bit_end_1   = 31;
1351
                      bit_start_2 = 32; // not used
1352
                      bit_end_2   = 32; // not used
1353
                    end
1354
                  endcase
1355
                  #1;
1356
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1357
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1358
                  begin
1359
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1360
                    begin
1361
                      fail = fail + 1;
1362
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1363
                      `TIME;
1364
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1365
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1366
                    end
1367
                  end
1368
                  else
1369
                  begin
1370
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1371
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1372
                    begin
1373
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1374
                      begin
1375
                        fail = fail + 1;
1376
                        test_fail("RW bit of the MAC register was not written or not read");
1377
                        `TIME;
1378
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1379
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1380
                      end
1381
                    end
1382
                    else // data should not be equal to tmp_data
1383
                    begin
1384
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1385
                      begin
1386
                        fail = fail + 1;
1387
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1388
                        `TIME;
1389
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1390
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1391
                      end
1392
                    end
1393
                  end
1394
                  burst_tmp_data = burst_tmp_data >> 32;
1395
                  burst_data = burst_data >> 32;
1396
                end
1397
              end
1398
            end
1399
          end
1400
          if(fail == 0)
1401
            test_ok;
1402
          else
1403
            fail = 0;*/
1404
  end
1405 116 mohor
 
1406 169 mohor
end
1407 156 mohor
 
1408 169 mohor
end
1409
endtask // test_access_to_mac_reg
1410 156 mohor
 
1411
 
1412 169 mohor
task test_mii;
1413
  input  [31:0]  start_task;
1414
  input  [31:0]  end_task;
1415
  integer        i;
1416
  integer        i1;
1417
  integer        i2;
1418
  integer        i3;
1419
  integer        cnt;
1420
  integer        fail;
1421 181 mohor
  integer        test_num;
1422 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1423
  reg     [4:0]  phy_addr;
1424
  reg     [4:0]  reg_addr;
1425
  reg     [15:0] phy_data;
1426
  reg     [15:0] tmp_data;
1427
begin
1428
// MIIM MODULE TEST
1429
test_heading("MIIM MODULE TEST");
1430
$display(" ");
1431
$display("MIIM MODULE TEST");
1432
fail = 0;
1433 156 mohor
 
1434 192 tadej
// reset MAC registers
1435
hard_reset;
1436
// reset MAC and MII LOGIC with soft reset
1437 274 tadejm
//reset_mac;
1438
//reset_mii;
1439 116 mohor
 
1440 194 tadej
 
1441 181 mohor
//////////////////////////////////////////////////////////////////////
1442
////                                                              ////
1443
////  test_mii:                                                   ////
1444
////                                                              ////
1445
////  0:  Test clock divider of mii management module with all    ////
1446
////      possible frequences.                                    ////
1447
////  1:  Test various readings from 'real' phy registers.        ////
1448
////  2:  Test various writings to 'real' phy registers (control  ////
1449
////      and non writable registers)                             ////
1450
////  3:  Test reset phy through mii management module            ////
1451
////  4:  Test 'walking one' across phy address (with and without ////
1452
////      preamble)                                               ////
1453
////  5:  Test 'walking one' across phy's register address (with  ////
1454
////      and without preamble)                                   ////
1455
////  6:  Test 'walking one' across phy's data (with and without  ////
1456
////      preamble)                                               ////
1457
////  7:  Test reading from phy with wrong phy address (host      ////
1458
////      reading high 'z' data)                                  ////
1459
////  8:  Test writing to phy with wrong phy address and reading  ////
1460
////      from correct one                                        ////
1461
////  9:  Test sliding stop scan command immediately after read   ////
1462
////      request (with and without preamble)                     ////
1463
//// 10:  Test sliding stop scan command immediately after write  ////
1464
////      request (with and without preamble)                     ////
1465
//// 11:  Test busy and nvalid status durations during write      ////
1466
////      (with and without preamble)                             ////
1467
//// 12:  Test busy and nvalid status durations during write      ////
1468
////      (with and without preamble)                             ////
1469
//// 13:  Test busy and nvalid status durations during scan (with ////
1470
////      and without preamble)                                   ////
1471
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1472
////      (with and without preamble)                             ////
1473
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1474
////      (with and without preamble)                             ////
1475
//// 16:  Test sliding stop scan command immediately after scan   ////
1476
////      request (with and without preamble)                     ////
1477
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1478
////      without preamble)                                       ////
1479
////                                                              ////
1480
//////////////////////////////////////////////////////////////////////
1481 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1482 169 mohor
begin
1483 194 tadej
 
1484 181 mohor
  ////////////////////////////////////////////////////////////////////
1485
  ////                                                            ////
1486
  ////  Test clock divider of mii management module with all      ////
1487
  ////  possible frequences.                                      ////
1488
  ////                                                            ////
1489
  ////////////////////////////////////////////////////////////////////
1490
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1491 169 mohor
  begin
1492 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1493
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1494
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1495 181 mohor
 
1496
    wait(Mdc_O); // wait for MII clock to be 1
1497
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1498
    begin
1499
      i1 = 0;
1500
      i2 = 0;
1501
      #Tp mii_set_clk_div(clk_div[7:0]);
1502
      @(posedge Mdc_O);
1503
      #Tp;
1504
      fork
1505 169 mohor
        begin
1506 181 mohor
          @(posedge Mdc_O);
1507 169 mohor
          #Tp;
1508 181 mohor
          disable count_i1;
1509
          disable count_i2;
1510 169 mohor
        end
1511 181 mohor
        begin: count_i1
1512
          forever
1513
          begin
1514
            @(posedge wb_clk);
1515
            i1 = i1 + 1;
1516
            #Tp;
1517
          end
1518
        end
1519
        begin: count_i2
1520
          forever
1521
          begin
1522
            @(negedge wb_clk);
1523
            i2 = i2 + 1;
1524
            #Tp;
1525
          end
1526
        end
1527
      join
1528
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1529
      begin
1530
        if((i1 == i2) && (i1 == 2))
1531 169 mohor
        begin
1532
        end
1533 181 mohor
        else
1534
        begin
1535
          fail = fail + 1;
1536 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1537 181 mohor
        end
1538 169 mohor
      end
1539
      else
1540
      begin
1541 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1542
        begin
1543
        end
1544
        else
1545
        begin
1546
          fail = fail + 1;
1547
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1548
        end
1549 169 mohor
      end
1550
    end
1551 181 mohor
    if(fail == 0)
1552
      test_ok;
1553 169 mohor
    else
1554 181 mohor
      fail = 0;
1555
  end
1556
 
1557
 
1558
  ////////////////////////////////////////////////////////////////////
1559
  ////                                                            ////
1560
  ////  Test various readings from 'real' phy registers.          ////
1561
  ////                                                            ////
1562
  ////////////////////////////////////////////////////////////////////
1563
  if (test_num == 1) // Test various readings from 'real' phy registers.
1564
  begin
1565 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1566
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1567
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1568 181 mohor
 
1569
    // set the fastest possible MII
1570
    clk_div = 0;
1571
    mii_set_clk_div(clk_div[7:0]);
1572
    // set address
1573
    reg_addr = 5'h1F;
1574
    phy_addr = 5'h1;
1575
    while(reg_addr >= 5'h4)
1576 169 mohor
    begin
1577 181 mohor
      // read request
1578
      #Tp mii_read_req(phy_addr, reg_addr);
1579
      check_mii_busy; // wait for read to finish
1580
      // read data
1581 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1582 181 mohor
      if (phy_data !== 16'hDEAD)
1583 169 mohor
      begin
1584 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1585
        fail = fail + 1;
1586 169 mohor
      end
1587 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1588
        reg_addr = 5'h3;
1589 169 mohor
      else
1590 181 mohor
        reg_addr = reg_addr - 5'h9;
1591 169 mohor
    end
1592 181 mohor
 
1593
    // set address
1594
    reg_addr = 5'h3;
1595
    // read request
1596
    #Tp mii_read_req(phy_addr, reg_addr);
1597
    check_mii_busy; // wait for read to finish
1598
    // read data
1599 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1600 181 mohor
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1601
    begin
1602
      test_fail("Wrong data was read from PHY from ID register 2");
1603
      fail = fail + 1;
1604
    end
1605
    if(fail == 0)
1606
      test_ok;
1607
    else
1608
      fail = 0;
1609 169 mohor
  end
1610 116 mohor
 
1611
 
1612 181 mohor
  ////////////////////////////////////////////////////////////////////
1613
  ////                                                            ////
1614
  ////  Test various writings to 'real' phy registers (control    ////
1615
  ////  and non writable registers)                               ////
1616
  ////                                                            ////
1617
  ////////////////////////////////////////////////////////////////////
1618
  if (test_num == 2) // 
1619 169 mohor
  begin
1620 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1621
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1622
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1623 181 mohor
 
1624
    // negate data and try to write into unwritable register
1625
    tmp_data = ~phy_data;
1626
    // write request
1627
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1628
    check_mii_busy; // wait for write to finish
1629 169 mohor
    // read request
1630
    #Tp mii_read_req(phy_addr, reg_addr);
1631
    check_mii_busy; // wait for read to finish
1632
    // read data
1633 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1634 181 mohor
    if (tmp_data !== phy_data)
1635
    begin
1636
      test_fail("Data was written into unwritable PHY register - ID register 2");
1637
      fail = fail + 1;
1638
    end
1639
 
1640
    // set address
1641
    reg_addr = 5'h0; // control register
1642
    // read request
1643
    #Tp mii_read_req(phy_addr, reg_addr);
1644
    check_mii_busy; // wait for read to finish
1645
    // read data
1646 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1647 181 mohor
    // write request
1648
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1649
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1650
    check_mii_busy; // wait for write to finish
1651
    // read request
1652
    #Tp mii_read_req(phy_addr, reg_addr);
1653
    check_mii_busy; // wait for read to finish
1654
    // read data
1655 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1656 181 mohor
    if (phy_data !== 16'h7DFF)
1657 169 mohor
    begin
1658 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1659 169 mohor
      fail = fail + 1;
1660
    end
1661 181 mohor
    // write request
1662
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1663
    check_mii_busy; // wait for write to finish
1664
    // read request
1665
    #Tp mii_read_req(phy_addr, reg_addr);
1666
    check_mii_busy; // wait for read to finish
1667
    // read data
1668 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1669 181 mohor
    if (phy_data !== tmp_data)
1670
    begin
1671
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1672
      fail = fail + 1;
1673
    end
1674
    if(fail == 0)
1675
      test_ok;
1676 116 mohor
    else
1677 181 mohor
      fail = 0;
1678 169 mohor
  end
1679 116 mohor
 
1680
 
1681 181 mohor
  ////////////////////////////////////////////////////////////////////
1682
  ////                                                            ////
1683
  ////  Test reset phy through mii management module              ////
1684
  ////                                                            ////
1685
  ////////////////////////////////////////////////////////////////////
1686
  if (test_num == 3) // 
1687 169 mohor
  begin
1688 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1689
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1690
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1691 181 mohor
 
1692
    // set address
1693
    reg_addr = 5'h0; // control register
1694
    // write request
1695
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1696
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1697
    check_mii_busy; // wait for write to finish
1698
    // read request
1699
    #Tp mii_read_req(phy_addr, reg_addr);
1700
    check_mii_busy; // wait for read to finish
1701
    // read data
1702 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1703 181 mohor
    if (phy_data !== tmp_data)
1704
    begin
1705
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1706
      fail = fail + 1;
1707
    end
1708
    // set reset bit - selfclearing bit in PHY
1709
    phy_data = phy_data | 16'h8000;
1710
    // write request
1711
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1712
    check_mii_busy; // wait for write to finish
1713
    // read request
1714
    #Tp mii_read_req(phy_addr, reg_addr);
1715
    check_mii_busy; // wait for read to finish
1716
    // read data
1717 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1718 181 mohor
    // check self clearing of reset bit
1719
    if (tmp_data[15] !== 1'b0)
1720
    begin
1721
      test_fail("Reset bit should be self cleared - control register");
1722
      fail = fail + 1;
1723
    end
1724
    // check reset value of control register
1725
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1726
    begin
1727
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1728
      fail = fail + 1;
1729
    end
1730
    if(fail == 0)
1731
      test_ok;
1732
    else
1733
      fail = 0;
1734 169 mohor
  end
1735
 
1736
 
1737 181 mohor
  ////////////////////////////////////////////////////////////////////
1738
  ////                                                            ////
1739
  ////  Test 'walking one' across phy address (with and without   ////
1740
  ////  preamble)                                                 ////
1741
  ////                                                            ////
1742
  ////////////////////////////////////////////////////////////////////
1743
  if (test_num == 4) // 
1744 169 mohor
  begin
1745 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1746
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1747
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1748 181 mohor
 
1749
    // set PHY to test mode
1750
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1751
    for (i = 0; i <= 1; i = i + 1)
1752 169 mohor
    begin
1753 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1754
      #Tp eth_phy.clear_test_regs;
1755
      // MII mode register
1756
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1757
                wbm_subseq_waits);
1758
      // walk one across phy address
1759
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1760 169 mohor
      begin
1761 181 mohor
        reg_addr = $random;
1762
        tmp_data = $random;
1763
        // write request
1764
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1765
        check_mii_busy; // wait for write to finish
1766
        // read request
1767
        #Tp mii_read_req(phy_addr, reg_addr);
1768
        check_mii_busy; // wait for read to finish
1769
        // read data
1770 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1771 181 mohor
        #Tp;
1772
        if (phy_data !== tmp_data)
1773
        begin
1774
          if (i)
1775
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1776
          else
1777
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1778
          fail = fail + 1;
1779
        end
1780
        @(posedge wb_clk);
1781
        #Tp;
1782 169 mohor
      end
1783
    end
1784 181 mohor
    // set PHY to normal mode
1785
    #Tp eth_phy.test_regs(0);
1786
    #Tp eth_phy.preamble_suppresed(0);
1787
    // MII mode register
1788
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1789
    if(fail == 0)
1790
      test_ok;
1791
    else
1792
      fail = 0;
1793 169 mohor
  end
1794
 
1795
 
1796 181 mohor
  ////////////////////////////////////////////////////////////////////
1797
  ////                                                            ////
1798
  ////  Test 'walking one' across phy's register address (with    ////
1799
  ////  and without preamble)                                     ////
1800
  ////                                                            ////
1801
  ////////////////////////////////////////////////////////////////////
1802
  if (test_num == 5) // 
1803 169 mohor
  begin
1804 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1805
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1806
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1807 181 mohor
 
1808
    // set PHY to test mode
1809
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1810
    for (i = 0; i <= 1; i = i + 1)
1811 169 mohor
    begin
1812 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1813
      #Tp eth_phy.clear_test_regs;
1814
      // MII mode register
1815
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1816
                wbm_subseq_waits);
1817
      // walk one across reg address
1818
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1819 169 mohor
      begin
1820 181 mohor
        phy_addr = $random;
1821
        tmp_data = $random;
1822
        // write request
1823
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1824
        check_mii_busy; // wait for write to finish
1825
        // read request
1826
        #Tp mii_read_req(phy_addr, reg_addr);
1827
        check_mii_busy; // wait for read to finish
1828
        // read data
1829 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1830 181 mohor
        #Tp;
1831
        if (phy_data !== tmp_data)
1832
        begin
1833
          if (i)
1834
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1835
          else
1836
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1837
          fail = fail + 1;
1838
        end
1839
        @(posedge wb_clk);
1840
        #Tp;
1841 169 mohor
      end
1842
    end
1843 181 mohor
    // set PHY to normal mode
1844
    #Tp eth_phy.test_regs(0);
1845
    #Tp eth_phy.preamble_suppresed(0);
1846
    // MII mode register
1847
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1848
    if(fail == 0)
1849
      test_ok;
1850
    else
1851
      fail = 0;
1852 169 mohor
  end
1853
 
1854
 
1855 181 mohor
  ////////////////////////////////////////////////////////////////////
1856
  ////                                                            ////
1857
  ////  Test 'walking one' across phy's data (with and without    ////
1858
  ////  preamble)                                                 ////
1859
  ////                                                            ////
1860
  ////////////////////////////////////////////////////////////////////
1861
  if (test_num == 6) // 
1862 169 mohor
  begin
1863 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
1864
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
1865
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
1866 181 mohor
 
1867
    // set PHY to test mode
1868
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1869
    for (i = 0; i <= 1; i = i + 1)
1870 169 mohor
    begin
1871 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1872
      #Tp eth_phy.clear_test_regs;
1873
      // MII mode register
1874
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1875
                wbm_subseq_waits);
1876
      // walk one across data
1877
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
1878 169 mohor
      begin
1879 181 mohor
        phy_addr = $random;
1880
        reg_addr = $random;
1881
        // write request
1882
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1883
        check_mii_busy; // wait for write to finish
1884
        // read request
1885
        #Tp mii_read_req(phy_addr, reg_addr);
1886
        check_mii_busy; // wait for read to finish
1887
        // read data
1888 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1889 181 mohor
        #Tp;
1890
        if (phy_data !== tmp_data)
1891
        begin
1892
          if (i)
1893
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1894
          else
1895
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1896
          fail = fail + 1;
1897
        end
1898
        @(posedge wb_clk);
1899
        #Tp;
1900 169 mohor
      end
1901
    end
1902 181 mohor
    // set PHY to normal mode
1903
    #Tp eth_phy.test_regs(0);
1904
    #Tp eth_phy.preamble_suppresed(0);
1905
    // MII mode register
1906
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1907
    if(fail == 0)
1908
      test_ok;
1909
    else
1910
      fail = 0;
1911 169 mohor
  end
1912
 
1913
 
1914 181 mohor
  ////////////////////////////////////////////////////////////////////
1915
  ////                                                            ////
1916
  ////  Test reading from phy with wrong phy address (host        ////
1917
  ////  reading high 'z' data)                                    ////
1918
  ////                                                            ////
1919
  ////////////////////////////////////////////////////////////////////
1920
  if (test_num == 7) // 
1921 169 mohor
  begin
1922 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
1923
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
1924
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
1925 181 mohor
 
1926
    phy_addr = 5'h2; // wrong PHY address
1927
    // read request
1928
    #Tp mii_read_req(phy_addr, reg_addr);
1929
    check_mii_busy; // wait for read to finish
1930
    // read data
1931
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
1932 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1933 181 mohor
    if (tmp_data !== 16'hzzzz)
1934
    begin
1935
      test_fail("Data was read from PHY register with wrong PHY address - control register");
1936
      fail = fail + 1;
1937
    end
1938
    if(fail == 0)
1939
      test_ok;
1940
    else
1941
      fail = 0;
1942 169 mohor
  end
1943
 
1944
 
1945 181 mohor
  ////////////////////////////////////////////////////////////////////
1946
  ////                                                            ////
1947
  ////  Test writing to phy with wrong phy address and reading    ////
1948
  ////  from correct one                                          ////
1949
  ////                                                            ////
1950
  ////////////////////////////////////////////////////////////////////
1951
  if (test_num == 8) // 
1952 169 mohor
  begin
1953 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
1954
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
1955
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
1956 181 mohor
 
1957
    // set address
1958
    reg_addr = 5'h0; // control register
1959
    phy_addr = 5'h2; // wrong PHY address
1960
    // write request
1961
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1962
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1963
    check_mii_busy; // wait for write to finish
1964
 
1965
    phy_addr = 5'h1; // correct PHY address
1966
    // read request
1967
    #Tp mii_read_req(phy_addr, reg_addr);
1968
    check_mii_busy; // wait for read to finish
1969
    // read data
1970 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1971 181 mohor
    if (phy_data === tmp_data)
1972
    begin
1973
      test_fail("Data was written into PHY register with wrong PHY address - control register");
1974
      fail = fail + 1;
1975
    end
1976
    if(fail == 0)
1977
      test_ok;
1978
    else
1979
      fail = 0;
1980 169 mohor
  end
1981
 
1982
 
1983 181 mohor
  ////////////////////////////////////////////////////////////////////
1984
  ////                                                            ////
1985
  ////  Test sliding stop scan command immediately after read     ////
1986
  ////  request (with and without preamble)                       ////
1987
  ////                                                            ////
1988
  ////////////////////////////////////////////////////////////////////
1989
  if (test_num == 9) // 
1990 169 mohor
  begin
1991 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
1992
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
1993 181 mohor
    `TIME;
1994 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
1995 181 mohor
 
1996
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
1997 169 mohor
    begin
1998 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
1999
      // MII mode register
2000
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2001
               wbm_subseq_waits);
2002
      i = 0;
2003
      cnt = 0;
2004
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2005 169 mohor
      begin
2006 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
2007
        begin
2008
          // set address
2009
          reg_addr = 5'h0; // control register
2010
          phy_addr = 5'h1; // correct PHY address
2011
          cnt = 0;
2012
          // read request
2013
          #Tp mii_read_req(phy_addr, reg_addr);
2014
          fork
2015
            begin
2016
              repeat(i) @(posedge Mdc_O);
2017
              // write command 0x0 into MII command register
2018
              // MII command written while read in progress
2019
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2020
              @(posedge wb_clk);
2021
              #Tp check_mii_busy; // wait for read to finish
2022
            end
2023
            begin
2024
              // wait for serial bus to become active
2025
              wait(Mdio_IO !== 1'bz);
2026
              // count transfer length
2027
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2028
              begin
2029
                @(posedge Mdc_O);
2030
                #Tp cnt = cnt + 1;
2031
              end
2032
            end
2033
          join
2034
          // check transfer length
2035
          if (i2) // without preamble
2036 169 mohor
          begin
2037 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2038
            begin
2039
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2040
              fail = fail + 1;
2041
            end
2042 169 mohor
          end
2043 181 mohor
          else // with preamble
2044 169 mohor
          begin
2045 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2046
            begin
2047
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2048
              fail = fail + 1;
2049
            end
2050
          end
2051
          // check the BUSY signal to see if the bus is still IDLE
2052
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2053
            check_mii_busy; // wait for bus to become idle
2054
 
2055
          // try normal write or read after read was finished
2056
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2057
          #Tp cnt = 0;
2058
          if (i3 == 0) // write after read
2059
          begin
2060
            // write request
2061
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2062 169 mohor
            // wait for serial bus to become active
2063
            wait(Mdio_IO !== 1'bz);
2064
            // count transfer length
2065 181 mohor
            while(Mdio_IO !== 1'bz)
2066 169 mohor
            begin
2067
              @(posedge Mdc_O);
2068
              #Tp cnt = cnt + 1;
2069
            end
2070 181 mohor
            @(posedge Mdc_O);
2071
            // read request
2072
            #Tp mii_read_req(phy_addr, reg_addr);
2073
            check_mii_busy; // wait for read to finish
2074
            // read and check data
2075 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2076 181 mohor
            if (phy_data !== tmp_data)
2077
            begin
2078
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2079
              fail = fail + 1;
2080
            end
2081 169 mohor
          end
2082 181 mohor
          else // read after read
2083 169 mohor
          begin
2084 181 mohor
            // read request
2085
            #Tp mii_read_req(phy_addr, reg_addr);
2086
            // wait for serial bus to become active
2087
            wait(Mdio_IO !== 1'bz);
2088
            // count transfer length
2089
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2090
            begin
2091
              @(posedge Mdc_O);
2092
              #Tp cnt = cnt + 1;
2093
            end
2094 169 mohor
            @(posedge Mdc_O);
2095 181 mohor
            check_mii_busy; // wait for read to finish
2096
            // read and check data
2097 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2098 181 mohor
            if (phy_data !== tmp_data)
2099
            begin
2100
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2101
              fail = fail + 1;
2102
            end
2103 169 mohor
          end
2104 181 mohor
          // check if transfer was a proper length
2105
          if (i2) // without preamble
2106 169 mohor
          begin
2107 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2108
            begin
2109
              test_fail("New request did not proceed correctly, after read request");
2110
              fail = fail + 1;
2111
            end
2112 169 mohor
          end
2113 181 mohor
          else // with preamble
2114 169 mohor
          begin
2115 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2116
            begin
2117
              test_fail("New request did not proceed correctly, after read request");
2118
              fail = fail + 1;
2119
            end
2120 169 mohor
          end
2121
        end
2122 181 mohor
        #Tp;
2123
        // set delay of writing the command
2124 169 mohor
        if (i2) // without preamble
2125
        begin
2126 181 mohor
          case(i)
2127
            0, 1:               i = i + 1;
2128
            18, 19, 20, 21, 22,
2129
            23, 24, 25, 26, 27,
2130
            28, 29, 30, 31, 32,
2131
            33, 34, 35:         i = i + 1;
2132
            36:                 i = 80;
2133
            default:            i = 18;
2134
          endcase
2135 169 mohor
        end
2136
        else // with preamble
2137
        begin
2138 181 mohor
          case(i)
2139
            0, 1:               i = i + 1;
2140
            50, 51, 52, 53, 54,
2141
            55, 56, 57, 58, 59,
2142
            60, 61, 62, 63, 64,
2143
            65, 66, 67:         i = i + 1;
2144
            68:                 i = 80;
2145
            default:            i = 50;
2146
          endcase
2147 169 mohor
        end
2148 181 mohor
        @(posedge wb_clk);
2149 169 mohor
      end
2150
    end
2151 181 mohor
    // set PHY to normal mode
2152
    #Tp eth_phy.preamble_suppresed(0);
2153
    // MII mode register
2154
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2155
    if(fail == 0)
2156
      test_ok;
2157
    else
2158
      fail = 0;
2159 169 mohor
  end
2160
 
2161
 
2162 181 mohor
  ////////////////////////////////////////////////////////////////////
2163
  ////                                                            ////
2164
  ////  Test sliding stop scan command immediately after write    ////
2165
  ////  request (with and without preamble)                       ////
2166
  ////                                                            ////
2167
  ////////////////////////////////////////////////////////////////////
2168
  if (test_num == 10) // 
2169 169 mohor
  begin
2170 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2171
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2172 181 mohor
    `TIME;
2173 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2174 181 mohor
 
2175
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2176 169 mohor
    begin
2177 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2178
      // MII mode register
2179
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2180
                wbm_subseq_waits);
2181
      i = 0;
2182
      cnt = 0;
2183
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2184 169 mohor
      begin
2185 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2186
        begin
2187
          // set address
2188
          reg_addr = 5'h0; // control register
2189
          phy_addr = 5'h1; // correct PHY address
2190
          cnt = 0;
2191
          // write request
2192
          phy_data = {8'h75, (i[7:0] + 1)};
2193
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2194
          fork
2195
            begin
2196
              repeat(i) @(posedge Mdc_O);
2197
              // write command 0x0 into MII command register
2198
              // MII command written while read in progress
2199
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2200
              @(posedge wb_clk);
2201
              #Tp check_mii_busy; // wait for write to finish
2202
            end
2203
            begin
2204
              // wait for serial bus to become active
2205
              wait(Mdio_IO !== 1'bz);
2206
              // count transfer length
2207
              while(Mdio_IO !== 1'bz)
2208
              begin
2209
                @(posedge Mdc_O);
2210
                #Tp cnt = cnt + 1;
2211
              end
2212
            end
2213
          join
2214
          // check transfer length
2215
          if (i2) // without preamble
2216 169 mohor
          begin
2217 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2218
            begin
2219
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2220
              fail = fail + 1;
2221
            end
2222 169 mohor
          end
2223 181 mohor
          else // with preamble
2224 169 mohor
          begin
2225 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2226
            begin
2227
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2228
              fail = fail + 1;
2229
            end
2230
          end
2231
          // check the BUSY signal to see if the bus is still IDLE
2232
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2233
            check_mii_busy; // wait for bus to become idle
2234
 
2235
          // try normal write or read after write was finished
2236
          #Tp cnt = 0;
2237
          if (i3 == 0) // write after write
2238
          begin
2239
            phy_data = {8'h7A, (i[7:0] + 1)};
2240
            // write request
2241
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2242 169 mohor
            // wait for serial bus to become active
2243
            wait(Mdio_IO !== 1'bz);
2244
            // count transfer length
2245
            while(Mdio_IO !== 1'bz)
2246
            begin
2247
              @(posedge Mdc_O);
2248
              #Tp cnt = cnt + 1;
2249
            end
2250 181 mohor
            @(posedge Mdc_O);
2251
            // read request
2252
            #Tp mii_read_req(phy_addr, reg_addr);
2253
            check_mii_busy; // wait for read to finish
2254
            // read and check data
2255 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2256 181 mohor
            if (phy_data !== tmp_data)
2257
            begin
2258
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2259
              fail = fail + 1;
2260
            end
2261 169 mohor
          end
2262 181 mohor
          else // read after write
2263 169 mohor
          begin
2264 181 mohor
            // read request
2265
            #Tp mii_read_req(phy_addr, reg_addr);
2266
            // wait for serial bus to become active
2267
            wait(Mdio_IO !== 1'bz);
2268
            // count transfer length
2269
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2270
            begin
2271
              @(posedge Mdc_O);
2272
              #Tp cnt = cnt + 1;
2273
            end
2274 169 mohor
            @(posedge Mdc_O);
2275 181 mohor
            check_mii_busy; // wait for read to finish
2276
            // read and check data
2277 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2278 181 mohor
            if (phy_data !== tmp_data)
2279
            begin
2280
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2281
              fail = fail + 1;
2282
            end
2283 169 mohor
          end
2284 181 mohor
          // check if transfer was a proper length
2285
          if (i2) // without preamble
2286 169 mohor
          begin
2287 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2288
            begin
2289
              test_fail("New request did not proceed correctly, after write request");
2290
              fail = fail + 1;
2291
            end
2292 169 mohor
          end
2293 181 mohor
          else // with preamble
2294 169 mohor
          begin
2295 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2296
            begin
2297
              test_fail("New request did not proceed correctly, after write request");
2298
              fail = fail + 1;
2299
            end
2300 169 mohor
          end
2301
        end
2302 181 mohor
        #Tp;
2303
        // set delay of writing the command
2304 169 mohor
        if (i2) // without preamble
2305
        begin
2306 181 mohor
          case(i)
2307
            0, 1:               i = i + 1;
2308
            18, 19, 20, 21, 22,
2309
            23, 24, 25, 26, 27,
2310
            28, 29, 30, 31, 32,
2311
            33, 34, 35:         i = i + 1;
2312
            36:                 i = 80;
2313
            default:            i = 18;
2314
          endcase
2315 169 mohor
        end
2316
        else // with preamble
2317
        begin
2318 181 mohor
          case(i)
2319
            0, 1:               i = i + 1;
2320
            50, 51, 52, 53, 54,
2321
            55, 56, 57, 58, 59,
2322
            60, 61, 62, 63, 64,
2323
            65, 66, 67:         i = i + 1;
2324
            68:                 i = 80;
2325
            default:            i = 50;
2326
          endcase
2327 169 mohor
        end
2328 181 mohor
        @(posedge wb_clk);
2329 169 mohor
      end
2330
    end
2331 181 mohor
    // set PHY to normal mode
2332
    #Tp eth_phy.preamble_suppresed(0);
2333
    // MII mode register
2334
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2335
    if(fail == 0)
2336
      test_ok;
2337
    else
2338
      fail = 0;
2339 169 mohor
  end
2340
 
2341
 
2342 181 mohor
  ////////////////////////////////////////////////////////////////////
2343
  ////                                                            ////
2344
  ////  Test busy and nvalid status durations during write (with  ////
2345
  ////  and without preamble)                                     ////
2346
  ////                                                            ////
2347
  ////////////////////////////////////////////////////////////////////
2348
  if (test_num == 11) // 
2349 169 mohor
  begin
2350 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2351
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2352
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2353 181 mohor
 
2354
    reset_mii; // reset MII
2355
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2356
    #Tp eth_phy.link_up_down(1);
2357
    // set the MII
2358
    clk_div = 64;
2359
    mii_set_clk_div(clk_div[7:0]);
2360
    // set address
2361
    reg_addr = 5'h1; // status register
2362
    phy_addr = 5'h1; // correct PHY address
2363
 
2364
    for (i = 0; i <= 1; i = i + 1)
2365 169 mohor
    begin
2366 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2367
      // MII mode register
2368
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2369
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2370
      @(posedge Mdc_O);
2371
      // write request
2372
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2373
      // read data from MII status register - Busy and Nvalid bits
2374 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2375 181 mohor
 
2376
      // check MII IO signal and Busy and Nvalid bits
2377
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2378 169 mohor
      begin
2379 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2380
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2381
        begin
2382
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2383
          fail = fail + 1;
2384
        end
2385
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2386
        begin
2387
          test_fail("Nvalid signal was set during write");
2388
          fail = fail + 1;
2389
        end
2390 169 mohor
      end
2391 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2392 169 mohor
      begin
2393 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2394
        begin
2395
          test_fail("Busy signal should be set after write, due to reads from MII status register");
2396
          fail = fail + 1;
2397
        end
2398
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2399
        begin
2400
          test_fail("Nvalid signal was set during write");
2401
          fail = fail + 1;
2402
        end
2403 169 mohor
      end
2404 181 mohor
 
2405
      // wait for serial bus to become active
2406
      wait(Mdio_IO !== 1'bz);
2407
      // count transfer bits
2408
      if (i)
2409 169 mohor
      begin
2410 181 mohor
        repeat(32) @(posedge Mdc_O);
2411 169 mohor
      end
2412 181 mohor
      else
2413 169 mohor
      begin
2414 181 mohor
        repeat(64) @(posedge Mdc_O);
2415 169 mohor
      end
2416 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2417 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2418 181 mohor
 
2419
      // check MII IO signal and Busy and Nvalid bits
2420
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2421 169 mohor
      begin
2422 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2423
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2424
        begin
2425
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2426
          fail = fail + 1;
2427
        end
2428
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2429
        begin
2430
          test_fail("Nvalid signal was set during write");
2431
          fail = fail + 1;
2432
        end
2433 169 mohor
      end
2434 181 mohor
      else // Busy bit should still be set to '1'
2435 169 mohor
      begin
2436 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2437
        begin
2438
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2439
          fail = fail + 1;
2440
        end
2441
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2442
        begin
2443
          test_fail("Nvalid signal was set during write");
2444
          fail = fail + 1;
2445
        end
2446 169 mohor
      end
2447 181 mohor
 
2448
      // wait for next negative clock edge
2449
      @(negedge Mdc_O);
2450 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2451 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2452 181 mohor
 
2453 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2454
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2455
      begin
2456
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2457
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2458
        begin
2459
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2460
          fail = fail + 1;
2461
        end
2462
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2463
        begin
2464
          test_fail("Nvalid signal was set during write");
2465
          fail = fail + 1;
2466
        end
2467
      end
2468 181 mohor
      else // Busy bit should still be set to '1'
2469 169 mohor
      begin
2470
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2471
        begin
2472 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2473
          fail = fail + 1;
2474 169 mohor
        end
2475 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2476 169 mohor
        begin
2477 181 mohor
          test_fail("Nvalid signal was set during write");
2478
          fail = fail + 1;
2479
        end
2480
      end
2481
 
2482
      // wait for Busy to become inactive
2483
      i1 = 0;
2484
      while (i1 <= 2)
2485
      begin
2486
        // wait for next positive clock edge
2487
        @(posedge Mdc_O);
2488
        // read data from MII status register - Busy and Nvalid bits
2489 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2490 181 mohor
 
2491
        // check MII IO signal and Busy and Nvalid bits
2492
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2493
        begin
2494
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2495
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2496 169 mohor
          begin
2497 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2498 169 mohor
            fail = fail + 1;
2499
          end
2500 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2501
          begin
2502
            test_fail("Nvalid signal was set during write");
2503
            fail = fail + 1;
2504
          end
2505 169 mohor
        end
2506 181 mohor
        else // wait for Busy bit to be set to '0'
2507 169 mohor
        begin
2508 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2509
          begin
2510
            i1 = 3; // end of Busy checking
2511
          end
2512
          else
2513
          begin
2514
            if (i1 == 2)
2515
            begin
2516
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2517
              fail = fail + 1;
2518
            end
2519
            #Tp i1 = i1 + 1;
2520
          end
2521
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2522
          begin
2523
            test_fail("Nvalid signal was set after write");
2524
            fail = fail + 1;
2525
          end
2526 169 mohor
        end
2527
      end
2528
    end
2529 181 mohor
    // set PHY to normal mode
2530
    #Tp eth_phy.preamble_suppresed(0);
2531
    // MII mode register
2532
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2533
    if(fail == 0)
2534
      test_ok;
2535
    else
2536
      fail = 0;
2537 116 mohor
  end
2538
 
2539
 
2540 181 mohor
  ////////////////////////////////////////////////////////////////////
2541
  ////                                                            ////
2542
  ////  Test busy and nvalid status durations during write (with  ////
2543
  ////  and without preamble)                                     ////
2544
  ////                                                            ////
2545
  ////////////////////////////////////////////////////////////////////
2546
  if (test_num == 12) // 
2547 169 mohor
  begin
2548 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2549
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2550
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2551 181 mohor
 
2552
    reset_mii; // reset MII
2553
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2554
    #Tp eth_phy.link_up_down(1);
2555
    // set the MII
2556
    clk_div = 64;
2557
    mii_set_clk_div(clk_div[7:0]);
2558
    // set address
2559
    reg_addr = 5'h1; // status register
2560
    phy_addr = 5'h1; // correct PHY address
2561
 
2562
    for (i = 0; i <= 1; i = i + 1)
2563 169 mohor
    begin
2564 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2565
      // MII mode register
2566
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2567
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2568 169 mohor
      @(posedge Mdc_O);
2569 181 mohor
      // read request
2570
      #Tp mii_read_req(phy_addr, reg_addr);
2571 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2572 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2573 181 mohor
 
2574 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2575
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2576
      begin
2577 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2578 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2579
        begin
2580 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2581 169 mohor
          fail = fail + 1;
2582
        end
2583
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2584
        begin
2585
          test_fail("Nvalid signal was set during read");
2586
          fail = fail + 1;
2587
        end
2588
      end
2589 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2590 169 mohor
      begin
2591
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2592
        begin
2593 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2594
          fail = fail + 1;
2595 169 mohor
        end
2596
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2597
        begin
2598 181 mohor
          test_fail("Nvalid signal was set during read");
2599 169 mohor
          fail = fail + 1;
2600
        end
2601
      end
2602 181 mohor
 
2603
      // wait for serial bus to become active
2604
      wait(Mdio_IO !== 1'bz);
2605
      // count transfer bits
2606
      if (i)
2607 169 mohor
      begin
2608 181 mohor
        repeat(31) @(posedge Mdc_O);
2609 169 mohor
      end
2610 181 mohor
      else
2611 169 mohor
      begin
2612 181 mohor
        repeat(63) @(posedge Mdc_O);
2613 169 mohor
      end
2614 181 mohor
      // wait for next negative clock edge
2615
      @(negedge Mdc_O);
2616
      // read data from MII status register - Busy and Nvalid bits
2617 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2618 181 mohor
 
2619
      // check MII IO signal and Busy and Nvalid bits
2620
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2621 169 mohor
      begin
2622 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2623
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2624
        begin
2625
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2626
          fail = fail + 1;
2627
        end
2628
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2629
        begin
2630
          test_fail("Nvalid signal was set during read");
2631
          fail = fail + 1;
2632
        end
2633 169 mohor
      end
2634 181 mohor
      else // Busy bit should still be set to '1'
2635 169 mohor
      begin
2636 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2637
        begin
2638
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2639
          fail = fail + 1;
2640
        end
2641
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2642
        begin
2643
          test_fail("Nvalid signal was set during read");
2644
          fail = fail + 1;
2645
        end
2646 169 mohor
      end
2647 181 mohor
 
2648 169 mohor
      // wait for next positive clock edge
2649
      @(posedge Mdc_O);
2650
      // read data from MII status register - Busy and Nvalid bits
2651 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2652 181 mohor
 
2653 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2654
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2655
      begin
2656
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2657 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2658 169 mohor
        begin
2659 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2660
          fail = fail + 1;
2661
        end
2662
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2663
        begin
2664
          test_fail("Nvalid signal was set during read");
2665
          fail = fail + 1;
2666
        end
2667
      end
2668
      else // Busy bit should still be set to '1'
2669
      begin
2670
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2671
        begin
2672
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2673
          fail = fail + 1;
2674
        end
2675
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2676
        begin
2677
          test_fail("Nvalid signal was set during read");
2678
          fail = fail + 1;
2679
        end
2680
      end
2681
 
2682
      // wait for Busy to become inactive
2683
      i1 = 0;
2684
      while (i1 <= 2)
2685
      begin
2686
        // wait for next positive clock edge
2687
        @(posedge Mdc_O);
2688
        // read data from MII status register - Busy and Nvalid bits
2689 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2690 181 mohor
 
2691
        // check MII IO signal and Busy and Nvalid bits
2692
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2693
        begin
2694
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2695 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2696
          begin
2697
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2698
            fail = fail + 1;
2699
          end
2700 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2701 169 mohor
          begin
2702 181 mohor
            test_fail("Nvalid signal was set during read");
2703 169 mohor
            fail = fail + 1;
2704
          end
2705
        end
2706 181 mohor
        else // wait for Busy bit to be set to '0'
2707 169 mohor
        begin
2708
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2709
          begin
2710
            i1 = 3; // end of Busy checking
2711
          end
2712
          else
2713
          begin
2714
            if (i1 == 2)
2715
            begin
2716
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2717
              fail = fail + 1;
2718
            end
2719
            #Tp i1 = i1 + 1;
2720
          end
2721 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2722 169 mohor
          begin
2723 181 mohor
            test_fail("Nvalid signal was set after read");
2724 169 mohor
            fail = fail + 1;
2725
          end
2726
        end
2727
      end
2728
    end
2729 181 mohor
    // set PHY to normal mode
2730
    #Tp eth_phy.preamble_suppresed(0);
2731
    // MII mode register
2732
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2733
    if(fail == 0)
2734
      test_ok;
2735
    else
2736
      fail = 0;
2737 169 mohor
  end
2738
 
2739
 
2740 181 mohor
  ////////////////////////////////////////////////////////////////////
2741
  ////                                                            ////
2742
  ////  Test busy and nvalid status durations during scan (with   ////
2743
  ////  and without preamble)                                     ////
2744
  ////                                                            ////
2745
  ////////////////////////////////////////////////////////////////////
2746
  if (test_num == 13) // 
2747 169 mohor
  begin
2748 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2749
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2750
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2751 181 mohor
 
2752
    reset_mii; // reset MII
2753
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2754
    #Tp eth_phy.link_up_down(1);
2755
    // set the MII
2756
    clk_div = 64;
2757
    mii_set_clk_div(clk_div[7:0]);
2758
    // set address
2759
    reg_addr = 5'h1; // status register
2760
    phy_addr = 5'h1; // correct PHY address
2761
 
2762
    for (i = 0; i <= 1; i = i + 1)
2763 169 mohor
    begin
2764 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2765
      // MII mode register
2766
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2767
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2768
      @(posedge Mdc_O);
2769
      // scan request
2770
      #Tp mii_scan_req(phy_addr, reg_addr);
2771
      // read data from MII status register - Busy and Nvalid bits
2772 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2773 181 mohor
 
2774
      // check MII IO signal and Busy and Nvalid bits
2775
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2776 169 mohor
      begin
2777 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2778
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2779
        begin
2780
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2781
          fail = fail + 1;
2782
        end
2783
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2784
        begin
2785
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2786
          fail = fail + 1;
2787
        end
2788 169 mohor
      end
2789 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2790 169 mohor
      begin
2791 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2792
        begin
2793
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2794
          fail = fail + 1;
2795
        end
2796
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2797
        begin
2798
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2799
          fail = fail + 1;
2800
        end
2801 169 mohor
      end
2802 181 mohor
 
2803
      // wait for serial bus to become active
2804 169 mohor
      wait(Mdio_IO !== 1'bz);
2805 181 mohor
      // count transfer bits
2806
      if (i)
2807 169 mohor
      begin
2808 181 mohor
        repeat(21) @(posedge Mdc_O);
2809 169 mohor
      end
2810 181 mohor
      else
2811 169 mohor
      begin
2812 181 mohor
        repeat(53) @(posedge Mdc_O);
2813 169 mohor
      end
2814 181 mohor
      // stop scan
2815
      #Tp mii_scan_finish; // finish scan operation
2816
 
2817
      // wait for next positive clock edge
2818
      repeat(10) @(posedge Mdc_O);
2819
      // read data from MII status register - Busy and Nvalid bits
2820 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2821 181 mohor
 
2822
      // check MII IO signal and Busy and Nvalid bits
2823
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2824 169 mohor
      begin
2825 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2826
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2827 169 mohor
        begin
2828 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2829 169 mohor
          fail = fail + 1;
2830
        end
2831 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2832 169 mohor
      end
2833 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2834 169 mohor
      begin
2835 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2836 169 mohor
        begin
2837 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2838 169 mohor
          fail = fail + 1;
2839
        end
2840 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2841 169 mohor
        begin
2842 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2843 169 mohor
          fail = fail + 1;
2844
        end
2845 181 mohor
      end
2846
 
2847
      // wait for next negative clock edge
2848
      @(negedge Mdc_O);
2849
      // read data from MII status register - Busy and Nvalid bits
2850 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2851 181 mohor
 
2852
      // check MII IO signal and Busy and Nvalid bits
2853
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2854
      begin
2855
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2856
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2857 169 mohor
        begin
2858 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2859
          fail = fail + 1;
2860 169 mohor
        end
2861 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2862 169 mohor
      end
2863 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2864 169 mohor
      begin
2865 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2866 169 mohor
        begin
2867 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2868
          fail = fail + 1;
2869 169 mohor
        end
2870 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2871 169 mohor
        begin
2872 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2873
          fail = fail + 1;
2874 169 mohor
        end
2875
      end
2876 181 mohor
 
2877
      // wait for next negative clock edge
2878
      @(posedge Mdc_O);
2879
      // read data from MII status register - Busy and Nvalid bits
2880 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2881 181 mohor
 
2882
      // check MII IO signal and Busy and Nvalid bits
2883
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2884 169 mohor
      begin
2885 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2886
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2887 169 mohor
        begin
2888 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2889 169 mohor
          fail = fail + 1;
2890
        end
2891 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2892 169 mohor
        begin
2893 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2894 169 mohor
          fail = fail + 1;
2895
        end
2896
      end
2897 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
2898 169 mohor
      begin
2899 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2900 169 mohor
        begin
2901 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2902
          fail = fail + 1;
2903 169 mohor
        end
2904 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2905 169 mohor
        begin
2906 181 mohor
          i2 = 1; // check finished
2907 169 mohor
        end
2908 181 mohor
        else
2909 169 mohor
        begin
2910 181 mohor
          i2 = 0; // check must continue
2911 169 mohor
        end
2912
      end
2913 181 mohor
 
2914
      // wait for Busy to become inactive
2915
      i1 = 0;
2916
      while ((i1 <= 2) || (i2 == 0))
2917
      begin
2918
        // wait for next positive clock edge
2919
        @(posedge Mdc_O);
2920
        // read data from MII status register - Busy and Nvalid bits
2921 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2922 181 mohor
 
2923
        // check MII IO signal and Busy and Nvalid bits
2924
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2925 169 mohor
        begin
2926 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2927
          if (i1 <= 2)
2928 169 mohor
          begin
2929 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2930 169 mohor
            begin
2931 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2932 169 mohor
              fail = fail + 1;
2933
            end
2934
          end
2935 181 mohor
          if (i2 == 0)
2936 169 mohor
          begin
2937 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2938 169 mohor
            begin
2939 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2940 169 mohor
              fail = fail + 1;
2941
            end
2942
          end
2943
        end
2944 181 mohor
        else // wait for Busy bit to be set to '0'
2945 169 mohor
        begin
2946 181 mohor
          if (i1 <= 2)
2947 169 mohor
          begin
2948 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2949 169 mohor
            begin
2950 181 mohor
              i1 = 3; // end of Busy checking
2951 169 mohor
            end
2952 181 mohor
            else
2953 169 mohor
            begin
2954 181 mohor
              if (i1 == 2)
2955 169 mohor
              begin
2956 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2957 169 mohor
                fail = fail + 1;
2958
              end
2959 181 mohor
              #Tp i1 = i1 + 1;
2960 169 mohor
            end
2961 181 mohor
          end
2962
          if (i2 == 0)
2963
          begin
2964
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2965 169 mohor
            begin
2966 181 mohor
              i2 = 1;
2967 169 mohor
            end
2968 181 mohor
            else
2969
            begin
2970
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
2971
              fail = fail + 1;
2972
            end
2973 169 mohor
          end
2974
        end
2975 181 mohor
      end
2976
    end
2977
    // set PHY to normal mode
2978
    #Tp eth_phy.preamble_suppresed(0);
2979
    // MII mode register
2980
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2981
    if(fail == 0)
2982
      test_ok;
2983
    else
2984
      fail = 0;
2985
  end
2986
 
2987
 
2988
  ////////////////////////////////////////////////////////////////////
2989
  ////                                                            ////
2990
  ////  Test scan status from phy with detecting link-fail bit    ////
2991
  ////  (with and without preamble)                               ////
2992
  ////                                                            ////
2993
  ////////////////////////////////////////////////////////////////////
2994
  if (test_num == 14) // 
2995
  begin
2996 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
2997
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
2998
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
2999 181 mohor
 
3000
    reset_mii; // reset MII
3001
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
3002
    #Tp eth_phy.link_up_down(1);
3003
    // set MII speed
3004
    clk_div = 6;
3005
    mii_set_clk_div(clk_div[7:0]);
3006
    // set address
3007
    reg_addr = 5'h1; // status register
3008
    phy_addr = 5'h1; // correct PHY address
3009
 
3010
    // read request
3011
    #Tp mii_read_req(phy_addr, reg_addr);
3012
    check_mii_busy; // wait for read to finish
3013
    // read data from PHY status register - remember LINK-UP status
3014 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3015 181 mohor
 
3016
    for (i = 0; i <= 1; i = i + 1)
3017
    begin
3018
      #Tp eth_phy.preamble_suppresed(i);
3019
      // MII mode register
3020
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
3021
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3022
      if (i)
3023
      begin
3024
        // change saved data when preamble is suppressed
3025
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3026
      end
3027
 
3028
      // scan request
3029
      #Tp mii_scan_req(phy_addr, reg_addr);
3030
      check_mii_scan_valid; // wait for scan to make first data valid
3031
 
3032 169 mohor
      fork
3033 181 mohor
      begin
3034 169 mohor
        repeat(2) @(posedge Mdc_O);
3035
        // read data from PHY status register
3036 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3037 181 mohor
        if (phy_data !== tmp_data)
3038 169 mohor
        begin
3039 181 mohor
          test_fail("Data was not correctly scaned from status register");
3040 169 mohor
          fail = fail + 1;
3041
        end
3042
        // read data from MII status register
3043 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3044 181 mohor
        if (phy_data[0] !== 1'b0)
3045 169 mohor
        begin
3046 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
3047 169 mohor
          fail = fail + 1;
3048
        end
3049
      end
3050
      begin
3051 181 mohor
      // Completely check second scan
3052 169 mohor
        #Tp cnt = 0;
3053
        // wait for serial bus to become active - second scan
3054
        wait(Mdio_IO !== 1'bz);
3055
        // count transfer length
3056 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3057 169 mohor
        begin
3058
          @(posedge Mdc_O);
3059
          #Tp cnt = cnt + 1;
3060
        end
3061
        // check transfer length
3062 181 mohor
        if (i) // without preamble
3063 169 mohor
        begin
3064
          if (cnt != 33) // at this value Mdio_IO is HIGH Z
3065
          begin
3066 181 mohor
            test_fail("Second scan request did not proceed correctly");
3067 169 mohor
            fail = fail + 1;
3068
          end
3069
        end
3070
        else // with preamble
3071
        begin
3072
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3073
          begin
3074 181 mohor
            test_fail("Second scan request did not proceed correctly");
3075 169 mohor
            fail = fail + 1;
3076
          end
3077
        end
3078
      end
3079
      join
3080 181 mohor
      // check third to fifth scans
3081
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3082
      begin
3083
        fork
3084 169 mohor
        begin
3085
          repeat(2) @(posedge Mdc_O);
3086
          // read data from PHY status register
3087 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3088 181 mohor
          if (phy_data !== tmp_data)
3089 169 mohor
          begin
3090 181 mohor
            test_fail("Data was not correctly scaned from status register");
3091
            fail = fail + 1;
3092 169 mohor
          end
3093
          // read data from MII status register
3094 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3095 181 mohor
          if (phy_data[0] !== 1'b0)
3096 169 mohor
          begin
3097 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3098
            fail = fail + 1;
3099 169 mohor
          end
3100 181 mohor
          if (i3 == 2) // after fourth scan read
3101 169 mohor
          begin
3102 181 mohor
            @(posedge Mdc_O);
3103
            // change saved data
3104
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3105
            // set link down
3106
            #Tp eth_phy.link_up_down(0);
3107 169 mohor
          end
3108
        end
3109
        begin
3110 181 mohor
        // Completely check scans
3111
          #Tp cnt = 0;
3112
          // wait for serial bus to become active - second scan
3113
          wait(Mdio_IO !== 1'bz);
3114
          // count transfer length
3115
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3116 169 mohor
          begin
3117 181 mohor
            @(posedge Mdc_O);
3118
            #Tp cnt = cnt + 1;
3119
          end
3120
          // check transfer length
3121
          if (i) // without preamble
3122
          begin
3123
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3124 169 mohor
            begin
3125 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3126
              fail = fail + 1;
3127 169 mohor
            end
3128 181 mohor
          end
3129
          else // with preamble
3130
          begin
3131
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3132 169 mohor
            begin
3133 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3134
              fail = fail + 1;
3135 169 mohor
            end
3136
          end
3137
        end
3138 181 mohor
        join
3139
      end
3140
 
3141
      fork
3142
      begin
3143
        repeat(2) @(posedge Mdc_O);
3144
        // read data from PHY status register
3145 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3146 181 mohor
        if (phy_data !== tmp_data)
3147
        begin
3148
          test_fail("Data was not correctly scaned from status register");
3149
          fail = fail + 1;
3150
        end
3151
        // read data from MII status register
3152 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3153 181 mohor
        if (phy_data[0] === 1'b0)
3154
        begin
3155
          test_fail("Link FAIL bit was not set in the MII status register");
3156
          fail = fail + 1;
3157
        end
3158
        // wait to see if data stayed latched
3159
        repeat(4) @(posedge Mdc_O);
3160
        // read data from PHY status register
3161 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3162 181 mohor
        if (phy_data !== tmp_data)
3163
        begin
3164
          test_fail("Data was not latched correctly in status register");
3165
          fail = fail + 1;
3166
        end
3167
        // read data from MII status register
3168 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3169 181 mohor
        if (phy_data[0] === 1'b0)
3170
        begin
3171
          test_fail("Link FAIL bit was not set in the MII status register");
3172
          fail = fail + 1;
3173
        end
3174
        // change saved data
3175
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3176
        // set link up
3177
        #Tp eth_phy.link_up_down(1);
3178
      end
3179
      begin
3180
      // Wait for sixth scan
3181
        // wait for serial bus to become active - sixth scan
3182
        wait(Mdio_IO !== 1'bz);
3183
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3184
        wait(Mdio_IO === 1'bz);
3185
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3186
        wait(Mdio_IO !== 1'bz);
3187
        // wait for serial bus to become inactive - end of sixth scan
3188
        wait(Mdio_IO === 1'bz);
3189
      end
3190 169 mohor
      join
3191 181 mohor
 
3192
      @(posedge Mdc_O);
3193 169 mohor
      // read data from PHY status register
3194 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3195 169 mohor
      if (phy_data !== tmp_data)
3196
      begin
3197 181 mohor
        test_fail("Data was not correctly scaned from status register");
3198 169 mohor
        fail = fail + 1;
3199
      end
3200
      // read data from MII status register
3201 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3202 169 mohor
      if (phy_data[0] !== 1'b0)
3203
      begin
3204
        test_fail("Link FAIL bit was set in the MII status register");
3205
        fail = fail + 1;
3206
      end
3207 181 mohor
      // wait to see if data stayed latched
3208
      repeat(4) @(posedge Mdc_O);
3209
      // read data from PHY status register
3210 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3211 181 mohor
      if (phy_data !== tmp_data)
3212 169 mohor
      begin
3213 181 mohor
        test_fail("Data was not correctly scaned from status register");
3214
        fail = fail + 1;
3215 169 mohor
      end
3216 181 mohor
      // read data from MII status register
3217 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3218 181 mohor
      if (phy_data[0] !== 1'b0)
3219 169 mohor
      begin
3220 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3221
        fail = fail + 1;
3222 169 mohor
      end
3223 181 mohor
 
3224
      // STOP SCAN
3225
      #Tp mii_scan_finish; // finish scan operation
3226
      #Tp check_mii_busy; // wait for scan to finish
3227 169 mohor
    end
3228 181 mohor
    // set PHY to normal mode
3229
    #Tp eth_phy.preamble_suppresed(0);
3230
    // MII mode register
3231
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3232
    if(fail == 0)
3233
      test_ok;
3234
    else
3235
      fail = 0;
3236 169 mohor
  end
3237
 
3238
 
3239 181 mohor
  ////////////////////////////////////////////////////////////////////
3240
  ////                                                            ////
3241
  ////  Test scan status from phy with sliding link-fail bit      ////
3242
  ////  (with and without preamble)                               ////
3243
  ////                                                            ////
3244
  ////////////////////////////////////////////////////////////////////
3245
  if (test_num == 15) // 
3246 169 mohor
  begin
3247 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3248
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3249
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3250 181 mohor
 
3251
    // set address
3252
    reg_addr = 5'h1; // status register
3253
    phy_addr = 5'h1; // correct PHY address
3254
 
3255
    // read request
3256
    #Tp mii_read_req(phy_addr, reg_addr);
3257
    check_mii_busy; // wait for read to finish
3258
    // read data from PHY status register - remember LINK-UP status
3259 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3260 181 mohor
 
3261
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3262 169 mohor
    begin
3263 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3264
      // MII mode register
3265
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3266
                    wbm_subseq_waits);
3267
      if (i2)
3268 169 mohor
      begin
3269 181 mohor
        // change saved data when preamble is suppressed
3270
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3271
      end
3272
 
3273
      i = 0;
3274
      while (i < 80) // delay for sliding of LinkFail bit
3275
      begin
3276
        // first there are two scans
3277
        #Tp cnt = 0;
3278 169 mohor
        // scan request
3279
        #Tp mii_scan_req(phy_addr, reg_addr);
3280 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3281
 
3282
        // check second scan
3283 169 mohor
        fork
3284 181 mohor
        begin
3285
          repeat(4) @(posedge Mdc_O);
3286
          // read data from PHY status register
3287 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3288 181 mohor
          if (phy_data !== tmp_data)
3289 169 mohor
          begin
3290 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3291
            fail = fail + 1;
3292 169 mohor
          end
3293 181 mohor
          // read data from MII status register
3294 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3295 181 mohor
          if (phy_data[0] !== 1'b0)
3296
          begin
3297
            test_fail("Link FAIL bit was set in the MII status register");
3298
            fail = fail + 1;
3299
          end
3300
        end
3301
        begin
3302
        // Completely check scan
3303
          #Tp cnt = 0;
3304
          // wait for serial bus to become active - second scan
3305
          wait(Mdio_IO !== 1'bz);
3306
          // count transfer length
3307
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3308
          begin
3309
            @(posedge Mdc_O);
3310
            #Tp cnt = cnt + 1;
3311
          end
3312
          // check transfer length
3313
          if (i2) // without preamble
3314
          begin
3315
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3316 169 mohor
            begin
3317 181 mohor
              test_fail("Second scan request did not proceed correctly");
3318
              fail = fail + 1;
3319 169 mohor
            end
3320 181 mohor
          end
3321
          else // with preamble
3322
          begin
3323
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3324
            begin
3325
              test_fail("Second scan request did not proceed correctly");
3326
              fail = fail + 1;
3327
            end
3328
          end
3329
        end
3330
        join
3331
        // reset counter 
3332
        #Tp cnt = 0;
3333
        // SLIDING LINK DOWN and CHECK
3334
        fork
3335
          begin
3336
          // set link down
3337
            repeat(i) @(posedge Mdc_O);
3338
            // set link down
3339
            #Tp eth_phy.link_up_down(0);
3340
          end
3341
          begin
3342
          // check data in MII registers after each scan in this fork statement
3343 169 mohor
            if (i2) // without preamble
3344 181 mohor
              wait (cnt == 32);
3345
            else // with preamble
3346
              wait (cnt == 64);
3347
            repeat(3) @(posedge Mdc_O);
3348
            // read data from PHY status register
3349 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3350 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3351 169 mohor
            begin
3352 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3353 169 mohor
              begin
3354 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3355 169 mohor
                fail = fail + 1;
3356
              end
3357
            end
3358 181 mohor
            else
3359 169 mohor
            begin
3360 181 mohor
              if (phy_data !== tmp_data)
3361 169 mohor
              begin
3362 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3363 169 mohor
                fail = fail + 1;
3364
              end
3365
            end
3366 181 mohor
            // read data from MII status register
3367 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3368 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3369 169 mohor
            begin
3370 181 mohor
              if (phy_data[0] === 1'b0)
3371
              begin
3372
                test_fail("Link FAIL bit was not set in the MII status register");
3373
                fail = fail + 1;
3374
              end
3375 169 mohor
            end
3376 181 mohor
            else
3377 169 mohor
            begin
3378 181 mohor
              if (phy_data[0] !== 1'b0)
3379 169 mohor
              begin
3380 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3381 169 mohor
                fail = fail + 1;
3382
              end
3383
            end
3384 181 mohor
          end
3385
          begin
3386
          // check length
3387
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3388 169 mohor
            begin
3389 181 mohor
              #Tp cnt = 0;
3390
              // wait for serial bus to become active if there is more than one scan
3391
              wait(Mdio_IO !== 1'bz);
3392
              // count transfer length
3393
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3394 169 mohor
              begin
3395 181 mohor
                @(posedge Mdc_O);
3396
                #Tp cnt = cnt + 1;
3397 169 mohor
              end
3398 181 mohor
              // check transfer length
3399
              if (i2) // without preamble
3400
              begin
3401
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3402
                begin
3403
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3404
                  fail = fail + 1;
3405
                end
3406
              end
3407
              else // with preamble
3408
              begin
3409
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3410
                begin
3411
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3412
                  fail = fail + 1;
3413
                end
3414
              end
3415 169 mohor
            end
3416
          end
3417
        join
3418 181 mohor
        // reset counter
3419
        #Tp cnt = 0;
3420
        // check fifth scan and data from fourth scan
3421
        fork
3422 169 mohor
        begin
3423 181 mohor
          repeat(2) @(posedge Mdc_O);
3424
          // read data from PHY status register
3425 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3426 181 mohor
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3427 169 mohor
          begin
3428 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3429
            fail = fail + 1;
3430 169 mohor
          end
3431 181 mohor
          // read data from MII status register
3432 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3433 181 mohor
          if (phy_data[0] === 1'b0)
3434 169 mohor
          begin
3435 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3436 169 mohor
            fail = fail + 1;
3437
          end
3438
        end
3439
        begin
3440 181 mohor
        // Completely check intermediate scan
3441
          #Tp cnt = 0;
3442
          // wait for serial bus to become active - second scan
3443 169 mohor
          wait(Mdio_IO !== 1'bz);
3444
          // count transfer length
3445
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3446
          begin
3447
            @(posedge Mdc_O);
3448
            #Tp cnt = cnt + 1;
3449
          end
3450 181 mohor
          // check transfer length
3451
          if (i2) // without preamble
3452 169 mohor
          begin
3453 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3454
            begin
3455
              test_fail("Fifth scan request did not proceed correctly");
3456
              fail = fail + 1;
3457
            end
3458 169 mohor
          end
3459 181 mohor
          else // with preamble
3460
          begin
3461
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3462
            begin
3463
              test_fail("Fifth scan request did not proceed correctly");
3464
              fail = fail + 1;
3465
            end
3466
          end
3467 169 mohor
        end
3468 181 mohor
        join
3469
        // reset counter 
3470
        #Tp cnt = 0;
3471
        // SLIDING LINK UP and CHECK
3472
        fork
3473 169 mohor
          begin
3474 181 mohor
          // set link up
3475
            repeat(i) @(posedge Mdc_O);
3476
            // set link up
3477
            #Tp eth_phy.link_up_down(1);
3478 169 mohor
          end
3479 181 mohor
          begin
3480
          // check data in MII registers after each scan in this fork statement
3481
            repeat(2) @(posedge Mdc_O);
3482
            if (i2) // without preamble
3483
              wait (cnt == 32);
3484
            else // with preamble
3485
              wait (cnt == 64);
3486
            repeat(3) @(posedge Mdc_O);
3487
            // read data from PHY status register
3488 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3489 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3490
            begin
3491
              if (phy_data !== tmp_data)
3492
              begin
3493
                test_fail("6. data was not correctly scaned from status register");
3494
                fail = fail + 1;
3495
              end
3496
            end
3497
            else
3498
            begin
3499
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3500
              begin
3501
                test_fail("6. data was not correctly scaned from status register");
3502
                fail = fail + 1;
3503
              end
3504
            end
3505
            // read data from MII status register
3506 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3507 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3508
            begin
3509
              if (phy_data[0] !== 1'b0)
3510
              begin
3511
                test_fail("Link FAIL bit was set in the MII status register");
3512
                fail = fail + 1;
3513
              end
3514
            end
3515
            else
3516
            begin
3517
              if (phy_data[0] === 1'b0)
3518
              begin
3519
                test_fail("Link FAIL bit was not set in the MII status register");
3520
                fail = fail + 1;
3521
              end
3522
            end
3523
          end
3524
          begin
3525
          // check length
3526
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3527
            begin
3528
              #Tp cnt = 0;
3529
              // wait for serial bus to become active if there is more than one scan
3530
              wait(Mdio_IO !== 1'bz);
3531
              // count transfer length
3532
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3533
              begin
3534
                @(posedge Mdc_O);
3535
                #Tp cnt = cnt + 1;
3536
              end
3537
              // check transfer length
3538
              if (i2) // without preamble
3539
              begin
3540
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3541
                begin
3542
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3543
                  fail = fail + 1;
3544
                end
3545
              end
3546
              else // with preamble
3547
              begin
3548
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3549
                begin
3550
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3551
                  fail = fail + 1;
3552
                end
3553
              end
3554
            end
3555
          end
3556
        join
3557
        // check last scan 
3558
        repeat(4) @(posedge Mdc_O);
3559
        // read data from PHY status register
3560 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3561 181 mohor
        if (phy_data !== tmp_data)
3562
        begin
3563
          test_fail("7. data was not correctly scaned from status register");
3564
          fail = fail + 1;
3565 169 mohor
        end
3566 181 mohor
        // read data from MII status register
3567 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3568 181 mohor
        if (phy_data[0] !== 1'b0)
3569
        begin
3570
          test_fail("Link FAIL bit was set in the MII status register");
3571
          fail = fail + 1;
3572
        end
3573
 
3574
        #Tp mii_scan_finish; // finish scan operation
3575
        #Tp check_mii_busy; // wait for scan to finish
3576
        #Tp;
3577
        // set delay of writing the command
3578
        if (i2) // without preamble
3579
        begin
3580
          case(i)
3581
            0,  1,  2,  3,  4:  i = i + 1;
3582
            13, 14, 15, 16, 17,
3583
            18, 19, 20, 21, 22,
3584
            23, 24, 25, 26, 27,
3585
            28, 29, 30, 31, 32,
3586
            33, 34, 35:         i = i + 1;
3587
            36:                 i = 80;
3588
            default:            i = 13;
3589
          endcase
3590
        end
3591 169 mohor
        else // with preamble
3592
        begin
3593 181 mohor
          case(i)
3594
            0,  1,  2,  3,  4:  i = i + 1;
3595
            45, 46, 47, 48, 49,
3596
            50, 51, 52, 53, 54,
3597
            55, 56, 57, 58, 59,
3598
            60, 61, 62, 63, 64,
3599
            65, 66, 67:         i = i + 1;
3600
            68:                 i = 80;
3601
            default:            i = 45;
3602
          endcase
3603 169 mohor
        end
3604 181 mohor
        @(posedge wb_clk);
3605
        #Tp;
3606 169 mohor
      end
3607
    end
3608 181 mohor
    // set PHY to normal mode
3609
    #Tp eth_phy.preamble_suppresed(0);
3610
    // MII mode register
3611
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3612
    if(fail == 0)
3613
      test_ok;
3614
    else
3615
      fail = 0;
3616 169 mohor
  end
3617
 
3618
 
3619 181 mohor
  ////////////////////////////////////////////////////////////////////
3620
  ////                                                            ////
3621
  ////  Test sliding stop scan command immediately after scan     ////
3622
  ////  request (with and without preamble)                       ////
3623
  ////                                                            ////
3624
  ////////////////////////////////////////////////////////////////////
3625
  if (test_num == 16) // 
3626 116 mohor
  begin
3627 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3628
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3629 181 mohor
    `TIME;
3630 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3631 181 mohor
 
3632
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3633 169 mohor
    begin
3634 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3635
      // MII mode register
3636
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3637
                wbm_subseq_waits);
3638
      i = 0;
3639
      cnt = 0;
3640
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3641 169 mohor
      begin
3642 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3643 169 mohor
        begin
3644 181 mohor
          // set address
3645
          reg_addr = 5'h0; // control register
3646
          phy_addr = 5'h1; // correct PHY address
3647
          cnt = 0;
3648
          // scan request
3649
          #Tp mii_scan_req(phy_addr, reg_addr);
3650
          fork
3651
            begin
3652
              repeat(i) @(posedge Mdc_O);
3653
              // write command 0x0 into MII command register
3654
              // MII command written while scan in progress
3655
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3656
              @(posedge wb_clk);
3657
              #Tp check_mii_busy; // wait for scan to finish
3658
              @(posedge wb_clk);
3659
              disable check;
3660
            end
3661
            begin: check
3662
              // wait for serial bus to become active
3663
              wait(Mdio_IO !== 1'bz);
3664
              // count transfer length
3665
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3666
              begin
3667
                @(posedge Mdc_O);
3668
                #Tp cnt = cnt + 1;
3669
              end
3670
              // check transfer length
3671
              if (i2) // without preamble
3672
              begin
3673
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3674
                begin
3675
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3676
                  fail = fail + 1;
3677
                end
3678
              end
3679
              else // with preamble
3680
              begin
3681
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3682
                begin
3683
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3684
                  fail = fail + 1;
3685
                end
3686
              end
3687
              cnt = 0;
3688
              // wait for serial bus to become active if there is more than one scan
3689
              wait(Mdio_IO !== 1'bz);
3690
              // count transfer length
3691
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3692
              begin
3693
                @(posedge Mdc_O);
3694
                #Tp cnt = cnt + 1;
3695
              end
3696
              // check transfer length
3697
              if (i2) // without preamble
3698
              begin
3699
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3700
                begin
3701
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3702
                  fail = fail + 1;
3703
                end
3704
              end
3705
              else // with preamble
3706
              begin
3707
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3708
                begin
3709
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3710
                  fail = fail + 1;
3711
                end
3712
              end
3713
            end
3714
          join
3715
          // check the BUSY signal to see if the bus is still IDLE
3716
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3717
            check_mii_busy; // wait for bus to become idle
3718
 
3719
          // try normal write or read after scan was finished
3720
          phy_data = {8'h7D, (i[7:0] + 1)};
3721
          cnt = 0;
3722
          if (i3 == 0) // write after scan
3723 169 mohor
          begin
3724 181 mohor
            // write request
3725
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3726
            // wait for serial bus to become active
3727
            wait(Mdio_IO !== 1'bz);
3728
            // count transfer length
3729
            while(Mdio_IO !== 1'bz)
3730
            begin
3731
              @(posedge Mdc_O);
3732
              #Tp cnt = cnt + 1;
3733
            end
3734 169 mohor
            @(posedge Mdc_O);
3735 181 mohor
            // read request
3736
            #Tp mii_read_req(phy_addr, reg_addr);
3737
            check_mii_busy; // wait for read to finish
3738
            // read and check data
3739 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3740 181 mohor
            if (phy_data !== tmp_data)
3741 169 mohor
            begin
3742 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3743 169 mohor
              fail = fail + 1;
3744
            end
3745
          end
3746 181 mohor
          else // read after scan
3747 169 mohor
          begin
3748 181 mohor
            // read request
3749
            #Tp mii_read_req(phy_addr, reg_addr);
3750
            // wait for serial bus to become active
3751
            wait(Mdio_IO !== 1'bz);
3752
            // count transfer length
3753
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3754 169 mohor
            begin
3755 181 mohor
              @(posedge Mdc_O);
3756
              #Tp cnt = cnt + 1;
3757
            end
3758
            @(posedge Mdc_O);
3759
            check_mii_busy; // wait for read to finish
3760
            // read and check data
3761 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3762 181 mohor
            if (phy_data !== tmp_data)
3763
            begin
3764
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3765 169 mohor
              fail = fail + 1;
3766
            end
3767
          end
3768 181 mohor
          // check if transfer was a proper length
3769 169 mohor
          if (i2) // without preamble
3770
          begin
3771
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3772
            begin
3773 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3774 169 mohor
              fail = fail + 1;
3775
            end
3776
          end
3777
          else // with preamble
3778
          begin
3779
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3780
            begin
3781 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3782 169 mohor
              fail = fail + 1;
3783
            end
3784
          end
3785
        end
3786 181 mohor
        #Tp;
3787
        // set delay of writing the command
3788
        if (i2) // without preamble
3789
        begin
3790
          case(i)
3791
            0, 1:               i = i + 1;
3792
            18, 19, 20, 21, 22,
3793
            23, 24, 25, 26, 27,
3794
            28, 29, 30, 31, 32,
3795
            33, 34, 35:         i = i + 1;
3796
            36:                 i = 80;
3797
            default:            i = 18;
3798
          endcase
3799
        end
3800
        else // with preamble
3801
        begin
3802
          case(i)
3803
            0, 1:               i = i + 1;
3804
            50, 51, 52, 53, 54,
3805
            55, 56, 57, 58, 59,
3806
            60, 61, 62, 63, 64,
3807
            65, 66, 67:         i = i + 1;
3808
            68:                 i = 80;
3809
            default:            i = 50;
3810
          endcase
3811
        end
3812
        @(posedge wb_clk);
3813
      end
3814
    end
3815
    // set PHY to normal mode
3816
    #Tp eth_phy.preamble_suppresed(0);
3817
    // MII mode register
3818
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3819
    if(fail == 0)
3820
      test_ok;
3821
    else
3822
      fail = 0;
3823
  end
3824 169 mohor
 
3825 181 mohor
 
3826
  ////////////////////////////////////////////////////////////////////
3827
  ////                                                            ////
3828
  ////  Test sliding stop scan command after 2. scan (with and    ////
3829
  ////  without preamble)                                         ////
3830
  ////                                                            ////
3831
  ////////////////////////////////////////////////////////////////////
3832
  if (test_num == 17) // 
3833
  begin
3834 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3835
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3836
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3837 181 mohor
 
3838
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3839
    begin
3840
      #Tp eth_phy.preamble_suppresed(i2);
3841
      // MII mode register
3842
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3843
                wbm_subseq_waits);
3844
 
3845
      i = 0;
3846
      cnt = 0;
3847
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3848
      begin
3849
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3850
        begin
3851
          // first there are two scans
3852
          // set address
3853
          reg_addr = 5'h0; // control register
3854
          phy_addr = 5'h1; // correct PHY address
3855
          cnt = 0;
3856
          // scan request
3857
          #Tp mii_scan_req(phy_addr, reg_addr);
3858
          // wait and check first 2 scans
3859 169 mohor
          begin
3860
            // wait for serial bus to become active
3861
            wait(Mdio_IO !== 1'bz);
3862
            // count transfer length
3863
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3864
            begin
3865
              @(posedge Mdc_O);
3866
              #Tp cnt = cnt + 1;
3867
            end
3868
            // check transfer length
3869
            if (i2) // without preamble
3870
            begin
3871
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3872
              begin
3873
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3874
                fail = fail + 1;
3875
              end
3876
            end
3877
            else // with preamble
3878
            begin
3879
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3880
              begin
3881
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3882
                fail = fail + 1;
3883
              end
3884
            end
3885
            cnt = 0;
3886
            // wait for serial bus to become active if there is more than one scan
3887
            wait(Mdio_IO !== 1'bz);
3888
            // count transfer length
3889
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3890
            begin
3891
              @(posedge Mdc_O);
3892
              #Tp cnt = cnt + 1;
3893
            end
3894
            // check transfer length
3895
            if (i2) // without preamble
3896
            begin
3897
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3898
              begin
3899
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3900
                fail = fail + 1;
3901
              end
3902
            end
3903
            else // with preamble
3904
            begin
3905
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3906
              begin
3907
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3908
                fail = fail + 1;
3909
              end
3910
            end
3911
          end
3912
 
3913 181 mohor
          // reset counter 
3914
          cnt = 0;
3915
          fork
3916
            begin
3917
              repeat(i) @(posedge Mdc_O);
3918
              // write command 0x0 into MII command register
3919
              // MII command written while scan in progress
3920
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3921
              @(posedge wb_clk);
3922
              #Tp check_mii_busy; // wait for scan to finish
3923
              @(posedge wb_clk);
3924
              disable check_3;
3925
            end
3926
            begin: check_3
3927
              // wait for serial bus to become active
3928
              wait(Mdio_IO !== 1'bz);
3929
              // count transfer length
3930
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3931
              begin
3932
                @(posedge Mdc_O);
3933
                #Tp cnt = cnt + 1;
3934
              end
3935
              // check transfer length
3936
              if (i2) // without preamble
3937
              begin
3938
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3939
                begin
3940
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3941
                  fail = fail + 1;
3942
                end
3943
              end
3944
              else // with preamble
3945
              begin
3946
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3947
                begin
3948
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3949
                  fail = fail + 1;
3950
                end
3951
              end
3952
              cnt = 0;
3953
              // wait for serial bus to become active if there is more than one scan
3954
              wait(Mdio_IO !== 1'bz);
3955
              // count transfer length
3956
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3957
              begin
3958
                @(posedge Mdc_O);
3959
                #Tp cnt = cnt + 1;
3960
              end
3961
              // check transfer length
3962
              if (i2) // without preamble
3963
              begin
3964
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3965
                begin
3966
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3967
                  fail = fail + 1;
3968
                end
3969
              end
3970
              else // with preamble
3971
              begin
3972
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3973
                begin
3974
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3975
                  fail = fail + 1;
3976
                end
3977
              end
3978
            end
3979
          join
3980
          // check the BUSY signal to see if the bus is still IDLE
3981
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3982
            check_mii_busy; // wait for bus to become idle
3983
 
3984
          // try normal write or read after scan was finished
3985
          phy_data = {8'h7D, (i[7:0] + 1)};
3986
          cnt = 0;
3987
          if (i3 == 0) // write after scan
3988 169 mohor
          begin
3989 181 mohor
            // write request
3990
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3991
            // wait for serial bus to become active
3992
            wait(Mdio_IO !== 1'bz);
3993
            // count transfer length
3994
            while(Mdio_IO !== 1'bz)
3995
            begin
3996
              @(posedge Mdc_O);
3997
              #Tp cnt = cnt + 1;
3998
            end
3999 169 mohor
            @(posedge Mdc_O);
4000 181 mohor
            // read request
4001
            #Tp mii_read_req(phy_addr, reg_addr);
4002
            check_mii_busy; // wait for read to finish
4003
            // read and check data
4004 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4005 181 mohor
            if (phy_data !== tmp_data)
4006
            begin
4007
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4008
              fail = fail + 1;
4009
            end
4010 169 mohor
          end
4011 181 mohor
          else // read after scan
4012 169 mohor
          begin
4013 181 mohor
            // read request
4014
            #Tp mii_read_req(phy_addr, reg_addr);
4015
            // wait for serial bus to become active
4016
            wait(Mdio_IO !== 1'bz);
4017
            // count transfer length
4018
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4019
            begin
4020
              @(posedge Mdc_O);
4021
              #Tp cnt = cnt + 1;
4022
            end
4023
            @(posedge Mdc_O);
4024
            check_mii_busy; // wait for read to finish
4025
            // read and check data
4026 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4027 181 mohor
            if (phy_data !== tmp_data)
4028
            begin
4029
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4030
              fail = fail + 1;
4031
            end
4032 169 mohor
          end
4033 181 mohor
          // check if transfer was a proper length
4034
          if (i2) // without preamble
4035 169 mohor
          begin
4036 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
4037
            begin
4038
              test_fail("New request did not proceed correctly, after scan request");
4039
              fail = fail + 1;
4040
            end
4041 169 mohor
          end
4042 181 mohor
          else // with preamble
4043 169 mohor
          begin
4044 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
4045
            begin
4046
              test_fail("New request did not proceed correctly, after scan request");
4047
              fail = fail + 1;
4048
            end
4049 169 mohor
          end
4050
        end
4051 181 mohor
        #Tp;
4052
        // set delay of writing the command
4053 169 mohor
        if (i2) // without preamble
4054
        begin
4055 181 mohor
          case(i)
4056
            0, 1:               i = i + 1;
4057
            18, 19, 20, 21, 22,
4058
            23, 24, 25, 26, 27,
4059
            28, 29, 30, 31, 32,
4060
            33, 34, 35:         i = i + 1;
4061
            36:                 i = 80;
4062
            default:            i = 18;
4063
          endcase
4064 169 mohor
        end
4065
        else // with preamble
4066
        begin
4067 181 mohor
          case(i)
4068
            0, 1:               i = i + 1;
4069
            50, 51, 52, 53, 54,
4070
            55, 56, 57, 58, 59,
4071
            60, 61, 62, 63, 64,
4072
            65, 66, 67:         i = i + 1;
4073
            68:                 i = 80;
4074
            default:            i = 50;
4075
          endcase
4076 169 mohor
        end
4077 181 mohor
        @(posedge wb_clk);
4078 116 mohor
      end
4079
    end
4080 181 mohor
    // set PHY to normal mode
4081
    #Tp eth_phy.preamble_suppresed(0);
4082
    // MII mode register
4083
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4084
    if(fail == 0)
4085
      test_ok;
4086
    else
4087
      fail = 0;
4088 169 mohor
  end
4089 116 mohor
 
4090 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4091
 
4092 169 mohor
end
4093
endtask // test_mii
4094
 
4095
 
4096
task test_mac_full_duplex_transmit;
4097
  input  [31:0]  start_task;
4098
  input  [31:0]  end_task;
4099
  integer        bit_start_1;
4100
  integer        bit_end_1;
4101
  integer        bit_start_2;
4102
  integer        bit_end_2;
4103
  integer        num_of_reg;
4104 209 tadejm
  integer        num_of_frames;
4105
  integer        num_of_bd;
4106 169 mohor
  integer        i_addr;
4107
  integer        i_data;
4108
  integer        i_length;
4109 209 tadejm
  integer        tmp_len;
4110
  integer        tmp_bd;
4111
  integer        tmp_bd_num;
4112 169 mohor
  integer        tmp_data;
4113 209 tadejm
  integer        tmp_ipgt;
4114 194 tadej
  integer        test_num;
4115 169 mohor
  reg    [31:0]  tx_bd_num;
4116
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4117
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4118
  integer        i;
4119
  integer        i1;
4120
  integer        i2;
4121
  integer        i3;
4122
  integer        fail;
4123
  integer        speed;
4124 279 mohor
  reg            no_underrun;
4125 209 tadejm
  reg            frame_started;
4126
  reg            frame_ended;
4127
  reg            wait_for_frame;
4128 169 mohor
  reg    [31:0]  addr;
4129
  reg    [31:0]  data;
4130
  reg    [31:0]  tmp;
4131
  reg    [ 7:0]  st_data;
4132
  reg    [15:0]  max_tmp;
4133
  reg    [15:0]  min_tmp;
4134 279 mohor
 
4135 169 mohor
begin
4136
// MAC FULL DUPLEX TRANSMIT TEST
4137
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4138
$display(" ");
4139
$display("MAC FULL DUPLEX TRANSMIT TEST");
4140
fail = 0;
4141
 
4142
// reset MAC registers
4143
hard_reset;
4144
// reset MAC and MII LOGIC with soft reset
4145 274 tadejm
//reset_mac;
4146
//reset_mii;
4147 169 mohor
// set wb slave response
4148
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4149
 
4150
  /*
4151
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4152
  -------------------------------------------------------------------------------------
4153
  set_tx_bd
4154
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4155
  set_tx_bd_wrap
4156
    (tx_bd_num_end[6:0]);
4157
  set_tx_bd_ready
4158
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4159
  check_tx_bd
4160
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4161
  clear_tx_bd
4162
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4163
 
4164
  TASKS for set and control RX buffer descriptors:
4165
  ------------------------------------------------
4166
  set_rx_bd
4167
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4168
  set_rx_bd_wrap
4169
    (rx_bd_num_end[6:0]);
4170
  set_rx_bd_empty
4171
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4172
  check_rx_bd
4173
    (rx_bd_num_end[6:0], rx_bd_status);
4174
  clear_rx_bd
4175
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4176
 
4177
  TASKS for set and check TX packets:
4178
  -----------------------------------
4179
  set_tx_packet
4180
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4181
  check_tx_packet
4182
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4183
 
4184
  TASKS for set and check RX packets:
4185
  -----------------------------------
4186
  set_rx_packet
4187
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4188
  check_rx_packet
4189
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4190
 
4191
  TASKS for append and check CRC to/of TX packet:
4192
  -----------------------------------------------
4193
  append_tx_crc
4194
    (txpnt_wb[31:0], len[15:0], negated_crc);
4195
  check_tx_crc
4196
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4197
 
4198
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4199
  --------------------------------------------------------------------------------
4200
  append_rx_crc
4201
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4202
  */
4203
 
4204 194 tadej
//////////////////////////////////////////////////////////////////////
4205
////                                                              ////
4206
////  test_mac_full_duplex_transmit:                              ////
4207
////                                                              ////
4208
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4209
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4210
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4211
////     one TX buffer decriptor ( 10Mbps ).                      ////
4212
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4213
////     one TX buffer decriptor ( 100Mbps ).                     ////
4214
////                                                              ////
4215
//////////////////////////////////////////////////////////////////////
4216
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4217 169 mohor
begin
4218
 
4219 194 tadej
  ////////////////////////////////////////////////////////////////////
4220
  ////                                                            ////
4221
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4222
  ////                                                            ////
4223
  ////////////////////////////////////////////////////////////////////
4224
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4225 169 mohor
  begin
4226 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4227
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4228
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4229
 
4230
    // unmask interrupts
4231 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4232 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4233
    // set all buffer descriptors to RX - must be set before TX enable
4234 274 tadejm
    wait (wbm_working == 0);
4235 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4236
    // enable TX, set full-duplex mode, padding and CRC appending
4237 274 tadejm
    wait (wbm_working == 0);
4238 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4239
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4240
 
4241
    // write to phy's control register for 10Mbps
4242
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4243
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4244
    speed = 10;
4245
 
4246
    i = 0;
4247
    while (i < 128)
4248 169 mohor
    begin
4249 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4250 169 mohor
      begin
4251 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4252
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4253 169 mohor
      end
4254 194 tadej
      set_tx_bd_wrap(i);
4255
      fork
4256
        begin
4257
          set_tx_bd_ready(0, i);
4258
          repeat(20) @(negedge mtx_clk);
4259
          #1 disable check_tx_en10;
4260
        end
4261
        begin: check_tx_en10
4262
          wait (MTxEn === 1'b1);
4263
          test_fail("Tramsmit should not start at all");
4264
          fail = fail + 1;
4265
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4266
        end
4267
      join
4268
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4269 169 mohor
      begin
4270 194 tadej
        check_tx_bd(0, tmp);
4271
        #1;
4272
        if (tmp[15] === 1'b0)
4273
        begin
4274
          test_fail("Tramsmit should not start at all");
4275
          fail = fail + 1;
4276
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4277
        end
4278
        if (tmp[8:0] !== 0)
4279
        begin
4280
          test_fail("Tramsmit should not be finished since it should not start at all");
4281
          fail = fail + 1;
4282
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4283
        end
4284
        @(posedge wb_clk);
4285 169 mohor
      end
4286 274 tadejm
      wait (wbm_working == 0);
4287 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4288
      if (tmp[6:0] !== 0)
4289 169 mohor
      begin
4290 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4291 169 mohor
        fail = fail + 1;
4292 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4293 169 mohor
      end
4294 194 tadej
      clear_tx_bd(0, i);
4295
      if ((i < 5) || (i > 124))
4296
        i = i + 1;
4297
      else
4298
        i = i + 120;
4299 116 mohor
    end
4300 194 tadej
    // disable TX
4301 274 tadejm
    wait (wbm_working == 0);
4302 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4303
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4304
    if(fail == 0)
4305
      test_ok;
4306 116 mohor
    else
4307 194 tadej
      fail = 0;
4308 169 mohor
  end
4309 116 mohor
 
4310
 
4311 194 tadej
  ////////////////////////////////////////////////////////////////////
4312
  ////                                                            ////
4313
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4314
  ////                                                            ////
4315
  ////////////////////////////////////////////////////////////////////
4316
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4317 169 mohor
  begin
4318 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4319
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4320
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4321
 
4322
    // unmask interrupts
4323 274 tadejm
    wait (wbm_working == 0);
4324 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4325 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4326
    // set all buffer descriptors to RX - must be set before TX enable
4327 274 tadejm
    wait (wbm_working == 0);
4328 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4329
    // enable TX, set full-duplex mode, padding and CRC appending
4330 274 tadejm
    wait (wbm_working == 0);
4331 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4332
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4333
 
4334
    // write to phy's control register for 100Mbps
4335
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4336
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4337
    speed = 100;
4338
 
4339
    i = 0;
4340
    while (i < 128)
4341 169 mohor
    begin
4342 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4343 169 mohor
      begin
4344 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4345
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4346 169 mohor
      end
4347 194 tadej
      set_tx_bd_wrap(i);
4348
      fork
4349
        begin
4350
          set_tx_bd_ready(0, i);
4351
          repeat(20) @(negedge mtx_clk);
4352
          #1 disable check_tx_en100;
4353
        end
4354
        begin: check_tx_en100
4355
          wait (MTxEn === 1'b1);
4356
          test_fail("Tramsmit should not start at all");
4357
          fail = fail + 1;
4358
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4359
        end
4360
      join
4361
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4362 169 mohor
      begin
4363 194 tadej
        check_tx_bd(0, tmp);
4364
        #1;
4365
        if (tmp[15] === 1'b0)
4366
        begin
4367
          test_fail("Tramsmit should not start at all");
4368
          fail = fail + 1;
4369
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4370
        end
4371
        if (tmp[8:0] !== 0)
4372
        begin
4373
          test_fail("Tramsmit should not be finished since it should not start at all");
4374
          fail = fail + 1;
4375
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4376
        end
4377
        @(posedge wb_clk);
4378 169 mohor
      end
4379 274 tadejm
      wait (wbm_working == 0);
4380 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4381
      if (tmp[6:0] !== 0)
4382 169 mohor
      begin
4383 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4384 169 mohor
        fail = fail + 1;
4385 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4386 169 mohor
      end
4387 194 tadej
      clear_tx_bd(0, i);
4388
      if ((i < 5) || (i > 124))
4389
        i = i + 1;
4390
      else
4391
        i = i + 120;
4392 169 mohor
    end
4393 194 tadej
    // disable TX
4394 274 tadejm
    wait (wbm_working == 0);
4395 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4396
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4397
    if(fail == 0)
4398
      test_ok;
4399 169 mohor
    else
4400 194 tadej
      fail = 0;
4401 169 mohor
  end
4402
 
4403
 
4404 194 tadej
  ////////////////////////////////////////////////////////////////////
4405
  ////                                                            ////
4406
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4407
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4408
  ////                                                            ////
4409
  ////////////////////////////////////////////////////////////////////
4410 209 tadejm
  if (test_num == 2) // without and with padding
4411 169 mohor
  begin
4412 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4413
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4414
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4415
 
4416
    max_tmp = 0;
4417
    min_tmp = 0;
4418
    // set one TX buffer descriptor - must be set before TX enable
4419 274 tadejm
    wait (wbm_working == 0);
4420 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4421 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4422 274 tadejm
    wait (wbm_working == 0);
4423 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4424 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4425
    // prepare two packets of MAXFL length
4426 274 tadejm
    wait (wbm_working == 0);
4427 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4428
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4429
    min_tmp = tmp[31:16];
4430 209 tadejm
    st_data = 8'h01;
4431
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4432 194 tadej
    st_data = 8'h10;
4433 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4434 194 tadej
    // check WB INT signal
4435
    if (wb_int !== 1'b0)
4436 169 mohor
    begin
4437 194 tadej
      test_fail("WB INT signal should not be set");
4438
      fail = fail + 1;
4439 169 mohor
    end
4440 194 tadej
 
4441
    // write to phy's control register for 10Mbps
4442
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4443
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4444
    speed = 10;
4445
 
4446
    i_length = (min_tmp - 4);
4447
    while (i_length <= (max_tmp - 4))
4448 169 mohor
    begin
4449 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4450
      case (i_length[1:0])
4451
      2'h0: // Interrupt is generated
4452 169 mohor
      begin
4453 194 tadej
        // enable interrupt generation
4454 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4455 194 tadej
        // unmask interrupts
4456 274 tadejm
        wait (wbm_working == 0);
4457 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4458 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4459
        // not detect carrier sense in FD and no collision
4460
        eth_phy.carrier_sense_tx_fd_detect(0);
4461
        eth_phy.collision(0);
4462 169 mohor
      end
4463 194 tadej
      2'h1: // Interrupt is not generated
4464 169 mohor
      begin
4465 194 tadej
        // enable interrupt generation
4466 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4467 194 tadej
        // mask interrupts
4468 274 tadejm
        wait (wbm_working == 0);
4469 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4470
        // detect carrier sense in FD and no collision
4471
        eth_phy.carrier_sense_tx_fd_detect(1);
4472
        eth_phy.collision(0);
4473 169 mohor
      end
4474 194 tadej
      2'h2: // Interrupt is not generated
4475
      begin
4476
        // disable interrupt generation
4477 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4478 194 tadej
        // unmask interrupts
4479 274 tadejm
        wait (wbm_working == 0);
4480 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4481 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4482
        // not detect carrier sense in FD and set collision
4483
        eth_phy.carrier_sense_tx_fd_detect(0);
4484
        eth_phy.collision(1);
4485
      end
4486
      default: // 2'h3: // Interrupt is not generated
4487
      begin
4488
        // disable interrupt generation
4489 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4490 194 tadej
        // mask interrupts
4491 274 tadejm
        wait (wbm_working == 0);
4492 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4493
        // detect carrier sense in FD and set collision
4494
        eth_phy.carrier_sense_tx_fd_detect(1);
4495
        eth_phy.collision(1);
4496
      end
4497
      endcase
4498
      eth_phy.set_tx_mem_addr(max_tmp);
4499
      // set wrap bit
4500
      set_tx_bd_wrap(0);
4501
      set_tx_bd_ready(0, 0);
4502 169 mohor
      #1 check_tx_bd(0, data);
4503 274 tadejm
 
4504
 
4505 194 tadej
      if (i_length < min_tmp) // just first four
4506 169 mohor
      begin
4507 194 tadej
        while (data[15] === 1)
4508
        begin
4509
          #1 check_tx_bd(0, data);
4510
          @(posedge wb_clk);
4511
        end
4512 209 tadejm
        repeat (1) @(posedge wb_clk);
4513 169 mohor
      end
4514 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4515 192 tadej
      begin
4516 194 tadej
        tmp = 0;
4517
        wait (MTxEn === 1'b1); // start transmit
4518
        while (tmp < (i_length - 20))
4519
        begin
4520
          #1 tmp = tmp + 1;
4521
          @(posedge wb_clk);
4522
        end
4523
        #1 check_tx_bd(0, data);
4524
        while (data[15] === 1)
4525
        begin
4526
          #1 check_tx_bd(0, data);
4527
          @(posedge wb_clk);
4528
        end
4529 209 tadejm
        repeat (1) @(posedge wb_clk);
4530 192 tadej
      end
4531
      else
4532
      begin
4533 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4534
        #1 check_tx_bd(0, data);
4535
        if (data[15] !== 1)
4536
        begin
4537
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4538
          fail = fail + 1;
4539
        end
4540
        wait (MTxEn === 1'b0); // end transmit
4541
        while (data[15] === 1)
4542
        begin
4543
          #1 check_tx_bd(0, data);
4544
          @(posedge wb_clk);
4545
        end
4546
        repeat (1) @(posedge wb_clk);
4547 192 tadej
      end
4548 274 tadejm
 
4549 279 mohor
      repeat(5) @(posedge mtx_clk);  // Wait some time so PHY stores the CRC
4550 274 tadejm
 
4551 194 tadej
      // check length of a PACKET
4552
      if (eth_phy.tx_len != (i_length + 4))
4553 192 tadej
      begin
4554 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4555 192 tadej
        fail = fail + 1;
4556
      end
4557 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4558
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4559 192 tadej
      begin
4560 194 tadej
        // check transmitted TX packet data
4561
        if (i_length[0] == 0)
4562
        begin
4563 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4564 194 tadej
        end
4565
        else
4566
        begin
4567 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4568 194 tadej
        end
4569
        if (tmp > 0)
4570
        begin
4571
          test_fail("Wrong data of the transmitted packet");
4572
          fail = fail + 1;
4573
        end
4574
        // check transmited TX packet CRC
4575
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4576 274 tadejm
 
4577 194 tadej
        if (tmp > 0)
4578
        begin
4579
          test_fail("Wrong CRC of the transmitted packet");
4580
          fail = fail + 1;
4581
        end
4582 192 tadej
      end
4583 194 tadej
      // check WB INT signal
4584
      if (i_length[1:0] == 2'h0)
4585 192 tadej
      begin
4586 194 tadej
        if (wb_int !== 1'b1)
4587
        begin
4588
          `TIME; $display("*E WB INT signal should be set");
4589
          test_fail("WB INT signal should be set");
4590
          fail = fail + 1;
4591
        end
4592 192 tadej
      end
4593 194 tadej
      else
4594 192 tadej
      begin
4595 194 tadej
        if (wb_int !== 1'b0)
4596
        begin
4597
          `TIME; $display("*E WB INT signal should not be set");
4598
          test_fail("WB INT signal should not be set");
4599
          fail = fail + 1;
4600
        end
4601 192 tadej
      end
4602 194 tadej
      // check TX buffer descriptor of a packet
4603
      check_tx_bd(0, data);
4604
      if (i_length[1] == 1'b0) // interrupt enabled
4605 192 tadej
      begin
4606 194 tadej
        if (data[15:0] !== 16'h7800)
4607
        begin
4608
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4609
          test_fail("TX buffer descriptor status is not correct");
4610
          fail = fail + 1;
4611
        end
4612 192 tadej
      end
4613 194 tadej
      else // interrupt not enabled
4614 192 tadej
      begin
4615 194 tadej
        if (data[15:0] !== 16'h3800)
4616
        begin
4617
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4618
          test_fail("TX buffer descriptor status is not correct");
4619
          fail = fail + 1;
4620
        end
4621 192 tadej
      end
4622 194 tadej
      // clear TX buffer descriptor
4623
      clear_tx_bd(0, 0);
4624
      // check interrupts
4625 274 tadejm
      wait (wbm_working == 0);
4626 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4627
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4628 192 tadej
      begin
4629 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4630
        begin
4631
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4632
          test_fail("Interrupt Transmit Buffer was not set");
4633
          fail = fail + 1;
4634
        end
4635
        if ((data & (~`ETH_INT_TXB)) !== 0)
4636
        begin
4637
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4638
          test_fail("Other interrupts (except Transmit Buffer) were set");
4639
          fail = fail + 1;
4640
        end
4641 192 tadej
      end
4642 194 tadej
      else
4643 192 tadej
      begin
4644 194 tadej
        if (data !== 0)
4645
        begin
4646
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4647
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4648
          fail = fail + 1;
4649
        end
4650 192 tadej
      end
4651 194 tadej
      // clear interrupts
4652 274 tadejm
      wait (wbm_working == 0);
4653 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4654
      // check WB INT signal
4655
      if (wb_int !== 1'b0)
4656 192 tadej
      begin
4657 194 tadej
        test_fail("WB INT signal should not be set");
4658 192 tadej
        fail = fail + 1;
4659
      end
4660 194 tadej
      // INTERMEDIATE DISPLAYS
4661
      if ((i_length + 4) == (min_tmp + 64))
4662 209 tadejm
      begin
4663 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4664 209 tadejm
        $display("    pads appending to packets is NOT selected");
4665
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4666 194 tadej
                 min_tmp, (min_tmp + 64));
4667 209 tadejm
        // set padding, remain the rest
4668 274 tadejm
        wait (wbm_working == 0);
4669 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4670
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4671
      end
4672 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4673 209 tadejm
      begin
4674 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4675 209 tadejm
        $display("    pads appending to packets is selected");
4676
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4677 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4678 209 tadejm
        // reset padding, remain the rest
4679 274 tadejm
        wait (wbm_working == 0);
4680 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4681
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4682
      end
4683 194 tadej
      else if ((i_length + 4) == max_tmp)
4684 209 tadejm
      begin
4685
        $display("    pads appending to packets is NOT selected");
4686
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4687 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4688 209 tadejm
      end
4689 194 tadej
      // set length (loop variable)
4690
      if ((i_length + 4) < (min_tmp + 64))
4691
        i_length = i_length + 1;
4692
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4693
      begin
4694
        i_length = i_length + 128;
4695
        tmp_data = i_length + 4; // last tmp_data is ending length
4696
      end
4697
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4698
        i_length = max_tmp - (4 + 16);
4699
      else if ((i_length + 4) >= (max_tmp - 16))
4700
        i_length = i_length + 1;
4701
      else
4702
      begin
4703
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4704
        #10 $stop;
4705
      end
4706 192 tadej
    end
4707 194 tadej
    // disable TX
4708 274 tadejm
    wait (wbm_working == 0);
4709 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4710
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4711
    if(fail == 0)
4712
      test_ok;
4713
    else
4714
      fail = 0;
4715
  end
4716
 
4717
 
4718
  ////////////////////////////////////////////////////////////////////
4719
  ////                                                            ////
4720
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4721
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4722
  ////                                                            ////
4723
  ////////////////////////////////////////////////////////////////////
4724 209 tadejm
  if (test_num == 3) // with and without padding
4725 194 tadej
  begin
4726
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4727
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4728
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4729
 
4730
    max_tmp = 0;
4731
    min_tmp = 0;
4732
    // set one TX buffer descriptor - must be set before TX enable
4733 274 tadejm
    wait (wbm_working == 0);
4734 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4735 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4736 274 tadejm
    wait (wbm_working == 0);
4737 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4738 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4739
    // prepare two packets of MAXFL length
4740 274 tadejm
    wait (wbm_working == 0);
4741 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4742
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4743
    min_tmp = tmp[31:16];
4744
    st_data = 8'h5A;
4745 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4746 194 tadej
    st_data = 8'h10;
4747 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4748 169 mohor
    // check WB INT signal
4749 192 tadej
    if (wb_int !== 1'b0)
4750 169 mohor
    begin
4751
      test_fail("WB INT signal should not be set");
4752
      fail = fail + 1;
4753
    end
4754 194 tadej
 
4755
    // write to phy's control register for 100Mbps
4756
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4757
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4758
    speed = 100;
4759 192 tadej
 
4760 194 tadej
    i_length = (min_tmp - 4);
4761
    while (i_length <= (max_tmp - 4))
4762 192 tadej
    begin
4763 194 tadej
      // choose generating carrier sense and collision
4764
      case (i_length[1:0])
4765
      2'h0: // Interrupt is generated
4766 192 tadej
      begin
4767 194 tadej
        // enable interrupt generation
4768 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4769 194 tadej
        // unmask interrupts
4770 274 tadejm
        wait (wbm_working == 0);
4771 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4772 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4773
        // not detect carrier sense in FD and no collision
4774
        eth_phy.carrier_sense_tx_fd_detect(0);
4775
        eth_phy.collision(0);
4776 192 tadej
      end
4777 194 tadej
      2'h1: // Interrupt is not generated
4778 192 tadej
      begin
4779 194 tadej
        // enable interrupt generation
4780 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4781 194 tadej
        // mask interrupts
4782 274 tadejm
        wait (wbm_working == 0);
4783 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4784
        // detect carrier sense in FD and no collision
4785
        eth_phy.carrier_sense_tx_fd_detect(1);
4786
        eth_phy.collision(0);
4787 192 tadej
      end
4788 194 tadej
      2'h2: // Interrupt is not generated
4789
      begin
4790
        // disable interrupt generation
4791 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4792 194 tadej
        // unmask interrupts
4793 274 tadejm
        wait (wbm_working == 0);
4794 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4795 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4796
        // not detect carrier sense in FD and set collision
4797
        eth_phy.carrier_sense_tx_fd_detect(0);
4798
        eth_phy.collision(1);
4799
      end
4800
      default: // 2'h3: // Interrupt is not generated
4801
      begin
4802
        // disable interrupt generation
4803 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4804 194 tadej
        // mask interrupts
4805 274 tadejm
        wait (wbm_working == 0);
4806 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4807
        // detect carrier sense in FD and set collision
4808
        eth_phy.carrier_sense_tx_fd_detect(1);
4809
        eth_phy.collision(1);
4810
      end
4811
      endcase
4812
      eth_phy.set_tx_mem_addr(max_tmp);
4813
      // set wrap bit
4814
      set_tx_bd_wrap(0);
4815
      set_tx_bd_ready(0, 0);
4816 192 tadej
      #1 check_tx_bd(0, data);
4817 194 tadej
      if (i_length < min_tmp) // just first four
4818 192 tadej
      begin
4819 194 tadej
        while (data[15] === 1)
4820
        begin
4821
          #1 check_tx_bd(0, data);
4822
          @(posedge wb_clk);
4823
        end
4824 209 tadejm
        repeat (1) @(posedge wb_clk);
4825 194 tadej
      end
4826
      else if (i_length > (max_tmp - 8)) // just last four
4827
      begin
4828
        tmp = 0;
4829
        wait (MTxEn === 1'b1); // start transmit
4830
        while (tmp < (i_length - 20))
4831
        begin
4832
          #1 tmp = tmp + 1;
4833
          @(posedge wb_clk);
4834
        end
4835 192 tadej
        #1 check_tx_bd(0, data);
4836 194 tadej
        while (data[15] === 1)
4837
        begin
4838
          #1 check_tx_bd(0, data);
4839
          @(posedge wb_clk);
4840
        end
4841 209 tadejm
        repeat (1) @(posedge wb_clk);
4842 192 tadej
      end
4843 194 tadej
      else
4844
      begin
4845
        wait (MTxEn === 1'b1); // start transmit
4846
        #1 check_tx_bd(0, data);
4847
        if (data[15] !== 1)
4848
        begin
4849
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4850
          fail = fail + 1;
4851
        end
4852
        wait (MTxEn === 1'b0); // end transmit
4853
        while (data[15] === 1)
4854
        begin
4855
          #1 check_tx_bd(0, data);
4856
          @(posedge wb_clk);
4857
        end
4858
        repeat (1) @(posedge wb_clk);
4859
      end
4860
      // check length of a PACKET
4861
      if (eth_phy.tx_len != (i_length + 4))
4862
      begin
4863
        test_fail("Wrong length of the packet out from MAC");
4864
        fail = fail + 1;
4865
      end
4866 192 tadej
      // check transmitted TX packet data
4867
      if (i_length[0] == 0)
4868
      begin
4869 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4870 192 tadej
      end
4871
      else
4872
      begin
4873 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4874 192 tadej
      end
4875
      if (tmp > 0)
4876
      begin
4877
        test_fail("Wrong data of the transmitted packet");
4878
        fail = fail + 1;
4879
      end
4880
      // check transmited TX packet CRC
4881
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4882
      if (tmp > 0)
4883
      begin
4884
        test_fail("Wrong CRC of the transmitted packet");
4885
        fail = fail + 1;
4886
      end
4887 194 tadej
      // check WB INT signal
4888
      if (i_length[1:0] == 2'h0)
4889 192 tadej
      begin
4890 194 tadej
        if (wb_int !== 1'b1)
4891
        begin
4892
          `TIME; $display("*E WB INT signal should be set");
4893
          test_fail("WB INT signal should be set");
4894
          fail = fail + 1;
4895
        end
4896 192 tadej
      end
4897 194 tadej
      else
4898 192 tadej
      begin
4899 194 tadej
        if (wb_int !== 1'b0)
4900
        begin
4901
          `TIME; $display("*E WB INT signal should not be set");
4902
          test_fail("WB INT signal should not be set");
4903
          fail = fail + 1;
4904
        end
4905 192 tadej
      end
4906 194 tadej
      // check TX buffer descriptor of a packet
4907
      check_tx_bd(0, data);
4908
      if (i_length[1] == 1'b0) // interrupt enabled
4909 192 tadej
      begin
4910 194 tadej
        if (data[15:0] !== 16'h7800)
4911
        begin
4912
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4913
          test_fail("TX buffer descriptor status is not correct");
4914
          fail = fail + 1;
4915
        end
4916 192 tadej
      end
4917 194 tadej
      else // interrupt not enabled
4918 192 tadej
      begin
4919 194 tadej
        if (data[15:0] !== 16'h3800)
4920
        begin
4921
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4922
          test_fail("TX buffer descriptor status is not correct");
4923
          fail = fail + 1;
4924
        end
4925 192 tadej
      end
4926 194 tadej
      // clear TX buffer descriptor
4927
      clear_tx_bd(0, 0);
4928
      // check interrupts
4929 274 tadejm
      wait (wbm_working == 0);
4930 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4931
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4932 192 tadej
      begin
4933 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4934
        begin
4935
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4936
          test_fail("Interrupt Transmit Buffer was not set");
4937
          fail = fail + 1;
4938
        end
4939
        if ((data & (~`ETH_INT_TXB)) !== 0)
4940
        begin
4941
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4942
          test_fail("Other interrupts (except Transmit Buffer) were set");
4943
          fail = fail + 1;
4944
        end
4945 192 tadej
      end
4946 194 tadej
      else
4947 192 tadej
      begin
4948 194 tadej
        if (data !== 0)
4949
        begin
4950
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
4951
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4952
          fail = fail + 1;
4953
        end
4954 192 tadej
      end
4955 194 tadej
      // clear interrupts
4956 274 tadejm
      wait (wbm_working == 0);
4957 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4958
      // check WB INT signal
4959
      if (wb_int !== 1'b0)
4960 192 tadej
      begin
4961 194 tadej
        test_fail("WB INT signal should not be set");
4962 192 tadej
        fail = fail + 1;
4963
      end
4964 194 tadej
      // INTERMEDIATE DISPLAYS
4965
      if ((i_length + 4) == (min_tmp + 64))
4966 209 tadejm
      begin
4967 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4968 209 tadejm
        $display("    pads appending to packets is NOT selected");
4969
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4970 194 tadej
                 min_tmp, (min_tmp + 64));
4971 209 tadejm
        // set padding, remain the rest
4972 274 tadejm
        wait (wbm_working == 0);
4973 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4974
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4975
      end
4976 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4977 209 tadejm
      begin
4978 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4979 209 tadejm
        $display("    pads appending to packets is selected");
4980
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4981 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4982 209 tadejm
        // reset padding, remain the rest
4983 274 tadejm
        wait (wbm_working == 0);
4984 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4985
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4986
      end
4987 194 tadej
      else if ((i_length + 4) == max_tmp)
4988 209 tadejm
      begin
4989
        $display("    pads appending to packets is NOT selected");
4990
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4991 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4992 209 tadejm
      end
4993 194 tadej
      // set length (loop variable)
4994
      if ((i_length + 4) < (min_tmp + 64))
4995
        i_length = i_length + 1;
4996
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4997
      begin
4998
        i_length = i_length + 128;
4999
        tmp_data = i_length + 4; // last tmp_data is ending length
5000
      end
5001
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5002
        i_length = max_tmp - (4 + 16);
5003
      else if ((i_length + 4) >= (max_tmp - 16))
5004
        i_length = i_length + 1;
5005 192 tadej
      else
5006 194 tadej
      begin
5007
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5008
        #10 $stop;
5009
      end
5010 179 mohor
    end
5011 194 tadej
    // disable TX
5012 274 tadejm
    wait (wbm_working == 0);
5013 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5014
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5015
    if(fail == 0)
5016
      test_ok;
5017
    else
5018
      fail = 0;
5019 169 mohor
  end
5020
 
5021
 
5022 209 tadejm
  ////////////////////////////////////////////////////////////////////
5023
  ////                                                            ////
5024
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5025
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
5026
  ////                                                            ////
5027
  ////////////////////////////////////////////////////////////////////
5028
  if (test_num == 4) // without and with padding
5029
  begin
5030
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
5031
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
5032
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
5033
 
5034
    // reset MAC registers
5035
    hard_reset;
5036
    // reset MAC and MII LOGIC with soft reset
5037 274 tadejm
//    reset_mac;
5038
//    reset_mii;
5039 209 tadejm
    // set wb slave response
5040
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5041 192 tadej
 
5042 209 tadejm
    max_tmp = 0;
5043
    min_tmp = 0;
5044
    num_of_frames = 0;
5045
    num_of_bd = 0;
5046
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5047 274 tadejm
    wait (wbm_working == 0);
5048 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5049
    // enable TX, set full-duplex mode, NO padding and CRC appending
5050 274 tadejm
    wait (wbm_working == 0);
5051 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5052
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5053
    // prepare two packets of MAXFL length
5054 274 tadejm
    wait (wbm_working == 0);
5055 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5056
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5057
    min_tmp = tmp[31:16];
5058
    st_data = 8'hA3;
5059
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5060
    st_data = 8'h81;
5061
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5062
    // check WB INT signal
5063
    if (wb_int !== 1'b0)
5064
    begin
5065
      test_fail("WB INT signal should not be set");
5066
      fail = fail + 1;
5067
    end
5068
 
5069
    // write to phy's control register for 10Mbps
5070
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5071
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5072
    speed = 10;
5073
 
5074
    i_length = (min_tmp - 4);
5075
    while (i_length <= (max_tmp - 4))
5076
    begin
5077
      // choose generating carrier sense and collision
5078
      case (i_length[1:0])
5079
      2'h0: // Interrupt is generated
5080
      begin
5081
        // Reset_tx_bd nable interrupt generation
5082
        // unmask interrupts
5083 274 tadejm
        wait (wbm_working == 0);
5084 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5085
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5086
        // not detect carrier sense in FD and no collision
5087
        eth_phy.carrier_sense_tx_fd_detect(0);
5088
        eth_phy.collision(0);
5089
      end
5090
      2'h1: // Interrupt is not generated
5091
      begin
5092
        // set_tx_bd enable interrupt generation
5093
        // mask interrupts
5094 274 tadejm
        wait (wbm_working == 0);
5095 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5096
        // detect carrier sense in FD and no collision
5097
        eth_phy.carrier_sense_tx_fd_detect(1);
5098
        eth_phy.collision(0);
5099
      end
5100
      2'h2: // Interrupt is not generated
5101
      begin
5102
        // set_tx_bd disable the interrupt generation
5103
        // unmask interrupts
5104 274 tadejm
        wait (wbm_working == 0);
5105 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5106
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5107
        // not detect carrier sense in FD and set collision
5108
        eth_phy.carrier_sense_tx_fd_detect(0);
5109
        eth_phy.collision(1);
5110
      end
5111
      default: // 2'h3: // Interrupt is not generated
5112
      begin
5113
        // set_tx_bd disable the interrupt generation
5114
        // mask interrupts
5115 274 tadejm
        wait (wbm_working == 0);
5116 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5117
        // detect carrier sense in FD and set collision
5118
        eth_phy.carrier_sense_tx_fd_detect(1);
5119
        eth_phy.collision(1);
5120
      end
5121
      endcase
5122
      // first destination address on ethernet PHY
5123
      if (i_length[0] == 0)
5124
        eth_phy.set_tx_mem_addr(0);
5125
      else
5126
        eth_phy.set_tx_mem_addr(max_tmp);
5127
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5128
      // number of all frames is 154 (146 without first 8)
5129
      if (num_of_frames < 8)
5130
      begin
5131
        case (i_length[1:0])
5132
        2'h0: // Interrupt is generated
5133
        begin
5134
          // enable interrupt generation
5135
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5136
          // interrupts are unmasked
5137
        end
5138
        2'h1: // Interrupt is not generated
5139
        begin
5140
          // enable interrupt generation
5141
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5142
          // interrupts are masked
5143
        end
5144
        2'h2: // Interrupt is not generated
5145
        begin
5146
          // disable interrupt generation
5147
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5148
          // interrupts are unmasked
5149
        end
5150
        default: // 2'h3: // Interrupt is not generated
5151
        begin
5152
          // disable interrupt generation
5153
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5154
          // interrupts are masked
5155
        end
5156
        endcase
5157
        // set wrap bit
5158
        set_tx_bd_wrap(0);
5159
      end
5160
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5161
      else if ((num_of_frames - 8) == 0)
5162
      begin
5163
        tmp_len = i_length; // length of frame
5164
        tmp_bd_num = 0; // TX BD number
5165
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5166
        begin
5167
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5168
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5169
          if (tmp_len[0] == 0)
5170
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5171
          else
5172
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
5173
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5174
          if ((tmp_len + 4) < (min_tmp + 128))
5175
            tmp_len = tmp_len + 1;
5176
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5177
            tmp_len = 256;
5178
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5179
            tmp_len = tmp_len + 128;
5180
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5181
            tmp_len = max_tmp - (4 + 16);
5182
          else if ((tmp_len + 4) >= (max_tmp - 16))
5183
            tmp_len = tmp_len + 1;
5184
          // set TX BD number
5185
          tmp_bd_num = tmp_bd_num + 1;
5186
        end
5187
        // set wrap bit
5188
        set_tx_bd_wrap(127);
5189
      end
5190
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5191
      else if ((num_of_frames - 8) == 20) // 128
5192
      begin
5193
        tmp_len = tmp_len; // length of frame remaines from previous settings
5194
        tmp_bd_num = 0; // TX BD number
5195
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5196
        begin
5197
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5198
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5199
          if (tmp_len[0] == 0)
5200
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5201
          else
5202
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
5203
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5204
          if ((tmp_len + 4) < (min_tmp + 128))
5205
            tmp_len = tmp_len + 1;
5206
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5207
            tmp_len = 256;
5208
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5209
            tmp_len = tmp_len + 128;
5210
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5211
            tmp_len = max_tmp - (4 + 16);
5212
          else if ((tmp_len + 4) >= (max_tmp - 16))
5213
            tmp_len = tmp_len + 1;
5214
          // set TX BD number
5215
          tmp_bd_num = tmp_bd_num + 1;
5216
        end
5217
      end
5218
      // set ready bit
5219
      if (num_of_frames < 8)
5220
        set_tx_bd_ready(0, 0);
5221
      else if ((num_of_frames - 8) < 128)
5222
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5223
      else if ((num_of_frames - 136) < 19)
5224
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5225
      // CHECK END OF TRANSMITION
5226
      #1 check_tx_bd(num_of_bd, data);
5227
      if (i_length < min_tmp) // just first four
5228
      begin
5229
        while (data[15] === 1)
5230
        begin
5231
          #1 check_tx_bd(num_of_bd, data);
5232
          @(posedge wb_clk);
5233
        end
5234
        repeat (1) @(posedge wb_clk);
5235
      end
5236
      else if (i_length > (max_tmp - 8)) // just last four
5237
      begin
5238
        tmp = 0;
5239
        wait (MTxEn === 1'b1); // start transmit
5240
        while (tmp < (i_length - 20))
5241
        begin
5242
          #1 tmp = tmp + 1;
5243
          @(posedge wb_clk);
5244
        end
5245
        #1 check_tx_bd(num_of_bd, data);
5246
        while (data[15] === 1)
5247
        begin
5248
          #1 check_tx_bd(num_of_bd, data);
5249
          @(posedge wb_clk);
5250
        end
5251
        repeat (1) @(posedge wb_clk);
5252
      end
5253
      else
5254
      begin
5255
        wait (MTxEn === 1'b1); // start transmit
5256
        #1 check_tx_bd(num_of_bd, data);
5257
        if (data[15] !== 1)
5258
        begin
5259
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5260
          fail = fail + 1;
5261
        end
5262
        wait (MTxEn === 1'b0); // end transmit
5263
        while (data[15] === 1)
5264
        begin
5265
          #1 check_tx_bd(num_of_bd, data);
5266
          @(posedge wb_clk);
5267
        end
5268
        repeat (1) @(posedge wb_clk);
5269
      end
5270
      // check length of a PACKET
5271
      if (eth_phy.tx_len != (i_length + 4))
5272
      begin
5273
        test_fail("Wrong length of the packet out from MAC");
5274
        fail = fail + 1;
5275
      end
5276
        // check transmitted TX packet data
5277
        if (i_length[0] == 0)
5278
        begin
5279
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5280
        end
5281
        else
5282
        begin
5283
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5284
        end
5285
        if (tmp > 0)
5286
        begin
5287
          test_fail("Wrong data of the transmitted packet");
5288
          fail = fail + 1;
5289
        end
5290
        // check transmited TX packet CRC
5291
        if (i_length[0] == 0)
5292
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5293
        else
5294
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5295
        if (tmp > 0)
5296
        begin
5297
          test_fail("Wrong CRC of the transmitted packet");
5298
          fail = fail + 1;
5299
        end
5300
      // check WB INT signal
5301
      if (i_length[1:0] == 2'h0)
5302
      begin
5303
        if (wb_int !== 1'b1)
5304
        begin
5305
          `TIME; $display("*E WB INT signal should be set");
5306
          test_fail("WB INT signal should be set");
5307
          fail = fail + 1;
5308
        end
5309
      end
5310
      else
5311
      begin
5312
        if (wb_int !== 1'b0)
5313
        begin
5314
          `TIME; $display("*E WB INT signal should not be set");
5315
          test_fail("WB INT signal should not be set");
5316
          fail = fail + 1;
5317
        end
5318
      end
5319
      // check TX buffer descriptor of a packet
5320
      check_tx_bd(num_of_bd, data);
5321
      if (i_length[1] == 1'b0) // interrupt enabled
5322
      begin
5323
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5324
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5325
        begin
5326
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5327
          test_fail("TX buffer descriptor status is not correct");
5328
          fail = fail + 1;
5329
        end
5330
      end
5331
      else // interrupt not enabled
5332
      begin
5333
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5334
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5335
        begin
5336
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5337
          test_fail("TX buffer descriptor status is not correct");
5338
          fail = fail + 1;
5339
        end
5340
      end
5341
      // clear first half of 8 frames from TX buffer descriptor 0
5342
      if (num_of_frames < 4)
5343
        clear_tx_bd(num_of_bd, num_of_bd);
5344
      // clear BD with wrap bit
5345
      if (num_of_frames == 140)
5346
        clear_tx_bd(127, 127);
5347
      // check interrupts
5348 274 tadejm
      wait (wbm_working == 0);
5349 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5350
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5351
      begin
5352
        if ((data & `ETH_INT_TXB) !== 1'b1)
5353
        begin
5354
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5355
          test_fail("Interrupt Transmit Buffer was not set");
5356
          fail = fail + 1;
5357
        end
5358
        if ((data & (~`ETH_INT_TXB)) !== 0)
5359
        begin
5360
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5361
          test_fail("Other interrupts (except Transmit Buffer) were set");
5362
          fail = fail + 1;
5363
        end
5364
      end
5365
      else
5366
      begin
5367
        if (data !== 0)
5368
        begin
5369
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5370
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5371
          fail = fail + 1;
5372
        end
5373
      end
5374
      // clear interrupts
5375 274 tadejm
      wait (wbm_working == 0);
5376 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5377
      // check WB INT signal
5378
      if (wb_int !== 1'b0)
5379
      begin
5380
        test_fail("WB INT signal should not be set");
5381
        fail = fail + 1;
5382
      end
5383
      // INTERMEDIATE DISPLAYS
5384
      if ((i_length + 4) == (min_tmp + 7))
5385
      begin
5386
        // starting length is min_tmp, ending length is (min_tmp + 128)
5387
        $display("    pads appending to packets is NOT selected");
5388
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5389
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5390
                 min_tmp, (min_tmp + 7));
5391
        $display("    ->all packets were send from TX BD 0");
5392
        // set padding, remain the rest
5393 274 tadejm
        wait (wbm_working == 0);
5394 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5395
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5396
      end
5397
      else if ((i_length + 4) == (min_tmp + 128))
5398
      begin
5399
        // starting length is min_tmp, ending length is (min_tmp + 128)
5400
        $display("    pads appending to packets is NOT selected");
5401
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5402
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5403
                 (min_tmp + 8), (min_tmp + 128));
5404
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5405
                 1'b0, num_of_bd);
5406
        tmp_bd = num_of_bd + 1;
5407
        // set padding, remain the rest
5408 274 tadejm
        wait (wbm_working == 0);
5409 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5410
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5411
      end
5412
      else if ((i_length + 4) == (max_tmp - 16))
5413
      begin
5414
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5415
        $display("    pads appending to packets is selected");
5416
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5417
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5418
                 (min_tmp + 64 + 128), tmp_data);
5419
        if (tmp_bd > num_of_bd)
5420
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5421
                   tmp_bd, num_of_bd);
5422
        else
5423
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5424
                   tmp_bd, num_of_bd);
5425
        tmp_bd = num_of_bd + 1;
5426
        // reset padding, remain the rest
5427 274 tadejm
        wait (wbm_working == 0);
5428 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5429
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5430
      end
5431
      else if ((i_length + 4) == max_tmp)
5432
      begin
5433
        $display("    pads appending to packets is NOT selected");
5434
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5435
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5436
                 (max_tmp - (4 + 16)), max_tmp);
5437
        if (tmp_bd > num_of_bd)
5438
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5439
                   tmp_bd, num_of_bd);
5440
        else
5441
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5442
                   tmp_bd, num_of_bd);
5443
      end
5444
      // set length (loop variable)
5445
      if ((i_length + 4) < (min_tmp + 128))
5446
        i_length = i_length + 1;
5447
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5448
        i_length = 256;
5449
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5450
      begin
5451
        i_length = i_length + 128;
5452
        tmp_data = i_length + 4; // last tmp_data is ending length
5453
      end
5454
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5455
        i_length = max_tmp - (4 + 16);
5456
      else if ((i_length + 4) >= (max_tmp - 16))
5457
        i_length = i_length + 1;
5458
      else
5459
      begin
5460
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5461
        #10 $stop;
5462
      end
5463
      // the number of frame transmitted
5464
      num_of_frames = num_of_frames + 1;
5465
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5466
        num_of_bd = 0;
5467
      else
5468
        num_of_bd = num_of_bd + 1;
5469
    end
5470
    // disable TX
5471 274 tadejm
    wait (wbm_working == 0);
5472 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5473
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5474
    @(posedge wb_clk);
5475
    if(fail == 0)
5476
      test_ok;
5477
    else
5478
      fail = 0;
5479
  end
5480
 
5481
 
5482
  ////////////////////////////////////////////////////////////////////
5483
  ////                                                            ////
5484
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5485
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5486
  ////                                                            ////
5487
  ////////////////////////////////////////////////////////////////////
5488
  if (test_num == 5) // with and without padding
5489
  begin
5490
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5491
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5492
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5493
 
5494
    // reset MAC registers
5495
    hard_reset;
5496
    // reset MAC and MII LOGIC with soft reset
5497 274 tadejm
//    reset_mac;
5498
//    reset_mii;
5499 209 tadejm
    // set wb slave response
5500
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5501
 
5502
    max_tmp = 0;
5503
    min_tmp = 0;
5504
    num_of_frames = 0;
5505
    num_of_bd = 0;
5506
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5507 274 tadejm
    wait (wbm_working == 0);
5508 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5509
    // enable TX, set full-duplex mode, NO padding and CRC appending
5510 274 tadejm
    wait (wbm_working == 0);
5511 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5512
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5513
    // prepare two packets of MAXFL length
5514 274 tadejm
    wait (wbm_working == 0);
5515 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5516
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5517
    min_tmp = tmp[31:16];
5518
    st_data = 8'hA5;
5519
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5520
    st_data = 8'h71;
5521
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5522
    // check WB INT signal
5523
    if (wb_int !== 1'b0)
5524
    begin
5525
      test_fail("WB INT signal should not be set");
5526
      fail = fail + 1;
5527
    end
5528
 
5529
    // write to phy's control register for 100Mbps
5530
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5531
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5532
    speed = 100;
5533
 
5534
    i_length = (min_tmp - 4);
5535
    while (i_length <= (max_tmp - 4))
5536
    begin
5537
      // choose generating carrier sense and collision
5538
      case (i_length[1:0])
5539
      2'h0: // Interrupt is generated
5540
      begin
5541
        // Reset_tx_bd nable interrupt generation
5542
        // unmask interrupts
5543 274 tadejm
        wait (wbm_working == 0);
5544 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5545
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5546
        // not detect carrier sense in FD and no collision
5547
        eth_phy.carrier_sense_tx_fd_detect(0);
5548
        eth_phy.collision(0);
5549
      end
5550
      2'h1: // Interrupt is not generated
5551
      begin
5552
        // set_tx_bd enable interrupt generation
5553
        // mask interrupts
5554 274 tadejm
        wait (wbm_working == 0);
5555 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5556
        // detect carrier sense in FD and no collision
5557
        eth_phy.carrier_sense_tx_fd_detect(1);
5558
        eth_phy.collision(0);
5559
      end
5560
      2'h2: // Interrupt is not generated
5561
      begin
5562
        // set_tx_bd disable the interrupt generation
5563
        // unmask interrupts
5564 274 tadejm
        wait (wbm_working == 0);
5565 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5566
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5567
        // not detect carrier sense in FD and set collision
5568
        eth_phy.carrier_sense_tx_fd_detect(0);
5569
        eth_phy.collision(1);
5570
      end
5571
      default: // 2'h3: // Interrupt is not generated
5572
      begin
5573
        // set_tx_bd disable the interrupt generation
5574
        // mask interrupts
5575 274 tadejm
        wait (wbm_working == 0);
5576 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5577
        // detect carrier sense in FD and set collision
5578
        eth_phy.carrier_sense_tx_fd_detect(1);
5579
        eth_phy.collision(1);
5580
      end
5581
      endcase
5582
      // first destination address on ethernet PHY
5583
      if (i_length[0] == 0)
5584
        eth_phy.set_tx_mem_addr(0);
5585
      else
5586
        eth_phy.set_tx_mem_addr(max_tmp);
5587
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5588
      // number of all frames is 154 (146 without first 8)
5589
      if (num_of_frames < 8)
5590
      begin
5591
        case (i_length[1:0])
5592
        2'h0: // Interrupt is generated
5593
        begin
5594
          // enable interrupt generation
5595
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5596
          // interrupts are unmasked
5597
        end
5598
        2'h1: // Interrupt is not generated
5599
        begin
5600
          // enable interrupt generation
5601
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5602
          // interrupts are masked
5603
        end
5604
        2'h2: // Interrupt is not generated
5605
        begin
5606
          // disable interrupt generation
5607
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5608
          // interrupts are unmasked
5609
        end
5610
        default: // 2'h3: // Interrupt is not generated
5611
        begin
5612
          // disable interrupt generation
5613
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5614
          // interrupts are masked
5615
        end
5616
        endcase
5617
        // set wrap bit
5618
        set_tx_bd_wrap(0);
5619
      end
5620
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5621
      else if ((num_of_frames - 8) == 0)
5622
      begin
5623
        tmp_len = i_length; // length of frame
5624
        tmp_bd_num = 0; // TX BD number
5625
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5626
        begin
5627
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5628
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5629
          if (tmp_len[0] == 0)
5630
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5631
          else
5632
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
5633
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5634
          if ((tmp_len + 4) < (min_tmp + 128))
5635
            tmp_len = tmp_len + 1;
5636
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5637
            tmp_len = 256;
5638
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5639
            tmp_len = tmp_len + 128;
5640
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5641
            tmp_len = max_tmp - (4 + 16);
5642
          else if ((tmp_len + 4) >= (max_tmp - 16))
5643
            tmp_len = tmp_len + 1;
5644
          // set TX BD number
5645
          tmp_bd_num = tmp_bd_num + 1;
5646
        end
5647
        // set wrap bit
5648
        set_tx_bd_wrap(127);
5649
      end
5650
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5651
      else if ((num_of_frames - 8) == 20) // 128
5652
      begin
5653
        tmp_len = tmp_len; // length of frame remaines from previous settings
5654
        tmp_bd_num = 0; // TX BD number
5655
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5656
        begin
5657
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5658
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5659
          if (tmp_len[0] == 0)
5660
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5661
          else
5662
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
5663
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5664
          if ((tmp_len + 4) < (min_tmp + 128))
5665
            tmp_len = tmp_len + 1;
5666
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5667
            tmp_len = 256;
5668
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5669
            tmp_len = tmp_len + 128;
5670
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5671
            tmp_len = max_tmp - (4 + 16);
5672
          else if ((tmp_len + 4) >= (max_tmp - 16))
5673
            tmp_len = tmp_len + 1;
5674
          // set TX BD number
5675
          tmp_bd_num = tmp_bd_num + 1;
5676
        end
5677
      end
5678
      // set ready bit
5679
      if (num_of_frames < 8)
5680
        set_tx_bd_ready(0, 0);
5681
      else if ((num_of_frames - 8) < 128)
5682
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5683
      else if ((num_of_frames - 136) < 19)
5684
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5685
      // CHECK END OF TRANSMITION
5686
      #1 check_tx_bd(num_of_bd, data);
5687
      if (i_length < min_tmp) // just first four
5688
      begin
5689
        while (data[15] === 1)
5690
        begin
5691
          #1 check_tx_bd(num_of_bd, data);
5692
          @(posedge wb_clk);
5693
        end
5694
        repeat (1) @(posedge wb_clk);
5695
      end
5696
      else if (i_length > (max_tmp - 8)) // just last four
5697
      begin
5698
        tmp = 0;
5699
        wait (MTxEn === 1'b1); // start transmit
5700
        while (tmp < (i_length - 20))
5701
        begin
5702
          #1 tmp = tmp + 1;
5703
          @(posedge wb_clk);
5704
        end
5705
        #1 check_tx_bd(num_of_bd, data);
5706
        while (data[15] === 1)
5707
        begin
5708
          #1 check_tx_bd(num_of_bd, data);
5709
          @(posedge wb_clk);
5710
        end
5711
        repeat (1) @(posedge wb_clk);
5712
      end
5713
      else
5714
      begin
5715
        wait (MTxEn === 1'b1); // start transmit
5716
        #1 check_tx_bd(num_of_bd, data);
5717
        if (data[15] !== 1)
5718
        begin
5719
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5720
          fail = fail + 1;
5721
        end
5722
        wait (MTxEn === 1'b0); // end transmit
5723
        while (data[15] === 1)
5724
        begin
5725
          #1 check_tx_bd(num_of_bd, data);
5726
          @(posedge wb_clk);
5727
        end
5728
        repeat (1) @(posedge wb_clk);
5729
      end
5730
      // check length of a PACKET
5731
      if (eth_phy.tx_len != (i_length + 4))
5732
      begin
5733
        test_fail("Wrong length of the packet out from MAC");
5734
        fail = fail + 1;
5735
      end
5736
      // checking in the following if statement is performed only for first and last 64 lengths
5737
        // check transmitted TX packet data
5738
        if (i_length[0] == 0)
5739
        begin
5740
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5741
        end
5742
        else
5743
        begin
5744
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5745
        end
5746
        if (tmp > 0)
5747
        begin
5748
          test_fail("Wrong data of the transmitted packet");
5749
          fail = fail + 1;
5750
        end
5751
        // check transmited TX packet CRC
5752
        if (i_length[0] == 0)
5753
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5754
        else
5755
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5756
        if (tmp > 0)
5757
        begin
5758
          test_fail("Wrong CRC of the transmitted packet");
5759
          fail = fail + 1;
5760
        end
5761
      // check WB INT signal
5762
      if (i_length[1:0] == 2'h0)
5763
      begin
5764
        if (wb_int !== 1'b1)
5765
        begin
5766
          `TIME; $display("*E WB INT signal should be set");
5767
          test_fail("WB INT signal should be set");
5768
          fail = fail + 1;
5769
        end
5770
      end
5771
      else
5772
      begin
5773
        if (wb_int !== 1'b0)
5774
        begin
5775
          `TIME; $display("*E WB INT signal should not be set");
5776
          test_fail("WB INT signal should not be set");
5777
          fail = fail + 1;
5778
        end
5779
      end
5780
      // check TX buffer descriptor of a packet
5781
      check_tx_bd(num_of_bd, data);
5782
      if (i_length[1] == 1'b0) // interrupt enabled
5783
      begin
5784
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5785
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5786
        begin
5787
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5788
          test_fail("TX buffer descriptor status is not correct");
5789
          fail = fail + 1;
5790
        end
5791
      end
5792
      else // interrupt not enabled
5793
      begin
5794
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5795
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5796
        begin
5797
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5798
          test_fail("TX buffer descriptor status is not correct");
5799
          fail = fail + 1;
5800
        end
5801
      end
5802
      // clear first half of 8 frames from TX buffer descriptor 0
5803
      if (num_of_frames < 4)
5804
        clear_tx_bd(num_of_bd, num_of_bd);
5805
      // clear BD with wrap bit
5806
      if (num_of_frames == 140)
5807
        clear_tx_bd(127, 127);
5808
      // check interrupts
5809 274 tadejm
      wait (wbm_working == 0);
5810 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5811
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5812
      begin
5813
        if ((data & `ETH_INT_TXB) !== 1'b1)
5814
        begin
5815
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5816
          test_fail("Interrupt Transmit Buffer was not set");
5817
          fail = fail + 1;
5818
        end
5819
        if ((data & (~`ETH_INT_TXB)) !== 0)
5820
        begin
5821
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5822
          test_fail("Other interrupts (except Transmit Buffer) were set");
5823
          fail = fail + 1;
5824
        end
5825
      end
5826
      else
5827
      begin
5828
        if (data !== 0)
5829
        begin
5830
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5831
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5832
          fail = fail + 1;
5833
        end
5834
      end
5835
      // clear interrupts
5836 274 tadejm
      wait (wbm_working == 0);
5837 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5838
      // check WB INT signal
5839
      if (wb_int !== 1'b0)
5840
      begin
5841
        test_fail("WB INT signal should not be set");
5842
        fail = fail + 1;
5843
      end
5844
      // INTERMEDIATE DISPLAYS
5845
      if ((i_length + 4) == (min_tmp + 7))
5846
      begin
5847
        // starting length is min_tmp, ending length is (min_tmp + 128)
5848
        $display("    pads appending to packets is NOT selected");
5849
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5850
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5851
                 min_tmp, (min_tmp + 7));
5852
        $display("    ->all packets were send from TX BD 0");
5853
        // set padding, remain the rest
5854 274 tadejm
        wait (wbm_working == 0);
5855 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5856
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5857
      end
5858
      else if ((i_length + 4) == (min_tmp + 128))
5859
      begin
5860
        // starting length is min_tmp, ending length is (min_tmp + 128)
5861
        $display("    pads appending to packets is NOT selected");
5862
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5863
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5864
                 (min_tmp + 8), (min_tmp + 128));
5865
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5866
                 1'b0, num_of_bd);
5867
        tmp_bd = num_of_bd + 1;
5868
        // set padding, remain the rest
5869 274 tadejm
        wait (wbm_working == 0);
5870 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5871
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5872
      end
5873
      else if ((i_length + 4) == (max_tmp - 16))
5874
      begin
5875
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5876
        $display("    pads appending to packets is selected");
5877
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5878
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5879
                 (min_tmp + 64 + 128), tmp_data);
5880
        if (tmp_bd > num_of_bd)
5881
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5882
                   tmp_bd, num_of_bd);
5883
        else
5884
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5885
                   tmp_bd, num_of_bd);
5886
        tmp_bd = num_of_bd + 1;
5887
        // reset padding, remain the rest
5888 274 tadejm
        wait (wbm_working == 0);
5889 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5890
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5891
      end
5892
      else if ((i_length + 4) == max_tmp)
5893
      begin
5894
        $display("    pads appending to packets is NOT selected");
5895
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5896
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5897
                 (max_tmp - (4 + 16)), max_tmp);
5898
        if (tmp_bd > num_of_bd)
5899
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5900
                   tmp_bd, num_of_bd);
5901
        else
5902
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5903
                   tmp_bd, num_of_bd);
5904
      end
5905
      // set length (loop variable)
5906
      if ((i_length + 4) < (min_tmp + 128))
5907
        i_length = i_length + 1;
5908
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5909
        i_length = 256;
5910
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5911
      begin
5912
        i_length = i_length + 128;
5913
        tmp_data = i_length + 4; // last tmp_data is ending length
5914
      end
5915
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5916
        i_length = max_tmp - (4 + 16);
5917
      else if ((i_length + 4) >= (max_tmp - 16))
5918
        i_length = i_length + 1;
5919
      else
5920
      begin
5921
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5922
        #10 $stop;
5923
      end
5924
      // the number of frame transmitted
5925
      num_of_frames = num_of_frames + 1;
5926
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5927
        num_of_bd = 0;
5928
      else
5929
        num_of_bd = num_of_bd + 1;
5930
    end
5931
    // disable TX
5932 274 tadejm
    wait (wbm_working == 0);
5933 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5934
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5935
    @(posedge wb_clk);
5936
    if(fail == 0)
5937
      test_ok;
5938
    else
5939
      fail = 0;
5940
  end
5941
 
5942
 
5943
  ////////////////////////////////////////////////////////////////////
5944
  ////                                                            ////
5945
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
5946
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
5947
  ////                                                            ////
5948
  ////////////////////////////////////////////////////////////////////
5949
  if (test_num == 6) // 
5950
  begin
5951
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
5952
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
5953
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
5954
 
5955
    // reset MAC registers
5956
    hard_reset;
5957
    // reset MAC and MII LOGIC with soft reset
5958 274 tadejm
//    reset_mac;
5959
//    reset_mii;
5960 209 tadejm
    // set wb slave response
5961
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5962
 
5963
    max_tmp = 0;
5964
    min_tmp = 0;
5965
    // set 8 TX buffer descriptors - must be set before TX enable
5966 274 tadejm
    wait (wbm_working == 0);
5967 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5968
    // enable TX, set full-duplex mode, padding and CRC appending
5969 274 tadejm
    wait (wbm_working == 0);
5970 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5971
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5972
    // prepare two packets of MAXFL length
5973 274 tadejm
    wait (wbm_working == 0);
5974 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5975
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5976
    min_tmp = tmp[31:16];
5977
    st_data = 8'h12;
5978
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
5979
    st_data = 8'h34;
5980
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
5981
    // check WB INT signal
5982
    if (wb_int !== 1'b0)
5983
    begin
5984
      test_fail("WB INT signal should not be set");
5985
      fail = fail + 1;
5986
    end
5987
 
5988
    // write to phy's control register for 10Mbps
5989
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5990
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5991
    speed = 10;
5992
 
5993
    frame_started = 0;
5994
    num_of_frames = 0;
5995
    num_of_bd = 0;
5996
    i_length = 0; // 0;
5997
    while (i_length < 70) // (min_tmp - 4))
5998
    begin
5999
      #1;
6000
      // choose generating carrier sense and collision
6001
      case (i_length[1:0])
6002
      2'h0: // Interrupt is generated
6003
      begin
6004
        // Reset_tx_bd nable interrupt generation
6005
        // unmask interrupts
6006 274 tadejm
        wait (wbm_working == 0);
6007 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6008
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6009
        // not detect carrier sense in FD and no collision
6010
        eth_phy.carrier_sense_tx_fd_detect(0);
6011
        eth_phy.collision(0);
6012
      end
6013
      2'h1: // Interrupt is not generated
6014
      begin
6015
        // set_tx_bd enable interrupt generation
6016
        // mask interrupts
6017 274 tadejm
        wait (wbm_working == 0);
6018 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6019
        // detect carrier sense in FD and no collision
6020
        eth_phy.carrier_sense_tx_fd_detect(1);
6021
        eth_phy.collision(0);
6022
      end
6023
      2'h2: // Interrupt is not generated
6024
      begin
6025
        // set_tx_bd disable the interrupt generation
6026
        // unmask interrupts
6027 274 tadejm
        wait (wbm_working == 0);
6028 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6029
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6030
        // not detect carrier sense in FD and set collision
6031
        eth_phy.carrier_sense_tx_fd_detect(0);
6032
        eth_phy.collision(1);
6033
      end
6034
      default: // 2'h3: // Interrupt is not generated
6035
      begin
6036
        // set_tx_bd disable the interrupt generation
6037
        // mask interrupts
6038 274 tadejm
        wait (wbm_working == 0);
6039 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6040
        // detect carrier sense in FD and set collision
6041
        eth_phy.carrier_sense_tx_fd_detect(1);
6042
        eth_phy.collision(1);
6043
      end
6044
      endcase
6045
      #1;
6046
      // first destination address on ethernet PHY
6047
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6048
      // SET packets and wrap bit
6049
      // num_of_frames <= 9 => wrap set to TX BD 0
6050
      if (num_of_frames <= 9)
6051
      begin
6052
        tmp_len = i_length; // length of frame
6053
        tmp_bd_num = 0; // TX BD number
6054
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6055
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6056
        if (tmp_len[0] == 0)
6057
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6058
        else
6059
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6060
        // set wrap bit
6061
        set_tx_bd_wrap(0);
6062
      end
6063
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6064
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6065
      begin
6066
        tmp_len = i_length; // length of frame
6067
        tmp_bd_num = 0; // TX BD number
6068
        while (tmp_bd_num < 4) //
6069
        begin
6070
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6071
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6072
          if (tmp_len[0] == 0)
6073
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6074
          else
6075
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6076
          tmp_len = tmp_len + 1;
6077
          // set TX BD number
6078
          tmp_bd_num = tmp_bd_num + 1;
6079
        end
6080
        // set wrap bit
6081
        set_tx_bd_wrap(3);
6082
      end
6083
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6084
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6085
      begin
6086
        tmp_len = i_length; // length of frame
6087
        tmp_bd_num = 0; // TX BD number
6088
        while (tmp_bd_num < 5) //
6089
        begin
6090
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6091
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6092
          if (tmp_len[0] == 0)
6093
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6094
          else
6095
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6096
          tmp_len = tmp_len + 1;
6097
          // set TX BD number
6098
          tmp_bd_num = tmp_bd_num + 1;
6099
        end
6100
        // set wrap bit
6101
        set_tx_bd_wrap(4);
6102
      end
6103
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6104
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6105
      begin
6106
        tmp_len = i_length; // length of frame
6107
        tmp_bd_num = 0; // TX BD number
6108
        while (tmp_bd_num < 6) //
6109
        begin
6110
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6111
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6112
          if (tmp_len[0] == 0)
6113
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6114
          else
6115
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6116
          tmp_len = tmp_len + 1;
6117
          // set TX BD number
6118
          tmp_bd_num = tmp_bd_num + 1;
6119
        end
6120
        // set wrap bit
6121
        set_tx_bd_wrap(5);
6122
      end
6123
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6124
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6125
      begin
6126
        tmp_len = i_length; // length of frame
6127
        tmp_bd_num = 0; // TX BD number
6128
        while (tmp_bd_num < 7) //
6129
        begin
6130
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6131
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6132
          if (tmp_len[0] == 0)
6133
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6134
          else
6135
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6136
          tmp_len = tmp_len + 1;
6137
          // set TX BD number
6138
          tmp_bd_num = tmp_bd_num + 1;
6139
        end
6140
        // set wrap bit
6141
        set_tx_bd_wrap(6);
6142
      end
6143
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6144
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6145
      begin
6146
        tmp_len = i_length; // length of frame
6147
        tmp_bd_num = 0; // TX BD number
6148
        while (tmp_bd_num < 8) //
6149
        begin
6150
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6151
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6152
          if (tmp_len[0] == 0)
6153
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6154
          else
6155
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6156
          tmp_len = tmp_len + 1;
6157
          // set TX BD number
6158
          tmp_bd_num = tmp_bd_num + 1;
6159
        end
6160
        // set wrap bit
6161
        set_tx_bd_wrap(7);
6162
      end
6163
      #1;
6164
      // SET ready bit
6165
      if (num_of_frames < 10)
6166
        set_tx_bd_ready(0, 0);
6167
      else if (num_of_frames < 14)
6168
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6169
      else if (num_of_frames < 18)
6170
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6171
      else if (num_of_frames < 23)
6172
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6173
      else if (num_of_frames < 28)
6174
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6175
      else if (num_of_frames < 34)
6176
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6177
      else if (num_of_frames < 40)
6178
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6179
      else if (num_of_frames < 47)
6180
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6181
      else if (num_of_frames < 54)
6182
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6183
      else if (num_of_frames < 62)
6184
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6185
      else if (num_of_frames < 70)
6186
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6187
      // CHECK END OF TRANSMITION
6188
      frame_started = 0;
6189
      if (num_of_frames >= 5)
6190
        #1 check_tx_bd(num_of_bd, data);
6191
      fork
6192
      begin: fr_st
6193
        wait (MTxEn === 1'b1); // start transmit
6194
        frame_started = 1;
6195
      end
6196
      begin
6197
        repeat (30) @(posedge mtx_clk);
6198
        if (num_of_frames < 5)
6199
        begin
6200
          if (frame_started == 1)
6201
          begin
6202
            `TIME; $display("*E Frame should NOT start!");
6203
          end
6204
          disable fr_st;
6205
        end
6206
        else
6207
        begin
6208
          if (frame_started == 0)
6209
          begin
6210
            `TIME; $display("*W Frame should start!");
6211
            disable fr_st;
6212
          end
6213
        end
6214
      end
6215
      join
6216
      // check packets larger than 4 bytes
6217
      if (num_of_frames >= 5)
6218
      begin
6219
        wait (MTxEn === 1'b0); // end transmit
6220
        while (data[15] === 1)
6221
        begin
6222
          #1 check_tx_bd(num_of_bd, data);
6223
          @(posedge wb_clk);
6224
        end
6225
        repeat (1) @(posedge wb_clk);
6226
        // check length of a PACKET
6227
        if (i_length <= (min_tmp - 4))
6228
        begin
6229
          if (eth_phy.tx_len != min_tmp)
6230
          begin
6231
            test_fail("Wrong length of the packet out from MAC");
6232
            fail = fail + 1;
6233
          end
6234
        end
6235
        else
6236
        begin
6237
          if (eth_phy.tx_len != (i_length + 4))
6238
          begin
6239
            test_fail("Wrong length of the packet out from MAC");
6240
            fail = fail + 1;
6241
          end
6242
        end
6243
        // check transmitted TX packet data
6244
        if (i_length[0] == 0)
6245
        begin
6246
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6247
        end
6248
        else
6249
        begin
6250
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6251
        end
6252
        if (tmp > 0)
6253
        begin
6254
          test_fail("Wrong data of the transmitted packet");
6255
          fail = fail + 1;
6256
        end
6257
        // check transmited TX packet CRC
6258
        if (num_of_frames < (min_tmp - 4))
6259
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6260
        else
6261
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6262
        if (tmp > 0)
6263
        begin
6264
          test_fail("Wrong CRC of the transmitted packet");
6265
          fail = fail + 1;
6266
        end
6267
      end
6268
      // check WB INT signal
6269
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6270
      begin
6271
        if (wb_int !== 1'b1)
6272
        begin
6273
          `TIME; $display("*E WB INT signal should be set");
6274
          test_fail("WB INT signal should be set");
6275
          fail = fail + 1;
6276
        end
6277
      end
6278
      else
6279
      begin
6280
        if (wb_int !== 1'b0)
6281
        begin
6282
          `TIME; $display("*E WB INT signal should not be set");
6283
          test_fail("WB INT signal should not be set");
6284
          fail = fail + 1;
6285
        end
6286
      end
6287
      // check TX buffer descriptor of a packet
6288
      check_tx_bd(num_of_bd, data);
6289
      if (num_of_frames >= 5)
6290
      begin
6291
        if (i_length[1] == 1'b0) // interrupt enabled
6292
        begin
6293
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6294
               (data[15:0] !== 16'h5800) ) // without wrap bit
6295
          begin
6296
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6297
            test_fail("TX buffer descriptor status is not correct");
6298
            fail = fail + 1;
6299
          end
6300
        end
6301
        else // interrupt not enabled
6302
        begin
6303
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6304
               (data[15:0] !== 16'h1800) ) // without wrap bit
6305
          begin
6306
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6307
            test_fail("TX buffer descriptor status is not correct");
6308
            fail = fail + 1;
6309
          end
6310
        end
6311
      end
6312
      else
6313
      begin
6314
        if (data[15] !== 1'b1)
6315
        begin
6316
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6317
          test_fail("TX buffer descriptor status is not correct");
6318
          fail = fail + 1;
6319
        end
6320
      end
6321
      // clear TX BD with wrap bit
6322
      if (num_of_frames == 63)
6323
        clear_tx_bd(16, 16);
6324
      // check interrupts
6325 274 tadejm
      wait (wbm_working == 0);
6326 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6327
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6328
      begin
6329
        if ((data & `ETH_INT_TXB) !== 1'b1)
6330
        begin
6331
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6332
          test_fail("Interrupt Transmit Buffer was not set");
6333
          fail = fail + 1;
6334
        end
6335
        if ((data & (~`ETH_INT_TXB)) !== 0)
6336
        begin
6337
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6338
          test_fail("Other interrupts (except Transmit Buffer) were set");
6339
          fail = fail + 1;
6340
        end
6341
      end
6342
      else
6343
      begin
6344
        if (data !== 0)
6345
        begin
6346
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6347
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6348
          fail = fail + 1;
6349
        end
6350
      end
6351
      // clear interrupts
6352 274 tadejm
      wait (wbm_working == 0);
6353 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6354
      // check WB INT signal
6355
      if (wb_int !== 1'b0)
6356
      begin
6357
        test_fail("WB INT signal should not be set");
6358
        fail = fail + 1;
6359
      end
6360
      // INTERMEDIATE DISPLAYS
6361
      if (i_length == 3)
6362
      begin
6363
        $display("    pads appending to packets is selected");
6364
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6365
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6366
                 0, 3);
6367
      end
6368
      else if (i_length == 9)
6369
      begin
6370
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6371
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6372
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6373
                 5, 9);
6374
      end
6375
      else if (i_length == 17)
6376
      begin
6377
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6378
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6379
                 10, 17);
6380
      end
6381
      else if (i_length == 27)
6382
      begin
6383
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6384
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6385
                 18, 27);
6386
      end
6387
      else if (i_length == 40)
6388
      begin
6389
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6390
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6391
                 28, 40);
6392
      end
6393
      else if (i_length == 54)
6394
      begin
6395
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6396
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6397
                 41, 54);
6398
      end
6399
      else if (i_length == 69)
6400
      begin
6401
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6402
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6403
                 55, 69);
6404
      end
6405
      // set length (loop variable)
6406
      i_length = i_length + 1;
6407
      // the number of frame transmitted
6408
      num_of_frames = num_of_frames + 1;
6409
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6410
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6411
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6412
          (num_of_frames == 54) || (num_of_frames == 62))
6413
        num_of_bd = 0;
6414
      else
6415
        num_of_bd = num_of_bd + 1;
6416
    end
6417
    // disable TX
6418 274 tadejm
    wait (wbm_working == 0);
6419 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6420
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6421
    @(posedge wb_clk);
6422
    if(fail == 0)
6423
      test_ok;
6424
    else
6425
      fail = 0;
6426
  end
6427
 
6428
 
6429
  ////////////////////////////////////////////////////////////////////
6430
  ////                                                            ////
6431
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6432
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6433
  ////                                                            ////
6434
  ////////////////////////////////////////////////////////////////////
6435
  if (test_num == 7) // 
6436
  begin
6437
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6438
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6439
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6440
 
6441
    // reset MAC registers
6442
    hard_reset;
6443
    // reset MAC and MII LOGIC with soft reset
6444 274 tadejm
//    reset_mac;
6445
//    reset_mii;
6446 209 tadejm
    // set wb slave response
6447
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6448
 
6449
    max_tmp = 0;
6450
    min_tmp = 0;
6451
    // set 8 TX buffer descriptors - must be set before TX enable
6452 274 tadejm
    wait (wbm_working == 0);
6453 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6454
    // enable TX, set full-duplex mode, padding and CRC appending
6455 274 tadejm
    wait (wbm_working == 0);
6456 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6457
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6458
    // prepare two packets of MAXFL length
6459 274 tadejm
    wait (wbm_working == 0);
6460 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6461
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6462
    min_tmp = tmp[31:16];
6463
    st_data = 8'h12;
6464
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6465
    st_data = 8'h34;
6466
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6467
    // check WB INT signal
6468
    if (wb_int !== 1'b0)
6469
    begin
6470
      test_fail("WB INT signal should not be set");
6471
      fail = fail + 1;
6472
    end
6473
 
6474
    // write to phy's control register for 100Mbps
6475
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6476
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6477
    speed = 100;
6478
 
6479
    frame_started = 0;
6480
    num_of_frames = 0;
6481
    num_of_bd = 0;
6482
    i_length = 0; // 0;
6483
    while (i_length < 70) // (min_tmp - 4))
6484
    begin
6485
      #1;
6486
      // choose generating carrier sense and collision
6487
      case (i_length[1:0])
6488
      2'h0: // Interrupt is generated
6489
      begin
6490
        // Reset_tx_bd nable interrupt generation
6491
        // unmask interrupts
6492 274 tadejm
        wait (wbm_working == 0);
6493 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6494
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6495
        // not detect carrier sense in FD and no collision
6496
        eth_phy.carrier_sense_tx_fd_detect(0);
6497
        eth_phy.collision(0);
6498
      end
6499
      2'h1: // Interrupt is not generated
6500
      begin
6501
        // set_tx_bd enable interrupt generation
6502
        // mask interrupts
6503 274 tadejm
        wait (wbm_working == 0);
6504 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6505
        // detect carrier sense in FD and no collision
6506
        eth_phy.carrier_sense_tx_fd_detect(1);
6507
        eth_phy.collision(0);
6508
      end
6509
      2'h2: // Interrupt is not generated
6510
      begin
6511
        // set_tx_bd disable the interrupt generation
6512
        // unmask interrupts
6513 274 tadejm
        wait (wbm_working == 0);
6514 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6515
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6516
        // not detect carrier sense in FD and set collision
6517
        eth_phy.carrier_sense_tx_fd_detect(0);
6518
        eth_phy.collision(1);
6519
      end
6520
      default: // 2'h3: // Interrupt is not generated
6521
      begin
6522
        // set_tx_bd disable the interrupt generation
6523
        // mask interrupts
6524 274 tadejm
        wait (wbm_working == 0);
6525 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6526
        // detect carrier sense in FD and set collision
6527
        eth_phy.carrier_sense_tx_fd_detect(1);
6528
        eth_phy.collision(1);
6529
      end
6530
      endcase
6531
      #1;
6532
      // first destination address on ethernet PHY
6533
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6534
      // SET packets and wrap bit
6535
      // num_of_frames <= 9 => wrap set to TX BD 0
6536
      if (num_of_frames <= 9)
6537
      begin
6538
        tmp_len = i_length; // length of frame
6539
        tmp_bd_num = 0; // TX BD number
6540
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6541
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6542
        if (tmp_len[0] == 0)
6543
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6544
        else
6545
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6546
        // set wrap bit
6547
        set_tx_bd_wrap(0);
6548
      end
6549
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6550
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6551
      begin
6552
        tmp_len = i_length; // length of frame
6553
        tmp_bd_num = 0; // TX BD number
6554
        while (tmp_bd_num < 4) //
6555
        begin
6556
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6557
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6558
          if (tmp_len[0] == 0)
6559
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6560
          else
6561
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6562
          tmp_len = tmp_len + 1;
6563
          // set TX BD number
6564
          tmp_bd_num = tmp_bd_num + 1;
6565
        end
6566
        // set wrap bit
6567
        set_tx_bd_wrap(3);
6568
      end
6569
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6570
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6571
      begin
6572
        tmp_len = i_length; // length of frame
6573
        tmp_bd_num = 0; // TX BD number
6574
        while (tmp_bd_num < 5) //
6575
        begin
6576
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6577
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6578
          if (tmp_len[0] == 0)
6579
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6580
          else
6581
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6582
          tmp_len = tmp_len + 1;
6583
          // set TX BD number
6584
          tmp_bd_num = tmp_bd_num + 1;
6585
        end
6586
        // set wrap bit
6587
        set_tx_bd_wrap(4);
6588
      end
6589
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6590
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6591
      begin
6592
        tmp_len = i_length; // length of frame
6593
        tmp_bd_num = 0; // TX BD number
6594
        while (tmp_bd_num < 6) //
6595
        begin
6596
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6597
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6598
          if (tmp_len[0] == 0)
6599
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6600
          else
6601
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6602
          tmp_len = tmp_len + 1;
6603
          // set TX BD number
6604
          tmp_bd_num = tmp_bd_num + 1;
6605
        end
6606
        // set wrap bit
6607
        set_tx_bd_wrap(5);
6608
      end
6609
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6610
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6611
      begin
6612
        tmp_len = i_length; // length of frame
6613
        tmp_bd_num = 0; // TX BD number
6614
        while (tmp_bd_num < 7) //
6615
        begin
6616
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6617
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6618
          if (tmp_len[0] == 0)
6619
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6620
          else
6621
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6622
          tmp_len = tmp_len + 1;
6623
          // set TX BD number
6624
          tmp_bd_num = tmp_bd_num + 1;
6625
        end
6626
        // set wrap bit
6627
        set_tx_bd_wrap(6);
6628
      end
6629
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6630
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6631
      begin
6632
        tmp_len = i_length; // length of frame
6633
        tmp_bd_num = 0; // TX BD number
6634
        while (tmp_bd_num < 8) //
6635
        begin
6636
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6637
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6638
          if (tmp_len[0] == 0)
6639
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6640
          else
6641
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6642
          tmp_len = tmp_len + 1;
6643
          // set TX BD number
6644
          tmp_bd_num = tmp_bd_num + 1;
6645
        end
6646
        // set wrap bit
6647
        set_tx_bd_wrap(7);
6648
      end
6649
      #1;
6650
      // SET ready bit
6651
      if (num_of_frames < 10)
6652
        set_tx_bd_ready(0, 0);
6653
      else if (num_of_frames < 14)
6654
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6655
      else if (num_of_frames < 18)
6656
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6657
      else if (num_of_frames < 23)
6658
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6659
      else if (num_of_frames < 28)
6660
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6661
      else if (num_of_frames < 34)
6662
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6663
      else if (num_of_frames < 40)
6664
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6665
      else if (num_of_frames < 47)
6666
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6667
      else if (num_of_frames < 54)
6668
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6669
      else if (num_of_frames < 62)
6670
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6671
      else if (num_of_frames < 70)
6672
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6673
      // CHECK END OF TRANSMITION
6674
      frame_started = 0;
6675
      if (num_of_frames >= 5)
6676
        #1 check_tx_bd(num_of_bd, data);
6677
      fork
6678
      begin: fr_st1
6679
        wait (MTxEn === 1'b1); // start transmit
6680
        frame_started = 1;
6681
      end
6682
      begin
6683 279 mohor
        repeat (50) @(posedge mtx_clk);     // Increased from 30 to 50
6684 209 tadejm
        if (num_of_frames < 5)
6685
        begin
6686
          if (frame_started == 1)
6687
          begin
6688
            `TIME; $display("*E Frame should NOT start!");
6689
          end
6690
          disable fr_st1;
6691
        end
6692
        else
6693
        begin
6694
          if (frame_started == 0)
6695
          begin
6696
            `TIME; $display("*W Frame should start!");
6697
            disable fr_st1;
6698
          end
6699
        end
6700
      end
6701
      join
6702
      // check packets larger than 4 bytes
6703
      if (num_of_frames >= 5)
6704
      begin
6705
        wait (MTxEn === 1'b0); // end transmit
6706
        while (data[15] === 1)
6707
        begin
6708
          #1 check_tx_bd(num_of_bd, data);
6709
          @(posedge wb_clk);
6710
        end
6711
        repeat (1) @(posedge wb_clk);
6712
        // check length of a PACKET
6713
        if (i_length <= (min_tmp - 4))
6714
        begin
6715
          if (eth_phy.tx_len != min_tmp)
6716
          begin
6717
            test_fail("Wrong length of the packet out from MAC");
6718
            fail = fail + 1;
6719
          end
6720
        end
6721
        else
6722
        begin
6723
          if (eth_phy.tx_len != (i_length + 4))
6724
          begin
6725
            test_fail("Wrong length of the packet out from MAC");
6726
            fail = fail + 1;
6727
          end
6728
        end
6729
        // check transmitted TX packet data
6730
        if (i_length[0] == 0)
6731
        begin
6732
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6733
        end
6734
        else
6735
        begin
6736
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6737
        end
6738
        if (tmp > 0)
6739
        begin
6740
          test_fail("Wrong data of the transmitted packet");
6741
          fail = fail + 1;
6742
        end
6743
        // check transmited TX packet CRC
6744
        if (num_of_frames < (min_tmp - 4))
6745
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6746
        else
6747
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6748
        if (tmp > 0)
6749
        begin
6750
          test_fail("Wrong CRC of the transmitted packet");
6751
          fail = fail + 1;
6752
        end
6753
      end
6754
      // check WB INT signal
6755
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6756
      begin
6757
        if (wb_int !== 1'b1)
6758
        begin
6759
          `TIME; $display("*E WB INT signal should be set");
6760
          test_fail("WB INT signal should be set");
6761
          fail = fail + 1;
6762
        end
6763
      end
6764
      else
6765
      begin
6766
        if (wb_int !== 1'b0)
6767
        begin
6768
          `TIME; $display("*E WB INT signal should not be set");
6769
          test_fail("WB INT signal should not be set");
6770
          fail = fail + 1;
6771
        end
6772
      end
6773
      // check TX buffer descriptor of a packet
6774
      check_tx_bd(num_of_bd, data);
6775
      if (num_of_frames >= 5)
6776
      begin
6777
        if (i_length[1] == 1'b0) // interrupt enabled
6778
        begin
6779
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6780
               (data[15:0] !== 16'h5800) ) // without wrap bit
6781
          begin
6782
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6783
            test_fail("TX buffer descriptor status is not correct");
6784
            fail = fail + 1;
6785
          end
6786
        end
6787
        else // interrupt not enabled
6788
        begin
6789
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6790
               (data[15:0] !== 16'h1800) ) // without wrap bit
6791
          begin
6792
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6793
            test_fail("TX buffer descriptor status is not correct");
6794
            fail = fail + 1;
6795
          end
6796
        end
6797
      end
6798
      else
6799
      begin
6800
        if (data[15] !== 1'b1)
6801
        begin
6802
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6803
          test_fail("TX buffer descriptor status is not correct");
6804
          fail = fail + 1;
6805
        end
6806
      end
6807
      // clear TX BD with wrap bit
6808
      if (num_of_frames == 63)
6809
        clear_tx_bd(16, 16);
6810
      // check interrupts
6811 274 tadejm
      wait (wbm_working == 0);
6812 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6813
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6814
      begin
6815
        if ((data & `ETH_INT_TXB) !== 1'b1)
6816
        begin
6817
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6818
          test_fail("Interrupt Transmit Buffer was not set");
6819
          fail = fail + 1;
6820
        end
6821
        if ((data & (~`ETH_INT_TXB)) !== 0)
6822
        begin
6823
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6824
          test_fail("Other interrupts (except Transmit Buffer) were set");
6825
          fail = fail + 1;
6826
        end
6827
      end
6828
      else
6829
      begin
6830
        if (data !== 0)
6831
        begin
6832
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6833
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6834
          fail = fail + 1;
6835
        end
6836
      end
6837
      // clear interrupts
6838 274 tadejm
      wait (wbm_working == 0);
6839 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6840
      // check WB INT signal
6841
      if (wb_int !== 1'b0)
6842
      begin
6843
        test_fail("WB INT signal should not be set");
6844
        fail = fail + 1;
6845
      end
6846
      // INTERMEDIATE DISPLAYS
6847
      if (i_length == 3)
6848
      begin
6849
        $display("    pads appending to packets is selected");
6850
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6851
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6852
                 0, 3);
6853
      end
6854
      else if (i_length == 9)
6855
      begin
6856
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6857
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6858
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6859
                 5, 9);
6860
      end
6861
      else if (i_length == 17)
6862
      begin
6863
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6864
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6865
                 10, 17);
6866
      end
6867
      else if (i_length == 27)
6868
      begin
6869
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6870
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6871
                 18, 27);
6872
      end
6873
      else if (i_length == 40)
6874
      begin
6875
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6876
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6877
                 28, 40);
6878
      end
6879
      else if (i_length == 54)
6880
      begin
6881
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6882
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6883
                 41, 54);
6884
      end
6885
      else if (i_length == 69)
6886
      begin
6887
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6888
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6889
                 55, 69);
6890
      end
6891
      // set length (loop variable)
6892
      i_length = i_length + 1;
6893
      // the number of frame transmitted
6894
      num_of_frames = num_of_frames + 1;
6895
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6896
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6897
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6898
          (num_of_frames == 54) || (num_of_frames == 62))
6899
        num_of_bd = 0;
6900
      else
6901
        num_of_bd = num_of_bd + 1;
6902
    end
6903
    // disable TX
6904
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6905
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6906
    @(posedge wb_clk);
6907
    if(fail == 0)
6908
      test_ok;
6909
    else
6910
      fail = 0;
6911
  end
6912
 
6913
 
6914
  ////////////////////////////////////////////////////////////////////
6915
  ////                                                            ////
6916 243 tadejm
  ////  Test transmit packets (no pads) from 0 to (MINFL - 1)     ////
6917 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
6918
  ////                                                            ////
6919
  ////////////////////////////////////////////////////////////////////
6920
  if (test_num == 8) // 
6921
  begin
6922 243 tadejm
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6923
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6924
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6925 279 mohor
 
6926 209 tadejm
    // reset MAC registers
6927
    hard_reset;
6928
    // reset MAC and MII LOGIC with soft reset
6929 274 tadejm
//    reset_mac;
6930
//    reset_mii;
6931 209 tadejm
    // set wb slave response
6932
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6933
 
6934
    max_tmp = 0;
6935
    min_tmp = 0;
6936
    // set 8 TX buffer descriptors - must be set before TX enable
6937 274 tadejm
    wait (wbm_working == 0);
6938 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6939
    // enable TX, set full-duplex mode, padding and CRC appending
6940 274 tadejm
    wait (wbm_working == 0);
6941 243 tadejm
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6942
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
6943 209 tadejm
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6944
    // prepare two packets of MAXFL length
6945 274 tadejm
    wait (wbm_working == 0);
6946 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6947
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6948
    min_tmp = tmp[31:16];
6949
    st_data = 8'h12;
6950
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6951
    st_data = 8'h34;
6952
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6953
    // check WB INT signal
6954
    if (wb_int !== 1'b0)
6955
    begin
6956
      test_fail("WB INT signal should not be set");
6957
      fail = fail + 1;
6958
    end
6959
 
6960
    // write to phy's control register for 10Mbps
6961
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6962
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6963
    speed = 10;
6964
 
6965
    frame_started = 0;
6966
    num_of_frames = 0;
6967
    num_of_bd = 0;
6968
    i_length = 0; // 0;
6969
    while (i_length < 70) // (min_tmp - 4))
6970
    begin
6971
      #1;
6972
      // choose generating carrier sense and collision
6973
      case (i_length[1:0])
6974
      2'h0: // Interrupt is generated
6975
      begin
6976
        // Reset_tx_bd nable interrupt generation
6977
        // unmask interrupts
6978 274 tadejm
        wait (wbm_working == 0);
6979 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6980
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6981
        // not detect carrier sense in FD and no collision
6982
        eth_phy.carrier_sense_tx_fd_detect(0);
6983
        eth_phy.collision(0);
6984
      end
6985
      2'h1: // Interrupt is not generated
6986
      begin
6987
        // set_tx_bd enable interrupt generation
6988
        // mask interrupts
6989 274 tadejm
        wait (wbm_working == 0);
6990 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6991
        // detect carrier sense in FD and no collision
6992
        eth_phy.carrier_sense_tx_fd_detect(1);
6993
        eth_phy.collision(0);
6994
      end
6995
      2'h2: // Interrupt is not generated
6996
      begin
6997
        // set_tx_bd disable the interrupt generation
6998
        // unmask interrupts
6999 274 tadejm
        wait (wbm_working == 0);
7000 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7001
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7002
        // not detect carrier sense in FD and set collision
7003
        eth_phy.carrier_sense_tx_fd_detect(0);
7004
        eth_phy.collision(1);
7005
      end
7006
      default: // 2'h3: // Interrupt is not generated
7007
      begin
7008
        // set_tx_bd disable the interrupt generation
7009
        // mask interrupts
7010 274 tadejm
        wait (wbm_working == 0);
7011 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7012
        // detect carrier sense in FD and set collision
7013
        eth_phy.carrier_sense_tx_fd_detect(1);
7014
        eth_phy.collision(1);
7015
      end
7016
      endcase
7017 243 tadejm
//      // append CRC
7018
//      if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7019
//      begin
7020
//        append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
7021
//      end
7022 209 tadejm
      #1;
7023
      // first destination address on ethernet PHY
7024
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7025
      // SET packets and wrap bit
7026
      // num_of_frames <= 9 => wrap set to TX BD 0
7027 243 tadejm
      if (num_of_frames <= 5)
7028
        begin
7029
          tmp_len = i_length; // length of frame
7030
          tmp_bd_num = 0; // TX BD number
7031
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7032
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7033 274 tadejm
 
7034 243 tadejm
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
7035 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
7036 243 tadejm
          else
7037 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7038 243 tadejm
          // set wrap bit
7039
          set_tx_bd_wrap(0);
7040
        end
7041
        else if (num_of_frames <= 9)
7042
        begin
7043
          tmp_len = i_length; // length of frame
7044
          tmp_bd_num = 0; // TX BD number
7045
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7046
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7047
          if (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
7048 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7049 243 tadejm
          else
7050
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7051
          // set wrap bit
7052
          set_tx_bd_wrap(0);
7053 279 mohor
        end
7054
        // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7055
        else if ((num_of_frames == 10) || (num_of_frames == 14))
7056 209 tadejm
        begin
7057 279 mohor
          tmp_len = i_length; // length of frame
7058
          tmp_bd_num = 0; // TX BD number
7059
          while (tmp_bd_num < 4)
7060
          begin
7061
            // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7062
            // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7063
            if (tmp_len[0] == 0)
7064
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7065
            else
7066
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7067
            tmp_len = tmp_len + 1;
7068
            // set TX BD number
7069
            tmp_bd_num = tmp_bd_num + 1;
7070
          end
7071
          // set wrap bit
7072
          set_tx_bd_wrap(3);
7073 209 tadejm
        end
7074
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7075
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7076
      begin
7077
        tmp_len = i_length; // length of frame
7078
        tmp_bd_num = 0; // TX BD number
7079
        while (tmp_bd_num < 5) //
7080
        begin
7081
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7082
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7083
          if (tmp_len[0] == 0)
7084 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7085 243 tadejm
          else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
7086
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
7087
                      ((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
7088 279 mohor
 
7089 209 tadejm
          tmp_len = tmp_len + 1;
7090
          // set TX BD number
7091
          tmp_bd_num = tmp_bd_num + 1;
7092
        end
7093
        // set wrap bit
7094
        set_tx_bd_wrap(4);
7095
      end
7096
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7097
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7098
      begin
7099
        tmp_len = i_length; // length of frame
7100
        tmp_bd_num = 0; // TX BD number
7101
        while (tmp_bd_num < 6) //
7102
        begin
7103
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7104
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7105
          if (tmp_len[0] == 0)
7106 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7107 209 tadejm
          else
7108 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7109 209 tadejm
          tmp_len = tmp_len + 1;
7110
          // set TX BD number
7111
          tmp_bd_num = tmp_bd_num + 1;
7112
        end
7113
        // set wrap bit
7114
        set_tx_bd_wrap(5);
7115
      end
7116
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7117
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7118
      begin
7119
        tmp_len = i_length; // length of frame
7120
        tmp_bd_num = 0; // TX BD number
7121
        while (tmp_bd_num < 7) //
7122
        begin
7123
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7124
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7125
          if (tmp_len[0] == 0)
7126 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7127 209 tadejm
          else
7128 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7129 209 tadejm
          tmp_len = tmp_len + 1;
7130
          // set TX BD number
7131
          tmp_bd_num = tmp_bd_num + 1;
7132
        end
7133
        // set wrap bit
7134
        set_tx_bd_wrap(6);
7135
      end
7136
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7137
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7138
      begin
7139
        tmp_len = i_length; // length of frame
7140
        tmp_bd_num = 0; // TX BD number
7141
        while (tmp_bd_num < 8) //
7142
        begin
7143
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7144
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7145
          if (tmp_len[0] == 0)
7146 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7147 209 tadejm
          else
7148 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7149 209 tadejm
          tmp_len = tmp_len + 1;
7150
          // set TX BD number
7151
          tmp_bd_num = tmp_bd_num + 1;
7152
        end
7153
        // set wrap bit
7154
        set_tx_bd_wrap(7);
7155
      end
7156
      #1;
7157
      // SET ready bit
7158
      if (num_of_frames < 10)
7159
        set_tx_bd_ready(0, 0);
7160
      else if (num_of_frames < 14)
7161
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7162
      else if (num_of_frames < 18)
7163
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7164
      else if (num_of_frames < 23)
7165
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7166
      else if (num_of_frames < 28)
7167
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7168
      else if (num_of_frames < 34)
7169
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7170
      else if (num_of_frames < 40)
7171
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7172
      else if (num_of_frames < 47)
7173
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7174
      else if (num_of_frames < 54)
7175
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7176
      else if (num_of_frames < 62)
7177
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7178
      else if (num_of_frames < 70)
7179
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7180
      // CHECK END OF TRANSMITION
7181
      frame_started = 0;
7182
      if (num_of_frames >= 5)
7183
        #1 check_tx_bd(num_of_bd, data);
7184
      fork
7185
      begin: fr_st2
7186
        wait (MTxEn === 1'b1); // start transmit
7187
        frame_started = 1;
7188
      end
7189
      begin
7190
        repeat (30) @(posedge mtx_clk);
7191
        if (num_of_frames < 5)
7192
        begin
7193
          if (frame_started == 1)
7194
          begin
7195
            `TIME; $display("*E Frame should NOT start!");
7196
          end
7197
          disable fr_st2;
7198
        end
7199
        else
7200
        begin
7201
          if (frame_started == 0)
7202
          begin
7203
            `TIME; $display("*W Frame should start!");
7204
            disable fr_st2;
7205
          end
7206
        end
7207
      end
7208
      join
7209 279 mohor
 
7210
 
7211 209 tadejm
      // check packets larger than 4 bytes
7212
      if (num_of_frames >= 5)
7213
      begin
7214
        wait (MTxEn === 1'b0); // end transmit
7215
        while (data[15] === 1)
7216
        begin
7217
          #1 check_tx_bd(num_of_bd, data);
7218
          @(posedge wb_clk);
7219
        end
7220
        repeat (1) @(posedge wb_clk);
7221 274 tadejm
 
7222
 
7223 279 mohor
        // check length of a PACKET     // Check this if it is OK igor
7224
        if (num_of_frames < 6)
7225
          begin
7226
            if (eth_phy.tx_len != (i_length + 4))
7227
              begin
7228
                `TIME; $display("*E Wrong length of the packet out from MAC");
7229
                test_fail("Wrong length of the packet out from MAC");
7230
                fail = fail + 1;
7231
              end
7232
          end
7233
        else if (num_of_frames != 23) // 6 - 53 except 23
7234
          begin
7235
            if (i_length[0] == 1'b0)
7236
              begin
7237
                if (eth_phy.tx_len != i_length)
7238
                  begin
7239
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7240
                    test_fail("Wrong length of the packet out from MAC");
7241
                    fail = fail + 1;
7242
                  end
7243
              end
7244
            else
7245
              begin
7246
                if (eth_phy.tx_len != (i_length + 4))
7247
                  begin
7248
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7249
                    test_fail("Wrong length of the packet out from MAC");
7250
                    fail = fail + 1;
7251
                  end
7252
              end
7253
          end
7254
        else // num_of_frames == 23
7255
          begin
7256
            if (data[12]) // Padding
7257
              begin
7258
                if (eth_phy.tx_len != (64))
7259
                  begin
7260
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7261
                    test_fail("Wrong length of the packet out from MAC");
7262
                    fail = fail + 1;
7263
                  end
7264
              end
7265
            else
7266
              begin
7267
                if (eth_phy.tx_len != (i_length + 4))
7268
                  begin
7269
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7270
                    test_fail("Wrong length of the packet out from MAC");
7271
                    fail = fail + 1;
7272
                  end
7273
              end
7274
          end
7275
 
7276 209 tadejm
        // check transmitted TX packet data
7277
        if (i_length[0] == 0)
7278
        begin
7279
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7280
        end
7281 243 tadejm
        else if (num_of_frames == 23) // i_length[0] == 1 here
7282
        begin
7283 279 mohor
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7284
          #1 check_tx_packet( 0, (num_of_frames * 16 + i_length), (min_tmp - i_length - 4), tmp);
7285 243 tadejm
        end
7286 209 tadejm
        else
7287
        begin
7288
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7289
        end
7290
        if (tmp > 0)
7291
        begin
7292
          test_fail("Wrong data of the transmitted packet");
7293
          fail = fail + 1;
7294
        end
7295
        // check transmited TX packet CRC
7296 243 tadejm
        #1;
7297
        if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7298
        begin
7299
        end
7300
        else
7301
          check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7302 209 tadejm
        if (tmp > 0)
7303
        begin
7304
          test_fail("Wrong CRC of the transmitted packet");
7305
          fail = fail + 1;
7306
        end
7307
      end
7308
      // check WB INT signal
7309
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7310
      begin
7311
        if (wb_int !== 1'b1)
7312
        begin
7313
          `TIME; $display("*E WB INT signal should be set");
7314
          test_fail("WB INT signal should be set");
7315
          fail = fail + 1;
7316
        end
7317
      end
7318
      else
7319
      begin
7320
        if (wb_int !== 1'b0)
7321
        begin
7322
          `TIME; $display("*E WB INT signal should not be set");
7323
          test_fail("WB INT signal should not be set");
7324
          fail = fail + 1;
7325
        end
7326
      end
7327
      // check TX buffer descriptor of a packet
7328
      check_tx_bd(num_of_bd, data);
7329 279 mohor
 
7330 209 tadejm
      if (num_of_frames >= 5)
7331
      begin
7332 243 tadejm
        if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
7333 209 tadejm
        begin
7334 243 tadejm
          if ( (data[15:0] !== 16'h6000) &&  // wrap bit
7335
               (data[15:0] !== 16'h4000) )  // without wrap bit
7336 209 tadejm
          begin
7337 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 1: %0h", data[15:0]);
7338 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7339
            fail = fail + 1;
7340
          end
7341
        end
7342 243 tadejm
        else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
7343 209 tadejm
        begin
7344 243 tadejm
          if ( (data[15:0] !== 16'h2000) && // wrap bit
7345
               (data[15:0] !== 16'h0000) ) // without wrap bit
7346
          begin
7347 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 2: %0h", data[15:0]);
7348 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7349
            fail = fail + 1;
7350
          end
7351
        end
7352
        else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
7353
        begin
7354
          if ( (data[15:0] !== 16'h6800) && // wrap bit
7355
               (data[15:0] !== 16'h4800) ) // without wrap bit
7356
          begin
7357 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 3: %0h", data[15:0]);
7358 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7359
            fail = fail + 1;
7360
          end
7361
        end
7362
        else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7363
        begin
7364
          if ( (data[15:0] !== 16'h2800) && // wrap bit
7365
               (data[15:0] !== 16'h0800) ) // without wrap bit
7366
          begin
7367 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 4: %0h", data[15:0]);
7368 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7369
            fail = fail + 1;
7370
          end
7371
        end
7372
        else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7373
        begin
7374 209 tadejm
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7375
               (data[15:0] !== 16'h1800) ) // without wrap bit
7376
          begin
7377 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 5: %0h", data[15:0]);
7378 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7379
            fail = fail + 1;
7380
          end
7381
        end
7382
      end
7383
      else
7384
      begin
7385
        if (data[15] !== 1'b1)
7386
        begin
7387
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7388
          test_fail("TX buffer descriptor status is not correct");
7389
          fail = fail + 1;
7390
        end
7391
      end
7392
      // clear TX BD with wrap bit
7393
      if (num_of_frames == 63)
7394
        clear_tx_bd(16, 16);
7395
      // check interrupts
7396 274 tadejm
      wait (wbm_working == 0);
7397 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7398
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7399
      begin
7400
        if ((data & `ETH_INT_TXB) !== 1'b1)
7401
        begin
7402
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7403
          test_fail("Interrupt Transmit Buffer was not set");
7404
          fail = fail + 1;
7405
        end
7406
        if ((data & (~`ETH_INT_TXB)) !== 0)
7407
        begin
7408
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7409
          test_fail("Other interrupts (except Transmit Buffer) were set");
7410
          fail = fail + 1;
7411
        end
7412
      end
7413
      else
7414
      begin
7415
        if (data !== 0)
7416
        begin
7417
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7418
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7419
          fail = fail + 1;
7420
        end
7421
      end
7422
      // clear interrupts
7423 274 tadejm
      wait (wbm_working == 0);
7424 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7425
      // check WB INT signal
7426
      if (wb_int !== 1'b0)
7427
      begin
7428
        test_fail("WB INT signal should not be set");
7429
        fail = fail + 1;
7430
      end
7431
      // INTERMEDIATE DISPLAYS
7432
      if (i_length == 3)
7433
      begin
7434 279 mohor
        $display("    pads appending to packets is not selected (except for 0x23)");
7435 209 tadejm
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7436
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7437
                 0, 3);
7438
      end
7439
      else if (i_length == 9)
7440
      begin
7441
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7442
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7443
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7444
                 5, 9);
7445
      end
7446
      else if (i_length == 17)
7447
      begin
7448
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7449
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7450
                 10, 17);
7451
      end
7452
      else if (i_length == 27)
7453
      begin
7454
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7455
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7456
                 18, 27);
7457
      end
7458
      else if (i_length == 40)
7459
      begin
7460
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7461
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7462
                 28, 40);
7463
      end
7464
      else if (i_length == 54)
7465
      begin
7466
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7467
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7468
                 41, 54);
7469
      end
7470
      else if (i_length == 69)
7471
      begin
7472
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7473
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7474
                 55, 69);
7475
      end
7476
      // set length (loop variable)
7477
      i_length = i_length + 1;
7478
      // the number of frame transmitted
7479
      num_of_frames = num_of_frames + 1;
7480
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7481
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7482
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7483
          (num_of_frames == 54) || (num_of_frames == 62))
7484
        num_of_bd = 0;
7485
      else
7486
        num_of_bd = num_of_bd + 1;
7487
    end
7488
    // disable TX
7489 274 tadejm
    wait (wbm_working == 0);
7490 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7491
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7492
    @(posedge wb_clk);
7493
    if(fail == 0)
7494
      test_ok;
7495
    else
7496
      fail = 0;
7497
  end
7498
 
7499
 
7500
  ////////////////////////////////////////////////////////////////////
7501
  ////                                                            ////
7502 243 tadejm
  ////  Test transmit packets (no pads) form 0 to (MINFL - 1)     ////
7503 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7504
  ////                                                            ////
7505
  ////////////////////////////////////////////////////////////////////
7506
  if (test_num == 9) // 
7507
  begin
7508 243 tadejm
    // TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7509
    test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7510
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7511 209 tadejm
 
7512
    // reset MAC registers
7513
    hard_reset;
7514
    // reset MAC and MII LOGIC with soft reset
7515 274 tadejm
//    reset_mac;
7516
//    reset_mii;
7517 209 tadejm
    // set wb slave response
7518
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7519
 
7520
    max_tmp = 0;
7521
    min_tmp = 0;
7522
    // set 8 TX buffer descriptors - must be set before TX enable
7523 274 tadejm
    wait (wbm_working == 0);
7524 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7525
    // enable TX, set full-duplex mode, padding and CRC appending
7526 274 tadejm
    wait (wbm_working == 0);
7527 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7528
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7529
    // prepare two packets of MAXFL length
7530 274 tadejm
    wait (wbm_working == 0);
7531 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7532
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7533
    min_tmp = tmp[31:16];
7534
    st_data = 8'h12;
7535
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7536
    st_data = 8'h34;
7537
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7538
    // check WB INT signal
7539
    if (wb_int !== 1'b0)
7540
    begin
7541
      test_fail("WB INT signal should not be set");
7542
      fail = fail + 1;
7543
    end
7544
 
7545
    // write to phy's control register for 100Mbps
7546
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7547
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7548
    speed = 100;
7549
 
7550
    frame_started = 0;
7551
    num_of_frames = 0;
7552
    num_of_bd = 0;
7553
    i_length = 0; // 0;
7554
    while (i_length < 70) // (min_tmp - 4))
7555
    begin
7556
      #1;
7557
      // choose generating carrier sense and collision
7558
      case (i_length[1:0])
7559
      2'h0: // Interrupt is generated
7560
      begin
7561
        // Reset_tx_bd nable interrupt generation
7562
        // unmask interrupts
7563 274 tadejm
        wait (wbm_working == 0);
7564 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7565
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7566
        // not detect carrier sense in FD and no collision
7567
        eth_phy.carrier_sense_tx_fd_detect(0);
7568
        eth_phy.collision(0);
7569
      end
7570
      2'h1: // Interrupt is not generated
7571
      begin
7572
        // set_tx_bd enable interrupt generation
7573
        // mask interrupts
7574 274 tadejm
        wait (wbm_working == 0);
7575 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7576
        // detect carrier sense in FD and no collision
7577
        eth_phy.carrier_sense_tx_fd_detect(1);
7578
        eth_phy.collision(0);
7579
      end
7580
      2'h2: // Interrupt is not generated
7581
      begin
7582
        // set_tx_bd disable the interrupt generation
7583
        // unmask interrupts
7584 274 tadejm
        wait (wbm_working == 0);
7585 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7586
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7587
        // not detect carrier sense in FD and set collision
7588
        eth_phy.carrier_sense_tx_fd_detect(0);
7589
        eth_phy.collision(1);
7590
      end
7591
      default: // 2'h3: // Interrupt is not generated
7592
      begin
7593
        // set_tx_bd disable the interrupt generation
7594
        // mask interrupts
7595 274 tadejm
        wait (wbm_working == 0);
7596 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7597
        // detect carrier sense in FD and set collision
7598
        eth_phy.carrier_sense_tx_fd_detect(1);
7599
        eth_phy.collision(1);
7600
      end
7601
      endcase
7602
      #1;
7603
      // first destination address on ethernet PHY
7604
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7605
      // SET packets and wrap bit
7606
      // num_of_frames <= 9 => wrap set to TX BD 0
7607
      if (num_of_frames <= 9)
7608
      begin
7609
        tmp_len = i_length; // length of frame
7610
        tmp_bd_num = 0; // TX BD number
7611
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7612
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7613
        if (tmp_len[0] == 0)
7614
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7615
        else
7616
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7617
        // set wrap bit
7618
        set_tx_bd_wrap(0);
7619
      end
7620
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7621
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7622
      begin
7623
        tmp_len = i_length; // length of frame
7624
        tmp_bd_num = 0; // TX BD number
7625
        while (tmp_bd_num < 4) //
7626
        begin
7627
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7628
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7629
          if (tmp_len[0] == 0)
7630
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7631
          else
7632
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7633
          tmp_len = tmp_len + 1;
7634
          // set TX BD number
7635
          tmp_bd_num = tmp_bd_num + 1;
7636
        end
7637
        // set wrap bit
7638
        set_tx_bd_wrap(3);
7639
      end
7640
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7641
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7642
      begin
7643
        tmp_len = i_length; // length of frame
7644
        tmp_bd_num = 0; // TX BD number
7645
        while (tmp_bd_num < 5) //
7646
        begin
7647
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7648
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7649
          if (tmp_len[0] == 0)
7650
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7651
          else
7652
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7653
          tmp_len = tmp_len + 1;
7654
          // set TX BD number
7655
          tmp_bd_num = tmp_bd_num + 1;
7656
        end
7657
        // set wrap bit
7658
        set_tx_bd_wrap(4);
7659
      end
7660
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7661
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7662
      begin
7663
        tmp_len = i_length; // length of frame
7664
        tmp_bd_num = 0; // TX BD number
7665
        while (tmp_bd_num < 6) //
7666
        begin
7667
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7668
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7669
          if (tmp_len[0] == 0)
7670
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7671
          else
7672
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7673
          tmp_len = tmp_len + 1;
7674
          // set TX BD number
7675
          tmp_bd_num = tmp_bd_num + 1;
7676
        end
7677
        // set wrap bit
7678
        set_tx_bd_wrap(5);
7679
      end
7680
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7681
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7682
      begin
7683
        tmp_len = i_length; // length of frame
7684
        tmp_bd_num = 0; // TX BD number
7685
        while (tmp_bd_num < 7) //
7686
        begin
7687
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7688
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7689
          if (tmp_len[0] == 0)
7690
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7691
          else
7692
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7693
          tmp_len = tmp_len + 1;
7694
          // set TX BD number
7695
          tmp_bd_num = tmp_bd_num + 1;
7696
        end
7697
        // set wrap bit
7698
        set_tx_bd_wrap(6);
7699
      end
7700
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7701
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7702
      begin
7703
        tmp_len = i_length; // length of frame
7704
        tmp_bd_num = 0; // TX BD number
7705
        while (tmp_bd_num < 8) //
7706
        begin
7707
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7708
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7709
          if (tmp_len[0] == 0)
7710
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7711
          else
7712
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7713
          tmp_len = tmp_len + 1;
7714
          // set TX BD number
7715
          tmp_bd_num = tmp_bd_num + 1;
7716
        end
7717
        // set wrap bit
7718
        set_tx_bd_wrap(7);
7719
      end
7720
      #1;
7721
      // SET ready bit
7722
      if (num_of_frames < 10)
7723
        set_tx_bd_ready(0, 0);
7724
      else if (num_of_frames < 14)
7725
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7726
      else if (num_of_frames < 18)
7727
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7728
      else if (num_of_frames < 23)
7729
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7730
      else if (num_of_frames < 28)
7731
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7732
      else if (num_of_frames < 34)
7733
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7734
      else if (num_of_frames < 40)
7735
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7736
      else if (num_of_frames < 47)
7737
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7738
      else if (num_of_frames < 54)
7739
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7740
      else if (num_of_frames < 62)
7741
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7742
      else if (num_of_frames < 70)
7743
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7744
      // CHECK END OF TRANSMITION
7745
      frame_started = 0;
7746
      if (num_of_frames >= 5)
7747
        #1 check_tx_bd(num_of_bd, data);
7748
      fork
7749
      begin: fr_st3
7750
        wait (MTxEn === 1'b1); // start transmit
7751
        frame_started = 1;
7752
      end
7753
      begin
7754 279 mohor
        repeat (50) @(posedge mtx_clk);
7755
$display("(%0t) num_of_frames = 0x%0x", $time, num_of_frames);
7756 209 tadejm
        if (num_of_frames < 5)
7757
        begin
7758
          if (frame_started == 1)
7759
          begin
7760
            `TIME; $display("*E Frame should NOT start!");
7761
          end
7762
          disable fr_st3;
7763
        end
7764
        else
7765
        begin
7766
          if (frame_started == 0)
7767
          begin
7768
            `TIME; $display("*W Frame should start!");
7769 279 mohor
#500 $stop;
7770 209 tadejm
            disable fr_st3;
7771
          end
7772
        end
7773
      end
7774
      join
7775
      // check packets larger than 4 bytes
7776
      if (num_of_frames >= 5)
7777
      begin
7778
        wait (MTxEn === 1'b0); // end transmit
7779
        while (data[15] === 1)
7780
        begin
7781
          #1 check_tx_bd(num_of_bd, data);
7782
          @(posedge wb_clk);
7783
        end
7784
        repeat (1) @(posedge wb_clk);
7785
        // check length of a PACKET
7786 279 mohor
        if ((num_of_frames + 4) < 64)
7787
          begin
7788
            if (eth_phy.tx_len != 64)
7789
            begin
7790
              `TIME; $display("*E Wrong length of the packet out from MAC");
7791
              test_fail("Wrong length of the packet out from MAC");
7792
              fail = fail + 1;
7793
            end
7794
          end
7795
        else
7796
          begin
7797 209 tadejm
        if (eth_phy.tx_len != (i_length + 4))
7798
        begin
7799
          `TIME; $display("*E Wrong length of the packet out from MAC");
7800
          test_fail("Wrong length of the packet out from MAC");
7801
          fail = fail + 1;
7802
        end
7803 279 mohor
          end
7804 209 tadejm
        // check transmitted TX packet data
7805
        if (i_length[0] == 0)
7806
        begin
7807
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7808
        end
7809
        else
7810
        begin
7811
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7812
        end
7813
        if (tmp > 0)
7814
        begin
7815
          test_fail("Wrong data of the transmitted packet");
7816
          fail = fail + 1;
7817
        end
7818
        // check transmited TX packet CRC
7819
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7820
        if (tmp > 0)
7821
        begin
7822
          test_fail("Wrong CRC of the transmitted packet");
7823
          fail = fail + 1;
7824
        end
7825
      end
7826
      // check WB INT signal
7827
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7828
      begin
7829
        if (wb_int !== 1'b1)
7830
        begin
7831
          `TIME; $display("*E WB INT signal should be set");
7832
          test_fail("WB INT signal should be set");
7833
          fail = fail + 1;
7834
        end
7835
      end
7836
      else
7837
      begin
7838
        if (wb_int !== 1'b0)
7839
        begin
7840
          `TIME; $display("*E WB INT signal should not be set");
7841
          test_fail("WB INT signal should not be set");
7842
          fail = fail + 1;
7843
        end
7844
      end
7845
      // check TX buffer descriptor of a packet
7846
      check_tx_bd(num_of_bd, data);
7847
      if (num_of_frames >= 5)
7848
      begin
7849
        if (i_length[1] == 1'b0) // interrupt enabled
7850
        begin
7851
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7852
               (data[15:0] !== 16'h5800) ) // without wrap bit
7853
          begin
7854
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7855
            test_fail("TX buffer descriptor status is not correct");
7856
            fail = fail + 1;
7857
          end
7858
        end
7859
        else // interrupt not enabled
7860
        begin
7861
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7862
               (data[15:0] !== 16'h1800) ) // without wrap bit
7863
          begin
7864
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7865
            test_fail("TX buffer descriptor status is not correct");
7866
            fail = fail + 1;
7867
          end
7868
        end
7869
      end
7870
      else
7871
      begin
7872
        if (data[15] !== 1'b1)
7873
        begin
7874
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7875
          test_fail("TX buffer descriptor status is not correct");
7876
          fail = fail + 1;
7877
        end
7878
      end
7879
      // clear TX BD with wrap bit
7880
      if (num_of_frames == 63)
7881
        clear_tx_bd(16, 16);
7882
      // check interrupts
7883 274 tadejm
      wait (wbm_working == 0);
7884 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7885
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7886
      begin
7887
        if ((data & `ETH_INT_TXB) !== 1'b1)
7888
        begin
7889
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7890
          test_fail("Interrupt Transmit Buffer was not set");
7891
          fail = fail + 1;
7892
        end
7893
        if ((data & (~`ETH_INT_TXB)) !== 0)
7894
        begin
7895
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7896
          test_fail("Other interrupts (except Transmit Buffer) were set");
7897
          fail = fail + 1;
7898
        end
7899
      end
7900
      else
7901
      begin
7902
        if (data !== 0)
7903
        begin
7904
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7905
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7906
          fail = fail + 1;
7907
        end
7908
      end
7909
      // clear interrupts
7910 274 tadejm
      wait (wbm_working == 0);
7911 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7912
      // check WB INT signal
7913
      if (wb_int !== 1'b0)
7914
      begin
7915
        test_fail("WB INT signal should not be set");
7916
        fail = fail + 1;
7917
      end
7918
      // INTERMEDIATE DISPLAYS
7919
      if (i_length == 3)
7920
      begin
7921
        $display("    pads appending to packets is selected");
7922
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7923
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7924
                 0, 3);
7925
      end
7926
      else if (i_length == 9)
7927
      begin
7928
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7929
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7930
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7931
                 5, 9);
7932
      end
7933
      else if (i_length == 17)
7934
      begin
7935
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7936
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7937
                 10, 17);
7938
      end
7939
      else if (i_length == 27)
7940
      begin
7941
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7942
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7943
                 18, 27);
7944
      end
7945
      else if (i_length == 40)
7946
      begin
7947
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7948
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7949
                 28, 40);
7950
      end
7951
      else if (i_length == 54)
7952
      begin
7953
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7954
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7955
                 41, 54);
7956
      end
7957
      else if (i_length == 69)
7958
      begin
7959
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7960
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7961
                 55, 69);
7962
      end
7963
      // set length (loop variable)
7964
      i_length = i_length + 1;
7965
      // the number of frame transmitted
7966
      num_of_frames = num_of_frames + 1;
7967
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7968
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7969
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7970
          (num_of_frames == 54) || (num_of_frames == 62))
7971
        num_of_bd = 0;
7972
      else
7973
        num_of_bd = num_of_bd + 1;
7974
    end
7975
    // disable TX
7976 274 tadejm
    wait (wbm_working == 0);
7977 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7978
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7979
    @(posedge wb_clk);
7980
    if(fail == 0)
7981
      test_ok;
7982
    else
7983
      fail = 0;
7984
  end
7985
 
7986
 
7987
  ////////////////////////////////////////////////////////////////////
7988
  ////                                                            ////
7989
  ////  Test transmit packets across MAXFL value at               ////
7990
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
7991
  ////                                                            ////
7992
  ////////////////////////////////////////////////////////////////////
7993
  if (test_num == 10) // without and with padding
7994
  begin
7995
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
7996
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
7997
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
7998
 
7999
    // reset MAC registers
8000
    hard_reset;
8001
    // set wb slave response
8002
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8003
 
8004
    max_tmp = 0;
8005
    min_tmp = 0;
8006
    num_of_frames = 0;
8007
    num_of_bd = 0;
8008
    // set 13 TX buffer descriptors - must be set before TX enable
8009 274 tadejm
    wait (wbm_working == 0);
8010 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8011
    // enable TX, set full-duplex mode, NO padding and CRC appending
8012 274 tadejm
    wait (wbm_working == 0);
8013 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8014
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8015
    // prepare a packet of MAXFL + 10 length
8016 274 tadejm
    wait (wbm_working == 0);
8017 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8018
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8019
    min_tmp = tmp[31:16];
8020
    st_data = 8'hA3;
8021
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8022
    // check WB INT signal
8023
    if (wb_int !== 1'b0)
8024
    begin
8025
      test_fail("WB INT signal should not be set");
8026
      fail = fail + 1;
8027
    end
8028
 
8029
    // write to phy's control register for 10Mbps
8030
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8031
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8032
    speed = 10;
8033
 
8034
    i_length = (max_tmp - 5);
8035 279 mohor
    while (num_of_bd <= 3)
8036 209 tadejm
    begin
8037 279 mohor
      // unmask interrupts
8038
      wait (wbm_working == 0);
8039
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8040
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8041
      // not detect carrier sense in FD and no collision
8042
      eth_phy.carrier_sense_tx_fd_detect(0);
8043
      eth_phy.collision(0);
8044 209 tadejm
      // first destination address on ethernet PHY
8045
      eth_phy.set_tx_mem_addr(0);
8046
 
8047 279 mohor
      if (num_of_bd == 0)
8048
      begin
8049
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8050
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8051
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8052
        set_tx_bd_wrap(2);
8053
        set_tx_bd_ready(0, 0);
8054
      end
8055
      else if (num_of_bd == 1)
8056
        set_tx_bd_ready(1, 1);
8057
      else if (num_of_bd == 2)
8058
        set_tx_bd_ready(2, 2);
8059
      else if (num_of_bd == 3)
8060
      begin
8061
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8062
        set_tx_bd_wrap(2);
8063
        set_tx_bd_ready(0, 0);
8064
        i_length = 96;
8065
      end
8066
 
8067 209 tadejm
 
8068
      // CHECK END OF TRANSMITION
8069 279 mohor
      check_tx_bd(num_of_bd, data);
8070
      wait (MTxEn === 1'b1); // start transmit
8071
      check_tx_bd(num_of_bd, data);
8072
      if (data[15] !== 1)
8073
      begin
8074
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8075
        fail = fail + 1;
8076
      end
8077
      wait (MTxEn === 1'b0); // end transmit
8078
      while (data[15] === 1)
8079
      begin
8080
        check_tx_bd(num_of_bd, data);
8081
        @(posedge wb_clk);
8082
      end
8083
      repeat (1) @(posedge wb_clk);
8084 209 tadejm
      // check length of a PACKET
8085 279 mohor
      tmp_len = eth_phy.tx_len;
8086
      #1;
8087
      if (tmp_len != (i_length + 4))
8088 209 tadejm
      begin
8089
        test_fail("Wrong length of the packet out from MAC");
8090
        fail = fail + 1;
8091
      end
8092 279 mohor
 
8093
      // check transmitted TX packet data
8094
      if ((i_length + 4) == 100)
8095
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8096
      else if ((i_length + 4) <= max_tmp)
8097
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8098
      else
8099
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8100
 
8101
      if (tmp > 0)
8102
      begin
8103
        test_fail("Wrong data of the transmitted packet");
8104
        fail = fail + 1;
8105
      end
8106
 
8107
      // check transmited TX packet CRC
8108
      if ((i_length + 4) == 100)
8109
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8110
      else if ((i_length + 4) <= max_tmp)
8111
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8112
 
8113
      if (tmp > 0)
8114
      begin
8115
        test_fail("Wrong CRC of the transmitted packet");
8116
        fail = fail + 1;
8117
      end
8118
 
8119
      if (wb_int !== 1'b1)
8120
      begin
8121
        `TIME; $display("*E WB INT signal should be set");
8122
        test_fail("WB INT signal should be set");
8123
        fail = fail + 1;
8124
      end
8125
 
8126
      check_tx_bd(num_of_bd, data);
8127
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8128
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8129
      begin
8130
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8131
        test_fail("TX buffer descriptor status is not correct");
8132
        fail = fail + 1;
8133
      end
8134
 
8135 209 tadejm
      // check interrupts
8136 274 tadejm
      wait (wbm_working == 0);
8137 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8138 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8139
      begin
8140
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8141
        test_fail("Interrupt Transmit Buffer was not set");
8142
        fail = fail + 1;
8143
      end
8144
      if ((data & (~`ETH_INT_TXB)) !== 0)
8145
      begin
8146
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8147
        test_fail("Other interrupts (except Transmit Buffer) were set");
8148
        fail = fail + 1;
8149
      end
8150
 
8151 209 tadejm
      // clear interrupts
8152 274 tadejm
      wait (wbm_working == 0);
8153 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8154
      // check WB INT signal
8155
      if (wb_int !== 1'b0)
8156
      begin
8157
        test_fail("WB INT signal should not be set");
8158
        fail = fail + 1;
8159
      end
8160 279 mohor
 
8161 209 tadejm
      // INTERMEDIATE DISPLAYS
8162 279 mohor
      if (num_of_bd == 0)
8163
        $display("    ->packet with length %0d sent", (i_length + 4));
8164
      else if (num_of_bd == 1)
8165
        $display("    ->packet with length %0d sent", (i_length + 4));
8166
      else if (num_of_bd == 2)
8167
        $display("    ->packet with length %0d sent", (i_length + 4));
8168
      else if (num_of_bd == 3)
8169
        $display("    ->packet with length %0d sent", (104));
8170 209 tadejm
      // set length (loop variable)
8171
      i_length = i_length + 1;
8172
      // the number of frame transmitted
8173
      num_of_frames = num_of_frames + 1;
8174
      num_of_bd = num_of_bd + 1;
8175
      @(posedge wb_clk);
8176
    end
8177
    // disable TX
8178 274 tadejm
    wait (wbm_working == 0);
8179 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8180
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8181
    @(posedge wb_clk);
8182
    if(fail == 0)
8183
      test_ok;
8184
    else
8185
      fail = 0;
8186
  end
8187
 
8188
 
8189
  ////////////////////////////////////////////////////////////////////
8190
  ////                                                            ////
8191
  ////  Test transmit packets across MAXFL value at               ////
8192 279 mohor
  ////  13 TX buffer decriptors ( 100Mbps ).                       ////
8193 209 tadejm
  ////                                                            ////
8194
  ////////////////////////////////////////////////////////////////////
8195
  if (test_num == 11) // without and with padding
8196
  begin
8197
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8198
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8199
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8200 279 mohor
 
8201 209 tadejm
    // reset MAC registers
8202
    hard_reset;
8203
    // set wb slave response
8204
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8205
 
8206
    max_tmp = 0;
8207
    min_tmp = 0;
8208
    num_of_frames = 0;
8209
    num_of_bd = 0;
8210
    // set 13 TX buffer descriptors - must be set before TX enable
8211 274 tadejm
    wait (wbm_working == 0);
8212 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8213
    // enable TX, set full-duplex mode, NO padding and CRC appending
8214 274 tadejm
    wait (wbm_working == 0);
8215 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8216
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8217
    // prepare a packet of MAXFL + 10 length
8218 274 tadejm
    wait (wbm_working == 0);
8219 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8220
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8221
    min_tmp = tmp[31:16];
8222
    st_data = 8'hA3;
8223
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8224
    // check WB INT signal
8225
    if (wb_int !== 1'b0)
8226
    begin
8227
      test_fail("WB INT signal should not be set");
8228
      fail = fail + 1;
8229
    end
8230 279 mohor
 
8231
    // write to phy's control register for 10Mbps
8232
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8233
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8234 209 tadejm
    speed = 100;
8235
 
8236
    i_length = (max_tmp - 5);
8237 279 mohor
    while (num_of_bd <= 3)
8238 209 tadejm
    begin
8239
      // unmask interrupts
8240 274 tadejm
      wait (wbm_working == 0);
8241 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8242
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8243
      // not detect carrier sense in FD and no collision
8244
      eth_phy.carrier_sense_tx_fd_detect(0);
8245
      eth_phy.collision(0);
8246
      // first destination address on ethernet PHY
8247
      eth_phy.set_tx_mem_addr(0);
8248 279 mohor
 
8249 209 tadejm
      if (num_of_bd == 0)
8250
      begin
8251
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8252
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8253
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8254
        set_tx_bd_wrap(2);
8255
        set_tx_bd_ready(0, 0);
8256
      end
8257
      else if (num_of_bd == 1)
8258
        set_tx_bd_ready(1, 1);
8259
      else if (num_of_bd == 2)
8260
        set_tx_bd_ready(2, 2);
8261 279 mohor
      else if (num_of_bd == 3)
8262
      begin
8263
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8264
        set_tx_bd_wrap(2);
8265
        set_tx_bd_ready(0, 0);
8266
        i_length = 96;
8267
      end
8268
 
8269
 
8270 209 tadejm
      // CHECK END OF TRANSMITION
8271
      check_tx_bd(num_of_bd, data);
8272 279 mohor
      wait (MTxEn === 1'b1); // start transmit
8273 209 tadejm
      check_tx_bd(num_of_bd, data);
8274 279 mohor
      if (data[15] !== 1)
8275
      begin
8276
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8277
        fail = fail + 1;
8278
      end
8279
      wait (MTxEn === 1'b0); // end transmit
8280
      while (data[15] === 1)
8281
      begin
8282
        check_tx_bd(num_of_bd, data);
8283
        @(posedge wb_clk);
8284
      end
8285
      repeat (1) @(posedge wb_clk);
8286
      repeat (10) @(posedge mtx_clk);
8287 209 tadejm
      // check length of a PACKET
8288
      tmp_len = eth_phy.tx_len;
8289
      #1;
8290
      if (tmp_len != (i_length + 4))
8291
      begin
8292
        test_fail("Wrong length of the packet out from MAC");
8293
        fail = fail + 1;
8294
      end
8295 279 mohor
 
8296
      // check transmitted TX packet data
8297
      if ((i_length + 4) == 100)
8298
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8299
      else if ((i_length + 4) <= max_tmp)
8300
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8301
      else
8302
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8303
 
8304 209 tadejm
      if (tmp > 0)
8305
      begin
8306
        test_fail("Wrong data of the transmitted packet");
8307
        fail = fail + 1;
8308
      end
8309 279 mohor
 
8310 209 tadejm
      // check transmited TX packet CRC
8311 279 mohor
      if ((i_length + 4) == 100)
8312
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8313
      else if ((i_length + 4) <= max_tmp)
8314
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8315
 
8316 209 tadejm
      if (tmp > 0)
8317
      begin
8318
        test_fail("Wrong CRC of the transmitted packet");
8319
        fail = fail + 1;
8320
      end
8321 279 mohor
 
8322 209 tadejm
      if (wb_int !== 1'b1)
8323
      begin
8324
        `TIME; $display("*E WB INT signal should be set");
8325
        test_fail("WB INT signal should be set");
8326
        fail = fail + 1;
8327
      end
8328 279 mohor
 
8329 209 tadejm
      check_tx_bd(num_of_bd, data);
8330
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8331
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8332
      begin
8333
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8334
        test_fail("TX buffer descriptor status is not correct");
8335
        fail = fail + 1;
8336
      end
8337 279 mohor
 
8338 209 tadejm
      // check interrupts
8339 274 tadejm
      wait (wbm_working == 0);
8340 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8341 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8342 209 tadejm
      begin
8343
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8344
        test_fail("Interrupt Transmit Buffer was not set");
8345
        fail = fail + 1;
8346
      end
8347
      if ((data & (~`ETH_INT_TXB)) !== 0)
8348
      begin
8349
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8350
        test_fail("Other interrupts (except Transmit Buffer) were set");
8351
        fail = fail + 1;
8352
      end
8353 279 mohor
 
8354 209 tadejm
      // clear interrupts
8355 274 tadejm
      wait (wbm_working == 0);
8356 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8357
      // check WB INT signal
8358
      if (wb_int !== 1'b0)
8359
      begin
8360
        test_fail("WB INT signal should not be set");
8361
        fail = fail + 1;
8362
      end
8363 279 mohor
 
8364 209 tadejm
      // INTERMEDIATE DISPLAYS
8365
      if (num_of_bd == 0)
8366
        $display("    ->packet with length %0d sent", (i_length + 4));
8367
      else if (num_of_bd == 1)
8368
        $display("    ->packet with length %0d sent", (i_length + 4));
8369
      else if (num_of_bd == 2)
8370
        $display("    ->packet with length %0d sent", (i_length + 4));
8371 279 mohor
      else if (num_of_bd == 3)
8372
        $display("    ->packet with length %0d sent", (104));
8373 209 tadejm
      // set length (loop variable)
8374
      i_length = i_length + 1;
8375
      // the number of frame transmitted
8376
      num_of_frames = num_of_frames + 1;
8377
      num_of_bd = num_of_bd + 1;
8378
      @(posedge wb_clk);
8379
    end
8380
    // disable TX
8381 274 tadejm
    wait (wbm_working == 0);
8382 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8383
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8384
    @(posedge wb_clk);
8385
    if(fail == 0)
8386
      test_ok;
8387
    else
8388
      fail = 0;
8389
  end
8390
 
8391
 
8392 279 mohor
 
8393
 
8394 209 tadejm
  ////////////////////////////////////////////////////////////////////
8395
  ////                                                            ////
8396
  ////  Test transmit packets across changed MAXFL value at       ////
8397
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8398
  ////                                                            ////
8399
  ////////////////////////////////////////////////////////////////////
8400
  if (test_num == 12) // without and with padding
8401
  begin
8402
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8403
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8404
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8405
 
8406
    // reset MAC registers
8407
    hard_reset;
8408
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8409
 
8410
    max_tmp = 0;
8411
    min_tmp = 0;
8412
    num_of_frames = 0;
8413
    num_of_bd = 0;
8414
    // set 47 TX buffer descriptors - must be set before TX enable
8415 274 tadejm
    wait (wbm_working == 0);
8416 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8417
    // prepare a packet of MAXFL + 10 length
8418 274 tadejm
    wait (wbm_working == 0);
8419 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8420
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8421
    min_tmp = tmp[31:16];
8422
    // change MAXFL value
8423
    max_tmp = min_tmp + 53;
8424 274 tadejm
    wait (wbm_working == 0);
8425 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8426
    st_data = 8'h62;
8427
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8428 274 tadejm
    wait (wbm_working == 0);
8429 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8430
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8431
    // check WB INT signal
8432
    if (wb_int !== 1'b0)
8433
    begin
8434
      test_fail("WB INT signal should not be set");
8435
      fail = fail + 1;
8436
    end
8437
 
8438
    // write to phy's control register for 10Mbps
8439
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8440
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8441
    speed = 10;
8442
 
8443
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8444
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8445
    begin
8446 274 tadejm
      wait (wbm_working == 0);
8447 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8448
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8449
      // not detect carrier sense in FD and no collision
8450
      eth_phy.carrier_sense_tx_fd_detect(0);
8451
      eth_phy.collision(0);
8452
      // first destination address on ethernet PHY
8453
      eth_phy.set_tx_mem_addr(0);
8454
      // prepare BDs
8455
      if (num_of_bd == 0)
8456
      begin
8457
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8458
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8459
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8460
        set_tx_bd_wrap(2);
8461
        set_tx_bd_ready(0, 0);
8462
      end
8463
      else if (num_of_bd == 1)
8464
        set_tx_bd_ready(1, 1);
8465
      else if (num_of_bd == 2)
8466
        set_tx_bd_ready(2, 2);
8467
      // CHECK END OF TRANSMITION
8468
      check_tx_bd(num_of_bd, data);
8469
        wait (MTxEn === 1'b1); // start transmit
8470
      check_tx_bd(num_of_bd, data);
8471
        if (data[15] !== 1)
8472
        begin
8473
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8474
          fail = fail + 1;
8475
        end
8476
        wait (MTxEn === 1'b0); // end transmit
8477
        while (data[15] === 1)
8478
        begin
8479
      check_tx_bd(num_of_bd, data);
8480
          @(posedge wb_clk);
8481
        end
8482 279 mohor
        repeat (5) @(posedge mtx_clk);
8483 209 tadejm
      // check length of a PACKET
8484
      tmp_len = eth_phy.tx_len;
8485
      #1;
8486
      if (tmp_len != (i_length + 4))
8487
      begin
8488
        test_fail("Wrong length of the packet out from MAC");
8489
        fail = fail + 1;
8490
      end
8491
      // checking packet
8492
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8493
      if (tmp > 0)
8494
      begin
8495
        test_fail("Wrong data of the transmitted packet");
8496
        fail = fail + 1;
8497
      end
8498
      // check transmited TX packet CRC
8499 279 mohor
      if (num_of_bd !== 2)
8500
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8501 209 tadejm
      if (tmp > 0)
8502
      begin
8503
        test_fail("Wrong CRC of the transmitted packet");
8504
        fail = fail + 1;
8505
      end
8506
      // check WB INT signal
8507
      if (wb_int !== 1'b1)
8508
      begin
8509
        `TIME; $display("*E WB INT signal should be set");
8510
        test_fail("WB INT signal should be set");
8511
        fail = fail + 1;
8512
      end
8513
      // check TX buffer descriptor of a packet
8514
      check_tx_bd(num_of_bd, data);
8515
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8516
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8517
      begin
8518
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8519
        test_fail("TX buffer descriptor status is not correct");
8520
        fail = fail + 1;
8521
      end
8522
      // check interrupts
8523 274 tadejm
      wait (wbm_working == 0);
8524 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8525
      if ((data & `ETH_INT_TXB) !== 1'b1)
8526
      begin
8527
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8528
        test_fail("Interrupt Transmit Buffer was not set");
8529
        fail = fail + 1;
8530
      end
8531
      if ((data & (~`ETH_INT_TXB)) !== 0)
8532
      begin
8533
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8534
        test_fail("Other interrupts (except Transmit Buffer) were set");
8535
        fail = fail + 1;
8536
      end
8537
      // clear interrupts
8538 274 tadejm
      wait (wbm_working == 0);
8539 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8540
      // check WB INT signal
8541
      if (wb_int !== 1'b0)
8542
      begin
8543
        test_fail("WB INT signal should not be set");
8544
        fail = fail + 1;
8545
      end
8546
      // INTERMEDIATE DISPLAYS
8547
      if (num_of_bd == 0)
8548
        $display("    ->packet with length %0d sent", (i_length + 4));
8549
      else if (num_of_bd == 1)
8550
        $display("    ->packet with length %0d sent", (i_length + 4));
8551
      else if (num_of_bd == 2)
8552
        $display("    ->packet with length %0d sent", (i_length + 4));
8553
      // set length (loop variable)
8554
      i_length = i_length + 1;
8555
      // the number of frame transmitted
8556
      num_of_frames = num_of_frames + 1;
8557
      num_of_bd = num_of_bd + 1;
8558
      @(posedge wb_clk);
8559
    end
8560
    // disable TX
8561 274 tadejm
    wait (wbm_working == 0);
8562 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8563
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8564
    @(posedge wb_clk);
8565
    if(fail == 0)
8566
      test_ok;
8567
    else
8568
      fail = 0;
8569
  end
8570
 
8571
 
8572
  ////////////////////////////////////////////////////////////////////
8573
  ////                                                            ////
8574
  ////  Test transmit packets across changed MAXFL value at       ////
8575
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8576
  ////                                                            ////
8577
  ////////////////////////////////////////////////////////////////////
8578
  if (test_num == 13) // without and with padding
8579
  begin
8580
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8581
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8582
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8583
 
8584
    // reset MAC registers
8585
    hard_reset;
8586
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8587
 
8588
    max_tmp = 0;
8589
    min_tmp = 0;
8590
    num_of_frames = 0;
8591
    num_of_bd = 0;
8592
    // set 47 TX buffer descriptors - must be set before TX enable
8593 274 tadejm
    wait (wbm_working == 0);
8594 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8595
    // prepare a packet of MAXFL + 10 length
8596 274 tadejm
    wait (wbm_working == 0);
8597 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8598
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8599
    min_tmp = tmp[31:16];
8600
    // change MAXFL value
8601
    max_tmp = min_tmp + 53;
8602 274 tadejm
    wait (wbm_working == 0);
8603 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8604
    st_data = 8'h62;
8605
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8606 274 tadejm
    wait (wbm_working == 0);
8607 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8608
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8609
    // check WB INT signal
8610
    if (wb_int !== 1'b0)
8611
    begin
8612
      test_fail("WB INT signal should not be set");
8613
      fail = fail + 1;
8614
    end
8615
 
8616 279 mohor
    // write to phy's control register for 10Mbps
8617
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8618
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8619 209 tadejm
    speed = 100;
8620
 
8621
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8622
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8623
    begin
8624 274 tadejm
      wait (wbm_working == 0);
8625 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8626
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8627
      // not detect carrier sense in FD and no collision
8628
      eth_phy.carrier_sense_tx_fd_detect(0);
8629
      eth_phy.collision(0);
8630
      // first destination address on ethernet PHY
8631
      eth_phy.set_tx_mem_addr(0);
8632
      // prepare BDs
8633
      if (num_of_bd == 0)
8634
      begin
8635
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8636
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8637
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8638
        set_tx_bd_wrap(2);
8639
        set_tx_bd_ready(0, 0);
8640
      end
8641
      else if (num_of_bd == 1)
8642
        set_tx_bd_ready(1, 1);
8643
      else if (num_of_bd == 2)
8644
        set_tx_bd_ready(2, 2);
8645
      // CHECK END OF TRANSMITION
8646
      check_tx_bd(num_of_bd, data);
8647
        wait (MTxEn === 1'b1); // start transmit
8648
      check_tx_bd(num_of_bd, data);
8649
        if (data[15] !== 1)
8650
        begin
8651
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8652
          fail = fail + 1;
8653
        end
8654
        wait (MTxEn === 1'b0); // end transmit
8655
        while (data[15] === 1)
8656
        begin
8657
      check_tx_bd(num_of_bd, data);
8658
          @(posedge wb_clk);
8659
        end
8660 279 mohor
        repeat (5) @(posedge mtx_clk);
8661 209 tadejm
      // check length of a PACKET
8662
      tmp_len = eth_phy.tx_len;
8663
      #1;
8664
      if (tmp_len != (i_length + 4))
8665
      begin
8666
        test_fail("Wrong length of the packet out from MAC");
8667
        fail = fail + 1;
8668
      end
8669
      // checking packet
8670
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8671
      if (tmp > 0)
8672
      begin
8673
        test_fail("Wrong data of the transmitted packet");
8674
        fail = fail + 1;
8675
      end
8676
      // check transmited TX packet CRC
8677 279 mohor
      if (num_of_bd !== 2)
8678
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8679 209 tadejm
      if (tmp > 0)
8680
      begin
8681
        test_fail("Wrong CRC of the transmitted packet");
8682
        fail = fail + 1;
8683
      end
8684
      // check WB INT signal
8685
      if (wb_int !== 1'b1)
8686
      begin
8687
        `TIME; $display("*E WB INT signal should be set");
8688
        test_fail("WB INT signal should be set");
8689
        fail = fail + 1;
8690
      end
8691
      // check TX buffer descriptor of a packet
8692
      check_tx_bd(num_of_bd, data);
8693
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8694
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8695
      begin
8696
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8697
        test_fail("TX buffer descriptor status is not correct");
8698
        fail = fail + 1;
8699
      end
8700
      // check interrupts
8701 274 tadejm
      wait (wbm_working == 0);
8702 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8703
      if ((data & `ETH_INT_TXB) !== 1'b1)
8704
      begin
8705
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8706
        test_fail("Interrupt Transmit Buffer was not set");
8707
        fail = fail + 1;
8708
      end
8709
      if ((data & (~`ETH_INT_TXB)) !== 0)
8710
      begin
8711
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8712
        test_fail("Other interrupts (except Transmit Buffer) were set");
8713
        fail = fail + 1;
8714
      end
8715
      // clear interrupts
8716 274 tadejm
      wait (wbm_working == 0);
8717 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8718
      // check WB INT signal
8719
      if (wb_int !== 1'b0)
8720
      begin
8721
        test_fail("WB INT signal should not be set");
8722
        fail = fail + 1;
8723
      end
8724
      // INTERMEDIATE DISPLAYS
8725
      if (num_of_bd == 0)
8726
        $display("    ->packet with length %0d sent", (i_length + 4));
8727
      else if (num_of_bd == 1)
8728
        $display("    ->packet with length %0d sent", (i_length + 4));
8729
      else if (num_of_bd == 2)
8730
        $display("    ->packet with length %0d sent", (i_length + 4));
8731
      // set length (loop variable)
8732
      i_length = i_length + 1;
8733
      // the number of frame transmitted
8734
      num_of_frames = num_of_frames + 1;
8735
      num_of_bd = num_of_bd + 1;
8736
      @(posedge wb_clk);
8737
    end
8738
    // disable TX
8739 274 tadejm
    wait (wbm_working == 0);
8740 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8741
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8742
    @(posedge wb_clk);
8743
    if(fail == 0)
8744
      test_ok;
8745
    else
8746
      fail = 0;
8747
  end
8748
 
8749
 
8750
  ////////////////////////////////////////////////////////////////////
8751
  ////                                                            ////
8752
  ////  Test transmit packets across changed MINFL value at       ////
8753
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8754
  ////                                                            ////
8755
  ////////////////////////////////////////////////////////////////////
8756
  if (test_num == 14) // without and with padding
8757
  begin
8758
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8759
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8760
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8761
 
8762
    // reset MAC registers
8763
    hard_reset;
8764 279 mohor
 
8765 209 tadejm
    // set wb slave response
8766
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8767
 
8768
    max_tmp = 0;
8769
    min_tmp = 0;
8770
    num_of_frames = 0;
8771
    num_of_bd = 0;
8772
    // set 7 TX buffer descriptors - must be set before TX enable
8773 274 tadejm
    wait (wbm_working == 0);
8774 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8775
    // prepare a packet of MAXFL + 10 length
8776 274 tadejm
    wait (wbm_working == 0);
8777 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8778
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8779
    min_tmp = tmp[31:16];
8780 279 mohor
 
8781 209 tadejm
    // change MINFL value
8782
    min_tmp = max_tmp - 177;
8783 274 tadejm
    wait (wbm_working == 0);
8784 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8785
    st_data = 8'h62;
8786
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8787
    // enable TX, set full-duplex mode, padding and CRC appending
8788 274 tadejm
    wait (wbm_working == 0);
8789 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8790
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8791
    // check WB INT signal
8792
    if (wb_int !== 1'b0)
8793
    begin
8794
      test_fail("WB INT signal should not be set");
8795
      fail = fail + 1;
8796
    end
8797
 
8798
    // write to phy's control register for 10Mbps
8799
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8800
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8801
    speed = 10;
8802
 
8803
    i_length = (min_tmp - 5);
8804
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8805
    begin
8806
      // Reset_tx_bd nable interrupt generation
8807
      // unmask interrupts
8808 274 tadejm
      wait (wbm_working == 0);
8809 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8810
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8811
      // not detect carrier sense in FD and no collision
8812
      eth_phy.carrier_sense_tx_fd_detect(0);
8813
      eth_phy.collision(0);
8814
      // first destination address on ethernet PHY
8815
      eth_phy.set_tx_mem_addr(0);
8816
      // prepare BDs
8817
      if (num_of_bd == 0)
8818
      begin
8819
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8820
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8821
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8822
        set_tx_bd_wrap(2);
8823
        set_tx_bd_ready(0, 0);
8824
      end
8825
      else if (num_of_bd == 1)
8826
        set_tx_bd_ready(1, 1);
8827
      else if (num_of_bd == 2)
8828
        set_tx_bd_ready(2, 2);
8829
      // CHECK END OF TRANSMITION
8830
      check_tx_bd(num_of_bd, data);
8831
        wait (MTxEn === 1'b1); // start transmit
8832
      check_tx_bd(num_of_bd, data);
8833
        if (data[15] !== 1)
8834
        begin
8835
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8836
          fail = fail + 1;
8837
        end
8838
        wait (MTxEn === 1'b0); // end transmit
8839
        while (data[15] === 1)
8840
        begin
8841
      check_tx_bd(num_of_bd, data);
8842
          @(posedge wb_clk);
8843
        end
8844
        repeat (1) @(posedge wb_clk);
8845
      // check length of a PACKET
8846
      tmp_len = eth_phy.tx_len;
8847
      #1;
8848
      if (tmp_len != (i_length + 4))
8849
      begin
8850
        test_fail("Wrong length of the packet out from MAC");
8851
        fail = fail + 1;
8852
      end
8853
      // checking packet
8854
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8855
      if (tmp > 0)
8856
      begin
8857
        test_fail("Wrong data of the transmitted packet");
8858
        fail = fail + 1;
8859
      end
8860
      // check transmited TX packet CRC
8861 279 mohor
      if (num_of_bd !== 0)  // First packet is padded and CRC does not match.
8862
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8863
      else
8864
        tmp = 0;
8865 209 tadejm
      if (tmp > 0)
8866
      begin
8867
        test_fail("Wrong CRC of the transmitted packet");
8868
        fail = fail + 1;
8869
      end
8870
      // check WB INT signal
8871
      if (wb_int !== 1'b1)
8872
      begin
8873
        `TIME; $display("*E WB INT signal should be set");
8874
        test_fail("WB INT signal should be set");
8875
        fail = fail + 1;
8876
      end
8877
      // check TX buffer descriptor of a packet
8878
      check_tx_bd(num_of_bd, data);
8879
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8880
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8881
      begin
8882
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8883
        test_fail("TX buffer descriptor status is not correct");
8884
        fail = fail + 1;
8885
      end
8886
      // check interrupts
8887 274 tadejm
      wait (wbm_working == 0);
8888 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8889
      if ((data & `ETH_INT_TXB) !== 1'b1)
8890
      begin
8891
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8892
        test_fail("Interrupt Transmit Buffer was not set");
8893
        fail = fail + 1;
8894
      end
8895
      if ((data & (~`ETH_INT_TXB)) !== 0)
8896
      begin
8897
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8898
        test_fail("Other interrupts (except Transmit Buffer) were set");
8899
        fail = fail + 1;
8900
      end
8901
      // clear interrupts
8902 274 tadejm
      wait (wbm_working == 0);
8903 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8904
      // check WB INT signal
8905
      if (wb_int !== 1'b0)
8906
      begin
8907
        test_fail("WB INT signal should not be set");
8908
        fail = fail + 1;
8909
      end
8910
      // INTERMEDIATE DISPLAYS
8911
      if (num_of_bd == 0)
8912
        $display("    ->packet with length %0d sent", (i_length + 4));
8913
      else if (num_of_bd == 1)
8914
        $display("    ->packet with length %0d sent", (i_length + 4));
8915
      else if (num_of_bd == 2)
8916
        $display("    ->packet with length %0d sent", (i_length + 4));
8917
      // set length (loop variable)
8918
      i_length = i_length + 1;
8919
      // the number of frame transmitted
8920
      num_of_frames = num_of_frames + 1;
8921
      num_of_bd = num_of_bd + 1;
8922
      @(posedge wb_clk);
8923
    end
8924
    // disable TX
8925 274 tadejm
    wait (wbm_working == 0);
8926 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8927
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8928
    @(posedge wb_clk);
8929
    if(fail == 0)
8930
      test_ok;
8931
    else
8932
      fail = 0;
8933
  end
8934
 
8935
 
8936
  ////////////////////////////////////////////////////////////////////
8937
  ////                                                            ////
8938
  ////  Test transmit packets across changed MINFL value at       ////
8939
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
8940
  ////                                                            ////
8941
  ////////////////////////////////////////////////////////////////////
8942
  if (test_num == 15) // without and with padding
8943
  begin
8944
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
8945
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
8946
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
8947
 
8948
    hard_reset;
8949 279 mohor
 
8950 209 tadejm
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8951
 
8952
    max_tmp = 0;
8953
    min_tmp = 0;
8954
    num_of_frames = 0;
8955
    num_of_bd = 0;
8956
    // set 7 TX buffer descriptors - must be set before TX enable
8957 274 tadejm
    wait (wbm_working == 0);
8958 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8959
    // prepare a packet of MAXFL + 10 length
8960 274 tadejm
    wait (wbm_working == 0);
8961 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8962
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8963
    min_tmp = tmp[31:16];
8964
    // change MINFL value
8965
    min_tmp = max_tmp - 177;
8966 274 tadejm
    wait (wbm_working == 0);
8967 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8968
    st_data = 8'h62;
8969
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8970
    // enable TX, set full-duplex mode, padding and CRC appending
8971 274 tadejm
    wait (wbm_working == 0);
8972 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8973
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8974
    // check WB INT signal
8975
    if (wb_int !== 1'b0)
8976
    begin
8977
      test_fail("WB INT signal should not be set");
8978
      fail = fail + 1;
8979
    end
8980
 
8981
    // write to phy's control register for 100Mbps
8982
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8983
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8984
    speed = 100;
8985
 
8986
    i_length = (min_tmp - 5);
8987
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8988
    begin
8989
      // Reset_tx_bd nable interrupt generation
8990
      // unmask interrupts
8991 274 tadejm
      wait (wbm_working == 0);
8992 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8993
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8994
      // not detect carrier sense in FD and no collision
8995
      eth_phy.carrier_sense_tx_fd_detect(0);
8996
      eth_phy.collision(0);
8997
      // first destination address on ethernet PHY
8998
      eth_phy.set_tx_mem_addr(0);
8999
      // prepare BDs
9000
      if (num_of_bd == 0)
9001
      begin
9002
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9003
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9004
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9005
        set_tx_bd_wrap(2);
9006
        set_tx_bd_ready(0, 0);
9007
      end
9008
      else if (num_of_bd == 1)
9009
        set_tx_bd_ready(1, 1);
9010
      else if (num_of_bd == 2)
9011
        set_tx_bd_ready(2, 2);
9012
      // CHECK END OF TRANSMITION
9013
      check_tx_bd(num_of_bd, data);
9014
        wait (MTxEn === 1'b1); // start transmit
9015
      check_tx_bd(num_of_bd, data);
9016
        if (data[15] !== 1)
9017
        begin
9018
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9019
          fail = fail + 1;
9020
        end
9021
        wait (MTxEn === 1'b0); // end transmit
9022
        while (data[15] === 1)
9023
        begin
9024
      check_tx_bd(num_of_bd, data);
9025
          @(posedge wb_clk);
9026
        end
9027
        repeat (1) @(posedge wb_clk);
9028
      // check length of a PACKET
9029
      tmp_len = eth_phy.tx_len;
9030
      #1;
9031
      if (tmp_len != (i_length + 4))
9032
      begin
9033
        test_fail("Wrong length of the packet out from MAC");
9034
        fail = fail + 1;
9035
      end
9036
      // checking packet
9037
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9038
      if (tmp > 0)
9039
      begin
9040
        test_fail("Wrong data of the transmitted packet");
9041
        fail = fail + 1;
9042
      end
9043
      // check transmited TX packet CRC
9044 279 mohor
      if (num_of_bd !== 0)
9045
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9046
      else
9047
        tmp = 0;
9048
 
9049 209 tadejm
      if (tmp > 0)
9050
      begin
9051
        test_fail("Wrong CRC of the transmitted packet");
9052
        fail = fail + 1;
9053
      end
9054
      // check WB INT signal
9055
      if (wb_int !== 1'b1)
9056
      begin
9057
        `TIME; $display("*E WB INT signal should be set");
9058
        test_fail("WB INT signal should be set");
9059
        fail = fail + 1;
9060
      end
9061
      // check TX buffer descriptor of a packet
9062
      check_tx_bd(num_of_bd, data);
9063
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
9064
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
9065
      begin
9066
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9067
        test_fail("TX buffer descriptor status is not correct");
9068
        fail = fail + 1;
9069
      end
9070
      // check interrupts
9071 274 tadejm
      wait (wbm_working == 0);
9072 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9073
      if ((data & `ETH_INT_TXB) !== 1'b1)
9074
      begin
9075
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9076
        test_fail("Interrupt Transmit Buffer was not set");
9077
        fail = fail + 1;
9078
      end
9079
      if ((data & (~`ETH_INT_TXB)) !== 0)
9080
      begin
9081
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9082
        test_fail("Other interrupts (except Transmit Buffer) were set");
9083
        fail = fail + 1;
9084
      end
9085
      // clear interrupts
9086 274 tadejm
      wait (wbm_working == 0);
9087 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9088
      // check WB INT signal
9089
      if (wb_int !== 1'b0)
9090
      begin
9091
        test_fail("WB INT signal should not be set");
9092
        fail = fail + 1;
9093
      end
9094
      // INTERMEDIATE DISPLAYS
9095
      if (num_of_bd == 0)
9096
        $display("    ->packet with length %0d sent", (i_length + 4));
9097
      else if (num_of_bd == 1)
9098
        $display("    ->packet with length %0d sent", (i_length + 4));
9099
      else if (num_of_bd == 2)
9100
        $display("    ->packet with length %0d sent", (i_length + 4));
9101
      // set length (loop variable)
9102
      i_length = i_length + 1;
9103
      // the number of frame transmitted
9104
      num_of_frames = num_of_frames + 1;
9105
      num_of_bd = num_of_bd + 1;
9106
      @(posedge wb_clk);
9107
    end
9108
    // disable TX
9109 274 tadejm
    wait (wbm_working == 0);
9110 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9111
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9112
    @(posedge wb_clk);
9113
    if(fail == 0)
9114
      test_ok;
9115
    else
9116
      fail = 0;
9117
  end
9118
 
9119
 
9120
  ////////////////////////////////////////////////////////////////////
9121
  ////                                                            ////
9122
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9123
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
9124
  ////                                                            ////
9125
  ////////////////////////////////////////////////////////////////////
9126
  if (test_num == 16) // without and with padding
9127
  begin
9128
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
9129
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
9130
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
9131
 
9132
    // reset MAC registers
9133
    hard_reset;
9134
    // reset MAC and MII LOGIC with soft reset
9135 274 tadejm
//    reset_mac;
9136
//    reset_mii;
9137 209 tadejm
    // set wb slave response
9138
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9139
 
9140
    max_tmp = 0;
9141
    min_tmp = 0;
9142
    num_of_frames = 0;
9143
    num_of_bd = 0;
9144
    // set 19 TX buffer descriptors - must be set before TX enable
9145 274 tadejm
    wait (wbm_working == 0);
9146 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9147
    // prepare a packet of 64k - 1 length (16'hFFFF)
9148 274 tadejm
    wait (wbm_working == 0);
9149 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9150
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9151
    min_tmp = tmp[31:16];
9152
    st_data = 8'h8D;
9153
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9154
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9155 274 tadejm
    wait (wbm_working == 0);
9156 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9157
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9158
    // check WB INT signal
9159
    if (wb_int !== 1'b0)
9160
    begin
9161
      test_fail("WB INT signal should not be set");
9162
      fail = fail + 1;
9163
    end
9164
 
9165
    // write to phy's control register for 10Mbps
9166
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9167
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9168
    speed = 10;
9169
 
9170
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9171
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9172
    begin
9173
      $display("   i_length = %0d", i_length);
9174
      // Reset_tx_bd nable interrupt generation
9175
      // unmask interrupts
9176 274 tadejm
      wait (wbm_working == 0);
9177 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9178
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9179
      // not detect carrier sense in FD and no collision
9180
      eth_phy.carrier_sense_tx_fd_detect(0);
9181
      eth_phy.collision(0);
9182
      // first destination address on ethernet PHY
9183
      eth_phy.set_tx_mem_addr(0);
9184
      // prepare BDs
9185
      if (num_of_bd == 0)
9186
      begin
9187
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9188
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9189
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9190
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9191
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9192
        set_tx_bd_wrap(4);
9193
        set_tx_bd_ready(0, 0);
9194
      end
9195
      else if (num_of_bd == 1)
9196
        set_tx_bd_ready(1, 1);
9197
      else if (num_of_bd == 2)
9198
        set_tx_bd_ready(2, 2);
9199
      else if (num_of_bd == 3)
9200
        set_tx_bd_ready(3, 3);
9201
      else if (num_of_bd == 4)
9202
        set_tx_bd_ready(4, 4);
9203
      // CHECK END OF TRANSMITION
9204
      check_tx_bd(num_of_bd, data);
9205
        wait (MTxEn === 1'b1); // start transmit
9206
      check_tx_bd(num_of_bd, data);
9207
        if (data[15] !== 1)
9208
        begin
9209
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9210
          fail = fail + 1;
9211
        end
9212
        wait (MTxEn === 1'b0); // end transmit
9213
        while (data[15] === 1)
9214
        begin
9215
      check_tx_bd(num_of_bd, data);
9216
          @(posedge wb_clk);
9217
        end
9218
        repeat (1) @(posedge wb_clk);
9219
      // check length of a PACKET
9220
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9221
      tmp_len = eth_phy.tx_len;
9222
      #1;
9223
      if (tmp_len != (i_length + 4))
9224
      begin
9225
        test_fail("Wrong length of the packet out from MAC");
9226
        fail = fail + 1;
9227
      end
9228
      // checking packet
9229
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9230
      if (tmp > 0)
9231
      begin
9232
        test_fail("Wrong data of the transmitted packet");
9233
        fail = fail + 1;
9234
      end
9235
      // check transmited TX packet CRC
9236
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9237
      if (tmp > 0)
9238
      begin
9239
        test_fail("Wrong CRC of the transmitted packet");
9240
        fail = fail + 1;
9241
      end
9242
      // check WB INT signal
9243
      if (wb_int !== 1'b1)
9244
      begin
9245
        `TIME; $display("*E WB INT signal should be set");
9246
        test_fail("WB INT signal should be set");
9247
        fail = fail + 1;
9248
      end
9249
      // check TX buffer descriptor of a packet
9250
      check_tx_bd(num_of_bd, data);
9251
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9252
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9253
      begin
9254
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9255
        test_fail("TX buffer descriptor status is not correct");
9256
        fail = fail + 1;
9257
      end
9258
      // check interrupts
9259 274 tadejm
      wait (wbm_working == 0);
9260 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9261
      if ((data & `ETH_INT_TXB) !== 1'b1)
9262
      begin
9263
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9264
        test_fail("Interrupt Transmit Buffer was not set");
9265
        fail = fail + 1;
9266
      end
9267
      if ((data & (~`ETH_INT_TXB)) !== 0)
9268
      begin
9269
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9270
        test_fail("Other interrupts (except Transmit Buffer) were set");
9271
        fail = fail + 1;
9272
      end
9273
      // clear interrupts
9274 274 tadejm
      wait (wbm_working == 0);
9275 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9276
      // check WB INT signal
9277
      if (wb_int !== 1'b0)
9278
      begin
9279
        test_fail("WB INT signal should not be set");
9280
        fail = fail + 1;
9281
      end
9282
      // INTERMEDIATE DISPLAYS
9283
      $display("    ->packet with length %0d sent", (i_length + 4));
9284
      // set length (loop variable)
9285
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9286
        i_length = i_length + 1;
9287
      else if (num_of_bd == 2)
9288
        i_length = (16'hFFFF - 5);
9289
      // the number of frame transmitted
9290
      num_of_frames = num_of_frames + 1;
9291
      num_of_bd = num_of_bd + 1;
9292
      @(posedge wb_clk);
9293
    end
9294
    // disable TX
9295 274 tadejm
    wait (wbm_working == 0);
9296 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9297
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9298
    @(posedge wb_clk);
9299
    if(fail == 0)
9300
      test_ok;
9301
    else
9302
      fail = 0;
9303
  end
9304
 
9305
 
9306
  ////////////////////////////////////////////////////////////////////
9307
  ////                                                            ////
9308
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9309
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9310
  ////                                                            ////
9311
  ////////////////////////////////////////////////////////////////////
9312
  if (test_num == 17) // without and with padding
9313
  begin
9314
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9315
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9316
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9317
 
9318
    // reset MAC registers
9319
    hard_reset;
9320
    // reset MAC and MII LOGIC with soft reset
9321 274 tadejm
//    reset_mac;
9322
//    reset_mii;
9323 209 tadejm
    // set wb slave response
9324
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9325
 
9326
    max_tmp = 0;
9327
    min_tmp = 0;
9328
    num_of_frames = 0;
9329
    num_of_bd = 0;
9330
    // set 19 TX buffer descriptors - must be set before TX enable
9331 274 tadejm
    wait (wbm_working == 0);
9332 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9333
    // prepare a packet of 64k - 1 length (16'hFFFF)
9334 274 tadejm
    wait (wbm_working == 0);
9335 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9336
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9337
    min_tmp = tmp[31:16];
9338
    st_data = 8'h8D;
9339
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9340
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9341 274 tadejm
    wait (wbm_working == 0);
9342 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9343
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9344
    // check WB INT signal
9345
    if (wb_int !== 1'b0)
9346
    begin
9347
      test_fail("WB INT signal should not be set");
9348
      fail = fail + 1;
9349
    end
9350
 
9351
    // write to phy's control register for 100Mbps
9352
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9353
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9354
    speed = 100;
9355
 
9356
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9357
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9358
    begin
9359
      $display("   i_length = %0d", i_length);
9360
      // Reset_tx_bd nable interrupt generation
9361
      // unmask interrupts
9362 274 tadejm
      wait (wbm_working == 0);
9363 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9364
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9365
      // not detect carrier sense in FD and no collision
9366
      eth_phy.carrier_sense_tx_fd_detect(0);
9367
      eth_phy.collision(0);
9368
      // first destination address on ethernet PHY
9369
      eth_phy.set_tx_mem_addr(0);
9370
      // prepare BDs
9371
      if (num_of_bd == 0)
9372
      begin
9373
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9374
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9375
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9376
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9377
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9378
        set_tx_bd_wrap(4);
9379
        set_tx_bd_ready(0, 0);
9380
      end
9381
      else if (num_of_bd == 1)
9382
        set_tx_bd_ready(1, 1);
9383
      else if (num_of_bd == 2)
9384
        set_tx_bd_ready(2, 2);
9385
      else if (num_of_bd == 3)
9386
        set_tx_bd_ready(3, 3);
9387
      else if (num_of_bd == 4)
9388
        set_tx_bd_ready(4, 4);
9389
      // CHECK END OF TRANSMITION
9390
      check_tx_bd(num_of_bd, data);
9391
        wait (MTxEn === 1'b1); // start transmit
9392
      check_tx_bd(num_of_bd, data);
9393
        if (data[15] !== 1)
9394
        begin
9395
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9396
          fail = fail + 1;
9397
        end
9398
        wait (MTxEn === 1'b0); // end transmit
9399
        while (data[15] === 1)
9400
        begin
9401
      check_tx_bd(num_of_bd, data);
9402
          @(posedge wb_clk);
9403
        end
9404
        repeat (1) @(posedge wb_clk);
9405
      // check length of a PACKET
9406
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9407
      tmp_len = eth_phy.tx_len;
9408
      #1;
9409
      if (tmp_len != (i_length + 4))
9410
      begin
9411
        test_fail("Wrong length of the packet out from MAC");
9412
        fail = fail + 1;
9413
      end
9414
      // checking packet
9415
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9416
      if (tmp > 0)
9417
      begin
9418
        test_fail("Wrong data of the transmitted packet");
9419
        fail = fail + 1;
9420
      end
9421
      // check transmited TX packet CRC
9422
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9423
      if (tmp > 0)
9424
      begin
9425
        test_fail("Wrong CRC of the transmitted packet");
9426
        fail = fail + 1;
9427
      end
9428
      // check WB INT signal
9429
      if (wb_int !== 1'b1)
9430
      begin
9431
        `TIME; $display("*E WB INT signal should be set");
9432
        test_fail("WB INT signal should be set");
9433
        fail = fail + 1;
9434
      end
9435
      // check TX buffer descriptor of a packet
9436
      check_tx_bd(num_of_bd, data);
9437
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9438
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9439
      begin
9440
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9441
        test_fail("TX buffer descriptor status is not correct");
9442
        fail = fail + 1;
9443
      end
9444
      // check interrupts
9445 274 tadejm
      wait (wbm_working == 0);
9446 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9447
      if ((data & `ETH_INT_TXB) !== 1'b1)
9448
      begin
9449
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9450
        test_fail("Interrupt Transmit Buffer was not set");
9451
        fail = fail + 1;
9452
      end
9453
      if ((data & (~`ETH_INT_TXB)) !== 0)
9454
      begin
9455
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9456
        test_fail("Other interrupts (except Transmit Buffer) were set");
9457
        fail = fail + 1;
9458
      end
9459
      // clear interrupts
9460 274 tadejm
      wait (wbm_working == 0);
9461 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9462
      // check WB INT signal
9463
      if (wb_int !== 1'b0)
9464
      begin
9465
        test_fail("WB INT signal should not be set");
9466
        fail = fail + 1;
9467
      end
9468
      // INTERMEDIATE DISPLAYS
9469
      $display("    ->packet with length %0d sent", (i_length + 4));
9470
      // set length (loop variable)
9471
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9472
        i_length = i_length + 1;
9473
      else if (num_of_bd == 2)
9474
        i_length = (16'hFFFF - 5);
9475
      // the number of frame transmitted
9476
      num_of_frames = num_of_frames + 1;
9477
      num_of_bd = num_of_bd + 1;
9478
      @(posedge wb_clk);
9479
    end
9480
    // disable TX
9481 274 tadejm
    wait (wbm_working == 0);
9482 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9483
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9484
    @(posedge wb_clk);
9485
    if(fail == 0)
9486
      test_ok;
9487
    else
9488
      fail = 0;
9489
  end
9490
 
9491
 
9492
  ////////////////////////////////////////////////////////////////////
9493
  ////                                                            ////
9494
  ////  Test IPG during Back-to-Back transmit at                  ////
9495
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9496
  ////                                                            ////
9497
  ////////////////////////////////////////////////////////////////////
9498
  if (test_num == 18) // without and with padding
9499
  begin
9500
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9501
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9502
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9503
 
9504
    // reset MAC registers
9505
    hard_reset;
9506
    // reset MAC and MII LOGIC with soft reset
9507 274 tadejm
//    reset_mac;
9508
//    reset_mii;
9509 209 tadejm
    // set wb slave response
9510
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9511
 
9512
    max_tmp = 0;
9513
    min_tmp = 0;
9514
    num_of_frames = 0;
9515
    num_of_bd = 0;
9516
    tmp_ipgt = 0;
9517
    // set 88 TX buffer descriptors - must be set before TX enable
9518 274 tadejm
    wait (wbm_working == 0);
9519 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9520
    // enable TX, set full-duplex mode, NO padding and CRC appending
9521 274 tadejm
    wait (wbm_working == 0);
9522 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9523
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9524
    // prepare two packets of MAXFL length
9525 274 tadejm
    wait (wbm_working == 0);
9526 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9527
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9528
    min_tmp = tmp[31:16];
9529
    st_data = 8'h29;
9530
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9531
    // check WB INT signal
9532
    if (wb_int !== 1'b0)
9533
    begin
9534
      test_fail("WB INT signal should not be set");
9535
      fail = fail + 1;
9536
    end
9537
 
9538
    // write to phy's control register for 10Mbps
9539
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9540
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9541
    speed = 10;
9542
 
9543
    i_length = (min_tmp - 4);
9544
    while (i_length < (max_tmp - 4))
9545
    begin
9546
      // disable TX, set full-duplex mode, NO padding and CRC appending
9547 274 tadejm
      wait (wbm_working == 0);
9548 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9549
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9550
      // set IPGT register
9551 274 tadejm
      wait (wbm_working == 0);
9552 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9553
      // enable TX, set full-duplex mode, NO padding and CRC appending
9554 274 tadejm
      wait (wbm_working == 0);
9555 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9556
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9557
      // Reset_tx_bd enable interrupt generation
9558
      // unmask interrupts
9559 274 tadejm
      wait (wbm_working == 0);
9560 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9561
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9562
      // not detect carrier sense in FD and no collision
9563
      eth_phy.carrier_sense_tx_fd_detect(0);
9564
      eth_phy.collision(0);
9565
      // first destination address on ethernet PHY
9566
      eth_phy.set_tx_mem_addr(0);
9567
      // prepare BDs
9568
      if (num_of_bd == 0)
9569
      begin
9570
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9571
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9572
        set_tx_bd_wrap(1);
9573
        set_tx_bd_ready(0, 0);
9574
        set_tx_bd_ready(1, 1);
9575
      end
9576
      // CHECK END OF TWO TRANSMITIONs
9577
      // wait for first transmit to end
9578
      check_tx_bd(num_of_bd, data);
9579
      wait (MTxEn === 1'b1); // start transmit
9580
      if (data[15] !== 1)
9581
      begin
9582
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9583
        fail = fail + 1;
9584
      end
9585
      wait (MTxEn === 1'b0); // end transmit
9586
      num_of_frames = num_of_frames + 1;
9587
      num_of_bd = num_of_bd + 1;
9588
      #Tp;
9589
      // destination address on ethernet PHY
9590
      eth_phy.set_tx_mem_addr(0);
9591
      i1 = 0;
9592
      i2 = 0;
9593
      // count IPG clock periods
9594
      fork
9595
        begin
9596
          wait (MTxEn === 1'b1); // start second transmit
9597
          #Tp;
9598
          disable count_rising;
9599
          disable count_falling;
9600
        end
9601
        begin: count_rising
9602
          forever
9603
          begin
9604
            @(posedge mtx_clk);
9605
            i1 = i1 + 1;
9606
            #Tp;
9607
          end
9608
        end
9609
        begin: count_falling
9610
          forever
9611
          begin
9612
            @(negedge mtx_clk);
9613
            i2 = i2 + 1;
9614
            #Tp;
9615
          end
9616
        end
9617
      join
9618
      // check IPG length - INTERMEDIATE DISPLAYS
9619
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9620
      begin
9621
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9622
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9623
      end
9624
      else
9625
      begin
9626
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9627
        fail = fail + 1;
9628
        test_fail("IPG is not correct");
9629
      end
9630
      // wait for second transmit to end
9631
      wait (MTxEn === 1'b0); // end second transmit
9632
      while (data[15] === 1)
9633
      begin
9634
        check_tx_bd(num_of_bd, data);
9635
        @(posedge wb_clk);
9636
      end
9637
      repeat (1) @(posedge wb_clk);
9638
      // check length of a second PACKET
9639
      tmp_len = eth_phy.tx_len;
9640
      #1;
9641
      if (tmp_len != (i_length + 4 + 1))
9642
      begin
9643
        test_fail("Wrong length of second packet out from MAC");
9644
        fail = fail + 1;
9645
      end
9646
      // checking second packet
9647
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9648
      if (tmp > 0)
9649
      begin
9650
        test_fail("Wrong data of second transmitted packet");
9651
        fail = fail + 1;
9652
      end
9653
      // check second transmited TX packet CRC
9654
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9655
      if (tmp > 0)
9656
      begin
9657
        test_fail("Wrong CRC of second transmitted packet");
9658
        fail = fail + 1;
9659
      end
9660
      // check WB INT signal
9661
      if (wb_int !== 1'b1)
9662
      begin
9663
        `TIME; $display("*E WB INT signal should be set");
9664
        test_fail("WB INT signal should be set");
9665
        fail = fail + 1;
9666
      end
9667
      // check TX buffer descriptor of a packet
9668
      check_tx_bd(num_of_bd, data);
9669
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9670
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9671
      begin
9672
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9673
        test_fail("TX buffer descriptor status is not correct");
9674
        fail = fail + 1;
9675
      end
9676
      // check interrupts
9677 274 tadejm
      wait (wbm_working == 0);
9678 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9679
      if ((data & `ETH_INT_TXB) !== 1'b1)
9680
      begin
9681
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9682
        test_fail("Interrupt Transmit Buffer was not set");
9683
        fail = fail + 1;
9684
      end
9685
      if ((data & (~`ETH_INT_TXB)) !== 0)
9686
      begin
9687
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9688
        test_fail("Other interrupts (except Transmit Buffer) were set");
9689
        fail = fail + 1;
9690
      end
9691
      // clear interrupts
9692 274 tadejm
      wait (wbm_working == 0);
9693 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9694
      // check WB INT signal
9695
      if (wb_int !== 1'b0)
9696
      begin
9697
        test_fail("WB INT signal should not be set");
9698
        fail = fail + 1;
9699
      end
9700
      // set length (LOOP variable)
9701
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9702
        i_length = i_length + 2;
9703
      else
9704
        i_length = (max_tmp - 4);
9705
      // set IPGT
9706
      if ((tmp_ipgt + 3) < 10)
9707
        tmp_ipgt = tmp_ipgt + 1;
9708
      else if ((tmp_ipgt + 3) < 24)
9709
        tmp_ipgt = tmp_ipgt + 7;
9710
      else if ((tmp_ipgt + 3) == 24)
9711
        tmp_ipgt = 38 - 3;
9712
      else if ((tmp_ipgt + 3) == 38)
9713
        tmp_ipgt = 72 - 3;
9714
      else if ((tmp_ipgt + 3) == 72)
9715
        tmp_ipgt = 130 - 3; // 124 - 3
9716
      // the number of frame transmitted
9717
      num_of_frames = num_of_frames + 1;
9718
      num_of_bd = 0;
9719
      @(posedge wb_clk);
9720
    end
9721
    // disable TX
9722 274 tadejm
    wait (wbm_working == 0);
9723 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9724
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9725
    @(posedge wb_clk);
9726
    if(fail == 0)
9727
      test_ok;
9728
    else
9729
      fail = 0;
9730
  end
9731
 
9732
 
9733
  ////////////////////////////////////////////////////////////////////
9734
  ////                                                            ////
9735
  ////  Test IPG during Back-to-Back transmit at                  ////
9736
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9737
  ////                                                            ////
9738
  ////////////////////////////////////////////////////////////////////
9739
  if (test_num == 19) // without and with padding
9740
  begin
9741
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9742
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9743
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9744
 
9745
    // reset MAC registers
9746
    hard_reset;
9747
    // reset MAC and MII LOGIC with soft reset
9748 274 tadejm
//    reset_mac;
9749
//    reset_mii;
9750 209 tadejm
    // set wb slave response
9751
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9752
 
9753
    max_tmp = 0;
9754
    min_tmp = 0;
9755
    num_of_frames = 0;
9756
    num_of_bd = 0;
9757
    tmp_ipgt = 0;
9758
    // set 88 TX buffer descriptors - must be set before TX enable
9759 274 tadejm
    wait (wbm_working == 0);
9760 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9761
    // enable TX, set full-duplex mode, NO padding and CRC appending
9762 274 tadejm
    wait (wbm_working == 0);
9763 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9764
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9765
    // prepare two packets of MAXFL length
9766 274 tadejm
    wait (wbm_working == 0);
9767 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9768
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9769
    min_tmp = tmp[31:16];
9770
    st_data = 8'h29;
9771
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9772
    // check WB INT signal
9773
    if (wb_int !== 1'b0)
9774
    begin
9775
      test_fail("WB INT signal should not be set");
9776
      fail = fail + 1;
9777
    end
9778
 
9779
    // write to phy's control register for 100Mbps
9780
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9781
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9782
    speed = 100;
9783
 
9784
    i_length = (min_tmp - 4);
9785
    while (i_length < (max_tmp - 4))
9786
    begin
9787
      // disable TX, set full-duplex mode, NO padding and CRC appending
9788 274 tadejm
      wait (wbm_working == 0);
9789 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9790
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9791
      // set IPGT register
9792 274 tadejm
      wait (wbm_working == 0);
9793 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9794
      // enable TX, set full-duplex mode, NO padding and CRC appending
9795 274 tadejm
      wait (wbm_working == 0);
9796 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9797
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9798
      // Reset_tx_bd enable interrupt generation
9799
      // unmask interrupts
9800 274 tadejm
      wait (wbm_working == 0);
9801 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9802
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9803
      // not detect carrier sense in FD and no collision
9804
      eth_phy.carrier_sense_tx_fd_detect(0);
9805
      eth_phy.collision(0);
9806
      // first destination address on ethernet PHY
9807
      eth_phy.set_tx_mem_addr(0);
9808
      // prepare BDs
9809
      if (num_of_bd == 0)
9810
      begin
9811
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9812
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9813
        set_tx_bd_wrap(1);
9814
        set_tx_bd_ready(0, 0);
9815
        set_tx_bd_ready(1, 1);
9816
      end
9817
      // CHECK END OF TWO TRANSMITIONs
9818
      // wait for first transmit to end
9819
      check_tx_bd(num_of_bd, data);
9820
      wait (MTxEn === 1'b1); // start transmit
9821
      if (data[15] !== 1)
9822
      begin
9823
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9824
        fail = fail + 1;
9825
      end
9826
      wait (MTxEn === 1'b0); // end transmit
9827
      num_of_frames = num_of_frames + 1;
9828
      num_of_bd = num_of_bd + 1;
9829
      #Tp;
9830
      // destination address on ethernet PHY
9831
      eth_phy.set_tx_mem_addr(0);
9832
      i1 = 0;
9833
      i2 = 0;
9834
      // count IPG clock periods
9835
      fork
9836
        begin
9837
          wait (MTxEn === 1'b1); // start second transmit
9838
          #Tp;
9839
          disable count_rising1;
9840
          disable count_falling1;
9841
        end
9842
        begin: count_rising1
9843
          forever
9844
          begin
9845
            @(posedge mtx_clk);
9846
            i1 = i1 + 1;
9847
            #Tp;
9848
          end
9849
        end
9850
        begin: count_falling1
9851
          forever
9852
          begin
9853
            @(negedge mtx_clk);
9854
            i2 = i2 + 1;
9855
            #Tp;
9856
          end
9857
        end
9858
      join
9859
      // check IPG length - INTERMEDIATE DISPLAYS
9860
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9861
      begin
9862
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9863
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9864
      end
9865
      else
9866
      begin
9867
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9868
        fail = fail + 1;
9869
        test_fail("IPG is not correct");
9870
      end
9871
      // wait for second transmit to end
9872
      wait (MTxEn === 1'b0); // end second transmit
9873
      while (data[15] === 1)
9874
      begin
9875
        check_tx_bd(num_of_bd, data);
9876
        @(posedge wb_clk);
9877
      end
9878
      repeat (1) @(posedge wb_clk);
9879
      // check length of a second PACKET
9880
      tmp_len = eth_phy.tx_len;
9881
      #1;
9882
      if (tmp_len != (i_length + 4 + 1))
9883
      begin
9884
        test_fail("Wrong length of second packet out from MAC");
9885
        fail = fail + 1;
9886
      end
9887
      // checking second packet
9888
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9889
      if (tmp > 0)
9890
      begin
9891
        test_fail("Wrong data of second transmitted packet");
9892
        fail = fail + 1;
9893
      end
9894
      // check second transmited TX packet CRC
9895
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9896
      if (tmp > 0)
9897
      begin
9898
        test_fail("Wrong CRC of second transmitted packet");
9899
        fail = fail + 1;
9900
      end
9901
      // check WB INT signal
9902
      if (wb_int !== 1'b1)
9903
      begin
9904
        `TIME; $display("*E WB INT signal should be set");
9905
        test_fail("WB INT signal should be set");
9906
        fail = fail + 1;
9907
      end
9908
      // check TX buffer descriptor of a packet
9909
      check_tx_bd(num_of_bd, data);
9910
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9911
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9912
      begin
9913
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9914
        test_fail("TX buffer descriptor status is not correct");
9915
        fail = fail + 1;
9916
      end
9917
      // check interrupts
9918 274 tadejm
      wait (wbm_working == 0);
9919 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9920
      if ((data & `ETH_INT_TXB) !== 1'b1)
9921
      begin
9922
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9923
        test_fail("Interrupt Transmit Buffer was not set");
9924
        fail = fail + 1;
9925
      end
9926
      if ((data & (~`ETH_INT_TXB)) !== 0)
9927
      begin
9928
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9929
        test_fail("Other interrupts (except Transmit Buffer) were set");
9930
        fail = fail + 1;
9931
      end
9932
      // clear interrupts
9933 274 tadejm
      wait (wbm_working == 0);
9934 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9935
      // check WB INT signal
9936
      if (wb_int !== 1'b0)
9937
      begin
9938
        test_fail("WB INT signal should not be set");
9939
        fail = fail + 1;
9940
      end
9941
      // set length (LOOP variable)
9942
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9943
        i_length = i_length + 2;
9944
      else
9945
        i_length = (max_tmp - 4);
9946
      // set IPGT
9947
      if ((tmp_ipgt + 3) < 10)
9948
        tmp_ipgt = tmp_ipgt + 1;
9949
      else if ((tmp_ipgt + 3) < 24)
9950
        tmp_ipgt = tmp_ipgt + 7;
9951
      else if ((tmp_ipgt + 3) == 24)
9952
        tmp_ipgt = 38 - 3;
9953
      else if ((tmp_ipgt + 3) == 38)
9954
        tmp_ipgt = 72 - 3;
9955
      else if ((tmp_ipgt + 3) == 72)
9956
        tmp_ipgt = 130 - 3; // 124 - 3
9957
      // the number of frame transmitted
9958
      num_of_frames = num_of_frames + 1;
9959
      num_of_bd = 0;
9960
      @(posedge wb_clk);
9961
    end
9962
    // disable TX
9963 274 tadejm
    wait (wbm_working == 0);
9964 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9965
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9966
    @(posedge wb_clk);
9967
    if(fail == 0)
9968
      test_ok;
9969
    else
9970
      fail = 0;
9971
  end
9972
 
9973
 
9974
  ////////////////////////////////////////////////////////////////////
9975
  ////                                                            ////
9976
  ////  Test transmit packets after TX under-run on each packet's ////
9977
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
9978
  ////                                                            ////
9979
  ////////////////////////////////////////////////////////////////////
9980
  if (test_num == 20) // without padding
9981
  begin
9982
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
9983
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
9984
    `TIME;
9985
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
9986
 
9987
    // reset MAC registers
9988
    hard_reset;
9989
    // set wb slave response
9990
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9991
 
9992
    max_tmp = 0;
9993
    min_tmp = 0;
9994
    // set 2 TX buffer descriptors - must be set before TX enable
9995 274 tadejm
    wait (wbm_working == 0);
9996 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9997
    // enable TX, set full-duplex mode, NO padding and CRC appending
9998 274 tadejm
    wait (wbm_working == 0);
9999 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10000
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10001
    // prepare a packet of MAXFL length
10002 274 tadejm
    wait (wbm_working == 0);
10003 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10004
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10005
    min_tmp = tmp[31:16];
10006
    st_data = 8'h99;
10007
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10008
    // read IPG value
10009 274 tadejm
    wait (wbm_working == 0);
10010 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10011
    // check WB INT signal
10012
    if (wb_int !== 1'b0)
10013
    begin
10014
      test_fail("WB INT signal should not be set");
10015
      fail = fail + 1;
10016
    end
10017
 
10018
    // write to phy's control register for 10Mbps
10019
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10020
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10021
    speed = 10;
10022
 
10023 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10024 209 tadejm
    num_of_bd = 0;
10025
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10026 279 mohor
    i_length = 80;
10027 209 tadejm
    while (i_length < (max_tmp - 4))
10028
    begin
10029
      // Reset_tx_bd enable interrupt generation
10030
      // unmask interrupts
10031 274 tadejm
      wait (wbm_working == 0);
10032 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10033
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10034
      // not detect carrier sense in FD and no collision
10035
      eth_phy.carrier_sense_tx_fd_detect(0);
10036
      eth_phy.collision(0);
10037
      // first destination address on ethernet PHY
10038
      eth_phy.set_tx_mem_addr(0);
10039
      // prepare BDs
10040
      if (num_of_bd == 0)
10041
      begin
10042
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10043
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10044
        set_tx_bd_wrap(1);
10045
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10046
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10047 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10048 209 tadejm
        set_tx_bd_ready(1, 1);
10049
        set_tx_bd_ready(0, 0);
10050
      end
10051
      // frame under-run checking
10052
      frame_started = 0;
10053
      frame_ended = 0;
10054
      wait_for_frame = 0;
10055 279 mohor
      no_underrun = 0;
10056 209 tadejm
      fork
10057
        begin
10058
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10059
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10060 279 mohor
          i = 0;
10061
          while (i <= (num_of_frames[31:2] + 1))
10062
          begin
10063
            @(negedge wb_clk);
10064
            if (eth_ma_wb_ack_i)
10065
            begin
10066
              i = i + 1;
10067
            end
10068
          end
10069 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10070
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10071 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10072 209 tadejm
          // wait for synchronization and some additional clocks
10073
          wait_for_frame = 1;
10074
          // wait for frame
10075
          wait ((wait_for_frame == 0) || (frame_started == 1))
10076
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10077
          begin
10078
            disable check_fr;
10079
          end
10080
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10081
          begin
10082
            disable wait_fr;
10083 279 mohor
            if (frame_ended == 1)
10084
            begin
10085
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10086
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10087
              no_underrun = 1;
10088
            end
10089
            else
10090
            begin
10091
              wait (frame_ended == 1);
10092
              $display("(%0t) under-run on %0d. byte",
10093
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10094
              no_underrun = 0;
10095
            end
10096 209 tadejm
          end
10097
          repeat (2) @(posedge wb_clk);
10098
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10099
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10100 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10101 209 tadejm
        end
10102
        begin: wait_fr
10103
          wait (wait_for_frame == 1)
10104
          begin
10105
            // wait for synchronization and some additional clocks
10106
            repeat (3) @(posedge wb_clk);
10107
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10108
            repeat (2) @(posedge wb_clk);
10109
            repeat (2) @(posedge mtx_clk);
10110
            wait_for_frame = 0;
10111
          end
10112
        end
10113
        begin: check_fr
10114
          // wait for frame to start
10115
          @(posedge MTxEn);
10116
          frame_started = 1;
10117
          // wait for frame to end due to under-run
10118
          @(negedge MTxEn);
10119
          frame_ended = 1;
10120
        end
10121
      join
10122 279 mohor
 
10123
      repeat (5) @ (posedge mtx_clk);
10124
 
10125 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10126
      if (frame_ended == 0)
10127
      begin
10128
        // WAIT FOR FIRST TRANSMIT
10129
        check_tx_bd(num_of_bd, data);
10130
        wait (MTxEn === 1'b1); // start first transmit
10131
        if (data[15] !== 1)
10132
        begin
10133
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10134
          fail = fail + 1;
10135
        end
10136
        wait (MTxEn === 1'b0); // end first transmit
10137
        while (data[15] === 1)
10138
        begin
10139
          check_tx_bd(num_of_bd, data);
10140
          @(posedge wb_clk);
10141
        end
10142
        repeat (1) @(posedge wb_clk);
10143
        // CHECK FIRST FRAME
10144
        // check length of a first PACKET
10145
        tmp_len = eth_phy.tx_len;
10146 279 mohor
 
10147 209 tadejm
        #1;
10148
        if (tmp_len != (i_length + 4))
10149
        begin
10150 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
10151
          test_fail("Wrong length of first packet out from MAC");
10152 209 tadejm
          fail = fail + 1;
10153
        end
10154
        // checking first packet
10155
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10156
        if (tmp > 0)
10157
        begin
10158 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
10159
          test_fail("Wrong data of first transmitted packet");
10160 209 tadejm
          fail = fail + 1;
10161
        end
10162
        // check first transmited TX packet CRC
10163
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10164
        if (tmp > 0)
10165
        begin
10166 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10167
          test_fail("Wrong CRC of first transmitted packet");
10168 209 tadejm
          fail = fail + 1;
10169
        end
10170
        // check WB INT signal
10171
        if (wb_int !== 1'b1)
10172
        begin
10173
          `TIME; $display("*E WB INT signal should be set");
10174
          test_fail("WB INT signal should be set");
10175
          fail = fail + 1;
10176
        end
10177
        // check TX buffer descriptor of a packet
10178
        check_tx_bd(num_of_bd, data);
10179
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10180
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10181
        begin
10182
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10183
          test_fail("TX buffer descriptor status is not correct");
10184
          fail = fail + 1;
10185
        end
10186
        // check interrupts
10187 274 tadejm
        wait (wbm_working == 0);
10188 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10189
        if ((data & `ETH_INT_TXB) !== 1'b1)
10190
        begin
10191
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10192
          test_fail("Interrupt Transmit Buffer was not set");
10193
          fail = fail + 1;
10194
        end
10195
        if ((data & (~`ETH_INT_TXB)) !== 0)
10196
        begin
10197
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10198
          test_fail("Other interrupts (except Transmit Buffer) were set");
10199
          fail = fail + 1;
10200
        end
10201
        // clear interrupts
10202 274 tadejm
        wait (wbm_working == 0);
10203 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10204
        // check WB INT signal
10205
        if (wb_int !== 1'b0)
10206
        begin
10207
          test_fail("WB INT signal should not be set");
10208
          fail = fail + 1;
10209
        end
10210
      end
10211 279 mohor
      else // if (frame_ended == 1)
10212 223 tadejm
      begin
10213
        // CHECK FIRST FRAME
10214
        // check length of a first PACKET
10215 279 mohor
 
10216
        if (no_underrun)
10217 223 tadejm
        begin
10218 279 mohor
          // CHECK FIRST FRAME, without under-run !!!
10219
          // check length of a first PACKET
10220
          tmp_len = eth_phy.tx_len;
10221
          #1;
10222
          if (tmp_len != (i_length + 4))
10223
          begin
10224
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10225
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10226
            fail = fail + 1;
10227
          end
10228 223 tadejm
        end
10229 279 mohor
        else
10230
        begin
10231
          // CHECK FIRST FRAME, on which under-run occure !!!
10232
          // check length of a first PACKET
10233
          tmp_len = eth_phy.tx_len_err;
10234
          #1;
10235
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10236
          begin
10237
            `TIME; $display("*E Wrong length of first packet out from MAC");
10238
            test_fail("Wrong length of first packet out from MAC");
10239
            fail = fail + 1;
10240
          end
10241
        end
10242 223 tadejm
        // checking first packet
10243 279 mohor
        if (no_underrun)
10244
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10245
        else
10246
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10247 223 tadejm
        if (tmp > 0)
10248
        begin
10249
          `TIME; $display("*E Wrong data of first transmitted packet");
10250
          test_fail("Wrong data of first transmitted packet");
10251
          fail = fail + 1;
10252
        end
10253
        // check WB INT signal
10254
        if (wb_int !== 1'b1)
10255
        begin
10256
          `TIME; $display("*E WB INT signal should be set");
10257
          test_fail("WB INT signal should be set");
10258
          fail = fail + 1;
10259
        end
10260 279 mohor
 
10261 223 tadejm
        // check TX buffer descriptor of a packet
10262
        check_tx_bd(num_of_bd, data);
10263 279 mohor
        if (no_underrun)
10264 223 tadejm
        begin
10265 279 mohor
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10266
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10267
          begin
10268
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10269
            test_fail("TX buffer descriptor status is not correct");
10270
            fail = fail + 1;
10271
          end
10272 223 tadejm
        end
10273 279 mohor
        else
10274
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10275
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10276
          begin
10277
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10278
            test_fail("TX buffer descriptor status is not correct");
10279
            fail = fail + 1;
10280
          end
10281
 
10282 223 tadejm
        // check interrupts
10283 274 tadejm
        wait (wbm_working == 0);
10284 223 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10285 279 mohor
 
10286
        if (no_underrun)
10287 223 tadejm
        begin
10288 279 mohor
          if ((data & `ETH_INT_TXB) !== 2'b01)
10289
          begin
10290
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10291
            test_fail("Interrupt Transmit Buffer was not set");
10292
            fail = fail + 1;
10293
          end
10294
          if ((data & (~`ETH_INT_TXB)) !== 0)
10295
          begin
10296
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10297
            test_fail("Other interrupts (except Transmit Buffer) were set");
10298
            fail = fail + 1;
10299
          end
10300 223 tadejm
        end
10301 279 mohor
        else
10302 223 tadejm
        begin
10303 279 mohor
          if ((data & `ETH_INT_TXE) !== 2'b10)
10304
          begin
10305
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10306
            test_fail("Interrupt Transmit Error was not set");
10307
            fail = fail + 1;
10308
          end
10309
          if ((data & (~`ETH_INT_TXE)) !== 0)
10310
          begin
10311
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10312
            test_fail("Other interrupts (except Transmit Buffer) were set");
10313
            fail = fail + 1;
10314
          end
10315 223 tadejm
        end
10316 279 mohor
 
10317 223 tadejm
        // clear interrupts
10318 274 tadejm
        wait (wbm_working == 0);
10319 223 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10320
        // check WB INT signal
10321
        if (wb_int !== 1'b0)
10322
        begin
10323
          test_fail("WB INT signal should not be set");
10324
          fail = fail + 1;
10325
        end
10326
      end
10327 209 tadejm
      num_of_bd = num_of_bd + 1;
10328
      // destination address on ethernet PHY
10329
      eth_phy.set_tx_mem_addr(0);
10330 223 tadejm
      // WAIT FOR SECOND TRANSMIT
10331 209 tadejm
      check_tx_bd(num_of_bd, data);
10332
      wait (MTxEn === 1'b1); // start first transmit
10333
      if (data[15] !== 1)
10334
      begin
10335
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10336
        fail = fail + 1;
10337
      end
10338
      wait (MTxEn === 1'b0); // end first transmit
10339
      while (data[15] === 1)
10340
      begin
10341
        check_tx_bd(num_of_bd, data);
10342
        @(posedge wb_clk);
10343
      end
10344
      repeat (1) @(posedge wb_clk);
10345
      // CHECK SECOND FRAME
10346
      // check length of a second PACKET
10347
      tmp_len = eth_phy.tx_len;
10348
      #1;
10349
      if (tmp_len != (i_length + 4))
10350
      begin
10351 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10352 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10353
        fail = fail + 1;
10354
      end
10355
      // checking second packet
10356
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10357
      if (tmp > 0)
10358
      begin
10359 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10360 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10361
        fail = fail + 1;
10362
      end
10363
      // check second transmited TX packet CRC
10364
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10365
      if (tmp > 0)
10366
      begin
10367 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10368 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10369
        fail = fail + 1;
10370
      end
10371
      // check WB INT signal
10372
      if (wb_int !== 1'b1)
10373
      begin
10374
        `TIME; $display("*E WB INT signal should be set");
10375
        test_fail("WB INT signal should be set");
10376
        fail = fail + 1;
10377
      end
10378
      // check TX buffer descriptor of a packet
10379
      check_tx_bd(num_of_bd, data);
10380
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10381
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10382
      begin
10383
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10384
        test_fail("TX buffer descriptor status is not correct");
10385
        fail = fail + 1;
10386
      end
10387
      // check interrupts
10388 274 tadejm
      wait (wbm_working == 0);
10389 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10390
      if ((data & `ETH_INT_TXB) !== 1'b1)
10391
      begin
10392
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10393
        test_fail("Interrupt Transmit Buffer was not set");
10394
        fail = fail + 1;
10395
      end
10396
      if ((data & (~`ETH_INT_TXB)) !== 0)
10397
      begin
10398
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10399
        test_fail("Other interrupts (except Transmit Buffer) were set");
10400
        fail = fail + 1;
10401
      end
10402
      // clear interrupts
10403 274 tadejm
      wait (wbm_working == 0);
10404 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10405
      // check WB INT signal
10406
      if (wb_int !== 1'b0)
10407
      begin
10408
        test_fail("WB INT signal should not be set");
10409
        fail = fail + 1;
10410
      end
10411
      // set initial value
10412
      i_data = i_data - 1;
10413 279 mohor
      // the number of frames transmitted
10414 209 tadejm
      num_of_frames = num_of_frames + 1;
10415
      num_of_bd = 0;
10416
      // set length (LOOP variable)
10417 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10418 209 tadejm
        i_length = (max_tmp - 4);
10419
      @(posedge wb_clk);
10420
    end
10421
    // disable TX
10422 274 tadejm
    wait (wbm_working == 0);
10423 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10424
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10425
    @(posedge wb_clk);
10426
    if(fail == 0)
10427
      test_ok;
10428
    else
10429
      fail = 0;
10430
  end
10431
 
10432
 
10433
  ////////////////////////////////////////////////////////////////////
10434
  ////                                                            ////
10435
  ////  Test transmit packets after TX under-run on each packet's ////
10436
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10437
  ////                                                            ////
10438
  ////////////////////////////////////////////////////////////////////
10439
  if (test_num == 21) // without padding
10440
  begin
10441
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10442
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10443
    `TIME;
10444
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10445
 
10446
    // reset MAC registers
10447
    hard_reset;
10448
    // set wb slave response
10449
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10450
 
10451
    max_tmp = 0;
10452
    min_tmp = 0;
10453
    // set 2 TX buffer descriptors - must be set before TX enable
10454 274 tadejm
    wait (wbm_working == 0);
10455 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10456
    // enable TX, set full-duplex mode, NO padding and CRC appending
10457 274 tadejm
    wait (wbm_working == 0);
10458 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10459
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10460
    // prepare a packet of MAXFL length
10461 274 tadejm
    wait (wbm_working == 0);
10462 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10463
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10464
    min_tmp = tmp[31:16];
10465
    st_data = 8'h99;
10466
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10467
    // read IPG value
10468 274 tadejm
    wait (wbm_working == 0);
10469 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10470
    // check WB INT signal
10471
    if (wb_int !== 1'b0)
10472
    begin
10473
      test_fail("WB INT signal should not be set");
10474
      fail = fail + 1;
10475
    end
10476
 
10477
    // write to phy's control register for 100Mbps
10478
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10479 279 mohor
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10480 209 tadejm
    speed = 100;
10481
 
10482 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10483 209 tadejm
    num_of_bd = 0;
10484
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10485 279 mohor
    i_length = 80;
10486 209 tadejm
    while (i_length < (max_tmp - 4))
10487
    begin
10488
      // Reset_tx_bd enable interrupt generation
10489
      // unmask interrupts
10490 274 tadejm
      wait (wbm_working == 0);
10491 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10492
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10493
      // not detect carrier sense in FD and no collision
10494
      eth_phy.carrier_sense_tx_fd_detect(0);
10495
      eth_phy.collision(0);
10496
      // first destination address on ethernet PHY
10497
      eth_phy.set_tx_mem_addr(0);
10498
      // prepare BDs
10499
      if (num_of_bd == 0)
10500
      begin
10501
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10502
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10503
        set_tx_bd_wrap(1);
10504
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10505
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10506 279 mohor
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10507 209 tadejm
        set_tx_bd_ready(1, 1);
10508
        set_tx_bd_ready(0, 0);
10509
      end
10510
      // frame under-run checking
10511
      frame_started = 0;
10512
      frame_ended = 0;
10513
      wait_for_frame = 0;
10514 279 mohor
      no_underrun = 0;
10515 209 tadejm
      fork
10516
        begin
10517
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10518
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10519 279 mohor
          i = 0;
10520
          while (i <= (num_of_frames[31:2] + 1))
10521
          begin
10522
            @(negedge wb_clk);
10523
            if (eth_ma_wb_ack_i)
10524
            begin
10525
              i = i + 1;
10526
            end
10527
          end
10528 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10529
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10530 279 mohor
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10531 209 tadejm
          // wait for synchronization and some additional clocks
10532
          wait_for_frame = 1;
10533
          // wait for frame
10534
          wait ((wait_for_frame == 0) || (frame_started == 1))
10535
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10536
          begin
10537
            disable check_fr1;
10538
          end
10539
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10540
          begin
10541
            disable wait_fr1;
10542 279 mohor
            if (frame_ended == 1)
10543
            begin
10544
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10545
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10546
              no_underrun = 1;
10547
            end
10548
            else
10549
            begin
10550
              wait (frame_ended == 1);
10551
              $display("(%0t) under-run on %0d. byte",
10552
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10553
              no_underrun = 0;
10554
            end
10555 209 tadejm
          end
10556
          repeat (2) @(posedge wb_clk);
10557
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10558
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10559 279 mohor
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10560 209 tadejm
        end
10561
        begin: wait_fr1
10562
          wait (wait_for_frame == 1)
10563
          begin
10564
            // wait for synchronization and some additional clocks
10565
            repeat (3) @(posedge wb_clk);
10566
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10567
            repeat (2) @(posedge wb_clk);
10568
            repeat (2) @(posedge mtx_clk);
10569
            wait_for_frame = 0;
10570
          end
10571
        end
10572
        begin: check_fr1
10573
          // wait for frame to start
10574
          @(posedge MTxEn);
10575
          frame_started = 1;
10576
          // wait for frame to end due to under-run
10577
          @(negedge MTxEn);
10578
          frame_ended = 1;
10579
        end
10580
      join
10581 279 mohor
 
10582
      repeat (5) @ (posedge mtx_clk);
10583
 
10584 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10585
      if (frame_ended == 0)
10586
      begin
10587
        // WAIT FOR FIRST TRANSMIT
10588
        check_tx_bd(num_of_bd, data);
10589
        wait (MTxEn === 1'b1); // start first transmit
10590
        if (data[15] !== 1)
10591
        begin
10592
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10593
          fail = fail + 1;
10594
        end
10595
        wait (MTxEn === 1'b0); // end first transmit
10596
        while (data[15] === 1)
10597
        begin
10598
          check_tx_bd(num_of_bd, data);
10599
          @(posedge wb_clk);
10600
        end
10601 279 mohor
        repeat (10) @(posedge wb_clk);
10602 209 tadejm
        // CHECK FIRST FRAME
10603
        // check length of a first PACKET
10604
        tmp_len = eth_phy.tx_len;
10605 279 mohor
 
10606 209 tadejm
        #1;
10607
        if (tmp_len != (i_length + 4))
10608
        begin
10609 279 mohor
          `TIME; $display("*E Wrong length of first packet out from MAC");
10610
          test_fail("Wrong length of first packet out from MAC");
10611 209 tadejm
          fail = fail + 1;
10612
        end
10613
        // checking first packet
10614
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10615
        if (tmp > 0)
10616
        begin
10617 279 mohor
          `TIME; $display("*E Wrong data of first transmitted packet");
10618
          test_fail("Wrong data of first transmitted packet");
10619 209 tadejm
          fail = fail + 1;
10620
        end
10621
        // check first transmited TX packet CRC
10622
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10623
        if (tmp > 0)
10624
        begin
10625 279 mohor
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10626
          test_fail("Wrong CRC of first transmitted packet");
10627 209 tadejm
          fail = fail + 1;
10628
        end
10629
        // check WB INT signal
10630
        if (wb_int !== 1'b1)
10631
        begin
10632
          `TIME; $display("*E WB INT signal should be set");
10633
          test_fail("WB INT signal should be set");
10634
          fail = fail + 1;
10635
        end
10636
        // check TX buffer descriptor of a packet
10637
        check_tx_bd(num_of_bd, data);
10638
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10639
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10640
        begin
10641
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10642
          test_fail("TX buffer descriptor status is not correct");
10643
          fail = fail + 1;
10644
        end
10645
        // check interrupts
10646 274 tadejm
        wait (wbm_working == 0);
10647 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10648
        if ((data & `ETH_INT_TXB) !== 1'b1)
10649
        begin
10650
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10651
          test_fail("Interrupt Transmit Buffer was not set");
10652
          fail = fail + 1;
10653
        end
10654
        if ((data & (~`ETH_INT_TXB)) !== 0)
10655
        begin
10656
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10657
          test_fail("Other interrupts (except Transmit Buffer) were set");
10658
          fail = fail + 1;
10659
        end
10660
        // clear interrupts
10661 274 tadejm
        wait (wbm_working == 0);
10662 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10663
        // check WB INT signal
10664
        if (wb_int !== 1'b0)
10665
        begin
10666
          test_fail("WB INT signal should not be set");
10667
          fail = fail + 1;
10668
        end
10669
      end
10670 279 mohor
      else // if (frame_ended == 1)
10671
      begin
10672
        // CHECK FIRST FRAME
10673
        // check length of a first PACKET
10674
 
10675
        if (no_underrun)
10676
        begin
10677
          // CHECK FIRST FRAME, without under-run !!!
10678
          // check length of a first PACKET
10679
          tmp_len = eth_phy.tx_len;
10680
          #1;
10681
          if (tmp_len != (i_length + 4))
10682
          begin
10683
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10684
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10685
            fail = fail + 1;
10686
          end
10687
        end
10688
        else
10689
        begin
10690
          // CHECK FIRST FRAME, on which under-run occure !!!
10691
          // check length of a first PACKET
10692
          tmp_len = eth_phy.tx_len_err-1;   // -1 because synchronization at 100 Mbps is slover then at 10 Mbps (wb_clk remains the same)
10693
          #1;
10694
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10695
          begin
10696
            `TIME; $display("*E Wrong length of first packet out from MAC");
10697
            test_fail("Wrong length of first packet out from MAC");
10698
            fail = fail + 1;
10699
          end
10700
        end
10701
        // checking first packet
10702
        if (no_underrun)
10703
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10704
        else
10705
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10706
        if (tmp > 0)
10707
        begin
10708
          `TIME; $display("*E Wrong data of first transmitted packet");
10709
          test_fail("Wrong data of first transmitted packet");
10710
          fail = fail + 1;
10711
        end
10712
        // check WB INT signal
10713
        if (wb_int !== 1'b1)
10714
        begin
10715
          `TIME; $display("*E WB INT signal should be set");
10716
          test_fail("WB INT signal should be set");
10717
          fail = fail + 1;
10718
        end
10719
 
10720
        // check TX buffer descriptor of a packet
10721
        check_tx_bd(num_of_bd, data);
10722
        if (no_underrun)
10723
        begin
10724
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10725
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10726
          begin
10727
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10728
            test_fail("TX buffer descriptor status is not correct");
10729
            fail = fail + 1;
10730
          end
10731
        end
10732
        else
10733
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10734
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10735
          begin
10736
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10737
            test_fail("TX buffer descriptor status is not correct");
10738
            fail = fail + 1;
10739
          end
10740
 
10741
        // check interrupts
10742
        wait (wbm_working == 0);
10743
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10744
 
10745
        if (no_underrun)
10746
        begin
10747
          if ((data & `ETH_INT_TXB) !== 2'b01)
10748
          begin
10749
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10750
            test_fail("Interrupt Transmit Buffer was not set");
10751
            fail = fail + 1;
10752
          end
10753
          if ((data & (~`ETH_INT_TXB)) !== 0)
10754
          begin
10755
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10756
            test_fail("Other interrupts (except Transmit Buffer) were set");
10757
            fail = fail + 1;
10758
          end
10759
        end
10760
        else
10761
        begin
10762
          if ((data & `ETH_INT_TXE) !== 2'b10)
10763
          begin
10764
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10765
            test_fail("Interrupt Transmit Error was not set");
10766
            fail = fail + 1;
10767
          end
10768
          if ((data & (~`ETH_INT_TXE)) !== 0)
10769
          begin
10770
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10771
            test_fail("Other interrupts (except Transmit Buffer) were set");
10772
            fail = fail + 1;
10773
          end
10774
        end
10775
 
10776
        // clear interrupts
10777
        wait (wbm_working == 0);
10778
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10779
        // check WB INT signal
10780
        if (wb_int !== 1'b0)
10781
        begin
10782
          test_fail("WB INT signal should not be set");
10783
          fail = fail + 1;
10784
        end
10785
      end
10786 209 tadejm
      num_of_bd = num_of_bd + 1;
10787
      // destination address on ethernet PHY
10788
      eth_phy.set_tx_mem_addr(0);
10789 279 mohor
      // WAIT FOR SECOND TRANSMIT
10790 209 tadejm
      check_tx_bd(num_of_bd, data);
10791
      wait (MTxEn === 1'b1); // start first transmit
10792
      if (data[15] !== 1)
10793
      begin
10794
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10795
        fail = fail + 1;
10796
      end
10797
      wait (MTxEn === 1'b0); // end first transmit
10798
      while (data[15] === 1)
10799
      begin
10800
        check_tx_bd(num_of_bd, data);
10801
        @(posedge wb_clk);
10802
      end
10803
      repeat (1) @(posedge wb_clk);
10804
      // CHECK SECOND FRAME
10805
      // check length of a second PACKET
10806
      tmp_len = eth_phy.tx_len;
10807
      #1;
10808
      if (tmp_len != (i_length + 4))
10809
      begin
10810 279 mohor
        `TIME; $display("*E Wrong length of second packet out from MAC");
10811 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10812
        fail = fail + 1;
10813
      end
10814
      // checking second packet
10815
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10816
      if (tmp > 0)
10817
      begin
10818 279 mohor
        `TIME; $display("*E Wrong data of second transmitted packet");
10819 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10820
        fail = fail + 1;
10821
      end
10822
      // check second transmited TX packet CRC
10823
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10824
      if (tmp > 0)
10825
      begin
10826 279 mohor
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10827 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10828
        fail = fail + 1;
10829
      end
10830
      // check WB INT signal
10831
      if (wb_int !== 1'b1)
10832
      begin
10833
        `TIME; $display("*E WB INT signal should be set");
10834
        test_fail("WB INT signal should be set");
10835
        fail = fail + 1;
10836
      end
10837
      // check TX buffer descriptor of a packet
10838
      check_tx_bd(num_of_bd, data);
10839
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10840
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10841
      begin
10842
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10843
        test_fail("TX buffer descriptor status is not correct");
10844
        fail = fail + 1;
10845
      end
10846
      // check interrupts
10847 274 tadejm
      wait (wbm_working == 0);
10848 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10849
      if ((data & `ETH_INT_TXB) !== 1'b1)
10850
      begin
10851
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10852
        test_fail("Interrupt Transmit Buffer was not set");
10853
        fail = fail + 1;
10854
      end
10855
      if ((data & (~`ETH_INT_TXB)) !== 0)
10856
      begin
10857
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10858
        test_fail("Other interrupts (except Transmit Buffer) were set");
10859
        fail = fail + 1;
10860
      end
10861
      // clear interrupts
10862 274 tadejm
      wait (wbm_working == 0);
10863 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10864
      // check WB INT signal
10865
      if (wb_int !== 1'b0)
10866
      begin
10867
        test_fail("WB INT signal should not be set");
10868
        fail = fail + 1;
10869
      end
10870
      // set initial value
10871
      i_data = i_data - 1;
10872 279 mohor
      // the number of frames transmitted
10873 209 tadejm
      num_of_frames = num_of_frames + 1;
10874
      num_of_bd = 0;
10875
      // set length (LOOP variable)
10876 279 mohor
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10877 209 tadejm
        i_length = (max_tmp - 4);
10878
      @(posedge wb_clk);
10879
    end
10880
    // disable TX
10881 274 tadejm
    wait (wbm_working == 0);
10882 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10883
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10884
    @(posedge wb_clk);
10885
    if(fail == 0)
10886
      test_ok;
10887
    else
10888
      fail = 0;
10889
  end
10890
 
10891 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
10892 169 mohor
 
10893
end
10894
endtask // test_mac_full_duplex_transmit
10895
 
10896
 
10897 209 tadejm
task test_mac_full_duplex_receive;
10898
  input  [31:0]  start_task;
10899
  input  [31:0]  end_task;
10900
  integer        bit_start_1;
10901
  integer        bit_end_1;
10902
  integer        bit_start_2;
10903
  integer        bit_end_2;
10904
  integer        num_of_reg;
10905
  integer        num_of_frames;
10906
  integer        num_of_bd;
10907
  integer        i_addr;
10908
  integer        i_data;
10909
  integer        i_length;
10910
  integer        tmp_len;
10911
  integer        tmp_bd;
10912
  integer        tmp_bd_num;
10913
  integer        tmp_data;
10914
  integer        tmp_ipgt;
10915
  integer        test_num;
10916
  reg    [31:0]  tx_bd_num;
10917
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
10918
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
10919
  integer        i;
10920
  integer        i1;
10921
  integer        i2;
10922
  integer        i3;
10923
  integer        fail;
10924
  integer        speed;
10925
  reg            frame_started;
10926
  reg            frame_ended;
10927
  reg            wait_for_frame;
10928 243 tadejm
  reg            check_frame;
10929
  reg            stop_checking_frame;
10930
  reg            first_fr_received;
10931 209 tadejm
  reg    [31:0]  addr;
10932
  reg    [31:0]  data;
10933
  reg    [31:0]  tmp;
10934
  reg    [ 7:0]  st_data;
10935
  reg    [15:0]  max_tmp;
10936
  reg    [15:0]  min_tmp;
10937
begin
10938
// MAC FULL DUPLEX RECEIVE TEST
10939
test_heading("MAC FULL DUPLEX RECEIVE TEST");
10940
$display(" ");
10941
$display("MAC FULL DUPLEX RECEIVE TEST");
10942
fail = 0;
10943
 
10944
// reset MAC registers
10945
hard_reset;
10946
// reset MAC and MII LOGIC with soft reset
10947 274 tadejm
//reset_mac;
10948
//reset_mii;
10949 209 tadejm
// set wb slave response
10950
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10951
 
10952
  /*
10953
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
10954
  -------------------------------------------------------------------------------------
10955
  set_tx_bd
10956
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
10957
  set_tx_bd_wrap
10958
    (tx_bd_num_end[6:0]);
10959
  set_tx_bd_ready
10960
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10961
  check_tx_bd
10962
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
10963
  clear_tx_bd
10964
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10965
 
10966
  TASKS for set and control RX buffer descriptors:
10967
  ------------------------------------------------
10968
  set_rx_bd
10969
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
10970
  set_rx_bd_wrap
10971
    (rx_bd_num_end[6:0]);
10972
  set_rx_bd_empty
10973
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10974
  check_rx_bd
10975
    (rx_bd_num_end[6:0], rx_bd_status);
10976
  clear_rx_bd
10977
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10978
 
10979
  TASKS for set and check TX packets:
10980
  -----------------------------------
10981
  set_tx_packet
10982
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
10983
  check_tx_packet
10984
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
10985
 
10986
  TASKS for set and check RX packets:
10987
  -----------------------------------
10988
  set_rx_packet
10989
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
10990
  check_rx_packet
10991
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
10992
 
10993
  TASKS for append and check CRC to/of TX packet:
10994
  -----------------------------------------------
10995
  append_tx_crc
10996
    (txpnt_wb[31:0], len[15:0], negated_crc);
10997
  check_tx_crc
10998
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
10999
 
11000
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
11001
  --------------------------------------------------------------------------------
11002
  append_rx_crc
11003
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
11004
  */
11005
 
11006
//////////////////////////////////////////////////////////////////////
11007
////                                                              ////
11008
////  test_mac_full_duplex_receive:                               ////
11009
////                                                              ////
11010
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
11011
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
11012 243 tadejm
////  2: Test receive packet synchronization with receive         ////
11013
////     disable/enable ( 10Mbps ).                               ////
11014
////  3: Test receive packet synchronization with receive         ////
11015
////     disable/enable ( 100Mbps ).                              ////
11016
////  4: Test receive packets form MINFL to MAXFL sizes at        ////
11017 209 tadejm
////     one RX buffer decriptor ( 10Mbps ).                      ////
11018 243 tadejm
////  5: Test receive packets form MINFL to MAXFL sizes at        ////
11019 209 tadejm
////     one RX buffer decriptor ( 100Mbps ).                     ////
11020
////                                                              ////
11021
//////////////////////////////////////////////////////////////////////
11022
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
11023
begin
11024
 
11025
  ////////////////////////////////////////////////////////////////////
11026
  ////                                                            ////
11027
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
11028
  ////                                                            ////
11029
  ////////////////////////////////////////////////////////////////////
11030
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
11031
  begin
11032
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
11033
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
11034
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
11035
 
11036
    // unmask interrupts
11037 274 tadejm
    wait (wbm_working == 0);
11038 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11039
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11040
    // set all buffer descriptors to TX - must be set before RX enable
11041 274 tadejm
    wait (wbm_working == 0);
11042 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11043 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11044 274 tadejm
    wait (wbm_working == 0);
11045 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11046
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11047
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11048
 
11049
    // write to phy's control register for 10Mbps
11050
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11051
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11052
    speed = 10;
11053
 
11054
    i = 0;
11055
    while (i < 128)
11056
    begin
11057
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11058
      begin
11059
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11060
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11061
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11062
      end
11063
      set_rx_bd_wrap(i);
11064
      set_rx_bd_empty(0, i);
11065
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11066
      begin
11067
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11068
        repeat(10) @(posedge mrx_clk);
11069
      end
11070
      @(posedge mrx_clk);
11071
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11072
      begin
11073
        check_rx_bd(0, tmp);
11074
        #1;
11075
        if (tmp[15] === 1'b0)
11076
        begin
11077
          test_fail("Receive should not start at all");
11078
          fail = fail + 1;
11079
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11080
        end
11081
        if (tmp[7:0] !== 0)
11082
        begin
11083
          test_fail("Receive should not be finished since it should not start at all");
11084
          fail = fail + 1;
11085
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11086
        end
11087
        @(posedge wb_clk);
11088
      end
11089 274 tadejm
      wait (wbm_working == 0);
11090 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11091
      if (tmp[6:0] !== 0)
11092
      begin
11093
        test_fail("Receive should not get INT since it should not start at all");
11094
        fail = fail + 1;
11095
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11096
      end
11097
      clear_rx_bd(0, i);
11098
      if ((i < 5) || (i > 124))
11099
        i = i + 1;
11100
      else
11101
        i = i + 120;
11102
    end
11103
    // disable RX
11104 274 tadejm
    wait (wbm_working == 0);
11105 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11106
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11107
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11108
    if(fail == 0)
11109
      test_ok;
11110
    else
11111
      fail = 0;
11112
  end
11113
 
11114
 
11115
  ////////////////////////////////////////////////////////////////////
11116
  ////                                                            ////
11117
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
11118
  ////                                                            ////
11119
  ////////////////////////////////////////////////////////////////////
11120
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
11121
  begin
11122
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
11123
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
11124
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
11125
 
11126
    // unmask interrupts
11127 274 tadejm
    wait (wbm_working == 0);
11128 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11129
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11130
    // set all buffer descriptors to TX - must be set before RX enable
11131 274 tadejm
    wait (wbm_working == 0);
11132 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11133 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11134 274 tadejm
    wait (wbm_working == 0);
11135 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11136
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11137
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11138
 
11139
    // write to phy's control register for 100Mbps
11140
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11141
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11142
    speed = 100;
11143
 
11144
    i = 0;
11145
    while (i < 128)
11146
    begin
11147
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11148
      begin
11149
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11150
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11151
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11152
      end
11153
      set_rx_bd_wrap(i);
11154
      set_rx_bd_empty(0, i);
11155
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11156
      begin
11157
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11158
        repeat(10) @(posedge mrx_clk);
11159
      end
11160
      @(posedge mrx_clk);
11161
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11162
      begin
11163
        check_rx_bd(0, tmp);
11164
        #1;
11165
        if (tmp[15] === 1'b0)
11166
        begin
11167
          test_fail("Receive should not start at all");
11168
          fail = fail + 1;
11169
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11170
        end
11171
        if (tmp[7:0] !== 0)
11172
        begin
11173
          test_fail("Receive should not be finished since it should not start at all");
11174
          fail = fail + 1;
11175
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11176
        end
11177
        @(posedge wb_clk);
11178
      end
11179 274 tadejm
      wait (wbm_working == 0);
11180 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11181
      if (tmp[6:0] !== 0)
11182
      begin
11183
        test_fail("Receive should not get INT since it should not start at all");
11184
        fail = fail + 1;
11185
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11186
      end
11187
      clear_rx_bd(0, i);
11188
      if ((i < 5) || (i > 124))
11189
        i = i + 1;
11190
      else
11191
        i = i + 120;
11192
    end
11193
    // disable RX
11194 274 tadejm
    wait (wbm_working == 0);
11195 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11196
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11197
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11198
    if(fail == 0)
11199
      test_ok;
11200
    else
11201
      fail = 0;
11202
  end
11203
 
11204
 
11205
  ////////////////////////////////////////////////////////////////////
11206
  ////                                                            ////
11207 243 tadejm
  ////  Test receive packet synchronization with receive          ////
11208
  ////  disable/enable ( 10Mbps ).                                ////
11209
  ////                                                            ////
11210
  ////////////////////////////////////////////////////////////////////
11211
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
11212
  begin
11213
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
11214
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
11215
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
11216
 
11217
    // unmask interrupts
11218 274 tadejm
    wait (wbm_working == 0);
11219 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11220
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11221
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11222 274 tadejm
    wait (wbm_working == 0);
11223 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11224
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11225 274 tadejm
    wait (wbm_working == 0);
11226 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11227
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11228
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11229
    // prepare two packets of MAXFL length
11230 274 tadejm
    wait (wbm_working == 0);
11231 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11232
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11233
    min_tmp = tmp[31:16];
11234
    st_data = 8'h0F;
11235
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11236
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11237
    st_data = 8'h1A;
11238
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11239
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11240
    // check WB INT signal
11241
    if (wb_int !== 1'b0)
11242
    begin
11243
      test_fail("WB INT signal should not be set");
11244
      fail = fail + 1;
11245
    end
11246
 
11247
    // write to phy's control register for 10Mbps
11248
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11249
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11250
    speed = 10;
11251
 
11252
    frame_started = 0;
11253
    frame_ended = 0;
11254
    wait_for_frame = 0;
11255
    check_frame = 0;
11256
    stop_checking_frame = 0;
11257
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11258
 
11259
    num_of_frames = 0; // 
11260
    num_of_bd = 0;
11261
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11262
    while (i_length < (max_tmp - 4))
11263
    begin
11264
      // choose generating carrier sense and collision 
11265
      case (num_of_frames[1:0])
11266
      2'h0: // Interrupt is generated
11267
      begin
11268
        // enable interrupt generation
11269
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11270
        // not detect carrier sense in FD and no collision
11271
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11272
        eth_phy.collision(0);
11273
      end
11274
      2'h1: // Interrupt is generated
11275
      begin
11276
        // enable interrupt generation
11277
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11278
        // detect carrier sense in FD and no collision
11279
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11280
        eth_phy.collision(0);
11281
      end
11282
      2'h2: // Interrupt is generated
11283
      begin
11284
        // disable interrupt generation
11285
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11286
        // not detect carrier sense in FD and set collision
11287
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11288
        eth_phy.collision(1);
11289
      end
11290
      default: // 2'h3: // Interrupt is generated
11291
      begin
11292
        // disable interrupt generation
11293
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11294
        // detect carrier sense in FD and set collision
11295
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11296
        eth_phy.collision(1);
11297
      end
11298
      endcase
11299
      // set wrap bit
11300
      set_rx_bd_wrap(118);
11301
      set_rx_bd_empty(118, 118);
11302
      check_frame = 0;
11303
      stop_checking_frame = 0;
11304
      tmp_data = 0;
11305
      fork
11306
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11307
          if (num_of_frames[0] == 1'b0)
11308
          begin
11309
            repeat(1) @(posedge wb_clk);
11310
            if (num_of_frames[1] == 1'b0)
11311
            begin
11312
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11313
            end
11314
            else
11315
            begin
11316
              @(posedge mrx_clk);
11317
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11318
            end
11319
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11320
            wbm_init_waits = 4'h0;
11321
            wbm_subseq_waits = 4'h0;
11322 274 tadejm
            #1 wait (wbm_working == 0);
11323
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11324 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11325
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11326
          end
11327
        end
11328
        begin // send a packet from PHY RX
11329
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11330
          if (num_of_frames[1] == 1'b0)
11331
          begin
11332
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11333
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11334
          end
11335
          else
11336
          begin
11337
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11338
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11339
          end
11340
        end
11341
        begin: send_packet0
11342
          wait (MRxDV === 1'b1); // start transmit
11343
          wait (MRxDV === 1'b0); // end transmit
11344
          check_frame = 1;
11345
          repeat(10) @(posedge mrx_clk);
11346
          repeat(15) @(posedge wb_clk);
11347
          stop_checking_frame = 1;
11348
        end
11349
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11350
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11351
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11352
          begin
11353
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11354
          end
11355
          else if (MRxDV === 1'b1)
11356
          begin
11357
            while (eth_sl_wb_ack_o === 1'b0)
11358
            begin
11359
              @(posedge wb_clk);
11360
              tmp_data = tmp_data + 1;
11361
            end
11362
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11363
          end
11364
          else if (eth_sl_wb_ack_o === 1'b1)
11365
          begin
11366
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11367
            while (MRxDV === 1'b0)
11368
            begin
11369
              @(posedge wb_clk);
11370
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11371
            end
11372
          end
11373
        end
11374
        begin // check packet
11375
          wait (check_frame == 1);
11376
          check_rx_bd(118, tmp_bd);
11377
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11378
          begin
11379
            #1 check_rx_bd(118, tmp_bd);
11380
            @(posedge wb_clk);
11381
          end
11382
          if (num_of_frames[0] == 1'b0)
11383
          begin
11384
            if (tmp_bd[15] === 1)
11385
            begin
11386
              if (first_fr_received == 1)
11387
              begin
11388
                first_fr_received = 0;
11389
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11390
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11391
                $display("    From this moment:");
11392
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11393
                if (tmp_data[31])
11394
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11395
                else
11396
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11397
              end
11398
            end
11399
          end
11400
          if (stop_checking_frame == 0)
11401
            disable send_packet0;
11402
        end
11403
      join
11404
      // ONLY IF packet was received!
11405
      if (tmp_bd[15] === 0)
11406
      begin
11407
        // check length of a PACKET
11408
        if (tmp_bd[31:16] != (i_length + 4))
11409
        begin
11410
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11411
                          tmp_bd[31:16], (i_length + 4));
11412
          test_fail("Wrong length of the packet out from PHY");
11413
          fail = fail + 1;
11414
        end
11415
        // check received RX packet data and CRC
11416
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11417
        begin
11418
          if (num_of_frames[1] == 1'b0)
11419
          begin
11420
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11421
          end
11422
          else
11423
          begin
11424
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11425
          end
11426
          if (tmp > 0)
11427
          begin
11428
            `TIME; $display("*E Wrong data of the received packet");
11429
            test_fail("Wrong data of the received packet");
11430
            fail = fail + 1;
11431
          end
11432
        end
11433
        else // if PREVIOUS RX buffer descriptor was ready
11434
        begin
11435
          if (num_of_frames[1] == 1'b0)
11436
          begin
11437
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11438
          end
11439
          else
11440
          begin
11441
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11442
          end
11443
          if (tmp > 0)
11444
          begin
11445
            `TIME; $display("*E Wrong data of the received packet");
11446
            test_fail("Wrong data of the received packet");
11447
            fail = fail + 1;
11448
          end
11449
        end
11450
      end
11451
      // check WB INT signal
11452
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11453
      begin
11454
        if (wb_int !== 1'b0)
11455
        begin
11456
          `TIME; $display("*E WB INT signal should not be set");
11457
          test_fail("WB INT signal should not be set");
11458
          fail = fail + 1;
11459
        end
11460
      end
11461
      else
11462
      begin
11463
        if (wb_int !== 1'b1)
11464
        begin
11465
          `TIME; $display("*E WB INT signal should be set");
11466
          test_fail("WB INT signal should be set");
11467
          fail = fail + 1;
11468
        end
11469
      end
11470
      // check RX buffer descriptor of a packet - only 15 LSBits
11471
      check_rx_bd(118, data);
11472
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11473
      begin
11474
        if (data[15:0] !== 16'hE000)
11475
        begin
11476
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11477
          test_fail("RX buffer descriptor status is not correct");
11478
          fail = fail + 1;
11479
        end
11480
      end
11481
      else // interrupt enabled
11482
      begin
11483 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
11484 243 tadejm
        begin
11485
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11486
          test_fail("RX buffer descriptor status is not correct");
11487
          fail = fail + 1;
11488
        end
11489
      end
11490
      // check interrupts
11491 274 tadejm
      wait (wbm_working == 0);
11492 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11493
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11494
      begin
11495
        if (data !== 0)
11496
        begin
11497
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11498
          test_fail("Any of interrupts was set");
11499
          fail = fail + 1;
11500
        end
11501
      end
11502
      else
11503
      begin
11504
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11505
        begin
11506
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11507
          test_fail("Interrupt Receive Buffer was not set");
11508
          fail = fail + 1;
11509
        end
11510
        if ((data & (~`ETH_INT_RXB)) !== 0)
11511
        begin
11512
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11513
          test_fail("Other interrupts (except Receive Buffer) were set");
11514
          fail = fail + 1;
11515
        end
11516
      end
11517
      // clear interrupts
11518 274 tadejm
      wait (wbm_working == 0);
11519 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11520
      // check WB INT signal
11521
      if (wb_int !== 1'b0)
11522
      begin
11523
        test_fail("WB INT signal should not be set");
11524
        fail = fail + 1;
11525
      end
11526
      // disable RX after two packets
11527
      if (num_of_frames[0] == 1'b1)
11528
      begin
11529
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11530 274 tadejm
        wait (wbm_working == 0);
11531 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11532
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11533
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11534
      end
11535
      // the number of frame transmitted
11536
      num_of_frames = num_of_frames + 1;
11537
      num_of_bd = 0;
11538
      // set length (LOOP variable)
11539
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11540
        i_length = (max_tmp - 4);
11541
      @(posedge wb_clk);
11542
    end
11543
    // disable RX
11544 274 tadejm
    wait (wbm_working == 0);
11545 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11546
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11547
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11548
    if(fail == 0)
11549
      test_ok;
11550
    else
11551
      fail = 0;
11552
  end
11553
 
11554
 
11555
  ////////////////////////////////////////////////////////////////////
11556
  ////                                                            ////
11557
  ////  Test receive packet synchronization with receive          ////
11558
  ////  disable/enable ( 100Mbps ).                               ////
11559
  ////                                                            ////
11560
  ////////////////////////////////////////////////////////////////////
11561
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11562
  begin
11563
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
11564
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
11565
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
11566
 
11567
    // unmask interrupts
11568 274 tadejm
    wait (wbm_working == 0);
11569 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11570
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11571
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11572 274 tadejm
    wait (wbm_working == 0);
11573 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11574
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11575 274 tadejm
    wait (wbm_working == 0);
11576 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11577
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11578
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11579
    // prepare two packets of MAXFL length
11580 274 tadejm
    wait (wbm_working == 0);
11581 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11582
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11583
    min_tmp = tmp[31:16];
11584
    st_data = 8'h0F;
11585
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11586
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11587
    st_data = 8'h1A;
11588
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11589
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11590
    // check WB INT signal
11591
    if (wb_int !== 1'b0)
11592
    begin
11593
      test_fail("WB INT signal should not be set");
11594
      fail = fail + 1;
11595
    end
11596
 
11597
    // write to phy's control register for 100Mbps
11598
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11599
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11600
    speed = 100;
11601
 
11602
    frame_started = 0;
11603
    frame_ended = 0;
11604
    wait_for_frame = 0;
11605
    check_frame = 0;
11606
    stop_checking_frame = 0;
11607
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11608
 
11609
    num_of_frames = 0; // 
11610
    num_of_bd = 0;
11611
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11612
    while (i_length < (max_tmp - 4))
11613
    begin
11614
      // choose generating carrier sense and collision 
11615
      case (num_of_frames[1:0])
11616
      2'h0: // Interrupt is generated
11617
      begin
11618
        // enable interrupt generation
11619
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11620
        // not detect carrier sense in FD and no collision
11621
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11622
        eth_phy.collision(0);
11623
      end
11624
      2'h1: // Interrupt is generated
11625
      begin
11626
        // enable interrupt generation
11627
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11628
        // detect carrier sense in FD and no collision
11629
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11630
        eth_phy.collision(0);
11631
      end
11632
      2'h2: // Interrupt is generated
11633
      begin
11634
        // disable interrupt generation
11635
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11636
        // not detect carrier sense in FD and set collision
11637
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11638
        eth_phy.collision(1);
11639
      end
11640
      default: // 2'h3: // Interrupt is generated
11641
      begin
11642
        // disable interrupt generation
11643
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11644
        // detect carrier sense in FD and set collision
11645
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11646
        eth_phy.collision(1);
11647
      end
11648
      endcase
11649
//if (first_fr_received == 0)
11650
//begin
11651
//  check_rx_bd(118, data);
11652 274 tadejm
//  wait (wbm_working == 0);
11653 243 tadejm
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11654
//  $display("RX BD set : %h, %h", data, tmp);
11655
//end
11656
      // set wrap bit
11657
      set_rx_bd_wrap(118);
11658
      set_rx_bd_empty(118, 118);
11659
      check_frame = 0;
11660
      stop_checking_frame = 0;
11661
      tmp_data = 0;
11662
      fork
11663
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11664
          if (num_of_frames[0] == 1'b0)
11665
          begin
11666
            repeat(1) @(posedge wb_clk);
11667
            if (num_of_frames[1] == 1'b0)
11668
            begin
11669
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11670
            end
11671
            else
11672
            begin
11673
              @(posedge mrx_clk);
11674
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11675
            end
11676
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11677
            wbm_init_waits = 4'h0;
11678
            wbm_subseq_waits = 4'h0;
11679 274 tadejm
            #1 wait (wbm_working == 0);
11680
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11681 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11682
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11683
$display("mama 2, num_of_frames=%0h", num_of_frames);
11684
          end
11685
        end
11686
        begin // send a packet from PHY RX
11687
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11688
          if (num_of_frames[1] == 1'b0)
11689
          begin
11690
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11691
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11692
          end
11693
          else
11694
          begin
11695
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11696
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11697
          end
11698
        end
11699
        begin: send_packet1
11700
          wait (MRxDV === 1'b1); // start transmit
11701
          wait (MRxDV === 1'b0); // end transmit
11702
          check_frame = 1;
11703
$display("mama 3");
11704
          repeat(10) @(posedge mrx_clk);
11705
          repeat(15) @(posedge wb_clk);
11706
          stop_checking_frame = 1;
11707
        end
11708
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11709
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11710
$display("mama 4");
11711
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11712
          begin
11713
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11714
$display("mama 4_1");
11715
          end
11716
          else if (MRxDV === 1'b1)
11717
          begin
11718
            while (eth_sl_wb_ack_o === 1'b0)
11719
            begin
11720
              @(posedge wb_clk);
11721
              tmp_data = tmp_data + 1;
11722
            end
11723
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11724
$display("mama 4_2");
11725
          end
11726
          else if (eth_sl_wb_ack_o === 1'b1)
11727
          begin
11728
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11729
            while (MRxDV === 1'b0)
11730
            begin
11731
              @(posedge wb_clk);
11732
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11733
            end
11734
$display("mama 4_3");
11735
          end
11736
        end
11737
        begin // check packet
11738
          wait (check_frame == 1);
11739
          check_rx_bd(118, tmp_bd);
11740
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11741
          begin
11742
            #1 check_rx_bd(118, tmp_bd);
11743
            @(posedge wb_clk);
11744
          end
11745
$display("mama 5, tmp_bd=%0h", tmp_bd);
11746
          if (num_of_frames[0] == 1'b0)
11747
          begin
11748
            if (tmp_bd[15] === 1)
11749
            begin
11750
              if (first_fr_received == 1)
11751
              begin
11752
                first_fr_received = 0;
11753
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11754
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11755
                $display("    From this moment:");
11756
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11757
                if (tmp_data[31])
11758
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11759
                else
11760
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11761
              end
11762
              // check FB, etc.
11763
 
11764
            end
11765
            else // (tmp_bd[15] === 0)
11766
            begin // check FB, packet, etc.
11767
 
11768
            end
11769
$display("mama 5_1");
11770
          end
11771
          else // (num_of_frames[0] == 1'b1)
11772
          begin
11773
            if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
11774
            begin // check NOTHING
11775
 
11776
            end
11777
            else // (tmp_bd[15] === 0)
11778
            begin // check FB, packet, etc.
11779
 
11780
            end
11781
$display("mama 5_2");
11782
          end
11783
          if (stop_checking_frame == 0)
11784
            disable send_packet1;
11785
        end
11786
      join
11787
      // ONLY IF packet was received!
11788
$display("mama 6");
11789
      if (tmp_bd[15] === 0)
11790
      begin
11791
        // check length of a PACKET
11792
        if (tmp_bd[31:16] != (i_length + 4))
11793
        begin
11794
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11795
                          tmp_bd[31:16], (i_length + 4));
11796
          test_fail("Wrong length of the packet out from PHY");
11797
          fail = fail + 1;
11798
        end
11799
        // check received RX packet data and CRC
11800
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11801
        begin
11802
          if (num_of_frames[1] == 1'b0)
11803
          begin
11804
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11805
          end
11806
          else
11807
          begin
11808
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11809
          end
11810
          if (tmp > 0)
11811
          begin
11812
            `TIME; $display("*E Wrong data of the received packet");
11813
            test_fail("Wrong data of the received packet");
11814
            fail = fail + 1;
11815
          end
11816
        end
11817
        else // if PREVIOUS RX buffer descriptor was ready
11818
        begin
11819
          if (num_of_frames[1] == 1'b0)
11820
          begin
11821
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11822
          end
11823
          else
11824
          begin
11825
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11826
          end
11827
          if (tmp > 0)
11828
          begin
11829
            `TIME; $display("*E Wrong data of the received packet");
11830
            test_fail("Wrong data of the received packet");
11831
            fail = fail + 1;
11832
          end
11833
        end
11834
      end
11835
      // check WB INT signal
11836
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11837
      begin
11838
        if (wb_int !== 1'b0)
11839
        begin
11840
          `TIME; $display("*E WB INT signal should not be set");
11841
          test_fail("WB INT signal should not be set");
11842
          fail = fail + 1;
11843
        end
11844
      end
11845
      else
11846
      begin
11847
        if (wb_int !== 1'b1)
11848
        begin
11849
          `TIME; $display("*E WB INT signal should be set");
11850
          test_fail("WB INT signal should be set");
11851
          fail = fail + 1;
11852
        end
11853
      end
11854
      // check RX buffer descriptor of a packet - only 15 LSBits
11855
      check_rx_bd(118, data);
11856
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11857
      begin
11858
        if (data[15:0] !== 16'hE000)
11859
        begin
11860
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11861
          test_fail("RX buffer descriptor status is not correct");
11862
          fail = fail + 1;
11863
        end
11864
      end
11865
      else // interrupt enabled
11866
      begin
11867 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
11868 243 tadejm
        begin
11869
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11870
          test_fail("RX buffer descriptor status is not correct");
11871
          fail = fail + 1;
11872
        end
11873
      end
11874
      // check interrupts
11875 274 tadejm
      wait (wbm_working == 0);
11876 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11877
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11878
      begin
11879
        if (data !== 0)
11880
        begin
11881
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11882
          test_fail("Any of interrupts was set");
11883
          fail = fail + 1;
11884
        end
11885
      end
11886
      else
11887
      begin
11888
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11889
        begin
11890
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11891
          test_fail("Interrupt Receive Buffer was not set");
11892
          fail = fail + 1;
11893
        end
11894
        if ((data & (~`ETH_INT_RXB)) !== 0)
11895
        begin
11896
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11897
          test_fail("Other interrupts (except Receive Buffer) were set");
11898
          fail = fail + 1;
11899
        end
11900
      end
11901
      // clear interrupts
11902 274 tadejm
      wait (wbm_working == 0);
11903 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11904
      // check WB INT signal
11905
      if (wb_int !== 1'b0)
11906
      begin
11907
        test_fail("WB INT signal should not be set");
11908
        fail = fail + 1;
11909
      end
11910
      // disable RX after two packets
11911
      if (num_of_frames[0] == 1'b1)
11912
      begin
11913
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11914 274 tadejm
        wait (wbm_working == 0);
11915 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11916
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11917
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11918
      end
11919
      // the number of frame transmitted
11920
      num_of_frames = num_of_frames + 1;
11921
      num_of_bd = 0;
11922
      // set length (LOOP variable)
11923
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11924
        i_length = (max_tmp - 4);
11925
      @(posedge wb_clk);
11926
    end
11927
    // disable RX
11928 274 tadejm
    wait (wbm_working == 0);
11929 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11930
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11931
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11932
    if(fail == 0)
11933
      test_ok;
11934
    else
11935
      fail = 0;
11936
  end
11937
 
11938
 
11939
  ////////////////////////////////////////////////////////////////////
11940
  ////                                                            ////
11941 209 tadejm
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11942
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
11943
  ////                                                            ////
11944
  ////////////////////////////////////////////////////////////////////
11945 243 tadejm
  if (test_num == 4) // 
11946 209 tadejm
  begin
11947 243 tadejm
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
11948
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
11949
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
11950 209 tadejm
 
11951
    // unmask interrupts
11952 274 tadejm
    wait (wbm_working == 0);
11953 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11954
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11955
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11956 274 tadejm
    wait (wbm_working == 0);
11957 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11958
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11959 274 tadejm
    wait (wbm_working == 0);
11960 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11961
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11962
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11963
    // prepare two packets of MAXFL length
11964 274 tadejm
    wait (wbm_working == 0);
11965 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11966
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11967
    min_tmp = tmp[31:16];
11968
    st_data = 8'h0F;
11969
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11970
    st_data = 8'h1A;
11971
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11972
    // check WB INT signal
11973
    if (wb_int !== 1'b0)
11974
    begin
11975
      test_fail("WB INT signal should not be set");
11976
      fail = fail + 1;
11977
    end
11978
 
11979
    // write to phy's control register for 10Mbps
11980
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11981
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11982
    speed = 10;
11983
 
11984
    i_length = (min_tmp - 4);
11985
    while (i_length <= (max_tmp - 4))
11986
    begin
11987
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11988
      case (i_length[1:0])
11989
      2'h0: // Interrupt is generated
11990
      begin
11991
        // enable interrupt generation
11992
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11993
        // unmask interrupts
11994 274 tadejm
        wait (wbm_working == 0);
11995 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11996
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11997
        // not detect carrier sense in FD and no collision
11998
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11999
        eth_phy.collision(0);
12000
      end
12001
      2'h1: // Interrupt is not generated
12002
      begin
12003
        // enable interrupt generation
12004
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12005
        // mask interrupts
12006 274 tadejm
        wait (wbm_working == 0);
12007 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12008
        // detect carrier sense in FD and no collision
12009
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12010
        eth_phy.collision(0);
12011
      end
12012
      2'h2: // Interrupt is not generated
12013
      begin
12014
        // disable interrupt generation
12015
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12016
        // unmask interrupts
12017 274 tadejm
        wait (wbm_working == 0);
12018 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12019
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12020
        // not detect carrier sense in FD and set collision
12021
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12022
        eth_phy.collision(1);
12023
      end
12024
      default: // 2'h3: // Interrupt is not generated
12025
      begin
12026
        // disable interrupt generation
12027
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12028
        // mask interrupts
12029 274 tadejm
        wait (wbm_working == 0);
12030 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12031
        // detect carrier sense in FD and set collision
12032
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12033
        eth_phy.collision(1);
12034
      end
12035
      endcase
12036
      if (i_length[0] == 1'b0)
12037
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12038
      else
12039
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12040
      // set wrap bit
12041
      set_rx_bd_wrap(127);
12042
      set_rx_bd_empty(127, 127);
12043
      fork
12044
        begin
12045
          if (i_length[0] == 1'b0)
12046
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12047
          else
12048
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12049
          repeat(10) @(posedge mrx_clk);
12050
        end
12051
        begin
12052
          #1 check_rx_bd(127, data);
12053
          if (i_length < min_tmp) // just first four
12054
          begin
12055
            while (data[15] === 1)
12056
            begin
12057
              #1 check_rx_bd(127, data);
12058
              @(posedge wb_clk);
12059
            end
12060
            repeat (1) @(posedge wb_clk);
12061
          end
12062
          else
12063
          begin
12064
            wait (MRxDV === 1'b1); // start transmit
12065
            #1 check_rx_bd(127, data);
12066
            if (data[15] !== 1)
12067
            begin
12068
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12069
              fail = fail + 1;
12070
            end
12071
            wait (MRxDV === 1'b0); // end transmit
12072
            while (data[15] === 1)
12073
            begin
12074
              #1 check_rx_bd(127, data);
12075
              @(posedge wb_clk);
12076
            end
12077
            repeat (1) @(posedge wb_clk);
12078
          end
12079
        end
12080
      join
12081
      // check length of a PACKET
12082
      if (data[31:16] != (i_length + 4))
12083
      begin
12084
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12085
                        data[31:16], (i_length + 4));
12086
        test_fail("Wrong length of the packet out from PHY");
12087
        fail = fail + 1;
12088
      end
12089
      // checking in the following if statement is performed only for first and last 64 lengths
12090
      // check received RX packet data and CRC
12091
      if (i_length[0] == 1'b0)
12092
      begin
12093
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12094
      end
12095
      else
12096
      begin
12097
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12098
      end
12099
      if (tmp > 0)
12100
      begin
12101
        `TIME; $display("*E Wrong data of the received packet");
12102
        test_fail("Wrong data of the received packet");
12103
        fail = fail + 1;
12104
      end
12105
      // check WB INT signal
12106
      if (i_length[1:0] == 2'h0)
12107
      begin
12108
        if (wb_int !== 1'b1)
12109
        begin
12110
          `TIME; $display("*E WB INT signal should be set");
12111
          test_fail("WB INT signal should be set");
12112
          fail = fail + 1;
12113
        end
12114
      end
12115
      else
12116
      begin
12117
        if (wb_int !== 1'b0)
12118
        begin
12119
          `TIME; $display("*E WB INT signal should not be set");
12120
          test_fail("WB INT signal should not be set");
12121
          fail = fail + 1;
12122
        end
12123
      end
12124
      // check RX buffer descriptor of a packet
12125
      check_rx_bd(127, data);
12126
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
12127
      begin
12128 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12129
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12130 209 tadejm
        begin
12131
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12132
          test_fail("RX buffer descriptor status is not correct");
12133
          fail = fail + 1;
12134
        end
12135
      end
12136
      else // interrupt not enabled
12137
      begin
12138 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12139
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12140 209 tadejm
        begin
12141
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12142
          test_fail("RX buffer descriptor status is not correct");
12143
          fail = fail + 1;
12144
        end
12145
      end
12146
      // clear RX buffer descriptor for first 4 frames
12147
      if (i_length < min_tmp)
12148
        clear_rx_bd(127, 127);
12149
      // check interrupts
12150 274 tadejm
      wait (wbm_working == 0);
12151 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12152
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12153
      begin
12154
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12155
        begin
12156
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12157
          test_fail("Interrupt Receive Buffer was not set");
12158
          fail = fail + 1;
12159
        end
12160
        if ((data & (~`ETH_INT_RXB)) !== 0)
12161
        begin
12162
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12163
          test_fail("Other interrupts (except Receive Buffer) were set");
12164
          fail = fail + 1;
12165
        end
12166
      end
12167
      else
12168
      begin
12169
        if (data !== 0)
12170
        begin
12171
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12172
          test_fail("Any of interrupts (except Receive Buffer) was set");
12173
          fail = fail + 1;
12174
        end
12175
      end
12176
      // clear interrupts
12177 274 tadejm
      wait (wbm_working == 0);
12178 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12179
      // check WB INT signal
12180
      if (wb_int !== 1'b0)
12181
      begin
12182
        test_fail("WB INT signal should not be set");
12183
        fail = fail + 1;
12184
      end
12185
      // INTERMEDIATE DISPLAYS
12186
      if ((i_length + 4) == (min_tmp + 64))
12187
      begin
12188
        // starting length is min_tmp, ending length is (min_tmp + 64)
12189
        $display("    receive small packets is NOT selected");
12190
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12191
                 min_tmp, (min_tmp + 64));
12192
        // set receive small, remain the rest
12193 274 tadejm
        wait (wbm_working == 0);
12194 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12195
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12196
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12197
      end
12198
      else if ((i_length + 4) == (max_tmp - 16))
12199
      begin
12200
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12201
        $display("    receive small packets is selected");
12202
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12203
                 (min_tmp + 64 + 128), tmp_data);
12204
        // reset receive small, remain the rest
12205 274 tadejm
        wait (wbm_working == 0);
12206 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12207
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12208
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12209
      end
12210
      else if ((i_length + 4) == max_tmp)
12211
      begin
12212
        $display("    receive small packets is NOT selected");
12213
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12214
                 (max_tmp - (4 + 16)), max_tmp);
12215
      end
12216
      // set length (loop variable)
12217
      if ((i_length + 4) < (min_tmp + 64))
12218
        i_length = i_length + 1;
12219
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12220
      begin
12221
        i_length = i_length + 128;
12222
        tmp_data = i_length + 4; // last tmp_data is ending length
12223
      end
12224
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12225
        i_length = max_tmp - (4 + 16);
12226
      else if ((i_length + 4) >= (max_tmp - 16))
12227
        i_length = i_length + 1;
12228
      else
12229
      begin
12230
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12231
        #10 $stop;
12232
      end
12233
    end
12234
    // disable RX
12235 274 tadejm
    wait (wbm_working == 0);
12236 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12237
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12238
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12239
    if(fail == 0)
12240
      test_ok;
12241
    else
12242
      fail = 0;
12243
  end
12244
 
12245
 
12246
  ////////////////////////////////////////////////////////////////////
12247
  ////                                                            ////
12248
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12249
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
12250
  ////                                                            ////
12251
  ////////////////////////////////////////////////////////////////////
12252 243 tadejm
  if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
12253 209 tadejm
  begin
12254 243 tadejm
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
12255
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
12256
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
12257 209 tadejm
 
12258
    // unmask interrupts
12259 274 tadejm
    wait (wbm_working == 0);
12260 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12261
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12262
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
12263 274 tadejm
    wait (wbm_working == 0);
12264 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12265
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12266 274 tadejm
    wait (wbm_working == 0);
12267 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12268
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12269
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12270
    // prepare two packets of MAXFL length
12271 274 tadejm
    wait (wbm_working == 0);
12272 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12273
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12274
    min_tmp = tmp[31:16];
12275
    st_data = 8'h0F;
12276
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12277
    st_data = 8'h1A;
12278
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12279
    // check WB INT signal
12280
    if (wb_int !== 1'b0)
12281
    begin
12282
      test_fail("WB INT signal should not be set");
12283
      fail = fail + 1;
12284
    end
12285
 
12286
    // write to phy's control register for 100Mbps
12287
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
12288
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
12289
    speed = 100;
12290
 
12291
    i_length = (min_tmp - 4);
12292
    while (i_length <= (max_tmp - 4))
12293
    begin
12294
      // choose generating carrier sense and collision for first and last 64 lengths of frames
12295
      case (i_length[1:0])
12296
      2'h0: // Interrupt is generated
12297
      begin
12298
        // enable interrupt generation
12299
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12300
        // unmask interrupts
12301 274 tadejm
        wait (wbm_working == 0);
12302 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12303
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12304
        // not detect carrier sense in FD and no collision
12305
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12306
        eth_phy.collision(0);
12307
      end
12308
      2'h1: // Interrupt is not generated
12309
      begin
12310
        // enable interrupt generation
12311
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12312
        // mask interrupts
12313 274 tadejm
        wait (wbm_working == 0);
12314 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12315
        // detect carrier sense in FD and no collision
12316
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12317
        eth_phy.collision(0);
12318
      end
12319
      2'h2: // Interrupt is not generated
12320
      begin
12321
        // disable interrupt generation
12322
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12323
        // unmask interrupts
12324 274 tadejm
        wait (wbm_working == 0);
12325 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12326
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12327
        // not detect carrier sense in FD and set collision
12328
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12329
        eth_phy.collision(1);
12330
      end
12331
      default: // 2'h3: // Interrupt is not generated
12332
      begin
12333
        // disable interrupt generation
12334
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12335
        // mask interrupts
12336 274 tadejm
        wait (wbm_working == 0);
12337 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12338
        // detect carrier sense in FD and set collision
12339
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12340
        eth_phy.collision(1);
12341
      end
12342
      endcase
12343
      if (i_length[0] == 1'b0)
12344
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12345
      else
12346
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12347
      // set wrap bit
12348
      set_rx_bd_wrap(127);
12349
      set_rx_bd_empty(127, 127);
12350
      fork
12351
        begin
12352
          if (i_length[0] == 1'b0)
12353
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12354
          else
12355
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12356
          repeat(10) @(posedge mrx_clk);
12357
        end
12358
        begin
12359
          #1 check_rx_bd(127, data);
12360
          if (i_length < min_tmp) // just first four
12361
          begin
12362
            while (data[15] === 1)
12363
            begin
12364
              #1 check_rx_bd(127, data);
12365
              @(posedge wb_clk);
12366
            end
12367
            repeat (1) @(posedge wb_clk);
12368
          end
12369
          else
12370
          begin
12371
            wait (MRxDV === 1'b1); // start transmit
12372
            #1 check_rx_bd(127, data);
12373
            if (data[15] !== 1)
12374
            begin
12375
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12376
              fail = fail + 1;
12377
            end
12378
            wait (MRxDV === 1'b0); // end transmit
12379
            while (data[15] === 1)
12380
            begin
12381
              #1 check_rx_bd(127, data);
12382
              @(posedge wb_clk);
12383
            end
12384
            repeat (1) @(posedge wb_clk);
12385
          end
12386
        end
12387
      join
12388
      // check length of a PACKET
12389
      if (data[31:16] != (i_length + 4))
12390
      begin
12391
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12392
                        data[31:16], (i_length + 4));
12393
        test_fail("Wrong length of the packet out from PHY");
12394
        fail = fail + 1;
12395
      end
12396
      // checking in the following if statement is performed only for first and last 64 lengths
12397
      // check received RX packet data and CRC
12398
      if (i_length[0] == 1'b0)
12399
      begin
12400
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12401
      end
12402
      else
12403
      begin
12404
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12405
      end
12406
      if (tmp > 0)
12407
      begin
12408
        `TIME; $display("*E Wrong data of the received packet");
12409
        test_fail("Wrong data of the received packet");
12410
        fail = fail + 1;
12411
      end
12412
      // check WB INT signal
12413
      if (i_length[1:0] == 2'h0)
12414
      begin
12415
        if (wb_int !== 1'b1)
12416
        begin
12417
          `TIME; $display("*E WB INT signal should be set");
12418
          test_fail("WB INT signal should be set");
12419
          fail = fail + 1;
12420
        end
12421
      end
12422
      else
12423
      begin
12424
        if (wb_int !== 1'b0)
12425
        begin
12426
          `TIME; $display("*E WB INT signal should not be set");
12427
          test_fail("WB INT signal should not be set");
12428
          fail = fail + 1;
12429
        end
12430
      end
12431
      // check RX buffer descriptor of a packet
12432
      check_rx_bd(127, data);
12433
      if (i_length[1] == 1'b0) // interrupt enabled 
12434
      begin
12435 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12436
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12437 209 tadejm
        begin
12438
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12439
          test_fail("RX buffer descriptor status is not correct");
12440
          fail = fail + 1;
12441
        end
12442
      end
12443
      else // interrupt not enabled
12444
      begin
12445 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12446
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12447 209 tadejm
        begin
12448
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12449
          test_fail("RX buffer descriptor status is not correct");
12450
          fail = fail + 1;
12451
        end
12452
      end
12453
      // clear RX buffer descriptor for first 4 frames
12454
      if (i_length < min_tmp)
12455
        clear_rx_bd(127, 127);
12456
      // check interrupts
12457 274 tadejm
      wait (wbm_working == 0);
12458 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12459
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12460
      begin
12461
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12462
        begin
12463
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12464
          test_fail("Interrupt Receive Buffer was not set");
12465
          fail = fail + 1;
12466
        end
12467
        if ((data & (~`ETH_INT_RXB)) !== 0)
12468
        begin
12469
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12470
          test_fail("Other interrupts (except Receive Buffer) were set");
12471
          fail = fail + 1;
12472
        end
12473
      end
12474
      else
12475
      begin
12476
        if (data !== 0)
12477
        begin
12478
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12479
          test_fail("Any of interrupts (except Receive Buffer) was set");
12480
          fail = fail + 1;
12481
        end
12482
      end
12483
      // clear interrupts
12484 274 tadejm
      wait (wbm_working == 0);
12485 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12486
      // check WB INT signal
12487
      if (wb_int !== 1'b0)
12488
      begin
12489
        test_fail("WB INT signal should not be set");
12490
        fail = fail + 1;
12491
      end
12492
      // INTERMEDIATE DISPLAYS
12493
      if ((i_length + 4) == (min_tmp + 64))
12494
      begin
12495
        // starting length is min_tmp, ending length is (min_tmp + 64)
12496
        $display("    receive small packets is NOT selected");
12497
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12498
                 min_tmp, (min_tmp + 64));
12499
        // set receive small, remain the rest
12500 274 tadejm
        wait (wbm_working == 0);
12501 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12502
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12503
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12504
      end
12505
      else if ((i_length + 4) == (max_tmp - 16))
12506
      begin
12507
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12508
        $display("    receive small packets is selected");
12509
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12510
                 (min_tmp + 64 + 128), tmp_data);
12511
        // reset receive small, remain the rest
12512 274 tadejm
        wait (wbm_working == 0);
12513 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12514
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12515
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12516
      end
12517
      else if ((i_length + 4) == max_tmp)
12518
      begin
12519
        $display("    receive small packets is NOT selected");
12520
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12521
                 (max_tmp - (4 + 16)), max_tmp);
12522
      end
12523
      // set length (loop variable)
12524
      if ((i_length + 4) < (min_tmp + 64))
12525
        i_length = i_length + 1;
12526
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12527
      begin
12528
        i_length = i_length + 128;
12529
        tmp_data = i_length + 4; // last tmp_data is ending length
12530
      end
12531
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12532
        i_length = max_tmp - (4 + 16);
12533
      else if ((i_length + 4) >= (max_tmp - 16))
12534
        i_length = i_length + 1;
12535
      else
12536
      begin
12537
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12538
        #10 $stop;
12539
      end
12540
    end
12541
    // disable RX
12542 274 tadejm
    wait (wbm_working == 0);
12543 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12544
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12545
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12546
    if(fail == 0)
12547
      test_ok;
12548
    else
12549
      fail = 0;
12550
  end
12551
 
12552
 
12553
  ////////////////////////////////////////////////////////////////////
12554
  ////                                                            ////
12555
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12556
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
12557
  ////                                                            ////
12558
  ////////////////////////////////////////////////////////////////////
12559 243 tadejm
  if (test_num == 6) // 
12560 209 tadejm
  begin
12561 243 tadejm
    // TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
12562
    test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
12563
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
12564 209 tadejm
 
12565
    // reset MAC registers
12566
    hard_reset;
12567
    // reset MAC and MII LOGIC with soft reset
12568 274 tadejm
//    reset_mac;
12569
//    reset_mii;
12570 209 tadejm
    // set wb slave response
12571
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12572
 
12573
    max_tmp = 0;
12574
    min_tmp = 0;
12575
    num_of_frames = 0;
12576
    num_of_bd = 0;
12577
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12578 274 tadejm
    wait (wbm_working == 0);
12579 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12580
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12581 274 tadejm
    wait (wbm_working == 0);
12582 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12583
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12584
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12585
    // prepare two packets of MAXFL length
12586 274 tadejm
    wait (wbm_working == 0);
12587 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12588
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12589
    min_tmp = tmp[31:16];
12590
    st_data = 8'hAC;
12591
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12592
    st_data = 8'h35;
12593
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12594
    // check WB INT signal
12595
    if (wb_int !== 1'b0)
12596
    begin
12597
      test_fail("WB INT signal should not be set");
12598
      fail = fail + 1;
12599
    end
12600
 
12601
    // write to phy's control register for 10Mbps
12602
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12603
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12604
    speed = 10;
12605
 
12606
    i_length = (min_tmp - 4);
12607
    while (i_length <= (max_tmp - 4))
12608
    begin
12609
      // append CRC to packet
12610
      if (i_length[0] == 1'b0)
12611
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12612
      else
12613
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12614
      // choose generating carrier sense and collision
12615
      case (i_length[1:0])
12616
      2'h0: // Interrupt is generated
12617
      begin
12618
        // Reset_tx_bd nable interrupt generation
12619
        // unmask interrupts
12620 274 tadejm
        wait (wbm_working == 0);
12621 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12622
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12623
        // not detect carrier sense in FD and no collision
12624
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12625
        eth_phy.collision(0);
12626
      end
12627
      2'h1: // Interrupt is not generated
12628
      begin
12629
        // set_tx_bd enable interrupt generation
12630
        // mask interrupts
12631 274 tadejm
        wait (wbm_working == 0);
12632 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12633
        // detect carrier sense in FD and no collision
12634
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12635
        eth_phy.collision(0);
12636
      end
12637
      2'h2: // Interrupt is not generated
12638
      begin
12639
        // set_tx_bd disable the interrupt generation
12640
        // unmask interrupts
12641 274 tadejm
        wait (wbm_working == 0);
12642 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12643
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12644
        // not detect carrier sense in FD and set collision
12645
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12646
        eth_phy.collision(1);
12647
      end
12648
      default: // 2'h3: // Interrupt is not generated
12649
      begin
12650
        // set_tx_bd disable the interrupt generation
12651
        // mask interrupts
12652 274 tadejm
        wait (wbm_working == 0);
12653 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12654
        // detect carrier sense in FD and set collision
12655
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12656
        eth_phy.collision(1);
12657
      end
12658
      endcase
12659
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12660
      // number of all frames is 154 (146 without first 8)
12661
      if (num_of_frames < 8)
12662
      begin
12663
        case (i_length[1:0])
12664
        2'h0: // Interrupt is generated
12665
        begin
12666
          // enable interrupt generation
12667
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12668
          // interrupts are unmasked
12669
        end
12670
        2'h1: // Interrupt is not generated
12671
        begin
12672
          // enable interrupt generation
12673
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12674
          // interrupts are masked
12675
        end
12676
        2'h2: // Interrupt is not generated
12677
        begin
12678
          // disable interrupt generation
12679
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12680
          // interrupts are unmasked
12681
        end
12682
        default: // 2'h3: // Interrupt is not generated
12683
        begin
12684
          // disable interrupt generation
12685
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12686
          // interrupts are masked
12687
        end
12688
        endcase
12689
        // set wrap bit
12690
        set_rx_bd_wrap(0);
12691
      end
12692
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12693
      else if ((num_of_frames - 8) == 0)
12694
      begin
12695
        tmp_len = i_length; // length of frame
12696
        tmp_bd_num = 0; // RX BD number
12697
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12698
        begin
12699
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12700
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12701
          if (tmp_len[0] == 0)
12702
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12703
          else
12704
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12705
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12706
          if ((tmp_len + 4) < (min_tmp + 128))
12707
            tmp_len = tmp_len + 1;
12708
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12709
            tmp_len = 256;
12710
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12711
            tmp_len = tmp_len + 128;
12712
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12713
            tmp_len = max_tmp - (4 + 16);
12714
          else if ((tmp_len + 4) >= (max_tmp - 16))
12715
            tmp_len = tmp_len + 1;
12716
          // set RX BD number
12717
          tmp_bd_num = tmp_bd_num + 1;
12718
        end
12719
        // set wrap bit
12720
        set_rx_bd_wrap(127);
12721
      end
12722
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12723
      else if ((num_of_frames - 8) == 20) // 128
12724
      begin
12725
        tmp_len = tmp_len; // length of frame remaines from previous settings
12726
        tmp_bd_num = 0; // TX BD number
12727
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12728
        begin
12729
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12730
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12731
          if (tmp_len[0] == 0)
12732
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12733
          else
12734
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12735
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12736
          if ((tmp_len + 4) < (min_tmp + 128))
12737
            tmp_len = tmp_len + 1;
12738
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12739
            tmp_len = 256;
12740
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12741
            tmp_len = tmp_len + 128;
12742
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12743
            tmp_len = max_tmp - (4 + 16);
12744
          else if ((tmp_len + 4) >= (max_tmp - 16))
12745
            tmp_len = tmp_len + 1;
12746
          // set TX BD number
12747
          tmp_bd_num = tmp_bd_num + 1;
12748
        end
12749
      end
12750
      // set empty bit
12751
      if (num_of_frames < 8)
12752
        set_rx_bd_empty(0, 0);
12753
      else if ((num_of_frames - 8) < 128)
12754
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12755
      else if ((num_of_frames - 136) < 19)
12756
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12757
      // CHECK END OF RECEIVE
12758
      fork
12759
        begin
12760
          if (i_length[0] == 1'b0)
12761
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12762
          else
12763
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12764
          repeat(10) @(posedge mrx_clk);
12765
        end
12766
        begin
12767
          #1 check_rx_bd(num_of_bd, data);
12768
          if (i_length < min_tmp) // just first four
12769
          begin
12770
            while (data[15] === 1)
12771
            begin
12772
              #1 check_rx_bd(num_of_bd, data);
12773
              @(posedge wb_clk);
12774
            end
12775
            repeat (1) @(posedge wb_clk);
12776
          end
12777
          else
12778
          begin
12779
            wait (MRxDV === 1'b1); // start transmit
12780
            #1 check_rx_bd(num_of_bd, data);
12781
            if (data[15] !== 1)
12782
            begin
12783
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12784
              fail = fail + 1;
12785
            end
12786
            wait (MRxDV === 1'b0); // end transmit
12787
            while (data[15] === 1)
12788
            begin
12789
              #1 check_rx_bd(num_of_bd, data);
12790
              @(posedge wb_clk);
12791
            end
12792
            repeat (1) @(posedge wb_clk);
12793
          end
12794
        end
12795
      join
12796
      // check length of a PACKET
12797
      if (data[31:16] != (i_length + 4))
12798
      begin
12799
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12800
                        data[31:16], (i_length + 4));
12801
        test_fail("Wrong length of the packet out from PHY");
12802
        fail = fail + 1;
12803
      end
12804
      // checking in the following if statement is performed only for first and last 64 lengths
12805
      // check received RX packet data and CRC
12806
      if (i_length[0] == 1'b0)
12807
      begin
12808
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12809
      end
12810
      else
12811
      begin
12812
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12813
      end
12814
      if (tmp > 0)
12815
      begin
12816
        `TIME; $display("*E Wrong data of the received packet");
12817
        test_fail("Wrong data of the received packet");
12818
        fail = fail + 1;
12819
      end
12820
      // check WB INT signal
12821
      if (i_length[1:0] == 2'h0)
12822
      begin
12823
        if (wb_int !== 1'b1)
12824
        begin
12825
          `TIME; $display("*E WB INT signal should be set");
12826
          test_fail("WB INT signal should be set");
12827
          fail = fail + 1;
12828
        end
12829
      end
12830
      else
12831
      begin
12832
        if (wb_int !== 1'b0)
12833
        begin
12834
          `TIME; $display("*E WB INT signal should not be set");
12835
          test_fail("WB INT signal should not be set");
12836
          fail = fail + 1;
12837
        end
12838
      end
12839
      // check RX buffer descriptor of a packet
12840
      check_rx_bd(num_of_bd, data);
12841
      if (i_length[1] == 1'b0) // interrupt enabled
12842
      begin
12843 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12844
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12845 209 tadejm
        begin
12846
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12847
          test_fail("RX buffer descriptor status is not correct");
12848
          fail = fail + 1;
12849
        end
12850
      end
12851
      else // interrupt not enabled
12852
      begin
12853 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12854
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12855 209 tadejm
        begin
12856
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12857
          test_fail("RX buffer descriptor status is not correct");
12858
          fail = fail + 1;
12859
        end
12860
      end
12861
      // clear first half of 8 frames from RX buffer descriptor 0
12862
      if (num_of_frames < 4)
12863
        clear_rx_bd(num_of_bd, num_of_bd);
12864
      // clear BD with wrap bit
12865
      if (num_of_frames == 140)
12866
        clear_rx_bd(127, 127);
12867
      // check interrupts
12868 274 tadejm
      wait (wbm_working == 0);
12869 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12870
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12871
      begin
12872
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12873
        begin
12874
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12875
          test_fail("Interrupt Receive Buffer was not set");
12876
          fail = fail + 1;
12877
        end
12878
        if ((data & (~`ETH_INT_RXB)) !== 0)
12879
        begin
12880
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12881
          test_fail("Other interrupts (except Receive Buffer) were set");
12882
          fail = fail + 1;
12883
        end
12884
      end
12885
      else
12886
      begin
12887
        if (data !== 0)
12888
        begin
12889
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12890
          test_fail("Any of interrupts (except Receive Buffer) was set");
12891
          fail = fail + 1;
12892
        end
12893
      end
12894
      // clear interrupts
12895 274 tadejm
      wait (wbm_working == 0);
12896 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12897
      // check WB INT signal
12898
      if (wb_int !== 1'b0)
12899
      begin
12900
        test_fail("WB INT signal should not be set");
12901
        fail = fail + 1;
12902
      end
12903
      // INTERMEDIATE DISPLAYS
12904
      if ((i_length + 4) == (min_tmp + 7))
12905
      begin
12906
        // starting length is min_tmp, ending length is (min_tmp + 128)
12907
        $display("    receive small packets is NOT selected");
12908
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12909
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12910
                 min_tmp, (min_tmp + 7));
12911
        $display("    ->all packets were received on RX BD 0");
12912
        // reset receive small, remain the rest
12913 274 tadejm
        wait (wbm_working == 0);
12914 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12915
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12916
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12917
      end
12918
      else if ((i_length + 4) == (min_tmp + 128))
12919
      begin
12920
        // starting length is min_tmp, ending length is (min_tmp + 128)
12921
        $display("    receive small packets is NOT selected");
12922
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12923
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12924
                 (min_tmp + 8), (min_tmp + 128));
12925
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12926
                 1'b0, num_of_bd);
12927
        tmp_bd = num_of_bd + 1;
12928
        // set receive small, remain the rest
12929 274 tadejm
        wait (wbm_working == 0);
12930 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12931
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12932
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12933
      end
12934
      else if ((i_length + 4) == (max_tmp - 16))
12935
      begin
12936
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12937
        $display("    receive small packets is selected");
12938
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12939
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12940
                 (min_tmp + 64 + 128), tmp_data);
12941
        if (tmp_bd > num_of_bd)
12942
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12943
                   tmp_bd, num_of_bd);
12944
        else
12945
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12946
                   tmp_bd, num_of_bd);
12947
        tmp_bd = num_of_bd + 1;
12948
        // reset receive small, remain the rest
12949 274 tadejm
        wait (wbm_working == 0);
12950 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12951
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12952
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12953
      end
12954
      else if ((i_length + 4) == max_tmp)
12955
      begin
12956
        $display("    receive small packets is NOT selected");
12957
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12958
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12959
                 (max_tmp - (4 + 16)), max_tmp);
12960
        if (tmp_bd > num_of_bd)
12961
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12962
                   tmp_bd, num_of_bd);
12963
        else
12964
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12965
                   tmp_bd, num_of_bd);
12966
      end
12967
      // set length (loop variable)
12968
      if ((i_length + 4) < (min_tmp + 128))
12969
        i_length = i_length + 1;
12970
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12971
        i_length = 256;
12972
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12973
      begin
12974
        i_length = i_length + 128;
12975
        tmp_data = i_length + 4; // last tmp_data is ending length
12976
      end
12977
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12978
        i_length = max_tmp - (4 + 16);
12979
      else if ((i_length + 4) >= (max_tmp - 16))
12980
        i_length = i_length + 1;
12981
      else
12982
      begin
12983
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12984
        #10 $stop;
12985
      end
12986
      // the number of frame transmitted
12987
      num_of_frames = num_of_frames + 1;
12988
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12989
        num_of_bd = 0;
12990
      else
12991
        num_of_bd = num_of_bd + 1;
12992
    end
12993
    // disable RX
12994 274 tadejm
    wait (wbm_working == 0);
12995 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12996
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12997
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12998
    @(posedge wb_clk);
12999
    if(fail == 0)
13000
      test_ok;
13001
    else
13002
      fail = 0;
13003
  end
13004
 
13005
 
13006
  ////////////////////////////////////////////////////////////////////
13007
  ////                                                            ////
13008
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
13009
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
13010
  ////                                                            ////
13011
  ////////////////////////////////////////////////////////////////////
13012 243 tadejm
  if (test_num == 7) // 
13013 209 tadejm
  begin
13014 243 tadejm
    // TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
13015
    test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
13016
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
13017 209 tadejm
 
13018
    // reset MAC registers
13019
    hard_reset;
13020
    // reset MAC and MII LOGIC with soft reset
13021 274 tadejm
//    reset_mac;
13022
//    reset_mii;
13023 209 tadejm
    // set wb slave response
13024
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13025
 
13026
    max_tmp = 0;
13027
    min_tmp = 0;
13028
    num_of_frames = 0;
13029
    num_of_bd = 0;
13030
    // set maximum RX buffer descriptors (128) - must be set before RX enable
13031 274 tadejm
    wait (wbm_working == 0);
13032 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13033
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
13034 274 tadejm
    wait (wbm_working == 0);
13035 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13036
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13037
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13038
    // prepare two packets of MAXFL length
13039 274 tadejm
    wait (wbm_working == 0);
13040 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13041
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13042
    min_tmp = tmp[31:16];
13043
    st_data = 8'hAC;
13044
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13045
    st_data = 8'h35;
13046
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13047
    // check WB INT signal
13048
    if (wb_int !== 1'b0)
13049
    begin
13050
      test_fail("WB INT signal should not be set");
13051
      fail = fail + 1;
13052
    end
13053
 
13054
    // write to phy's control register for 100Mbps
13055
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
13056
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
13057
    speed = 100;
13058
 
13059
    i_length = (min_tmp - 4);
13060
    while (i_length <= (max_tmp - 4))
13061
    begin
13062
      // append CRC to packet
13063
      if (i_length[0] == 1'b0)
13064
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13065
      else
13066
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13067
      // choose generating carrier sense and collision
13068
      case (i_length[1:0])
13069
      2'h0: // Interrupt is generated
13070
      begin
13071
        // Reset_tx_bd nable interrupt generation
13072
        // unmask interrupts
13073 274 tadejm
        wait (wbm_working == 0);
13074 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13075
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13076
        // not detect carrier sense in FD and no collision
13077
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13078
        eth_phy.collision(0);
13079
      end
13080
      2'h1: // Interrupt is not generated
13081
      begin
13082
        // set_tx_bd enable interrupt generation
13083
        // mask interrupts
13084 274 tadejm
        wait (wbm_working == 0);
13085 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13086
        // detect carrier sense in FD and no collision
13087
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13088
        eth_phy.collision(0);
13089
      end
13090
      2'h2: // Interrupt is not generated
13091
      begin
13092
        // set_tx_bd disable the interrupt generation
13093
        // unmask interrupts
13094 274 tadejm
        wait (wbm_working == 0);
13095 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13096
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13097
        // not detect carrier sense in FD and set collision
13098
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13099
        eth_phy.collision(1);
13100
      end
13101
      default: // 2'h3: // Interrupt is not generated
13102
      begin
13103
        // set_tx_bd disable the interrupt generation
13104
        // mask interrupts
13105 274 tadejm
        wait (wbm_working == 0);
13106 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13107
        // detect carrier sense in FD and set collision
13108
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13109
        eth_phy.collision(1);
13110
      end
13111
      endcase
13112
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
13113
      // number of all frames is 154 (146 without first 8)
13114
      if (num_of_frames < 8)
13115
      begin
13116
        case (i_length[1:0])
13117
        2'h0: // Interrupt is generated
13118
        begin
13119
          // enable interrupt generation
13120
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13121
          // interrupts are unmasked
13122
        end
13123
        2'h1: // Interrupt is not generated
13124
        begin
13125
          // enable interrupt generation
13126
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13127
          // interrupts are masked
13128
        end
13129
        2'h2: // Interrupt is not generated
13130
        begin
13131
          // disable interrupt generation
13132
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
13133
          // interrupts are unmasked
13134
        end
13135
        default: // 2'h3: // Interrupt is not generated
13136
        begin
13137
          // disable interrupt generation
13138
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13139
          // interrupts are masked
13140
        end
13141
        endcase
13142
        // set wrap bit
13143
        set_rx_bd_wrap(0);
13144
      end
13145
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
13146
      else if ((num_of_frames - 8) == 0)
13147
      begin
13148
        tmp_len = i_length; // length of frame
13149
        tmp_bd_num = 0; // RX BD number
13150
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13151
        begin
13152
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13153
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13154
          if (tmp_len[0] == 0)
13155
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13156
          else
13157
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13158
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13159
          if ((tmp_len + 4) < (min_tmp + 128))
13160
            tmp_len = tmp_len + 1;
13161
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13162
            tmp_len = 256;
13163
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13164
            tmp_len = tmp_len + 128;
13165
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13166
            tmp_len = max_tmp - (4 + 16);
13167
          else if ((tmp_len + 4) >= (max_tmp - 16))
13168
            tmp_len = tmp_len + 1;
13169
          // set RX BD number
13170
          tmp_bd_num = tmp_bd_num + 1;
13171
        end
13172
        // set wrap bit
13173
        set_rx_bd_wrap(127);
13174
      end
13175
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
13176
      else if ((num_of_frames - 8) == 20) // 128
13177
      begin
13178
        tmp_len = tmp_len; // length of frame remaines from previous settings
13179
        tmp_bd_num = 0; // TX BD number
13180
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13181
        begin
13182
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13183
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13184
          if (tmp_len[0] == 0)
13185
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13186
          else
13187
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13188
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13189
          if ((tmp_len + 4) < (min_tmp + 128))
13190
            tmp_len = tmp_len + 1;
13191
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13192
            tmp_len = 256;
13193
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13194
            tmp_len = tmp_len + 128;
13195
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13196
            tmp_len = max_tmp - (4 + 16);
13197
          else if ((tmp_len + 4) >= (max_tmp - 16))
13198
            tmp_len = tmp_len + 1;
13199
          // set TX BD number
13200
          tmp_bd_num = tmp_bd_num + 1;
13201
        end
13202
      end
13203
      // set empty bit
13204
      if (num_of_frames < 8)
13205
        set_rx_bd_empty(0, 0);
13206
      else if ((num_of_frames - 8) < 128)
13207
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
13208
      else if ((num_of_frames - 136) < 19)
13209
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
13210
      // CHECK END OF RECEIVE
13211
      fork
13212
        begin
13213
          if (i_length[0] == 1'b0)
13214
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13215
          else
13216
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13217
          repeat(10) @(posedge mrx_clk);
13218
        end
13219
        begin
13220
          #1 check_rx_bd(num_of_bd, data);
13221
          if (i_length < min_tmp) // just first four
13222
          begin
13223
            while (data[15] === 1)
13224
            begin
13225
              #1 check_rx_bd(num_of_bd, data);
13226
              @(posedge wb_clk);
13227
            end
13228
            repeat (1) @(posedge wb_clk);
13229
          end
13230
          else
13231
          begin
13232
            wait (MRxDV === 1'b1); // start transmit
13233
            #1 check_rx_bd(num_of_bd, data);
13234
            if (data[15] !== 1)
13235
            begin
13236
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
13237
              fail = fail + 1;
13238
            end
13239
            wait (MRxDV === 1'b0); // end transmit
13240
            while (data[15] === 1)
13241
            begin
13242
              #1 check_rx_bd(num_of_bd, data);
13243
              @(posedge wb_clk);
13244
            end
13245
            repeat (1) @(posedge wb_clk);
13246
          end
13247
        end
13248
      join
13249
      // check length of a PACKET
13250
      if (data[31:16] != (i_length + 4))
13251
      begin
13252
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13253
                        data[31:16], (i_length + 4));
13254
        test_fail("Wrong length of the packet out from PHY");
13255
        fail = fail + 1;
13256
      end
13257
      // check received RX packet data and CRC
13258
      if (i_length[0] == 1'b0)
13259
      begin
13260
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13261
      end
13262
      else
13263
      begin
13264
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13265
      end
13266
      if (tmp > 0)
13267
      begin
13268
        `TIME; $display("*E Wrong data of the received packet");
13269
        test_fail("Wrong data of the received packet");
13270
        fail = fail + 1;
13271
      end
13272
      // check WB INT signal
13273
      if (i_length[1:0] == 2'h0)
13274
      begin
13275
        if (wb_int !== 1'b1)
13276
        begin
13277
          `TIME; $display("*E WB INT signal should be set");
13278
          test_fail("WB INT signal should be set");
13279
          fail = fail + 1;
13280
        end
13281
      end
13282
      else
13283
      begin
13284
        if (wb_int !== 1'b0)
13285
        begin
13286
          `TIME; $display("*E WB INT signal should not be set");
13287
          test_fail("WB INT signal should not be set");
13288
          fail = fail + 1;
13289
        end
13290
      end
13291
      // check RX buffer descriptor of a packet
13292
      check_rx_bd(num_of_bd, data);
13293
      if (i_length[1] == 1'b0) // interrupt enabled
13294
      begin
13295 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13296
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13297 209 tadejm
        begin
13298
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13299
          test_fail("RX buffer descriptor status is not correct");
13300
          fail = fail + 1;
13301
        end
13302
      end
13303
      else // interrupt not enabled
13304
      begin
13305 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13306
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13307 209 tadejm
        begin
13308
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13309
          test_fail("RX buffer descriptor status is not correct");
13310
          fail = fail + 1;
13311
        end
13312
      end
13313
      // clear first half of 8 frames from RX buffer descriptor 0
13314
      if (num_of_frames < 4)
13315
        clear_rx_bd(num_of_bd, num_of_bd);
13316
      // clear BD with wrap bit
13317
      if (num_of_frames == 140)
13318
        clear_rx_bd(127, 127);
13319
      // check interrupts
13320 274 tadejm
      wait (wbm_working == 0);
13321 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13322
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
13323
      begin
13324
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13325
        begin
13326
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13327
          test_fail("Interrupt Receive Buffer was not set");
13328
          fail = fail + 1;
13329
        end
13330
        if ((data & (~`ETH_INT_RXB)) !== 0)
13331
        begin
13332
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13333
          test_fail("Other interrupts (except Receive Buffer) were set");
13334
          fail = fail + 1;
13335
        end
13336
      end
13337
      else
13338
      begin
13339
        if (data !== 0)
13340
        begin
13341
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
13342
          test_fail("Any of interrupts (except Receive Buffer) was set");
13343
          fail = fail + 1;
13344
        end
13345
      end
13346
      // clear interrupts
13347 274 tadejm
      wait (wbm_working == 0);
13348 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13349
      // check WB INT signal
13350
      if (wb_int !== 1'b0)
13351
      begin
13352
        test_fail("WB INT signal should not be set");
13353
        fail = fail + 1;
13354
      end
13355
      // INTERMEDIATE DISPLAYS
13356
      if ((i_length + 4) == (min_tmp + 7))
13357
      begin
13358
        // starting length is min_tmp, ending length is (min_tmp + 128)
13359
        $display("    receive small packets is NOT selected");
13360
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
13361
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
13362
                 min_tmp, (min_tmp + 7));
13363
        $display("    ->all packets were received on RX BD 0");
13364
        // reset receive small, remain the rest
13365 274 tadejm
        wait (wbm_working == 0);
13366 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13367
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13368
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13369
      end
13370
      else if ((i_length + 4) == (min_tmp + 128))
13371
      begin
13372
        // starting length is min_tmp, ending length is (min_tmp + 128)
13373
        $display("    receive small packets is NOT selected");
13374
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13375
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13376
                 (min_tmp + 8), (min_tmp + 128));
13377
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
13378
                 1'b0, num_of_bd);
13379
        tmp_bd = num_of_bd + 1;
13380
        // set receive small, remain the rest
13381 274 tadejm
        wait (wbm_working == 0);
13382 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13383
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13384
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13385
      end
13386
      else if ((i_length + 4) == (max_tmp - 16))
13387
      begin
13388
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
13389
        $display("    receive small packets is selected");
13390
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13391
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
13392
                 (min_tmp + 64 + 128), tmp_data);
13393
        if (tmp_bd > num_of_bd)
13394
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13395
                   tmp_bd, num_of_bd);
13396
        else
13397
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13398
                   tmp_bd, num_of_bd);
13399
        tmp_bd = num_of_bd + 1;
13400
        // reset receive small, remain the rest
13401 274 tadejm
        wait (wbm_working == 0);
13402 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13403
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13404
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13405
      end
13406
      else if ((i_length + 4) == max_tmp)
13407
      begin
13408
        $display("    receive small packets is NOT selected");
13409
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13410
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
13411
                 (max_tmp - (4 + 16)), max_tmp);
13412
        if (tmp_bd > num_of_bd)
13413
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13414
                   tmp_bd, num_of_bd);
13415
        else
13416
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13417
                   tmp_bd, num_of_bd);
13418
      end
13419
      // set length (loop variable)
13420
      if ((i_length + 4) < (min_tmp + 128))
13421
        i_length = i_length + 1;
13422
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13423
        i_length = 256;
13424
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13425
      begin
13426
        i_length = i_length + 128;
13427
        tmp_data = i_length + 4; // last tmp_data is ending length
13428
      end
13429
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
13430
        i_length = max_tmp - (4 + 16);
13431
      else if ((i_length + 4) >= (max_tmp - 16))
13432
        i_length = i_length + 1;
13433
      else
13434
      begin
13435
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
13436
        #10 $stop;
13437
      end
13438
      // the number of frame transmitted
13439
      num_of_frames = num_of_frames + 1;
13440
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
13441
        num_of_bd = 0;
13442
      else
13443
        num_of_bd = num_of_bd + 1;
13444
    end
13445
    // disable RX
13446 274 tadejm
    wait (wbm_working == 0);
13447 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13448
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13449
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13450
    @(posedge wb_clk);
13451
    if(fail == 0)
13452
      test_ok;
13453
    else
13454
      fail = 0;
13455
  end
13456
 
13457
 
13458
  ////////////////////////////////////////////////////////////////////
13459
  ////                                                            ////
13460 243 tadejm
  ////  Test receive packets form 0 to (MINFL + 12) sizes at       ////
13461 209 tadejm
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
13462
  ////                                                            ////
13463
  ////////////////////////////////////////////////////////////////////
13464 243 tadejm
  if (test_num == 8) // 
13465 209 tadejm
  begin
13466 243 tadejm
    // TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
13467
    test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
13468
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
13469 209 tadejm
 
13470
    // reset MAC registers
13471
    hard_reset;
13472
    // reset MAC and MII LOGIC with soft reset
13473 274 tadejm
//    reset_mac;
13474
//    reset_mii;
13475 209 tadejm
    // set wb slave response
13476
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13477
 
13478
    max_tmp = 0;
13479
    min_tmp = 0;
13480
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
13481 274 tadejm
    wait (wbm_working == 0);
13482 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13483
    // enable RX, set full-duplex mode, receive small, NO correct IFG
13484 274 tadejm
    wait (wbm_working == 0);
13485 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13486
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13487
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13488
    // prepare two packets of MAXFL length
13489 274 tadejm
    wait (wbm_working == 0);
13490 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13491
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13492
    min_tmp = tmp[31:16];
13493
    st_data = 8'hAC;
13494
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13495
    st_data = 8'h35;
13496
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13497
    // check WB INT signal
13498
    if (wb_int !== 1'b0)
13499
    begin
13500
      test_fail("WB INT signal should not be set");
13501
      fail = fail + 1;
13502
    end
13503 243 tadejm
    // unmask interrupts
13504 274 tadejm
    wait (wbm_working == 0);
13505 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13506
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13507 209 tadejm
 
13508
    // write to phy's control register for 10Mbps
13509
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
13510
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
13511
    speed = 10;
13512
 
13513 243 tadejm
    frame_ended = 0;
13514
    num_of_frames = 0;// 0; // 10;
13515
    num_of_bd = 120;
13516
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13517
    while ((i_length + 4) < 78) // (min_tmp - 4))
13518 209 tadejm
    begin
13519 243 tadejm
      // append CRC to packet
13520
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13521
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13522
      else if (num_of_frames > 4)
13523
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13524 209 tadejm
      // choose generating carrier sense and collision
13525
      case (i_length[1:0])
13526 243 tadejm
      2'h0:
13527 209 tadejm
      begin
13528
        // not detect carrier sense in FD and no collision
13529 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13530 209 tadejm
        eth_phy.collision(0);
13531
      end
13532 243 tadejm
      2'h1:
13533 209 tadejm
      begin
13534
        // detect carrier sense in FD and no collision
13535 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13536 209 tadejm
        eth_phy.collision(0);
13537
      end
13538 243 tadejm
      2'h2:
13539 209 tadejm
      begin
13540
        // not detect carrier sense in FD and set collision
13541 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13542 209 tadejm
        eth_phy.collision(1);
13543
      end
13544 243 tadejm
      default: // 2'h3:
13545 209 tadejm
      begin
13546
        // detect carrier sense in FD and set collision
13547 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13548 209 tadejm
        eth_phy.collision(1);
13549
      end
13550
      endcase
13551
      #1;
13552 243 tadejm
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13553 209 tadejm
      if (num_of_frames <= 9)
13554
      begin
13555 243 tadejm
        case (i_length[1:0])
13556
        2'h0: // Interrupt is generated
13557
        begin
13558
          // enable interrupt generation
13559
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13560
        end
13561
        2'h1: // Interrupt is generated
13562
        begin
13563
          // enable interrupt generation
13564
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13565
        end
13566
        2'h2: // Interrupt is generated
13567
        begin
13568
          // enable interrupt generation
13569
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13570
        end
13571
        default: // 2'h3: // Interrupt is generated
13572
        begin
13573
          // enable interrupt generation
13574
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13575
        end
13576
        endcase
13577 209 tadejm
        // set wrap bit
13578 243 tadejm
        set_rx_bd_wrap(120);
13579 209 tadejm
      end
13580 243 tadejm
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13581 209 tadejm
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13582
      begin
13583
        tmp_len = i_length; // length of frame
13584 243 tadejm
        tmp_bd_num = 120; // RX BD number
13585
        while (tmp_bd_num < 124) // 
13586 209 tadejm
        begin
13587
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13588
          if (tmp_len[0] == 0)
13589 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13590 209 tadejm
          else
13591 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13592
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13593 209 tadejm
          tmp_len = tmp_len + 1;
13594 243 tadejm
          // set RX BD number
13595 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13596
        end
13597
        // set wrap bit
13598 243 tadejm
        set_rx_bd_wrap(123);
13599 209 tadejm
      end
13600 243 tadejm
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13601 209 tadejm
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13602
      begin
13603
        tmp_len = i_length; // length of frame
13604 243 tadejm
        tmp_bd_num = 120; // RX BD number
13605
        while (tmp_bd_num < 125) // 
13606 209 tadejm
        begin
13607
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13608
          if (tmp_len[0] == 0)
13609 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13610 209 tadejm
          else
13611 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13612
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13613 209 tadejm
          tmp_len = tmp_len + 1;
13614 243 tadejm
          // set RX BD number
13615 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13616
        end
13617
        // set wrap bit
13618 243 tadejm
        set_rx_bd_wrap(124);
13619 209 tadejm
      end
13620 243 tadejm
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13621 209 tadejm
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13622
      begin
13623
        tmp_len = i_length; // length of frame
13624 243 tadejm
        tmp_bd_num = 120; // RX BD number
13625
        while (tmp_bd_num < 126) // 
13626 209 tadejm
        begin
13627
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13628
          if (tmp_len[0] == 0)
13629 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13630 209 tadejm
          else
13631 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13632
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13633 209 tadejm
          tmp_len = tmp_len + 1;
13634 243 tadejm
          // set RX BD number
13635 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13636
        end
13637
        // set wrap bit
13638 243 tadejm
        set_rx_bd_wrap(125);
13639 209 tadejm
      end
13640 243 tadejm
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13641 209 tadejm
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13642
      begin
13643
        tmp_len = i_length; // length of frame
13644 243 tadejm
        tmp_bd_num = 120; // RX BD number
13645
        while (tmp_bd_num < 127) // 
13646 209 tadejm
        begin
13647
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13648
          if (tmp_len[0] == 0)
13649 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13650 209 tadejm
          else
13651 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13652
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13653 209 tadejm
          tmp_len = tmp_len + 1;
13654 243 tadejm
          // set RX BD number
13655 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13656
        end
13657
        // set wrap bit
13658 243 tadejm
        set_rx_bd_wrap(126);
13659 209 tadejm
      end
13660 243 tadejm
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13661 209 tadejm
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13662
      begin
13663
        tmp_len = i_length; // length of frame
13664 243 tadejm
        tmp_bd_num = 120; // RX BD number
13665
        while (tmp_bd_num < 128) // 
13666 209 tadejm
        begin
13667
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13668
          if (tmp_len[0] == 0)
13669 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13670 209 tadejm
          else
13671 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13672
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13673 209 tadejm
          tmp_len = tmp_len + 1;
13674 243 tadejm
          // set RX BD number
13675 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13676
        end
13677
        // set wrap bit
13678 243 tadejm
        set_rx_bd_wrap(127);
13679 209 tadejm
      end
13680 243 tadejm
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13681
      else if (num_of_frames == 70)
13682
      begin
13683
        tmp_len = i_length; // length of frame
13684
        tmp_bd_num = 120; // RX BD number
13685
        while (tmp_bd_num < 128) // 
13686
        begin
13687
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13688
          if (tmp_len[0] == 0)
13689
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13690
          else
13691
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13692
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13693
          tmp_len = tmp_len + 1;
13694
          // set RX BD number
13695
          tmp_bd_num = tmp_bd_num + 1;
13696
        end
13697
        // set wrap bit
13698
        set_rx_bd_wrap(127);
13699
      end
13700 209 tadejm
      #1;
13701 243 tadejm
      // SET empty bit
13702 209 tadejm
      if (num_of_frames < 10)
13703 243 tadejm
        set_rx_bd_empty(120, 120);
13704 209 tadejm
      else if (num_of_frames < 14)
13705 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13706 209 tadejm
      else if (num_of_frames < 18)
13707 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13708 209 tadejm
      else if (num_of_frames < 23)
13709 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13710 209 tadejm
      else if (num_of_frames < 28)
13711 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13712 209 tadejm
      else if (num_of_frames < 34)
13713 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13714 209 tadejm
      else if (num_of_frames < 40)
13715 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13716 209 tadejm
      else if (num_of_frames < 47)
13717 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13718 209 tadejm
      else if (num_of_frames < 54)
13719 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13720 209 tadejm
      else if (num_of_frames < 62)
13721 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13722 209 tadejm
      else if (num_of_frames < 70)
13723 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13724
      else if (num_of_frames < 78)
13725
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13726
      // CHECK END OF RECEIVE
13727 252 tadejm
      // receive just preamble between some packets
13728
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
13729
      begin
13730
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
13731
        @(posedge mrx_clk);
13732
        wait (MRxDV === 1'b0); // end receive
13733
        repeat(10) @(posedge mrx_clk);
13734
        repeat(15) @(posedge wb_clk);
13735
      end
13736
      // receiving frames and checking end of them
13737 243 tadejm
      frame_ended = 0;
13738
      check_frame = 0;
13739 209 tadejm
      fork
13740
        begin
13741 243 tadejm
          if (i_length[0] == 1'b0)
13742
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13743
          else
13744
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13745
          repeat(10) @(posedge mrx_clk);
13746
        end
13747
        begin: fr_end1
13748
          wait (MRxDV === 1'b1); // start receive
13749
          #1 check_rx_bd(num_of_bd, data);
13750
          if (data[15] !== 1)
13751 209 tadejm
          begin
13752 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13753
            fail = fail + 1;
13754 209 tadejm
          end
13755 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13756
          while ((data[15] === 1) && (check_frame == 0))
13757
          begin
13758
            #1 check_rx_bd(num_of_bd, data);
13759
            @(posedge wb_clk);
13760
          end
13761
          if (data[15] === 0)
13762
            frame_ended = 1;
13763
          repeat (1) @(posedge wb_clk);
13764 209 tadejm
        end
13765 243 tadejm
        begin
13766
          wait (MRxDV === 1'b1); // start receive
13767
          wait (MRxDV === 1'b0); // end receive
13768
          repeat(10) @(posedge mrx_clk);
13769
          repeat(15) @(posedge wb_clk);
13770
          check_frame = 1;
13771
        end
13772
      join
13773
      // check length of a PACKET
13774
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
13775
           ((data[31:16] != 0) && (num_of_frames < 3)) )
13776
      begin
13777
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13778
                        data[31:16], (i_length + 4));
13779
        test_fail("Wrong length of the packet out from PHY");
13780
        fail = fail + 1;
13781
      end
13782
      // check received RX packet data and CRC
13783
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
13784
      begin                                           // CRC has 4 bytes for itself
13785
        if (i_length[0] == 1'b0)
13786
        begin
13787
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13788
        end
13789 209 tadejm
        else
13790
        begin
13791 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13792 209 tadejm
        end
13793 243 tadejm
        if (tmp > 0)
13794
        begin
13795
          `TIME; $display("*E Wrong data of the received packet");
13796
          test_fail("Wrong data of the received packet");
13797
          fail = fail + 1;
13798
        end
13799 209 tadejm
      end
13800 243 tadejm
      // check WB INT signal
13801
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
13802
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
13803
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
13804
        begin
13805
          `TIME; $display("*E WB INT signal should be set");
13806
          test_fail("WB INT signal should be set");
13807
          fail = fail + 1;
13808
        end
13809
      end
13810
      else
13811
      begin
13812
        if (wb_int !== 1'b0)
13813
        begin
13814
          `TIME; $display("*E WB INT signal should not be set");
13815
          test_fail("WB INT signal should not be set");
13816
          fail = fail + 1;
13817
        end
13818
      end
13819
      // check RX buffer descriptor of a packet
13820 254 mohor
      // check RX buffer descriptor of a packet
13821 243 tadejm
      if (num_of_frames >= min_tmp)
13822
      begin
13823 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
13824
             (data[15:0] !== 16'h4080) ) // without wrap bit
13825 243 tadejm
        begin
13826
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13827
          test_fail("RX buffer descriptor status is not correct");
13828
          fail = fail + 1;
13829
        end
13830
      end
13831 254 mohor
      else if (num_of_frames > 6)
13832 243 tadejm
      begin
13833 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
13834
             (data[15:0] !== 16'h4084) ) // without wrap bit
13835
        begin
13836
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13837
          test_fail("RX buffer descriptor status is not correct");
13838
          fail = fail + 1;
13839
        end
13840
      end
13841
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
13842
      begin
13843 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13844
             (data[15:0] !== 16'h4004) ) // without wrap bit
13845
        begin
13846
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13847
          test_fail("RX buffer descriptor status is not correct");
13848
          fail = fail + 1;
13849
        end
13850
      end
13851 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
13852 243 tadejm
      begin
13853
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13854
             (data[15:0] !== 16'h4006) ) // without wrap bit
13855
        begin
13856
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13857
          test_fail("RX buffer descriptor status is not correct");
13858
          fail = fail + 1;
13859
        end
13860
      end
13861
      else
13862
      begin
13863
        if (data[15] !== 1'b1)
13864
        begin
13865
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13866
          test_fail("RX buffer descriptor status is not correct");
13867
          fail = fail + 1;
13868
        end
13869
      end
13870
      // check interrupts
13871 274 tadejm
      wait (wbm_working == 0);
13872 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13873 209 tadejm
      if (num_of_frames >= 5)
13874
      begin
13875 243 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13876 209 tadejm
        begin
13877 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13878
          test_fail("Interrupt Receive Buffer was not set");
13879
          fail = fail + 1;
13880 209 tadejm
        end
13881 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13882 209 tadejm
        begin
13883 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13884
          test_fail("Other interrupts (except Receive Buffer) were set");
13885
          fail = fail + 1;
13886 209 tadejm
        end
13887 243 tadejm
      end
13888
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
13889
      begin
13890
        if (data) // Checking if any interrupt is pending)
13891 209 tadejm
        begin
13892 243 tadejm
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
13893
          test_fail("Interrupts were set");
13894
          fail = fail + 1;
13895
        end
13896
      end
13897
      else
13898
      begin
13899
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
13900
        begin
13901
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13902
          test_fail("Interrupt Receive Buffer Error was not set");
13903
          fail = fail + 1;
13904
        end
13905
        if ((data & (~`ETH_INT_RXE)) !== 0)
13906
        begin
13907
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13908
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13909
          fail = fail + 1;
13910
        end
13911
      end
13912
      // clear interrupts
13913 274 tadejm
      wait (wbm_working == 0);
13914 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13915
      // check WB INT signal
13916
      if (wb_int !== 1'b0)
13917
      begin
13918
        test_fail("WB INT signal should not be set");
13919
        fail = fail + 1;
13920
      end
13921
      // INTERMEDIATE DISPLAYS
13922
      if (num_of_frames == 3)
13923
      begin
13924
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13925
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13926
                 0, 3);
13927
      end
13928
      else if (num_of_frames == 9)
13929
      begin
13930
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13931
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13932
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13933
                 5, 9);
13934
      end
13935
      else if (num_of_frames == 17)
13936
      begin
13937
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13938
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13939
                 10, 17);
13940
      end
13941
      else if (num_of_frames == 27)
13942
      begin
13943
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13944
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13945
                 18, 27);
13946
      end
13947
      else if (num_of_frames == 40)
13948
      begin
13949
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13950
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13951
                 28, 40);
13952
      end
13953
      else if (num_of_frames == 54)
13954
      begin
13955
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13956
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13957
                 41, 54);
13958
      end
13959
      else if (num_of_frames == 69)
13960
      begin
13961
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13962
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13963
                 55, 69);
13964
      end
13965
      else if (num_of_frames == 69)
13966
      begin
13967
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13968
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13969
                 55, 69);
13970
      end
13971
      else if (num_of_frames == 77)
13972
      begin
13973
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13974
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13975
                 70, 77);
13976
      end
13977
      // set length (loop variable)
13978
      i_length = i_length + 1;
13979
      // the number of frame transmitted
13980
      num_of_frames = num_of_frames + 1;
13981
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13982
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13983
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13984
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13985
        num_of_bd = 120;
13986
      else
13987
        num_of_bd = num_of_bd + 1;
13988
    end
13989
    // disable RX
13990 274 tadejm
    wait (wbm_working == 0);
13991 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13992
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13993
    @(posedge wb_clk);
13994
    if(fail == 0)
13995
      test_ok;
13996
    else
13997
      fail = 0;
13998
  end
13999
 
14000
 
14001
  ////////////////////////////////////////////////////////////////////
14002
  ////                                                            ////
14003
  ////  Test receive packets form 0 to (MINFL + 12) sizes at      ////
14004
  ////  8 RX buffer decriptors ( 100Mbps ).                       ////
14005
  ////                                                            ////
14006
  ////////////////////////////////////////////////////////////////////
14007
  if (test_num == 9) // 
14008
  begin
14009
    // TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
14010
    test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
14011
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
14012
 
14013
    // reset MAC registers
14014
    hard_reset;
14015
    // reset MAC and MII LOGIC with soft reset
14016 274 tadejm
//    reset_mac;
14017
//    reset_mii;
14018 243 tadejm
    // set wb slave response
14019
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14020
 
14021
    max_tmp = 0;
14022
    min_tmp = 0;
14023
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
14024 274 tadejm
    wait (wbm_working == 0);
14025 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14026
    // enable RX, set full-duplex mode, receive small, NO correct IFG
14027 274 tadejm
    wait (wbm_working == 0);
14028 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
14029
              `ETH_MODER_PRO | `ETH_MODER_BRO,
14030
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14031
    // prepare two packets of MAXFL length
14032 274 tadejm
    wait (wbm_working == 0);
14033 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14034
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
14035
    min_tmp = tmp[31:16];
14036
    st_data = 8'hAC;
14037
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
14038
    st_data = 8'h35;
14039
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
14040
    // check WB INT signal
14041
    if (wb_int !== 1'b0)
14042
    begin
14043
      test_fail("WB INT signal should not be set");
14044
      fail = fail + 1;
14045
    end
14046
    // unmask interrupts
14047 274 tadejm
    wait (wbm_working == 0);
14048 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14049
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14050
 
14051
    // write to phy's control register for 100Mbps
14052
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
14053
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
14054
    speed = 100;
14055
 
14056
    frame_ended = 0;
14057 252 tadejm
    num_of_frames = 0;// 0; // 10;
14058 243 tadejm
    num_of_bd = 120;
14059
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
14060
    while ((i_length + 4) < 78) // (min_tmp - 4))
14061
    begin
14062
      // append CRC to packet
14063 252 tadejm
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
14064 243 tadejm
        append_rx_crc (0, i_length, 1'b0, 1'b0);
14065 252 tadejm
      else if (num_of_frames > 4)
14066 243 tadejm
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
14067
      // choose generating carrier sense and collision
14068
      case (i_length[1:0])
14069
      2'h0:
14070
      begin
14071
        // not detect carrier sense in FD and no collision
14072
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14073
        eth_phy.collision(0);
14074
      end
14075
      2'h1:
14076
      begin
14077
        // detect carrier sense in FD and no collision
14078
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14079
        eth_phy.collision(0);
14080
      end
14081
      2'h2:
14082
      begin
14083
        // not detect carrier sense in FD and set collision
14084
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14085
        eth_phy.collision(1);
14086
      end
14087
      default: // 2'h3:
14088
      begin
14089
        // detect carrier sense in FD and set collision
14090
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14091
        eth_phy.collision(1);
14092
      end
14093
      endcase
14094
      #1;
14095
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
14096
      if (num_of_frames <= 9)
14097
      begin
14098
        case (i_length[1:0])
14099
        2'h0: // Interrupt is generated
14100
        begin
14101
          // enable interrupt generation
14102
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14103
        end
14104
        2'h1: // Interrupt is generated
14105
        begin
14106
          // enable interrupt generation
14107
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14108
        end
14109
        2'h2: // Interrupt is generated
14110
        begin
14111
          // enable interrupt generation
14112
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14113
        end
14114
        default: // 2'h3: // Interrupt is generated
14115
        begin
14116
          // enable interrupt generation
14117
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14118
        end
14119
        endcase
14120
        // set wrap bit
14121
        set_rx_bd_wrap(120);
14122
      end
14123
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
14124
      else if ((num_of_frames == 10) || (num_of_frames == 14))
14125
      begin
14126
        tmp_len = i_length; // length of frame
14127
        tmp_bd_num = 120; // RX BD number
14128
        while (tmp_bd_num < 124) // 
14129
        begin
14130
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14131
          if (tmp_len[0] == 0)
14132
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14133
          else
14134
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14135
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14136
          tmp_len = tmp_len + 1;
14137
          // set RX BD number
14138
          tmp_bd_num = tmp_bd_num + 1;
14139
        end
14140
        // set wrap bit
14141
        set_rx_bd_wrap(123);
14142
      end
14143
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
14144
      else if ((num_of_frames == 18) || (num_of_frames == 23))
14145
      begin
14146
        tmp_len = i_length; // length of frame
14147
        tmp_bd_num = 120; // RX BD number
14148
        while (tmp_bd_num < 125) // 
14149
        begin
14150
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14151
          if (tmp_len[0] == 0)
14152
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14153
          else
14154
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14155
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14156
          tmp_len = tmp_len + 1;
14157
          // set RX BD number
14158
          tmp_bd_num = tmp_bd_num + 1;
14159
        end
14160
        // set wrap bit
14161
        set_rx_bd_wrap(124);
14162
      end
14163
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
14164
      else if ((num_of_frames == 28) || (num_of_frames == 34))
14165
      begin
14166
        tmp_len = i_length; // length of frame
14167
        tmp_bd_num = 120; // RX BD number
14168
        while (tmp_bd_num < 126) // 
14169
        begin
14170
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14171
          if (tmp_len[0] == 0)
14172
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14173
          else
14174
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14175
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14176
          tmp_len = tmp_len + 1;
14177
          // set RX BD number
14178
          tmp_bd_num = tmp_bd_num + 1;
14179
        end
14180
        // set wrap bit
14181
        set_rx_bd_wrap(125);
14182
      end
14183
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
14184
      else if ((num_of_frames == 40) || (num_of_frames == 47))
14185
      begin
14186
        tmp_len = i_length; // length of frame
14187
        tmp_bd_num = 120; // RX BD number
14188
        while (tmp_bd_num < 127) // 
14189
        begin
14190
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14191
          if (tmp_len[0] == 0)
14192
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14193
          else
14194
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14195
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14196
          tmp_len = tmp_len + 1;
14197
          // set RX BD number
14198
          tmp_bd_num = tmp_bd_num + 1;
14199
        end
14200
        // set wrap bit
14201
        set_rx_bd_wrap(126);
14202
      end
14203
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
14204
      else if ((num_of_frames == 54) || (num_of_frames == 62))
14205
      begin
14206
        tmp_len = i_length; // length of frame
14207
        tmp_bd_num = 120; // RX BD number
14208
        while (tmp_bd_num < 128) // 
14209
        begin
14210
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14211
          if (tmp_len[0] == 0)
14212
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14213
          else
14214
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14215
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14216
          tmp_len = tmp_len + 1;
14217
          // set RX BD number
14218
          tmp_bd_num = tmp_bd_num + 1;
14219
        end
14220
        // set wrap bit
14221
        set_rx_bd_wrap(127);
14222
      end
14223
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
14224
      else if (num_of_frames == 70)
14225
      begin
14226
        tmp_len = i_length; // length of frame
14227
        tmp_bd_num = 120; // RX BD number
14228
        while (tmp_bd_num < 128) // 
14229
        begin
14230
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14231
          if (tmp_len[0] == 0)
14232
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14233
          else
14234
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14235
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14236
          tmp_len = tmp_len + 1;
14237
          // set RX BD number
14238
          tmp_bd_num = tmp_bd_num + 1;
14239
        end
14240
        // set wrap bit
14241
        set_rx_bd_wrap(127);
14242
      end
14243
      #1;
14244
      // SET empty bit
14245
      if (num_of_frames < 10)
14246
        set_rx_bd_empty(120, 120);
14247
      else if (num_of_frames < 14)
14248
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
14249
      else if (num_of_frames < 18)
14250
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
14251
      else if (num_of_frames < 23)
14252
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
14253
      else if (num_of_frames < 28)
14254
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
14255
      else if (num_of_frames < 34)
14256
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
14257
      else if (num_of_frames < 40)
14258
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
14259
      else if (num_of_frames < 47)
14260
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
14261
      else if (num_of_frames < 54)
14262
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
14263
      else if (num_of_frames < 62)
14264
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
14265
      else if (num_of_frames < 70)
14266
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
14267
      else if (num_of_frames < 78)
14268
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
14269
      // CHECK END OF RECEIVE
14270 252 tadejm
      // receive just preamble between some packets
14271
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
14272
      begin
14273
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
14274
        @(posedge mrx_clk);
14275
        wait (MRxDV === 1'b0); // end receive
14276
        repeat(10) @(posedge mrx_clk);
14277
        repeat(15) @(posedge wb_clk);
14278
      end
14279
      // receiving frames and checking end of them
14280 243 tadejm
      frame_ended = 0;
14281
      check_frame = 0;
14282
      fork
14283
        begin
14284
          if (i_length[0] == 1'b0)
14285
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
14286
          else
14287
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
14288
          repeat(10) @(posedge mrx_clk);
14289
        end
14290 254 mohor
        begin: fr_end2
14291 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14292
          #1 check_rx_bd(num_of_bd, data);
14293
          if (data[15] !== 1)
14294 209 tadejm
          begin
14295 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
14296 209 tadejm
            fail = fail + 1;
14297
          end
14298 243 tadejm
          wait (MRxDV === 1'b0); // end receive
14299
          while ((data[15] === 1) && (check_frame == 0))
14300
          begin
14301
            #1 check_rx_bd(num_of_bd, data);
14302
            @(posedge wb_clk);
14303
          end
14304
          if (data[15] === 0)
14305
            frame_ended = 1;
14306
          repeat (1) @(posedge wb_clk);
14307 209 tadejm
        end
14308
        begin
14309 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14310
          wait (MRxDV === 1'b0); // end receive
14311
          repeat(10) @(posedge mrx_clk);
14312
          repeat(15) @(posedge wb_clk);
14313
          check_frame = 1;
14314 209 tadejm
        end
14315 243 tadejm
      join
14316
      // check length of a PACKET
14317 252 tadejm
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
14318
           ((data[31:16] != 0) && (num_of_frames < 3)) )
14319 243 tadejm
      begin
14320
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
14321
                        data[31:16], (i_length + 4));
14322
        test_fail("Wrong length of the packet out from PHY");
14323
        fail = fail + 1;
14324
      end
14325
      // check received RX packet data and CRC
14326 252 tadejm
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
14327
      begin                                           // CRC has 4 bytes for itself
14328 243 tadejm
        if (i_length[0] == 1'b0)
14329 209 tadejm
        begin
14330 243 tadejm
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
14331 209 tadejm
        end
14332 243 tadejm
        else
14333 209 tadejm
        begin
14334 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
14335 209 tadejm
        end
14336
        if (tmp > 0)
14337
        begin
14338 243 tadejm
          `TIME; $display("*E Wrong data of the received packet");
14339
          test_fail("Wrong data of the received packet");
14340 209 tadejm
          fail = fail + 1;
14341
        end
14342
      end
14343
      // check WB INT signal
14344 252 tadejm
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
14345
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
14346
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
14347 209 tadejm
        begin
14348
          `TIME; $display("*E WB INT signal should be set");
14349
          test_fail("WB INT signal should be set");
14350
          fail = fail + 1;
14351
        end
14352
      end
14353 252 tadejm
      else
14354 209 tadejm
      begin
14355
        if (wb_int !== 1'b0)
14356
        begin
14357
          `TIME; $display("*E WB INT signal should not be set");
14358
          test_fail("WB INT signal should not be set");
14359
          fail = fail + 1;
14360
        end
14361
      end
14362 243 tadejm
      // check RX buffer descriptor of a packet
14363
      if (num_of_frames >= min_tmp)
14364
      begin
14365 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
14366
             (data[15:0] !== 16'h4080) ) // without wrap bit
14367 209 tadejm
        begin
14368 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14369
          test_fail("RX buffer descriptor status is not correct");
14370
          fail = fail + 1;
14371 209 tadejm
        end
14372 243 tadejm
      end
14373 254 mohor
      else if (num_of_frames > 6)
14374 243 tadejm
      begin
14375 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
14376
             (data[15:0] !== 16'h4084) ) // without wrap bit
14377
        begin
14378
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14379
          test_fail("RX buffer descriptor status is not correct");
14380
          fail = fail + 1;
14381
        end
14382
      end
14383
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
14384
      begin
14385 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
14386
             (data[15:0] !== 16'h4004) ) // without wrap bit
14387 209 tadejm
        begin
14388 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14389
          test_fail("RX buffer descriptor status is not correct");
14390
          fail = fail + 1;
14391 209 tadejm
        end
14392
      end
14393 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
14394 243 tadejm
      begin
14395
        if ( (data[15:0] !== 16'h6006) && // wrap bit
14396
             (data[15:0] !== 16'h4006) ) // without wrap bit
14397
        begin
14398
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14399
          test_fail("RX buffer descriptor status is not correct");
14400
          fail = fail + 1;
14401
        end
14402
      end
14403 209 tadejm
      else
14404
      begin
14405
        if (data[15] !== 1'b1)
14406
        begin
14407 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14408
          test_fail("RX buffer descriptor status is not correct");
14409 209 tadejm
          fail = fail + 1;
14410
        end
14411
      end
14412
      // check interrupts
14413 274 tadejm
      wait (wbm_working == 0);
14414 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14415 252 tadejm
      if (num_of_frames >= 5)
14416 209 tadejm
      begin
14417 252 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
14418 209 tadejm
        begin
14419 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
14420
          test_fail("Interrupt Receive Buffer was not set");
14421 209 tadejm
          fail = fail + 1;
14422
        end
14423 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
14424 209 tadejm
        begin
14425 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
14426
          test_fail("Other interrupts (except Receive Buffer) were set");
14427 209 tadejm
          fail = fail + 1;
14428
        end
14429
      end
14430 252 tadejm
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
14431
      begin
14432
        if (data) // Checking if any interrupt is pending)
14433
        begin
14434
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
14435
          test_fail("Interrupts were set");
14436
          fail = fail + 1;
14437
        end
14438
      end
14439 209 tadejm
      else
14440
      begin
14441 252 tadejm
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
14442 209 tadejm
        begin
14443 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
14444
          test_fail("Interrupt Receive Buffer Error was not set");
14445 209 tadejm
          fail = fail + 1;
14446
        end
14447 243 tadejm
        if ((data & (~`ETH_INT_RXE)) !== 0)
14448
        begin
14449
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
14450
          test_fail("Other interrupts (except Receive Buffer Error) were set");
14451
          fail = fail + 1;
14452
        end
14453 209 tadejm
      end
14454
      // clear interrupts
14455 274 tadejm
      wait (wbm_working == 0);
14456 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14457
      // check WB INT signal
14458
      if (wb_int !== 1'b0)
14459
      begin
14460
        test_fail("WB INT signal should not be set");
14461
        fail = fail + 1;
14462
      end
14463
      // INTERMEDIATE DISPLAYS
14464 243 tadejm
      if (num_of_frames == 3)
14465 209 tadejm
      begin
14466 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14467
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
14468 209 tadejm
                 0, 3);
14469
      end
14470 243 tadejm
      else if (num_of_frames == 9)
14471 209 tadejm
      begin
14472 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14473
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
14474 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14475
                 5, 9);
14476
      end
14477 243 tadejm
      else if (num_of_frames == 17)
14478 209 tadejm
      begin
14479 243 tadejm
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
14480 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14481
                 10, 17);
14482
      end
14483 243 tadejm
      else if (num_of_frames == 27)
14484 209 tadejm
      begin
14485 243 tadejm
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
14486 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14487
                 18, 27);
14488
      end
14489 243 tadejm
      else if (num_of_frames == 40)
14490 209 tadejm
      begin
14491 243 tadejm
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
14492 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14493
                 28, 40);
14494
      end
14495 243 tadejm
      else if (num_of_frames == 54)
14496 209 tadejm
      begin
14497 243 tadejm
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
14498 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14499
                 41, 54);
14500
      end
14501 243 tadejm
      else if (num_of_frames == 69)
14502 209 tadejm
      begin
14503 243 tadejm
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14504 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14505
                 55, 69);
14506
      end
14507 243 tadejm
      else if (num_of_frames == 69)
14508
      begin
14509
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14510
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14511
                 55, 69);
14512
      end
14513
      else if (num_of_frames == 77)
14514
      begin
14515
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14516
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14517
                 70, 77);
14518
      end
14519 209 tadejm
      // set length (loop variable)
14520
      i_length = i_length + 1;
14521
      // the number of frame transmitted
14522
      num_of_frames = num_of_frames + 1;
14523
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
14524
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
14525
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
14526 243 tadejm
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
14527
        num_of_bd = 120;
14528 209 tadejm
      else
14529
        num_of_bd = num_of_bd + 1;
14530
    end
14531 243 tadejm
    // disable RX
14532 274 tadejm
    wait (wbm_working == 0);
14533 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
14534
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14535
    @(posedge wb_clk);
14536
    if(fail == 0)
14537
      test_ok;
14538
    else
14539
      fail = 0;
14540
  end
14541
 
14542
 
14543 243 tadejm
  ////////////////////////////////////////////////////////////////////
14544
  ////                                                            ////
14545
  ////  Test receive packet synchronization with receive          ////
14546
  ////  disable/enable ( 10Mbps ).                                ////
14547
  ////                                                            ////
14548
  ////////////////////////////////////////////////////////////////////
14549
  if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
14550
  begin
14551
    // TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14552
    test_name   = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14553
    `TIME; $display("  TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14554 209 tadejm
 
14555 243 tadejm
 
14556
 
14557
 
14558
 
14559
 
14560
  end
14561
 
14562
 
14563
  ////////////////////////////////////////////////////////////////////
14564
  ////                                                            ////
14565
  ////  Test receive packet synchronization with receive          ////
14566
  ////  disable/enable ( 10Mbps ).                                ////
14567
  ////                                                            ////
14568
  ////////////////////////////////////////////////////////////////////
14569
  if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
14570
  begin
14571
    // TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14572
    test_name   = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14573
    `TIME; $display("  TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14574
 
14575
 
14576
 
14577
 
14578
 
14579
 
14580
  end
14581
 
14582
 
14583
  ////////////////////////////////////////////////////////////////////
14584
  ////                                                            ////
14585
  ////  Test receive packet synchronization with receive          ////
14586
  ////  disable/enable ( 10Mbps ).                                ////
14587
  ////                                                            ////
14588
  ////////////////////////////////////////////////////////////////////
14589
  if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
14590
  begin
14591
    // TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14592
    test_name   = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14593
    `TIME; $display("  TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14594
 
14595
 
14596
 
14597
 
14598
 
14599
 
14600
  end
14601
 
14602
 
14603
  ////////////////////////////////////////////////////////////////////
14604
  ////                                                            ////
14605
  ////  Test receive packet synchronization with receive          ////
14606
  ////  disable/enable ( 10Mbps ).                                ////
14607
  ////                                                            ////
14608
  ////////////////////////////////////////////////////////////////////
14609
  if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
14610
  begin
14611
    // TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14612
    test_name   = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14613
    `TIME; $display("  TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14614
 
14615
 
14616
 
14617
 
14618
 
14619
 
14620
  end
14621
 
14622
 
14623
 
14624 209 tadejm
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14625
 
14626
end
14627
endtask // test_mac_full_duplex_receive
14628
 
14629
 
14630 263 mohor
task test_mac_full_duplex_flow_control;
14631 209 tadejm
  input  [31:0]  start_task;
14632
  input  [31:0]  end_task;
14633
  integer        bit_start_1;
14634
  integer        bit_end_1;
14635
  integer        bit_start_2;
14636
  integer        bit_end_2;
14637
  integer        num_of_reg;
14638
  integer        num_of_frames;
14639 274 tadejm
  integer        num_of_rx_frames;
14640 209 tadejm
  integer        num_of_bd;
14641
  integer        i_addr;
14642
  integer        i_data;
14643
  integer        i_length;
14644
  integer        tmp_len;
14645
  integer        tmp_bd;
14646
  integer        tmp_bd_num;
14647
  integer        tmp_data;
14648
  integer        tmp_ipgt;
14649
  integer        test_num;
14650 274 tadejm
  integer        rx_len;
14651
  integer        tx_len;
14652 209 tadejm
  reg    [31:0]  tx_bd_num;
14653 274 tadejm
  reg    [31:0]  rx_bd_num;
14654 209 tadejm
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
14655
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
14656
  integer        i;
14657
  integer        i1;
14658
  integer        i2;
14659
  integer        i3;
14660
  integer        fail;
14661
  integer        speed;
14662 260 mohor
  integer        mac_hi_addr;
14663
  integer        mac_lo_addr;
14664 209 tadejm
  reg            frame_started;
14665
  reg            frame_ended;
14666
  reg            wait_for_frame;
14667
  reg    [31:0]  addr;
14668
  reg    [31:0]  data;
14669
  reg    [31:0]  tmp;
14670
  reg    [ 7:0]  st_data;
14671
  reg    [15:0]  max_tmp;
14672
  reg    [15:0]  min_tmp;
14673 263 mohor
  reg            PassAll;
14674
  reg            RxFlow;
14675 266 mohor
  reg            enable_irq_in_rxbd;
14676 267 mohor
  reg    [15:0]  pause_value;
14677 274 tadejm
 
14678 209 tadejm
begin
14679 263 mohor
// MAC FULL DUPLEX FLOW CONTROL TEST
14680
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
14681 209 tadejm
$display(" ");
14682 263 mohor
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
14683 209 tadejm
fail = 0;
14684
 
14685
// reset MAC registers
14686
hard_reset;
14687
// reset MAC and MII LOGIC with soft reset
14688 274 tadejm
//reset_mac;
14689
//reset_mii;
14690 209 tadejm
// set wb slave response
14691
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14692
 
14693
  /*
14694
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
14695
  -------------------------------------------------------------------------------------
14696
  set_tx_bd
14697
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
14698
  set_tx_bd_wrap
14699
    (tx_bd_num_end[6:0]);
14700
  set_tx_bd_ready
14701
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14702
  check_tx_bd
14703
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
14704
  clear_tx_bd
14705
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14706
 
14707
  TASKS for set and control RX buffer descriptors:
14708
  ------------------------------------------------
14709
  set_rx_bd
14710
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
14711
  set_rx_bd_wrap
14712
    (rx_bd_num_end[6:0]);
14713
  set_rx_bd_empty
14714
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14715
  check_rx_bd
14716
    (rx_bd_num_end[6:0], rx_bd_status);
14717
  clear_rx_bd
14718
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14719
 
14720
  TASKS for set and check TX packets:
14721
  -----------------------------------
14722
  set_tx_packet
14723
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
14724
  check_tx_packet
14725
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
14726
 
14727
  TASKS for set and check RX packets:
14728
  -----------------------------------
14729
  set_rx_packet
14730
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
14731
  check_rx_packet
14732
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
14733
 
14734
  TASKS for append and check CRC to/of TX packet:
14735
  -----------------------------------------------
14736
  append_tx_crc
14737
    (txpnt_wb[31:0], len[15:0], negated_crc);
14738
  check_tx_crc
14739
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
14740
 
14741
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
14742
  --------------------------------------------------------------------------------
14743
  append_rx_crc
14744
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
14745
  */
14746
 
14747
//////////////////////////////////////////////////////////////////////
14748
////                                                              ////
14749 263 mohor
////  test_mac_full_duplex_flow_control:                          ////
14750 209 tadejm
////                                                              ////
14751
////  0: Test                                                     ////
14752
////                                                              ////
14753
//////////////////////////////////////////////////////////////////////
14754 260 mohor
 
14755 209 tadejm
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
14756
begin
14757
 
14758
  ////////////////////////////////////////////////////////////////////
14759
  ////                                                            ////
14760 254 mohor
  ////  Test inserts control frames while transmitting normal     ////
14761
  ////  frames. Using 4 TX buffer decriptors ( 10Mbps ).          ////
14762 209 tadejm
  ////                                                            ////
14763
  ////////////////////////////////////////////////////////////////////
14764 254 mohor
  if (test_num == 0) // 
14765 209 tadejm
  begin
14766 254 mohor
    // TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )
14767
    test_name = "TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )";
14768
    `TIME; $display("  TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )");
14769 260 mohor
 
14770 254 mohor
    // reset MAC completely
14771
    hard_reset;
14772
    // set wb slave response
14773
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14774
    max_tmp = 0;
14775
    min_tmp = 0;
14776
    // set 4 TX buffer descriptors - must be set before TX enable
14777
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14778
    // enable TX, set full-duplex mode, padding and CRC appending
14779
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
14780
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14781
    // enable TX flow control
14782
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14783 260 mohor
    // Set MAC address
14784
    mac_hi_addr = 32'h00000001;
14785
    mac_lo_addr = 32'h02030405;
14786
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14787
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14788 254 mohor
    // prepare two packets of MAXFL length
14789
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14790
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
14791
    min_tmp = tmp[31:16];
14792 260 mohor
    st_data = 8'h34;
14793 254 mohor
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
14794 260 mohor
    st_data = 8'h56;
14795 254 mohor
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
14796
    // check WB INT signal
14797
    if (wb_int !== 1'b0)
14798
    begin
14799
      test_fail("WB INT signal should not be set");
14800
      fail = fail + 1;
14801
    end
14802
 
14803
    // write to phy's control register for 10Mbps
14804
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
14805
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
14806
    speed = 10;
14807
 
14808
    frame_started = 0;
14809
    num_of_frames = 0;
14810
    num_of_bd = 0;
14811
    i_length = 0; // 0;
14812 260 mohor
    // Initialize one part of memory with data of control packet
14813
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
14814
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
14815
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
14816
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
14817
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
14818
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
14819
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
14820
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
14821
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
14822
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
14823
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
14824
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
14825
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
14826
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
14827
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
14828
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
14829 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14830
    // In the following section, control frame will be sent while no other transmission is in progress.//
14831
    // TXC interrupt won't be unmasked.                                                                //
14832
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14833 274 tadejm
    // check interrupts
14834 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14835
    if(data)
14836
      begin
14837
        test_fail("IRQ already pending!");
14838
        fail = fail + 1;
14839
        `TIME; $display("*E IRQ already pending!");
14840
      end
14841
    if (wb_int)
14842
    begin
14843
      test_fail("WB INT signal should not be set!");
14844
      fail = fail + 1;
14845
      `TIME; $display("*E WB INT signal should not be set!");
14846
    end
14847 260 mohor
    // first destination address on ethernet PHY
14848
    eth_phy.set_tx_mem_addr(0);
14849
    // Request sending the control frame with pause value = 0x1111
14850
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14851 274 tadejm
    // wait for transmission to come over
14852 254 mohor
    wait (MTxEn === 1'b1); // start transmit
14853
    wait (MTxEn === 1'b0); // end transmit
14854
    repeat(10) @ (posedge wb_clk);  // wait some time
14855
    repeat(10) @ (posedge mtx_clk); // wait some time
14856 274 tadejm
    // check interrupt
14857 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14858
    if(data !== `ETH_INT_TXC)
14859
      begin
14860
        test_fail("TXC IRQ should be set!");
14861
        fail = fail + 1;
14862
        `TIME; $display("*E TXC IRQ should be set!");
14863
      end
14864
    if (wb_int)
14865
    begin
14866
      test_fail("WB INT signal should not be set because TXC irq is masked!");
14867
      fail = fail + 1;
14868
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
14869
    end
14870
    // Clear TXC interrupt
14871
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14872
    if (wb_int)
14873
    begin
14874
      test_fail("WB INT signal should not be set!");
14875
      fail = fail + 1;
14876
      `TIME; $display("*E WB INT signal should not be set!");
14877
    end
14878 274 tadejm
    // check transmited TX packet
14879 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
14880
    if (tmp > 0)
14881
    begin
14882
      $display("Wrong data of the transmitted packet");
14883
      test_fail("Wrong data of the transmitted packet");
14884
      fail = fail + 1;
14885
    end
14886
    // check transmited TX packet CRC
14887
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
14888
    if (tmp > 0)
14889
    begin
14890
      $display("Wrong CRC of the transmitted packet");
14891
      test_fail("Wrong CRC of the transmitted packet");
14892
      fail = fail + 1;
14893
    end
14894 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14895
    // In the following section, control frame will be sent while no other transmission is in progress.//
14896
    // TXC interrupt is unmasked.                                                                      //
14897
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14898
    // unmask all interrupts
14899
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14900
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14901 274 tadejm
    // check interrupts
14902 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14903
    if(data)
14904
      begin
14905
        test_fail("IRQ already pending!");
14906
        fail = fail + 1;
14907
        `TIME; $display("*E IRQ already pending!");
14908
      end
14909
    if (wb_int)
14910
    begin
14911
      test_fail("WB INT signal should not be set!");
14912
      fail = fail + 1;
14913
      `TIME; $display("*E WB INT signal should not be set!");
14914
    end
14915
    // unmask only TXC interrupts
14916
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14917 260 mohor
    // first destination address on ethernet PHY
14918
    eth_phy.set_tx_mem_addr(0);
14919
    // Request sending the control frame with pause value = 0x2222
14920
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
14921
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14922 274 tadejm
    // wait for transmit to come over
14923 254 mohor
    wait (MTxEn === 1'b1); // start transmit
14924
    wait (MTxEn === 1'b0); // end transmit
14925
    repeat(10) @ (posedge wb_clk);  // wait some time
14926
    repeat(10) @ (posedge mtx_clk); // wait some time
14927 274 tadejm
    // check INT
14928 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14929
    if(data !== `ETH_INT_TXC)
14930
      begin
14931
        test_fail("TXC IRQ should be set!");
14932
        fail = fail + 1;
14933
        `TIME; $display("*E TXC IRQ should be set!");
14934
      end
14935
    if (!wb_int)
14936
    begin
14937
      test_fail("WB INT signal should be set!");
14938
      fail = fail + 1;
14939
      `TIME; $display("*E WB INT signal should be set!");
14940
    end
14941
    // Clear TXC interrupt
14942
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14943
    if (wb_int)
14944
    begin
14945
      test_fail("WB INT signal should not be set!");
14946
      fail = fail + 1;
14947
      `TIME; $display("*E WB INT signal should not be set!");
14948
    end
14949 274 tadejm
    // check transmited TX packet
14950 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
14951
    if (tmp > 0)
14952
    begin
14953
      $display("Wrong data of the transmitted packet");
14954
      test_fail("Wrong data of the transmitted packet");
14955
      fail = fail + 1;
14956
    end
14957
    // check transmited TX packet CRC
14958
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
14959
    if (tmp > 0)
14960
    begin
14961
      $display("Wrong CRC of the transmitted packet");
14962
      test_fail("Wrong CRC of the transmitted packet");
14963
      fail = fail + 1;
14964
    end
14965 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14966 260 mohor
    // In the following section, control frame sending is requested while no other transmission        //
14967
    // is in progress. TXC interrupt is unmasked.                                                      //
14968 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14969
    // unmask all interrupts
14970
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14971
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14972
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14973
    if(data)
14974
      begin
14975
        test_fail("IRQ already pending!");
14976
        fail = fail + 1;
14977
        `TIME; $display("*E IRQ already pending!");
14978
      end
14979
    if (wb_int)
14980
    begin
14981
      test_fail("WB INT signal should not be set!");
14982
      fail = fail + 1;
14983
      `TIME; $display("*E WB INT signal should not be set!");
14984
    end
14985 260 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14986
    // In the following section, control frame request and data send request are both set. At the      //
14987
    // beginning control frame request will be faster than data send request, later the opposite.      //
14988
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14989
    for (i=0; i<32; i=i+1)
14990
    begin
14991
      // Request sending the control frame with pause value = 0x5678
14992
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
14993
      set_tx_bd_wrap(0);
14994
      // first destination address on ethernet PHY
14995
      eth_phy.set_tx_mem_addr(0);
14996
      set_tx_bd_ready(0, 0);
14997 274 tadejm
      // wait for transmission to start  
14998 260 mohor
      wait (MTxEn === 1'b1); // start transmit
14999
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
15000
      // Send control frame request
15001
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
15002
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15003 274 tadejm
      // wait until transmission is over  
15004 260 mohor
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15005
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15006
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15007
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15008
      // first destination address on ethernet PHY
15009
      eth_phy.set_tx_mem_addr(0);
15010 274 tadejm
      // check interrupt depending on which packet was sent
15011 260 mohor
      if(tmp_len == 64)  // Control frame
15012 254 mohor
      begin
15013 260 mohor
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15014
        if(data !== `ETH_INT_TXC)
15015
        begin
15016
          test_fail("TXC IRQ should be set!");
15017
          fail = fail + 1;
15018
          `TIME; $display("*E TXC IRQ should be set!");
15019
          `TIME; $display("ETH_INT = 0x%0x", data);
15020
        end
15021
      end
15022
      else
15023
      begin
15024
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15025
        if(data !== `ETH_INT_TXB)
15026
        begin
15027
          test_fail("TXB IRQ should be set!");
15028
          fail = fail + 1;
15029
          `TIME; $display("*E TXB IRQ should be set!");
15030
          `TIME; $display("ETH_INT = 0x%0x", data);
15031
        end
15032
      end
15033 274 tadejm
      // check transmited TX packet
15034 260 mohor
      if(tmp_len == 64)  // Control frame
15035
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15036
      else
15037
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15038
      if (tmp > 0)
15039
      begin
15040
        $display("Wrong data of the transmitted packet");
15041
        test_fail("Wrong data of the transmitted packet");
15042 254 mohor
        fail = fail + 1;
15043
      end
15044 260 mohor
      // check transmited TX packet CRC
15045
      if(tmp_len == 64)  // Control frame
15046
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15047
      else
15048
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15049
 
15050
      if (tmp > 0)
15051 254 mohor
      begin
15052 260 mohor
        $display("Wrong CRC of the transmitted packet");
15053
        test_fail("Wrong CRC of the transmitted packet");
15054
        fail = fail + 1;
15055
      end
15056 274 tadejm
      // wait for control frame to transmit
15057 260 mohor
      wait (MTxEn === 1'b1); // start transmit of the control frame
15058
      wait (MTxEn === 1'b0); // end transmit of the control frame
15059
      repeat(10) @ (posedge wb_clk);  // wait some time
15060
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15061 274 tadejm
      // check interrupts  
15062 260 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15063
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15064
      begin
15065 254 mohor
        test_fail("TXC and TXB IRQ should be set!");
15066
        fail = fail + 1;
15067 260 mohor
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15068 254 mohor
      end
15069 260 mohor
      if (!wb_int)
15070
      begin
15071
        test_fail("WB INT signal should be set!");
15072
        fail = fail + 1;
15073
        `TIME; $display("*E WB INT signal should be set!");
15074
      end
15075
      // Clear TXC and TXB interrupt
15076
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15077
      if (wb_int)
15078
      begin
15079
        test_fail("WB INT signal should not be set!");
15080
        fail = fail + 1;
15081
        `TIME; $display("*E WB INT signal should not be set!");
15082
      end
15083
      if(tmp_len == 64)  // Control frame
15084
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15085
      else
15086
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15087
      if (tmp > 0)
15088
      begin
15089
        $display("Wrong data of the transmitted packet");
15090
        test_fail("Wrong data of the transmitted packet");
15091
        fail = fail + 1;
15092
      end
15093
      // check transmited TX packet CRC
15094
      if(tmp_len == 64)  // Control frame
15095
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15096
      else
15097
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15098
      if (tmp > 0)
15099
      begin
15100
        $display("Wrong CRC of the transmitted packet");
15101
        test_fail("Wrong CRC of the transmitted packet");
15102
        fail = fail + 1;
15103
      end
15104
    end // for loop
15105
    if(fail == 0)
15106
      test_ok;
15107
    else
15108
      fail = 0;
15109
  end
15110 254 mohor
 
15111
 
15112 274 tadejm
  ////////////////////////////////////////////////////////////////////
15113
  ////                                                            ////
15114
  ////  Test inserts control frames while transmitting normal     ////
15115
  ////  frames. Using 4 TX buffer decriptors ( 100Mbps ).         ////
15116
  ////                                                            ////
15117
  ////////////////////////////////////////////////////////////////////
15118 263 mohor
  if (test_num == 1) // 
15119
  begin
15120
    // TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
15121
    test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
15122
    `TIME; $display("  TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
15123 274 tadejm
 
15124
    // reset MAC completely
15125
    hard_reset;
15126
    // set wb slave response
15127
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
15128
    max_tmp = 0;
15129
    min_tmp = 0;
15130
    // set 4 TX buffer descriptors - must be set before TX enable
15131
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15132
    // enable TX, set full-duplex mode, padding and CRC appending
15133
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
15134
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15135
    // enable TX flow control
15136
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15137
    // Set MAC address
15138
    mac_hi_addr = 32'h00000001;
15139
    mac_lo_addr = 32'h02030405;
15140
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15141
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15142
    // prepare two packets of MAXFL length
15143
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15144
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
15145
    min_tmp = tmp[31:16];
15146
    st_data = 8'h34;
15147
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15148
    st_data = 8'h56;
15149
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15150
    // check WB INT signal
15151
    if (wb_int !== 1'b0)
15152
    begin
15153
      test_fail("WB INT signal should not be set");
15154
      fail = fail + 1;
15155
    end
15156
 
15157
    // write to phy's control register for 100Mbps
15158
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
15159
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
15160
    speed = 100;
15161
 
15162
    frame_started = 0;
15163
    num_of_frames = 0;
15164
    num_of_bd = 0;
15165
    i_length = 0; // 0;
15166
    // Initialize one part of memory with data of control packet
15167
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
15168
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
15169
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
15170
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
15171
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
15172
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
15173
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
15174
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
15175
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
15176
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
15177
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
15178
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
15179
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
15180
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
15181
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
15182
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
15183
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15184
    // In the following section, control frame will be sent while no other transmission is in progress.//
15185
    // TXC interrupt won't be unmasked.                                                                //
15186
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15187
    // check interrupts
15188
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15189
    if(data)
15190
      begin
15191
        test_fail("IRQ already pending!");
15192
        fail = fail + 1;
15193
        `TIME; $display("*E IRQ already pending!");
15194
      end
15195
    if (wb_int)
15196
    begin
15197
      test_fail("WB INT signal should not be set!");
15198
      fail = fail + 1;
15199
      `TIME; $display("*E WB INT signal should not be set!");
15200
    end
15201
    // first destination address on ethernet PHY
15202
    eth_phy.set_tx_mem_addr(0);
15203
    // Request sending the control frame with pause value = 0x1111
15204
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15205
    // wait for transmission to come over
15206
    wait (MTxEn === 1'b1); // start transmit
15207
    wait (MTxEn === 1'b0); // end transmit
15208
    repeat(10) @ (posedge wb_clk);  // wait some time
15209
    repeat(10) @ (posedge mtx_clk); // wait some time
15210
    // check interrupt
15211
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15212
    if(data !== `ETH_INT_TXC)
15213
      begin
15214
        test_fail("TXC IRQ should be set!");
15215
        fail = fail + 1;
15216
        `TIME; $display("*E TXC IRQ should be set!");
15217
      end
15218
    if (wb_int)
15219
    begin
15220
      test_fail("WB INT signal should not be set because TXC irq is masked!");
15221
      fail = fail + 1;
15222
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
15223
    end
15224
    // Clear TXC interrupt
15225
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15226
    if (wb_int)
15227
    begin
15228
      test_fail("WB INT signal should not be set!");
15229
      fail = fail + 1;
15230
      `TIME; $display("*E WB INT signal should not be set!");
15231
    end
15232
    // check transmited TX packet
15233
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15234
    if (tmp > 0)
15235
    begin
15236
      $display("Wrong data of the transmitted packet");
15237
      test_fail("Wrong data of the transmitted packet");
15238
      fail = fail + 1;
15239
    end
15240
    // check transmited TX packet CRC
15241
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15242
    if (tmp > 0)
15243
    begin
15244
      $display("Wrong CRC of the transmitted packet");
15245
      test_fail("Wrong CRC of the transmitted packet");
15246
      fail = fail + 1;
15247
    end
15248
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15249
    // In the following section, control frame will be sent while no other transmission is in progress.//
15250
    // TXC interrupt is unmasked.                                                                      //
15251
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15252
    // unmask all interrupts
15253
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15254
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15255
    // check interrupts
15256
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15257
    if(data)
15258
      begin
15259
        test_fail("IRQ already pending!");
15260
        fail = fail + 1;
15261
        `TIME; $display("*E IRQ already pending!");
15262
      end
15263
    if (wb_int)
15264
    begin
15265
      test_fail("WB INT signal should not be set!");
15266
      fail = fail + 1;
15267
      `TIME; $display("*E WB INT signal should not be set!");
15268
    end
15269
    // unmask only TXC interrupts
15270
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15271
    // first destination address on ethernet PHY
15272
    eth_phy.set_tx_mem_addr(0);
15273
    // Request sending the control frame with pause value = 0x2222
15274
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
15275
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15276
    // wait for transmit to come over
15277
    wait (MTxEn === 1'b1); // start transmit
15278
    wait (MTxEn === 1'b0); // end transmit
15279
    repeat(10) @ (posedge wb_clk);  // wait some time
15280
    repeat(10) @ (posedge mtx_clk); // wait some time
15281
    // check INT
15282
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15283
    if(data !== `ETH_INT_TXC)
15284
      begin
15285
        test_fail("TXC IRQ should be set!");
15286
        fail = fail + 1;
15287
        `TIME; $display("*E TXC IRQ should be set!");
15288
      end
15289
    if (!wb_int)
15290
    begin
15291
      test_fail("WB INT signal should be set!");
15292
      fail = fail + 1;
15293
      `TIME; $display("*E WB INT signal should be set!");
15294
    end
15295
    // Clear TXC interrupt
15296
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15297
    if (wb_int)
15298
    begin
15299
      test_fail("WB INT signal should not be set!");
15300
      fail = fail + 1;
15301
      `TIME; $display("*E WB INT signal should not be set!");
15302
    end
15303
    // check transmited TX packet
15304
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15305
    if (tmp > 0)
15306
    begin
15307
      $display("Wrong data of the transmitted packet");
15308
      test_fail("Wrong data of the transmitted packet");
15309
      fail = fail + 1;
15310
    end
15311
    // check transmited TX packet CRC
15312
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15313
    if (tmp > 0)
15314
    begin
15315
      $display("Wrong CRC of the transmitted packet");
15316
      test_fail("Wrong CRC of the transmitted packet");
15317
      fail = fail + 1;
15318
    end
15319
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15320
    // In the following section, control frame sending is requested while no other transmission        //
15321
    // is in progress. TXC interrupt is unmasked.                                                      //
15322
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15323
    // unmask all interrupts
15324
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15325
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15326
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15327
    if(data)
15328
      begin
15329
        test_fail("IRQ already pending!");
15330
        fail = fail + 1;
15331
        `TIME; $display("*E IRQ already pending!");
15332
      end
15333
    if (wb_int)
15334
    begin
15335
      test_fail("WB INT signal should not be set!");
15336
      fail = fail + 1;
15337
      `TIME; $display("*E WB INT signal should not be set!");
15338
    end
15339
 
15340
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15341
    // In the following section, control frame request and data send request are both set. At the      //
15342
    // beginning control frame request will be faster than data send request, later the opposite.      //
15343
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15344
    for (i=0; i<32; i=i+1)
15345
    begin
15346
      // Request sending the control frame with pause value = 0x5678
15347
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
15348
      set_tx_bd_wrap(0);
15349
      // first destination address on ethernet PHY
15350
      eth_phy.set_tx_mem_addr(0);
15351
      set_tx_bd_ready(0, 0);
15352
      // wait for transmission to start  
15353
      wait (MTxEn === 1'b1); // start transmit
15354
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
15355
      // Send control frame request
15356
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
15357
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15358
      // wait until transmission is over  
15359
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15360
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15361
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15362
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15363
      // first destination address on ethernet PHY
15364
      eth_phy.set_tx_mem_addr(0);
15365
      // check interrupt depending on which packet was sent
15366
 
15367
      if(tmp_len == 64)  // Control frame
15368
      begin
15369
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15370
        if(data !== `ETH_INT_TXC)
15371
        begin
15372
          test_fail("TXC IRQ should be set!");
15373
          fail = fail + 1;
15374
          `TIME; $display("*E TXC IRQ should be set!");
15375
          `TIME; $display("ETH_INT = 0x%0x", data);
15376
        end
15377
      end
15378
      else
15379
      begin
15380
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15381
        if(data !== `ETH_INT_TXB)
15382
        begin
15383
          test_fail("TXB IRQ should be set!");
15384
          fail = fail + 1;
15385
          `TIME; $display("*E TXB IRQ should be set!");
15386
          `TIME; $display("ETH_INT = 0x%0x", data);
15387
        end
15388
      end
15389
      // check transmited TX packet
15390
      if(tmp_len == 64)  // Control frame
15391
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15392
      else
15393
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15394
      if (tmp > 0)
15395
      begin
15396
        $display("Wrong data of the transmitted packet");
15397
        test_fail("Wrong data of the transmitted packet");
15398
        fail = fail + 1;
15399
      end
15400
      // check transmited TX packet CRC
15401
      if(tmp_len == 64)  // Control frame
15402
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15403
      else
15404
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15405
 
15406
      if (tmp > 0)
15407
      begin
15408
        $display("Wrong CRC of the transmitted packet");
15409
        test_fail("Wrong CRC of the transmitted packet");
15410
        fail = fail + 1;
15411
      end
15412
      // wait for control frame to transmit
15413
      wait (MTxEn === 1'b1); // start transmit of the control frame
15414
      wait (MTxEn === 1'b0); // end transmit of the control frame
15415
      repeat(10) @ (posedge wb_clk);  // wait some time
15416
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15417
      // check interrupts  
15418
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15419
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15420
      begin
15421
        test_fail("TXC and TXB IRQ should be set!");
15422
        fail = fail + 1;
15423
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15424
      end
15425
      if (!wb_int)
15426
      begin
15427
        test_fail("WB INT signal should be set!");
15428
        fail = fail + 1;
15429
        `TIME; $display("*E WB INT signal should be set!");
15430
      end
15431
      // Clear TXC and TXB interrupt
15432
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15433
      if (wb_int)
15434
      begin
15435
        test_fail("WB INT signal should not be set!");
15436
        fail = fail + 1;
15437
        `TIME; $display("*E WB INT signal should not be set!");
15438
      end
15439
      if(tmp_len == 64)  // Control frame
15440
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15441
      else
15442
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15443
      if (tmp > 0)
15444
      begin
15445
        $display("Wrong data of the transmitted packet");
15446
        test_fail("Wrong data of the transmitted packet");
15447
        fail = fail + 1;
15448
      end
15449
      // check transmited TX packet CRC
15450
      if(tmp_len == 64)  // Control frame
15451
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15452
      else
15453
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15454
      if (tmp > 0)
15455
      begin
15456
        $display("Wrong CRC of the transmitted packet");
15457
        test_fail("Wrong CRC of the transmitted packet");
15458
        fail = fail + 1;
15459
      end
15460
    end // for loop
15461
    if(fail == 0)
15462
      test_ok;
15463
    else
15464
      fail = 0;
15465 263 mohor
  end
15466 254 mohor
 
15467 274 tadejm
 
15468 260 mohor
  ////////////////////////////////////////////////////////////////////
15469
  ////                                                            ////
15470 267 mohor
  ////  Receive control frames with PASSALL option turned on and  ////
15471
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
15472 260 mohor
  ////                                                            ////
15473
  ////////////////////////////////////////////////////////////////////
15474 263 mohor
  if (test_num == 2) // 
15475 260 mohor
  begin
15476 267 mohor
    // TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
15477
    test_name   = "TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )";
15478
    `TIME; $display("  TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )");
15479 254 mohor
 
15480 260 mohor
    // unmask interrupts
15481
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15482
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15483
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
15484
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15485
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
15486 267 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
15487 260 mohor
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15488
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15489 263 mohor
    // enable RX_FLOW control
15490
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15491 260 mohor
    // prepare one packet of 100 bytes long
15492 267 mohor
//    st_data = 8'h1A;
15493
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
15494
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
15495
    st_data = 8'h01;
15496
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
15497
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
15498
    set_tx_bd_wrap(0);
15499 260 mohor
    // check WB INT signal
15500
    if (wb_int !== 1'b0)
15501
    begin
15502
      test_fail("WB INT signal should not be set");
15503
      fail = fail + 1;
15504
    end
15505 274 tadejm
 
15506 260 mohor
    // write to phy's control register for 10Mbps
15507
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
15508
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
15509
    speed = 10;
15510 254 mohor
 
15511 266 mohor
    // RXB and RXC interrupts masked
15512
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
15513
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15514
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
15515
    for (i=0; i<3; i=i+1)
15516
    begin
15517 274 tadejm
      pause_value = i+2;
15518 267 mohor
      set_rx_control_packet(0, pause_value);  // CRC already appended
15519 266 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15520
      case (i)
15521
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
15522
      begin
15523
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
15524
        // enable interrupt generation
15525
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15526
        // Set PASSALL = 0 and RXFLOW = 0
15527
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15528
      end
15529
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
15530
      begin
15531
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
15532
        // enable interrupt generation
15533
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15534
        // Set PASSALL = 0 and RXFLOW = 0
15535
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15536
      end
15537
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
15538
      begin
15539
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
15540
        // enable interrupt generation
15541
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
15542
        // Set PASSALL = 0 and RXFLOW = 0
15543
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15544
      end
15545
      default:
15546
      begin
15547
        $display("*E We should never get here !!!");
15548
        test_fail("We should never get here !!!");
15549
        fail = fail + 1;
15550
      end
15551
      endcase
15552
      // not detect carrier sense in FD and no collision
15553
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15554
      eth_phy.collision(0);
15555
      // set wrap bit and empty bit
15556
      set_rx_bd_wrap(127);
15557
      set_rx_bd_empty(127, 127);
15558 274 tadejm
      // transmit
15559 266 mohor
      fork
15560
        begin
15561
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15562
          repeat(10) @(posedge mrx_clk);
15563
        end
15564
        begin
15565
          wait (MRxDV === 1'b1); // start transmit
15566
          #1 check_rx_bd(127, data);
15567
          if (data[15] !== 1)
15568
          begin
15569
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15570
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15571
            fail = fail + 1;
15572
          end
15573 267 mohor
          wait (MRxDV === 1'b0); // received pause frame
15574
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
15575
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
15576
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
15577
                                 // and RxFlow enabled.
15578
          // When we exit the while loop, status frame is received
15579
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
15580
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
15581 266 mohor
        end
15582
      join
15583
      #1 check_rx_bd(127, data);
15584
      // Checking buffer descriptor
15585
      if(PassAll)
15586
      begin
15587
        if(enable_irq_in_rxbd)
15588
        begin
15589
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15590
          begin
15591
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15592
            $display("RxBD = 0x%0x", data);
15593
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15594
            fail = fail + 1;
15595
          end
15596
        end
15597
        else
15598
        begin
15599
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
15600
          begin
15601
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15602
            $display("RxBD = 0x%0x", data);
15603
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15604
            fail = fail + 1;
15605
          end
15606
        end
15607
      end
15608
      else
15609
      begin
15610
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
15611
        begin
15612
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15613
          $display("RxBD = 0x%0x", data);
15614
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15615
          fail = fail + 1;
15616
        end
15617
      end
15618
      // Checking if interrupt was generated
15619
      if (wb_int)
15620
      begin
15621
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
15622
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
15623
        fail = fail + 1;
15624
      end
15625
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15626
      if(RxFlow)
15627
      begin
15628
        if(data !== (`ETH_INT_RXC))
15629
        begin
15630
          test_fail("RXC is not set or multiple IRQs active!");
15631
          fail = fail + 1;
15632
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15633
        end
15634
        // Clear RXC interrupt
15635
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
15636
      end
15637
      else if(enable_irq_in_rxbd)
15638
      begin
15639
        if(data !== (`ETH_INT_RXB))
15640
        begin
15641
          test_fail("RXB is not set or multiple IRQs active!");
15642
          fail = fail + 1;
15643
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15644
        end
15645
        // Clear RXC interrupt
15646
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
15647
      end
15648
      else
15649
      begin
15650
        if(data !== 0)
15651
        begin
15652
          test_fail("Some IRQs is active!");
15653
          fail = fail + 1;
15654
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
15655
        end
15656
      end
15657 267 mohor
      if(RxFlow)
15658
        begin
15659
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
15660
            begin
15661
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
15662
              test_fail("Transmission should not be started because pause frame was received.");
15663
              fail = fail + 1;
15664
            end
15665
          while(pause_value)
15666
            begin
15667
              pause_value=pause_value-1;
15668
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
15669
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
15670
                begin
15671
                  `TIME; $display("*E Transmission should be started because pause passed.");
15672
                  test_fail("Transmission should be started because pause passed.");
15673
                  fail = fail + 1;
15674
                end
15675
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
15676
                begin
15677
                  `TIME; $display("*E Transmission should still be paused.");
15678
                  test_fail("Transmission should still be paused.");
15679
                  fail = fail + 1;
15680
                end
15681
            end
15682
        end
15683
      else
15684
        begin
15685
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
15686
            begin
15687
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
15688
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
15689
              fail = fail + 1;
15690
            end
15691
        end
15692
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
15693
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15694
      if(data !== (`ETH_INT_TXB))
15695
        begin
15696
          test_fail("TXB is not set or multiple IRQs active!");
15697
          fail = fail + 1;
15698
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15699
        end
15700
        // Clear TXB interrupt
15701
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15702 266 mohor
    end
15703
    // End: Test is irq is set while RXB and RXC interrupts are masked.
15704
 
15705
    // Now all interrupts are unmasked. Performing tests again.
15706 263 mohor
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15707
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15708 260 mohor
    for (i=0; i<4; i=i+1)
15709 254 mohor
    begin
15710 267 mohor
      pause_value = i+1;
15711
      set_rx_control_packet(0, pause_value);  // CRC already appended
15712 260 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15713
      case (i)
15714 263 mohor
      0: // PASSALL = 0, RXFLOW = 0
15715 254 mohor
      begin
15716 263 mohor
        PassAll=0; RxFlow=0;
15717 260 mohor
        // enable interrupt generation
15718 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15719
        // Set PASSALL = 0 and RXFLOW = 0
15720
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15721 254 mohor
      end
15722 263 mohor
      1: // PASSALL = 0, RXFLOW = 1
15723 254 mohor
      begin
15724 263 mohor
        PassAll=0; RxFlow=1;
15725 260 mohor
        // enable interrupt generation
15726 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15727
        // Set PASSALL = 0 and RXFLOW = 0
15728
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15729 254 mohor
      end
15730 263 mohor
      2: // PASSALL = 1, RXFLOW = 0
15731 254 mohor
      begin
15732 263 mohor
        PassAll=1; RxFlow=0;
15733
        // enable interrupt generation
15734
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15735
        // Set PASSALL = 0 and RXFLOW = 0
15736
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15737 254 mohor
      end
15738 263 mohor
      default: // 3: PASSALL = 1, RXFLOW = 1
15739 254 mohor
      begin
15740 263 mohor
        PassAll=1; RxFlow=1;
15741
        // enable interrupt generation
15742
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15743
        // Set PASSALL = 1 and RXFLOW = 1
15744
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15745 254 mohor
      end
15746
      endcase
15747 263 mohor
      // not detect carrier sense in FD and no collision
15748
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15749
      eth_phy.collision(0);
15750
      // set wrap bit and empty bit
15751 260 mohor
      set_rx_bd_wrap(127);
15752
      set_rx_bd_empty(127, 127);
15753 274 tadejm
      // transmit
15754 260 mohor
      fork
15755 254 mohor
        begin
15756 260 mohor
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15757
          repeat(10) @(posedge mrx_clk);
15758 254 mohor
        end
15759
        begin
15760 260 mohor
          #1 check_rx_bd(127, data);
15761
          wait (MRxDV === 1'b1); // start transmit
15762 263 mohor
          #1 check_rx_bd(127, data);
15763 260 mohor
          if (data[15] !== 1)
15764
          begin
15765 263 mohor
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15766 260 mohor
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15767
            fail = fail + 1;
15768
          end
15769
          wait (MRxDV === 1'b0); // end transmit
15770 263 mohor
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
15771
          repeat (100) @(posedge wb_clk); // status/irq is written.
15772 267 mohor
 
15773
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
15774
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
15775 254 mohor
        end
15776 260 mohor
      join
15777 263 mohor
      #1 check_rx_bd(127, data);
15778
      // Checking buffer descriptor
15779
      if(PassAll)
15780 254 mohor
      begin
15781 263 mohor
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15782
        begin
15783
          $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15784
          $display("RxBD = 0x%0x", data);
15785
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15786
          fail = fail + 1;
15787
        end
15788 254 mohor
      end
15789 260 mohor
      else
15790 254 mohor
      begin
15791 263 mohor
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
15792
        begin
15793
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15794
          $display("RxBD = 0x%0x", data);
15795
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15796
          fail = fail + 1;
15797
        end
15798 254 mohor
      end
15799 263 mohor
      // Checking if interrupt was generated
15800
      if(RxFlow || PassAll)
15801 254 mohor
      begin
15802 263 mohor
        if (!wb_int)
15803 254 mohor
        begin
15804
          `TIME; $display("*E WB INT signal should be set");
15805
          test_fail("WB INT signal should be set");
15806
          fail = fail + 1;
15807
        end
15808
      end
15809
      else
15810
      begin
15811 263 mohor
        if (wb_int)
15812 254 mohor
        begin
15813
          `TIME; $display("*E WB INT signal should not be set");
15814
          test_fail("WB INT signal should not be set");
15815
          fail = fail + 1;
15816
        end
15817
      end
15818 274 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15819
      if(RxFlow)
15820
      begin
15821
        if(data !== (`ETH_INT_RXC))
15822
        begin
15823
          test_fail("RXC is not set or multiple IRQs active!");
15824
          fail = fail + 1;
15825
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15826
        end
15827
        // Clear RXC interrupt
15828
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
15829
      end
15830
      else if(PassAll)
15831
      begin
15832
        if(data !== (`ETH_INT_RXB))
15833
        begin
15834
          test_fail("RXB is not set or multiple IRQs active!");
15835
          fail = fail + 1;
15836
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15837
        end
15838
        // Clear RXB interrupt
15839
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
15840
      end
15841
      else
15842
      begin
15843
        if(data !== 0)
15844
        begin
15845
          test_fail("No interrupt should be set!");
15846
          fail = fail + 1;
15847
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
15848
        end
15849
      end
15850
    end
15851
    // disable RX
15852
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
15853
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15854
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15855
    if(fail == 0)
15856
      test_ok;
15857
    else
15858
      fail = 0;
15859
  end
15860 263 mohor
 
15861 274 tadejm
 
15862
  ////////////////////////////////////////////////////////////////////
15863
  ////                                                            ////
15864
  ////  Receive control frames with PASSALL option turned on and  ////
15865
  ////  off. Using only one RX buffer decriptor ( 100Mbps ).      ////
15866
  ////                                                            ////
15867
  ////////////////////////////////////////////////////////////////////
15868
  if (test_num == 3) // 
15869
  begin
15870
    // TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )
15871
    test_name   = "TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )";
15872
    `TIME; $display("  TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )");
15873
 
15874
    // unmask interrupts
15875
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15876
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15877
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
15878
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15879
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
15880
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
15881
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15882
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15883
    // enable RX_FLOW control
15884
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15885
    // prepare one packet of 100 bytes long
15886
//    st_data = 8'h1A;
15887
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
15888
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
15889
    st_data = 8'h01;
15890
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
15891
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
15892
    set_tx_bd_wrap(0);
15893
    // check WB INT signal
15894
    if (wb_int !== 1'b0)
15895
    begin
15896
      test_fail("WB INT signal should not be set");
15897
      fail = fail + 1;
15898
    end
15899
 
15900
    // write to phy's control register for 100Mbps
15901
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
15902
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
15903
    speed = 100;
15904
 
15905
    // RXB and RXC interrupts masked
15906
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
15907
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15908
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
15909
    for (i=0; i<3; i=i+1)
15910
    begin
15911
      pause_value = i+2;
15912
      set_rx_control_packet(0, pause_value);  // CRC already appended
15913
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15914
      case (i)
15915
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
15916
      begin
15917
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
15918
        // enable interrupt generation
15919
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15920
        // Set PASSALL = 0 and RXFLOW = 0
15921
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15922
      end
15923
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
15924
      begin
15925
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
15926
        // enable interrupt generation
15927
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15928
        // Set PASSALL = 0 and RXFLOW = 0
15929
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15930
      end
15931
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
15932
      begin
15933
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
15934
        // enable interrupt generation
15935
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
15936
        // Set PASSALL = 0 and RXFLOW = 0
15937
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15938
      end
15939
      default:
15940
      begin
15941
        `TIME; $display("*E We should never get here !!!");
15942
        test_fail("We should never get here !!!");
15943
        fail = fail + 1;
15944
      end
15945
      endcase
15946
      // not detect carrier sense in FD and no collision
15947
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15948
      eth_phy.collision(0);
15949
      // set wrap bit and empty bit
15950
      set_rx_bd_wrap(127);
15951
      set_rx_bd_empty(127, 127);
15952
      // transmit
15953
      fork
15954
        begin
15955
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15956
          repeat(10) @(posedge mrx_clk);
15957
        end
15958
        begin
15959
          wait (MRxDV === 1'b1); // start transmit
15960
          #1 check_rx_bd(127, data);
15961
          if (data[15] !== 1)
15962
          begin
15963
            `TIME; $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15964
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15965
            fail = fail + 1;
15966
          end
15967
          wait (MRxDV === 1'b0); // received pause frame
15968
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
15969
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
15970
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
15971
                                 // and RxFlow enabled.
15972
          // When we exit the while loop, status frame is received
15973
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
15974
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
15975
        end
15976
      join
15977
      #1 check_rx_bd(127, data);
15978
      // Checking buffer descriptor
15979
      if(PassAll)
15980
      begin
15981
        if(enable_irq_in_rxbd)
15982
        begin
15983
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15984
          begin
15985
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15986
            $display("RxBD = 0x%0x", data);
15987
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15988
            fail = fail + 1;
15989
          end
15990
        end
15991
        else
15992
        begin
15993
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
15994
          begin
15995
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15996
            $display("RxBD = 0x%0x", data);
15997
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15998
            fail = fail + 1;
15999
          end
16000
        end
16001
      end
16002
      else
16003
      begin
16004
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16005
        begin
16006
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16007
          $display("RxBD = 0x%0x", data);
16008
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16009
          fail = fail + 1;
16010
        end
16011
      end
16012
      // Checking if interrupt was generated
16013
      if (wb_int)
16014
      begin
16015
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
16016
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
16017
        fail = fail + 1;
16018
      end
16019 263 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16020
      if(RxFlow)
16021 254 mohor
      begin
16022 263 mohor
        if(data !== (`ETH_INT_RXC))
16023 254 mohor
        begin
16024 263 mohor
          test_fail("RXC is not set or multiple IRQs active!");
16025 260 mohor
          fail = fail + 1;
16026 263 mohor
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16027 254 mohor
        end
16028 263 mohor
        // Clear RXC interrupt
16029
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16030 254 mohor
      end
16031 274 tadejm
      else if(enable_irq_in_rxbd)
16032
      begin
16033
        if(data !== (`ETH_INT_RXB))
16034
        begin
16035
          test_fail("RXB is not set or multiple IRQs active!");
16036
          fail = fail + 1;
16037
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16038
        end
16039
        // Clear RXC interrupt
16040
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16041
      end
16042
      else
16043
      begin
16044
        if(data !== 0)
16045
        begin
16046
          test_fail("Some IRQs is active!");
16047
          fail = fail + 1;
16048
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
16049
        end
16050
      end
16051
      if(RxFlow)
16052
        begin
16053
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
16054
            begin
16055
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
16056
              test_fail("Transmission should not be started because pause frame was received.");
16057
              fail = fail + 1;
16058
            end
16059
          while(pause_value)
16060
            begin
16061
              pause_value=pause_value-1;
16062
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
16063
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
16064
                begin
16065
                  `TIME; $display("*E Transmission should be started because pause passed.");
16066
                  test_fail("Transmission should be started because pause passed.");
16067
                  fail = fail + 1;
16068
                end
16069
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
16070
                begin
16071
                  `TIME; $display("*E Transmission should still be paused.");
16072
                  test_fail("Transmission should still be paused.");
16073
                  fail = fail + 1;
16074
                end
16075
            end
16076
        end
16077
      else
16078
        begin
16079
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
16080
            begin
16081
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
16082
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
16083
              fail = fail + 1;
16084
            end
16085
        end
16086
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
16087
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16088
      if(data !== (`ETH_INT_TXB))
16089
        begin
16090
          test_fail("TXB is not set or multiple IRQs active!");
16091
          fail = fail + 1;
16092
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16093
        end
16094
        // Clear TXB interrupt
16095
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
16096
    end
16097
    // End: Test is irq is set while RXB and RXC interrupts are masked.
16098
 
16099
    // Now all interrupts are unmasked. Performing tests again.
16100
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16101
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16102
    for (i=0; i<4; i=i+1)
16103
    begin
16104
      pause_value = i+1;
16105
      set_rx_control_packet(0, pause_value);  // CRC already appended
16106
      // choose generating carrier sense and collision for first and last 64 lengths of frames
16107
      case (i)
16108
      0: // PASSALL = 0, RXFLOW = 0
16109
      begin
16110
        PassAll=0; RxFlow=0;
16111
        // enable interrupt generation
16112
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16113
        // Set PASSALL = 0 and RXFLOW = 0
16114
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16115
      end
16116
      1: // PASSALL = 0, RXFLOW = 1
16117
      begin
16118
        PassAll=0; RxFlow=1;
16119
        // enable interrupt generation
16120
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16121
        // Set PASSALL = 0 and RXFLOW = 0
16122
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16123
      end
16124
      2: // PASSALL = 1, RXFLOW = 0
16125
      begin
16126
        PassAll=1; RxFlow=0;
16127
        // enable interrupt generation
16128
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16129
        // Set PASSALL = 0 and RXFLOW = 0
16130
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16131
      end
16132
      default: // 3: PASSALL = 1, RXFLOW = 1
16133
      begin
16134
        PassAll=1; RxFlow=1;
16135
        // enable interrupt generation
16136
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16137
        // Set PASSALL = 1 and RXFLOW = 1
16138
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16139
      end
16140
      endcase
16141
      // not detect carrier sense in FD and no collision
16142
      eth_phy.no_carrier_sense_rx_fd_detect(0);
16143
      eth_phy.collision(0);
16144
      // set wrap bit and empty bit
16145
      set_rx_bd_wrap(127);
16146
      set_rx_bd_empty(127, 127);
16147
      // transmit
16148
      fork
16149
        begin
16150
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
16151
          repeat(10) @(posedge mrx_clk);
16152
        end
16153
        begin
16154
          #1 check_rx_bd(127, data);
16155
          wait (MRxDV === 1'b1); // start transmit
16156
          #1 check_rx_bd(127, data);
16157
          if (data[15] !== 1)
16158
          begin
16159
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
16160
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16161
            fail = fail + 1;
16162
          end
16163
          wait (MRxDV === 1'b0); // end transmit
16164
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
16165
          repeat (100) @(posedge wb_clk); // status/irq is written.
16166
 
16167
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
16168
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
16169
        end
16170
      join
16171
      #1 check_rx_bd(127, data);
16172
      // Checking buffer descriptor
16173
      if(PassAll)
16174
      begin
16175
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
16176
        begin
16177
          `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16178
          $display("RxBD = 0x%0x", data);
16179
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16180
          fail = fail + 1;
16181
        end
16182
      end
16183
      else
16184
      begin
16185
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16186
        begin
16187
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16188
          $display("RxBD = 0x%0x", data);
16189
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16190
          fail = fail + 1;
16191
        end
16192
      end
16193
      // Checking if interrupt was generated
16194
 
16195
      if(RxFlow | PassAll)
16196
      begin
16197
        if (!wb_int)
16198
        begin
16199
          `TIME; $display("*E WB INT signal should be set");
16200
          test_fail("WB INT signal should be set");
16201
          fail = fail + 1;
16202
        end
16203
      end
16204
      else
16205
      begin
16206
        if (wb_int)
16207
        begin
16208
          `TIME; $display("*E WB INT signal should not be set");
16209
          test_fail("WB INT signal should not be set");
16210
          fail = fail + 1;
16211
        end
16212
      end
16213
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16214
      if(RxFlow)
16215
      begin
16216
        if(data !== (`ETH_INT_RXC))
16217
        begin
16218
          test_fail("RXC is not set or multiple IRQs active!");
16219
          fail = fail + 1;
16220
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16221
        end
16222
        // Clear RXC interrupt
16223
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16224
      end
16225 263 mohor
      else if(PassAll)
16226 254 mohor
      begin
16227 263 mohor
        if(data !== (`ETH_INT_RXB))
16228 254 mohor
        begin
16229 263 mohor
          test_fail("RXB is not set or multiple IRQs active!");
16230 254 mohor
          fail = fail + 1;
16231 263 mohor
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16232 254 mohor
        end
16233 263 mohor
        // Clear RXB interrupt
16234
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16235 254 mohor
      end
16236
      else
16237
      begin
16238 263 mohor
        if(data !== 0)
16239 254 mohor
        begin
16240 263 mohor
          test_fail("No interrupt should be set!");
16241 254 mohor
          fail = fail + 1;
16242 263 mohor
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
16243 254 mohor
        end
16244
      end
16245
    end
16246 274 tadejm
    // disable RX
16247
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16248
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16249
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16250
    if(fail == 0)
16251
      test_ok;
16252
    else
16253
      fail = 0;
16254
  end
16255 266 mohor
 
16256 274 tadejm
 
16257
  ////////////////////////////////////////////////////////////////////
16258
  ////                                                            ////
16259
  ////  Receive control frames with PASSALL option turned on and  ////
16260
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
16261
  ////                                                            ////
16262
  ////////////////////////////////////////////////////////////////////
16263
  if (test_num == 4) // 
16264
  begin
16265
    // TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
16266
    test_name   = "TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )";
16267
    `TIME; $display("  TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )");
16268
 
16269
    // unmask interrupts
16270
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16271
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16272
    // set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
16273
    wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16274
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
16275
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
16276
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16277
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16278
    // enable flow control
16279
 
16280
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
16281
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16282
    // prepare one RX and one TX packet of 100 bytes long
16283
    rx_len = 100; // length of frame without CRC
16284
    st_data = 8'h1A;
16285
    set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
16286
    append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
16287
    tx_len = 64; // length of frame without CRC
16288
    st_data = 8'h01;
16289
    set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
16290
    // set TX and RX Buffer Descriptors 
16291
    tx_bd_num = 0; // tx BDs go from 0 to 0
16292
    rx_bd_num = 1; // rx BDs go from 1 to 1
16293
    // check WB INT signal
16294
    if (wb_int !== 1'b0)
16295
    begin
16296
      test_fail("WB INT signal should not be set");
16297
      fail = fail + 1;
16298
    end
16299
 
16300
    // set EQUAL mrx_clk to mtx_clk!
16301
//    eth_phy.set_mrx_equal_mtx = 1'b1;
16302 263 mohor
 
16303 274 tadejm
    // write to phy's control register for 10Mbps
16304
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
16305
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
16306
    speed = 10;
16307
 
16308
    // TXB and RXB interrupts masked
16309
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY | `ETH_INT_TXC | `ETH_INT_RXC,
16310
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16311
 
16312
    tmp_len = 0;
16313
    num_of_frames = 0;
16314
    num_of_rx_frames = 0;
16315
//    num_of_iter = 0;
16316
    // TX frame loop & RX frame loop work independently
16317
 
16318
 
16319
    fork
16320
      // TX frame loop
16321
      while (num_of_frames < 400)
16322
      begin
16323
        eth_phy.set_tx_mem_addr(64 + num_of_frames);
16324
        // set tx bd
16325
          // wait for WB master if it is working
16326
          @(posedge wb_clk);
16327
          while (wbm_working)
16328
          begin
16329
            @(posedge wb_clk);
16330
          end
16331
        set_tx_bd(0, 0, tx_len, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
16332
        set_tx_bd_wrap(0);
16333
        set_tx_bd_ready(0, 0);
16334
        check_tx_bd(0, data);
16335
        // check frame
16336
        i = 0;
16337
        while((i < 100) && (MTxEn === 1'b0)) // wait for start of TX frame!
16338
        begin
16339
          @(posedge mtx_clk);
16340
          i = i + 1;
16341
        end
16342
        if (MTxEn != 1'b1)
16343
        begin
16344
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't start transmitting the packet", num_of_frames);
16345
          test_fail("MAC TX didn't start transmitting the packet");
16346
          fail = fail + 1;
16347
          #10000 $stop;
16348
        end
16349
 
16350
        repeat (30) @(posedge mtx_clk); // waiting some time so PHY clears the tx_len
16351
 
16352
        wait ((MTxEn === 1'b0) || (eth_phy.tx_len > (tx_len + 4))) // wait for end of TX frame
16353
        if (MTxEn != 1'b0)
16354
        begin
16355
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't stop transmitting the packet", num_of_frames);
16356
          test_fail("MAC TX didn't stop transmitting the packet");
16357
          fail = fail + 1;
16358
          #10000 $stop;
16359
        end
16360
        tmp_len = eth_phy.tx_len;
16361
          // wait for WB master if it is working
16362
          @(posedge wb_clk);
16363
          while (wbm_working)
16364
          begin
16365
            @(posedge wb_clk);
16366
          end
16367
        check_tx_bd(0, data);
16368
        while (data[15] === 1)
16369
        begin
16370
            // wait for WB master if it is working
16371
            @(posedge wb_clk);
16372
            while (wbm_working)
16373
            begin
16374
              @(posedge wb_clk);
16375
            end
16376
          check_tx_bd(0, data);
16377
        end
16378
        repeat (1) @(posedge wb_clk);
16379
        // check length of a PACKET
16380
        if (tmp_len != (tx_len + 4))
16381
        begin
16382
          `TIME; $display("*E Tx Frame %0d: Wrong length of the packet out from MAC (%0d instead of %0d)", num_of_frames,
16383
                          tmp_len, (tx_len + 4));
16384
          test_fail("Wrong length of the packet out from MAC");
16385
          fail = fail + 1;
16386
        end
16387
        // check transmitted TX packet data
16388
        check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
16389
        if (tmp > 0)
16390
        begin
16391
          `TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
16392
          test_fail("Wrong data of the transmitted packet");
16393
          fail = fail + 1;
16394
        end
16395
        // check transmited TX packet CRC
16396
        check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
16397
        if (tmp > 0)
16398
        begin
16399
          `TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
16400
          test_fail("Wrong CRC of the transmitted packet");
16401
          fail = fail + 1;
16402
        end
16403
        // check WB INT signal
16404
        if (wb_int !== 1'b0)
16405
        begin
16406
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16407
          test_fail("WB INT signal should not be set");
16408
          fail = fail + 1;
16409
        end
16410
        // check TX buffer descriptor of a packet
16411
          // wait for WB master if it is working
16412
          @(posedge wb_clk);
16413
          while (wbm_working)
16414
          begin
16415
            @(posedge wb_clk);
16416
          end
16417
        check_tx_bd(0, data);
16418
        if (data[15:0] !== 16'h7800)
16419
        begin
16420
          `TIME; $display("*E Tx Frame %0d: TX buffer descriptor status is not correct: %0h", num_of_frames, data[15:0]);
16421
          test_fail("TX buffer descriptor status is not correct");
16422
          fail = fail + 1;
16423
        end
16424
        // check interrupts
16425
          // wait for WB master if it is working
16426
          @(posedge wb_clk);
16427
          while (wbm_working)
16428
          begin
16429
            @(posedge wb_clk);
16430
          end
16431
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16432
        if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
16433
        begin
16434
          `TIME; $display("*E Tx Frame %0d: Interrupt Transmit Buffer was not set, interrupt reg: %0h", num_of_frames, data);
16435
          test_fail("Interrupt Transmit Buffer was not set");
16436
          fail = fail + 1;
16437
        end
16438
        if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
16439
        begin
16440
          `TIME; $display("*E Tx Frame %0d: Other interrupts (except Tx and Rx Buffer) were set, interrupt reg: %0h",
16441
                          num_of_frames, data);
16442
          test_fail("Other interrupts (except Transmit Buffer) were set");
16443
          fail = fail + 1;
16444
        end
16445
        // clear interrupts (except RXB)
16446
          // wait for WB master if it is working
16447
          @(posedge wb_clk);
16448
          while (wbm_working)
16449
          begin
16450
            @(posedge wb_clk);
16451
          end
16452
        wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16453
        // check WB INT signal
16454
        if (wb_int !== 1'b0)
16455
        begin
16456
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16457
          test_fail("WB INT signal should not be set");
16458
          fail = fail + 1;
16459
        end
16460
        // Displays
16461
        if (num_of_frames[2:0] == 3'b111)
16462
        begin
16463
          `TIME; $display("   ->8 frames transmitted");
16464
        end
16465
        // set length (loop variable)
16466
        num_of_frames = num_of_frames + 1;
16467
      end // TX frame loop
16468
      // RX frame loop
16469
      while (num_of_rx_frames < 400)
16470
      begin
16471
        // set rx bd
16472
          // wait for WB master if it is working
16473
          @(posedge wb_clk);
16474
          #1;
16475
          while (wbm_working)
16476
          begin
16477
            @(posedge wb_clk);
16478
            #1;
16479
          end
16480
        set_rx_bd(1, 1, 1'b1, (`MEMORY_BASE + 200 + num_of_rx_frames));
16481
        set_rx_bd_wrap(1);
16482
        set_rx_bd_empty(1, 1);
16483
        // check frame
16484
        fork
16485
          begin
16486
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
16487
            repeat(10) @(posedge mrx_clk);
16488
          end
16489
          begin
16490
            wait (MRxDV === 1'b1); // start receive
16491
              // wait for WB master if it is working
16492
              @(posedge wb_clk);
16493
              #1;
16494
              while (wbm_working)
16495
              begin
16496
                @(posedge wb_clk);
16497
                #1;
16498
              end
16499
            check_rx_bd(1, data);
16500
            if (data[15] !== 1)
16501
            begin
16502
              `TIME; $display("*E Rx Frame %0d: Wrong buffer descriptor's ready bit read out from MAC", num_of_rx_frames);
16503
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16504
              fail = fail + 1;
16505
            end
16506
            wait (MRxDV === 1'b0); // end receive
16507
 
16508
            while (data[15] === 1)
16509
            begin
16510
                // wait for WB master if it is working
16511
                @(posedge wb_clk);
16512
                #1;
16513
                while (wbm_working)
16514
                begin
16515
                  @(posedge wb_clk);
16516
                  #1;
16517
                end
16518
              check_rx_bd(1, data);
16519
            end
16520
            repeat (1) @(posedge wb_clk);
16521
          end
16522
        join
16523
        // check length of a PACKET
16524
 
16525
        // Additional read because simulator was not working OK.
16526
        // wait for WB master if it is working
16527
        @(posedge wb_clk);
16528
        #1;
16529
        while (wbm_working)
16530
        begin
16531
          @(posedge wb_clk);
16532
          #1;
16533
        end
16534
        check_rx_bd(1, data);
16535
 
16536
        if (data[31:16] != (rx_len + 4))
16537
        begin
16538
          `TIME; $display("*E Rx Frame %0d: Wrong length of the packet written to MAC's register (%0d instead of %0d)",
16539
                          num_of_rx_frames, data[31:16], (rx_len + 4));
16540
          test_fail("Wrong length of the packet out from PHY");
16541
          fail = fail + 1;
16542
        end
16543
        // check received RX packet data and CRC
16544
        check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
16545
        if (tmp > 0)
16546
        begin
16547
          `TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
16548
          test_fail("Wrong data of the received packet");
16549
          fail = fail + 1;
16550
        end
16551
        // check WB INT signal
16552
        if (wb_int !== 1'b0)
16553
        begin
16554
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16555
          test_fail("WB INT signal should not be set");
16556
          fail = fail + 1;
16557
        end
16558
        // check RX buffer descriptor of a packet
16559
          // wait for WB master if it is working
16560
          @(posedge wb_clk);
16561
          #1;
16562
          while (wbm_working)
16563
          begin
16564
            @(posedge wb_clk);
16565
            #1;
16566
          end
16567
        check_rx_bd(1, data);
16568
        if (data[15:0] !== 16'h6080)
16569
        begin
16570
          `TIME; $display("*E Rx Frame %0d: RX buffer descriptor status is not correct: %0h", num_of_rx_frames, data[15:0]);
16571
          test_fail("RX buffer descriptor status is not correct");
16572
          fail = fail + 1;
16573
        end
16574
        // check interrupts
16575
          // wait for WB master if it is working
16576
          @(posedge wb_clk);
16577
          #1;
16578
          while (wbm_working)
16579
          begin
16580
            @(posedge wb_clk);
16581
            #1;
16582
          end
16583
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16584
 
16585
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
16586
        begin
16587
          `TIME; $display("*E Rx Frame %0d: Interrupt Receive Buffer was not set, interrupt reg: %0h",
16588
                          num_of_rx_frames, data);
16589
          test_fail("Interrupt Receive Buffer was not set");
16590
          fail = fail + 1;
16591
        end
16592
        if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
16593
        begin
16594
          `TIME; $display("*E Rx Frame %0d: Other interrupts (except Rx and Tx Buffer) were set, interrupt reg: %0h",
16595
                          num_of_rx_frames, data);
16596
          test_fail("Other interrupts (except Receive Buffer) were set");
16597
          fail = fail + 1;
16598
        end
16599
        // clear interrupts (except TXB)
16600
          // wait for WB master if it is working
16601
          @(posedge wb_clk);
16602
          #1;
16603
          while (wbm_working)
16604
          begin
16605
            @(posedge wb_clk);
16606
            #1;
16607
          end
16608
        wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16609
        // check WB INT signal
16610
        if (wb_int !== 1'b0)
16611
        begin
16612
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16613
          test_fail("WB INT signal should not be set");
16614
          fail = fail + 1;
16615
        end
16616
        // Displays
16617
        if (num_of_rx_frames[2:0] == 3'b111)
16618
        begin
16619
          `TIME; $display("   ->8 frames received");
16620
        end
16621
        // set length (loop variable)
16622
        num_of_rx_frames = num_of_rx_frames + 1;
16623
      end // RX frame loop
16624
    join
16625
    // disable TX & RX
16626
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_PAD | `ETH_MODER_CRCEN |
16627
              `ETH_MODER_IFG | `ETH_MODER_PRO | `ETH_MODER_BRO,
16628
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16629
    // set DIFFERENT mrx_clk to mtx_clk!
16630
//    eth_phy.set_mrx_equal_mtx = 1'b0;
16631
    if(fail == 0)
16632
      test_ok;
16633
    else
16634
      fail = 0;
16635
  end
16636
 
16637
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
16638
 
16639
end
16640
endtask // test_mac_full_duplex_flow_control
16641
 
16642
 
16643
task test_mac_half_duplex_flow;
16644
  input  [31:0]  start_task;
16645
  input  [31:0]  end_task;
16646
  integer        bit_start_1;
16647
  integer        bit_end_1;
16648
  integer        bit_start_2;
16649
  integer        bit_end_2;
16650
  integer        num_of_reg;
16651
  integer        num_of_frames;
16652
  integer        num_of_bd;
16653
  integer        num_of_iter;
16654
  integer        i_addr;
16655
  integer        i_data;
16656
  integer        i_length;
16657
  integer        tmp_len;
16658
  integer        tmp_bd;
16659
  integer        tmp_bd_num;
16660
  integer        tmp_data;
16661
  integer        tmp_ipgt;
16662
  integer        test_num;
16663
  reg    [31:0]  tx_bd_num;
16664
  reg    [31:0]  rx_bd_num;
16665
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
16666
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
16667
  integer        i;
16668
  integer        i1;
16669
  integer        i2;
16670
  integer        i3;
16671
  integer        fail;
16672
  integer        speed;
16673
  integer        mac_hi_addr;
16674
  integer        mac_lo_addr;
16675
  reg            frame_started;
16676
  reg            frame_ended;
16677
  reg            check_rx_frame;
16678
  reg            wait_for_tx_frame;
16679
  reg    [31:0]  addr;
16680
  reg    [31:0]  data;
16681
  reg    [31:0]  tmp;
16682
  reg    [ 7:0]  st_data;
16683
  reg    [15:0]  max_tmp;
16684
  reg    [15:0]  min_tmp;
16685
begin
16686
// MAC HALF DUPLEX FLOW TEST
16687
test_heading("MAC HALF DUPLEX FLOW TEST");
16688
$display(" ");
16689
$display("MAC HALF DUPLEX FLOW TEST");
16690
fail = 0;
16691
 
16692
// reset MAC registers
16693
hard_reset;
16694
// reset MAC and MII LOGIC with soft reset
16695
//reset_mac;
16696
//reset_mii;
16697
// set wb slave response
16698
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
16699
 
16700
  /*
16701
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
16702
  -------------------------------------------------------------------------------------
16703
  set_tx_bd
16704
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
16705
  set_tx_bd_wrap
16706
    (tx_bd_num_end[6:0]);
16707
  set_tx_bd_ready
16708
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16709
  check_tx_bd
16710
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
16711
  clear_tx_bd
16712
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16713
 
16714
  TASKS for set and control RX buffer descriptors:
16715
  ------------------------------------------------
16716
  set_rx_bd
16717
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
16718
  set_rx_bd_wrap
16719
    (rx_bd_num_end[6:0]);
16720
  set_rx_bd_empty
16721
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16722
  check_rx_bd
16723
    (rx_bd_num_end[6:0], rx_bd_status);
16724
  clear_rx_bd
16725
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16726
 
16727
  TASKS for set and check TX packets:
16728
  -----------------------------------
16729
  set_tx_packet
16730
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
16731
  check_tx_packet
16732
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
16733
 
16734
  TASKS for set and check RX packets:
16735
  -----------------------------------
16736
  set_rx_packet
16737
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
16738
  check_rx_packet
16739
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
16740
 
16741
  TASKS for append and check CRC to/of TX packet:
16742
  -----------------------------------------------
16743
  append_tx_crc
16744
    (txpnt_wb[31:0], len[15:0], negated_crc);
16745
  check_tx_crc
16746
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
16747
 
16748
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
16749
  --------------------------------------------------------------------------------
16750
  append_rx_crc
16751
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
16752
  */
16753
 
16754
//////////////////////////////////////////////////////////////////////
16755
////                                                              ////
16756
////  test_mac_half_duplex_flow:                                  ////
16757
////                                                              ////
16758
////  0: Test                                                     ////
16759
////                                                              ////
16760
//////////////////////////////////////////////////////////////////////
16761
 
16762
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
16763
begin
16764
 
16765
  ////////////////////////////////////////////////////////////////////
16766
  ////                                                            ////
16767
  ////  Test collision and late collision while transmitting and  ////
16768
  ////  receiving normal frames. Using 4 TX and RX buffer         ////
16769
  ////  decriptors ( 10Mbps ).                                    ////
16770
  ////                                                            ////
16771
  ////////////////////////////////////////////////////////////////////
16772
  if (test_num == 0) // 
16773
  begin
16774
    // TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )
16775
    //         
16776
    test_name = "TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )";
16777
    `TIME; $display("  TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )");
16778
 
16779
    // reset MAC completely
16780
    hard_reset;
16781
    // set wb slave response
16782
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
16783
 
16784
    max_tmp = 0;
16785
    min_tmp = 0;
16786
    // set 4 TX buffer descriptors (4 TX and 4 RX BDs will be used) - must be set before TX/RX enable
16787
    wait (wbm_working == 0);
16788
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16789
    // enable TX and RX, set half-duplex mode, receive small, NO correct IFG
16790
    wait (wbm_working == 0);
16791
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_RXEN | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16792
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16793
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16794
    // prepare two packets of MAXFL length for TX and RX
16795
    wait (wbm_working == 0);
16796
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16797
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
16798
    min_tmp = tmp[31:16];
16799
    st_data = 8'h17;
16800
    set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
16801
    append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
16802
    st_data = 8'h92;
16803
    set_tx_packet(`MEMORY_BASE, (min_tmp), st_data); // length without CRC
16804
    append_tx_crc (`MEMORY_BASE, (min_tmp), 1'b0);
16805
 
16806
    // check WB INT signal
16807
    if (wb_int !== 1'b0)
16808
    begin
16809
      test_fail("WB INT signal should not be set");
16810
      fail = fail + 1;
16811
    end
16812
    // unmask interrupts
16813
    wait (wbm_working == 0);
16814
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16815
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16816
 
16817
    // write to phy's control register for 10Mbps
16818
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
16819
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
16820
    speed = 10;
16821
 
16822
    // set TX and RX Buffer Descriptors 
16823
    tx_bd_num = 0; // tx BDs go from 0 to 3
16824
    rx_bd_num = 4; // rx BDs go from 4 to 7
16825
    set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
16826
    set_tx_bd_wrap(3);
16827
    set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
16828
    set_rx_bd_wrap(7);
16829
    set_rx_bd_empty(4, 7);
16830
 
16831
//    frame_ended = 0;
16832
    tmp_len = 0;
16833
    num_of_frames = 0;// 0; // 10;
16834
    num_of_iter = 0;
16835
//    num_of_bd = 0;
16836
//    i_length = 0;// (0 - 4); // 6; // 4 less due to CRC
16837
    while (num_of_frames < 80)
16838
    begin
16839
      // change COLLVALID bits in COLLCONF register
16840
      if ((num_of_frames == 0) && (num_of_iter == 0))
16841
      begin
16842
        wait (wbm_working == 0);
16843
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16844
        tmp[5:0] = 6'h00; // 6'b00_0000 ->  0 + 1 =  1 byte from preamble
16845
        wait (wbm_working == 0);
16846
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16847
        $display("    Collision window is set to 1 byte after preamble and SFD");
16848
      end
16849
      else if ((num_of_frames == 0) && (num_of_iter == 1))
16850
      begin
16851
        wait (wbm_working == 0);
16852
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16853
        tmp[5:0] = 6'h15; // 6'b01_0101 -> 21 + 1 = 22 bytes from preamble
16854
        wait (wbm_working == 0);
16855
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16856
        $display("    Collision window is set to 22 bytes after preamble and SFD");
16857
      end
16858
      else if ((num_of_frames == 0) && (num_of_iter == 2))
16859
      begin
16860
        wait (wbm_working == 0);
16861
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16862
        tmp[5:0] = 6'h2A; // 6'b10_1010 -> 42 + 1 = 43 bytes from preamble
16863
        wait (wbm_working == 0);
16864
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16865
        $display("    Collision window is set to 43 bytes after preamble and SFD");
16866
      end
16867
      else if ((num_of_frames == 0) && (num_of_iter == 3))
16868
      begin
16869
        wait (wbm_working == 0);
16870
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16871
        tmp[5:0] = 6'h3F; // 6'b11_1111 -> 63 + 1 = 64 bytes from preamble
16872
        wait (wbm_working == 0);
16873
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16874
        $display("    Collision window is set to 64 bytes after preamble and SFD");
16875
      end
16876
 
16877
 
16878
//wire          MRxDV;    // This goes to PHY
16879
//wire          MRxErr;   // This goes to PHY
16880
//wire          MColl;    // This goes to PHY
16881
//wire          MCrs;     // This goes to PHY
16882
//wire          MTxEn;
16883
//wire          MTxErr;
16884
      // CHECK END OF RECEIVE WHILE TRANSMITTING
16885
      frame_ended = 0;
16886
      check_rx_frame = 0;
16887
      fork
16888
        // send frames
16889
        begin // start with RX frame
16890
          repeat(num_of_frames) @(posedge mrx_clk);
16891
          #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (min_tmp + 4), 1'b0);
16892
          repeat(10) @(posedge mrx_clk);
16893
        end
16894
        begin // start with TX frame 
16895
          repeat(2) @(posedge mrx_clk);
16896
          repeat(2) @(posedge wb_clk);
16897
          #1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
16898
        end
16899
        // observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
16900
        begin
16901
          wait (MCrs || MTxEn);
16902
          #1;
16903
          if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
16904
            wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
16905
          else
16906
          begin
16907
            i = 0;
16908
            while (MColl == 1'b0) // wait for Collision to occure
16909
            begin
16910
              repeat(2) @(posedge mtx_clk); // counting bytes
16911
              #1 i = i + 1'b1;
16912
            end
16913
            i = i - 8; // subtract preamble and SFD (bytes) - Late Collision is measured from SFD!
16914
            tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
16915
            //wait (MTxEn == 1'b0); // wait for TX frame to end
16916
            repeat(10) @(posedge mrx_clk);
16917
            repeat(8) @(posedge wb_clk);
16918
            #1 check_tx_bd(tx_bd_num, data);
16919
            if (data[15] === 0) // if transmit is aborted, then it was Late Collision
16920
            begin
16921
              wait_for_tx_frame = 1'b0; // don't wait for retransmission of TX frame
16922
              $display("    ->Late Collision occured on %0d. byte after frame and SFD", i);
16923
            end
16924
            else
16925
              wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
16926
          end
16927
        end
16928
        // check if RX frame is accepted
16929
        begin
16930
          wait (MRxDV === 1'b1); // start receive
16931
          wait (MRxDV === 1'b0); // end receive
16932
          repeat(10) @(posedge mrx_clk);
16933
          repeat(8) @(posedge wb_clk);
16934
          #1 check_rx_bd(rx_bd_num, data);
16935
          if (data[15] === 0)
16936
          begin
16937
            check_rx_frame = 1'b1; // RX frame accepted and must be checked
16938
            if ((i + 8) == 0) // add preamble and SFD length (bytes)
16939
              $display("    ->RX frame, which started before or at beginning of TX frame, was accepted");
16940
            else
16941
              $display("    ->RX frame, which started %0d byte(s) after beginning of TX frame, was accepted", (i + 8));
16942
          end
16943
          else
16944
            check_rx_frame = 1'b0; // RX frame rejected
16945
          repeat(1) @(posedge wb_clk);
16946
        end
16947
      join
16948
 
16949
 
16950
 
16951
      // check length of a PACKET
16952
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
16953
           ((data[31:16] != 0) && (num_of_frames < 3)) )
16954
      begin
16955
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
16956
                        data[31:16], (i_length + 4));
16957
        test_fail("Wrong length of the packet out from PHY");
16958
        fail = fail + 1;
16959
      end
16960
      // check received RX packet data and CRC
16961
//if ((num_of_frames == 5))
16962
//begin                                           // CRC has 4 bytes for itself
16963
//  if (i_length[0] == 1'b1)
16964
//  begin
16965
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
16966
//  end
16967
//  else
16968
//  begin
16969
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
16970
//  end
16971
//  if (tmp > 0)
16972
//  begin
16973
//    `TIME; $display("*E Wrong data of the received packet");
16974
//    test_fail("Wrong data of the received packet");
16975
//    fail = fail + 1;
16976
//  end
16977
//end
16978
//else
16979
//if ((num_of_frames == 10))
16980
//begin                                           // CRC has 4 bytes for itself
16981
//  if (i_length[0] == 1'b1)
16982
//  begin
16983
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
16984
//  end
16985
//  else
16986
//  begin
16987
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
16988
//  end
16989
//  if (tmp > 0)
16990
//  begin
16991
//    `TIME; $display("*E Wrong data of the received packet");
16992
//    test_fail("Wrong data of the received packet");
16993
//    fail = fail + 1;
16994
//  end
16995
//end
16996
//else
16997
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
16998
      begin                                           // CRC has 4 bytes for itself
16999
        if (i_length[0] == 1'b0)
17000
        begin
17001
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17002
        end
17003
        else
17004
        begin
17005
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17006
        end
17007
        if (tmp > 0)
17008
        begin
17009
          `TIME; $display("*E Wrong data of the received packet");
17010
          test_fail("Wrong data of the received packet");
17011
          fail = fail + 1;
17012
        end
17013
      end
17014
 
17015
      // check WB INT signal
17016
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
17017
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
17018
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
17019
        begin
17020
          `TIME; $display("*E WB INT signal should be set");
17021
          test_fail("WB INT signal should be set");
17022
          fail = fail + 1;
17023
        end
17024
      end
17025
      else
17026
      begin
17027
        if (wb_int !== 1'b0)
17028
        begin
17029
          `TIME; $display("*E WB INT signal should not be set");
17030
          test_fail("WB INT signal should not be set");
17031
          fail = fail + 1;
17032
        end
17033
      end
17034
 
17035
      // check RX buffer descriptor of a packet
17036
      if (num_of_frames >= min_tmp)
17037
      begin
17038
        if ( (data[15:0] !== 16'h6000) && // wrap bit
17039
             (data[15:0] !== 16'h4000) ) // without wrap bit
17040
        begin
17041
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17042
          test_fail("RX buffer descriptor status is not correct");
17043
          fail = fail + 1;
17044
        end
17045
      end
17046
      else if (num_of_frames > 4)
17047
      begin
17048
        if ( (data[15:0] !== 16'h6004) && // wrap bit
17049
             (data[15:0] !== 16'h4004) ) // without wrap bit
17050
        begin
17051
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17052
          test_fail("RX buffer descriptor status is not correct");
17053
          fail = fail + 1;
17054
        end
17055
      end
17056
      else if (num_of_frames > 2)
17057
      begin
17058
        if ( (data[15:0] !== 16'h6006) && // wrap bit
17059
             (data[15:0] !== 16'h4006) ) // without wrap bit
17060
        begin
17061
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17062
          test_fail("RX buffer descriptor status is not correct");
17063
          fail = fail + 1;
17064
        end
17065
      end
17066
      else
17067
      begin
17068
        if (data[15] !== 1'b1)
17069
        begin
17070
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17071
          test_fail("RX buffer descriptor status is not correct");
17072
          fail = fail + 1;
17073
        end
17074
      end
17075
      // check interrupts
17076
      wait (wbm_working == 0);
17077
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17078
      if (num_of_frames >= 5)
17079
      begin
17080
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17081
        begin
17082
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17083
          test_fail("Interrupt Receive Buffer was not set");
17084
          fail = fail + 1;
17085
        end
17086
        if ((data & (~`ETH_INT_RXB)) !== 0)
17087
        begin
17088
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17089
          test_fail("Other interrupts (except Receive Buffer) were set");
17090
          fail = fail + 1;
17091
        end
17092
      end
17093
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
17094
      begin
17095
        if (data) // Checking if any interrupt is pending)
17096
        begin
17097
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
17098
          test_fail("Interrupts were set");
17099
          fail = fail + 1;
17100
        end
17101
      end
17102
      else
17103
      begin
17104
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
17105
        begin
17106
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
17107
          test_fail("Interrupt Receive Buffer Error was not set");
17108
          fail = fail + 1;
17109
        end
17110
        if ((data & (~`ETH_INT_RXE)) !== 0)
17111
        begin
17112
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
17113
          test_fail("Other interrupts (except Receive Buffer Error) were set");
17114
          fail = fail + 1;
17115
        end
17116
      end
17117
      // clear interrupts
17118
      wait (wbm_working == 0);
17119
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17120
      // check WB INT signal
17121
      if (wb_int !== 1'b0)
17122
      begin
17123
        test_fail("WB INT signal should not be set");
17124
        fail = fail + 1;
17125
      end
17126
      // INTERMEDIATE DISPLAYS
17127
      if (num_of_frames == 3)
17128
      begin
17129
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17130
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
17131
                 0, 3);
17132
      end
17133
      else if (num_of_frames == 9)
17134
      begin
17135
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17136
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
17137
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17138
                 5, 9);
17139
      end
17140
      else if (num_of_frames == 17)
17141
      begin
17142
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
17143
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17144
                 10, 17);
17145
      end
17146
      else if (num_of_frames == 27)
17147
      begin
17148
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
17149
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17150
                 18, 27);
17151
      end
17152
      else if (num_of_frames == 40)
17153
      begin
17154
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
17155
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17156
                 28, 40);
17157
      end
17158
      else if (num_of_frames == 54)
17159
      begin
17160
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
17161
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17162
                 41, 54);
17163
      end
17164
      else if (num_of_frames == 69)
17165
      begin
17166
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17167
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17168
                 55, 69);
17169
      end
17170
      else if (num_of_frames == 69)
17171
      begin
17172
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17173
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17174
                 55, 69);
17175
      end
17176
      else if (num_of_frames == 77)
17177
      begin
17178
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17179
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17180
                 70, 77);
17181
      end
17182
      // set length (loop variable)
17183
      i_length = i_length + 1;
17184
      // the number of frame transmitted
17185
      num_of_frames = num_of_frames + 1;
17186
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
17187
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
17188
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
17189
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
17190
        num_of_bd = 120;
17191
      else
17192
        num_of_bd = num_of_bd + 1;
17193
    end
17194 260 mohor
    // disable RX
17195 274 tadejm
    wait (wbm_working == 0);
17196
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
17197
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17198
    @(posedge wb_clk);
17199
    if(fail == 0)
17200
      test_ok;
17201
    else
17202
      fail = 0;
17203
  end
17204
 
17205
 
17206
  ////////////////////////////////////////////////////////////////////
17207
  ////                                                            ////
17208
  ////  Receive control frames with PASSALL option turned off     ////
17209
  ////  Using only one RX buffer decriptor ( 10Mbps ).            ////
17210
  ////                                                            ////
17211
  ////////////////////////////////////////////////////////////////////
17212
  if (test_num == 1) // 
17213
  begin
17214
    // TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
17215
    test_name   = "TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
17216
    `TIME; $display("  TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
17217
 
17218
    // unmask interrupts
17219
    wait (wbm_working == 0);
17220
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17221
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17222
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
17223
    wait (wbm_working == 0);
17224
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17225
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
17226
    wait (wbm_working == 0);
17227
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17228
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17229
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17230
    // prepare one control (PAUSE)packet
17231
    st_data = 8'h00;
17232
    set_rx_packet(0, 60, 1'b0, 48'h0180_c200_0001, 48'h0708_090A_0B0C, 16'h8808, st_data); // length without CRC
17233
    // prepare one packet of 100 bytes long
17234
    st_data = 8'h1A;
17235
    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
17236
    // check WB INT signal
17237
    if (wb_int !== 1'b0)
17238
    begin
17239
      test_fail("WB INT signal should not be set");
17240
      fail = fail + 1;
17241
    end
17242
 
17243
    // write to phy's control register for 10Mbps
17244
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
17245
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
17246
    speed = 10;
17247
 
17248
    for (i=0; i<4; i=i+1)
17249
    begin
17250
      // choose generating carrier sense and collision for first and last 64 lengths of frames
17251
      case (i)
17252
      0: // Interrupt is generated
17253
      begin
17254
        // enable interrupt generation
17255
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i));
17256
        // unmask interrupts
17257
        wait (wbm_working == 0);
17258
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17259
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17260
        // not detect carrier sense in FD and no collision
17261
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17262
        eth_phy.collision(0);
17263
      end
17264
      1: // Interrupt is not generated
17265
      begin
17266
        // enable interrupt generation
17267
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i) + 64));
17268
        // mask interrupts
17269
        wait (wbm_working == 0);
17270
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17271
        // detect carrier sense in FD and no collision
17272
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17273
        eth_phy.collision(0);
17274
      end
17275
      2: // Interrupt is not generated
17276
      begin
17277
        // disable interrupt generation
17278
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i));
17279
        // unmask interrupts
17280
        wait (wbm_working == 0);
17281
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17282
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17283
        // not detect carrier sense in FD and set collision
17284
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17285
        eth_phy.collision(1);
17286
      end
17287
      default: // 3: // Interrupt is not generated
17288
      begin
17289
        // disable interrupt generation
17290
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i) + 64));
17291
        // mask interrupts
17292
        wait (wbm_working == 0);
17293
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17294
        // detect carrier sense in FD and set collision
17295
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17296
        eth_phy.collision(1);
17297
      end
17298
      endcase
17299
 
17300
      append_rx_crc (64, 100, 1'b0, 1'b0); // To the second (data) packet
17301
      // set wrap bit
17302
      set_rx_bd_wrap(127);
17303
      set_rx_bd_empty(127, 127);
17304
      fork
17305
        begin
17306
          if (i[0] == 1'b0)
17307
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
17308
          else
17309
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 64, 104, 1'b0);
17310
          repeat(10) @(posedge mrx_clk);
17311
$display("1111");
17312
        end
17313
        begin
17314
          #1 check_rx_bd(127, data);
17315
$display("aaaa");
17316
          wait (MRxDV === 1'b1); // start transmit
17317
$display("bbbb");
17318
          #1 check_rx_bd(127, data);
17319
          if (data[15] !== 1)
17320
          begin
17321
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
17322
            fail = fail + 1;
17323
          end
17324
          wait (MRxDV === 1'b0); // end transmit
17325
$display("cccc");
17326
          while (data[15] === 1)
17327
          begin
17328
            #1 check_rx_bd(127, data);
17329
            @(posedge wb_clk);
17330
          end
17331
          repeat (1) @(posedge wb_clk);
17332
$display("2222");
17333
        end
17334
      join
17335
$display("dddd");
17336
      // check length of a PACKET
17337
      if (data[31:16] != (i_length + 4))
17338
      begin
17339
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
17340
                        data[31:16], (i_length + 4));
17341
        test_fail("Wrong length of the packet out from PHY");
17342
        fail = fail + 1;
17343
      end
17344
      // checking in the following if statement is performed only for first and last 64 lengths
17345
      // check received RX packet data and CRC
17346
      if (i_length[0] == 1'b0)
17347
      begin
17348
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17349
      end
17350
      else
17351
      begin
17352
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17353
      end
17354
      if (tmp > 0)
17355
      begin
17356
        `TIME; $display("*E Wrong data of the received packet");
17357
        test_fail("Wrong data of the received packet");
17358
        fail = fail + 1;
17359
      end
17360
      // check WB INT signal
17361
      if (i_length[1:0] == 2'h0)
17362
      begin
17363
        if (wb_int !== 1'b1)
17364
        begin
17365
          `TIME; $display("*E WB INT signal should be set");
17366
          test_fail("WB INT signal should be set");
17367
          fail = fail + 1;
17368
        end
17369
      end
17370
      else
17371
      begin
17372
        if (wb_int !== 1'b0)
17373
        begin
17374
          `TIME; $display("*E WB INT signal should not be set");
17375
          test_fail("WB INT signal should not be set");
17376
          fail = fail + 1;
17377
        end
17378
      end
17379
      // check RX buffer descriptor of a packet
17380
      check_rx_bd(127, data);
17381
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
17382
      begin
17383
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
17384
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
17385
        begin
17386
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17387
          test_fail("RX buffer descriptor status is not correct");
17388
          fail = fail + 1;
17389
        end
17390
      end
17391
      else // interrupt not enabled
17392
      begin
17393
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
17394
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
17395
        begin
17396
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17397
          test_fail("RX buffer descriptor status is not correct");
17398
          fail = fail + 1;
17399
        end
17400
      end
17401
      // clear RX buffer descriptor for first 4 frames
17402
      if (i_length < min_tmp)
17403
        clear_rx_bd(127, 127);
17404
      // check interrupts
17405
      wait (wbm_working == 0);
17406
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17407
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
17408
      begin
17409
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17410
        begin
17411
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17412
          test_fail("Interrupt Receive Buffer was not set");
17413
          fail = fail + 1;
17414
        end
17415
        if ((data & (~`ETH_INT_RXB)) !== 0)
17416
        begin
17417
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17418
          test_fail("Other interrupts (except Receive Buffer) were set");
17419
          fail = fail + 1;
17420
        end
17421
      end
17422
      else
17423
      begin
17424
        if (data !== 0)
17425
        begin
17426
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
17427
          test_fail("Any of interrupts (except Receive Buffer) was set");
17428
          fail = fail + 1;
17429
        end
17430
      end
17431
      // clear interrupts
17432
      wait (wbm_working == 0);
17433
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17434
      // check WB INT signal
17435
      if (wb_int !== 1'b0)
17436
      begin
17437
        test_fail("WB INT signal should not be set");
17438
        fail = fail + 1;
17439
      end
17440
      // INTERMEDIATE DISPLAYS
17441
      if ((i_length + 4) == (min_tmp + 64))
17442
      begin
17443
        // starting length is min_tmp, ending length is (min_tmp + 64)
17444
        $display("    receive small packets is NOT selected");
17445
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
17446
                 min_tmp, (min_tmp + 64));
17447
        // set receive small, remain the rest
17448
        wait (wbm_working == 0);
17449
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17450
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17451
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17452
      end
17453
      else if ((i_length + 4) == (max_tmp - 16))
17454
      begin
17455
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
17456
        $display("    receive small packets is selected");
17457
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
17458
                 (min_tmp + 64 + 128), tmp_data);
17459
        // reset receive small, remain the rest
17460
        wait (wbm_working == 0);
17461
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17462
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17463
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17464
      end
17465
      else if ((i_length + 4) == max_tmp)
17466
      begin
17467
        $display("    receive small packets is NOT selected");
17468
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
17469
                 (max_tmp - (4 + 16)), max_tmp);
17470
      end
17471
      // set length (loop variable)
17472
      if ((i_length + 4) < (min_tmp + 64))
17473
        i_length = i_length + 1;
17474
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
17475
      begin
17476
        i_length = i_length + 128;
17477
        tmp_data = i_length + 4; // last tmp_data is ending length
17478
      end
17479
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
17480
        i_length = max_tmp - (4 + 16);
17481
      else if ((i_length + 4) >= (max_tmp - 16))
17482
        i_length = i_length + 1;
17483
      else
17484
      begin
17485
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
17486
        #10 $stop;
17487
      end
17488
    end
17489
    // disable RX
17490
    wait (wbm_working == 0);
17491 260 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17492
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17493 254 mohor
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17494
    if(fail == 0)
17495
      test_ok;
17496
    else
17497
      fail = 0;
17498 209 tadejm
  end
17499
 
17500
 
17501
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
17502
 
17503 260 mohor
 
17504 209 tadejm
end
17505 274 tadejm
endtask // test_mac_half_duplex_flow
17506 209 tadejm
 
17507
 
17508 169 mohor
//////////////////////////////////////////////////////////////
17509
// WB Behavioral Models Basic tasks
17510
//////////////////////////////////////////////////////////////
17511
 
17512
task wbm_write;
17513
  input  [31:0] address_i;
17514
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
17515
  input  [3:0]  sel_i;
17516
  input  [31:0] size_i;
17517
  input  [3:0]  init_waits_i;
17518
  input  [3:0]  subseq_waits_i;
17519
 
17520
  reg `WRITE_STIM_TYPE write_data;
17521
  reg `WB_TRANSFER_FLAGS flags;
17522
  reg `WRITE_RETURN_TYPE write_status;
17523
  integer i;
17524
begin
17525 274 tadejm
  wbm_working = 1;
17526
 
17527 169 mohor
  write_status = 0;
17528
 
17529
  flags                    = 0;
17530
  flags`WB_TRANSFER_SIZE   = size_i;
17531
  flags`INIT_WAITS         = init_waits_i;
17532
  flags`SUBSEQ_WAITS       = subseq_waits_i;
17533
 
17534
  write_data               = 0;
17535
  write_data`WRITE_DATA    = data_i[31:0];
17536
  write_data`WRITE_ADDRESS = address_i;
17537
  write_data`WRITE_SEL     = sel_i;
17538
 
17539
  for (i = 0; i < size_i; i = i + 1)
17540
  begin
17541
    wb_master.blk_write_data[i] = write_data;
17542
    data_i                      = data_i >> 32;
17543
    write_data`WRITE_DATA       = data_i[31:0];
17544
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
17545 116 mohor
  end
17546
 
17547 169 mohor
  wb_master.wb_block_write(flags, write_status);
17548 116 mohor
 
17549 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
17550
  begin
17551
    `TIME;
17552
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
17553
  end
17554 274 tadejm
 
17555
  @(posedge wb_clk);
17556
  #3;
17557
  wbm_working = 0;
17558
  #1;
17559 169 mohor
end
17560
endtask // wbm_write
17561 116 mohor
 
17562 169 mohor
task wbm_read;
17563
  input  [31:0] address_i;
17564
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
17565
  input  [3:0]  sel_i;
17566
  input  [31:0] size_i;
17567
  input  [3:0]  init_waits_i;
17568
  input  [3:0]  subseq_waits_i;
17569
 
17570
  reg `READ_RETURN_TYPE read_data;
17571
  reg `WB_TRANSFER_FLAGS flags;
17572
  reg `READ_RETURN_TYPE read_status;
17573
  integer i;
17574
begin
17575 274 tadejm
  wbm_working = 1;
17576
 
17577 169 mohor
  read_status = 0;
17578
  data_o      = 0;
17579
 
17580
  flags                  = 0;
17581
  flags`WB_TRANSFER_SIZE = size_i;
17582
  flags`INIT_WAITS       = init_waits_i;
17583
  flags`SUBSEQ_WAITS     = subseq_waits_i;
17584
 
17585
  read_data              = 0;
17586
  read_data`READ_ADDRESS = address_i;
17587
  read_data`READ_SEL     = sel_i;
17588
 
17589
  for (i = 0; i < size_i; i = i + 1)
17590 116 mohor
  begin
17591 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
17592
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
17593
  end
17594
 
17595
  wb_master.wb_block_read(flags, read_status);
17596
 
17597
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
17598
  begin
17599
    `TIME;
17600
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
17601
  end
17602
 
17603
  for (i = 0; i < size_i; i = i + 1)
17604
  begin
17605
    data_o       = data_o << 32;
17606
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
17607
    data_o[31:0] = read_data`READ_DATA;
17608
  end
17609 274 tadejm
 
17610
  @(posedge wb_clk);
17611
  #3;
17612
  wbm_working = 0;
17613
  #1;
17614 169 mohor
end
17615
endtask // wbm_read
17616
 
17617
 
17618
//////////////////////////////////////////////////////////////
17619
// Ethernet Basic tasks
17620
//////////////////////////////////////////////////////////////
17621
 
17622
task hard_reset; //  MAC registers
17623
begin
17624
  // reset MAC registers
17625
  @(posedge wb_clk);
17626
  #2 wb_rst = 1'b1;
17627
  repeat(2) @(posedge wb_clk);
17628
  #2 wb_rst = 1'b0;
17629
end
17630
endtask // hard_reset
17631
 
17632
task reset_mac; //  MAC module
17633
  reg [31:0] tmp;
17634
  reg [31:0] tmp_no_rst;
17635
begin
17636
  // read MODER register first
17637
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17638
  // set reset bit - write back to MODER register with RESET bit
17639
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17640
  // clear reset bit - write back to MODER register without RESET bit
17641
  tmp_no_rst = `ETH_MODER_RST;
17642
  tmp_no_rst = ~tmp_no_rst;
17643
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17644
end
17645
endtask // reset_mac
17646
 
17647
task set_tx_bd;
17648
  input  [6:0]  tx_bd_num_start;
17649
  input  [6:0]  tx_bd_num_end;
17650
  input  [15:0] len;
17651
  input         irq;
17652
  input         pad;
17653
  input         crc;
17654
  input  [31:0] txpnt;
17655
 
17656
  integer       i;
17657
  integer       bd_status_addr, bd_ptr_addr;
17658
//  integer       buf_addr;
17659
begin
17660
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
17661
  begin
17662
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
17663
    bd_status_addr = `TX_BD_BASE + i * 8;
17664
    bd_ptr_addr = bd_status_addr + 4;
17665
    // initialize BD - status
17666
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
17667
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17668
    // initialize BD - pointer
17669
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17670
  end
17671
end
17672
endtask // set_tx_bd
17673
 
17674
task set_tx_bd_wrap;
17675
  input  [6:0]  tx_bd_num_end;
17676
  integer       bd_status_addr, tmp;
17677
begin
17678
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17679
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17680
  // set wrap bit to this BD - this BD should be last-one
17681
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17682
end
17683
endtask // set_tx_bd_wrap
17684
 
17685
task set_tx_bd_ready;
17686
  input  [6:0]  tx_nd_num_strat;
17687
  input  [6:0]  tx_bd_num_end;
17688
  integer       i;
17689
  integer       bd_status_addr, tmp;
17690
begin
17691
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17692
  begin
17693
    bd_status_addr = `TX_BD_BASE + i * 8;
17694
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17695
    // set empty bit to this BD - this BD should be ready
17696
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17697
  end
17698
end
17699
endtask // set_tx_bd_ready
17700
 
17701
task check_tx_bd;
17702
  input  [6:0]  tx_bd_num_end;
17703
  output [31:0] tx_bd_status;
17704
  integer       bd_status_addr, tmp;
17705
begin
17706
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17707
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17708 274 tadejm
  tx_bd_status = tmp;
17709 169 mohor
end
17710
endtask // check_tx_bd
17711
 
17712
task clear_tx_bd;
17713
  input  [6:0]  tx_nd_num_strat;
17714
  input  [6:0]  tx_bd_num_end;
17715
  integer       i;
17716
  integer       bd_status_addr, bd_ptr_addr;
17717
begin
17718
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17719
  begin
17720
    bd_status_addr = `TX_BD_BASE + i * 8;
17721
    bd_ptr_addr = bd_status_addr + 4;
17722
    // clear BD - status
17723
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17724
    // clear BD - pointer
17725
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17726
  end
17727
end
17728
endtask // clear_tx_bd
17729
 
17730
task set_rx_bd;
17731
  input  [6:0]  rx_bd_num_strat;
17732
  input  [6:0]  rx_bd_num_end;
17733
  input         irq;
17734
  input  [31:0] rxpnt;
17735
//  input  [6:0]  rxbd_num;
17736
  integer       i;
17737
  integer       bd_status_addr, bd_ptr_addr;
17738
//  integer       buf_addr;
17739
begin
17740
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17741
  begin
17742
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
17743 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17744
//    bd_ptr_addr = bd_status_addr + 4; 
17745
    bd_status_addr = `TX_BD_BASE + i * 8;
17746
    bd_ptr_addr = bd_status_addr + 4;
17747 116 mohor
 
17748 169 mohor
    // initialize BD - status
17749
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17750
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
17751
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17752
    // initialize BD - pointer
17753
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17754
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17755
  end
17756
end
17757
endtask // set_rx_bd
17758 116 mohor
 
17759 169 mohor
task set_rx_bd_wrap;
17760
  input  [6:0]  rx_bd_num_end;
17761
  integer       bd_status_addr, tmp;
17762
begin
17763 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
17764
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
17765 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17766
  // set wrap bit to this BD - this BD should be last-one
17767
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17768
end
17769
endtask // set_rx_bd_wrap
17770 116 mohor
 
17771 169 mohor
task set_rx_bd_empty;
17772
  input  [6:0]  rx_bd_num_strat;
17773
  input  [6:0]  rx_bd_num_end;
17774
  integer       i;
17775
  integer       bd_status_addr, tmp;
17776
begin
17777
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17778
  begin
17779 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17780
    bd_status_addr = `TX_BD_BASE + i * 8;
17781 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17782
    // set empty bit to this BD - this BD should be ready
17783
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17784 116 mohor
  end
17785 169 mohor
end
17786
endtask // set_rx_bd_empty
17787 116 mohor
 
17788 169 mohor
task check_rx_bd;
17789
  input  [6:0]  rx_bd_num_end;
17790
  output [31:0] rx_bd_status;
17791
  integer       bd_status_addr, tmp;
17792
begin
17793 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
17794
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
17795 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17796 274 tadejm
  rx_bd_status = tmp;
17797 169 mohor
end
17798
endtask // check_rx_bd
17799 116 mohor
 
17800 169 mohor
task clear_rx_bd;
17801
  input  [6:0]  rx_bd_num_strat;
17802
  input  [6:0]  rx_bd_num_end;
17803
  integer       i;
17804
  integer       bd_status_addr, bd_ptr_addr;
17805
begin
17806
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17807
  begin
17808 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17809
    bd_status_addr = `TX_BD_BASE + i * 8;
17810 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
17811
    // clear BD - status
17812
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17813
    // clear BD - pointer
17814
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17815
  end
17816
end
17817
endtask // clear_rx_bd
17818 116 mohor
 
17819 169 mohor
task set_tx_packet;
17820
  input  [31:0] txpnt;
17821
  input  [15:0] len;
17822
  input  [7:0]  eth_start_data;
17823
  integer       i, sd;
17824
  integer       buffer;
17825
  reg           delta_t;
17826
begin
17827
  buffer = txpnt;
17828
  sd = eth_start_data;
17829
  delta_t = 0;
17830 116 mohor
 
17831 169 mohor
  // First write might not be word allign.
17832
  if(buffer[1:0] == 1)
17833
  begin
17834
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
17835
    sd = sd + 3;
17836
    i = 3;
17837
  end
17838
  else if(buffer[1:0] == 2)
17839
  begin
17840
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
17841
    sd = sd + 2;
17842
    i = 2;
17843
  end
17844
  else if(buffer[1:0] == 3)
17845
  begin
17846
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
17847
    sd = sd + 1;
17848
    i = 1;
17849
  end
17850
  else
17851
    i = 0;
17852
  delta_t = !delta_t;
17853 116 mohor
 
17854 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
17855
  begin
17856
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2, sd[7:0] + 3'h3}, 4'hF);
17857
    sd = sd + 4;
17858
  end
17859
  delta_t = !delta_t;
17860
 
17861
  // Last word
17862
  if((len - i) == 3)
17863 116 mohor
  begin
17864 169 mohor
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2, 8'h0}, 4'hE);
17865
  end
17866
  else if((len - i) == 2)
17867
  begin
17868
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
17869
  end
17870
  else if((len - i) == 1)
17871
  begin
17872
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
17873
  end
17874
  else if((len - i) == 4)
17875
  begin
17876
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2, sd[7:0] + 3'h3}, 4'hF);
17877
  end
17878
  else
17879
    $display("(%0t)(%m) ERROR", $time);
17880
  delta_t = !delta_t;
17881
end
17882
endtask // set_tx_packet
17883
 
17884
task check_tx_packet;
17885
  input  [31:0] txpnt_wb;  // source
17886
  input  [31:0] txpnt_phy; // destination
17887
  input  [15:0] len;
17888
  output [31:0] failure;
17889
  integer       i, data_wb, data_phy;
17890
  reg    [31:0] addr_wb, addr_phy;
17891
  reg    [31:0] failure;
17892
  reg           delta_t;
17893
begin
17894
  addr_wb = txpnt_wb;
17895
  addr_phy = txpnt_phy;
17896
  delta_t = 0;
17897
  failure = 0;
17898 209 tadejm
  #1;
17899 169 mohor
  // First write might not be word allign.
17900
  if(addr_wb[1:0] == 1)
17901
  begin
17902
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
17903
    data_phy[31:24] = 0;
17904
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
17905
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
17906
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
17907
    i = 3;
17908
    if (data_phy[23:0] !== data_wb[23:0])
17909
    begin
17910
      `TIME;
17911 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
17912
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17913 169 mohor
      failure = 1;
17914
    end
17915
  end
17916
  else if (addr_wb[1:0] == 2)
17917
  begin
17918
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
17919
    data_phy[31:16] = 0;
17920
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
17921
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
17922
    i = 2;
17923
    if (data_phy[15:0] !== data_wb[15:0])
17924
    begin
17925
      `TIME;
17926 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
17927
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17928 169 mohor
      failure = 1;
17929
    end
17930
  end
17931
  else if (addr_wb[1:0] == 3)
17932
  begin
17933
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
17934
    data_phy[31: 8] = 0;
17935
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
17936
    i = 1;
17937
    if (data_phy[7:0] !== data_wb[7:0])
17938
    begin
17939
      `TIME;
17940 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
17941
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17942 169 mohor
      failure = 1;
17943
    end
17944
  end
17945
  else
17946
    i = 0;
17947
  delta_t = !delta_t;
17948 209 tadejm
  #1;
17949 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
17950
  begin
17951
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
17952
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17953
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17954
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
17955
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
17956 279 mohor
 
17957 169 mohor
    if (data_phy[31:0] !== data_wb[31:0])
17958
    begin
17959
      `TIME;
17960 209 tadejm
      $display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
17961
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17962 169 mohor
      failure = failure + 1;
17963
    end
17964
  end
17965
  delta_t = !delta_t;
17966 209 tadejm
  #1;
17967 169 mohor
  // Last word
17968
  if((len - i) == 3)
17969
  begin
17970
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
17971
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17972
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17973
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
17974
    data_phy[ 7: 0] = 0;
17975
    if (data_phy[31:8] !== data_wb[31:8])
17976
    begin
17977
      `TIME;
17978 209 tadejm
      $display("*E Wrong %d. word (3 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
17979
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17980 169 mohor
      failure = failure + 1;
17981
    end
17982
  end
17983
  else if((len - i) == 2)
17984
  begin
17985
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
17986
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17987
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17988
    data_phy[15: 8] = 0;
17989
    data_phy[ 7: 0] = 0;
17990
    if (data_phy[31:16] !== data_wb[31:16])
17991
    begin
17992
      `TIME;
17993 209 tadejm
      $display("*E Wrong %d. word (2 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
17994
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17995 169 mohor
      failure = failure + 1;
17996
    end
17997
  end
17998
  else if((len - i) == 1)
17999
  begin
18000
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
18001
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18002
    data_phy[23:16] = 0;
18003
    data_phy[15: 8] = 0;
18004
    data_phy[ 7: 0] = 0;
18005
    if (data_phy[31:24] !== data_wb[31:24])
18006
    begin
18007
      `TIME;
18008 209 tadejm
      $display("*E Wrong %d. word (1 byte) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
18009
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18010 169 mohor
      failure = failure + 1;
18011
    end
18012
  end
18013
  else if((len - i) == 4)
18014
  begin
18015
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18016
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18017
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18018
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
18019
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
18020
    if (data_phy[31:0] !== data_wb[31:0])
18021
    begin
18022
      `TIME;
18023 209 tadejm
      $display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
18024
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18025 169 mohor
      failure = failure + 1;
18026
    end
18027
  end
18028
  else
18029
    $display("(%0t)(%m) ERROR", $time);
18030
  delta_t = !delta_t;
18031
end
18032
endtask // check_tx_packet
18033
 
18034
task set_rx_packet;
18035
  input  [31:0] rxpnt;
18036
  input  [15:0] len;
18037
  input         plus_dribble_nibble; // if length is longer for one nibble
18038
  input  [47:0] eth_dest_addr;
18039
  input  [47:0] eth_source_addr;
18040
  input  [15:0] eth_type_len;
18041
  input  [7:0]  eth_start_data;
18042
  integer       i, sd;
18043
  reg    [47:0] dest_addr;
18044
  reg    [47:0] source_addr;
18045
  reg    [15:0] type_len;
18046
  reg    [21:0] buffer;
18047
  reg           delta_t;
18048
begin
18049
  buffer = rxpnt[21:0];
18050
  dest_addr = eth_dest_addr;
18051
  source_addr = eth_source_addr;
18052
  type_len = eth_type_len;
18053
  sd = eth_start_data;
18054
  delta_t = 0;
18055
  for(i = 0; i < len; i = i + 1)
18056
  begin
18057
    if (i < 6)
18058
    begin
18059
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18060
      dest_addr = dest_addr << 8;
18061
    end
18062
    else if (i < 12)
18063
    begin
18064
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18065
      source_addr = source_addr << 8;
18066
    end
18067
    else if (i < 14)
18068
    begin
18069
      eth_phy.rx_mem[buffer] = type_len[15:8];
18070
      type_len = type_len << 8;
18071
    end
18072
    else
18073
    begin
18074
      eth_phy.rx_mem[buffer] = sd[7:0];
18075
      sd = sd + 1;
18076
    end
18077
    buffer = buffer + 1;
18078
  end
18079
  delta_t = !delta_t;
18080
  if (plus_dribble_nibble)
18081
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
18082
  delta_t = !delta_t;
18083
end
18084
endtask // set_rx_packet
18085
 
18086 267 mohor
task set_rx_control_packet;
18087
  input  [31:0] rxpnt;
18088
  input  [15:0] PauseTV;
18089
  integer       i;
18090
  reg    [47:0] dest_addr;
18091
  reg    [47:0] source_addr;
18092
  reg    [15:0] type_len;
18093
  reg    [21:0] buffer;
18094
  reg           delta_t;
18095
  reg    [15:0] PTV;
18096
  reg    [15:0] opcode;
18097
begin
18098
  buffer = rxpnt[21:0];
18099
  dest_addr = 48'h0180_c200_0001;
18100
  source_addr = 48'h0708_090A_0B0C;
18101
  type_len = 16'h8808;
18102
  opcode = 16'h0001;
18103
  PTV = PauseTV;
18104
  delta_t = 0;
18105
  for(i = 0; i < 60; i = i + 1)
18106
  begin
18107
    if (i < 6)
18108
    begin
18109
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18110
      dest_addr = dest_addr << 8;
18111
    end
18112
    else if (i < 12)
18113
    begin
18114
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18115
      source_addr = source_addr << 8;
18116
    end
18117
    else if (i < 14)
18118
    begin
18119
      eth_phy.rx_mem[buffer] = type_len[15:8];
18120
      type_len = type_len << 8;
18121
    end
18122
    else if (i < 16)
18123
    begin
18124
      eth_phy.rx_mem[buffer] = opcode[15:8];
18125
      opcode = opcode << 8;
18126
    end
18127
    else if (i < 18)
18128
    begin
18129
      eth_phy.rx_mem[buffer] = PTV[15:8];
18130
      PTV = PTV << 8;
18131
    end
18132
    else
18133
    begin
18134
      eth_phy.rx_mem[buffer] = 0;
18135
    end
18136
    buffer = buffer + 1;
18137
  end
18138
  delta_t = !delta_t;
18139
  append_rx_crc (rxpnt, 60, 1'b0, 1'b0); // CRC for control packet
18140
end
18141
endtask // set_rx_control_packet
18142
 
18143 243 tadejm
task set_rx_addr_type;
18144
  input  [31:0] rxpnt;
18145
  input  [47:0] eth_dest_addr;
18146
  input  [47:0] eth_source_addr;
18147
  input  [15:0] eth_type_len;
18148
  integer       i;
18149
  reg    [47:0] dest_addr;
18150
  reg    [47:0] source_addr;
18151
  reg    [15:0] type_len;
18152
  reg    [21:0] buffer;
18153
  reg           delta_t;
18154
begin
18155
  buffer = rxpnt[21:0];
18156
  dest_addr = eth_dest_addr;
18157
  source_addr = eth_source_addr;
18158
  type_len = eth_type_len;
18159
  delta_t = 0;
18160
  for(i = 0; i < 14; i = i + 1)
18161
  begin
18162
    if (i < 6)
18163
    begin
18164
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18165
      dest_addr = dest_addr << 8;
18166
    end
18167
    else if (i < 12)
18168
    begin
18169
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18170
      source_addr = source_addr << 8;
18171
    end
18172
    else // if (i < 14)
18173
    begin
18174
      eth_phy.rx_mem[buffer] = type_len[15:8];
18175
      type_len = type_len << 8;
18176
    end
18177
    buffer = buffer + 1;
18178
  end
18179
  delta_t = !delta_t;
18180
end
18181
endtask // set_rx_addr_type
18182
 
18183 169 mohor
task check_rx_packet;
18184
  input  [31:0] rxpnt_phy; // source
18185
  input  [31:0] rxpnt_wb;  // destination
18186
  input  [15:0] len;
18187
  input         plus_dribble_nibble; // if length is longer for one nibble
18188
  input         successful_dribble_nibble; // if additional nibble is stored into memory
18189
  output [31:0] failure;
18190
  integer       i, data_wb, data_phy;
18191
  reg    [31:0] addr_wb, addr_phy;
18192
  reg    [31:0] failure;
18193
  reg    [21:0] buffer;
18194
  reg           delta_t;
18195
begin
18196
  addr_phy = rxpnt_phy;
18197
  addr_wb = rxpnt_wb;
18198
  delta_t = 0;
18199
  failure = 0;
18200
 
18201
  // First write might not be word allign.
18202
  if(addr_wb[1:0] == 1)
18203
  begin
18204
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
18205
    data_phy[31:24] = 0;
18206
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
18207
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18208
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
18209
    i = 3;
18210
    if (data_phy[23:0] !== data_wb[23:0])
18211
    begin
18212
      `TIME;
18213 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18214
      $display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
18215 169 mohor
      failure = 1;
18216
    end
18217
  end
18218
  else if (addr_wb[1:0] == 2)
18219
  begin
18220
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
18221
    data_phy[31:16] = 0;
18222
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
18223
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18224
    i = 2;
18225
    if (data_phy[15:0] !== data_wb[15:0])
18226
    begin
18227
      `TIME;
18228 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18229
      $display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
18230 169 mohor
      failure = 1;
18231
    end
18232
  end
18233
  else if (addr_wb[1:0] == 3)
18234
  begin
18235
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
18236
    data_phy[31: 8] = 0;
18237
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
18238
    i = 1;
18239
    if (data_phy[7:0] !== data_wb[7:0])
18240
    begin
18241
      `TIME;
18242 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18243
      $display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
18244 169 mohor
      failure = 1;
18245
    end
18246
  end
18247
  else
18248
    i = 0;
18249
  delta_t = !delta_t;
18250
 
18251
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
18252
  begin
18253
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18254
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18255
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18256
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18257
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18258
    if (data_phy[31:0] !== data_wb[31:0])
18259
    begin
18260
      `TIME;
18261 243 tadejm
      if (i == 0)
18262
        $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18263
      $display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
18264 169 mohor
      failure = failure + 1;
18265
    end
18266
  end
18267
  delta_t = !delta_t;
18268
 
18269
  // Last word
18270
  if((len - i) == 3)
18271
  begin
18272
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18273
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18274
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18275
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18276
    if (plus_dribble_nibble)
18277
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18278
    else
18279
      data_phy[ 7: 0] = 0;
18280
    if (data_phy[31:8] !== data_wb[31:8])
18281
    begin
18282
      `TIME;
18283 243 tadejm
      $display("*E Wrong %0d. word (3 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
18284 169 mohor
      failure = failure + 1;
18285
    end
18286
    if (plus_dribble_nibble && successful_dribble_nibble)
18287
    begin
18288
      if (data_phy[3:0] !== data_wb[3:0])
18289 116 mohor
      begin
18290 169 mohor
        `TIME;
18291 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18292 169 mohor
        failure = failure + 1;
18293 116 mohor
      end
18294 169 mohor
    end
18295
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18296
    begin
18297
      if (data_phy[3:0] === data_wb[3:0])
18298 116 mohor
      begin
18299 169 mohor
        `TIME;
18300 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18301 169 mohor
        failure = failure + 1;
18302 116 mohor
      end
18303 169 mohor
    end
18304
  end
18305
  else if((len - i) == 2)
18306
  begin
18307
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
18308
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18309
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18310
    if (plus_dribble_nibble)
18311
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18312
    else
18313
      data_phy[15: 8] = 0;
18314
    data_phy[ 7: 0] = 0;
18315
    if (data_phy[31:16] !== data_wb[31:16])
18316
    begin
18317
      `TIME;
18318 243 tadejm
      $display("*E Wrong %0d. word (2 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
18319 169 mohor
      failure = failure + 1;
18320
    end
18321
    if (plus_dribble_nibble && successful_dribble_nibble)
18322
    begin
18323
      if (data_phy[11:8] !== data_wb[11:8])
18324
      begin
18325
        `TIME;
18326 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18327 169 mohor
        failure = failure + 1;
18328
      end
18329
    end
18330
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18331
    begin
18332
      if (data_phy[11:8] === data_wb[11:8])
18333
      begin
18334
        `TIME;
18335 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18336 169 mohor
        failure = failure + 1;
18337
      end
18338
    end
18339
  end
18340
  else if((len - i) == 1)
18341
  begin
18342
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
18343
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18344
    if (plus_dribble_nibble)
18345
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18346
    else
18347
      data_phy[23:16] = 0;
18348
    data_phy[15: 8] = 0;
18349
    data_phy[ 7: 0] = 0;
18350
    if (data_phy[31:24] !== data_wb[31:24])
18351
    begin
18352
      `TIME;
18353 243 tadejm
      $display("*E Wrong %0d. word (1 byte) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
18354 169 mohor
      failure = failure + 1;
18355
    end
18356
    if (plus_dribble_nibble && successful_dribble_nibble)
18357
    begin
18358
      if (data_phy[19:16] !== data_wb[19:16])
18359
      begin
18360
        `TIME;
18361 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18362 169 mohor
        failure = failure + 1;
18363
      end
18364
    end
18365
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18366
    begin
18367
      if (data_phy[19:16] === data_wb[19:16])
18368
      begin
18369
        `TIME;
18370 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18371 169 mohor
        failure = failure + 1;
18372
      end
18373
    end
18374
  end
18375
  else if((len - i) == 4)
18376
  begin
18377
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18378
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18379
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18380
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18381
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18382
    if (data_phy[31:0] !== data_wb[31:0])
18383
    begin
18384
      `TIME;
18385 243 tadejm
      $display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
18386 169 mohor
      failure = failure + 1;
18387
    end
18388
    if (plus_dribble_nibble)
18389
    begin
18390
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
18391
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
18392
      if (successful_dribble_nibble)
18393
      begin
18394
        if (data_phy[27:24] !== data_wb[27:24])
18395
        begin
18396
          `TIME;
18397 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18398 169 mohor
          failure = failure + 1;
18399
        end
18400
      end
18401
      else
18402
      begin
18403
        if (data_phy[27:24] === data_wb[27:24])
18404
        begin
18405
          `TIME;
18406 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18407 169 mohor
          failure = failure + 1;
18408
        end
18409
      end
18410
    end
18411
  end
18412
  else
18413
    $display("(%0t)(%m) ERROR", $time);
18414
  delta_t = !delta_t;
18415
end
18416
endtask // check_rx_packet
18417 116 mohor
 
18418 169 mohor
//////////////////////////////////////////////////////////////
18419
// Ethernet CRC Basic tasks
18420
//////////////////////////////////////////////////////////////
18421
 
18422
task append_tx_crc;
18423
  input  [31:0] txpnt_wb;  // source
18424
  input  [15:0] len; // length in bytes without CRC
18425
  input         negated_crc; // if appended CRC is correct or not
18426
  reg    [31:0] crc;
18427
  reg    [31:0] addr_wb;
18428
  reg           delta_t;
18429
begin
18430 243 tadejm
  addr_wb = txpnt_wb + {16'h0, len};
18431 169 mohor
  delta_t = 0;
18432
  // calculate CRC from prepared packet
18433
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
18434
  if (negated_crc)
18435
    crc = ~crc;
18436
  delta_t = !delta_t;
18437
 
18438
  // Write might not be word allign.
18439
  if (addr_wb[1:0] == 1)
18440
  begin
18441
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
18442
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
18443 116 mohor
  end
18444 169 mohor
  else if (addr_wb[1:0] == 2)
18445
  begin
18446
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
18447
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
18448
  end
18449
  else if (addr_wb[1:0] == 3)
18450
  begin
18451
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
18452
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
18453
  end
18454
  else
18455
  begin
18456
    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
18457
  end
18458
  delta_t = !delta_t;
18459
end
18460
endtask // append_tx_crc
18461 116 mohor
 
18462 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
18463
  input  [31:0] txpnt_phy; // destination
18464
  input  [15:0] len; // length in bytes without CRC
18465
  input         negated_crc; // if appended CRC is correct or not
18466
  output [31:0] failure;
18467
  reg    [31:0] failure;
18468
  reg    [31:0] crc_calc;
18469
  reg    [31:0] crc;
18470
  reg    [31:0] addr_phy;
18471
  reg           delta_t;
18472
begin
18473
  addr_phy = txpnt_phy;
18474
  failure = 0;
18475
  // calculate CRC from sent packet
18476
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18477
//#10;
18478
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18479 209 tadejm
  #1;
18480 169 mohor
  addr_phy = addr_phy + len;
18481
  // Read CRC - BIG endian
18482
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
18483
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
18484
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
18485
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
18486
 
18487
  delta_t = !delta_t;
18488
  if (negated_crc)
18489
  begin
18490
    if ((~crc_calc) !== crc)
18491
    begin
18492
      `TIME;
18493
      $display("*E Negated CRC was not successfuly transmitted!");
18494
      failure = failure + 1;
18495
    end
18496
  end
18497
  else
18498
  begin
18499
    if (crc_calc !== crc)
18500
    begin
18501
      `TIME;
18502 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
18503 169 mohor
      failure = failure + 1;
18504
    end
18505
  end
18506
  delta_t = !delta_t;
18507
end
18508
endtask // check_tx_crc
18509
 
18510
task append_rx_crc;
18511
  input  [31:0] rxpnt_phy; // source
18512
  input  [15:0] len; // length in bytes without CRC
18513
  input         plus_dribble_nibble; // if length is longer for one nibble
18514
  input         negated_crc; // if appended CRC is correct or not
18515
  reg    [31:0] crc;
18516
  reg    [7:0]  tmp;
18517
  reg    [31:0] addr_phy;
18518
  reg           delta_t;
18519
begin
18520
  addr_phy = rxpnt_phy + len;
18521
  delta_t = 0;
18522
  // calculate CRC from prepared packet
18523
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
18524
  if (negated_crc)
18525
    crc = ~crc;
18526
  delta_t = !delta_t;
18527
 
18528
  if (plus_dribble_nibble)
18529
  begin
18530
    tmp = eth_phy.rx_mem[addr_phy];
18531 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
18532
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
18533
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
18534
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
18535
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
18536 169 mohor
  end
18537
  else
18538
  begin
18539 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
18540
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
18541
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
18542
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
18543 169 mohor
  end
18544
end
18545
endtask // append_rx_crc
18546
 
18547
// paralel CRC checking for PHY TX
18548
task paralel_crc_phy_tx;
18549
  input  [31:0] start_addr; // start address
18550
  input  [31:0] len; // length of frame in Bytes without CRC length
18551
  input         plus_dribble_nibble; // if length is longer for one nibble
18552
  output [31:0] crc_out;
18553
  reg    [21:0] addr_cnt; // only 22 address lines
18554
  integer       word_cnt;
18555
  integer       nibble_cnt;
18556
  reg    [31:0] load_reg;
18557
  reg           delta_t;
18558
  reg    [31:0] crc_next;
18559
  reg    [31:0] crc;
18560
  reg           crc_error;
18561
  reg     [3:0] data_in;
18562
  integer       i;
18563
begin
18564
  #1 addr_cnt = start_addr[21:0];
18565
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18566
  crc = 32'hFFFF_FFFF; // INITIAL value
18567
  delta_t = 0;
18568
  // length must include 4 bytes of ZEROs, to generate CRC
18569
  // get number of nibbles from Byte length (2^1 = 2)
18570
  if (plus_dribble_nibble)
18571
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18572
  else
18573
    nibble_cnt = ((len + 4) << 1);
18574
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18575
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18576
  addr_cnt = addr_cnt + 1;
18577
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18578
  addr_cnt = addr_cnt + 1;
18579
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18580
  addr_cnt = addr_cnt + 1;
18581
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18582
  addr_cnt = addr_cnt + 1;
18583
  while (nibble_cnt > 0)
18584
  begin
18585
    // wait for delta time
18586
    delta_t = !delta_t;
18587
    // shift data in
18588
 
18589
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18590
      data_in[3:0] = 4'h0;
18591
    else
18592
 
18593
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18594
    crc_next[0]  = (data_in[0] ^ crc[28]);
18595
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18596
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18597
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18598
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18599
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18600
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18601
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18602
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18603
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18604
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18605
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18606
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18607
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18608
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18609
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18610
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18611
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18612
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18613
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18614
    crc_next[20] =  crc[16];
18615
    crc_next[21] =  crc[17];
18616
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18617
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18618
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18619
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18620
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18621
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18622
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18623
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18624
    crc_next[30] =  crc[26];
18625
    crc_next[31] =  crc[27];
18626
 
18627
    crc = crc_next;
18628
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18629
    case (nibble_cnt)
18630
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18631
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18632
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18633
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18634
    default: crc_out = crc_out;
18635
    endcase
18636
    // wait for delta time
18637
    delta_t = !delta_t;
18638
    // increment address and load new data
18639
    if ((word_cnt+3) == 7)//4)
18640
    begin
18641
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18642
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18643
      addr_cnt = addr_cnt + 1;
18644
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18645
      addr_cnt = addr_cnt + 1;
18646
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18647
      addr_cnt = addr_cnt + 1;
18648
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18649
      addr_cnt = addr_cnt + 1;
18650
    end
18651
    // set new load bit position
18652
    if((word_cnt+3) == 31)
18653
      word_cnt = 16;
18654
    else if ((word_cnt+3) == 23)
18655
      word_cnt = 8;
18656
    else if ((word_cnt+3) == 15)
18657
      word_cnt = 0;
18658
    else if ((word_cnt+3) == 7)
18659
      word_cnt = 24;
18660
    else
18661
      word_cnt = word_cnt + 4;// - 4;
18662
    // decrement nibble counter
18663
    nibble_cnt = nibble_cnt - 1;
18664
    // wait for delta time
18665
    delta_t = !delta_t;
18666
  end // while
18667
  #1;
18668
end
18669
endtask // paralel_crc_phy_tx
18670
 
18671
// paralel CRC calculating for PHY RX
18672
task paralel_crc_phy_rx;
18673
  input  [31:0] start_addr; // start address
18674
  input  [31:0] len; // length of frame in Bytes without CRC length
18675
  input         plus_dribble_nibble; // if length is longer for one nibble
18676 209 tadejm
  output [31:0] crc_out;
18677 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
18678
  integer       word_cnt;
18679 209 tadejm
  integer       nibble_cnt;
18680 169 mohor
  reg    [31:0] load_reg;
18681
  reg           delta_t;
18682 209 tadejm
  reg    [31:0] crc_next;
18683
  reg    [31:0] crc;
18684
  reg           crc_error;
18685
  reg     [3:0] data_in;
18686
  integer       i;
18687 169 mohor
begin
18688
  #1 addr_cnt = start_addr[21:0];
18689 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18690
  crc = 32'hFFFF_FFFF; // INITIAL value
18691 169 mohor
  delta_t = 0;
18692
  // length must include 4 bytes of ZEROs, to generate CRC
18693 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
18694 169 mohor
  if (plus_dribble_nibble)
18695 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18696 169 mohor
  else
18697 209 tadejm
    nibble_cnt = ((len + 4) << 1);
18698
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18699 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
18700
  addr_cnt = addr_cnt + 1;
18701
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
18702
  addr_cnt = addr_cnt + 1;
18703 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
18704 169 mohor
  addr_cnt = addr_cnt + 1;
18705 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
18706
  addr_cnt = addr_cnt + 1;
18707
  while (nibble_cnt > 0)
18708 169 mohor
  begin
18709
    // wait for delta time
18710
    delta_t = !delta_t;
18711
    // shift data in
18712 209 tadejm
 
18713
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18714
      data_in[3:0] = 4'h0;
18715 169 mohor
    else
18716 209 tadejm
 
18717
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18718
    crc_next[0]  = (data_in[0] ^ crc[28]);
18719
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18720
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18721
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18722
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18723
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18724
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18725
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18726
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18727
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18728
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18729
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18730
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18731
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18732
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18733
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18734
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18735
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18736
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18737
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18738
    crc_next[20] =  crc[16];
18739
    crc_next[21] =  crc[17];
18740
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18741
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18742
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18743
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18744
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18745
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18746
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18747
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18748
    crc_next[30] =  crc[26];
18749
    crc_next[31] =  crc[27];
18750
 
18751
    crc = crc_next;
18752
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18753
    case (nibble_cnt)
18754
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18755
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18756
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18757
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18758
    default: crc_out = crc_out;
18759
    endcase
18760 169 mohor
    // wait for delta time
18761
    delta_t = !delta_t;
18762
    // increment address and load new data
18763 209 tadejm
    if ((word_cnt+3) == 7)//4)
18764 169 mohor
    begin
18765 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18766 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
18767
      addr_cnt = addr_cnt + 1;
18768
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
18769
      addr_cnt = addr_cnt + 1;
18770 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
18771 169 mohor
      addr_cnt = addr_cnt + 1;
18772 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
18773
      addr_cnt = addr_cnt + 1;
18774 169 mohor
    end
18775
    // set new load bit position
18776 209 tadejm
    if((word_cnt+3) == 31)
18777 169 mohor
      word_cnt = 16;
18778 209 tadejm
    else if ((word_cnt+3) == 23)
18779 169 mohor
      word_cnt = 8;
18780 209 tadejm
    else if ((word_cnt+3) == 15)
18781 169 mohor
      word_cnt = 0;
18782 209 tadejm
    else if ((word_cnt+3) == 7)
18783 169 mohor
      word_cnt = 24;
18784
    else
18785 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
18786
    // decrement nibble counter
18787
    nibble_cnt = nibble_cnt - 1;
18788 169 mohor
    // wait for delta time
18789
    delta_t = !delta_t;
18790
  end // while
18791
  #1;
18792
end
18793
endtask // paralel_crc_phy_rx
18794
 
18795
// paralel CRC checking for MAC
18796
task paralel_crc_mac;
18797
  input  [31:0] start_addr; // start address
18798
  input  [31:0] len; // length of frame in Bytes without CRC length
18799
  input         plus_dribble_nibble; // if length is longer for one nibble
18800 209 tadejm
  output [31:0] crc_out;
18801
 
18802
  reg    [21:0] addr_cnt; // only 22 address lines
18803 169 mohor
  integer       word_cnt;
18804 209 tadejm
  integer       nibble_cnt;
18805 169 mohor
  reg    [31:0] load_reg;
18806
  reg           delta_t;
18807 209 tadejm
  reg    [31:0] crc_next;
18808
  reg    [31:0] crc;
18809
  reg           crc_error;
18810
  reg     [3:0] data_in;
18811
  integer       i;
18812 169 mohor
begin
18813
  #1 addr_cnt = start_addr[19:0];
18814
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
18815
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
18816
  if (addr_cnt[1:0] == 2'h1)
18817
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18818
  else if (addr_cnt[1:0] == 2'h2)
18819
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18820
  else if (addr_cnt[1:0] == 2'h3)
18821
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18822
  else
18823
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18824 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
18825 169 mohor
  delta_t = 0;
18826
  // length must include 4 bytes of ZEROs, to generate CRC
18827 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
18828 169 mohor
  if (plus_dribble_nibble)
18829 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18830 169 mohor
  else
18831 209 tadejm
    nibble_cnt = ((len + 4) << 1);
18832 169 mohor
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
18833 209 tadejm
  addr_cnt = addr_cnt + 4;
18834
  while (nibble_cnt > 0)
18835 169 mohor
  begin
18836
    // wait for delta time
18837
    delta_t = !delta_t;
18838
    // shift data in
18839 209 tadejm
 
18840
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18841
      data_in[3:0] = 4'h0;
18842 169 mohor
    else
18843 209 tadejm
 
18844
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18845
    crc_next[0]  = (data_in[0] ^ crc[28]);
18846
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18847
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18848
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18849
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18850
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18851
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18852
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18853
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18854
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18855
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18856
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18857
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18858
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18859
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18860
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18861
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18862
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18863
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18864
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18865
    crc_next[20] =  crc[16];
18866
    crc_next[21] =  crc[17];
18867
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18868
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18869
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18870
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18871
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18872
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18873
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18874
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18875
    crc_next[30] =  crc[26];
18876
    crc_next[31] =  crc[27];
18877
 
18878
    crc = crc_next;
18879
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18880
    case (nibble_cnt)
18881
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18882
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18883
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18884
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18885
    default: crc_out = crc_out;
18886
    endcase
18887 169 mohor
    // wait for delta time
18888
    delta_t = !delta_t;
18889 209 tadejm
    // increment address and load new data
18890
    if ((word_cnt+3) == 7)//4)
18891 169 mohor
    begin
18892 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18893
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
18894 169 mohor
      addr_cnt = addr_cnt + 4;
18895
    end
18896 209 tadejm
    // set new load bit position
18897
    if((word_cnt+3) == 31)
18898 169 mohor
      word_cnt = 16;
18899 209 tadejm
    else if ((word_cnt+3) == 23)
18900 169 mohor
      word_cnt = 8;
18901 209 tadejm
    else if ((word_cnt+3) == 15)
18902 169 mohor
      word_cnt = 0;
18903 209 tadejm
    else if ((word_cnt+3) == 7)
18904 169 mohor
      word_cnt = 24;
18905
    else
18906 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
18907
    // decrement nibble counter
18908
    nibble_cnt = nibble_cnt - 1;
18909 169 mohor
    // wait for delta time
18910
    delta_t = !delta_t;
18911
  end // while
18912
  #1;
18913
end
18914
endtask // paralel_crc_mac
18915
 
18916
// serial CRC checking for PHY TX
18917
task serial_crc_phy_tx;
18918
  input  [31:0] start_addr; // start address
18919
  input  [31:0] len; // length of frame in Bytes without CRC length
18920
  input         plus_dribble_nibble; // if length is longer for one nibble
18921
  output [31:0] crc;
18922
  reg    [21:0] addr_cnt; // only 22 address lines
18923
  integer       word_cnt;
18924
  integer       bit_cnt;
18925
  reg    [31:0] load_reg;
18926
  reg    [31:0] crc_shift_reg;
18927
  reg    [31:0] crc_store_reg;
18928
  reg           delta_t;
18929
begin
18930
  #1 addr_cnt = start_addr[21:0];
18931
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18932
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
18933
  delta_t = 0;
18934
  // length must include 4 bytes of ZEROs, to generate CRC
18935
  // get number of bits from Byte length (2^3 = 8)
18936
  if (plus_dribble_nibble)
18937
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
18938
  else
18939
    bit_cnt = ((len + 4) << 3);
18940
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18941
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18942
  addr_cnt = addr_cnt + 1;
18943
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18944
  addr_cnt = addr_cnt + 1;
18945
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18946
  addr_cnt = addr_cnt + 1;
18947
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18948
  addr_cnt = addr_cnt + 1;
18949
#1;
18950
  while (bit_cnt > 0)
18951
  begin
18952
    // wait for delta time
18953
    delta_t = !delta_t;
18954
#1;
18955
    // shift data in
18956
 
18957
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
18958
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
18959
    else
18960
 
18961
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
18962
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
18963
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
18964
    crc_shift_reg[3]  = crc_store_reg[2];
18965
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
18966
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
18967
    crc_shift_reg[6]  = crc_store_reg[5];
18968
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
18969
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
18970
    crc_shift_reg[9]  = crc_store_reg[8];
18971
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
18972
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
18973
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
18974
    crc_shift_reg[13] = crc_store_reg[12];
18975
    crc_shift_reg[14] = crc_store_reg[13];
18976
    crc_shift_reg[15] = crc_store_reg[14];
18977
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
18978
    crc_shift_reg[17] = crc_store_reg[16];
18979
    crc_shift_reg[18] = crc_store_reg[17];
18980
    crc_shift_reg[19] = crc_store_reg[18];
18981
    crc_shift_reg[20] = crc_store_reg[19];
18982
    crc_shift_reg[21] = crc_store_reg[20];
18983
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
18984
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
18985
    crc_shift_reg[24] = crc_store_reg[23];
18986
    crc_shift_reg[25] = crc_store_reg[24];
18987
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
18988
    crc_shift_reg[27] = crc_store_reg[26];
18989
    crc_shift_reg[28] = crc_store_reg[27];
18990
    crc_shift_reg[29] = crc_store_reg[28];
18991
    crc_shift_reg[30] = crc_store_reg[29];
18992
    crc_shift_reg[31] = crc_store_reg[30];
18993
    // wait for delta time
18994
    delta_t = !delta_t;
18995
 
18996
    // store previous data
18997
    crc_store_reg = crc_shift_reg;
18998
 
18999
    // put CRC out
19000
    case (bit_cnt)
19001
    33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 1:
19002
    begin
19003
      crc = crc_store_reg;
19004
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
19005
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
19006
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
19007
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
19008
    end
19009
    default: crc = crc;
19010
    endcase
19011
 
19012
    // increment address and load new data
19013
#1;
19014
    if (word_cnt == 7)//4)
19015
    begin
19016
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19017
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
19018
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
19019
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
19020
      addr_cnt = addr_cnt + 1;
19021
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
19022
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
19023
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
19024
      addr_cnt = addr_cnt + 1;
19025
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
19026
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
19027
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
19028
      addr_cnt = addr_cnt + 1;
19029
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
19030
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
19031
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
19032
      addr_cnt = addr_cnt + 1;
19033
    end
19034
#1;
19035
    // set new load bit position
19036
    if(word_cnt == 31)
19037
      word_cnt = 16;
19038
    else if (word_cnt == 23)
19039
      word_cnt = 8;
19040
    else if (word_cnt == 15)
19041
      word_cnt = 0;
19042
    else if (word_cnt == 7)
19043
      word_cnt = 24;
19044
 
19045
//   if(word_cnt == 24)
19046
//     word_cnt = 31;
19047
//   else if (word_cnt == 28)
19048
//     word_cnt = 19;
19049
//   else if (word_cnt == 16)
19050
//     word_cnt = 23;
19051
//   else if (word_cnt == 20)
19052
//     word_cnt = 11;
19053
//   else if(word_cnt == 8)
19054
//     word_cnt = 15;
19055
//   else if (word_cnt == 12)
19056
//     word_cnt = 3;
19057
//   else if (word_cnt == 0)
19058
//     word_cnt = 7;
19059
//   else if (word_cnt == 4)
19060
//     word_cnt = 27;
19061
    else
19062
      word_cnt = word_cnt + 1;// - 1;
19063
#1;
19064
    // decrement bit counter
19065
    bit_cnt = bit_cnt - 1;
19066
#1;
19067
    // wait for delta time
19068
    delta_t = !delta_t;
19069
  end // while
19070
 
19071
  #1;
19072
end
19073
endtask // serial_crc_phy_tx
19074
 
19075
// serial CRC calculating for PHY RX
19076
task serial_crc_phy_rx;
19077
  input  [31:0] start_addr; // start address
19078
  input  [31:0] len; // length of frame in Bytes without CRC length
19079
  input         plus_dribble_nibble; // if length is longer for one nibble
19080
  output [31:0] crc;
19081
  reg    [21:0] addr_cnt; // only 22 address lines
19082
  integer       word_cnt;
19083
  integer       bit_cnt;
19084
  reg    [31:0] load_reg;
19085
  reg    [31:0] crc_shift_reg;
19086
  reg    [31:0] crc_store_reg;
19087
  reg           delta_t;
19088
begin
19089
  #1 addr_cnt = start_addr[21:0];
19090
  word_cnt = 24; // start of the frame
19091
  crc_shift_reg = 0;
19092
  delta_t = 0;
19093
  // length must include 4 bytes of ZEROs, to generate CRC
19094
  // get number of bits from Byte length (2^3 = 8)
19095
  if (plus_dribble_nibble)
19096
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19097
  else
19098
    bit_cnt = ((len + 4) << 3);
19099
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19100
  addr_cnt = addr_cnt + 1;
19101
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19102
  addr_cnt = addr_cnt + 1;
19103
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19104
  addr_cnt = addr_cnt + 1;
19105
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19106
 
19107
  while (bit_cnt > 0)
19108
  begin
19109
    // wait for delta time
19110
    delta_t = !delta_t;
19111
    // store previous data
19112
    crc_store_reg = crc_shift_reg;
19113
    // shift data in
19114
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19115
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19116
    else
19117
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19118
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19119
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19120
    crc_shift_reg[3]  = crc_store_reg[2];
19121
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19122
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19123
    crc_shift_reg[6]  = crc_store_reg[5];
19124
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19125
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19126
    crc_shift_reg[9]  = crc_store_reg[8];
19127
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19128
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19129
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19130
    crc_shift_reg[13] = crc_store_reg[12];
19131
    crc_shift_reg[14] = crc_store_reg[13];
19132
    crc_shift_reg[15] = crc_store_reg[14];
19133
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19134
    crc_shift_reg[17] = crc_store_reg[16];
19135
    crc_shift_reg[18] = crc_store_reg[17];
19136
    crc_shift_reg[19] = crc_store_reg[18];
19137
    crc_shift_reg[20] = crc_store_reg[19];
19138
    crc_shift_reg[21] = crc_store_reg[20];
19139
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19140
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19141
    crc_shift_reg[24] = crc_store_reg[23];
19142
    crc_shift_reg[25] = crc_store_reg[24];
19143
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19144
    crc_shift_reg[27] = crc_store_reg[26];
19145
    crc_shift_reg[28] = crc_store_reg[27];
19146
    crc_shift_reg[29] = crc_store_reg[28];
19147
    crc_shift_reg[30] = crc_store_reg[29];
19148
    crc_shift_reg[31] = crc_store_reg[30];
19149
    // wait for delta time
19150
    delta_t = !delta_t;
19151
    // increment address and load new data
19152
    if (word_cnt == 7)
19153
    begin
19154
      addr_cnt = addr_cnt + 1;
19155
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19156
      addr_cnt = addr_cnt + 1;
19157
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19158
      addr_cnt = addr_cnt + 1;
19159
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19160
      addr_cnt = addr_cnt + 1;
19161
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19162
    end
19163
    // set new load bit position
19164
    if(word_cnt == 31)
19165
      word_cnt = 16;
19166
    else if (word_cnt == 23)
19167
      word_cnt = 8;
19168
    else if (word_cnt == 15)
19169
      word_cnt = 0;
19170
    else if (word_cnt == 7)
19171
      word_cnt = 24;
19172
    else
19173
      word_cnt = word_cnt + 1;
19174
    // decrement bit counter
19175
    bit_cnt = bit_cnt - 1;
19176
    // wait for delta time
19177
    delta_t = !delta_t;
19178
  end // while
19179
 
19180
  // put CRC out
19181
  crc = crc_shift_reg;
19182
  #1;
19183
end
19184
endtask // serial_crc_phy_rx
19185
 
19186
// serial CRC checking for MAC
19187
task serial_crc_mac;
19188
  input  [31:0] start_addr; // start address
19189
  input  [31:0] len; // length of frame in Bytes without CRC length
19190
  input         plus_dribble_nibble; // if length is longer for one nibble
19191
  output [31:0] crc;
19192
  reg    [19:0] addr_cnt; // only 20 address lines
19193
  integer       word_cnt;
19194
  integer       bit_cnt;
19195
  reg    [31:0] load_reg;
19196
  reg    [31:0] crc_shift_reg;
19197
  reg    [31:0] crc_store_reg;
19198
  reg           delta_t;
19199
begin
19200
  #1 addr_cnt = start_addr[19:0];
19201
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
19202
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
19203
  if (addr_cnt[1:0] == 2'h1)
19204
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19205
  else if (addr_cnt[1:0] == 2'h2)
19206
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19207
  else if (addr_cnt[1:0] == 2'h3)
19208
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19209
  else
19210
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19211
 
19212
  crc_shift_reg = 0;
19213
  delta_t = 0;
19214
  // length must include 4 bytes of ZEROs, to generate CRC
19215
  // get number of bits from Byte length (2^3 = 8)
19216
  if (plus_dribble_nibble)
19217
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19218
  else
19219
    bit_cnt = ((len + 4) << 3);
19220
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19221
 
19222
  while (bit_cnt > 0)
19223
  begin
19224
    // wait for delta time
19225
    delta_t = !delta_t;
19226
    // store previous data
19227
    crc_store_reg = crc_shift_reg;
19228
    // shift data in
19229
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19230
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19231
    else
19232
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19233
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19234
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19235
    crc_shift_reg[3]  = crc_store_reg[2];
19236
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19237
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19238
    crc_shift_reg[6]  = crc_store_reg[5];
19239
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19240
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19241
    crc_shift_reg[9]  = crc_store_reg[8];
19242
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19243
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19244
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19245
    crc_shift_reg[13] = crc_store_reg[12];
19246
    crc_shift_reg[14] = crc_store_reg[13];
19247
    crc_shift_reg[15] = crc_store_reg[14];
19248
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19249
    crc_shift_reg[17] = crc_store_reg[16];
19250
    crc_shift_reg[18] = crc_store_reg[17];
19251
    crc_shift_reg[19] = crc_store_reg[18];
19252
    crc_shift_reg[20] = crc_store_reg[19];
19253
    crc_shift_reg[21] = crc_store_reg[20];
19254
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19255
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19256
    crc_shift_reg[24] = crc_store_reg[23];
19257
    crc_shift_reg[25] = crc_store_reg[24];
19258
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19259
    crc_shift_reg[27] = crc_store_reg[26];
19260
    crc_shift_reg[28] = crc_store_reg[27];
19261
    crc_shift_reg[29] = crc_store_reg[28];
19262
    crc_shift_reg[30] = crc_store_reg[29];
19263
    crc_shift_reg[31] = crc_store_reg[30];
19264
    // wait for delta time
19265
    delta_t = !delta_t;
19266
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
19267
    if (word_cnt == 7)
19268
    begin
19269
      addr_cnt = addr_cnt + 4;
19270
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19271
    end
19272
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
19273
    if(word_cnt == 31)
19274
      word_cnt = 16;
19275
    else if (word_cnt == 23)
19276
      word_cnt = 8;
19277
    else if (word_cnt == 15)
19278
      word_cnt = 0;
19279
    else if (word_cnt == 7)
19280
      word_cnt = 24;
19281
    else
19282
      word_cnt = word_cnt + 1;
19283
    // decrement bit counter
19284
    bit_cnt = bit_cnt - 1;
19285
    // wait for delta time
19286
    delta_t = !delta_t;
19287
  end // while
19288
 
19289
  // put CRC out
19290
  crc = crc_shift_reg;
19291
  #1;
19292
end
19293
endtask // serial_crc_mac
19294
 
19295
//////////////////////////////////////////////////////////////
19296
// MIIM Basic tasks
19297
//////////////////////////////////////////////////////////////
19298
 
19299
task reset_mii; //  MII module
19300
  reg [31:0] tmp;
19301
  reg [31:0] tmp_no_rst;
19302
begin
19303
  // read MII mode register first
19304
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19305
  // set reset bit - write back to MII mode register with RESET bit
19306
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19307
  // clear reset bit - write back to MII mode register without RESET bit
19308
  tmp_no_rst = `ETH_MIIMODER_RST;
19309
  tmp_no_rst = ~tmp_no_rst;
19310
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19311
end
19312
endtask // reset_mii
19313
 
19314
task mii_set_clk_div; // set clock divider for MII clock
19315
  input [7:0]  clk_div;
19316
begin
19317
  // MII mode register
19318
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19319
end
19320
endtask // mii_set_clk_div
19321
 
19322
 
19323
task check_mii_busy; // MII - check if BUSY
19324
  reg [31:0] tmp;
19325
begin
19326
  @(posedge wb_clk);
19327
  // MII read status register
19328
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19329
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
19330
  begin
19331
    @(posedge wb_clk);
19332
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19333
  end
19334
end
19335
endtask // check_mii_busy
19336
 
19337
 
19338
task check_mii_scan_valid; // MII - check if SCAN data are valid
19339
  reg [31:0] tmp;
19340
begin
19341
  @(posedge wb_clk);
19342
  // MII read status register
19343
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19344
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
19345
  begin
19346
    @(posedge wb_clk);
19347
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19348
  end
19349
end
19350
endtask // check_mii_scan_valid
19351
 
19352
 
19353
task mii_write_req; // requests write to MII
19354
  input [4:0]  phy_addr;
19355
  input [4:0]  reg_addr;
19356
  input [15:0] data_in;
19357
begin
19358
  // MII address, PHY address = 1, command register address = 0
19359
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19360
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19361
  // MII TX data
19362
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19363
  // MII command
19364
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19365
  @(posedge wb_clk);
19366
end
19367
endtask // mii_write_req
19368
 
19369
 
19370
task mii_read_req; // requests read from MII
19371
  input [4:0]  phy_addr;
19372
  input [4:0]  reg_addr;
19373
begin
19374
  // MII address, PHY address = 1, command register address = 0
19375
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19376
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19377
  // MII command
19378
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19379
  @(posedge wb_clk);
19380
end
19381
endtask // mii_read_req
19382
 
19383
 
19384
task mii_scan_req; // requests scan from MII
19385
  input [4:0]  phy_addr;
19386
  input [4:0]  reg_addr;
19387
begin
19388
  // MII address, PHY address = 1, command register address = 0
19389
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19390
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19391
  // MII command
19392
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19393
  @(posedge wb_clk);
19394
end
19395
endtask // mii_scan_req
19396
 
19397
 
19398
task mii_scan_finish; // finish scan from MII
19399
begin
19400
  // MII command
19401
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19402
  @(posedge wb_clk);
19403
end
19404
endtask // mii_scan_finish
19405
 
19406
//////////////////////////////////////////////////////////////
19407
// Log files and memory tasks
19408
//////////////////////////////////////////////////////////////
19409
 
19410
task clear_memories;
19411
  reg    [22:0]  adr_i;
19412
  reg            delta_t;
19413
begin
19414
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
19415
  begin
19416
    eth_phy.rx_mem[adr_i[21:0]] = 0;
19417
    eth_phy.tx_mem[adr_i[21:0]] = 0;
19418
    wb_slave.wb_memory[adr_i[21:2]] = 0;
19419
  end
19420
end
19421
endtask // clear_memories
19422
 
19423 243 tadejm
task clear_buffer_descriptors;
19424
  reg    [8:0]  adr_i;
19425
  reg            delta_t;
19426
begin
19427
  delta_t = 0;
19428
  for (adr_i = 0; adr_i < 256; adr_i = adr_i + 1)
19429
  begin
19430
    wbm_write((`TX_BD_BASE + {adr_i[7:0], 2'b0}), 32'h0, 4'hF, 1, 4'h1, 4'h1);
19431
    delta_t = !delta_t;
19432
  end
19433
end
19434
endtask // clear_buffer_descriptors
19435
 
19436 169 mohor
task test_note;
19437
  input [799:0] test_note ;
19438
  reg   [799:0] display_note ;
19439
begin
19440
  display_note = test_note;
19441
  while ( display_note[799:792] == 0 )
19442
    display_note = display_note << 8 ;
19443
  $fdisplay( tb_log_file, " " ) ;
19444
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
19445
  $fdisplay( tb_log_file, " " ) ;
19446
end
19447
endtask // test_note
19448
 
19449
task test_heading;
19450
  input [799:0] test_heading ;
19451
  reg   [799:0] display_test ;
19452
begin
19453
  display_test = test_heading;
19454
  while ( display_test[799:792] == 0 )
19455
    display_test = display_test << 8 ;
19456
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19457
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19458
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
19459
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19460
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19461
  $fdisplay( tb_log_file, " " ) ;
19462
end
19463
endtask // test_heading
19464
 
19465
 
19466
task test_fail ;
19467
  input [7999:0] failure_reason ;
19468
//  reg   [8007:0] display_failure ;
19469
  reg   [7999:0] display_failure ;
19470
  reg   [799:0] display_test ;
19471
begin
19472
  tests_failed = tests_failed + 1 ;
19473
 
19474
  display_failure = failure_reason; // {failure_reason, "!"} ;
19475
  while ( display_failure[7999:7992] == 0 )
19476
    display_failure = display_failure << 8 ;
19477
 
19478
  display_test = test_name ;
19479
  while ( display_test[799:792] == 0 )
19480
    display_test = display_test << 8 ;
19481
 
19482
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19483
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19484
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19485
  $fdisplay( tb_log_file, "    *FAILED* because") ;
19486
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
19487
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19488
  $fdisplay( tb_log_file, " " ) ;
19489
 
19490
 `ifdef STOP_ON_FAILURE
19491
    #20 $stop ;
19492
 `endif
19493
end
19494
endtask // test_fail
19495
 
19496
 
19497
task test_ok ;
19498
  reg [799:0] display_test ;
19499
begin
19500
  tests_successfull = tests_successfull + 1 ;
19501
 
19502
  display_test = test_name ;
19503
  while ( display_test[799:792] == 0 )
19504
    display_test = display_test << 8 ;
19505
 
19506
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19507
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19508
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19509
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
19510
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19511
  $fdisplay( tb_log_file, " " ) ;
19512
end
19513
endtask // test_ok
19514
 
19515
 
19516
task test_summary;
19517
begin
19518
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19519
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
19520
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
19521
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
19522
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19523
  $fclose(tb_log_file) ;
19524
end
19525
endtask // test_summary
19526
 
19527
 
19528 116 mohor
endmodule

powered by: WebSVN 2.1.0

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