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

Subversion Repositories ethmac

[/] [ethmac/] [tags/] [rel_25/] [bench/] [verilog/] [tb_ethernet.v] - Blame information for rev 338

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 315 tadejm
// Revision 1.30  2003/10/17 07:45:17  markom
46
// mbist signals updated according to newest convention
47
//
48 302 markom
// Revision 1.29  2003/08/20 12:06:24  mohor
49
// Artisan RAMs added.
50
//
51 299 mohor
// Revision 1.28  2003/01/31 15:58:27  mohor
52
// Tests test_mac_full_duplex_receive 4-7  fixed to proper BD.
53
//
54 281 mohor
// Revision 1.27  2003/01/30 13:38:15  mohor
55
// Underrun test fixed. Many other tests fixed.
56
//
57 279 mohor
// Revision 1.26  2003/01/22 19:40:10  tadejm
58
// Backup version. Not fully working.
59
//
60 274 tadejm
// Revision 1.25  2002/11/27 16:21:55  mohor
61
// Full duplex control frames tested.
62
//
63 267 mohor
// Revision 1.24  2002/11/22 17:29:42  mohor
64
// Flow control test almost finished.
65
//
66 266 mohor
// Revision 1.23  2002/11/22 02:12:16  mohor
67
// test_mac_full_duplex_flow_control tests pretty much finished.
68
// TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL
69
// FRM. AT 4 TX BD ( 10Mbps ) finished.
70
// TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION
71
// TURNED OFF AT ONE RX BD ( 10Mbps ) finished.
72
//
73 263 mohor
// Revision 1.22  2002/11/21 13:56:50  mohor
74
// test_mac_full_duplex_flow test 0 finished. Sending the control (PAUSE) frame
75
// finished.
76
//
77 260 mohor
// Revision 1.21  2002/11/19 20:27:45  mohor
78
// Temp version.
79
//
80 254 mohor
// Revision 1.20  2002/11/19 17:41:19  tadejm
81
// Just some updates.
82
//
83 252 tadejm
// Revision 1.19  2002/11/14 13:12:47  tadejm
84
// Late collision is not reported any more.
85
//
86 243 tadejm
// Revision 1.18  2002/10/18 17:03:34  tadejm
87
// Changed BIST scan signals.
88
//
89 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
90
// Some code changed due to bug fixes.
91
//
92 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
93
// Just back-up; not completed testbench and some testcases are not
94
// wotking properly yet.
95
//
96 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
97
// Full duplex tests modified and testbench bug repaired.
98
//
99 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
100
// Some additional reports added
101
//
102 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
103
// Full duplex test improved.
104
//
105 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
106
// MIIM test look better.
107
//
108 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
109
// Bench outputs data to display every 128 bytes.
110
//
111 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
112
// Beautiful tests merget together
113
//
114 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
115
// Rearanged testcases
116
//
117 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
118
// Bug in MIIM fixed.
119
//
120 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
121
// Headers changed.
122
//
123 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
124
// New testbench. Thanks to Tadej M - "The Spammer".
125
//
126 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
127
// Clock mrx_clk set to 2.5 MHz.
128
//
129 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
130
// Testing environment also includes traffic cop, memory interface and host
131
// interface.
132 116 mohor
//
133
//
134
//
135
//
136 117 mohor
//
137 116 mohor
 
138
 
139 169 mohor
`include "eth_phy_defines.v"
140
`include "wb_model_defines.v"
141 116 mohor
`include "tb_eth_defines.v"
142
`include "eth_defines.v"
143
`include "timescale.v"
144
 
145
module tb_ethernet();
146
 
147
 
148 169 mohor
reg           wb_clk;
149
reg           wb_rst;
150
wire          wb_int;
151 116 mohor
 
152 169 mohor
wire          mtx_clk;  // This goes to PHY
153
wire          mrx_clk;  // This goes to PHY
154 116 mohor
 
155
wire   [3:0]  MTxD;
156
wire          MTxEn;
157
wire          MTxErr;
158
 
159 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
160
wire          MRxDV;    // This goes to PHY
161
wire          MRxErr;   // This goes to PHY
162
wire          MColl;    // This goes to PHY
163
wire          MCrs;     // This goes to PHY
164 116 mohor
 
165
wire          Mdi_I;
166
wire          Mdo_O;
167
wire          Mdo_OE;
168 169 mohor
tri           Mdio_IO;
169 116 mohor
wire          Mdc_O;
170
 
171
 
172 169 mohor
parameter Tp = 1;
173 116 mohor
 
174 121 mohor
 
175 116 mohor
// Ethernet Slave Interface signals
176 169 mohor
wire [31:0] eth_sl_wb_adr;
177 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
178
wire  [3:0] eth_sl_wb_sel_i;
179
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;
180
 
181
// Ethernet Master Interface signals
182
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
183
wire  [3:0] eth_ma_wb_sel_o;
184
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;
185
 
186 315 tadejm
wire  [2:0] eth_ma_wb_cti_o;
187
wire  [1:0] eth_ma_wb_bte_o;
188 116 mohor
 
189
 
190
// Connecting Ethernet top module
191 169 mohor
eth_top eth_top
192 116 mohor
(
193
  // WISHBONE common
194 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
195 116 mohor
 
196
  // WISHBONE slave
197 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),
198
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
199
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
200 116 mohor
 
201
  // WISHBONE master
202
  .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),
203
  .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),
204
  .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),
205
 
206 315 tadejm
`ifdef ETH_WISHBONE_B3
207
  .m_wb_cti_o(eth_ma_wb_cti_o),     .m_wb_bte_o(eth_ma_wb_bte_o),
208
`endif
209
 
210 116 mohor
  //TX
211
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
212
 
213
  //RX
214
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
215
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
216
 
217
  // MIIM
218
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
219
 
220 169 mohor
  .int_o(wb_int)
221 227 tadejm
 
222
  // Bist
223
`ifdef ETH_BIST
224
  ,
225 302 markom
  .mbist_si_i       (1'b0),
226
  .mbist_so_o       (),
227
  .mbist_ctrl_i       (3'b001) // {enable, clock, reset}
228 227 tadejm
`endif
229 116 mohor
);
230
 
231
 
232
 
233 169 mohor
// Connecting Ethernet PHY Module
234
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
235
assign Mdi_I   = Mdio_IO;
236
integer phy_log_file_desc;
237
 
238
eth_phy eth_phy
239 116 mohor
(
240 169 mohor
  // WISHBONE reset
241
  .m_rst_n_i(!wb_rst),
242 116 mohor
 
243 169 mohor
  // MAC TX
244
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
245
 
246
  // MAC RX
247
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
248
  .mcoll_o(MColl),        .mcrs_o(MCrs),
249
 
250
  // MIIM
251
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
252
 
253
  // SYSTEM
254
  .phy_log(phy_log_file_desc)
255 116 mohor
);
256
 
257
 
258 169 mohor
 
259
// Connecting WB Master as Host Interface
260
integer host_log_file_desc;
261
 
262
WB_MASTER_BEHAVIORAL wb_master
263 116 mohor
(
264 169 mohor
    .CLK_I(wb_clk),
265
    .RST_I(wb_rst),
266
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
267
    .TAG_O(),
268
    .ACK_I(eth_sl_wb_ack_o),
269
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
270
    .CYC_O(eth_sl_wb_cyc_i),
271
    .DAT_I(eth_sl_wb_dat_o),
272
    .DAT_O(eth_sl_wb_dat_i),
273
    .ERR_I(eth_sl_wb_err_o),
274
    .RTY_I(1'b0),  // inactive (1'b0)
275
    .SEL_O(eth_sl_wb_sel_i),
276
    .STB_O(eth_sl_wb_stb_i),
277
    .WE_O (eth_sl_wb_we_i),
278
    .CAB_O()       // NOT USED for now!
279
);
280
 
281
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
282
 
283
 
284
 
285
// Connecting WB Slave as Memory Interface Module
286
integer memory_log_file_desc;
287
 
288
WB_SLAVE_BEHAVIORAL wb_slave
289
(
290
    .CLK_I(wb_clk),
291
    .RST_I(wb_rst),
292
    .ACK_O(eth_ma_wb_ack_i),
293
    .ADR_I(eth_ma_wb_adr_o),
294
    .CYC_I(eth_ma_wb_cyc_o),
295
    .DAT_O(eth_ma_wb_dat_i),
296
    .DAT_I(eth_ma_wb_dat_o),
297
    .ERR_O(eth_ma_wb_err_i),
298
    .RTY_O(),      // NOT USED for now!
299
    .SEL_I(eth_ma_wb_sel_o),
300
    .STB_I(eth_ma_wb_stb_o),
301
    .WE_I (eth_ma_wb_we_o),
302 315 tadejm
    .CAB_I(1'b0)
303 169 mohor
);
304
 
305
 
306
 
307
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
308
integer wb_s_mon_log_file_desc ;
309
integer wb_m_mon_log_file_desc ;
310
 
311
WB_BUS_MON wb_eth_slave_bus_mon
312
(
313 116 mohor
  // WISHBONE common
314 169 mohor
  .CLK_I(wb_clk),
315
  .RST_I(wb_rst),
316 116 mohor
 
317 169 mohor
  // WISHBONE slave
318
  .ACK_I(eth_sl_wb_ack_o),
319
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
320
  .CYC_O(eth_sl_wb_cyc_i),
321
  .DAT_I(eth_sl_wb_dat_o),
322
  .DAT_O(eth_sl_wb_dat_i),
323
  .ERR_I(eth_sl_wb_err_o),
324
  .RTY_I(1'b0),
325
  .SEL_O(eth_sl_wb_sel_i),
326
  .STB_O(eth_sl_wb_stb_i),
327
  .WE_O (eth_sl_wb_we_i),
328
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
329 315 tadejm
`ifdef ETH_WISHBONE_B3
330
  .TAG_O({eth_ma_wb_cti_o, eth_ma_wb_bte_o}),
331
`else
332
  .TAG_O(5'h0),
333
`endif
334 169 mohor
  .CAB_O(1'b0),
335 315 tadejm
`ifdef ETH_WISHBONE_B3
336
  .check_CTI          (1'b1),
337
`else
338
  .check_CTI          (1'b0),
339
`endif
340 169 mohor
  .log_file_desc (wb_s_mon_log_file_desc)
341
);
342
 
343
WB_BUS_MON wb_eth_master_bus_mon
344
(
345
  // WISHBONE common
346
  .CLK_I(wb_clk),
347
  .RST_I(wb_rst),
348
 
349 116 mohor
  // WISHBONE master
350 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
351
  .ADDR_O(eth_ma_wb_adr_o),
352
  .CYC_O(eth_ma_wb_cyc_o),
353
  .DAT_I(eth_ma_wb_dat_i),
354
  .DAT_O(eth_ma_wb_dat_o),
355
  .ERR_I(eth_ma_wb_err_i),
356
  .RTY_I(1'b0),
357
  .SEL_O(eth_ma_wb_sel_o),
358
  .STB_O(eth_ma_wb_stb_o),
359
  .WE_O (eth_ma_wb_we_o),
360
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
361 315 tadejm
  .TAG_O(5'h0),
362 169 mohor
  .CAB_O(1'b0),
363 315 tadejm
  .check_CTI(1'b0), // NO need
364 169 mohor
  .log_file_desc(wb_m_mon_log_file_desc)
365 116 mohor
);
366
 
367
 
368
 
369 169 mohor
reg         StartTB;
370
integer     tb_log_file;
371 116 mohor
 
372 169 mohor
initial
373
begin
374
  tb_log_file = $fopen("../log/eth_tb.log");
375
  if (tb_log_file < 2)
376
  begin
377
    $display("*E Could not open/create testbench log file in ../log/ directory!");
378
    $finish;
379
  end
380
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
381
  $fdisplay(tb_log_file, " ");
382 116 mohor
 
383 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
384
  if (phy_log_file_desc < 2)
385
  begin
386
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
387
    $finish;
388
  end
389
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
390
  $fdisplay(phy_log_file_desc, " ");
391
 
392
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
393
  if (memory_log_file_desc < 2)
394
  begin
395
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
396
    $finish;
397
  end
398
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
399
  $fdisplay(memory_log_file_desc, " ");
400
 
401
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
402
  if (host_log_file_desc < 2)
403
  begin
404
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
405
    $finish;
406
  end
407
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
408
  $fdisplay(host_log_file_desc, " ");
409
 
410
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
411
  if (wb_s_mon_log_file_desc < 2)
412
  begin
413
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
414
    $finish;
415
  end
416
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
417
  $fdisplay(wb_s_mon_log_file_desc, " ");
418
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
419
  $fdisplay(wb_s_mon_log_file_desc, " ");
420
 
421
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
422
  if (wb_m_mon_log_file_desc < 2)
423
  begin
424
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
425
    $finish;
426
  end
427
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
428
  $fdisplay(wb_m_mon_log_file_desc, " ");
429
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
430
  $fdisplay(wb_m_mon_log_file_desc, " ");
431
 
432 243 tadejm
  // Reset pulse
433
  wb_rst =  1'b1;
434
  #423 wb_rst =  1'b0;
435
 
436 169 mohor
  // Clear memories
437
  clear_memories;
438 243 tadejm
  clear_buffer_descriptors;
439 169 mohor
 
440
  #423 StartTB  =  1'b1;
441
end
442
 
443
 
444
 
445
// Generating wb_clk clock
446 116 mohor
initial
447
begin
448 169 mohor
  wb_clk=0;
449
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
450 274 tadejm
//  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
451 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
452
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
453 274 tadejm
  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
454 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
455 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
456
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
457
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
458
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
459 116 mohor
end
460
 
461
 
462
 
463 169 mohor
integer      tests_successfull;
464
integer      tests_failed;
465
reg [799:0]  test_name; // used for tb_log_file
466 121 mohor
 
467 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
468
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
469
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
470
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
471
 
472 274 tadejm
reg          wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
473
 
474
 
475 116 mohor
initial
476
begin
477 169 mohor
  wait(StartTB);  // Start of testbench
478
 
479
  // Initial global values
480
  tests_successfull = 0;
481
  tests_failed = 0;
482 274 tadejm
 
483
  wbm_working = 0;
484 169 mohor
 
485
  wbm_init_waits = 4'h1;
486
  wbm_subseq_waits = 4'h3;
487
  wbs_waits = 4'h1;
488
  wbs_retries = 8'h2;
489
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
490
 
491 274 tadejm
  // set DIFFERENT mrx_clk to mtx_clk!
492
//  eth_phy.set_mrx_equal_mtx = 1'b0;
493 169 mohor
 
494
  //  Call tests
495
  //  ----------
496 315 tadejm
    test_access_to_mac_reg(0, 4);           // 0 - 4
497
    test_mii(0, 17);                        // 0 - 17
498 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
499
  eth_phy.carrier_sense_real_delay(0);
500 315 tadejm
//    test_mac_full_duplex_transmit(0, 21);    // 0 - (21)
501
 
502
 
503
//    test_mac_full_duplex_receive(2, 2);     // 0 - 13
504
//    test_mac_full_duplex_flow_control(0, 4);  // 0 - 4
505 274 tadejm
                                              // 4 is executed, everything is OK
506
//    test_mac_half_duplex_flow(0, 0);
507 169 mohor
 
508 243 tadejm
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
509 169 mohor
  eth_phy.carrier_sense_real_delay(1);
510
 
511
 
512
  // Finish test's logs
513
  test_summary;
514
  $display("\n\n END of SIMULATION");
515
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
516
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
517
 
518
  $stop;
519 116 mohor
end
520 169 mohor
 
521 116 mohor
 
522 169 mohor
 
523
//////////////////////////////////////////////////////////////
524
// Test tasks
525
//////////////////////////////////////////////////////////////
526
 
527
task test_access_to_mac_reg;
528
  input  [31:0]  start_task;
529
  input  [31:0]  end_task;
530
  integer        bit_start_1;
531
  integer        bit_end_1;
532
  integer        bit_start_2;
533
  integer        bit_end_2;
534
  integer        num_of_reg;
535
  integer        i_addr;
536
  integer        i_data;
537
  integer        i_length;
538
  integer        tmp_data;
539
  reg    [31:0]  tx_bd_num;
540
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
541
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
542
  integer        i;
543
  integer        i1;
544
  integer        i2;
545
  integer        i3;
546
  integer        fail;
547 178 mohor
  integer        test_num;
548 169 mohor
  reg    [31:0]  addr;
549
  reg    [31:0]  data;
550 315 tadejm
  reg     [3:0]  sel;
551
  reg     [3:0]  rand_sel;
552 169 mohor
  reg    [31:0]  data_max;
553 116 mohor
begin
554 169 mohor
// ACCESS TO MAC REGISTERS TEST
555
test_heading("ACCESS TO MAC REGISTERS TEST");
556
$display(" ");
557
$display("ACCESS TO MAC REGISTERS TEST");
558
fail = 0;
559
 
560 192 tadej
// reset MAC registers
561
hard_reset;
562 169 mohor
 
563 192 tadej
 
564 178 mohor
//////////////////////////////////////////////////////////////////////
565
////                                                              ////
566
////  test_access_to_mac_reg:                                     ////
567
////                                                              ////
568 315 tadejm
////  0: Byte selects on 3 32-bit RW registers.                   ////
569
////  1: Walking 1 with single cycles across MAC regs.            ////
570
////  2: Walking 1 with single cycles across MAC buffer descript. ////
571
////  3: Test max reg. values and reg. values after writing       ////
572 178 mohor
////     inverse reset values and hard reset of the MAC           ////
573 315 tadejm
////  4: Test buffer desc. RAM preserving values after hard reset ////
574 178 mohor
////     of the MAC and resetting the logic                       ////
575
////                                                              ////
576
//////////////////////////////////////////////////////////////////////
577 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
578 169 mohor
begin
579
 
580 178 mohor
  ////////////////////////////////////////////////////////////////////
581
  ////                                                            ////
582 315 tadejm
  ////  Byte selects on 4 32-bit RW registers.                    ////
583 178 mohor
  ////                                                            ////
584
  ////////////////////////////////////////////////////////////////////
585
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
586 194 tadej
  begin
587 315 tadejm
    // TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )
588
    test_name   = "TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )";
589
    `TIME; $display("  TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
590 178 mohor
 
591 194 tadej
    data = 0;
592 315 tadejm
    rand_sel = 0;
593
    sel = 0;
594
    for (i = 1; i <= 3; i = i + 1) // num of active byte selects at each register
595
    begin
596
      wbm_init_waits = 0;
597
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
598
      case (i)
599
      1:       i_addr = `ETH_MAC_ADDR0;
600
      2:       i_addr = `ETH_HASH_ADDR0;
601
      default: i_addr = `ETH_HASH_ADDR1;
602
      endcase
603
      addr = `ETH_BASE + i_addr;
604
      sel = 4'hF;
605
      wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
606
      if (tmp_data !== 32'h0)
607 194 tadej
      begin
608 315 tadejm
        fail = fail + 1;
609
        test_fail_num("Register default value is not ZERO", i_addr);
610
        `TIME;
611
        $display("Register default value is not ZERO - addr %h, tmp_data %h", addr, tmp_data);
612
      end
613
      for (i1 = 0; i1 <= 3; i1 = i1 + 1) // position of first active byte select
614
      begin
615
        case ({i, i1})
616
        10:      sel = 4'b0001; // data = 32'hFFFF_FF00;
617
        11:      sel = 4'b0010; // data = 32'hFFFF_00FF;
618
        12:      sel = 4'b0100; // data = 32'hFF00_FFFF;
619
        13:      sel = 4'b1000; // data = 32'h00FF_FFFF;
620
        20:      sel = 4'b0011; // data = 32'hFFFF_0000;
621
        21:      sel = 4'b0110; // data = 32'hFF00_00FF;
622
        22:      sel = 4'b1100; // data = 32'h0000_FFFF;
623
        23:      sel = 4'b1001; // data = 32'h00FF_FF00;
624
        30:      sel = 4'b0111; // data = 32'hFF00_0000;
625
        31:      sel = 4'b1110; // data = 32'h0000_00FF;
626
        32:      sel = 4'b1101; // data = 32'h0000_FF00;
627
        default: sel = 4'b1011; // data = 32'h00FF_0000;
628
        endcase
629
        // set value to 32'hFFFF_FFFF
630
        data = 32'hFFFF_FFFF;
631
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
632
        wait (wbm_working == 0);
633
        wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
634
        if (tmp_data !== data)
635
        begin
636
          fail = fail + 1;
637
          test_fail_num("Register could not be written to FFFF_FFFF", i_addr);
638
          `TIME;
639
          $display("Register could not be written to FFFF_FFFF - addr %h, tmp_data %h", addr, tmp_data);
640
        end
641
        // write appropriate byte(s) to 0
642
        data = 32'h0;
643
        wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
644
        wait (wbm_working == 0);
645
        if (i1[0])
646
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
647
        else
648
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
649
        data = {({8{~sel[3]}}), ({8{~sel[2]}}), ({8{~sel[1]}}), ({8{~sel[0]}})};
650
        if (tmp_data !== data)
651
        begin
652
          fail = fail + 1;
653
          test_fail_num("Wrong data read out form register", i_addr);
654
          `TIME;
655
          $display("Wrong data read out from register - addr %h, data %h, tmp_data %h, sel %b",
656
                   addr, data, tmp_data, sel);
657
        end
658
      end
659
    end
660
    if(fail == 0)
661
      test_ok;
662
    else
663
      fail = 0;    // Errors were reported previously
664
  end
665
 
666
 
667
  ////////////////////////////////////////////////////////////////////
668
  ////                                                            ////
669
  ////  Walking 1 with single cycles across MAC regs.             ////
670
  ////                                                            ////
671
  ////////////////////////////////////////////////////////////////////
672
  if (test_num == 1) // Walking 1 with single cycles across MAC regs.
673
  begin
674
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
675
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
676
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
677
 
678
    data = 0;
679
    rand_sel = 0;
680
    sel = 0;
681
    for (i_addr = 0; i_addr <= {22'h0, `ETH_TX_CTRL_ADR, 2'h0}; i_addr = i_addr + 4) // register address
682
    begin
683
      if (i_addr[6:4] < 5)
684
        wbm_init_waits = i_addr[6:4];
685
      else
686
        wbm_init_waits = 4;
687
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
688
      addr = `ETH_BASE + i_addr;
689
      // set ranges of R/W bits
690
      case (addr)
691
      `ETH_MODER:
692
      begin
693
        bit_start_1 = 0;
694
        bit_end_1   = 16;
695
        bit_start_2 = 32; // not used
696
        bit_end_2   = 32; // not used
697
      end
698
      `ETH_INT: // READONLY - tested within INT test
699
      begin
700
        bit_start_1 = 32; // not used
701
        bit_end_1   = 32; // not used
702
        bit_start_2 = 32; // not used
703
        bit_end_2   = 32; // not used
704
      end
705
      `ETH_INT_MASK:
706
      begin
707
        bit_start_1 = 0;
708
        bit_end_1   = 6;
709
        bit_start_2 = 32; // not used
710
        bit_end_2   = 32; // not used
711
      end
712
      `ETH_IPGT:
713
      begin
714
        bit_start_1 = 0;
715
        bit_end_1   = 6;
716
        bit_start_2 = 32; // not used
717
        bit_end_2   = 32; // not used
718
      end
719
      `ETH_IPGR1:
720
      begin
721
        bit_start_1 = 0;
722
        bit_end_1   = 6;
723
        bit_start_2 = 32; // not used
724
        bit_end_2   = 32; // not used
725
      end
726
      `ETH_IPGR2:
727
      begin
728
        bit_start_1 = 0;
729
        bit_end_1   = 6;
730
        bit_start_2 = 32; // not used
731
        bit_end_2   = 32; // not used
732
      end
733
      `ETH_PACKETLEN:
734
      begin
735
        bit_start_1 = 0;
736
        bit_end_1   = 31;
737
        bit_start_2 = 32; // not used
738
        bit_end_2   = 32; // not used
739
      end
740
      `ETH_COLLCONF:
741
      begin
742
        bit_start_1 = 0;
743
        bit_end_1   = 5;
744
        bit_start_2 = 16;
745
        bit_end_2   = 19;
746
      end
747
      `ETH_TX_BD_NUM:
748
      begin
749
        bit_start_1 = 0;
750
        bit_end_1   = 7;
751
        bit_start_2 = 32; // not used
752
        bit_end_2   = 32; // not used
753
      end
754
      `ETH_CTRLMODER:
755
      begin
756
        bit_start_1 = 0;
757
        bit_end_1   = 2;
758
        bit_start_2 = 32; // not used
759
        bit_end_2   = 32; // not used
760
      end
761
      `ETH_MIIMODER:
762
      begin
763
        bit_start_1 = 0;
764
        bit_end_1   = 8;
765
        bit_start_2 = 32; // not used
766
        bit_end_2   = 32; // not used
767
      end
768
      `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
769
      begin
770
        bit_start_1 = 32; // not used
771
        bit_end_1   = 32; // not used
772
        bit_start_2 = 32; // not used
773
        bit_end_2   = 32; // not used
774
      end
775
      `ETH_MIIADDRESS:
776
      begin
777
        bit_start_1 = 0;
778
        bit_end_1   = 4;
779
        bit_start_2 = 8;
780
        bit_end_2   = 12;
781
      end
782
      `ETH_MIITX_DATA:
783
      begin
784
        bit_start_1 = 0;
785
        bit_end_1   = 15;
786
        bit_start_2 = 32; // not used
787
        bit_end_2   = 32; // not used
788
      end
789
      `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
790
      begin
791
        bit_start_1 = 32; // not used
792
        bit_end_1   = 32; // not used
793
        bit_start_2 = 32; // not used
794
        bit_end_2   = 32; // not used
795
      end
796
      `ETH_MIISTATUS: // READONLY - tested within MIIM test
797
      begin
798
        bit_start_1 = 32; // not used
799
        bit_end_1   = 32; // not used
800
        bit_start_2 = 32; // not used
801
        bit_end_2   = 32; // not used
802
      end
803
      `ETH_MAC_ADDR0:
804
      begin
805
        bit_start_1 = 0;
806
        bit_end_1   = 31;
807
        bit_start_2 = 32; // not used
808
        bit_end_2   = 32; // not used
809
      end
810
      `ETH_MAC_ADDR1:
811
      begin
812
        bit_start_1 = 0;
813
        bit_end_1   = 15;
814
        bit_start_2 = 32; // not used
815
        bit_end_2   = 32; // not used
816
      end
817
      `ETH_HASH_ADDR0:
818
      begin
819
        bit_start_1 = 0;
820
        bit_end_1   = 31;
821
        bit_start_2 = 32; // not used
822
        bit_end_2   = 32; // not used
823
      end
824
      `ETH_HASH_ADDR1:
825
      begin
826
        bit_start_1 = 0;
827
        bit_end_1   = 31;
828
        bit_start_2 = 32; // not used
829
        bit_end_2   = 32; // not used
830
      end
831
      default: // `ETH_TX_CTRL_ADR:
832
      begin
833
        bit_start_1 = 0;
834
        bit_end_1   = 16;
835
        bit_start_2 = 32; // not used
836
        bit_end_2   = 32; // not used
837
      end
838
      endcase
839
 
840
      for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
841
      begin
842
        data = 1'b1 << i_data;
843
        if ( (addr == `ETH_MIICOMMAND)/* && (i_data <= 2)*/ ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
844
          ;
845
        else
846
        begin
847
          rand_sel[2:0] = {$random} % 8;
848
          if ((i_data >= 0) && (i_data < 8))
849
            sel = {rand_sel[2:0], 1'b1};
850
          else if ((i_data >= 8) && (i_data < 16))
851
            sel = {rand_sel[2:1], 1'b1, rand_sel[0]};
852
          else if ((i_data >= 16) && (i_data < 24))
853
            sel = {rand_sel[2], 1'b1, rand_sel[1:0]};
854
          else // if ((i_data >= 24) && (i_data < 32))
855
            sel = {1'b1, rand_sel[2:0]};
856
          wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
857
          wait (wbm_working == 0);
858
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
859
          if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
860
               ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
861 194 tadej
          begin
862 315 tadejm
            if ( ((tmp_data[31:24] !== data[31:24]) && sel[3]) || ((tmp_data[23:16] !== data[23:16]) && sel[2]) ||
863
                 ((tmp_data[15: 8] !== data[15: 8]) && sel[1]) || ((tmp_data[ 7: 0] !== data[ 7: 0]) && sel[0]) )
864
            begin
865
              fail = fail + 1;
866
              test_fail_num("RW bit of the MAC register was not written or not read", i_addr);
867
              `TIME;
868
              $display("Wrong RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
869
                        wbm_init_waits, addr, data, tmp_data, sel);
870
            end
871 194 tadej
          end
872 315 tadejm
          else // data should not be equal to tmp_data
873
          begin
874
            if ( ((tmp_data[31:24] === data[31:24]) && sel[3]) && ((tmp_data[23:16] === data[23:16]) && sel[2]) &&
875
                 ((tmp_data[15: 8] === data[15: 8]) && sel[1]) && ((tmp_data[ 7: 0] === data[ 7: 0]) && sel[0]) )
876
            begin
877
              fail = fail + 1;
878
              test_fail_num("NON RW bit of the MAC register was written, but it shouldn't be", i_addr);
879
              `TIME;
880
              $display("Wrong NON RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
881
                        wbm_init_waits, addr, data, tmp_data, sel);
882
            end
883
          end
884
        end
885 194 tadej
      end
886 315 tadejm
    end
887 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
888 315 tadejm
    $display("    ->registers tested with 0, 1, 2, 3 and 4 bus delay cycles");
889 194 tadej
    if(fail == 0)
890
      test_ok;
891
    else
892
      fail = 0;    // Errors were reported previously
893
  end
894 178 mohor
 
895
 
896
  ////////////////////////////////////////////////////////////////////
897
  ////                                                            ////
898
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
899
  ////                                                            ////
900
  ////////////////////////////////////////////////////////////////////
901 315 tadejm
  if (test_num == 2) // Start Walking 1 with single cycles across MAC buffer descript.
902 169 mohor
  begin
903 315 tadejm
    // TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
904
    test_name   = "TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
905
    `TIME; $display("  TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
906 178 mohor
 
907
    data = 0;
908 315 tadejm
    rand_sel = 0;
909
    sel = 0;
910 178 mohor
    // set TX and RX buffer descriptors
911
    tx_bd_num = 32'h40;
912
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
913 315 tadejm
    for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
914 178 mohor
    begin
915 315 tadejm
      if (i_addr[11:8] < 8)
916
        wbm_init_waits = i_addr[10:8] - 3'h4;
917
      else
918
        wbm_init_waits = 3;
919 169 mohor
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
920 315 tadejm
      addr = `ETH_BASE + i_addr;
921
      if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
922 169 mohor
      begin
923 315 tadejm
        // set ranges of R/W bits
924
        case (addr[3])
925
          1'b0: // buffer control bits
926
          begin
927
            bit_start_1 = 0;
928
            bit_end_1   = 31; // 8;
929
            bit_start_2 = 11;
930
            bit_end_2   = 31;
931
          end
932
          default: // 1'b1: // buffer pointer
933
          begin
934
            bit_start_1 = 0;
935
            bit_end_1   = 31;
936
            bit_start_2 = 32; // not used
937
            bit_end_2   = 32; // not used
938
          end
939
        endcase
940
      end
941
      else // RX buffer descriptors
942
      begin
943
        // set ranges of R/W bits
944
        case (addr[3])
945
          1'b0: // buffer control bits
946
          begin
947
            bit_start_1 = 0;
948
            bit_end_1   = 31; // 7;
949
            bit_start_2 = 13;
950
            bit_end_2   = 31;
951
          end
952
          default: // 1'b1: // buffer pointer
953
          begin
954
            bit_start_1 = 0;
955
            bit_end_1   = 31;
956
            bit_start_2 = 32; // not used
957
            bit_end_2   = 32; // not used
958
          end
959
        endcase
960
      end
961
 
962
      for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
963
      begin
964
        data = 1'b1 << i_data;
965
        if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
966
          ;
967
        else
968 178 mohor
        begin
969 315 tadejm
          rand_sel[2:0] = {$random} % 8;
970
          if ((i_data >= 0) && (i_data < 8))
971
            sel = {rand_sel[2:0], 1'b1};
972
          else if ((i_data >= 8) && (i_data < 16))
973
            sel = {rand_sel[2:1], 1'b1, rand_sel[0]};
974
          else if ((i_data >= 16) && (i_data < 24))
975
            sel = {rand_sel[2], 1'b1, rand_sel[1:0]};
976
          else // if ((i_data >= 24) && (i_data < 32))
977
            sel = {1'b1, rand_sel[2:0]};
978
          wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
979
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
980
          if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
981
               ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
982
          begin
983
            if ( ((tmp_data[31:24] !== data[31:24]) && sel[3]) || ((tmp_data[23:16] !== data[23:16]) && sel[2]) ||
984
                 ((tmp_data[15: 8] !== data[15: 8]) && sel[1]) || ((tmp_data[ 7: 0] !== data[ 7: 0]) && sel[0]) )
985 178 mohor
            begin
986 315 tadejm
              fail = fail + 1;
987
              test_fail("RW bit of the MAC buffer descriptors was not written or not read");
988
              `TIME;
989
              $display("Wrong RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
990
                        wbm_init_waits, addr, data, tmp_data, sel);
991 178 mohor
            end
992 315 tadejm
          end
993
          else // data should not be equal to tmp_data
994 169 mohor
          begin
995 315 tadejm
            if ( ((tmp_data[31:24] === data[31:24]) && sel[3]) && ((tmp_data[23:16] === data[23:16]) && sel[2]) &&
996
                 ((tmp_data[15: 8] === data[15: 8]) && sel[1]) && ((tmp_data[ 7: 0] === data[ 7: 0]) && sel[0]) )
997 169 mohor
            begin
998 315 tadejm
              fail = fail + 1;
999
              test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
1000
              `TIME;
1001
              $display("Wrong NON RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
1002
                        wbm_init_waits, addr, data, tmp_data, sel);
1003 169 mohor
            end
1004
          end
1005
        end
1006
      end
1007 178 mohor
      // INTERMEDIATE DISPLAYS
1008 315 tadejm
      if (i_addr[11:0] == 12'h500)
1009
        $display("    ->buffer descriptors tested with 0 bus delay");
1010
      else if (i_addr[11:0] == 12'h600)
1011
        $display("    ->buffer descriptors tested with 1 bus delay cycle");
1012
      else if (i_addr[11:0] == 12'h700)
1013
        $display("    ->buffer descriptors tested with 2 bus delay cycles");
1014 178 mohor
    end
1015 315 tadejm
    $display("    ->buffer descriptors tested with 3 bus delay cycles");
1016 178 mohor
    if(fail == 0)
1017
      test_ok;
1018
    else
1019
      fail = 0;
1020 169 mohor
  end
1021 178 mohor
 
1022
 
1023
  ////////////////////////////////////////////////////////////////////
1024
  ////                                                            ////
1025
  ////  Test max reg. values and reg. values after writing        ////
1026
  ////  inverse reset values and hard reset of the MAC            ////
1027
  ////                                                            ////
1028
  ////////////////////////////////////////////////////////////////////
1029 315 tadejm
  if (test_num == 3) // Start this task
1030 169 mohor
  begin
1031 315 tadejm
    // TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
1032 178 mohor
    test_name   =
1033 315 tadejm
      "TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
1034 178 mohor
    `TIME; $display(
1035 315 tadejm
      "  TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
1036 178 mohor
 
1037
    // reset MAC registers
1038
    hard_reset;
1039
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
1040 169 mohor
    begin
1041 315 tadejm
      for (i_addr = 0; i_addr <= {22'h0, `ETH_TX_CTRL_ADR, 2'h0}; i_addr = i_addr + 4) // register address
1042 169 mohor
      begin
1043 178 mohor
        addr = `ETH_BASE + i_addr;
1044
        // set ranges of R/W bits
1045
        case (addr)
1046 315 tadejm
        `ETH_MODER:
1047
        begin
1048
          data = 32'h0000_A000; // bit 11 not used any more
1049
          data_max = 32'h0001_FFFF;
1050
        end
1051
        `ETH_INT: // READONLY - tested within INT test
1052
        begin
1053
          data = 32'h0000_0000;
1054
          data_max = 32'h0000_0000;
1055
        end
1056
        `ETH_INT_MASK:
1057
        begin
1058
          data = 32'h0000_0000;
1059
          data_max = 32'h0000_007F;
1060
        end
1061
        `ETH_IPGT:
1062
        begin
1063
          data = 32'h0000_0012;
1064
          data_max = 32'h0000_007F;
1065
        end
1066
        `ETH_IPGR1:
1067
        begin
1068
          data = 32'h0000_000C;
1069
          data_max = 32'h0000_007F;
1070
        end
1071
        `ETH_IPGR2:
1072
        begin
1073
          data = 32'h0000_0012;
1074
          data_max = 32'h0000_007F;
1075
        end
1076
        `ETH_PACKETLEN:
1077
        begin
1078
          data = 32'h0040_0600;
1079
          data_max = 32'hFFFF_FFFF;
1080
        end
1081
        `ETH_COLLCONF:
1082
        begin
1083
          data = 32'h000F_003F;
1084
          data_max = 32'h000F_003F;
1085
        end
1086
        `ETH_TX_BD_NUM:
1087
        begin
1088
          data = 32'h0000_0040;
1089
          data_max = 32'h0000_0080;
1090
        end
1091
        `ETH_CTRLMODER:
1092
        begin
1093
          data = 32'h0000_0000;
1094
          data_max = 32'h0000_0007;
1095
        end
1096
        `ETH_MIIMODER:
1097
        begin
1098
          data = 32'h0000_0064;
1099
          data_max = 32'h0000_01FF;
1100
        end
1101
        `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1102
        begin
1103
          data = 32'h0000_0000;
1104
          data_max = 32'h0000_0000;
1105
        end
1106
        `ETH_MIIADDRESS:
1107
        begin
1108
          data = 32'h0000_0000;
1109
          data_max = 32'h0000_1F1F;
1110
        end
1111
        `ETH_MIITX_DATA:
1112
        begin
1113
          data = 32'h0000_0000;
1114
          data_max = 32'h0000_FFFF;
1115
        end
1116
        `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1117
        begin
1118
          data = 32'h0000_0000;
1119
          data_max = 32'h0000_0000;
1120
        end
1121
        `ETH_MIISTATUS: // READONLY - tested within MIIM test
1122
        begin
1123
          data = 32'h0000_0000;
1124
          data_max = 32'h0000_0000;
1125
        end
1126
        `ETH_MAC_ADDR0:
1127
        begin
1128
          data = 32'h0000_0000;
1129
          data_max = 32'hFFFF_FFFF;
1130
        end
1131
        `ETH_MAC_ADDR1:
1132
        begin
1133
          data = 32'h0000_0000;
1134
          data_max = 32'h0000_FFFF;
1135
        end
1136
        `ETH_HASH_ADDR0:
1137
        begin
1138
          data = 32'h0000_0000;
1139
          data_max = 32'hFFFF_FFFF;
1140
        end
1141
        `ETH_HASH_ADDR1:
1142
        begin
1143
          data = 32'h0000_0000;
1144
          data_max = 32'hFFFF_FFFF;
1145
        end
1146
        default: // `ETH_TX_CTRL_ADR:
1147
        begin
1148
          data = 32'h0000_0000;
1149
          data_max = 32'h0000_FFFF;
1150
        end
1151 169 mohor
        endcase
1152 178 mohor
 
1153
        wbm_init_waits = {$random} % 3;
1154
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1155
        if (i == 0)
1156 274 tadejm
        begin
1157 315 tadejm
          if (addr == `ETH_MIICOMMAND) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1158
            ;
1159
          else
1160 178 mohor
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1161 274 tadejm
        end
1162 178 mohor
        else if (i == 2)
1163 274 tadejm
        begin
1164 315 tadejm
          if (addr == `ETH_MIICOMMAND) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1165
            ;
1166
          else
1167 178 mohor
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1168 274 tadejm
        end
1169 178 mohor
        else if ((i == 1) || (i == 4))
1170 169 mohor
        begin
1171 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1172
          if (tmp_data !== data)
1173
          begin
1174
            fail = fail + 1;
1175
            test_fail("RESET value of the MAC register is not correct");
1176
            `TIME;
1177
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1178
          end
1179 169 mohor
        end
1180 178 mohor
        else // check maximum values
1181 169 mohor
        begin
1182
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1183 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
1184 169 mohor
          begin
1185
            if (tmp_data !== data)
1186
            begin
1187
              fail = fail + 1;
1188 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1189 169 mohor
              `TIME;
1190 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1191 169 mohor
            end
1192 178 mohor
            // try maximum (80)
1193
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1194
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1195
            if (tmp_data !== data_max)
1196
            begin
1197
              fail = fail + 1;
1198
              test_fail("MAX value of the TX_BD_NUM register is not correct");
1199
              `TIME;
1200
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1201
            end
1202
            // try one less than maximum (80)
1203
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1204
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1205
            if (tmp_data !== (data_max - 1))
1206
            begin
1207
              fail = fail + 1;
1208
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1209
              `TIME;
1210
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1211
            end
1212
            // try one more than maximum (80)
1213
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1214
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1215
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1216
            begin
1217
              fail = fail + 1;
1218
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1219
              `TIME;
1220
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1221
            end
1222 169 mohor
          end
1223 178 mohor
          else
1224 169 mohor
          begin
1225 178 mohor
            if (tmp_data !== data_max)
1226 169 mohor
            begin
1227
              fail = fail + 1;
1228 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1229 169 mohor
              `TIME;
1230 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1231 169 mohor
            end
1232
          end
1233
        end
1234
      end
1235 178 mohor
      // reset MAC registers
1236
      if ((i == 0) || (i == 3))
1237
        hard_reset;
1238 169 mohor
    end
1239 178 mohor
    if(fail == 0)
1240
      test_ok;
1241
    else
1242
      fail = 0;
1243 169 mohor
  end
1244 116 mohor
 
1245 156 mohor
 
1246 181 mohor
  ////////////////////////////////////////////////////////////////////
1247
  ////                                                            ////
1248
  ////  Test buffer desc. ram preserving values after hard reset  ////
1249
  ////  of the mac and reseting the logic                         ////
1250
  ////                                                            ////
1251
  ////////////////////////////////////////////////////////////////////
1252 315 tadejm
  if (test_num == 4) // Start this task
1253 169 mohor
  begin
1254 315 tadejm
    // TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1255
    test_name   = "TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1256 178 mohor
    `TIME;
1257 315 tadejm
    $display("  TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1258 178 mohor
 
1259
    // reset MAC registers
1260
    hard_reset;
1261
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1262 169 mohor
    begin
1263 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1264 169 mohor
      begin
1265 178 mohor
        addr = `ETH_BASE + i_addr;
1266
 
1267
        wbm_init_waits = {$random} % 3;
1268
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1269
        if (i == 0)
1270 169 mohor
        begin
1271 178 mohor
          data = 32'hFFFFFFFF;
1272
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1273 169 mohor
        end
1274 178 mohor
        else if (i == 2)
1275 169 mohor
        begin
1276 178 mohor
          data = 32'h00000000;
1277
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1278 169 mohor
        end
1279
        else
1280
        begin
1281 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1282
          if (tmp_data !== data)
1283 169 mohor
          begin
1284
            fail = fail + 1;
1285 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1286 169 mohor
            `TIME;
1287 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1288 169 mohor
          end
1289
        end
1290
      end
1291 178 mohor
      if ((i == 0) || (i == 2))
1292
      begin
1293
        // reset MAC registers
1294
        hard_reset;
1295
      end
1296 169 mohor
    end
1297 178 mohor
    if(fail == 0)
1298
      test_ok;
1299
    else
1300
    fail = 0;
1301 169 mohor
  end
1302 116 mohor
 
1303
 
1304 315 tadejm
  if (test_num == 5) // Start this task
1305 169 mohor
  begin
1306 315 tadejm
        /*  // TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1307
          test_name   = "TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1308
          `TIME; $display("  TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1309 178 mohor
 
1310
          data = 0;
1311
          burst_data = 0;
1312
          burst_tmp_data = 0;
1313
          i_length = 10; // two bursts for length 20
1314
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1315
          begin
1316
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1317
            begin
1318
              wbm_init_waits = i;
1319
              wbm_subseq_waits = i1;
1320
              #1;
1321
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1322
              begin
1323
                data = 1'b1 << i_data;
1324
                #1;
1325
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1326
                begin
1327
                  burst_data = burst_data << 32;
1328
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1329
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1330
                  begin
1331
                    #1 burst_data[31:0] = 0;
1332
                  end
1333
                  else
1334
                  begin
1335
                    #1 burst_data[31:0] = data;
1336
                  end
1337
                end
1338
                #1;
1339
                // 2 burst writes
1340
                addr = `ETH_BASE; // address of a first burst
1341
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1342
                burst_tmp_data = burst_data >> (32 * i_length);
1343
                addr = addr + 32'h28; // address of a second burst
1344
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1345
                #1;
1346
                // 2 burst reads
1347
                addr = `ETH_BASE; // address of a first burst
1348
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1349
                         wbm_init_waits, wbm_subseq_waits); // first burst
1350
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1351
                addr = addr + 32'h28; // address of a second burst
1352
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1353
                         wbm_init_waits, wbm_subseq_waits); // second burst
1354
                #1;
1355
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1356
                begin
1357
                  // set ranges of R/W bits
1358
                  case (`ETH_BASE + i2)
1359
                  `ETH_MODER:
1360
                    begin
1361
                      bit_start_1 = 0;
1362
                      bit_end_1   = 16;
1363
                      bit_start_2 = 32; // not used
1364
                      bit_end_2   = 32; // not used
1365
                    end
1366
                  `ETH_INT: // READONLY - tested within INT test
1367
                    begin
1368
                      bit_start_1 = 32; // not used
1369
                      bit_end_1   = 32; // not used
1370
                      bit_start_2 = 32; // not used
1371
                      bit_end_2   = 32; // not used
1372
                    end
1373
                  `ETH_INT_MASK:
1374
                    begin
1375
                      bit_start_1 = 0;
1376
                      bit_end_1   = 6;
1377
                      bit_start_2 = 32; // not used
1378
                      bit_end_2   = 32; // not used
1379
                    end
1380
                  `ETH_IPGT:
1381
                    begin
1382
                      bit_start_1 = 0;
1383
                      bit_end_1   = 6;
1384
                      bit_start_2 = 32; // not used
1385
                      bit_end_2   = 32; // not used
1386
                    end
1387
                  `ETH_IPGR1:
1388
                    begin
1389
                      bit_start_1 = 0;
1390
                      bit_end_1   = 6;
1391
                      bit_start_2 = 32; // not used
1392
                      bit_end_2   = 32; // not used
1393
                    end
1394
                  `ETH_IPGR2:
1395
                    begin
1396
                      bit_start_1 = 0;
1397
                      bit_end_1   = 6;
1398
                      bit_start_2 = 32; // not used
1399
                      bit_end_2   = 32; // not used
1400
                    end
1401
                  `ETH_PACKETLEN:
1402
                    begin
1403
                      bit_start_1 = 0;
1404
                      bit_end_1   = 31;
1405
                      bit_start_2 = 32; // not used
1406
                      bit_end_2   = 32; // not used
1407
                    end
1408
                  `ETH_COLLCONF:
1409
                    begin
1410
                      bit_start_1 = 0;
1411
                      bit_end_1   = 5;
1412
                      bit_start_2 = 16;
1413
                      bit_end_2   = 19;
1414
                    end
1415
                  `ETH_TX_BD_NUM:
1416
                    begin
1417
                      bit_start_1 = 0;
1418
                      bit_end_1   = 7;
1419
                      bit_start_2 = 32; // not used
1420
                      bit_end_2   = 32; // not used
1421
                    end
1422
                  `ETH_CTRLMODER:
1423
                    begin
1424
                      bit_start_1 = 0;
1425
                      bit_end_1   = 2;
1426
                      bit_start_2 = 32; // not used
1427
                      bit_end_2   = 32; // not used
1428
                    end
1429
                  `ETH_MIIMODER:
1430
                    begin
1431
                      bit_start_1 = 0;
1432
                      bit_end_1   = 9;
1433
                      bit_start_2 = 32; // not used
1434
                      bit_end_2   = 32; // not used
1435
                    end
1436
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1437
                    begin
1438
                      bit_start_1 = 32; // not used
1439
                      bit_end_1   = 32; // not used
1440
                      bit_start_2 = 32; // not used
1441
                      bit_end_2   = 32; // not used
1442
                    end
1443
                  `ETH_MIIADDRESS:
1444
                    begin
1445
                      bit_start_1 = 0;
1446
                      bit_end_1   = 4;
1447
                      bit_start_2 = 8;
1448
                      bit_end_2   = 12;
1449
                    end
1450
                  `ETH_MIITX_DATA:
1451
                    begin
1452
                      bit_start_1 = 0;
1453
                      bit_end_1   = 15;
1454
                      bit_start_2 = 32; // not used
1455
                      bit_end_2   = 32; // not used
1456
                    end
1457
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1458
                    begin
1459
                      bit_start_1 = 32; // not used
1460
                      bit_end_1   = 32; // not used
1461
                      bit_start_2 = 32; // not used
1462
                      bit_end_2   = 32; // not used
1463
                    end
1464
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1465
                    begin
1466
                      bit_start_1 = 32; // not used
1467
                      bit_end_1   = 32; // not used
1468
                      bit_start_2 = 32; // not used
1469
                      bit_end_2   = 32; // not used
1470
                    end
1471
                  `ETH_MAC_ADDR0:
1472
                    begin
1473
                      bit_start_1 = 0;
1474
                      bit_end_1   = 31;
1475
                      bit_start_2 = 32; // not used
1476
                      bit_end_2   = 32; // not used
1477
                    end
1478
                  `ETH_MAC_ADDR1:
1479
                    begin
1480
                      bit_start_1 = 0;
1481
                      bit_end_1   = 15;
1482
                      bit_start_2 = 32; // not used
1483
                      bit_end_2   = 32; // not used
1484
                    end
1485
                  `ETH_HASH_ADDR0:
1486
                    begin
1487
                      bit_start_1 = 0;
1488
                      bit_end_1   = 31;
1489
                      bit_start_2 = 32; // not used
1490
                      bit_end_2   = 32; // not used
1491
                    end
1492
                  default: // `ETH_HASH_ADDR1:
1493
                    begin
1494
                      bit_start_1 = 0;
1495
                      bit_end_1   = 31;
1496
                      bit_start_2 = 32; // not used
1497
                      bit_end_2   = 32; // not used
1498
                    end
1499
                  endcase
1500
                  #1;
1501
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1502
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1503
                  begin
1504
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1505
                    begin
1506
                      fail = fail + 1;
1507
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1508
                      `TIME;
1509
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1510
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1511
                    end
1512
                  end
1513
                  else
1514
                  begin
1515
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1516
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1517
                    begin
1518
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1519
                      begin
1520
                        fail = fail + 1;
1521
                        test_fail("RW bit of the MAC register was not written or not read");
1522
                        `TIME;
1523
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1524
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1525
                      end
1526
                    end
1527
                    else // data should not be equal to tmp_data
1528
                    begin
1529
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1530
                      begin
1531
                        fail = fail + 1;
1532
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1533
                        `TIME;
1534
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1535
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1536
                      end
1537
                    end
1538
                  end
1539
                  burst_tmp_data = burst_tmp_data >> 32;
1540
                  burst_data = burst_data >> 32;
1541
                end
1542
              end
1543
            end
1544
          end
1545
          if(fail == 0)
1546
            test_ok;
1547
          else
1548
            fail = 0;*/
1549
  end
1550 116 mohor
 
1551 169 mohor
end
1552 156 mohor
 
1553 169 mohor
end
1554
endtask // test_access_to_mac_reg
1555 156 mohor
 
1556
 
1557 169 mohor
task test_mii;
1558
  input  [31:0]  start_task;
1559
  input  [31:0]  end_task;
1560
  integer        i;
1561
  integer        i1;
1562
  integer        i2;
1563
  integer        i3;
1564
  integer        cnt;
1565
  integer        fail;
1566 181 mohor
  integer        test_num;
1567 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1568
  reg     [4:0]  phy_addr;
1569
  reg     [4:0]  reg_addr;
1570
  reg     [15:0] phy_data;
1571
  reg     [15:0] tmp_data;
1572
begin
1573
// MIIM MODULE TEST
1574
test_heading("MIIM MODULE TEST");
1575
$display(" ");
1576
$display("MIIM MODULE TEST");
1577
fail = 0;
1578 156 mohor
 
1579 192 tadej
// reset MAC registers
1580
hard_reset;
1581 116 mohor
 
1582 194 tadej
 
1583 181 mohor
//////////////////////////////////////////////////////////////////////
1584
////                                                              ////
1585
////  test_mii:                                                   ////
1586
////                                                              ////
1587
////  0:  Test clock divider of mii management module with all    ////
1588
////      possible frequences.                                    ////
1589
////  1:  Test various readings from 'real' phy registers.        ////
1590
////  2:  Test various writings to 'real' phy registers (control  ////
1591
////      and non writable registers)                             ////
1592
////  3:  Test reset phy through mii management module            ////
1593
////  4:  Test 'walking one' across phy address (with and without ////
1594
////      preamble)                                               ////
1595
////  5:  Test 'walking one' across phy's register address (with  ////
1596
////      and without preamble)                                   ////
1597
////  6:  Test 'walking one' across phy's data (with and without  ////
1598
////      preamble)                                               ////
1599
////  7:  Test reading from phy with wrong phy address (host      ////
1600
////      reading high 'z' data)                                  ////
1601
////  8:  Test writing to phy with wrong phy address and reading  ////
1602
////      from correct one                                        ////
1603
////  9:  Test sliding stop scan command immediately after read   ////
1604
////      request (with and without preamble)                     ////
1605
//// 10:  Test sliding stop scan command immediately after write  ////
1606
////      request (with and without preamble)                     ////
1607
//// 11:  Test busy and nvalid status durations during write      ////
1608
////      (with and without preamble)                             ////
1609
//// 12:  Test busy and nvalid status durations during write      ////
1610
////      (with and without preamble)                             ////
1611
//// 13:  Test busy and nvalid status durations during scan (with ////
1612
////      and without preamble)                                   ////
1613
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1614
////      (with and without preamble)                             ////
1615
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1616
////      (with and without preamble)                             ////
1617
//// 16:  Test sliding stop scan command immediately after scan   ////
1618
////      request (with and without preamble)                     ////
1619
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1620
////      without preamble)                                       ////
1621
////                                                              ////
1622
//////////////////////////////////////////////////////////////////////
1623 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1624 169 mohor
begin
1625 194 tadej
 
1626 181 mohor
  ////////////////////////////////////////////////////////////////////
1627
  ////                                                            ////
1628
  ////  Test clock divider of mii management module with all      ////
1629
  ////  possible frequences.                                      ////
1630
  ////                                                            ////
1631
  ////////////////////////////////////////////////////////////////////
1632
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1633 169 mohor
  begin
1634 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1635
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1636
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1637 181 mohor
 
1638
    wait(Mdc_O); // wait for MII clock to be 1
1639
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1640
    begin
1641
      i1 = 0;
1642
      i2 = 0;
1643
      #Tp mii_set_clk_div(clk_div[7:0]);
1644
      @(posedge Mdc_O);
1645
      #Tp;
1646
      fork
1647 169 mohor
        begin
1648 181 mohor
          @(posedge Mdc_O);
1649 169 mohor
          #Tp;
1650 181 mohor
          disable count_i1;
1651
          disable count_i2;
1652 169 mohor
        end
1653 181 mohor
        begin: count_i1
1654
          forever
1655
          begin
1656
            @(posedge wb_clk);
1657
            i1 = i1 + 1;
1658
            #Tp;
1659
          end
1660
        end
1661
        begin: count_i2
1662
          forever
1663
          begin
1664
            @(negedge wb_clk);
1665
            i2 = i2 + 1;
1666
            #Tp;
1667
          end
1668
        end
1669
      join
1670
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1671
      begin
1672
        if((i1 == i2) && (i1 == 2))
1673 169 mohor
        begin
1674
        end
1675 181 mohor
        else
1676
        begin
1677
          fail = fail + 1;
1678 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1679 181 mohor
        end
1680 169 mohor
      end
1681
      else
1682
      begin
1683 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1684
        begin
1685
        end
1686
        else
1687
        begin
1688
          fail = fail + 1;
1689
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1690
        end
1691 169 mohor
      end
1692
    end
1693 181 mohor
    if(fail == 0)
1694
      test_ok;
1695 169 mohor
    else
1696 181 mohor
      fail = 0;
1697
  end
1698
 
1699
 
1700
  ////////////////////////////////////////////////////////////////////
1701
  ////                                                            ////
1702
  ////  Test various readings from 'real' phy registers.          ////
1703
  ////                                                            ////
1704
  ////////////////////////////////////////////////////////////////////
1705
  if (test_num == 1) // Test various readings from 'real' phy registers.
1706
  begin
1707 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1708
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1709
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1710 181 mohor
 
1711
    // set the fastest possible MII
1712
    clk_div = 0;
1713
    mii_set_clk_div(clk_div[7:0]);
1714
    // set address
1715
    reg_addr = 5'h1F;
1716
    phy_addr = 5'h1;
1717
    while(reg_addr >= 5'h4)
1718 169 mohor
    begin
1719 181 mohor
      // read request
1720
      #Tp mii_read_req(phy_addr, reg_addr);
1721
      check_mii_busy; // wait for read to finish
1722
      // read data
1723 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1724 181 mohor
      if (phy_data !== 16'hDEAD)
1725 169 mohor
      begin
1726 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1727
        fail = fail + 1;
1728 169 mohor
      end
1729 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1730
        reg_addr = 5'h3;
1731 169 mohor
      else
1732 181 mohor
        reg_addr = reg_addr - 5'h9;
1733 169 mohor
    end
1734 181 mohor
 
1735
    // set address
1736
    reg_addr = 5'h3;
1737
    // read request
1738
    #Tp mii_read_req(phy_addr, reg_addr);
1739
    check_mii_busy; // wait for read to finish
1740
    // read data
1741 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1742 181 mohor
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1743
    begin
1744
      test_fail("Wrong data was read from PHY from ID register 2");
1745
      fail = fail + 1;
1746
    end
1747
    if(fail == 0)
1748
      test_ok;
1749
    else
1750
      fail = 0;
1751 169 mohor
  end
1752 116 mohor
 
1753
 
1754 181 mohor
  ////////////////////////////////////////////////////////////////////
1755
  ////                                                            ////
1756
  ////  Test various writings to 'real' phy registers (control    ////
1757
  ////  and non writable registers)                               ////
1758
  ////                                                            ////
1759
  ////////////////////////////////////////////////////////////////////
1760
  if (test_num == 2) // 
1761 169 mohor
  begin
1762 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1763
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1764
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1765 181 mohor
 
1766
    // negate data and try to write into unwritable register
1767
    tmp_data = ~phy_data;
1768
    // write request
1769
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1770
    check_mii_busy; // wait for write to finish
1771 169 mohor
    // read request
1772
    #Tp mii_read_req(phy_addr, reg_addr);
1773
    check_mii_busy; // wait for read to finish
1774
    // read data
1775 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1776 181 mohor
    if (tmp_data !== phy_data)
1777
    begin
1778
      test_fail("Data was written into unwritable PHY register - ID register 2");
1779
      fail = fail + 1;
1780
    end
1781
 
1782
    // set address
1783
    reg_addr = 5'h0; // control register
1784
    // read request
1785
    #Tp mii_read_req(phy_addr, reg_addr);
1786
    check_mii_busy; // wait for read to finish
1787
    // read data
1788 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1789 181 mohor
    // write request
1790
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1791
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1792
    check_mii_busy; // wait for write to finish
1793
    // read request
1794
    #Tp mii_read_req(phy_addr, reg_addr);
1795
    check_mii_busy; // wait for read to finish
1796
    // read data
1797 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1798 181 mohor
    if (phy_data !== 16'h7DFF)
1799 169 mohor
    begin
1800 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1801 169 mohor
      fail = fail + 1;
1802
    end
1803 181 mohor
    // write request
1804
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1805
    check_mii_busy; // wait for write to finish
1806
    // read request
1807
    #Tp mii_read_req(phy_addr, reg_addr);
1808
    check_mii_busy; // wait for read to finish
1809
    // read data
1810 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1811 181 mohor
    if (phy_data !== tmp_data)
1812
    begin
1813
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1814
      fail = fail + 1;
1815
    end
1816
    if(fail == 0)
1817
      test_ok;
1818 116 mohor
    else
1819 181 mohor
      fail = 0;
1820 169 mohor
  end
1821 116 mohor
 
1822
 
1823 181 mohor
  ////////////////////////////////////////////////////////////////////
1824
  ////                                                            ////
1825
  ////  Test reset phy through mii management module              ////
1826
  ////                                                            ////
1827
  ////////////////////////////////////////////////////////////////////
1828
  if (test_num == 3) // 
1829 169 mohor
  begin
1830 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1831
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1832
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1833 181 mohor
 
1834
    // set address
1835
    reg_addr = 5'h0; // control register
1836
    // write request
1837
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1838
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1839
    check_mii_busy; // wait for write to finish
1840
    // read request
1841
    #Tp mii_read_req(phy_addr, reg_addr);
1842
    check_mii_busy; // wait for read to finish
1843
    // read data
1844 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1845 181 mohor
    if (phy_data !== tmp_data)
1846
    begin
1847
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1848
      fail = fail + 1;
1849
    end
1850
    // set reset bit - selfclearing bit in PHY
1851
    phy_data = phy_data | 16'h8000;
1852
    // write request
1853
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1854
    check_mii_busy; // wait for write to finish
1855
    // read request
1856
    #Tp mii_read_req(phy_addr, reg_addr);
1857
    check_mii_busy; // wait for read to finish
1858
    // read data
1859 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1860 181 mohor
    // check self clearing of reset bit
1861
    if (tmp_data[15] !== 1'b0)
1862
    begin
1863
      test_fail("Reset bit should be self cleared - control register");
1864
      fail = fail + 1;
1865
    end
1866
    // check reset value of control register
1867
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1868
    begin
1869
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1870
      fail = fail + 1;
1871
    end
1872
    if(fail == 0)
1873
      test_ok;
1874
    else
1875
      fail = 0;
1876 169 mohor
  end
1877
 
1878
 
1879 181 mohor
  ////////////////////////////////////////////////////////////////////
1880
  ////                                                            ////
1881
  ////  Test 'walking one' across phy address (with and without   ////
1882
  ////  preamble)                                                 ////
1883
  ////                                                            ////
1884
  ////////////////////////////////////////////////////////////////////
1885
  if (test_num == 4) // 
1886 169 mohor
  begin
1887 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1888
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1889
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1890 181 mohor
 
1891
    // set PHY to test mode
1892
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1893
    for (i = 0; i <= 1; i = i + 1)
1894 169 mohor
    begin
1895 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1896
      #Tp eth_phy.clear_test_regs;
1897
      // MII mode register
1898
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1899
                wbm_subseq_waits);
1900
      // walk one across phy address
1901
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1902 169 mohor
      begin
1903 181 mohor
        reg_addr = $random;
1904
        tmp_data = $random;
1905
        // write request
1906
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1907
        check_mii_busy; // wait for write to finish
1908
        // read request
1909
        #Tp mii_read_req(phy_addr, reg_addr);
1910
        check_mii_busy; // wait for read to finish
1911
        // read data
1912 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1913 181 mohor
        #Tp;
1914
        if (phy_data !== tmp_data)
1915
        begin
1916
          if (i)
1917
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1918
          else
1919
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1920
          fail = fail + 1;
1921
        end
1922
        @(posedge wb_clk);
1923
        #Tp;
1924 169 mohor
      end
1925
    end
1926 181 mohor
    // set PHY to normal mode
1927
    #Tp eth_phy.test_regs(0);
1928
    #Tp eth_phy.preamble_suppresed(0);
1929
    // MII mode register
1930
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1931
    if(fail == 0)
1932
      test_ok;
1933
    else
1934
      fail = 0;
1935 169 mohor
  end
1936
 
1937
 
1938 181 mohor
  ////////////////////////////////////////////////////////////////////
1939
  ////                                                            ////
1940
  ////  Test 'walking one' across phy's register address (with    ////
1941
  ////  and without preamble)                                     ////
1942
  ////                                                            ////
1943
  ////////////////////////////////////////////////////////////////////
1944
  if (test_num == 5) // 
1945 169 mohor
  begin
1946 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1947
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1948
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1949 181 mohor
 
1950
    // set PHY to test mode
1951
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1952
    for (i = 0; i <= 1; i = i + 1)
1953 169 mohor
    begin
1954 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1955
      #Tp eth_phy.clear_test_regs;
1956
      // MII mode register
1957
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1958
                wbm_subseq_waits);
1959
      // walk one across reg address
1960
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1961 169 mohor
      begin
1962 181 mohor
        phy_addr = $random;
1963
        tmp_data = $random;
1964
        // write request
1965
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1966
        check_mii_busy; // wait for write to finish
1967
        // read request
1968
        #Tp mii_read_req(phy_addr, reg_addr);
1969
        check_mii_busy; // wait for read to finish
1970
        // read data
1971 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1972 181 mohor
        #Tp;
1973
        if (phy_data !== tmp_data)
1974
        begin
1975
          if (i)
1976
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1977
          else
1978
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1979
          fail = fail + 1;
1980
        end
1981
        @(posedge wb_clk);
1982
        #Tp;
1983 169 mohor
      end
1984
    end
1985 181 mohor
    // set PHY to normal mode
1986
    #Tp eth_phy.test_regs(0);
1987
    #Tp eth_phy.preamble_suppresed(0);
1988
    // MII mode register
1989
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1990
    if(fail == 0)
1991
      test_ok;
1992
    else
1993
      fail = 0;
1994 169 mohor
  end
1995
 
1996
 
1997 181 mohor
  ////////////////////////////////////////////////////////////////////
1998
  ////                                                            ////
1999
  ////  Test 'walking one' across phy's data (with and without    ////
2000
  ////  preamble)                                                 ////
2001
  ////                                                            ////
2002
  ////////////////////////////////////////////////////////////////////
2003
  if (test_num == 6) // 
2004 169 mohor
  begin
2005 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
2006
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
2007
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
2008 181 mohor
 
2009
    // set PHY to test mode
2010
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
2011
    for (i = 0; i <= 1; i = i + 1)
2012 169 mohor
    begin
2013 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2014
      #Tp eth_phy.clear_test_regs;
2015
      // MII mode register
2016
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
2017
                wbm_subseq_waits);
2018
      // walk one across data
2019
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
2020 169 mohor
      begin
2021 181 mohor
        phy_addr = $random;
2022
        reg_addr = $random;
2023
        // write request
2024
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
2025
        check_mii_busy; // wait for write to finish
2026
        // read request
2027
        #Tp mii_read_req(phy_addr, reg_addr);
2028
        check_mii_busy; // wait for read to finish
2029
        // read data
2030 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2031 181 mohor
        #Tp;
2032
        if (phy_data !== tmp_data)
2033
        begin
2034
          if (i)
2035
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
2036
          else
2037
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
2038
          fail = fail + 1;
2039
        end
2040
        @(posedge wb_clk);
2041
        #Tp;
2042 169 mohor
      end
2043
    end
2044 181 mohor
    // set PHY to normal mode
2045
    #Tp eth_phy.test_regs(0);
2046
    #Tp eth_phy.preamble_suppresed(0);
2047
    // MII mode register
2048
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2049
    if(fail == 0)
2050
      test_ok;
2051
    else
2052
      fail = 0;
2053 169 mohor
  end
2054
 
2055
 
2056 181 mohor
  ////////////////////////////////////////////////////////////////////
2057
  ////                                                            ////
2058
  ////  Test reading from phy with wrong phy address (host        ////
2059
  ////  reading high 'z' data)                                    ////
2060
  ////                                                            ////
2061
  ////////////////////////////////////////////////////////////////////
2062
  if (test_num == 7) // 
2063 169 mohor
  begin
2064 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
2065
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
2066
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
2067 181 mohor
 
2068
    phy_addr = 5'h2; // wrong PHY address
2069
    // read request
2070
    #Tp mii_read_req(phy_addr, reg_addr);
2071
    check_mii_busy; // wait for read to finish
2072
    // read data
2073 315 tadejm
    $display("  => Two error lines will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
2074 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2075 181 mohor
    if (tmp_data !== 16'hzzzz)
2076
    begin
2077
      test_fail("Data was read from PHY register with wrong PHY address - control register");
2078
      fail = fail + 1;
2079
    end
2080
    if(fail == 0)
2081
      test_ok;
2082
    else
2083
      fail = 0;
2084 169 mohor
  end
2085
 
2086
 
2087 181 mohor
  ////////////////////////////////////////////////////////////////////
2088
  ////                                                            ////
2089
  ////  Test writing to phy with wrong phy address and reading    ////
2090
  ////  from correct one                                          ////
2091
  ////                                                            ////
2092
  ////////////////////////////////////////////////////////////////////
2093
  if (test_num == 8) // 
2094 169 mohor
  begin
2095 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
2096
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
2097
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
2098 181 mohor
 
2099
    // set address
2100
    reg_addr = 5'h0; // control register
2101
    phy_addr = 5'h2; // wrong PHY address
2102
    // write request
2103
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
2104
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2105
    check_mii_busy; // wait for write to finish
2106
 
2107
    phy_addr = 5'h1; // correct PHY address
2108
    // read request
2109
    #Tp mii_read_req(phy_addr, reg_addr);
2110
    check_mii_busy; // wait for read to finish
2111
    // read data
2112 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2113 181 mohor
    if (phy_data === tmp_data)
2114
    begin
2115
      test_fail("Data was written into PHY register with wrong PHY address - control register");
2116
      fail = fail + 1;
2117
    end
2118
    if(fail == 0)
2119
      test_ok;
2120
    else
2121
      fail = 0;
2122 169 mohor
  end
2123
 
2124
 
2125 181 mohor
  ////////////////////////////////////////////////////////////////////
2126
  ////                                                            ////
2127
  ////  Test sliding stop scan command immediately after read     ////
2128
  ////  request (with and without preamble)                       ////
2129
  ////                                                            ////
2130
  ////////////////////////////////////////////////////////////////////
2131
  if (test_num == 9) // 
2132 169 mohor
  begin
2133 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
2134
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
2135 181 mohor
    `TIME;
2136 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
2137 181 mohor
 
2138
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2139 169 mohor
    begin
2140 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2141
      // MII mode register
2142
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2143
               wbm_subseq_waits);
2144
      i = 0;
2145
      cnt = 0;
2146
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2147 169 mohor
      begin
2148 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
2149
        begin
2150
          // set address
2151
          reg_addr = 5'h0; // control register
2152
          phy_addr = 5'h1; // correct PHY address
2153
          cnt = 0;
2154
          // read request
2155
          #Tp mii_read_req(phy_addr, reg_addr);
2156
          fork
2157
            begin
2158
              repeat(i) @(posedge Mdc_O);
2159
              // write command 0x0 into MII command register
2160
              // MII command written while read in progress
2161
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2162
              @(posedge wb_clk);
2163
              #Tp check_mii_busy; // wait for read to finish
2164
            end
2165
            begin
2166
              // wait for serial bus to become active
2167
              wait(Mdio_IO !== 1'bz);
2168
              // count transfer length
2169
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2170
              begin
2171
                @(posedge Mdc_O);
2172
                #Tp cnt = cnt + 1;
2173
              end
2174
            end
2175
          join
2176
          // check transfer length
2177
          if (i2) // without preamble
2178 169 mohor
          begin
2179 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2180
            begin
2181
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2182
              fail = fail + 1;
2183
            end
2184 169 mohor
          end
2185 181 mohor
          else // with preamble
2186 169 mohor
          begin
2187 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2188
            begin
2189
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2190
              fail = fail + 1;
2191
            end
2192
          end
2193
          // check the BUSY signal to see if the bus is still IDLE
2194
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2195
            check_mii_busy; // wait for bus to become idle
2196
 
2197
          // try normal write or read after read was finished
2198
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2199
          #Tp cnt = 0;
2200
          if (i3 == 0) // write after read
2201
          begin
2202
            // write request
2203
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2204 169 mohor
            // wait for serial bus to become active
2205
            wait(Mdio_IO !== 1'bz);
2206
            // count transfer length
2207 181 mohor
            while(Mdio_IO !== 1'bz)
2208 169 mohor
            begin
2209
              @(posedge Mdc_O);
2210
              #Tp cnt = cnt + 1;
2211
            end
2212 181 mohor
            @(posedge Mdc_O);
2213
            // read request
2214
            #Tp mii_read_req(phy_addr, reg_addr);
2215
            check_mii_busy; // wait for read to finish
2216
            // read and check data
2217 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2218 181 mohor
            if (phy_data !== tmp_data)
2219
            begin
2220
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2221
              fail = fail + 1;
2222
            end
2223 169 mohor
          end
2224 181 mohor
          else // read after read
2225 169 mohor
          begin
2226 181 mohor
            // read request
2227
            #Tp mii_read_req(phy_addr, reg_addr);
2228
            // wait for serial bus to become active
2229
            wait(Mdio_IO !== 1'bz);
2230
            // count transfer length
2231
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2232
            begin
2233
              @(posedge Mdc_O);
2234
              #Tp cnt = cnt + 1;
2235
            end
2236 169 mohor
            @(posedge Mdc_O);
2237 181 mohor
            check_mii_busy; // wait for read to finish
2238
            // read and check data
2239 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2240 181 mohor
            if (phy_data !== tmp_data)
2241
            begin
2242
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2243
              fail = fail + 1;
2244
            end
2245 169 mohor
          end
2246 181 mohor
          // check if transfer was a proper length
2247
          if (i2) // without preamble
2248 169 mohor
          begin
2249 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2250
            begin
2251
              test_fail("New request did not proceed correctly, after read request");
2252
              fail = fail + 1;
2253
            end
2254 169 mohor
          end
2255 181 mohor
          else // with preamble
2256 169 mohor
          begin
2257 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2258
            begin
2259
              test_fail("New request did not proceed correctly, after read request");
2260
              fail = fail + 1;
2261
            end
2262 169 mohor
          end
2263
        end
2264 181 mohor
        #Tp;
2265
        // set delay of writing the command
2266 169 mohor
        if (i2) // without preamble
2267
        begin
2268 181 mohor
          case(i)
2269
            0, 1:               i = i + 1;
2270
            18, 19, 20, 21, 22,
2271
            23, 24, 25, 26, 27,
2272
            28, 29, 30, 31, 32,
2273
            33, 34, 35:         i = i + 1;
2274
            36:                 i = 80;
2275
            default:            i = 18;
2276
          endcase
2277 169 mohor
        end
2278
        else // with preamble
2279
        begin
2280 181 mohor
          case(i)
2281
            0, 1:               i = i + 1;
2282
            50, 51, 52, 53, 54,
2283
            55, 56, 57, 58, 59,
2284
            60, 61, 62, 63, 64,
2285
            65, 66, 67:         i = i + 1;
2286
            68:                 i = 80;
2287
            default:            i = 50;
2288
          endcase
2289 169 mohor
        end
2290 181 mohor
        @(posedge wb_clk);
2291 169 mohor
      end
2292
    end
2293 181 mohor
    // set PHY to normal mode
2294
    #Tp eth_phy.preamble_suppresed(0);
2295
    // MII mode register
2296
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2297
    if(fail == 0)
2298
      test_ok;
2299
    else
2300
      fail = 0;
2301 169 mohor
  end
2302
 
2303
 
2304 181 mohor
  ////////////////////////////////////////////////////////////////////
2305
  ////                                                            ////
2306
  ////  Test sliding stop scan command immediately after write    ////
2307
  ////  request (with and without preamble)                       ////
2308
  ////                                                            ////
2309
  ////////////////////////////////////////////////////////////////////
2310
  if (test_num == 10) // 
2311 169 mohor
  begin
2312 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2313
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2314 181 mohor
    `TIME;
2315 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2316 181 mohor
 
2317
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2318 169 mohor
    begin
2319 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2320
      // MII mode register
2321
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2322
                wbm_subseq_waits);
2323
      i = 0;
2324
      cnt = 0;
2325
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2326 169 mohor
      begin
2327 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2328
        begin
2329
          // set address
2330
          reg_addr = 5'h0; // control register
2331
          phy_addr = 5'h1; // correct PHY address
2332
          cnt = 0;
2333
          // write request
2334
          phy_data = {8'h75, (i[7:0] + 1)};
2335
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2336
          fork
2337
            begin
2338
              repeat(i) @(posedge Mdc_O);
2339
              // write command 0x0 into MII command register
2340
              // MII command written while read in progress
2341
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2342
              @(posedge wb_clk);
2343
              #Tp check_mii_busy; // wait for write to finish
2344
            end
2345
            begin
2346
              // wait for serial bus to become active
2347
              wait(Mdio_IO !== 1'bz);
2348
              // count transfer length
2349
              while(Mdio_IO !== 1'bz)
2350
              begin
2351
                @(posedge Mdc_O);
2352
                #Tp cnt = cnt + 1;
2353
              end
2354
            end
2355
          join
2356
          // check transfer length
2357
          if (i2) // without preamble
2358 169 mohor
          begin
2359 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2360
            begin
2361
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2362
              fail = fail + 1;
2363
            end
2364 169 mohor
          end
2365 181 mohor
          else // with preamble
2366 169 mohor
          begin
2367 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2368
            begin
2369
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2370
              fail = fail + 1;
2371
            end
2372
          end
2373
          // check the BUSY signal to see if the bus is still IDLE
2374
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2375
            check_mii_busy; // wait for bus to become idle
2376
 
2377
          // try normal write or read after write was finished
2378
          #Tp cnt = 0;
2379
          if (i3 == 0) // write after write
2380
          begin
2381
            phy_data = {8'h7A, (i[7:0] + 1)};
2382
            // write request
2383
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2384 169 mohor
            // wait for serial bus to become active
2385
            wait(Mdio_IO !== 1'bz);
2386
            // count transfer length
2387
            while(Mdio_IO !== 1'bz)
2388
            begin
2389
              @(posedge Mdc_O);
2390
              #Tp cnt = cnt + 1;
2391
            end
2392 181 mohor
            @(posedge Mdc_O);
2393
            // read request
2394
            #Tp mii_read_req(phy_addr, reg_addr);
2395
            check_mii_busy; // wait for read to finish
2396
            // read and check data
2397 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2398 181 mohor
            if (phy_data !== tmp_data)
2399
            begin
2400
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2401
              fail = fail + 1;
2402
            end
2403 169 mohor
          end
2404 181 mohor
          else // read after write
2405 169 mohor
          begin
2406 181 mohor
            // read request
2407
            #Tp mii_read_req(phy_addr, reg_addr);
2408
            // wait for serial bus to become active
2409
            wait(Mdio_IO !== 1'bz);
2410
            // count transfer length
2411
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2412
            begin
2413
              @(posedge Mdc_O);
2414
              #Tp cnt = cnt + 1;
2415
            end
2416 169 mohor
            @(posedge Mdc_O);
2417 181 mohor
            check_mii_busy; // wait for read to finish
2418
            // read and check data
2419 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2420 181 mohor
            if (phy_data !== tmp_data)
2421
            begin
2422
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2423
              fail = fail + 1;
2424
            end
2425 169 mohor
          end
2426 181 mohor
          // check if transfer was a proper length
2427
          if (i2) // without preamble
2428 169 mohor
          begin
2429 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2430
            begin
2431
              test_fail("New request did not proceed correctly, after write request");
2432
              fail = fail + 1;
2433
            end
2434 169 mohor
          end
2435 181 mohor
          else // with preamble
2436 169 mohor
          begin
2437 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2438
            begin
2439
              test_fail("New request did not proceed correctly, after write request");
2440
              fail = fail + 1;
2441
            end
2442 169 mohor
          end
2443
        end
2444 181 mohor
        #Tp;
2445
        // set delay of writing the command
2446 169 mohor
        if (i2) // without preamble
2447
        begin
2448 181 mohor
          case(i)
2449
            0, 1:               i = i + 1;
2450
            18, 19, 20, 21, 22,
2451
            23, 24, 25, 26, 27,
2452
            28, 29, 30, 31, 32,
2453
            33, 34, 35:         i = i + 1;
2454
            36:                 i = 80;
2455
            default:            i = 18;
2456
          endcase
2457 169 mohor
        end
2458
        else // with preamble
2459
        begin
2460 181 mohor
          case(i)
2461
            0, 1:               i = i + 1;
2462
            50, 51, 52, 53, 54,
2463
            55, 56, 57, 58, 59,
2464
            60, 61, 62, 63, 64,
2465
            65, 66, 67:         i = i + 1;
2466
            68:                 i = 80;
2467
            default:            i = 50;
2468
          endcase
2469 169 mohor
        end
2470 181 mohor
        @(posedge wb_clk);
2471 169 mohor
      end
2472
    end
2473 181 mohor
    // set PHY to normal mode
2474
    #Tp eth_phy.preamble_suppresed(0);
2475
    // MII mode register
2476
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2477
    if(fail == 0)
2478
      test_ok;
2479
    else
2480
      fail = 0;
2481 169 mohor
  end
2482
 
2483
 
2484 181 mohor
  ////////////////////////////////////////////////////////////////////
2485
  ////                                                            ////
2486
  ////  Test busy and nvalid status durations during write (with  ////
2487
  ////  and without preamble)                                     ////
2488
  ////                                                            ////
2489
  ////////////////////////////////////////////////////////////////////
2490
  if (test_num == 11) // 
2491 169 mohor
  begin
2492 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2493
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2494
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2495 181 mohor
 
2496
    reset_mii; // reset MII
2497
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2498
    #Tp eth_phy.link_up_down(1);
2499
    // set the MII
2500
    clk_div = 64;
2501
    mii_set_clk_div(clk_div[7:0]);
2502
    // set address
2503
    reg_addr = 5'h1; // status register
2504
    phy_addr = 5'h1; // correct PHY address
2505
 
2506
    for (i = 0; i <= 1; i = i + 1)
2507 169 mohor
    begin
2508 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2509
      // MII mode register
2510
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2511
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2512
      @(posedge Mdc_O);
2513
      // write request
2514
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2515
      // read data from MII status register - Busy and Nvalid bits
2516 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2517 181 mohor
 
2518
      // check MII IO signal and Busy and Nvalid bits
2519
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2520 169 mohor
      begin
2521 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2522
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2523
        begin
2524
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2525
          fail = fail + 1;
2526
        end
2527
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2528
        begin
2529
          test_fail("Nvalid signal was set during write");
2530
          fail = fail + 1;
2531
        end
2532 169 mohor
      end
2533 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2534 169 mohor
      begin
2535 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2536
        begin
2537
          test_fail("Busy signal should be set after write, due to reads from MII status register");
2538
          fail = fail + 1;
2539
        end
2540
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2541
        begin
2542
          test_fail("Nvalid signal was set during write");
2543
          fail = fail + 1;
2544
        end
2545 169 mohor
      end
2546 181 mohor
 
2547
      // wait for serial bus to become active
2548
      wait(Mdio_IO !== 1'bz);
2549
      // count transfer bits
2550
      if (i)
2551 169 mohor
      begin
2552 181 mohor
        repeat(32) @(posedge Mdc_O);
2553 169 mohor
      end
2554 181 mohor
      else
2555 169 mohor
      begin
2556 181 mohor
        repeat(64) @(posedge Mdc_O);
2557 169 mohor
      end
2558 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2559 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2560 181 mohor
 
2561
      // check MII IO signal and Busy and Nvalid bits
2562
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2563 169 mohor
      begin
2564 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2565
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2566
        begin
2567
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2568
          fail = fail + 1;
2569
        end
2570
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2571
        begin
2572
          test_fail("Nvalid signal was set during write");
2573
          fail = fail + 1;
2574
        end
2575 169 mohor
      end
2576 181 mohor
      else // Busy bit should still be set to '1'
2577 169 mohor
      begin
2578 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2579
        begin
2580
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2581
          fail = fail + 1;
2582
        end
2583
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2584
        begin
2585
          test_fail("Nvalid signal was set during write");
2586
          fail = fail + 1;
2587
        end
2588 169 mohor
      end
2589 181 mohor
 
2590
      // wait for next negative clock edge
2591
      @(negedge Mdc_O);
2592 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2593 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2594 181 mohor
 
2595 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2596
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2597
      begin
2598
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2599
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2600
        begin
2601
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2602
          fail = fail + 1;
2603
        end
2604
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2605
        begin
2606
          test_fail("Nvalid signal was set during write");
2607
          fail = fail + 1;
2608
        end
2609
      end
2610 181 mohor
      else // Busy bit should still be set to '1'
2611 169 mohor
      begin
2612
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2613
        begin
2614 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2615
          fail = fail + 1;
2616 169 mohor
        end
2617 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2618 169 mohor
        begin
2619 181 mohor
          test_fail("Nvalid signal was set during write");
2620
          fail = fail + 1;
2621
        end
2622
      end
2623
 
2624
      // wait for Busy to become inactive
2625
      i1 = 0;
2626
      while (i1 <= 2)
2627
      begin
2628
        // wait for next positive clock edge
2629
        @(posedge Mdc_O);
2630
        // read data from MII status register - Busy and Nvalid bits
2631 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2632 181 mohor
 
2633
        // check MII IO signal and Busy and Nvalid bits
2634
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2635
        begin
2636
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2637
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2638 169 mohor
          begin
2639 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2640 169 mohor
            fail = fail + 1;
2641
          end
2642 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2643
          begin
2644
            test_fail("Nvalid signal was set during write");
2645
            fail = fail + 1;
2646
          end
2647 169 mohor
        end
2648 181 mohor
        else // wait for Busy bit to be set to '0'
2649 169 mohor
        begin
2650 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2651
          begin
2652
            i1 = 3; // end of Busy checking
2653
          end
2654
          else
2655
          begin
2656
            if (i1 == 2)
2657
            begin
2658
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2659
              fail = fail + 1;
2660
            end
2661
            #Tp i1 = i1 + 1;
2662
          end
2663
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2664
          begin
2665
            test_fail("Nvalid signal was set after write");
2666
            fail = fail + 1;
2667
          end
2668 169 mohor
        end
2669
      end
2670
    end
2671 181 mohor
    // set PHY to normal mode
2672
    #Tp eth_phy.preamble_suppresed(0);
2673
    // MII mode register
2674
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2675
    if(fail == 0)
2676
      test_ok;
2677
    else
2678
      fail = 0;
2679 116 mohor
  end
2680
 
2681
 
2682 181 mohor
  ////////////////////////////////////////////////////////////////////
2683
  ////                                                            ////
2684
  ////  Test busy and nvalid status durations during write (with  ////
2685
  ////  and without preamble)                                     ////
2686
  ////                                                            ////
2687
  ////////////////////////////////////////////////////////////////////
2688
  if (test_num == 12) // 
2689 169 mohor
  begin
2690 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2691
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2692
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2693 181 mohor
 
2694
    reset_mii; // reset MII
2695
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2696
    #Tp eth_phy.link_up_down(1);
2697
    // set the MII
2698
    clk_div = 64;
2699
    mii_set_clk_div(clk_div[7:0]);
2700
    // set address
2701
    reg_addr = 5'h1; // status register
2702
    phy_addr = 5'h1; // correct PHY address
2703
 
2704
    for (i = 0; i <= 1; i = i + 1)
2705 169 mohor
    begin
2706 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2707
      // MII mode register
2708
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2709
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2710 169 mohor
      @(posedge Mdc_O);
2711 181 mohor
      // read request
2712
      #Tp mii_read_req(phy_addr, reg_addr);
2713 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2714 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2715 181 mohor
 
2716 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2717
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2718
      begin
2719 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2720 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2721
        begin
2722 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2723 169 mohor
          fail = fail + 1;
2724
        end
2725
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2726
        begin
2727
          test_fail("Nvalid signal was set during read");
2728
          fail = fail + 1;
2729
        end
2730
      end
2731 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2732 169 mohor
      begin
2733
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2734
        begin
2735 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2736
          fail = fail + 1;
2737 169 mohor
        end
2738
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2739
        begin
2740 181 mohor
          test_fail("Nvalid signal was set during read");
2741 169 mohor
          fail = fail + 1;
2742
        end
2743
      end
2744 181 mohor
 
2745
      // wait for serial bus to become active
2746
      wait(Mdio_IO !== 1'bz);
2747
      // count transfer bits
2748
      if (i)
2749 169 mohor
      begin
2750 181 mohor
        repeat(31) @(posedge Mdc_O);
2751 169 mohor
      end
2752 181 mohor
      else
2753 169 mohor
      begin
2754 181 mohor
        repeat(63) @(posedge Mdc_O);
2755 169 mohor
      end
2756 181 mohor
      // wait for next negative clock edge
2757
      @(negedge Mdc_O);
2758
      // read data from MII status register - Busy and Nvalid bits
2759 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2760 181 mohor
 
2761
      // check MII IO signal and Busy and Nvalid bits
2762
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2763 169 mohor
      begin
2764 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2765
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2766
        begin
2767
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2768
          fail = fail + 1;
2769
        end
2770
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2771
        begin
2772
          test_fail("Nvalid signal was set during read");
2773
          fail = fail + 1;
2774
        end
2775 169 mohor
      end
2776 181 mohor
      else // Busy bit should still be set to '1'
2777 169 mohor
      begin
2778 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2779
        begin
2780
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2781
          fail = fail + 1;
2782
        end
2783
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2784
        begin
2785
          test_fail("Nvalid signal was set during read");
2786
          fail = fail + 1;
2787
        end
2788 169 mohor
      end
2789 181 mohor
 
2790 169 mohor
      // wait for next positive clock edge
2791
      @(posedge Mdc_O);
2792
      // read data from MII status register - Busy and Nvalid bits
2793 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2794 181 mohor
 
2795 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2796
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2797
      begin
2798
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2799 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2800 169 mohor
        begin
2801 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2802
          fail = fail + 1;
2803
        end
2804
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2805
        begin
2806
          test_fail("Nvalid signal was set during read");
2807
          fail = fail + 1;
2808
        end
2809
      end
2810
      else // Busy bit should still be set to '1'
2811
      begin
2812
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2813
        begin
2814
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2815
          fail = fail + 1;
2816
        end
2817
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2818
        begin
2819
          test_fail("Nvalid signal was set during read");
2820
          fail = fail + 1;
2821
        end
2822
      end
2823
 
2824
      // wait for Busy to become inactive
2825
      i1 = 0;
2826
      while (i1 <= 2)
2827
      begin
2828
        // wait for next positive clock edge
2829
        @(posedge Mdc_O);
2830
        // read data from MII status register - Busy and Nvalid bits
2831 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2832 181 mohor
 
2833
        // check MII IO signal and Busy and Nvalid bits
2834
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2835
        begin
2836
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2837 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2838
          begin
2839
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2840
            fail = fail + 1;
2841
          end
2842 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2843 169 mohor
          begin
2844 181 mohor
            test_fail("Nvalid signal was set during read");
2845 169 mohor
            fail = fail + 1;
2846
          end
2847
        end
2848 181 mohor
        else // wait for Busy bit to be set to '0'
2849 169 mohor
        begin
2850
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2851
          begin
2852
            i1 = 3; // end of Busy checking
2853
          end
2854
          else
2855
          begin
2856
            if (i1 == 2)
2857
            begin
2858
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2859
              fail = fail + 1;
2860
            end
2861
            #Tp i1 = i1 + 1;
2862
          end
2863 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2864 169 mohor
          begin
2865 181 mohor
            test_fail("Nvalid signal was set after read");
2866 169 mohor
            fail = fail + 1;
2867
          end
2868
        end
2869
      end
2870
    end
2871 181 mohor
    // set PHY to normal mode
2872
    #Tp eth_phy.preamble_suppresed(0);
2873
    // MII mode register
2874
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2875
    if(fail == 0)
2876
      test_ok;
2877
    else
2878
      fail = 0;
2879 169 mohor
  end
2880
 
2881
 
2882 181 mohor
  ////////////////////////////////////////////////////////////////////
2883
  ////                                                            ////
2884
  ////  Test busy and nvalid status durations during scan (with   ////
2885
  ////  and without preamble)                                     ////
2886
  ////                                                            ////
2887
  ////////////////////////////////////////////////////////////////////
2888
  if (test_num == 13) // 
2889 169 mohor
  begin
2890 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2891
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2892
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2893 181 mohor
 
2894
    reset_mii; // reset MII
2895
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2896
    #Tp eth_phy.link_up_down(1);
2897
    // set the MII
2898
    clk_div = 64;
2899
    mii_set_clk_div(clk_div[7:0]);
2900
    // set address
2901
    reg_addr = 5'h1; // status register
2902
    phy_addr = 5'h1; // correct PHY address
2903
 
2904
    for (i = 0; i <= 1; i = i + 1)
2905 169 mohor
    begin
2906 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2907
      // MII mode register
2908
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2909
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2910
      @(posedge Mdc_O);
2911
      // scan request
2912
      #Tp mii_scan_req(phy_addr, reg_addr);
2913
      // read data from MII status register - Busy and Nvalid bits
2914 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2915 181 mohor
 
2916
      // check MII IO signal and Busy and Nvalid bits
2917
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2918 169 mohor
      begin
2919 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2920
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2921
        begin
2922
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2923
          fail = fail + 1;
2924
        end
2925
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2926
        begin
2927
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2928
          fail = fail + 1;
2929
        end
2930 169 mohor
      end
2931 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2932 169 mohor
      begin
2933 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2934
        begin
2935
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2936
          fail = fail + 1;
2937
        end
2938
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2939
        begin
2940
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2941
          fail = fail + 1;
2942
        end
2943 169 mohor
      end
2944 181 mohor
 
2945
      // wait for serial bus to become active
2946 169 mohor
      wait(Mdio_IO !== 1'bz);
2947 181 mohor
      // count transfer bits
2948
      if (i)
2949 169 mohor
      begin
2950 181 mohor
        repeat(21) @(posedge Mdc_O);
2951 169 mohor
      end
2952 181 mohor
      else
2953 169 mohor
      begin
2954 181 mohor
        repeat(53) @(posedge Mdc_O);
2955 169 mohor
      end
2956 181 mohor
      // stop scan
2957
      #Tp mii_scan_finish; // finish scan operation
2958
 
2959
      // wait for next positive clock edge
2960
      repeat(10) @(posedge Mdc_O);
2961
      // read data from MII status register - Busy and Nvalid bits
2962 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2963 181 mohor
 
2964
      // check MII IO signal and Busy and Nvalid bits
2965
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2966 169 mohor
      begin
2967 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2968
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2969 169 mohor
        begin
2970 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2971 169 mohor
          fail = fail + 1;
2972
        end
2973 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2974 169 mohor
      end
2975 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2976 169 mohor
      begin
2977 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2978 169 mohor
        begin
2979 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2980 169 mohor
          fail = fail + 1;
2981
        end
2982 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2983 169 mohor
        begin
2984 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2985 169 mohor
          fail = fail + 1;
2986
        end
2987 181 mohor
      end
2988
 
2989
      // wait for next negative clock edge
2990
      @(negedge Mdc_O);
2991
      // read data from MII status register - Busy and Nvalid bits
2992 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2993 181 mohor
 
2994
      // check MII IO signal and Busy and Nvalid bits
2995
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2996
      begin
2997
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2998
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2999 169 mohor
        begin
3000 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
3001
          fail = fail + 1;
3002 169 mohor
        end
3003 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
3004 169 mohor
      end
3005 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
3006 169 mohor
      begin
3007 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
3008 169 mohor
        begin
3009 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
3010
          fail = fail + 1;
3011 169 mohor
        end
3012 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
3013 169 mohor
        begin
3014 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
3015
          fail = fail + 1;
3016 169 mohor
        end
3017
      end
3018 181 mohor
 
3019
      // wait for next negative clock edge
3020
      @(posedge Mdc_O);
3021
      // read data from MII status register - Busy and Nvalid bits
3022 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3023 181 mohor
 
3024
      // check MII IO signal and Busy and Nvalid bits
3025
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
3026 169 mohor
      begin
3027 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
3028
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
3029 169 mohor
        begin
3030 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
3031 169 mohor
          fail = fail + 1;
3032
        end
3033 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
3034 169 mohor
        begin
3035 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
3036 169 mohor
          fail = fail + 1;
3037
        end
3038
      end
3039 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
3040 169 mohor
      begin
3041 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
3042 169 mohor
        begin
3043 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
3044
          fail = fail + 1;
3045 169 mohor
        end
3046 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
3047 169 mohor
        begin
3048 181 mohor
          i2 = 1; // check finished
3049 169 mohor
        end
3050 181 mohor
        else
3051 169 mohor
        begin
3052 181 mohor
          i2 = 0; // check must continue
3053 169 mohor
        end
3054
      end
3055 181 mohor
 
3056
      // wait for Busy to become inactive
3057
      i1 = 0;
3058
      while ((i1 <= 2) || (i2 == 0))
3059
      begin
3060
        // wait for next positive clock edge
3061
        @(posedge Mdc_O);
3062
        // read data from MII status register - Busy and Nvalid bits
3063 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3064 181 mohor
 
3065
        // check MII IO signal and Busy and Nvalid bits
3066
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
3067 169 mohor
        begin
3068 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
3069
          if (i1 <= 2)
3070 169 mohor
          begin
3071 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
3072 169 mohor
            begin
3073 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
3074 169 mohor
              fail = fail + 1;
3075
            end
3076
          end
3077 181 mohor
          if (i2 == 0)
3078 169 mohor
          begin
3079 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
3080 169 mohor
            begin
3081 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
3082 169 mohor
              fail = fail + 1;
3083
            end
3084
          end
3085
        end
3086 181 mohor
        else // wait for Busy bit to be set to '0'
3087 169 mohor
        begin
3088 181 mohor
          if (i1 <= 2)
3089 169 mohor
          begin
3090 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
3091 169 mohor
            begin
3092 181 mohor
              i1 = 3; // end of Busy checking
3093 169 mohor
            end
3094 181 mohor
            else
3095 169 mohor
            begin
3096 181 mohor
              if (i1 == 2)
3097 169 mohor
              begin
3098 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
3099 169 mohor
                fail = fail + 1;
3100
              end
3101 181 mohor
              #Tp i1 = i1 + 1;
3102 169 mohor
            end
3103 181 mohor
          end
3104
          if (i2 == 0)
3105
          begin
3106
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
3107 169 mohor
            begin
3108 181 mohor
              i2 = 1;
3109 169 mohor
            end
3110 181 mohor
            else
3111
            begin
3112
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
3113
              fail = fail + 1;
3114
            end
3115 169 mohor
          end
3116
        end
3117 181 mohor
      end
3118
    end
3119
    // set PHY to normal mode
3120
    #Tp eth_phy.preamble_suppresed(0);
3121
    // MII mode register
3122
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3123
    if(fail == 0)
3124
      test_ok;
3125
    else
3126
      fail = 0;
3127
  end
3128
 
3129
 
3130
  ////////////////////////////////////////////////////////////////////
3131
  ////                                                            ////
3132
  ////  Test scan status from phy with detecting link-fail bit    ////
3133
  ////  (with and without preamble)                               ////
3134
  ////                                                            ////
3135
  ////////////////////////////////////////////////////////////////////
3136
  if (test_num == 14) // 
3137
  begin
3138 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3139
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3140
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3141 181 mohor
 
3142
    reset_mii; // reset MII
3143
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
3144
    #Tp eth_phy.link_up_down(1);
3145
    // set MII speed
3146
    clk_div = 6;
3147
    mii_set_clk_div(clk_div[7:0]);
3148
    // set address
3149
    reg_addr = 5'h1; // status register
3150
    phy_addr = 5'h1; // correct PHY address
3151
 
3152
    // read request
3153
    #Tp mii_read_req(phy_addr, reg_addr);
3154
    check_mii_busy; // wait for read to finish
3155
    // read data from PHY status register - remember LINK-UP status
3156 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3157 181 mohor
 
3158
    for (i = 0; i <= 1; i = i + 1)
3159
    begin
3160
      #Tp eth_phy.preamble_suppresed(i);
3161
      // MII mode register
3162
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
3163
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3164
      // scan request
3165
      #Tp mii_scan_req(phy_addr, reg_addr);
3166
      check_mii_scan_valid; // wait for scan to make first data valid
3167
 
3168 169 mohor
      fork
3169 181 mohor
      begin
3170 169 mohor
        repeat(2) @(posedge Mdc_O);
3171
        // read data from PHY status register
3172 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3173 181 mohor
        if (phy_data !== tmp_data)
3174 169 mohor
        begin
3175 181 mohor
          test_fail("Data was not correctly scaned from status register");
3176 169 mohor
          fail = fail + 1;
3177
        end
3178
        // read data from MII status register
3179 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3180 181 mohor
        if (phy_data[0] !== 1'b0)
3181 169 mohor
        begin
3182 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
3183 169 mohor
          fail = fail + 1;
3184
        end
3185
      end
3186
      begin
3187 181 mohor
      // Completely check second scan
3188 169 mohor
        #Tp cnt = 0;
3189
        // wait for serial bus to become active - second scan
3190
        wait(Mdio_IO !== 1'bz);
3191
        // count transfer length
3192 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3193 169 mohor
        begin
3194
          @(posedge Mdc_O);
3195
          #Tp cnt = cnt + 1;
3196
        end
3197
        // check transfer length
3198 181 mohor
        if (i) // without preamble
3199 169 mohor
        begin
3200
          if (cnt != 33) // at this value Mdio_IO is HIGH Z
3201
          begin
3202 181 mohor
            test_fail("Second scan request did not proceed correctly");
3203 169 mohor
            fail = fail + 1;
3204
          end
3205
        end
3206
        else // with preamble
3207
        begin
3208
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3209
          begin
3210 181 mohor
            test_fail("Second scan request did not proceed correctly");
3211 169 mohor
            fail = fail + 1;
3212
          end
3213
        end
3214
      end
3215
      join
3216 181 mohor
      // check third to fifth scans
3217
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3218
      begin
3219
        fork
3220 169 mohor
        begin
3221
          repeat(2) @(posedge Mdc_O);
3222
          // read data from PHY status register
3223 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3224 181 mohor
          if (phy_data !== tmp_data)
3225 169 mohor
          begin
3226 181 mohor
            test_fail("Data was not correctly scaned from status register");
3227
            fail = fail + 1;
3228 169 mohor
          end
3229
          // read data from MII status register
3230 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3231 181 mohor
          if (phy_data[0] !== 1'b0)
3232 169 mohor
          begin
3233 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3234
            fail = fail + 1;
3235 169 mohor
          end
3236 181 mohor
          if (i3 == 2) // after fourth scan read
3237 169 mohor
          begin
3238 181 mohor
            @(posedge Mdc_O);
3239
            // change saved data
3240
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3241
            // set link down
3242
            #Tp eth_phy.link_up_down(0);
3243 169 mohor
          end
3244
        end
3245
        begin
3246 181 mohor
        // Completely check scans
3247
          #Tp cnt = 0;
3248
          // wait for serial bus to become active - second scan
3249
          wait(Mdio_IO !== 1'bz);
3250
          // count transfer length
3251
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3252 169 mohor
          begin
3253 181 mohor
            @(posedge Mdc_O);
3254
            #Tp cnt = cnt + 1;
3255
          end
3256
          // check transfer length
3257
          if (i) // without preamble
3258
          begin
3259
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3260 169 mohor
            begin
3261 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3262
              fail = fail + 1;
3263 169 mohor
            end
3264 181 mohor
          end
3265
          else // with preamble
3266
          begin
3267
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3268 169 mohor
            begin
3269 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3270
              fail = fail + 1;
3271 169 mohor
            end
3272
          end
3273
        end
3274 181 mohor
        join
3275
      end
3276
 
3277
      fork
3278
      begin
3279
        repeat(2) @(posedge Mdc_O);
3280
        // read data from PHY status register
3281 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3282 181 mohor
        if (phy_data !== tmp_data)
3283
        begin
3284
          test_fail("Data was not correctly scaned from status register");
3285
          fail = fail + 1;
3286
        end
3287
        // read data from MII status register
3288 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3289 181 mohor
        if (phy_data[0] === 1'b0)
3290
        begin
3291
          test_fail("Link FAIL bit was not set in the MII status register");
3292
          fail = fail + 1;
3293
        end
3294
        // wait to see if data stayed latched
3295
        repeat(4) @(posedge Mdc_O);
3296
        // read data from PHY status register
3297 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3298 181 mohor
        if (phy_data !== tmp_data)
3299
        begin
3300
          test_fail("Data was not latched correctly in status register");
3301
          fail = fail + 1;
3302
        end
3303
        // read data from MII status register
3304 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3305 181 mohor
        if (phy_data[0] === 1'b0)
3306
        begin
3307
          test_fail("Link FAIL bit was not set in the MII status register");
3308
          fail = fail + 1;
3309
        end
3310
        // change saved data
3311
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3312
        // set link up
3313
        #Tp eth_phy.link_up_down(1);
3314
      end
3315
      begin
3316
      // Wait for sixth scan
3317
        // wait for serial bus to become active - sixth scan
3318
        wait(Mdio_IO !== 1'bz);
3319
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3320
        wait(Mdio_IO === 1'bz);
3321
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3322
        wait(Mdio_IO !== 1'bz);
3323
        // wait for serial bus to become inactive - end of sixth scan
3324
        wait(Mdio_IO === 1'bz);
3325
      end
3326 169 mohor
      join
3327 181 mohor
 
3328
      @(posedge Mdc_O);
3329 169 mohor
      // read data from PHY status register
3330 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3331 169 mohor
      if (phy_data !== tmp_data)
3332
      begin
3333 181 mohor
        test_fail("Data was not correctly scaned from status register");
3334 169 mohor
        fail = fail + 1;
3335
      end
3336
      // read data from MII status register
3337 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3338 169 mohor
      if (phy_data[0] !== 1'b0)
3339
      begin
3340
        test_fail("Link FAIL bit was set in the MII status register");
3341
        fail = fail + 1;
3342
      end
3343 181 mohor
      // wait to see if data stayed latched
3344
      repeat(4) @(posedge Mdc_O);
3345
      // read data from PHY status register
3346 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3347 181 mohor
      if (phy_data !== tmp_data)
3348 169 mohor
      begin
3349 181 mohor
        test_fail("Data was not correctly scaned from status register");
3350
        fail = fail + 1;
3351 169 mohor
      end
3352 181 mohor
      // read data from MII status register
3353 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3354 181 mohor
      if (phy_data[0] !== 1'b0)
3355 169 mohor
      begin
3356 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3357
        fail = fail + 1;
3358 169 mohor
      end
3359 181 mohor
 
3360
      // STOP SCAN
3361
      #Tp mii_scan_finish; // finish scan operation
3362
      #Tp check_mii_busy; // wait for scan to finish
3363 169 mohor
    end
3364 181 mohor
    // set PHY to normal mode
3365
    #Tp eth_phy.preamble_suppresed(0);
3366
    // MII mode register
3367
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3368
    if(fail == 0)
3369
      test_ok;
3370
    else
3371
      fail = 0;
3372 169 mohor
  end
3373
 
3374
 
3375 181 mohor
  ////////////////////////////////////////////////////////////////////
3376
  ////                                                            ////
3377
  ////  Test scan status from phy with sliding link-fail bit      ////
3378
  ////  (with and without preamble)                               ////
3379
  ////                                                            ////
3380
  ////////////////////////////////////////////////////////////////////
3381
  if (test_num == 15) // 
3382 169 mohor
  begin
3383 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3384
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3385
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3386 181 mohor
 
3387
    // set address
3388
    reg_addr = 5'h1; // status register
3389
    phy_addr = 5'h1; // correct PHY address
3390
 
3391
    // read request
3392
    #Tp mii_read_req(phy_addr, reg_addr);
3393
    check_mii_busy; // wait for read to finish
3394
    // read data from PHY status register - remember LINK-UP status
3395 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3396 181 mohor
 
3397
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3398 169 mohor
    begin
3399 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3400
      // MII mode register
3401
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3402
                    wbm_subseq_waits);
3403
      i = 0;
3404
      while (i < 80) // delay for sliding of LinkFail bit
3405
      begin
3406
        // first there are two scans
3407
        #Tp cnt = 0;
3408 169 mohor
        // scan request
3409
        #Tp mii_scan_req(phy_addr, reg_addr);
3410 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3411
 
3412
        // check second scan
3413 169 mohor
        fork
3414 181 mohor
        begin
3415
          repeat(4) @(posedge Mdc_O);
3416
          // read data from PHY status register
3417 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3418 181 mohor
          if (phy_data !== tmp_data)
3419 169 mohor
          begin
3420 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3421
            fail = fail + 1;
3422 169 mohor
          end
3423 181 mohor
          // read data from MII status register
3424 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3425 181 mohor
          if (phy_data[0] !== 1'b0)
3426
          begin
3427
            test_fail("Link FAIL bit was set in the MII status register");
3428
            fail = fail + 1;
3429
          end
3430
        end
3431
        begin
3432
        // Completely check scan
3433
          #Tp cnt = 0;
3434
          // wait for serial bus to become active - second scan
3435
          wait(Mdio_IO !== 1'bz);
3436
          // count transfer length
3437
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3438
          begin
3439
            @(posedge Mdc_O);
3440
            #Tp cnt = cnt + 1;
3441
          end
3442
          // check transfer length
3443
          if (i2) // without preamble
3444
          begin
3445
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3446 169 mohor
            begin
3447 181 mohor
              test_fail("Second scan request did not proceed correctly");
3448
              fail = fail + 1;
3449 169 mohor
            end
3450 181 mohor
          end
3451
          else // with preamble
3452
          begin
3453
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3454
            begin
3455
              test_fail("Second scan request did not proceed correctly");
3456
              fail = fail + 1;
3457
            end
3458
          end
3459
        end
3460
        join
3461
        // reset counter 
3462
        #Tp cnt = 0;
3463
        // SLIDING LINK DOWN and CHECK
3464
        fork
3465
          begin
3466
          // set link down
3467
            repeat(i) @(posedge Mdc_O);
3468
            // set link down
3469
            #Tp eth_phy.link_up_down(0);
3470
          end
3471
          begin
3472
          // check data in MII registers after each scan in this fork statement
3473 169 mohor
            if (i2) // without preamble
3474 181 mohor
              wait (cnt == 32);
3475
            else // with preamble
3476
              wait (cnt == 64);
3477
            repeat(3) @(posedge Mdc_O);
3478
            // read data from PHY status register
3479 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3480 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3481 169 mohor
            begin
3482 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3483 169 mohor
              begin
3484 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3485 169 mohor
                fail = fail + 1;
3486
              end
3487
            end
3488 181 mohor
            else
3489 169 mohor
            begin
3490 181 mohor
              if (phy_data !== tmp_data)
3491 169 mohor
              begin
3492 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3493 169 mohor
                fail = fail + 1;
3494
              end
3495
            end
3496 181 mohor
            // read data from MII status register
3497 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3498 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3499 169 mohor
            begin
3500 181 mohor
              if (phy_data[0] === 1'b0)
3501
              begin
3502
                test_fail("Link FAIL bit was not set in the MII status register");
3503
                fail = fail + 1;
3504
              end
3505 169 mohor
            end
3506 181 mohor
            else
3507 169 mohor
            begin
3508 181 mohor
              if (phy_data[0] !== 1'b0)
3509 169 mohor
              begin
3510 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3511 169 mohor
                fail = fail + 1;
3512
              end
3513
            end
3514 181 mohor
          end
3515
          begin
3516
          // check length
3517
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3518 169 mohor
            begin
3519 181 mohor
              #Tp cnt = 0;
3520
              // wait for serial bus to become active if there is more than one scan
3521
              wait(Mdio_IO !== 1'bz);
3522
              // count transfer length
3523
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3524 169 mohor
              begin
3525 181 mohor
                @(posedge Mdc_O);
3526
                #Tp cnt = cnt + 1;
3527 169 mohor
              end
3528 181 mohor
              // check transfer length
3529
              if (i2) // without preamble
3530
              begin
3531
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3532
                begin
3533
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3534
                  fail = fail + 1;
3535
                end
3536
              end
3537
              else // with preamble
3538
              begin
3539
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3540
                begin
3541
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3542
                  fail = fail + 1;
3543
                end
3544
              end
3545 169 mohor
            end
3546
          end
3547
        join
3548 181 mohor
        // reset counter
3549
        #Tp cnt = 0;
3550
        // check fifth scan and data from fourth scan
3551
        fork
3552 169 mohor
        begin
3553 181 mohor
          repeat(2) @(posedge Mdc_O);
3554
          // read data from PHY status register
3555 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3556 181 mohor
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3557 169 mohor
          begin
3558 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3559
            fail = fail + 1;
3560 169 mohor
          end
3561 181 mohor
          // read data from MII status register
3562 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3563 181 mohor
          if (phy_data[0] === 1'b0)
3564 169 mohor
          begin
3565 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3566 169 mohor
            fail = fail + 1;
3567
          end
3568
        end
3569
        begin
3570 181 mohor
        // Completely check intermediate scan
3571
          #Tp cnt = 0;
3572
          // wait for serial bus to become active - second scan
3573 169 mohor
          wait(Mdio_IO !== 1'bz);
3574
          // count transfer length
3575
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3576
          begin
3577
            @(posedge Mdc_O);
3578
            #Tp cnt = cnt + 1;
3579
          end
3580 181 mohor
          // check transfer length
3581
          if (i2) // without preamble
3582 169 mohor
          begin
3583 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3584
            begin
3585
              test_fail("Fifth scan request did not proceed correctly");
3586
              fail = fail + 1;
3587
            end
3588 169 mohor
          end
3589 181 mohor
          else // with preamble
3590
          begin
3591
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3592
            begin
3593
              test_fail("Fifth scan request did not proceed correctly");
3594
              fail = fail + 1;
3595
            end
3596
          end
3597 169 mohor
        end
3598 181 mohor
        join
3599
        // reset counter 
3600
        #Tp cnt = 0;
3601
        // SLIDING LINK UP and CHECK
3602
        fork
3603 169 mohor
          begin
3604 181 mohor
          // set link up
3605
            repeat(i) @(posedge Mdc_O);
3606
            // set link up
3607
            #Tp eth_phy.link_up_down(1);
3608 169 mohor
          end
3609 181 mohor
          begin
3610
          // check data in MII registers after each scan in this fork statement
3611
            repeat(2) @(posedge Mdc_O);
3612
            if (i2) // without preamble
3613
              wait (cnt == 32);
3614
            else // with preamble
3615
              wait (cnt == 64);
3616
            repeat(3) @(posedge Mdc_O);
3617
            // read data from PHY status register
3618 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3619 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3620
            begin
3621
              if (phy_data !== tmp_data)
3622
              begin
3623
                test_fail("6. data was not correctly scaned from status register");
3624
                fail = fail + 1;
3625
              end
3626
            end
3627
            else
3628
            begin
3629
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3630
              begin
3631
                test_fail("6. data was not correctly scaned from status register");
3632
                fail = fail + 1;
3633
              end
3634
            end
3635
            // read data from MII status register
3636 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3637 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3638
            begin
3639
              if (phy_data[0] !== 1'b0)
3640
              begin
3641
                test_fail("Link FAIL bit was set in the MII status register");
3642
                fail = fail + 1;
3643
              end
3644
            end
3645
            else
3646
            begin
3647
              if (phy_data[0] === 1'b0)
3648
              begin
3649
                test_fail("Link FAIL bit was not set in the MII status register");
3650
                fail = fail + 1;
3651
              end
3652
            end
3653
          end
3654
          begin
3655
          // check length
3656
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3657
            begin
3658
              #Tp cnt = 0;
3659
              // wait for serial bus to become active if there is more than one scan
3660
              wait(Mdio_IO !== 1'bz);
3661
              // count transfer length
3662
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3663
              begin
3664
                @(posedge Mdc_O);
3665
                #Tp cnt = cnt + 1;
3666
              end
3667
              // check transfer length
3668
              if (i2) // without preamble
3669
              begin
3670
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3671
                begin
3672
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3673
                  fail = fail + 1;
3674
                end
3675
              end
3676
              else // with preamble
3677
              begin
3678
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3679
                begin
3680
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3681
                  fail = fail + 1;
3682
                end
3683
              end
3684
            end
3685
          end
3686
        join
3687
        // check last scan 
3688
        repeat(4) @(posedge Mdc_O);
3689
        // read data from PHY status register
3690 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3691 181 mohor
        if (phy_data !== tmp_data)
3692
        begin
3693
          test_fail("7. data was not correctly scaned from status register");
3694
          fail = fail + 1;
3695 169 mohor
        end
3696 181 mohor
        // read data from MII status register
3697 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3698 181 mohor
        if (phy_data[0] !== 1'b0)
3699
        begin
3700
          test_fail("Link FAIL bit was set in the MII status register");
3701
          fail = fail + 1;
3702
        end
3703
 
3704
        #Tp mii_scan_finish; // finish scan operation
3705
        #Tp check_mii_busy; // wait for scan to finish
3706
        #Tp;
3707
        // set delay of writing the command
3708
        if (i2) // without preamble
3709
        begin
3710
          case(i)
3711
            0,  1,  2,  3,  4:  i = i + 1;
3712
            13, 14, 15, 16, 17,
3713
            18, 19, 20, 21, 22,
3714
            23, 24, 25, 26, 27,
3715
            28, 29, 30, 31, 32,
3716
            33, 34, 35:         i = i + 1;
3717
            36:                 i = 80;
3718
            default:            i = 13;
3719
          endcase
3720
        end
3721 169 mohor
        else // with preamble
3722
        begin
3723 181 mohor
          case(i)
3724
            0,  1,  2,  3,  4:  i = i + 1;
3725
            45, 46, 47, 48, 49,
3726
            50, 51, 52, 53, 54,
3727
            55, 56, 57, 58, 59,
3728
            60, 61, 62, 63, 64,
3729
            65, 66, 67:         i = i + 1;
3730
            68:                 i = 80;
3731
            default:            i = 45;
3732
          endcase
3733 169 mohor
        end
3734 181 mohor
        @(posedge wb_clk);
3735
        #Tp;
3736 169 mohor
      end
3737
    end
3738 181 mohor
    // set PHY to normal mode
3739
    #Tp eth_phy.preamble_suppresed(0);
3740
    // MII mode register
3741
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3742
    if(fail == 0)
3743
      test_ok;
3744
    else
3745
      fail = 0;
3746 169 mohor
  end
3747
 
3748
 
3749 181 mohor
  ////////////////////////////////////////////////////////////////////
3750
  ////                                                            ////
3751
  ////  Test sliding stop scan command immediately after scan     ////
3752
  ////  request (with and without preamble)                       ////
3753
  ////                                                            ////
3754
  ////////////////////////////////////////////////////////////////////
3755
  if (test_num == 16) // 
3756 116 mohor
  begin
3757 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3758
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3759 181 mohor
    `TIME;
3760 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3761 181 mohor
 
3762
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3763 169 mohor
    begin
3764 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3765
      // MII mode register
3766
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3767
                wbm_subseq_waits);
3768
      i = 0;
3769
      cnt = 0;
3770
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3771 169 mohor
      begin
3772 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3773 169 mohor
        begin
3774 181 mohor
          // set address
3775
          reg_addr = 5'h0; // control register
3776
          phy_addr = 5'h1; // correct PHY address
3777
          cnt = 0;
3778
          // scan request
3779
          #Tp mii_scan_req(phy_addr, reg_addr);
3780
          fork
3781
            begin
3782
              repeat(i) @(posedge Mdc_O);
3783
              // write command 0x0 into MII command register
3784
              // MII command written while scan in progress
3785
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3786
              @(posedge wb_clk);
3787
              #Tp check_mii_busy; // wait for scan to finish
3788
              @(posedge wb_clk);
3789
              disable check;
3790
            end
3791
            begin: check
3792
              // wait for serial bus to become active
3793
              wait(Mdio_IO !== 1'bz);
3794
              // count transfer length
3795
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3796
              begin
3797
                @(posedge Mdc_O);
3798
                #Tp cnt = cnt + 1;
3799
              end
3800
              // check transfer length
3801
              if (i2) // without preamble
3802
              begin
3803
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3804
                begin
3805
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3806
                  fail = fail + 1;
3807
                end
3808
              end
3809
              else // with preamble
3810
              begin
3811
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3812
                begin
3813
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3814
                  fail = fail + 1;
3815
                end
3816
              end
3817
              cnt = 0;
3818
              // wait for serial bus to become active if there is more than one scan
3819
              wait(Mdio_IO !== 1'bz);
3820
              // count transfer length
3821
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3822
              begin
3823
                @(posedge Mdc_O);
3824
                #Tp cnt = cnt + 1;
3825
              end
3826
              // check transfer length
3827
              if (i2) // without preamble
3828
              begin
3829
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3830
                begin
3831
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3832
                  fail = fail + 1;
3833
                end
3834
              end
3835
              else // with preamble
3836
              begin
3837
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3838
                begin
3839
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3840
                  fail = fail + 1;
3841
                end
3842
              end
3843
            end
3844
          join
3845
          // check the BUSY signal to see if the bus is still IDLE
3846
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3847
            check_mii_busy; // wait for bus to become idle
3848
 
3849
          // try normal write or read after scan was finished
3850
          phy_data = {8'h7D, (i[7:0] + 1)};
3851
          cnt = 0;
3852
          if (i3 == 0) // write after scan
3853 169 mohor
          begin
3854 181 mohor
            // write request
3855
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3856
            // wait for serial bus to become active
3857
            wait(Mdio_IO !== 1'bz);
3858
            // count transfer length
3859
            while(Mdio_IO !== 1'bz)
3860
            begin
3861
              @(posedge Mdc_O);
3862
              #Tp cnt = cnt + 1;
3863
            end
3864 169 mohor
            @(posedge Mdc_O);
3865 181 mohor
            // read request
3866
            #Tp mii_read_req(phy_addr, reg_addr);
3867
            check_mii_busy; // wait for read to finish
3868
            // read and check data
3869 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3870 181 mohor
            if (phy_data !== tmp_data)
3871 169 mohor
            begin
3872 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3873 169 mohor
              fail = fail + 1;
3874
            end
3875
          end
3876 181 mohor
          else // read after scan
3877 169 mohor
          begin
3878 181 mohor
            // read request
3879
            #Tp mii_read_req(phy_addr, reg_addr);
3880
            // wait for serial bus to become active
3881
            wait(Mdio_IO !== 1'bz);
3882
            // count transfer length
3883
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3884 169 mohor
            begin
3885 181 mohor
              @(posedge Mdc_O);
3886
              #Tp cnt = cnt + 1;
3887
            end
3888
            @(posedge Mdc_O);
3889
            check_mii_busy; // wait for read to finish
3890
            // read and check data
3891 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3892 181 mohor
            if (phy_data !== tmp_data)
3893
            begin
3894
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3895 169 mohor
              fail = fail + 1;
3896
            end
3897
          end
3898 181 mohor
          // check if transfer was a proper length
3899 169 mohor
          if (i2) // without preamble
3900
          begin
3901
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3902
            begin
3903 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3904 169 mohor
              fail = fail + 1;
3905
            end
3906
          end
3907
          else // with preamble
3908
          begin
3909
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3910
            begin
3911 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3912 169 mohor
              fail = fail + 1;
3913
            end
3914
          end
3915
        end
3916 181 mohor
        #Tp;
3917
        // set delay of writing the command
3918
        if (i2) // without preamble
3919
        begin
3920
          case(i)
3921
            0, 1:               i = i + 1;
3922
            18, 19, 20, 21, 22,
3923
            23, 24, 25, 26, 27,
3924
            28, 29, 30, 31, 32,
3925
            33, 34, 35:         i = i + 1;
3926
            36:                 i = 80;
3927
            default:            i = 18;
3928
          endcase
3929
        end
3930
        else // with preamble
3931
        begin
3932
          case(i)
3933
            0, 1:               i = i + 1;
3934
            50, 51, 52, 53, 54,
3935
            55, 56, 57, 58, 59,
3936
            60, 61, 62, 63, 64,
3937
            65, 66, 67:         i = i + 1;
3938
            68:                 i = 80;
3939
            default:            i = 50;
3940
          endcase
3941
        end
3942
        @(posedge wb_clk);
3943
      end
3944
    end
3945
    // set PHY to normal mode
3946
    #Tp eth_phy.preamble_suppresed(0);
3947
    // MII mode register
3948
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3949
    if(fail == 0)
3950
      test_ok;
3951
    else
3952
      fail = 0;
3953
  end
3954 169 mohor
 
3955 181 mohor
 
3956
  ////////////////////////////////////////////////////////////////////
3957
  ////                                                            ////
3958
  ////  Test sliding stop scan command after 2. scan (with and    ////
3959
  ////  without preamble)                                         ////
3960
  ////                                                            ////
3961
  ////////////////////////////////////////////////////////////////////
3962
  if (test_num == 17) // 
3963
  begin
3964 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3965
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3966
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3967 181 mohor
 
3968
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3969
    begin
3970
      #Tp eth_phy.preamble_suppresed(i2);
3971
      // MII mode register
3972
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3973
                wbm_subseq_waits);
3974
 
3975
      i = 0;
3976
      cnt = 0;
3977
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3978
      begin
3979
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3980
        begin
3981
          // first there are two scans
3982
          // set address
3983
          reg_addr = 5'h0; // control register
3984
          phy_addr = 5'h1; // correct PHY address
3985
          cnt = 0;
3986
          // scan request
3987
          #Tp mii_scan_req(phy_addr, reg_addr);
3988
          // wait and check first 2 scans
3989 169 mohor
          begin
3990
            // wait for serial bus to become active
3991
            wait(Mdio_IO !== 1'bz);
3992
            // count transfer length
3993
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3994
            begin
3995
              @(posedge Mdc_O);
3996
              #Tp cnt = cnt + 1;
3997
            end
3998
            // check transfer length
3999
            if (i2) // without preamble
4000
            begin
4001
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
4002
              begin
4003
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4004
                fail = fail + 1;
4005
              end
4006
            end
4007
            else // with preamble
4008
            begin
4009
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
4010
              begin
4011
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4012
                fail = fail + 1;
4013
              end
4014
            end
4015
            cnt = 0;
4016
            // wait for serial bus to become active if there is more than one scan
4017
            wait(Mdio_IO !== 1'bz);
4018
            // count transfer length
4019
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4020
            begin
4021
              @(posedge Mdc_O);
4022
              #Tp cnt = cnt + 1;
4023
            end
4024
            // check transfer length
4025
            if (i2) // without preamble
4026
            begin
4027
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
4028
              begin
4029
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4030
                fail = fail + 1;
4031
              end
4032
            end
4033
            else // with preamble
4034
            begin
4035
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
4036
              begin
4037
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4038
                fail = fail + 1;
4039
              end
4040
            end
4041
          end
4042
 
4043 181 mohor
          // reset counter 
4044
          cnt = 0;
4045
          fork
4046
            begin
4047
              repeat(i) @(posedge Mdc_O);
4048
              // write command 0x0 into MII command register
4049
              // MII command written while scan in progress
4050
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4051
              @(posedge wb_clk);
4052
              #Tp check_mii_busy; // wait for scan to finish
4053
              @(posedge wb_clk);
4054
              disable check_3;
4055
            end
4056
            begin: check_3
4057
              // wait for serial bus to become active
4058
              wait(Mdio_IO !== 1'bz);
4059
              // count transfer length
4060
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4061
              begin
4062
                @(posedge Mdc_O);
4063
                #Tp cnt = cnt + 1;
4064
              end
4065
              // check transfer length
4066
              if (i2) // without preamble
4067
              begin
4068
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
4069
                begin
4070
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4071
                  fail = fail + 1;
4072
                end
4073
              end
4074
              else // with preamble
4075
              begin
4076
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
4077
                begin
4078
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4079
                  fail = fail + 1;
4080
                end
4081
              end
4082
              cnt = 0;
4083
              // wait for serial bus to become active if there is more than one scan
4084
              wait(Mdio_IO !== 1'bz);
4085
              // count transfer length
4086
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4087
              begin
4088
                @(posedge Mdc_O);
4089
                #Tp cnt = cnt + 1;
4090
              end
4091
              // check transfer length
4092
              if (i2) // without preamble
4093
              begin
4094
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
4095
                begin
4096
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4097
                  fail = fail + 1;
4098
                end
4099
              end
4100
              else // with preamble
4101
              begin
4102
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
4103
                begin
4104
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
4105
                  fail = fail + 1;
4106
                end
4107
              end
4108
            end
4109
          join
4110
          // check the BUSY signal to see if the bus is still IDLE
4111
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
4112
            check_mii_busy; // wait for bus to become idle
4113
 
4114
          // try normal write or read after scan was finished
4115
          phy_data = {8'h7D, (i[7:0] + 1)};
4116
          cnt = 0;
4117
          if (i3 == 0) // write after scan
4118 169 mohor
          begin
4119 181 mohor
            // write request
4120
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
4121
            // wait for serial bus to become active
4122
            wait(Mdio_IO !== 1'bz);
4123
            // count transfer length
4124
            while(Mdio_IO !== 1'bz)
4125
            begin
4126
              @(posedge Mdc_O);
4127
              #Tp cnt = cnt + 1;
4128
            end
4129 169 mohor
            @(posedge Mdc_O);
4130 181 mohor
            // read request
4131
            #Tp mii_read_req(phy_addr, reg_addr);
4132
            check_mii_busy; // wait for read to finish
4133
            // read and check data
4134 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4135 181 mohor
            if (phy_data !== tmp_data)
4136
            begin
4137
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4138
              fail = fail + 1;
4139
            end
4140 169 mohor
          end
4141 181 mohor
          else // read after scan
4142 169 mohor
          begin
4143 181 mohor
            // read request
4144
            #Tp mii_read_req(phy_addr, reg_addr);
4145
            // wait for serial bus to become active
4146
            wait(Mdio_IO !== 1'bz);
4147
            // count transfer length
4148
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4149
            begin
4150
              @(posedge Mdc_O);
4151
              #Tp cnt = cnt + 1;
4152
            end
4153
            @(posedge Mdc_O);
4154
            check_mii_busy; // wait for read to finish
4155
            // read and check data
4156 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4157 181 mohor
            if (phy_data !== tmp_data)
4158
            begin
4159
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4160
              fail = fail + 1;
4161
            end
4162 169 mohor
          end
4163 181 mohor
          // check if transfer was a proper length
4164
          if (i2) // without preamble
4165 169 mohor
          begin
4166 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
4167
            begin
4168
              test_fail("New request did not proceed correctly, after scan request");
4169
              fail = fail + 1;
4170
            end
4171 169 mohor
          end
4172 181 mohor
          else // with preamble
4173 169 mohor
          begin
4174 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
4175
            begin
4176
              test_fail("New request did not proceed correctly, after scan request");
4177
              fail = fail + 1;
4178
            end
4179 169 mohor
          end
4180
        end
4181 181 mohor
        #Tp;
4182
        // set delay of writing the command
4183 169 mohor
        if (i2) // without preamble
4184
        begin
4185 181 mohor
          case(i)
4186
            0, 1:               i = i + 1;
4187
            18, 19, 20, 21, 22,
4188
            23, 24, 25, 26, 27,
4189
            28, 29, 30, 31, 32,
4190
            33, 34, 35:         i = i + 1;
4191
            36:                 i = 80;
4192
            default:            i = 18;
4193
          endcase
4194 169 mohor
        end
4195
        else // with preamble
4196
        begin
4197 181 mohor
          case(i)
4198
            0, 1:               i = i + 1;
4199
            50, 51, 52, 53, 54,
4200
            55, 56, 57, 58, 59,
4201
            60, 61, 62, 63, 64,
4202
            65, 66, 67:         i = i + 1;
4203
            68:                 i = 80;
4204
            default:            i = 50;
4205
          endcase
4206 169 mohor
        end
4207 181 mohor
        @(posedge wb_clk);
4208 116 mohor
      end
4209
    end
4210 181 mohor
    // set PHY to normal mode
4211
    #Tp eth_phy.preamble_suppresed(0);
4212
    // MII mode register
4213
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4214
    if(fail == 0)
4215
      test_ok;
4216
    else
4217
      fail = 0;
4218 169 mohor
  end
4219 116 mohor
 
4220 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4221
 
4222 169 mohor
end
4223
endtask // test_mii
4224
 
4225
 
4226
task test_mac_full_duplex_transmit;
4227
  input  [31:0]  start_task;
4228
  input  [31:0]  end_task;
4229
  integer        bit_start_1;
4230
  integer        bit_end_1;
4231
  integer        bit_start_2;
4232
  integer        bit_end_2;
4233
  integer        num_of_reg;
4234 209 tadejm
  integer        num_of_frames;
4235
  integer        num_of_bd;
4236 169 mohor
  integer        i_addr;
4237
  integer        i_data;
4238
  integer        i_length;
4239 209 tadejm
  integer        tmp_len;
4240
  integer        tmp_bd;
4241
  integer        tmp_bd_num;
4242 169 mohor
  integer        tmp_data;
4243 209 tadejm
  integer        tmp_ipgt;
4244 194 tadej
  integer        test_num;
4245 169 mohor
  reg    [31:0]  tx_bd_num;
4246
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4247
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4248
  integer        i;
4249
  integer        i1;
4250
  integer        i2;
4251
  integer        i3;
4252
  integer        fail;
4253
  integer        speed;
4254 279 mohor
  reg            no_underrun;
4255 209 tadejm
  reg            frame_started;
4256
  reg            frame_ended;
4257
  reg            wait_for_frame;
4258 169 mohor
  reg    [31:0]  addr;
4259
  reg    [31:0]  data;
4260
  reg    [31:0]  tmp;
4261
  reg    [ 7:0]  st_data;
4262
  reg    [15:0]  max_tmp;
4263
  reg    [15:0]  min_tmp;
4264 279 mohor
 
4265 169 mohor
begin
4266
// MAC FULL DUPLEX TRANSMIT TEST
4267
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4268
$display(" ");
4269
$display("MAC FULL DUPLEX TRANSMIT TEST");
4270
fail = 0;
4271
 
4272
// reset MAC registers
4273
hard_reset;
4274
// reset MAC and MII LOGIC with soft reset
4275 274 tadejm
//reset_mac;
4276
//reset_mii;
4277 169 mohor
// set wb slave response
4278
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4279
 
4280
  /*
4281
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4282
  -------------------------------------------------------------------------------------
4283
  set_tx_bd
4284
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4285
  set_tx_bd_wrap
4286
    (tx_bd_num_end[6:0]);
4287
  set_tx_bd_ready
4288
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4289
  check_tx_bd
4290
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4291
  clear_tx_bd
4292
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4293
 
4294
  TASKS for set and control RX buffer descriptors:
4295
  ------------------------------------------------
4296
  set_rx_bd
4297
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4298
  set_rx_bd_wrap
4299
    (rx_bd_num_end[6:0]);
4300
  set_rx_bd_empty
4301
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4302
  check_rx_bd
4303
    (rx_bd_num_end[6:0], rx_bd_status);
4304
  clear_rx_bd
4305
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4306
 
4307
  TASKS for set and check TX packets:
4308
  -----------------------------------
4309
  set_tx_packet
4310
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4311
  check_tx_packet
4312
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4313
 
4314
  TASKS for set and check RX packets:
4315
  -----------------------------------
4316
  set_rx_packet
4317
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4318
  check_rx_packet
4319
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4320
 
4321
  TASKS for append and check CRC to/of TX packet:
4322
  -----------------------------------------------
4323
  append_tx_crc
4324
    (txpnt_wb[31:0], len[15:0], negated_crc);
4325
  check_tx_crc
4326
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4327
 
4328
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4329
  --------------------------------------------------------------------------------
4330
  append_rx_crc
4331
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4332
  */
4333
 
4334 194 tadej
//////////////////////////////////////////////////////////////////////
4335
////                                                              ////
4336
////  test_mac_full_duplex_transmit:                              ////
4337
////                                                              ////
4338
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4339
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4340
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4341
////     one TX buffer decriptor ( 10Mbps ).                      ////
4342
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4343
////     one TX buffer decriptor ( 100Mbps ).                     ////
4344
////                                                              ////
4345
//////////////////////////////////////////////////////////////////////
4346
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4347 169 mohor
begin
4348
 
4349 194 tadej
  ////////////////////////////////////////////////////////////////////
4350
  ////                                                            ////
4351
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4352
  ////                                                            ////
4353
  ////////////////////////////////////////////////////////////////////
4354
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4355 169 mohor
  begin
4356 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4357
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4358
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4359
 
4360
    // unmask interrupts
4361 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4362 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4363
    // set all buffer descriptors to RX - must be set before TX enable
4364 274 tadejm
    wait (wbm_working == 0);
4365 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4366
    // enable TX, set full-duplex mode, padding and CRC appending
4367 274 tadejm
    wait (wbm_working == 0);
4368 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4369
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4370
 
4371
    // write to phy's control register for 10Mbps
4372
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4373
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4374
    speed = 10;
4375
 
4376
    i = 0;
4377
    while (i < 128)
4378 169 mohor
    begin
4379 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4380 169 mohor
      begin
4381 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4382
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4383 169 mohor
      end
4384 194 tadej
      set_tx_bd_wrap(i);
4385
      fork
4386
        begin
4387
          set_tx_bd_ready(0, i);
4388
          repeat(20) @(negedge mtx_clk);
4389
          #1 disable check_tx_en10;
4390
        end
4391
        begin: check_tx_en10
4392
          wait (MTxEn === 1'b1);
4393
          test_fail("Tramsmit should not start at all");
4394
          fail = fail + 1;
4395
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4396
        end
4397
      join
4398
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4399 169 mohor
      begin
4400 194 tadej
        check_tx_bd(0, tmp);
4401
        #1;
4402
        if (tmp[15] === 1'b0)
4403
        begin
4404
          test_fail("Tramsmit should not start at all");
4405
          fail = fail + 1;
4406
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4407
        end
4408
        if (tmp[8:0] !== 0)
4409
        begin
4410
          test_fail("Tramsmit should not be finished since it should not start at all");
4411
          fail = fail + 1;
4412
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4413
        end
4414
        @(posedge wb_clk);
4415 169 mohor
      end
4416 274 tadejm
      wait (wbm_working == 0);
4417 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4418
      if (tmp[6:0] !== 0)
4419 169 mohor
      begin
4420 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4421 169 mohor
        fail = fail + 1;
4422 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4423 169 mohor
      end
4424 194 tadej
      clear_tx_bd(0, i);
4425
      if ((i < 5) || (i > 124))
4426
        i = i + 1;
4427
      else
4428
        i = i + 120;
4429 116 mohor
    end
4430 194 tadej
    // disable TX
4431 274 tadejm
    wait (wbm_working == 0);
4432 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4433
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4434
    if(fail == 0)
4435
      test_ok;
4436 116 mohor
    else
4437 194 tadej
      fail = 0;
4438 169 mohor
  end
4439 116 mohor
 
4440
 
4441 194 tadej
  ////////////////////////////////////////////////////////////////////
4442
  ////                                                            ////
4443
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4444
  ////                                                            ////
4445
  ////////////////////////////////////////////////////////////////////
4446
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4447 169 mohor
  begin
4448 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4449
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4450
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4451
 
4452
    // unmask interrupts
4453 274 tadejm
    wait (wbm_working == 0);
4454 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4455 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4456
    // set all buffer descriptors to RX - must be set before TX enable
4457 274 tadejm
    wait (wbm_working == 0);
4458 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4459
    // enable TX, set full-duplex mode, padding and CRC appending
4460 274 tadejm
    wait (wbm_working == 0);
4461 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4462
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4463
 
4464
    // write to phy's control register for 100Mbps
4465
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4466
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4467
    speed = 100;
4468
 
4469
    i = 0;
4470
    while (i < 128)
4471 169 mohor
    begin
4472 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4473 169 mohor
      begin
4474 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4475
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4476 169 mohor
      end
4477 194 tadej
      set_tx_bd_wrap(i);
4478
      fork
4479
        begin
4480
          set_tx_bd_ready(0, i);
4481
          repeat(20) @(negedge mtx_clk);
4482
          #1 disable check_tx_en100;
4483
        end
4484
        begin: check_tx_en100
4485
          wait (MTxEn === 1'b1);
4486
          test_fail("Tramsmit should not start at all");
4487
          fail = fail + 1;
4488
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4489
        end
4490
      join
4491
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4492 169 mohor
      begin
4493 194 tadej
        check_tx_bd(0, tmp);
4494
        #1;
4495
        if (tmp[15] === 1'b0)
4496
        begin
4497
          test_fail("Tramsmit should not start at all");
4498
          fail = fail + 1;
4499
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4500
        end
4501
        if (tmp[8:0] !== 0)
4502
        begin
4503
          test_fail("Tramsmit should not be finished since it should not start at all");
4504
          fail = fail + 1;
4505
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4506
        end
4507
        @(posedge wb_clk);
4508 169 mohor
      end
4509 274 tadejm
      wait (wbm_working == 0);
4510 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4511
      if (tmp[6:0] !== 0)
4512 169 mohor
      begin
4513 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4514 169 mohor
        fail = fail + 1;
4515 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4516 169 mohor
      end
4517 194 tadej
      clear_tx_bd(0, i);
4518
      if ((i < 5) || (i > 124))
4519
        i = i + 1;
4520
      else
4521
        i = i + 120;
4522 169 mohor
    end
4523 194 tadej
    // disable TX
4524 274 tadejm
    wait (wbm_working == 0);
4525 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4526
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4527
    if(fail == 0)
4528
      test_ok;
4529 169 mohor
    else
4530 194 tadej
      fail = 0;
4531 169 mohor
  end
4532
 
4533
 
4534 194 tadej
  ////////////////////////////////////////////////////////////////////
4535
  ////                                                            ////
4536
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4537
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4538
  ////                                                            ////
4539
  ////////////////////////////////////////////////////////////////////
4540 209 tadejm
  if (test_num == 2) // without and with padding
4541 169 mohor
  begin
4542 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4543
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4544
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4545
 
4546
    max_tmp = 0;
4547
    min_tmp = 0;
4548
    // set one TX buffer descriptor - must be set before TX enable
4549 274 tadejm
    wait (wbm_working == 0);
4550 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4551 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4552 274 tadejm
    wait (wbm_working == 0);
4553 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4554 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4555
    // prepare two packets of MAXFL length
4556 274 tadejm
    wait (wbm_working == 0);
4557 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4558
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4559
    min_tmp = tmp[31:16];
4560 209 tadejm
    st_data = 8'h01;
4561
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4562 194 tadej
    st_data = 8'h10;
4563 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4564 194 tadej
    // check WB INT signal
4565
    if (wb_int !== 1'b0)
4566 169 mohor
    begin
4567 194 tadej
      test_fail("WB INT signal should not be set");
4568
      fail = fail + 1;
4569 169 mohor
    end
4570 194 tadej
 
4571
    // write to phy's control register for 10Mbps
4572
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4573
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4574
    speed = 10;
4575
 
4576
    i_length = (min_tmp - 4);
4577
    while (i_length <= (max_tmp - 4))
4578 169 mohor
    begin
4579 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4580
      case (i_length[1:0])
4581
      2'h0: // Interrupt is generated
4582 169 mohor
      begin
4583 194 tadej
        // enable interrupt generation
4584 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4585 194 tadej
        // unmask interrupts
4586 274 tadejm
        wait (wbm_working == 0);
4587 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4588 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4589
        // not detect carrier sense in FD and no collision
4590
        eth_phy.carrier_sense_tx_fd_detect(0);
4591
        eth_phy.collision(0);
4592 169 mohor
      end
4593 194 tadej
      2'h1: // Interrupt is not generated
4594 169 mohor
      begin
4595 194 tadej
        // enable interrupt generation
4596 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4597 194 tadej
        // mask interrupts
4598 274 tadejm
        wait (wbm_working == 0);
4599 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4600
        // detect carrier sense in FD and no collision
4601
        eth_phy.carrier_sense_tx_fd_detect(1);
4602
        eth_phy.collision(0);
4603 169 mohor
      end
4604 194 tadej
      2'h2: // Interrupt is not generated
4605
      begin
4606
        // disable interrupt generation
4607 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4608 194 tadej
        // unmask interrupts
4609 274 tadejm
        wait (wbm_working == 0);
4610 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4611 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4612
        // not detect carrier sense in FD and set collision
4613
        eth_phy.carrier_sense_tx_fd_detect(0);
4614
        eth_phy.collision(1);
4615
      end
4616
      default: // 2'h3: // Interrupt is not generated
4617
      begin
4618
        // disable interrupt generation
4619 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4620 194 tadej
        // mask interrupts
4621 274 tadejm
        wait (wbm_working == 0);
4622 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4623
        // detect carrier sense in FD and set collision
4624
        eth_phy.carrier_sense_tx_fd_detect(1);
4625
        eth_phy.collision(1);
4626
      end
4627
      endcase
4628
      eth_phy.set_tx_mem_addr(max_tmp);
4629
      // set wrap bit
4630
      set_tx_bd_wrap(0);
4631
      set_tx_bd_ready(0, 0);
4632 169 mohor
      #1 check_tx_bd(0, data);
4633 274 tadejm
 
4634
 
4635 194 tadej
      if (i_length < min_tmp) // just first four
4636 169 mohor
      begin
4637 194 tadej
        while (data[15] === 1)
4638
        begin
4639
          #1 check_tx_bd(0, data);
4640
          @(posedge wb_clk);
4641
        end
4642 209 tadejm
        repeat (1) @(posedge wb_clk);
4643 169 mohor
      end
4644 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4645 192 tadej
      begin
4646 194 tadej
        tmp = 0;
4647
        wait (MTxEn === 1'b1); // start transmit
4648
        while (tmp < (i_length - 20))
4649
        begin
4650
          #1 tmp = tmp + 1;
4651
          @(posedge wb_clk);
4652
        end
4653
        #1 check_tx_bd(0, data);
4654
        while (data[15] === 1)
4655
        begin
4656
          #1 check_tx_bd(0, data);
4657
          @(posedge wb_clk);
4658
        end
4659 209 tadejm
        repeat (1) @(posedge wb_clk);
4660 192 tadej
      end
4661
      else
4662
      begin
4663 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4664
        #1 check_tx_bd(0, data);
4665
        if (data[15] !== 1)
4666
        begin
4667
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4668
          fail = fail + 1;
4669
        end
4670
        wait (MTxEn === 1'b0); // end transmit
4671
        while (data[15] === 1)
4672
        begin
4673
          #1 check_tx_bd(0, data);
4674
          @(posedge wb_clk);
4675
        end
4676
        repeat (1) @(posedge wb_clk);
4677 192 tadej
      end
4678 274 tadejm
 
4679 279 mohor
      repeat(5) @(posedge mtx_clk);  // Wait some time so PHY stores the CRC
4680 274 tadejm
 
4681 194 tadej
      // check length of a PACKET
4682
      if (eth_phy.tx_len != (i_length + 4))
4683 192 tadej
      begin
4684 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4685 192 tadej
        fail = fail + 1;
4686
      end
4687 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4688
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4689 192 tadej
      begin
4690 194 tadej
        // check transmitted TX packet data
4691
        if (i_length[0] == 0)
4692
        begin
4693 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4694 194 tadej
        end
4695
        else
4696
        begin
4697 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4698 194 tadej
        end
4699
        if (tmp > 0)
4700
        begin
4701
          test_fail("Wrong data of the transmitted packet");
4702
          fail = fail + 1;
4703
        end
4704
        // check transmited TX packet CRC
4705
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4706 274 tadejm
 
4707 194 tadej
        if (tmp > 0)
4708
        begin
4709
          test_fail("Wrong CRC of the transmitted packet");
4710
          fail = fail + 1;
4711
        end
4712 192 tadej
      end
4713 194 tadej
      // check WB INT signal
4714
      if (i_length[1:0] == 2'h0)
4715 192 tadej
      begin
4716 194 tadej
        if (wb_int !== 1'b1)
4717
        begin
4718
          `TIME; $display("*E WB INT signal should be set");
4719
          test_fail("WB INT signal should be set");
4720
          fail = fail + 1;
4721
        end
4722 192 tadej
      end
4723 194 tadej
      else
4724 192 tadej
      begin
4725 194 tadej
        if (wb_int !== 1'b0)
4726
        begin
4727
          `TIME; $display("*E WB INT signal should not be set");
4728
          test_fail("WB INT signal should not be set");
4729
          fail = fail + 1;
4730
        end
4731 192 tadej
      end
4732 194 tadej
      // check TX buffer descriptor of a packet
4733
      check_tx_bd(0, data);
4734
      if (i_length[1] == 1'b0) // interrupt enabled
4735 192 tadej
      begin
4736 194 tadej
        if (data[15:0] !== 16'h7800)
4737
        begin
4738
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4739
          test_fail("TX buffer descriptor status is not correct");
4740
          fail = fail + 1;
4741
        end
4742 192 tadej
      end
4743 194 tadej
      else // interrupt not enabled
4744 192 tadej
      begin
4745 194 tadej
        if (data[15:0] !== 16'h3800)
4746
        begin
4747
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4748
          test_fail("TX buffer descriptor status is not correct");
4749
          fail = fail + 1;
4750
        end
4751 192 tadej
      end
4752 194 tadej
      // clear TX buffer descriptor
4753
      clear_tx_bd(0, 0);
4754
      // check interrupts
4755 274 tadejm
      wait (wbm_working == 0);
4756 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4757
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4758 192 tadej
      begin
4759 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4760
        begin
4761
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4762
          test_fail("Interrupt Transmit Buffer was not set");
4763
          fail = fail + 1;
4764
        end
4765
        if ((data & (~`ETH_INT_TXB)) !== 0)
4766
        begin
4767
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4768
          test_fail("Other interrupts (except Transmit Buffer) were set");
4769
          fail = fail + 1;
4770
        end
4771 192 tadej
      end
4772 194 tadej
      else
4773 192 tadej
      begin
4774 194 tadej
        if (data !== 0)
4775
        begin
4776
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4777
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4778
          fail = fail + 1;
4779
        end
4780 192 tadej
      end
4781 194 tadej
      // clear interrupts
4782 274 tadejm
      wait (wbm_working == 0);
4783 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4784
      // check WB INT signal
4785
      if (wb_int !== 1'b0)
4786 192 tadej
      begin
4787 194 tadej
        test_fail("WB INT signal should not be set");
4788 192 tadej
        fail = fail + 1;
4789
      end
4790 194 tadej
      // INTERMEDIATE DISPLAYS
4791
      if ((i_length + 4) == (min_tmp + 64))
4792 209 tadejm
      begin
4793 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4794 209 tadejm
        $display("    pads appending to packets is NOT selected");
4795
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4796 194 tadej
                 min_tmp, (min_tmp + 64));
4797 209 tadejm
        // set padding, remain the rest
4798 274 tadejm
        wait (wbm_working == 0);
4799 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4800
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4801
      end
4802 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4803 209 tadejm
      begin
4804 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4805 209 tadejm
        $display("    pads appending to packets is selected");
4806
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4807 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4808 209 tadejm
        // reset padding, remain the rest
4809 274 tadejm
        wait (wbm_working == 0);
4810 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4811
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4812
      end
4813 194 tadej
      else if ((i_length + 4) == max_tmp)
4814 209 tadejm
      begin
4815
        $display("    pads appending to packets is NOT selected");
4816
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4817 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4818 209 tadejm
      end
4819 194 tadej
      // set length (loop variable)
4820
      if ((i_length + 4) < (min_tmp + 64))
4821
        i_length = i_length + 1;
4822
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4823
      begin
4824
        i_length = i_length + 128;
4825
        tmp_data = i_length + 4; // last tmp_data is ending length
4826
      end
4827
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4828
        i_length = max_tmp - (4 + 16);
4829
      else if ((i_length + 4) >= (max_tmp - 16))
4830
        i_length = i_length + 1;
4831
      else
4832
      begin
4833
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4834
        #10 $stop;
4835
      end
4836 192 tadej
    end
4837 194 tadej
    // disable TX
4838 274 tadejm
    wait (wbm_working == 0);
4839 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4840
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4841
    if(fail == 0)
4842
      test_ok;
4843
    else
4844
      fail = 0;
4845
  end
4846
 
4847
 
4848
  ////////////////////////////////////////////////////////////////////
4849
  ////                                                            ////
4850
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4851
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4852
  ////                                                            ////
4853
  ////////////////////////////////////////////////////////////////////
4854 209 tadejm
  if (test_num == 3) // with and without padding
4855 194 tadej
  begin
4856
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4857
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4858
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4859
 
4860
    max_tmp = 0;
4861
    min_tmp = 0;
4862
    // set one TX buffer descriptor - must be set before TX enable
4863 274 tadejm
    wait (wbm_working == 0);
4864 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4865 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4866 274 tadejm
    wait (wbm_working == 0);
4867 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4868 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4869
    // prepare two packets of MAXFL length
4870 274 tadejm
    wait (wbm_working == 0);
4871 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4872
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4873
    min_tmp = tmp[31:16];
4874
    st_data = 8'h5A;
4875 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4876 194 tadej
    st_data = 8'h10;
4877 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4878 169 mohor
    // check WB INT signal
4879 192 tadej
    if (wb_int !== 1'b0)
4880 169 mohor
    begin
4881
      test_fail("WB INT signal should not be set");
4882
      fail = fail + 1;
4883
    end
4884 194 tadej
 
4885
    // write to phy's control register for 100Mbps
4886
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4887
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4888
    speed = 100;
4889 192 tadej
 
4890 194 tadej
    i_length = (min_tmp - 4);
4891
    while (i_length <= (max_tmp - 4))
4892 192 tadej
    begin
4893 194 tadej
      // choose generating carrier sense and collision
4894
      case (i_length[1:0])
4895
      2'h0: // Interrupt is generated
4896 192 tadej
      begin
4897 194 tadej
        // enable interrupt generation
4898 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4899 194 tadej
        // unmask interrupts
4900 274 tadejm
        wait (wbm_working == 0);
4901 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4902 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4903
        // not detect carrier sense in FD and no collision
4904
        eth_phy.carrier_sense_tx_fd_detect(0);
4905
        eth_phy.collision(0);
4906 192 tadej
      end
4907 194 tadej
      2'h1: // Interrupt is not generated
4908 192 tadej
      begin
4909 194 tadej
        // enable interrupt generation
4910 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4911 194 tadej
        // mask interrupts
4912 274 tadejm
        wait (wbm_working == 0);
4913 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4914
        // detect carrier sense in FD and no collision
4915
        eth_phy.carrier_sense_tx_fd_detect(1);
4916
        eth_phy.collision(0);
4917 192 tadej
      end
4918 194 tadej
      2'h2: // Interrupt is not generated
4919
      begin
4920
        // disable interrupt generation
4921 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4922 194 tadej
        // unmask interrupts
4923 274 tadejm
        wait (wbm_working == 0);
4924 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4925 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4926
        // not detect carrier sense in FD and set collision
4927
        eth_phy.carrier_sense_tx_fd_detect(0);
4928
        eth_phy.collision(1);
4929
      end
4930
      default: // 2'h3: // Interrupt is not generated
4931
      begin
4932
        // disable interrupt generation
4933 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4934 194 tadej
        // mask interrupts
4935 274 tadejm
        wait (wbm_working == 0);
4936 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4937
        // detect carrier sense in FD and set collision
4938
        eth_phy.carrier_sense_tx_fd_detect(1);
4939
        eth_phy.collision(1);
4940
      end
4941
      endcase
4942
      eth_phy.set_tx_mem_addr(max_tmp);
4943
      // set wrap bit
4944
      set_tx_bd_wrap(0);
4945
      set_tx_bd_ready(0, 0);
4946 192 tadej
      #1 check_tx_bd(0, data);
4947 194 tadej
      if (i_length < min_tmp) // just first four
4948 192 tadej
      begin
4949 194 tadej
        while (data[15] === 1)
4950
        begin
4951
          #1 check_tx_bd(0, data);
4952
          @(posedge wb_clk);
4953
        end
4954 209 tadejm
        repeat (1) @(posedge wb_clk);
4955 194 tadej
      end
4956
      else if (i_length > (max_tmp - 8)) // just last four
4957
      begin
4958
        tmp = 0;
4959
        wait (MTxEn === 1'b1); // start transmit
4960
        while (tmp < (i_length - 20))
4961
        begin
4962
          #1 tmp = tmp + 1;
4963
          @(posedge wb_clk);
4964
        end
4965 192 tadej
        #1 check_tx_bd(0, data);
4966 194 tadej
        while (data[15] === 1)
4967
        begin
4968
          #1 check_tx_bd(0, data);
4969
          @(posedge wb_clk);
4970
        end
4971 209 tadejm
        repeat (1) @(posedge wb_clk);
4972 192 tadej
      end
4973 194 tadej
      else
4974
      begin
4975
        wait (MTxEn === 1'b1); // start transmit
4976
        #1 check_tx_bd(0, data);
4977
        if (data[15] !== 1)
4978
        begin
4979
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4980
          fail = fail + 1;
4981
        end
4982
        wait (MTxEn === 1'b0); // end transmit
4983
        while (data[15] === 1)
4984
        begin
4985
          #1 check_tx_bd(0, data);
4986
          @(posedge wb_clk);
4987
        end
4988
        repeat (1) @(posedge wb_clk);
4989
      end
4990
      // check length of a PACKET
4991
      if (eth_phy.tx_len != (i_length + 4))
4992
      begin
4993
        test_fail("Wrong length of the packet out from MAC");
4994
        fail = fail + 1;
4995
      end
4996 192 tadej
      // check transmitted TX packet data
4997
      if (i_length[0] == 0)
4998
      begin
4999 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
5000 192 tadej
      end
5001
      else
5002
      begin
5003 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5004 192 tadej
      end
5005
      if (tmp > 0)
5006
      begin
5007
        test_fail("Wrong data of the transmitted packet");
5008
        fail = fail + 1;
5009
      end
5010
      // check transmited TX packet CRC
5011
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5012
      if (tmp > 0)
5013
      begin
5014
        test_fail("Wrong CRC of the transmitted packet");
5015
        fail = fail + 1;
5016
      end
5017 194 tadej
      // check WB INT signal
5018
      if (i_length[1:0] == 2'h0)
5019 192 tadej
      begin
5020 194 tadej
        if (wb_int !== 1'b1)
5021
        begin
5022
          `TIME; $display("*E WB INT signal should be set");
5023
          test_fail("WB INT signal should be set");
5024
          fail = fail + 1;
5025
        end
5026 192 tadej
      end
5027 194 tadej
      else
5028 192 tadej
      begin
5029 194 tadej
        if (wb_int !== 1'b0)
5030
        begin
5031
          `TIME; $display("*E WB INT signal should not be set");
5032
          test_fail("WB INT signal should not be set");
5033
          fail = fail + 1;
5034
        end
5035 192 tadej
      end
5036 194 tadej
      // check TX buffer descriptor of a packet
5037
      check_tx_bd(0, data);
5038
      if (i_length[1] == 1'b0) // interrupt enabled
5039 192 tadej
      begin
5040 194 tadej
        if (data[15:0] !== 16'h7800)
5041
        begin
5042
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5043
          test_fail("TX buffer descriptor status is not correct");
5044
          fail = fail + 1;
5045
        end
5046 192 tadej
      end
5047 194 tadej
      else // interrupt not enabled
5048 192 tadej
      begin
5049 194 tadej
        if (data[15:0] !== 16'h3800)
5050
        begin
5051
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5052
          test_fail("TX buffer descriptor status is not correct");
5053
          fail = fail + 1;
5054
        end
5055 192 tadej
      end
5056 194 tadej
      // clear TX buffer descriptor
5057
      clear_tx_bd(0, 0);
5058
      // check interrupts
5059 274 tadejm
      wait (wbm_working == 0);
5060 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5061
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5062 192 tadej
      begin
5063 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
5064
        begin
5065
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5066
          test_fail("Interrupt Transmit Buffer was not set");
5067
          fail = fail + 1;
5068
        end
5069
        if ((data & (~`ETH_INT_TXB)) !== 0)
5070
        begin
5071
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5072
          test_fail("Other interrupts (except Transmit Buffer) were set");
5073
          fail = fail + 1;
5074
        end
5075 192 tadej
      end
5076 194 tadej
      else
5077 192 tadej
      begin
5078 194 tadej
        if (data !== 0)
5079
        begin
5080
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
5081
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5082
          fail = fail + 1;
5083
        end
5084 192 tadej
      end
5085 194 tadej
      // clear interrupts
5086 274 tadejm
      wait (wbm_working == 0);
5087 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5088
      // check WB INT signal
5089
      if (wb_int !== 1'b0)
5090 192 tadej
      begin
5091 194 tadej
        test_fail("WB INT signal should not be set");
5092 192 tadej
        fail = fail + 1;
5093
      end
5094 194 tadej
      // INTERMEDIATE DISPLAYS
5095
      if ((i_length + 4) == (min_tmp + 64))
5096 209 tadejm
      begin
5097 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
5098 209 tadejm
        $display("    pads appending to packets is NOT selected");
5099
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5100 194 tadej
                 min_tmp, (min_tmp + 64));
5101 209 tadejm
        // set padding, remain the rest
5102 274 tadejm
        wait (wbm_working == 0);
5103 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5104
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5105
      end
5106 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
5107 209 tadejm
      begin
5108 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5109 209 tadejm
        $display("    pads appending to packets is selected");
5110
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5111 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
5112 209 tadejm
        // reset padding, remain the rest
5113 274 tadejm
        wait (wbm_working == 0);
5114 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5115
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5116
      end
5117 194 tadej
      else if ((i_length + 4) == max_tmp)
5118 209 tadejm
      begin
5119
        $display("    pads appending to packets is NOT selected");
5120
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5121 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
5122 209 tadejm
      end
5123 194 tadej
      // set length (loop variable)
5124
      if ((i_length + 4) < (min_tmp + 64))
5125
        i_length = i_length + 1;
5126
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
5127
      begin
5128
        i_length = i_length + 128;
5129
        tmp_data = i_length + 4; // last tmp_data is ending length
5130
      end
5131
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5132
        i_length = max_tmp - (4 + 16);
5133
      else if ((i_length + 4) >= (max_tmp - 16))
5134
        i_length = i_length + 1;
5135 192 tadej
      else
5136 194 tadej
      begin
5137
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5138
        #10 $stop;
5139
      end
5140 179 mohor
    end
5141 194 tadej
    // disable TX
5142 274 tadejm
    wait (wbm_working == 0);
5143 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5144
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5145
    if(fail == 0)
5146
      test_ok;
5147
    else
5148
      fail = 0;
5149 169 mohor
  end
5150
 
5151
 
5152 209 tadejm
  ////////////////////////////////////////////////////////////////////
5153
  ////                                                            ////
5154
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5155
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
5156
  ////                                                            ////
5157
  ////////////////////////////////////////////////////////////////////
5158
  if (test_num == 4) // without and with padding
5159
  begin
5160
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
5161
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
5162
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
5163
 
5164
    // reset MAC registers
5165
    hard_reset;
5166
    // reset MAC and MII LOGIC with soft reset
5167 274 tadejm
//    reset_mac;
5168
//    reset_mii;
5169 209 tadejm
    // set wb slave response
5170
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5171 192 tadej
 
5172 209 tadejm
    max_tmp = 0;
5173
    min_tmp = 0;
5174
    num_of_frames = 0;
5175
    num_of_bd = 0;
5176
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5177 274 tadejm
    wait (wbm_working == 0);
5178 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5179
    // enable TX, set full-duplex mode, NO padding and CRC appending
5180 274 tadejm
    wait (wbm_working == 0);
5181 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5182
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5183
    // prepare two packets of MAXFL length
5184 274 tadejm
    wait (wbm_working == 0);
5185 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5186
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5187
    min_tmp = tmp[31:16];
5188
    st_data = 8'hA3;
5189
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5190
    st_data = 8'h81;
5191
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5192
    // check WB INT signal
5193
    if (wb_int !== 1'b0)
5194
    begin
5195
      test_fail("WB INT signal should not be set");
5196
      fail = fail + 1;
5197
    end
5198
 
5199
    // write to phy's control register for 10Mbps
5200
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5201
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5202
    speed = 10;
5203
 
5204
    i_length = (min_tmp - 4);
5205
    while (i_length <= (max_tmp - 4))
5206
    begin
5207
      // choose generating carrier sense and collision
5208
      case (i_length[1:0])
5209
      2'h0: // Interrupt is generated
5210
      begin
5211
        // Reset_tx_bd nable interrupt generation
5212
        // unmask interrupts
5213 274 tadejm
        wait (wbm_working == 0);
5214 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5215
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5216
        // not detect carrier sense in FD and no collision
5217
        eth_phy.carrier_sense_tx_fd_detect(0);
5218
        eth_phy.collision(0);
5219
      end
5220
      2'h1: // Interrupt is not generated
5221
      begin
5222
        // set_tx_bd enable interrupt generation
5223
        // mask interrupts
5224 274 tadejm
        wait (wbm_working == 0);
5225 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5226
        // detect carrier sense in FD and no collision
5227
        eth_phy.carrier_sense_tx_fd_detect(1);
5228
        eth_phy.collision(0);
5229
      end
5230
      2'h2: // Interrupt is not generated
5231
      begin
5232
        // set_tx_bd disable the interrupt generation
5233
        // unmask interrupts
5234 274 tadejm
        wait (wbm_working == 0);
5235 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5236
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5237
        // not detect carrier sense in FD and set collision
5238
        eth_phy.carrier_sense_tx_fd_detect(0);
5239
        eth_phy.collision(1);
5240
      end
5241
      default: // 2'h3: // Interrupt is not generated
5242
      begin
5243
        // set_tx_bd disable the interrupt generation
5244
        // mask interrupts
5245 274 tadejm
        wait (wbm_working == 0);
5246 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5247
        // detect carrier sense in FD and set collision
5248
        eth_phy.carrier_sense_tx_fd_detect(1);
5249
        eth_phy.collision(1);
5250
      end
5251
      endcase
5252
      // first destination address on ethernet PHY
5253
      if (i_length[0] == 0)
5254
        eth_phy.set_tx_mem_addr(0);
5255
      else
5256
        eth_phy.set_tx_mem_addr(max_tmp);
5257
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5258
      // number of all frames is 154 (146 without first 8)
5259
      if (num_of_frames < 8)
5260
      begin
5261
        case (i_length[1:0])
5262
        2'h0: // Interrupt is generated
5263
        begin
5264
          // enable interrupt generation
5265
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5266
          // interrupts are unmasked
5267
        end
5268
        2'h1: // Interrupt is not generated
5269
        begin
5270
          // enable interrupt generation
5271
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5272
          // interrupts are masked
5273
        end
5274
        2'h2: // Interrupt is not generated
5275
        begin
5276
          // disable interrupt generation
5277
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5278
          // interrupts are unmasked
5279
        end
5280
        default: // 2'h3: // Interrupt is not generated
5281
        begin
5282
          // disable interrupt generation
5283
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5284
          // interrupts are masked
5285
        end
5286
        endcase
5287
        // set wrap bit
5288
        set_tx_bd_wrap(0);
5289
      end
5290
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5291
      else if ((num_of_frames - 8) == 0)
5292
      begin
5293
        tmp_len = i_length; // length of frame
5294
        tmp_bd_num = 0; // TX BD number
5295
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5296
        begin
5297
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5298
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5299
          if (tmp_len[0] == 0)
5300
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5301
          else
5302
            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));
5303
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5304
          if ((tmp_len + 4) < (min_tmp + 128))
5305
            tmp_len = tmp_len + 1;
5306
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5307
            tmp_len = 256;
5308
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5309
            tmp_len = tmp_len + 128;
5310
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5311
            tmp_len = max_tmp - (4 + 16);
5312
          else if ((tmp_len + 4) >= (max_tmp - 16))
5313
            tmp_len = tmp_len + 1;
5314
          // set TX BD number
5315
          tmp_bd_num = tmp_bd_num + 1;
5316
        end
5317
        // set wrap bit
5318
        set_tx_bd_wrap(127);
5319
      end
5320
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5321
      else if ((num_of_frames - 8) == 20) // 128
5322
      begin
5323
        tmp_len = tmp_len; // length of frame remaines from previous settings
5324
        tmp_bd_num = 0; // TX BD number
5325
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5326
        begin
5327
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5328
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5329
          if (tmp_len[0] == 0)
5330
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5331
          else
5332
            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));
5333
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5334
          if ((tmp_len + 4) < (min_tmp + 128))
5335
            tmp_len = tmp_len + 1;
5336
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5337
            tmp_len = 256;
5338
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5339
            tmp_len = tmp_len + 128;
5340
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5341
            tmp_len = max_tmp - (4 + 16);
5342
          else if ((tmp_len + 4) >= (max_tmp - 16))
5343
            tmp_len = tmp_len + 1;
5344
          // set TX BD number
5345
          tmp_bd_num = tmp_bd_num + 1;
5346
        end
5347
      end
5348
      // set ready bit
5349
      if (num_of_frames < 8)
5350
        set_tx_bd_ready(0, 0);
5351
      else if ((num_of_frames - 8) < 128)
5352
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5353
      else if ((num_of_frames - 136) < 19)
5354
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5355
      // CHECK END OF TRANSMITION
5356
      #1 check_tx_bd(num_of_bd, data);
5357
      if (i_length < min_tmp) // just first four
5358
      begin
5359
        while (data[15] === 1)
5360
        begin
5361
          #1 check_tx_bd(num_of_bd, data);
5362
          @(posedge wb_clk);
5363
        end
5364
        repeat (1) @(posedge wb_clk);
5365
      end
5366
      else if (i_length > (max_tmp - 8)) // just last four
5367
      begin
5368
        tmp = 0;
5369
        wait (MTxEn === 1'b1); // start transmit
5370
        while (tmp < (i_length - 20))
5371
        begin
5372
          #1 tmp = tmp + 1;
5373
          @(posedge wb_clk);
5374
        end
5375
        #1 check_tx_bd(num_of_bd, data);
5376
        while (data[15] === 1)
5377
        begin
5378
          #1 check_tx_bd(num_of_bd, data);
5379
          @(posedge wb_clk);
5380
        end
5381
        repeat (1) @(posedge wb_clk);
5382
      end
5383
      else
5384
      begin
5385
        wait (MTxEn === 1'b1); // start transmit
5386
        #1 check_tx_bd(num_of_bd, data);
5387
        if (data[15] !== 1)
5388
        begin
5389
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5390
          fail = fail + 1;
5391
        end
5392
        wait (MTxEn === 1'b0); // end transmit
5393
        while (data[15] === 1)
5394
        begin
5395
          #1 check_tx_bd(num_of_bd, data);
5396
          @(posedge wb_clk);
5397
        end
5398
        repeat (1) @(posedge wb_clk);
5399
      end
5400
      // check length of a PACKET
5401
      if (eth_phy.tx_len != (i_length + 4))
5402
      begin
5403
        test_fail("Wrong length of the packet out from MAC");
5404
        fail = fail + 1;
5405
      end
5406
        // check transmitted TX packet data
5407
        if (i_length[0] == 0)
5408
        begin
5409
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5410
        end
5411
        else
5412
        begin
5413
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5414
        end
5415
        if (tmp > 0)
5416
        begin
5417
          test_fail("Wrong data of the transmitted packet");
5418
          fail = fail + 1;
5419
        end
5420
        // check transmited TX packet CRC
5421
        if (i_length[0] == 0)
5422
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5423
        else
5424
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5425
        if (tmp > 0)
5426
        begin
5427
          test_fail("Wrong CRC of the transmitted packet");
5428
          fail = fail + 1;
5429
        end
5430
      // check WB INT signal
5431
      if (i_length[1:0] == 2'h0)
5432
      begin
5433
        if (wb_int !== 1'b1)
5434
        begin
5435
          `TIME; $display("*E WB INT signal should be set");
5436
          test_fail("WB INT signal should be set");
5437
          fail = fail + 1;
5438
        end
5439
      end
5440
      else
5441
      begin
5442
        if (wb_int !== 1'b0)
5443
        begin
5444
          `TIME; $display("*E WB INT signal should not be set");
5445
          test_fail("WB INT signal should not be set");
5446
          fail = fail + 1;
5447
        end
5448
      end
5449
      // check TX buffer descriptor of a packet
5450
      check_tx_bd(num_of_bd, data);
5451
      if (i_length[1] == 1'b0) // interrupt enabled
5452
      begin
5453
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5454
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5455
        begin
5456
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5457
          test_fail("TX buffer descriptor status is not correct");
5458
          fail = fail + 1;
5459
        end
5460
      end
5461
      else // interrupt not enabled
5462
      begin
5463
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5464
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5465
        begin
5466
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5467
          test_fail("TX buffer descriptor status is not correct");
5468
          fail = fail + 1;
5469
        end
5470
      end
5471
      // clear first half of 8 frames from TX buffer descriptor 0
5472
      if (num_of_frames < 4)
5473
        clear_tx_bd(num_of_bd, num_of_bd);
5474
      // clear BD with wrap bit
5475
      if (num_of_frames == 140)
5476
        clear_tx_bd(127, 127);
5477
      // check interrupts
5478 274 tadejm
      wait (wbm_working == 0);
5479 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5480
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5481
      begin
5482
        if ((data & `ETH_INT_TXB) !== 1'b1)
5483
        begin
5484
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5485
          test_fail("Interrupt Transmit Buffer was not set");
5486
          fail = fail + 1;
5487
        end
5488
        if ((data & (~`ETH_INT_TXB)) !== 0)
5489
        begin
5490
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5491
          test_fail("Other interrupts (except Transmit Buffer) were set");
5492
          fail = fail + 1;
5493
        end
5494
      end
5495
      else
5496
      begin
5497
        if (data !== 0)
5498
        begin
5499
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5500
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5501
          fail = fail + 1;
5502
        end
5503
      end
5504
      // clear interrupts
5505 274 tadejm
      wait (wbm_working == 0);
5506 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5507
      // check WB INT signal
5508
      if (wb_int !== 1'b0)
5509
      begin
5510
        test_fail("WB INT signal should not be set");
5511
        fail = fail + 1;
5512
      end
5513
      // INTERMEDIATE DISPLAYS
5514
      if ((i_length + 4) == (min_tmp + 7))
5515
      begin
5516
        // starting length is min_tmp, ending length is (min_tmp + 128)
5517
        $display("    pads appending to packets is NOT selected");
5518
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5519
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5520
                 min_tmp, (min_tmp + 7));
5521
        $display("    ->all packets were send from TX BD 0");
5522
        // set padding, remain the rest
5523 274 tadejm
        wait (wbm_working == 0);
5524 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5525
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5526
      end
5527
      else if ((i_length + 4) == (min_tmp + 128))
5528
      begin
5529
        // starting length is min_tmp, ending length is (min_tmp + 128)
5530
        $display("    pads appending to packets is NOT selected");
5531
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5532
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5533
                 (min_tmp + 8), (min_tmp + 128));
5534
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5535
                 1'b0, num_of_bd);
5536
        tmp_bd = num_of_bd + 1;
5537
        // set padding, remain the rest
5538 274 tadejm
        wait (wbm_working == 0);
5539 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5540
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5541
      end
5542
      else if ((i_length + 4) == (max_tmp - 16))
5543
      begin
5544
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5545
        $display("    pads appending to packets is selected");
5546
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5547
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5548
                 (min_tmp + 64 + 128), tmp_data);
5549
        if (tmp_bd > num_of_bd)
5550
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5551
                   tmp_bd, num_of_bd);
5552
        else
5553
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5554
                   tmp_bd, num_of_bd);
5555
        tmp_bd = num_of_bd + 1;
5556
        // reset padding, remain the rest
5557 274 tadejm
        wait (wbm_working == 0);
5558 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5559
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5560
      end
5561
      else if ((i_length + 4) == max_tmp)
5562
      begin
5563
        $display("    pads appending to packets is NOT selected");
5564
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5565
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5566
                 (max_tmp - (4 + 16)), max_tmp);
5567
        if (tmp_bd > num_of_bd)
5568
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5569
                   tmp_bd, num_of_bd);
5570
        else
5571
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5572
                   tmp_bd, num_of_bd);
5573
      end
5574
      // set length (loop variable)
5575
      if ((i_length + 4) < (min_tmp + 128))
5576
        i_length = i_length + 1;
5577
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5578
        i_length = 256;
5579
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5580
      begin
5581
        i_length = i_length + 128;
5582
        tmp_data = i_length + 4; // last tmp_data is ending length
5583
      end
5584
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5585
        i_length = max_tmp - (4 + 16);
5586
      else if ((i_length + 4) >= (max_tmp - 16))
5587
        i_length = i_length + 1;
5588
      else
5589
      begin
5590
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5591
        #10 $stop;
5592
      end
5593
      // the number of frame transmitted
5594
      num_of_frames = num_of_frames + 1;
5595
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5596
        num_of_bd = 0;
5597
      else
5598
        num_of_bd = num_of_bd + 1;
5599
    end
5600
    // disable TX
5601 274 tadejm
    wait (wbm_working == 0);
5602 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5603
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5604
    @(posedge wb_clk);
5605
    if(fail == 0)
5606
      test_ok;
5607
    else
5608
      fail = 0;
5609
  end
5610
 
5611
 
5612
  ////////////////////////////////////////////////////////////////////
5613
  ////                                                            ////
5614
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5615
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5616
  ////                                                            ////
5617
  ////////////////////////////////////////////////////////////////////
5618
  if (test_num == 5) // with and without padding
5619
  begin
5620
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5621
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5622
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5623
 
5624
    // reset MAC registers
5625
    hard_reset;
5626
    // reset MAC and MII LOGIC with soft reset
5627 274 tadejm
//    reset_mac;
5628
//    reset_mii;
5629 209 tadejm
    // set wb slave response
5630
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5631
 
5632
    max_tmp = 0;
5633
    min_tmp = 0;
5634
    num_of_frames = 0;
5635
    num_of_bd = 0;
5636
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5637 274 tadejm
    wait (wbm_working == 0);
5638 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5639
    // enable TX, set full-duplex mode, NO padding and CRC appending
5640 274 tadejm
    wait (wbm_working == 0);
5641 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5642
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5643
    // prepare two packets of MAXFL length
5644 274 tadejm
    wait (wbm_working == 0);
5645 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5646
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5647
    min_tmp = tmp[31:16];
5648
    st_data = 8'hA5;
5649
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5650
    st_data = 8'h71;
5651
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5652
    // check WB INT signal
5653
    if (wb_int !== 1'b0)
5654
    begin
5655
      test_fail("WB INT signal should not be set");
5656
      fail = fail + 1;
5657
    end
5658
 
5659
    // write to phy's control register for 100Mbps
5660
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5661
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5662
    speed = 100;
5663
 
5664
    i_length = (min_tmp - 4);
5665
    while (i_length <= (max_tmp - 4))
5666
    begin
5667
      // choose generating carrier sense and collision
5668
      case (i_length[1:0])
5669
      2'h0: // Interrupt is generated
5670
      begin
5671
        // Reset_tx_bd nable interrupt generation
5672
        // unmask interrupts
5673 274 tadejm
        wait (wbm_working == 0);
5674 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5675
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5676
        // not detect carrier sense in FD and no collision
5677
        eth_phy.carrier_sense_tx_fd_detect(0);
5678
        eth_phy.collision(0);
5679
      end
5680
      2'h1: // Interrupt is not generated
5681
      begin
5682
        // set_tx_bd enable interrupt generation
5683
        // mask interrupts
5684 274 tadejm
        wait (wbm_working == 0);
5685 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5686
        // detect carrier sense in FD and no collision
5687
        eth_phy.carrier_sense_tx_fd_detect(1);
5688
        eth_phy.collision(0);
5689
      end
5690
      2'h2: // Interrupt is not generated
5691
      begin
5692
        // set_tx_bd disable the interrupt generation
5693
        // unmask interrupts
5694 274 tadejm
        wait (wbm_working == 0);
5695 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5696
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5697
        // not detect carrier sense in FD and set collision
5698
        eth_phy.carrier_sense_tx_fd_detect(0);
5699
        eth_phy.collision(1);
5700
      end
5701
      default: // 2'h3: // Interrupt is not generated
5702
      begin
5703
        // set_tx_bd disable the interrupt generation
5704
        // mask interrupts
5705 274 tadejm
        wait (wbm_working == 0);
5706 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5707
        // detect carrier sense in FD and set collision
5708
        eth_phy.carrier_sense_tx_fd_detect(1);
5709
        eth_phy.collision(1);
5710
      end
5711
      endcase
5712
      // first destination address on ethernet PHY
5713
      if (i_length[0] == 0)
5714
        eth_phy.set_tx_mem_addr(0);
5715
      else
5716
        eth_phy.set_tx_mem_addr(max_tmp);
5717
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5718
      // number of all frames is 154 (146 without first 8)
5719
      if (num_of_frames < 8)
5720
      begin
5721
        case (i_length[1:0])
5722
        2'h0: // Interrupt is generated
5723
        begin
5724
          // enable interrupt generation
5725
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5726
          // interrupts are unmasked
5727
        end
5728
        2'h1: // Interrupt is not generated
5729
        begin
5730
          // enable interrupt generation
5731
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5732
          // interrupts are masked
5733
        end
5734
        2'h2: // Interrupt is not generated
5735
        begin
5736
          // disable interrupt generation
5737
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5738
          // interrupts are unmasked
5739
        end
5740
        default: // 2'h3: // Interrupt is not generated
5741
        begin
5742
          // disable interrupt generation
5743
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5744
          // interrupts are masked
5745
        end
5746
        endcase
5747
        // set wrap bit
5748
        set_tx_bd_wrap(0);
5749
      end
5750
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5751
      else if ((num_of_frames - 8) == 0)
5752
      begin
5753
        tmp_len = i_length; // length of frame
5754
        tmp_bd_num = 0; // TX BD number
5755
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5756
        begin
5757
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5758
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5759
          if (tmp_len[0] == 0)
5760
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5761
          else
5762
            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));
5763
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5764
          if ((tmp_len + 4) < (min_tmp + 128))
5765
            tmp_len = tmp_len + 1;
5766
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5767
            tmp_len = 256;
5768
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5769
            tmp_len = tmp_len + 128;
5770
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5771
            tmp_len = max_tmp - (4 + 16);
5772
          else if ((tmp_len + 4) >= (max_tmp - 16))
5773
            tmp_len = tmp_len + 1;
5774
          // set TX BD number
5775
          tmp_bd_num = tmp_bd_num + 1;
5776
        end
5777
        // set wrap bit
5778
        set_tx_bd_wrap(127);
5779
      end
5780
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5781
      else if ((num_of_frames - 8) == 20) // 128
5782
      begin
5783
        tmp_len = tmp_len; // length of frame remaines from previous settings
5784
        tmp_bd_num = 0; // TX BD number
5785
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5786
        begin
5787
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5788
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5789
          if (tmp_len[0] == 0)
5790
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5791
          else
5792
            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));
5793
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5794
          if ((tmp_len + 4) < (min_tmp + 128))
5795
            tmp_len = tmp_len + 1;
5796
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5797
            tmp_len = 256;
5798
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5799
            tmp_len = tmp_len + 128;
5800
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5801
            tmp_len = max_tmp - (4 + 16);
5802
          else if ((tmp_len + 4) >= (max_tmp - 16))
5803
            tmp_len = tmp_len + 1;
5804
          // set TX BD number
5805
          tmp_bd_num = tmp_bd_num + 1;
5806
        end
5807
      end
5808
      // set ready bit
5809
      if (num_of_frames < 8)
5810
        set_tx_bd_ready(0, 0);
5811
      else if ((num_of_frames - 8) < 128)
5812
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5813
      else if ((num_of_frames - 136) < 19)
5814
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5815
      // CHECK END OF TRANSMITION
5816
      #1 check_tx_bd(num_of_bd, data);
5817
      if (i_length < min_tmp) // just first four
5818
      begin
5819
        while (data[15] === 1)
5820
        begin
5821
          #1 check_tx_bd(num_of_bd, data);
5822
          @(posedge wb_clk);
5823
        end
5824
        repeat (1) @(posedge wb_clk);
5825
      end
5826
      else if (i_length > (max_tmp - 8)) // just last four
5827
      begin
5828
        tmp = 0;
5829
        wait (MTxEn === 1'b1); // start transmit
5830
        while (tmp < (i_length - 20))
5831
        begin
5832
          #1 tmp = tmp + 1;
5833
          @(posedge wb_clk);
5834
        end
5835
        #1 check_tx_bd(num_of_bd, data);
5836
        while (data[15] === 1)
5837
        begin
5838
          #1 check_tx_bd(num_of_bd, data);
5839
          @(posedge wb_clk);
5840
        end
5841
        repeat (1) @(posedge wb_clk);
5842
      end
5843
      else
5844
      begin
5845
        wait (MTxEn === 1'b1); // start transmit
5846
        #1 check_tx_bd(num_of_bd, data);
5847
        if (data[15] !== 1)
5848
        begin
5849
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5850
          fail = fail + 1;
5851
        end
5852
        wait (MTxEn === 1'b0); // end transmit
5853
        while (data[15] === 1)
5854
        begin
5855
          #1 check_tx_bd(num_of_bd, data);
5856
          @(posedge wb_clk);
5857
        end
5858
        repeat (1) @(posedge wb_clk);
5859
      end
5860
      // check length of a PACKET
5861
      if (eth_phy.tx_len != (i_length + 4))
5862
      begin
5863
        test_fail("Wrong length of the packet out from MAC");
5864
        fail = fail + 1;
5865
      end
5866
      // checking in the following if statement is performed only for first and last 64 lengths
5867
        // check transmitted TX packet data
5868
        if (i_length[0] == 0)
5869
        begin
5870
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5871
        end
5872
        else
5873
        begin
5874
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5875
        end
5876
        if (tmp > 0)
5877
        begin
5878
          test_fail("Wrong data of the transmitted packet");
5879
          fail = fail + 1;
5880
        end
5881
        // check transmited TX packet CRC
5882
        if (i_length[0] == 0)
5883
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5884
        else
5885
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5886
        if (tmp > 0)
5887
        begin
5888
          test_fail("Wrong CRC of the transmitted packet");
5889
          fail = fail + 1;
5890
        end
5891
      // check WB INT signal
5892
      if (i_length[1:0] == 2'h0)
5893
      begin
5894
        if (wb_int !== 1'b1)
5895
        begin
5896
          `TIME; $display("*E WB INT signal should be set");
5897
          test_fail("WB INT signal should be set");
5898
          fail = fail + 1;
5899
        end
5900
      end
5901
      else
5902
      begin
5903
        if (wb_int !== 1'b0)
5904
        begin
5905
          `TIME; $display("*E WB INT signal should not be set");
5906
          test_fail("WB INT signal should not be set");
5907
          fail = fail + 1;
5908
        end
5909
      end
5910
      // check TX buffer descriptor of a packet
5911
      check_tx_bd(num_of_bd, data);
5912
      if (i_length[1] == 1'b0) // interrupt enabled
5913
      begin
5914
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5915
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5916
        begin
5917
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5918
          test_fail("TX buffer descriptor status is not correct");
5919
          fail = fail + 1;
5920
        end
5921
      end
5922
      else // interrupt not enabled
5923
      begin
5924
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5925
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5926
        begin
5927
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5928
          test_fail("TX buffer descriptor status is not correct");
5929
          fail = fail + 1;
5930
        end
5931
      end
5932
      // clear first half of 8 frames from TX buffer descriptor 0
5933
      if (num_of_frames < 4)
5934
        clear_tx_bd(num_of_bd, num_of_bd);
5935
      // clear BD with wrap bit
5936
      if (num_of_frames == 140)
5937
        clear_tx_bd(127, 127);
5938
      // check interrupts
5939 274 tadejm
      wait (wbm_working == 0);
5940 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5941
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5942
      begin
5943
        if ((data & `ETH_INT_TXB) !== 1'b1)
5944
        begin
5945
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5946
          test_fail("Interrupt Transmit Buffer was not set");
5947
          fail = fail + 1;
5948
        end
5949
        if ((data & (~`ETH_INT_TXB)) !== 0)
5950
        begin
5951
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5952
          test_fail("Other interrupts (except Transmit Buffer) were set");
5953
          fail = fail + 1;
5954
        end
5955
      end
5956
      else
5957
      begin
5958
        if (data !== 0)
5959
        begin
5960
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5961
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5962
          fail = fail + 1;
5963
        end
5964
      end
5965
      // clear interrupts
5966 274 tadejm
      wait (wbm_working == 0);
5967 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5968
      // check WB INT signal
5969
      if (wb_int !== 1'b0)
5970
      begin
5971
        test_fail("WB INT signal should not be set");
5972
        fail = fail + 1;
5973
      end
5974
      // INTERMEDIATE DISPLAYS
5975
      if ((i_length + 4) == (min_tmp + 7))
5976
      begin
5977
        // starting length is min_tmp, ending length is (min_tmp + 128)
5978
        $display("    pads appending to packets is NOT selected");
5979
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5980
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5981
                 min_tmp, (min_tmp + 7));
5982
        $display("    ->all packets were send from TX BD 0");
5983
        // set padding, remain the rest
5984 274 tadejm
        wait (wbm_working == 0);
5985 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5986
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5987
      end
5988
      else if ((i_length + 4) == (min_tmp + 128))
5989
      begin
5990
        // starting length is min_tmp, ending length is (min_tmp + 128)
5991
        $display("    pads appending to packets is NOT selected");
5992
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5993
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5994
                 (min_tmp + 8), (min_tmp + 128));
5995
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5996
                 1'b0, num_of_bd);
5997
        tmp_bd = num_of_bd + 1;
5998
        // set padding, remain the rest
5999 274 tadejm
        wait (wbm_working == 0);
6000 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6001
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6002
      end
6003
      else if ((i_length + 4) == (max_tmp - 16))
6004
      begin
6005
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
6006
        $display("    pads appending to packets is selected");
6007
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
6008
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
6009
                 (min_tmp + 64 + 128), tmp_data);
6010
        if (tmp_bd > num_of_bd)
6011
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
6012
                   tmp_bd, num_of_bd);
6013
        else
6014
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
6015
                   tmp_bd, num_of_bd);
6016
        tmp_bd = num_of_bd + 1;
6017
        // reset padding, remain the rest
6018 274 tadejm
        wait (wbm_working == 0);
6019 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6020
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6021
      end
6022
      else if ((i_length + 4) == max_tmp)
6023
      begin
6024
        $display("    pads appending to packets is NOT selected");
6025
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
6026
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
6027
                 (max_tmp - (4 + 16)), max_tmp);
6028
        if (tmp_bd > num_of_bd)
6029
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
6030
                   tmp_bd, num_of_bd);
6031
        else
6032
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
6033
                   tmp_bd, num_of_bd);
6034
      end
6035
      // set length (loop variable)
6036
      if ((i_length + 4) < (min_tmp + 128))
6037
        i_length = i_length + 1;
6038
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
6039
        i_length = 256;
6040
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
6041
      begin
6042
        i_length = i_length + 128;
6043
        tmp_data = i_length + 4; // last tmp_data is ending length
6044
      end
6045
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
6046
        i_length = max_tmp - (4 + 16);
6047
      else if ((i_length + 4) >= (max_tmp - 16))
6048
        i_length = i_length + 1;
6049
      else
6050
      begin
6051
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
6052
        #10 $stop;
6053
      end
6054
      // the number of frame transmitted
6055
      num_of_frames = num_of_frames + 1;
6056
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
6057
        num_of_bd = 0;
6058
      else
6059
        num_of_bd = num_of_bd + 1;
6060
    end
6061
    // disable TX
6062 274 tadejm
    wait (wbm_working == 0);
6063 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6064
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6065
    @(posedge wb_clk);
6066
    if(fail == 0)
6067
      test_ok;
6068
    else
6069
      fail = 0;
6070
  end
6071
 
6072
 
6073
  ////////////////////////////////////////////////////////////////////
6074
  ////                                                            ////
6075
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6076
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
6077
  ////                                                            ////
6078
  ////////////////////////////////////////////////////////////////////
6079
  if (test_num == 6) // 
6080
  begin
6081
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6082
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6083
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6084
 
6085
    // reset MAC registers
6086
    hard_reset;
6087
    // reset MAC and MII LOGIC with soft reset
6088 274 tadejm
//    reset_mac;
6089
//    reset_mii;
6090 209 tadejm
    // set wb slave response
6091
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6092
 
6093
    max_tmp = 0;
6094
    min_tmp = 0;
6095
    // set 8 TX buffer descriptors - must be set before TX enable
6096 274 tadejm
    wait (wbm_working == 0);
6097 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6098
    // enable TX, set full-duplex mode, padding and CRC appending
6099 274 tadejm
    wait (wbm_working == 0);
6100 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6101
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6102
    // prepare two packets of MAXFL length
6103 274 tadejm
    wait (wbm_working == 0);
6104 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6105
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6106
    min_tmp = tmp[31:16];
6107
    st_data = 8'h12;
6108
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6109
    st_data = 8'h34;
6110
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6111
    // check WB INT signal
6112
    if (wb_int !== 1'b0)
6113
    begin
6114
      test_fail("WB INT signal should not be set");
6115
      fail = fail + 1;
6116
    end
6117
 
6118
    // write to phy's control register for 10Mbps
6119
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6120
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6121
    speed = 10;
6122
 
6123
    frame_started = 0;
6124
    num_of_frames = 0;
6125
    num_of_bd = 0;
6126
    i_length = 0; // 0;
6127
    while (i_length < 70) // (min_tmp - 4))
6128
    begin
6129
      #1;
6130
      // choose generating carrier sense and collision
6131
      case (i_length[1:0])
6132
      2'h0: // Interrupt is generated
6133
      begin
6134
        // Reset_tx_bd nable interrupt generation
6135
        // unmask interrupts
6136 274 tadejm
        wait (wbm_working == 0);
6137 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6138
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6139
        // not detect carrier sense in FD and no collision
6140
        eth_phy.carrier_sense_tx_fd_detect(0);
6141
        eth_phy.collision(0);
6142
      end
6143
      2'h1: // Interrupt is not generated
6144
      begin
6145
        // set_tx_bd enable interrupt generation
6146
        // mask interrupts
6147 274 tadejm
        wait (wbm_working == 0);
6148 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6149
        // detect carrier sense in FD and no collision
6150
        eth_phy.carrier_sense_tx_fd_detect(1);
6151
        eth_phy.collision(0);
6152
      end
6153
      2'h2: // Interrupt is not generated
6154
      begin
6155
        // set_tx_bd disable the interrupt generation
6156
        // unmask interrupts
6157 274 tadejm
        wait (wbm_working == 0);
6158 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6159
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6160
        // not detect carrier sense in FD and set collision
6161
        eth_phy.carrier_sense_tx_fd_detect(0);
6162
        eth_phy.collision(1);
6163
      end
6164
      default: // 2'h3: // Interrupt is not generated
6165
      begin
6166
        // set_tx_bd disable the interrupt generation
6167
        // mask interrupts
6168 274 tadejm
        wait (wbm_working == 0);
6169 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6170
        // detect carrier sense in FD and set collision
6171
        eth_phy.carrier_sense_tx_fd_detect(1);
6172
        eth_phy.collision(1);
6173
      end
6174
      endcase
6175
      #1;
6176
      // first destination address on ethernet PHY
6177
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6178
      // SET packets and wrap bit
6179
      // num_of_frames <= 9 => wrap set to TX BD 0
6180
      if (num_of_frames <= 9)
6181
      begin
6182
        tmp_len = i_length; // length of frame
6183
        tmp_bd_num = 0; // TX BD number
6184
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6185
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6186
        if (tmp_len[0] == 0)
6187
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6188
        else
6189
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6190
        // set wrap bit
6191
        set_tx_bd_wrap(0);
6192
      end
6193
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6194
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6195
      begin
6196
        tmp_len = i_length; // length of frame
6197
        tmp_bd_num = 0; // TX BD number
6198
        while (tmp_bd_num < 4) //
6199
        begin
6200
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6201
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6202
          if (tmp_len[0] == 0)
6203
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6204
          else
6205
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6206
          tmp_len = tmp_len + 1;
6207
          // set TX BD number
6208
          tmp_bd_num = tmp_bd_num + 1;
6209
        end
6210
        // set wrap bit
6211
        set_tx_bd_wrap(3);
6212
      end
6213
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6214
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6215
      begin
6216
        tmp_len = i_length; // length of frame
6217
        tmp_bd_num = 0; // TX BD number
6218
        while (tmp_bd_num < 5) //
6219
        begin
6220
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6221
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6222
          if (tmp_len[0] == 0)
6223
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6224
          else
6225
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6226
          tmp_len = tmp_len + 1;
6227
          // set TX BD number
6228
          tmp_bd_num = tmp_bd_num + 1;
6229
        end
6230
        // set wrap bit
6231
        set_tx_bd_wrap(4);
6232
      end
6233
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6234
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6235
      begin
6236
        tmp_len = i_length; // length of frame
6237
        tmp_bd_num = 0; // TX BD number
6238
        while (tmp_bd_num < 6) //
6239
        begin
6240
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6241
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6242
          if (tmp_len[0] == 0)
6243
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6244
          else
6245
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6246
          tmp_len = tmp_len + 1;
6247
          // set TX BD number
6248
          tmp_bd_num = tmp_bd_num + 1;
6249
        end
6250
        // set wrap bit
6251
        set_tx_bd_wrap(5);
6252
      end
6253
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6254
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6255
      begin
6256
        tmp_len = i_length; // length of frame
6257
        tmp_bd_num = 0; // TX BD number
6258
        while (tmp_bd_num < 7) //
6259
        begin
6260
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6261
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6262
          if (tmp_len[0] == 0)
6263
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6264
          else
6265
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6266
          tmp_len = tmp_len + 1;
6267
          // set TX BD number
6268
          tmp_bd_num = tmp_bd_num + 1;
6269
        end
6270
        // set wrap bit
6271
        set_tx_bd_wrap(6);
6272
      end
6273
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6274
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6275
      begin
6276
        tmp_len = i_length; // length of frame
6277
        tmp_bd_num = 0; // TX BD number
6278
        while (tmp_bd_num < 8) //
6279
        begin
6280
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6281
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6282
          if (tmp_len[0] == 0)
6283
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6284
          else
6285
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6286
          tmp_len = tmp_len + 1;
6287
          // set TX BD number
6288
          tmp_bd_num = tmp_bd_num + 1;
6289
        end
6290
        // set wrap bit
6291
        set_tx_bd_wrap(7);
6292
      end
6293
      #1;
6294
      // SET ready bit
6295
      if (num_of_frames < 10)
6296
        set_tx_bd_ready(0, 0);
6297
      else if (num_of_frames < 14)
6298
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6299
      else if (num_of_frames < 18)
6300
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6301
      else if (num_of_frames < 23)
6302
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6303
      else if (num_of_frames < 28)
6304
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6305
      else if (num_of_frames < 34)
6306
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6307
      else if (num_of_frames < 40)
6308
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6309
      else if (num_of_frames < 47)
6310
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6311
      else if (num_of_frames < 54)
6312
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6313
      else if (num_of_frames < 62)
6314
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6315
      else if (num_of_frames < 70)
6316
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6317
      // CHECK END OF TRANSMITION
6318
      frame_started = 0;
6319
      if (num_of_frames >= 5)
6320
        #1 check_tx_bd(num_of_bd, data);
6321
      fork
6322
      begin: fr_st
6323
        wait (MTxEn === 1'b1); // start transmit
6324
        frame_started = 1;
6325
      end
6326
      begin
6327
        repeat (30) @(posedge mtx_clk);
6328
        if (num_of_frames < 5)
6329
        begin
6330
          if (frame_started == 1)
6331
          begin
6332
            `TIME; $display("*E Frame should NOT start!");
6333
          end
6334
          disable fr_st;
6335
        end
6336
        else
6337
        begin
6338
          if (frame_started == 0)
6339
          begin
6340
            `TIME; $display("*W Frame should start!");
6341
            disable fr_st;
6342
          end
6343
        end
6344
      end
6345
      join
6346
      // check packets larger than 4 bytes
6347
      if (num_of_frames >= 5)
6348
      begin
6349
        wait (MTxEn === 1'b0); // end transmit
6350
        while (data[15] === 1)
6351
        begin
6352
          #1 check_tx_bd(num_of_bd, data);
6353
          @(posedge wb_clk);
6354
        end
6355
        repeat (1) @(posedge wb_clk);
6356
        // check length of a PACKET
6357
        if (i_length <= (min_tmp - 4))
6358
        begin
6359
          if (eth_phy.tx_len != min_tmp)
6360
          begin
6361
            test_fail("Wrong length of the packet out from MAC");
6362
            fail = fail + 1;
6363
          end
6364
        end
6365
        else
6366
        begin
6367
          if (eth_phy.tx_len != (i_length + 4))
6368
          begin
6369
            test_fail("Wrong length of the packet out from MAC");
6370
            fail = fail + 1;
6371
          end
6372
        end
6373
        // check transmitted TX packet data
6374
        if (i_length[0] == 0)
6375
        begin
6376
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6377
        end
6378
        else
6379
        begin
6380
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6381
        end
6382
        if (tmp > 0)
6383
        begin
6384
          test_fail("Wrong data of the transmitted packet");
6385
          fail = fail + 1;
6386
        end
6387
        // check transmited TX packet CRC
6388
        if (num_of_frames < (min_tmp - 4))
6389
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6390
        else
6391
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6392
        if (tmp > 0)
6393
        begin
6394
          test_fail("Wrong CRC of the transmitted packet");
6395
          fail = fail + 1;
6396
        end
6397
      end
6398
      // check WB INT signal
6399
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6400
      begin
6401
        if (wb_int !== 1'b1)
6402
        begin
6403
          `TIME; $display("*E WB INT signal should be set");
6404
          test_fail("WB INT signal should be set");
6405
          fail = fail + 1;
6406
        end
6407
      end
6408
      else
6409
      begin
6410
        if (wb_int !== 1'b0)
6411
        begin
6412
          `TIME; $display("*E WB INT signal should not be set");
6413
          test_fail("WB INT signal should not be set");
6414
          fail = fail + 1;
6415
        end
6416
      end
6417
      // check TX buffer descriptor of a packet
6418
      check_tx_bd(num_of_bd, data);
6419
      if (num_of_frames >= 5)
6420
      begin
6421
        if (i_length[1] == 1'b0) // interrupt enabled
6422
        begin
6423
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6424
               (data[15:0] !== 16'h5800) ) // without wrap bit
6425
          begin
6426
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6427
            test_fail("TX buffer descriptor status is not correct");
6428
            fail = fail + 1;
6429
          end
6430
        end
6431
        else // interrupt not enabled
6432
        begin
6433
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6434
               (data[15:0] !== 16'h1800) ) // without wrap bit
6435
          begin
6436
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6437
            test_fail("TX buffer descriptor status is not correct");
6438
            fail = fail + 1;
6439
          end
6440
        end
6441
      end
6442
      else
6443
      begin
6444
        if (data[15] !== 1'b1)
6445
        begin
6446
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6447
          test_fail("TX buffer descriptor status is not correct");
6448
          fail = fail + 1;
6449
        end
6450
      end
6451
      // clear TX BD with wrap bit
6452
      if (num_of_frames == 63)
6453
        clear_tx_bd(16, 16);
6454
      // check interrupts
6455 274 tadejm
      wait (wbm_working == 0);
6456 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6457
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6458
      begin
6459
        if ((data & `ETH_INT_TXB) !== 1'b1)
6460
        begin
6461
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6462
          test_fail("Interrupt Transmit Buffer was not set");
6463
          fail = fail + 1;
6464
        end
6465
        if ((data & (~`ETH_INT_TXB)) !== 0)
6466
        begin
6467
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6468
          test_fail("Other interrupts (except Transmit Buffer) were set");
6469
          fail = fail + 1;
6470
        end
6471
      end
6472
      else
6473
      begin
6474
        if (data !== 0)
6475
        begin
6476
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6477
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6478
          fail = fail + 1;
6479
        end
6480
      end
6481
      // clear interrupts
6482 274 tadejm
      wait (wbm_working == 0);
6483 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6484
      // check WB INT signal
6485
      if (wb_int !== 1'b0)
6486
      begin
6487
        test_fail("WB INT signal should not be set");
6488
        fail = fail + 1;
6489
      end
6490
      // INTERMEDIATE DISPLAYS
6491
      if (i_length == 3)
6492
      begin
6493
        $display("    pads appending to packets is selected");
6494
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6495
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6496
                 0, 3);
6497
      end
6498
      else if (i_length == 9)
6499
      begin
6500
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6501
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6502
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6503
                 5, 9);
6504
      end
6505
      else if (i_length == 17)
6506
      begin
6507
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6508
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6509
                 10, 17);
6510
      end
6511
      else if (i_length == 27)
6512
      begin
6513
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6514
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6515
                 18, 27);
6516
      end
6517
      else if (i_length == 40)
6518
      begin
6519
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6520
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6521
                 28, 40);
6522
      end
6523
      else if (i_length == 54)
6524
      begin
6525
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6526
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6527
                 41, 54);
6528
      end
6529
      else if (i_length == 69)
6530
      begin
6531
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6532
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6533
                 55, 69);
6534
      end
6535
      // set length (loop variable)
6536
      i_length = i_length + 1;
6537
      // the number of frame transmitted
6538
      num_of_frames = num_of_frames + 1;
6539
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6540
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6541
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6542
          (num_of_frames == 54) || (num_of_frames == 62))
6543
        num_of_bd = 0;
6544
      else
6545
        num_of_bd = num_of_bd + 1;
6546
    end
6547
    // disable TX
6548 274 tadejm
    wait (wbm_working == 0);
6549 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6550
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6551
    @(posedge wb_clk);
6552
    if(fail == 0)
6553
      test_ok;
6554
    else
6555
      fail = 0;
6556
  end
6557
 
6558
 
6559
  ////////////////////////////////////////////////////////////////////
6560
  ////                                                            ////
6561
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6562
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6563
  ////                                                            ////
6564
  ////////////////////////////////////////////////////////////////////
6565
  if (test_num == 7) // 
6566
  begin
6567
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6568
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6569
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6570
 
6571
    // reset MAC registers
6572
    hard_reset;
6573
    // reset MAC and MII LOGIC with soft reset
6574 274 tadejm
//    reset_mac;
6575
//    reset_mii;
6576 209 tadejm
    // set wb slave response
6577
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6578
 
6579
    max_tmp = 0;
6580
    min_tmp = 0;
6581
    // set 8 TX buffer descriptors - must be set before TX enable
6582 274 tadejm
    wait (wbm_working == 0);
6583 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6584
    // enable TX, set full-duplex mode, padding and CRC appending
6585 274 tadejm
    wait (wbm_working == 0);
6586 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6587
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6588
    // prepare two packets of MAXFL length
6589 274 tadejm
    wait (wbm_working == 0);
6590 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6591
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6592
    min_tmp = tmp[31:16];
6593
    st_data = 8'h12;
6594
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6595
    st_data = 8'h34;
6596
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6597
    // check WB INT signal
6598
    if (wb_int !== 1'b0)
6599
    begin
6600
      test_fail("WB INT signal should not be set");
6601
      fail = fail + 1;
6602
    end
6603
 
6604
    // write to phy's control register for 100Mbps
6605
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6606
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6607
    speed = 100;
6608
 
6609
    frame_started = 0;
6610
    num_of_frames = 0;
6611
    num_of_bd = 0;
6612
    i_length = 0; // 0;
6613
    while (i_length < 70) // (min_tmp - 4))
6614
    begin
6615
      #1;
6616
      // choose generating carrier sense and collision
6617
      case (i_length[1:0])
6618
      2'h0: // Interrupt is generated
6619
      begin
6620
        // Reset_tx_bd nable interrupt generation
6621
        // unmask interrupts
6622 274 tadejm
        wait (wbm_working == 0);
6623 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6624
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6625
        // not detect carrier sense in FD and no collision
6626
        eth_phy.carrier_sense_tx_fd_detect(0);
6627
        eth_phy.collision(0);
6628
      end
6629
      2'h1: // Interrupt is not generated
6630
      begin
6631
        // set_tx_bd enable interrupt generation
6632
        // mask interrupts
6633 274 tadejm
        wait (wbm_working == 0);
6634 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6635
        // detect carrier sense in FD and no collision
6636
        eth_phy.carrier_sense_tx_fd_detect(1);
6637
        eth_phy.collision(0);
6638
      end
6639
      2'h2: // Interrupt is not generated
6640
      begin
6641
        // set_tx_bd disable the interrupt generation
6642
        // unmask interrupts
6643 274 tadejm
        wait (wbm_working == 0);
6644 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6645
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6646
        // not detect carrier sense in FD and set collision
6647
        eth_phy.carrier_sense_tx_fd_detect(0);
6648
        eth_phy.collision(1);
6649
      end
6650
      default: // 2'h3: // Interrupt is not generated
6651
      begin
6652
        // set_tx_bd disable the interrupt generation
6653
        // mask interrupts
6654 274 tadejm
        wait (wbm_working == 0);
6655 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6656
        // detect carrier sense in FD and set collision
6657
        eth_phy.carrier_sense_tx_fd_detect(1);
6658
        eth_phy.collision(1);
6659
      end
6660
      endcase
6661
      #1;
6662
      // first destination address on ethernet PHY
6663
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6664
      // SET packets and wrap bit
6665
      // num_of_frames <= 9 => wrap set to TX BD 0
6666
      if (num_of_frames <= 9)
6667
      begin
6668
        tmp_len = i_length; // length of frame
6669
        tmp_bd_num = 0; // TX BD number
6670
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6671
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6672
        if (tmp_len[0] == 0)
6673
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6674
        else
6675
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6676
        // set wrap bit
6677
        set_tx_bd_wrap(0);
6678
      end
6679
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6680
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6681
      begin
6682
        tmp_len = i_length; // length of frame
6683
        tmp_bd_num = 0; // TX BD number
6684
        while (tmp_bd_num < 4) //
6685
        begin
6686
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6687
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6688
          if (tmp_len[0] == 0)
6689
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6690
          else
6691
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6692
          tmp_len = tmp_len + 1;
6693
          // set TX BD number
6694
          tmp_bd_num = tmp_bd_num + 1;
6695
        end
6696
        // set wrap bit
6697
        set_tx_bd_wrap(3);
6698
      end
6699
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6700
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6701
      begin
6702
        tmp_len = i_length; // length of frame
6703
        tmp_bd_num = 0; // TX BD number
6704
        while (tmp_bd_num < 5) //
6705
        begin
6706
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6707
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6708
          if (tmp_len[0] == 0)
6709
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6710
          else
6711
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6712
          tmp_len = tmp_len + 1;
6713
          // set TX BD number
6714
          tmp_bd_num = tmp_bd_num + 1;
6715
        end
6716
        // set wrap bit
6717
        set_tx_bd_wrap(4);
6718
      end
6719
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6720
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6721
      begin
6722
        tmp_len = i_length; // length of frame
6723
        tmp_bd_num = 0; // TX BD number
6724
        while (tmp_bd_num < 6) //
6725
        begin
6726
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6727
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6728
          if (tmp_len[0] == 0)
6729
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6730
          else
6731
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6732
          tmp_len = tmp_len + 1;
6733
          // set TX BD number
6734
          tmp_bd_num = tmp_bd_num + 1;
6735
        end
6736
        // set wrap bit
6737
        set_tx_bd_wrap(5);
6738
      end
6739
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6740
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6741
      begin
6742
        tmp_len = i_length; // length of frame
6743
        tmp_bd_num = 0; // TX BD number
6744
        while (tmp_bd_num < 7) //
6745
        begin
6746
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6747
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6748
          if (tmp_len[0] == 0)
6749
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6750
          else
6751
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6752
          tmp_len = tmp_len + 1;
6753
          // set TX BD number
6754
          tmp_bd_num = tmp_bd_num + 1;
6755
        end
6756
        // set wrap bit
6757
        set_tx_bd_wrap(6);
6758
      end
6759
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6760
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6761
      begin
6762
        tmp_len = i_length; // length of frame
6763
        tmp_bd_num = 0; // TX BD number
6764
        while (tmp_bd_num < 8) //
6765
        begin
6766
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6767
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6768
          if (tmp_len[0] == 0)
6769
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6770
          else
6771
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6772
          tmp_len = tmp_len + 1;
6773
          // set TX BD number
6774
          tmp_bd_num = tmp_bd_num + 1;
6775
        end
6776
        // set wrap bit
6777
        set_tx_bd_wrap(7);
6778
      end
6779
      #1;
6780
      // SET ready bit
6781
      if (num_of_frames < 10)
6782
        set_tx_bd_ready(0, 0);
6783
      else if (num_of_frames < 14)
6784
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6785
      else if (num_of_frames < 18)
6786
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6787
      else if (num_of_frames < 23)
6788
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6789
      else if (num_of_frames < 28)
6790
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6791
      else if (num_of_frames < 34)
6792
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6793
      else if (num_of_frames < 40)
6794
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6795
      else if (num_of_frames < 47)
6796
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6797
      else if (num_of_frames < 54)
6798
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6799
      else if (num_of_frames < 62)
6800
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6801
      else if (num_of_frames < 70)
6802
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6803
      // CHECK END OF TRANSMITION
6804
      frame_started = 0;
6805
      if (num_of_frames >= 5)
6806
        #1 check_tx_bd(num_of_bd, data);
6807
      fork
6808
      begin: fr_st1
6809
        wait (MTxEn === 1'b1); // start transmit
6810
        frame_started = 1;
6811
      end
6812
      begin
6813 279 mohor
        repeat (50) @(posedge mtx_clk);     // Increased from 30 to 50
6814 209 tadejm
        if (num_of_frames < 5)
6815
        begin
6816
          if (frame_started == 1)
6817
          begin
6818
            `TIME; $display("*E Frame should NOT start!");
6819
          end
6820
          disable fr_st1;
6821
        end
6822
        else
6823
        begin
6824
          if (frame_started == 0)
6825
          begin
6826
            `TIME; $display("*W Frame should start!");
6827
            disable fr_st1;
6828
          end
6829
        end
6830
      end
6831
      join
6832
      // check packets larger than 4 bytes
6833
      if (num_of_frames >= 5)
6834
      begin
6835
        wait (MTxEn === 1'b0); // end transmit
6836
        while (data[15] === 1)
6837
        begin
6838
          #1 check_tx_bd(num_of_bd, data);
6839
          @(posedge wb_clk);
6840
        end
6841
        repeat (1) @(posedge wb_clk);
6842
        // check length of a PACKET
6843
        if (i_length <= (min_tmp - 4))
6844
        begin
6845
          if (eth_phy.tx_len != min_tmp)
6846
          begin
6847
            test_fail("Wrong length of the packet out from MAC");
6848
            fail = fail + 1;
6849
          end
6850
        end
6851
        else
6852
        begin
6853
          if (eth_phy.tx_len != (i_length + 4))
6854
          begin
6855
            test_fail("Wrong length of the packet out from MAC");
6856
            fail = fail + 1;
6857
          end
6858
        end
6859
        // check transmitted TX packet data
6860
        if (i_length[0] == 0)
6861
        begin
6862
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6863
        end
6864
        else
6865
        begin
6866
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6867
        end
6868
        if (tmp > 0)
6869
        begin
6870
          test_fail("Wrong data of the transmitted packet");
6871
          fail = fail + 1;
6872
        end
6873
        // check transmited TX packet CRC
6874
        if (num_of_frames < (min_tmp - 4))
6875
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6876
        else
6877
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6878
        if (tmp > 0)
6879
        begin
6880
          test_fail("Wrong CRC of the transmitted packet");
6881
          fail = fail + 1;
6882
        end
6883
      end
6884
      // check WB INT signal
6885
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6886
      begin
6887
        if (wb_int !== 1'b1)
6888
        begin
6889
          `TIME; $display("*E WB INT signal should be set");
6890
          test_fail("WB INT signal should be set");
6891
          fail = fail + 1;
6892
        end
6893
      end
6894
      else
6895
      begin
6896
        if (wb_int !== 1'b0)
6897
        begin
6898
          `TIME; $display("*E WB INT signal should not be set");
6899
          test_fail("WB INT signal should not be set");
6900
          fail = fail + 1;
6901
        end
6902
      end
6903
      // check TX buffer descriptor of a packet
6904
      check_tx_bd(num_of_bd, data);
6905
      if (num_of_frames >= 5)
6906
      begin
6907
        if (i_length[1] == 1'b0) // interrupt enabled
6908
        begin
6909
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6910
               (data[15:0] !== 16'h5800) ) // without wrap bit
6911
          begin
6912
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6913
            test_fail("TX buffer descriptor status is not correct");
6914
            fail = fail + 1;
6915
          end
6916
        end
6917
        else // interrupt not enabled
6918
        begin
6919
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6920
               (data[15:0] !== 16'h1800) ) // without wrap bit
6921
          begin
6922
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6923
            test_fail("TX buffer descriptor status is not correct");
6924
            fail = fail + 1;
6925
          end
6926
        end
6927
      end
6928
      else
6929
      begin
6930
        if (data[15] !== 1'b1)
6931
        begin
6932
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6933
          test_fail("TX buffer descriptor status is not correct");
6934
          fail = fail + 1;
6935
        end
6936
      end
6937
      // clear TX BD with wrap bit
6938
      if (num_of_frames == 63)
6939
        clear_tx_bd(16, 16);
6940
      // check interrupts
6941 274 tadejm
      wait (wbm_working == 0);
6942 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6943
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6944
      begin
6945
        if ((data & `ETH_INT_TXB) !== 1'b1)
6946
        begin
6947
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6948
          test_fail("Interrupt Transmit Buffer was not set");
6949
          fail = fail + 1;
6950
        end
6951
        if ((data & (~`ETH_INT_TXB)) !== 0)
6952
        begin
6953
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6954
          test_fail("Other interrupts (except Transmit Buffer) were set");
6955
          fail = fail + 1;
6956
        end
6957
      end
6958
      else
6959
      begin
6960
        if (data !== 0)
6961
        begin
6962
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6963
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6964
          fail = fail + 1;
6965
        end
6966
      end
6967
      // clear interrupts
6968 274 tadejm
      wait (wbm_working == 0);
6969 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6970
      // check WB INT signal
6971
      if (wb_int !== 1'b0)
6972
      begin
6973
        test_fail("WB INT signal should not be set");
6974
        fail = fail + 1;
6975
      end
6976
      // INTERMEDIATE DISPLAYS
6977
      if (i_length == 3)
6978
      begin
6979
        $display("    pads appending to packets is selected");
6980
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6981
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6982
                 0, 3);
6983
      end
6984
      else if (i_length == 9)
6985
      begin
6986
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6987
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6988
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6989
                 5, 9);
6990
      end
6991
      else if (i_length == 17)
6992
      begin
6993
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6994
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6995
                 10, 17);
6996
      end
6997
      else if (i_length == 27)
6998
      begin
6999
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7000
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7001
                 18, 27);
7002
      end
7003
      else if (i_length == 40)
7004
      begin
7005
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7006
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7007
                 28, 40);
7008
      end
7009
      else if (i_length == 54)
7010
      begin
7011
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7012
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7013
                 41, 54);
7014
      end
7015
      else if (i_length == 69)
7016
      begin
7017
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7018
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7019
                 55, 69);
7020
      end
7021
      // set length (loop variable)
7022
      i_length = i_length + 1;
7023
      // the number of frame transmitted
7024
      num_of_frames = num_of_frames + 1;
7025
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7026
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7027
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7028
          (num_of_frames == 54) || (num_of_frames == 62))
7029
        num_of_bd = 0;
7030
      else
7031
        num_of_bd = num_of_bd + 1;
7032
    end
7033
    // disable TX
7034
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7035
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7036
    @(posedge wb_clk);
7037
    if(fail == 0)
7038
      test_ok;
7039
    else
7040
      fail = 0;
7041
  end
7042
 
7043
 
7044
  ////////////////////////////////////////////////////////////////////
7045
  ////                                                            ////
7046 243 tadejm
  ////  Test transmit packets (no pads) from 0 to (MINFL - 1)     ////
7047 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
7048
  ////                                                            ////
7049
  ////////////////////////////////////////////////////////////////////
7050
  if (test_num == 8) // 
7051
  begin
7052 243 tadejm
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
7053
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
7054
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
7055 279 mohor
 
7056 209 tadejm
    // reset MAC registers
7057
    hard_reset;
7058
    // reset MAC and MII LOGIC with soft reset
7059 274 tadejm
//    reset_mac;
7060
//    reset_mii;
7061 209 tadejm
    // set wb slave response
7062
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7063
 
7064
    max_tmp = 0;
7065
    min_tmp = 0;
7066
    // set 8 TX buffer descriptors - must be set before TX enable
7067 274 tadejm
    wait (wbm_working == 0);
7068 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7069
    // enable TX, set full-duplex mode, padding and CRC appending
7070 274 tadejm
    wait (wbm_working == 0);
7071 243 tadejm
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7072
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
7073 209 tadejm
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7074
    // prepare two packets of MAXFL length
7075 274 tadejm
    wait (wbm_working == 0);
7076 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7077
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7078
    min_tmp = tmp[31:16];
7079
    st_data = 8'h12;
7080
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7081
    st_data = 8'h34;
7082
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7083
    // check WB INT signal
7084
    if (wb_int !== 1'b0)
7085
    begin
7086
      test_fail("WB INT signal should not be set");
7087
      fail = fail + 1;
7088
    end
7089
 
7090
    // write to phy's control register for 10Mbps
7091
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
7092
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
7093
    speed = 10;
7094
 
7095
    frame_started = 0;
7096
    num_of_frames = 0;
7097
    num_of_bd = 0;
7098
    i_length = 0; // 0;
7099
    while (i_length < 70) // (min_tmp - 4))
7100
    begin
7101
      #1;
7102
      // choose generating carrier sense and collision
7103
      case (i_length[1:0])
7104
      2'h0: // Interrupt is generated
7105
      begin
7106
        // Reset_tx_bd nable interrupt generation
7107
        // unmask interrupts
7108 274 tadejm
        wait (wbm_working == 0);
7109 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7110
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7111
        // not detect carrier sense in FD and no collision
7112
        eth_phy.carrier_sense_tx_fd_detect(0);
7113
        eth_phy.collision(0);
7114
      end
7115
      2'h1: // Interrupt is not generated
7116
      begin
7117
        // set_tx_bd enable interrupt generation
7118
        // mask interrupts
7119 274 tadejm
        wait (wbm_working == 0);
7120 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7121
        // detect carrier sense in FD and no collision
7122
        eth_phy.carrier_sense_tx_fd_detect(1);
7123
        eth_phy.collision(0);
7124
      end
7125
      2'h2: // Interrupt is not generated
7126
      begin
7127
        // set_tx_bd disable the interrupt generation
7128
        // unmask interrupts
7129 274 tadejm
        wait (wbm_working == 0);
7130 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7131
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7132
        // not detect carrier sense in FD and set collision
7133
        eth_phy.carrier_sense_tx_fd_detect(0);
7134
        eth_phy.collision(1);
7135
      end
7136
      default: // 2'h3: // Interrupt is not generated
7137
      begin
7138
        // set_tx_bd disable the interrupt generation
7139
        // mask interrupts
7140 274 tadejm
        wait (wbm_working == 0);
7141 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7142
        // detect carrier sense in FD and set collision
7143
        eth_phy.carrier_sense_tx_fd_detect(1);
7144
        eth_phy.collision(1);
7145
      end
7146
      endcase
7147 243 tadejm
//      // append CRC
7148
//      if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7149
//      begin
7150
//        append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
7151
//      end
7152 209 tadejm
      #1;
7153
      // first destination address on ethernet PHY
7154
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7155
      // SET packets and wrap bit
7156
      // num_of_frames <= 9 => wrap set to TX BD 0
7157 243 tadejm
      if (num_of_frames <= 5)
7158
        begin
7159
          tmp_len = i_length; // length of frame
7160
          tmp_bd_num = 0; // TX BD number
7161
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7162
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7163 274 tadejm
 
7164 243 tadejm
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
7165 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
7166 243 tadejm
          else
7167 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7168 243 tadejm
          // set wrap bit
7169
          set_tx_bd_wrap(0);
7170
        end
7171
        else if (num_of_frames <= 9)
7172
        begin
7173
          tmp_len = i_length; // length of frame
7174
          tmp_bd_num = 0; // TX BD number
7175
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7176
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7177
          if (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
7178 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7179 243 tadejm
          else
7180
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7181
          // set wrap bit
7182
          set_tx_bd_wrap(0);
7183 279 mohor
        end
7184
        // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7185
        else if ((num_of_frames == 10) || (num_of_frames == 14))
7186 209 tadejm
        begin
7187 279 mohor
          tmp_len = i_length; // length of frame
7188
          tmp_bd_num = 0; // TX BD number
7189
          while (tmp_bd_num < 4)
7190
          begin
7191
            // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7192
            // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7193
            if (tmp_len[0] == 0)
7194
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7195
            else
7196
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7197
            tmp_len = tmp_len + 1;
7198
            // set TX BD number
7199
            tmp_bd_num = tmp_bd_num + 1;
7200
          end
7201
          // set wrap bit
7202
          set_tx_bd_wrap(3);
7203 209 tadejm
        end
7204
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7205
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7206
      begin
7207
        tmp_len = i_length; // length of frame
7208
        tmp_bd_num = 0; // TX BD number
7209
        while (tmp_bd_num < 5) //
7210
        begin
7211
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7212
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7213
          if (tmp_len[0] == 0)
7214 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7215 243 tadejm
          else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
7216
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
7217
                      ((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
7218 279 mohor
 
7219 209 tadejm
          tmp_len = tmp_len + 1;
7220
          // set TX BD number
7221
          tmp_bd_num = tmp_bd_num + 1;
7222
        end
7223
        // set wrap bit
7224
        set_tx_bd_wrap(4);
7225
      end
7226
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7227
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7228
      begin
7229
        tmp_len = i_length; // length of frame
7230
        tmp_bd_num = 0; // TX BD number
7231
        while (tmp_bd_num < 6) //
7232
        begin
7233
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7234
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7235
          if (tmp_len[0] == 0)
7236 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7237 209 tadejm
          else
7238 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7239 209 tadejm
          tmp_len = tmp_len + 1;
7240
          // set TX BD number
7241
          tmp_bd_num = tmp_bd_num + 1;
7242
        end
7243
        // set wrap bit
7244
        set_tx_bd_wrap(5);
7245
      end
7246
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7247
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7248
      begin
7249
        tmp_len = i_length; // length of frame
7250
        tmp_bd_num = 0; // TX BD number
7251
        while (tmp_bd_num < 7) //
7252
        begin
7253
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7254
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7255
          if (tmp_len[0] == 0)
7256 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7257 209 tadejm
          else
7258 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7259 209 tadejm
          tmp_len = tmp_len + 1;
7260
          // set TX BD number
7261
          tmp_bd_num = tmp_bd_num + 1;
7262
        end
7263
        // set wrap bit
7264
        set_tx_bd_wrap(6);
7265
      end
7266
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7267
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7268
      begin
7269
        tmp_len = i_length; // length of frame
7270
        tmp_bd_num = 0; // TX BD number
7271
        while (tmp_bd_num < 8) //
7272
        begin
7273
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7274
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7275
          if (tmp_len[0] == 0)
7276 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7277 209 tadejm
          else
7278 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7279 209 tadejm
          tmp_len = tmp_len + 1;
7280
          // set TX BD number
7281
          tmp_bd_num = tmp_bd_num + 1;
7282
        end
7283
        // set wrap bit
7284
        set_tx_bd_wrap(7);
7285
      end
7286
      #1;
7287
      // SET ready bit
7288
      if (num_of_frames < 10)
7289
        set_tx_bd_ready(0, 0);
7290
      else if (num_of_frames < 14)
7291
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7292
      else if (num_of_frames < 18)
7293
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7294
      else if (num_of_frames < 23)
7295
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7296
      else if (num_of_frames < 28)
7297
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7298
      else if (num_of_frames < 34)
7299
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7300
      else if (num_of_frames < 40)
7301
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7302
      else if (num_of_frames < 47)
7303
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7304
      else if (num_of_frames < 54)
7305
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7306
      else if (num_of_frames < 62)
7307
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7308
      else if (num_of_frames < 70)
7309
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7310
      // CHECK END OF TRANSMITION
7311
      frame_started = 0;
7312
      if (num_of_frames >= 5)
7313
        #1 check_tx_bd(num_of_bd, data);
7314
      fork
7315
      begin: fr_st2
7316
        wait (MTxEn === 1'b1); // start transmit
7317
        frame_started = 1;
7318
      end
7319
      begin
7320
        repeat (30) @(posedge mtx_clk);
7321
        if (num_of_frames < 5)
7322
        begin
7323
          if (frame_started == 1)
7324
          begin
7325
            `TIME; $display("*E Frame should NOT start!");
7326
          end
7327
          disable fr_st2;
7328
        end
7329
        else
7330
        begin
7331
          if (frame_started == 0)
7332
          begin
7333
            `TIME; $display("*W Frame should start!");
7334
            disable fr_st2;
7335
          end
7336
        end
7337
      end
7338
      join
7339 279 mohor
 
7340
 
7341 209 tadejm
      // check packets larger than 4 bytes
7342
      if (num_of_frames >= 5)
7343
      begin
7344
        wait (MTxEn === 1'b0); // end transmit
7345
        while (data[15] === 1)
7346
        begin
7347
          #1 check_tx_bd(num_of_bd, data);
7348
          @(posedge wb_clk);
7349
        end
7350
        repeat (1) @(posedge wb_clk);
7351 274 tadejm
 
7352
 
7353 279 mohor
        // check length of a PACKET     // Check this if it is OK igor
7354
        if (num_of_frames < 6)
7355
          begin
7356
            if (eth_phy.tx_len != (i_length + 4))
7357
              begin
7358
                `TIME; $display("*E Wrong length of the packet out from MAC");
7359
                test_fail("Wrong length of the packet out from MAC");
7360
                fail = fail + 1;
7361
              end
7362
          end
7363
        else if (num_of_frames != 23) // 6 - 53 except 23
7364
          begin
7365
            if (i_length[0] == 1'b0)
7366
              begin
7367
                if (eth_phy.tx_len != i_length)
7368
                  begin
7369
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7370
                    test_fail("Wrong length of the packet out from MAC");
7371
                    fail = fail + 1;
7372
                  end
7373
              end
7374
            else
7375
              begin
7376
                if (eth_phy.tx_len != (i_length + 4))
7377
                  begin
7378
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7379
                    test_fail("Wrong length of the packet out from MAC");
7380
                    fail = fail + 1;
7381
                  end
7382
              end
7383
          end
7384
        else // num_of_frames == 23
7385
          begin
7386
            if (data[12]) // Padding
7387
              begin
7388
                if (eth_phy.tx_len != (64))
7389
                  begin
7390
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7391
                    test_fail("Wrong length of the packet out from MAC");
7392
                    fail = fail + 1;
7393
                  end
7394
              end
7395
            else
7396
              begin
7397
                if (eth_phy.tx_len != (i_length + 4))
7398
                  begin
7399
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7400
                    test_fail("Wrong length of the packet out from MAC");
7401
                    fail = fail + 1;
7402
                  end
7403
              end
7404
          end
7405
 
7406 209 tadejm
        // check transmitted TX packet data
7407
        if (i_length[0] == 0)
7408
        begin
7409
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7410
        end
7411 243 tadejm
        else if (num_of_frames == 23) // i_length[0] == 1 here
7412
        begin
7413 279 mohor
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7414
          #1 check_tx_packet( 0, (num_of_frames * 16 + i_length), (min_tmp - i_length - 4), tmp);
7415 243 tadejm
        end
7416 209 tadejm
        else
7417
        begin
7418
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7419
        end
7420
        if (tmp > 0)
7421
        begin
7422
          test_fail("Wrong data of the transmitted packet");
7423
          fail = fail + 1;
7424
        end
7425
        // check transmited TX packet CRC
7426 243 tadejm
        #1;
7427
        if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7428
        begin
7429
        end
7430
        else
7431
          check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7432 209 tadejm
        if (tmp > 0)
7433
        begin
7434
          test_fail("Wrong CRC of the transmitted packet");
7435
          fail = fail + 1;
7436
        end
7437
      end
7438
      // check WB INT signal
7439
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7440
      begin
7441
        if (wb_int !== 1'b1)
7442
        begin
7443
          `TIME; $display("*E WB INT signal should be set");
7444
          test_fail("WB INT signal should be set");
7445
          fail = fail + 1;
7446
        end
7447
      end
7448
      else
7449
      begin
7450
        if (wb_int !== 1'b0)
7451
        begin
7452
          `TIME; $display("*E WB INT signal should not be set");
7453
          test_fail("WB INT signal should not be set");
7454
          fail = fail + 1;
7455
        end
7456
      end
7457
      // check TX buffer descriptor of a packet
7458
      check_tx_bd(num_of_bd, data);
7459 279 mohor
 
7460 209 tadejm
      if (num_of_frames >= 5)
7461
      begin
7462 243 tadejm
        if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
7463 209 tadejm
        begin
7464 243 tadejm
          if ( (data[15:0] !== 16'h6000) &&  // wrap bit
7465
               (data[15:0] !== 16'h4000) )  // without wrap bit
7466 209 tadejm
          begin
7467 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 1: %0h", data[15:0]);
7468 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7469
            fail = fail + 1;
7470
          end
7471
        end
7472 243 tadejm
        else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
7473 209 tadejm
        begin
7474 243 tadejm
          if ( (data[15:0] !== 16'h2000) && // wrap bit
7475
               (data[15:0] !== 16'h0000) ) // without wrap bit
7476
          begin
7477 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 2: %0h", data[15:0]);
7478 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7479
            fail = fail + 1;
7480
          end
7481
        end
7482
        else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
7483
        begin
7484
          if ( (data[15:0] !== 16'h6800) && // wrap bit
7485
               (data[15:0] !== 16'h4800) ) // without wrap bit
7486
          begin
7487 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 3: %0h", data[15:0]);
7488 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7489
            fail = fail + 1;
7490
          end
7491
        end
7492
        else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7493
        begin
7494
          if ( (data[15:0] !== 16'h2800) && // wrap bit
7495
               (data[15:0] !== 16'h0800) ) // without wrap bit
7496
          begin
7497 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 4: %0h", data[15:0]);
7498 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7499
            fail = fail + 1;
7500
          end
7501
        end
7502
        else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7503
        begin
7504 209 tadejm
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7505
               (data[15:0] !== 16'h1800) ) // without wrap bit
7506
          begin
7507 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 5: %0h", data[15:0]);
7508 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7509
            fail = fail + 1;
7510
          end
7511
        end
7512
      end
7513
      else
7514
      begin
7515
        if (data[15] !== 1'b1)
7516
        begin
7517
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7518
          test_fail("TX buffer descriptor status is not correct");
7519
          fail = fail + 1;
7520
        end
7521
      end
7522
      // clear TX BD with wrap bit
7523
      if (num_of_frames == 63)
7524
        clear_tx_bd(16, 16);
7525
      // check interrupts
7526 274 tadejm
      wait (wbm_working == 0);
7527 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7528
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7529
      begin
7530
        if ((data & `ETH_INT_TXB) !== 1'b1)
7531
        begin
7532
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7533
          test_fail("Interrupt Transmit Buffer was not set");
7534
          fail = fail + 1;
7535
        end
7536
        if ((data & (~`ETH_INT_TXB)) !== 0)
7537
        begin
7538
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7539
          test_fail("Other interrupts (except Transmit Buffer) were set");
7540
          fail = fail + 1;
7541
        end
7542
      end
7543
      else
7544
      begin
7545
        if (data !== 0)
7546
        begin
7547
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7548
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7549
          fail = fail + 1;
7550
        end
7551
      end
7552
      // clear interrupts
7553 274 tadejm
      wait (wbm_working == 0);
7554 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7555
      // check WB INT signal
7556
      if (wb_int !== 1'b0)
7557
      begin
7558
        test_fail("WB INT signal should not be set");
7559
        fail = fail + 1;
7560
      end
7561
      // INTERMEDIATE DISPLAYS
7562
      if (i_length == 3)
7563
      begin
7564 279 mohor
        $display("    pads appending to packets is not selected (except for 0x23)");
7565 209 tadejm
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7566
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7567
                 0, 3);
7568
      end
7569
      else if (i_length == 9)
7570
      begin
7571
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7572
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7573
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7574
                 5, 9);
7575
      end
7576
      else if (i_length == 17)
7577
      begin
7578
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7579
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7580
                 10, 17);
7581
      end
7582
      else if (i_length == 27)
7583
      begin
7584
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7585
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7586
                 18, 27);
7587
      end
7588
      else if (i_length == 40)
7589
      begin
7590
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7591
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7592
                 28, 40);
7593
      end
7594
      else if (i_length == 54)
7595
      begin
7596
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7597
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7598
                 41, 54);
7599
      end
7600
      else if (i_length == 69)
7601
      begin
7602
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7603
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7604
                 55, 69);
7605
      end
7606
      // set length (loop variable)
7607
      i_length = i_length + 1;
7608
      // the number of frame transmitted
7609
      num_of_frames = num_of_frames + 1;
7610
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7611
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7612
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7613
          (num_of_frames == 54) || (num_of_frames == 62))
7614
        num_of_bd = 0;
7615
      else
7616
        num_of_bd = num_of_bd + 1;
7617
    end
7618
    // disable TX
7619 274 tadejm
    wait (wbm_working == 0);
7620 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7621
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7622
    @(posedge wb_clk);
7623
    if(fail == 0)
7624
      test_ok;
7625
    else
7626
      fail = 0;
7627
  end
7628
 
7629
 
7630
  ////////////////////////////////////////////////////////////////////
7631
  ////                                                            ////
7632 243 tadejm
  ////  Test transmit packets (no pads) form 0 to (MINFL - 1)     ////
7633 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7634
  ////                                                            ////
7635
  ////////////////////////////////////////////////////////////////////
7636
  if (test_num == 9) // 
7637
  begin
7638 243 tadejm
    // TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7639
    test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7640
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7641 209 tadejm
 
7642
    // reset MAC registers
7643
    hard_reset;
7644
    // reset MAC and MII LOGIC with soft reset
7645 274 tadejm
//    reset_mac;
7646
//    reset_mii;
7647 209 tadejm
    // set wb slave response
7648
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7649
 
7650
    max_tmp = 0;
7651
    min_tmp = 0;
7652
    // set 8 TX buffer descriptors - must be set before TX enable
7653 274 tadejm
    wait (wbm_working == 0);
7654 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7655
    // enable TX, set full-duplex mode, padding and CRC appending
7656 274 tadejm
    wait (wbm_working == 0);
7657 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7658
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7659
    // prepare two packets of MAXFL length
7660 274 tadejm
    wait (wbm_working == 0);
7661 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7662
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7663
    min_tmp = tmp[31:16];
7664
    st_data = 8'h12;
7665
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7666
    st_data = 8'h34;
7667
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7668
    // check WB INT signal
7669
    if (wb_int !== 1'b0)
7670
    begin
7671
      test_fail("WB INT signal should not be set");
7672
      fail = fail + 1;
7673
    end
7674
 
7675
    // write to phy's control register for 100Mbps
7676
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7677
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7678
    speed = 100;
7679
 
7680
    frame_started = 0;
7681
    num_of_frames = 0;
7682
    num_of_bd = 0;
7683
    i_length = 0; // 0;
7684
    while (i_length < 70) // (min_tmp - 4))
7685
    begin
7686
      #1;
7687
      // choose generating carrier sense and collision
7688
      case (i_length[1:0])
7689
      2'h0: // Interrupt is generated
7690
      begin
7691
        // Reset_tx_bd nable interrupt generation
7692
        // unmask interrupts
7693 274 tadejm
        wait (wbm_working == 0);
7694 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7695
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7696
        // not detect carrier sense in FD and no collision
7697
        eth_phy.carrier_sense_tx_fd_detect(0);
7698
        eth_phy.collision(0);
7699
      end
7700
      2'h1: // Interrupt is not generated
7701
      begin
7702
        // set_tx_bd enable interrupt generation
7703
        // mask interrupts
7704 274 tadejm
        wait (wbm_working == 0);
7705 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7706
        // detect carrier sense in FD and no collision
7707
        eth_phy.carrier_sense_tx_fd_detect(1);
7708
        eth_phy.collision(0);
7709
      end
7710
      2'h2: // Interrupt is not generated
7711
      begin
7712
        // set_tx_bd disable the interrupt generation
7713
        // unmask interrupts
7714 274 tadejm
        wait (wbm_working == 0);
7715 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7716
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7717
        // not detect carrier sense in FD and set collision
7718
        eth_phy.carrier_sense_tx_fd_detect(0);
7719
        eth_phy.collision(1);
7720
      end
7721
      default: // 2'h3: // Interrupt is not generated
7722
      begin
7723
        // set_tx_bd disable the interrupt generation
7724
        // mask interrupts
7725 274 tadejm
        wait (wbm_working == 0);
7726 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7727
        // detect carrier sense in FD and set collision
7728
        eth_phy.carrier_sense_tx_fd_detect(1);
7729
        eth_phy.collision(1);
7730
      end
7731
      endcase
7732
      #1;
7733
      // first destination address on ethernet PHY
7734
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7735
      // SET packets and wrap bit
7736
      // num_of_frames <= 9 => wrap set to TX BD 0
7737
      if (num_of_frames <= 9)
7738
      begin
7739
        tmp_len = i_length; // length of frame
7740
        tmp_bd_num = 0; // TX BD number
7741
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7742
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7743
        if (tmp_len[0] == 0)
7744
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7745
        else
7746
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7747
        // set wrap bit
7748
        set_tx_bd_wrap(0);
7749
      end
7750
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7751
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7752
      begin
7753
        tmp_len = i_length; // length of frame
7754
        tmp_bd_num = 0; // TX BD number
7755
        while (tmp_bd_num < 4) //
7756
        begin
7757
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7758
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7759
          if (tmp_len[0] == 0)
7760
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7761
          else
7762
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7763
          tmp_len = tmp_len + 1;
7764
          // set TX BD number
7765
          tmp_bd_num = tmp_bd_num + 1;
7766
        end
7767
        // set wrap bit
7768
        set_tx_bd_wrap(3);
7769
      end
7770
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7771
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7772
      begin
7773
        tmp_len = i_length; // length of frame
7774
        tmp_bd_num = 0; // TX BD number
7775
        while (tmp_bd_num < 5) //
7776
        begin
7777
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7778
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7779
          if (tmp_len[0] == 0)
7780
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7781
          else
7782
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7783
          tmp_len = tmp_len + 1;
7784
          // set TX BD number
7785
          tmp_bd_num = tmp_bd_num + 1;
7786
        end
7787
        // set wrap bit
7788
        set_tx_bd_wrap(4);
7789
      end
7790
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7791
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7792
      begin
7793
        tmp_len = i_length; // length of frame
7794
        tmp_bd_num = 0; // TX BD number
7795
        while (tmp_bd_num < 6) //
7796
        begin
7797
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7798
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7799
          if (tmp_len[0] == 0)
7800
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7801
          else
7802
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7803
          tmp_len = tmp_len + 1;
7804
          // set TX BD number
7805
          tmp_bd_num = tmp_bd_num + 1;
7806
        end
7807
        // set wrap bit
7808
        set_tx_bd_wrap(5);
7809
      end
7810
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7811
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7812
      begin
7813
        tmp_len = i_length; // length of frame
7814
        tmp_bd_num = 0; // TX BD number
7815
        while (tmp_bd_num < 7) //
7816
        begin
7817
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7818
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7819
          if (tmp_len[0] == 0)
7820
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7821
          else
7822
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7823
          tmp_len = tmp_len + 1;
7824
          // set TX BD number
7825
          tmp_bd_num = tmp_bd_num + 1;
7826
        end
7827
        // set wrap bit
7828
        set_tx_bd_wrap(6);
7829
      end
7830
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7831
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7832
      begin
7833
        tmp_len = i_length; // length of frame
7834
        tmp_bd_num = 0; // TX BD number
7835
        while (tmp_bd_num < 8) //
7836
        begin
7837
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7838
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7839
          if (tmp_len[0] == 0)
7840
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7841
          else
7842
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7843
          tmp_len = tmp_len + 1;
7844
          // set TX BD number
7845
          tmp_bd_num = tmp_bd_num + 1;
7846
        end
7847
        // set wrap bit
7848
        set_tx_bd_wrap(7);
7849
      end
7850
      #1;
7851
      // SET ready bit
7852
      if (num_of_frames < 10)
7853
        set_tx_bd_ready(0, 0);
7854
      else if (num_of_frames < 14)
7855
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7856
      else if (num_of_frames < 18)
7857
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7858
      else if (num_of_frames < 23)
7859
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7860
      else if (num_of_frames < 28)
7861
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7862
      else if (num_of_frames < 34)
7863
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7864
      else if (num_of_frames < 40)
7865
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7866
      else if (num_of_frames < 47)
7867
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7868
      else if (num_of_frames < 54)
7869
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7870
      else if (num_of_frames < 62)
7871
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7872
      else if (num_of_frames < 70)
7873
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7874
      // CHECK END OF TRANSMITION
7875
      frame_started = 0;
7876
      if (num_of_frames >= 5)
7877
        #1 check_tx_bd(num_of_bd, data);
7878
      fork
7879
      begin: fr_st3
7880
        wait (MTxEn === 1'b1); // start transmit
7881
        frame_started = 1;
7882
      end
7883
      begin
7884 279 mohor
        repeat (50) @(posedge mtx_clk);
7885
$display("(%0t) num_of_frames = 0x%0x", $time, num_of_frames);
7886 209 tadejm
        if (num_of_frames < 5)
7887
        begin
7888
          if (frame_started == 1)
7889
          begin
7890
            `TIME; $display("*E Frame should NOT start!");
7891
          end
7892
          disable fr_st3;
7893
        end
7894
        else
7895
        begin
7896
          if (frame_started == 0)
7897
          begin
7898
            `TIME; $display("*W Frame should start!");
7899 279 mohor
#500 $stop;
7900 209 tadejm
            disable fr_st3;
7901
          end
7902
        end
7903
      end
7904
      join
7905
      // check packets larger than 4 bytes
7906
      if (num_of_frames >= 5)
7907
      begin
7908
        wait (MTxEn === 1'b0); // end transmit
7909
        while (data[15] === 1)
7910
        begin
7911
          #1 check_tx_bd(num_of_bd, data);
7912
          @(posedge wb_clk);
7913
        end
7914
        repeat (1) @(posedge wb_clk);
7915
        // check length of a PACKET
7916 279 mohor
        if ((num_of_frames + 4) < 64)
7917
          begin
7918
            if (eth_phy.tx_len != 64)
7919
            begin
7920
              `TIME; $display("*E Wrong length of the packet out from MAC");
7921
              test_fail("Wrong length of the packet out from MAC");
7922
              fail = fail + 1;
7923
            end
7924
          end
7925
        else
7926
          begin
7927 209 tadejm
        if (eth_phy.tx_len != (i_length + 4))
7928
        begin
7929
          `TIME; $display("*E Wrong length of the packet out from MAC");
7930
          test_fail("Wrong length of the packet out from MAC");
7931
          fail = fail + 1;
7932
        end
7933 279 mohor
          end
7934 209 tadejm
        // check transmitted TX packet data
7935
        if (i_length[0] == 0)
7936
        begin
7937
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7938
        end
7939
        else
7940
        begin
7941
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7942
        end
7943
        if (tmp > 0)
7944
        begin
7945
          test_fail("Wrong data of the transmitted packet");
7946
          fail = fail + 1;
7947
        end
7948
        // check transmited TX packet CRC
7949
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7950
        if (tmp > 0)
7951
        begin
7952
          test_fail("Wrong CRC of the transmitted packet");
7953
          fail = fail + 1;
7954
        end
7955
      end
7956
      // check WB INT signal
7957
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7958
      begin
7959
        if (wb_int !== 1'b1)
7960
        begin
7961
          `TIME; $display("*E WB INT signal should be set");
7962
          test_fail("WB INT signal should be set");
7963
          fail = fail + 1;
7964
        end
7965
      end
7966
      else
7967
      begin
7968
        if (wb_int !== 1'b0)
7969
        begin
7970
          `TIME; $display("*E WB INT signal should not be set");
7971
          test_fail("WB INT signal should not be set");
7972
          fail = fail + 1;
7973
        end
7974
      end
7975
      // check TX buffer descriptor of a packet
7976
      check_tx_bd(num_of_bd, data);
7977
      if (num_of_frames >= 5)
7978
      begin
7979
        if (i_length[1] == 1'b0) // interrupt enabled
7980
        begin
7981
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7982
               (data[15:0] !== 16'h5800) ) // without wrap bit
7983
          begin
7984
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7985
            test_fail("TX buffer descriptor status is not correct");
7986
            fail = fail + 1;
7987
          end
7988
        end
7989
        else // interrupt not enabled
7990
        begin
7991
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7992
               (data[15:0] !== 16'h1800) ) // without wrap bit
7993
          begin
7994
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7995
            test_fail("TX buffer descriptor status is not correct");
7996
            fail = fail + 1;
7997
          end
7998
        end
7999
      end
8000
      else
8001
      begin
8002
        if (data[15] !== 1'b1)
8003
        begin
8004
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8005
          test_fail("TX buffer descriptor status is not correct");
8006
          fail = fail + 1;
8007
        end
8008
      end
8009
      // clear TX BD with wrap bit
8010
      if (num_of_frames == 63)
8011
        clear_tx_bd(16, 16);
8012
      // check interrupts
8013 274 tadejm
      wait (wbm_working == 0);
8014 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8015
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
8016
      begin
8017
        if ((data & `ETH_INT_TXB) !== 1'b1)
8018
        begin
8019
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8020
          test_fail("Interrupt Transmit Buffer was not set");
8021
          fail = fail + 1;
8022
        end
8023
        if ((data & (~`ETH_INT_TXB)) !== 0)
8024
        begin
8025
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8026
          test_fail("Other interrupts (except Transmit Buffer) were set");
8027
          fail = fail + 1;
8028
        end
8029
      end
8030
      else
8031
      begin
8032
        if (data !== 0)
8033
        begin
8034
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
8035
          test_fail("Any of interrupts (except Transmit Buffer) was set");
8036
          fail = fail + 1;
8037
        end
8038
      end
8039
      // clear interrupts
8040 274 tadejm
      wait (wbm_working == 0);
8041 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8042
      // check WB INT signal
8043
      if (wb_int !== 1'b0)
8044
      begin
8045
        test_fail("WB INT signal should not be set");
8046
        fail = fail + 1;
8047
      end
8048
      // INTERMEDIATE DISPLAYS
8049
      if (i_length == 3)
8050
      begin
8051
        $display("    pads appending to packets is selected");
8052
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
8053
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
8054
                 0, 3);
8055
      end
8056
      else if (i_length == 9)
8057
      begin
8058
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
8059
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
8060
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8061
                 5, 9);
8062
      end
8063
      else if (i_length == 17)
8064
      begin
8065
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
8066
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8067
                 10, 17);
8068
      end
8069
      else if (i_length == 27)
8070
      begin
8071
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
8072
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8073
                 18, 27);
8074
      end
8075
      else if (i_length == 40)
8076
      begin
8077
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
8078
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8079
                 28, 40);
8080
      end
8081
      else if (i_length == 54)
8082
      begin
8083
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
8084
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8085
                 41, 54);
8086
      end
8087
      else if (i_length == 69)
8088
      begin
8089
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
8090
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
8091
                 55, 69);
8092
      end
8093
      // set length (loop variable)
8094
      i_length = i_length + 1;
8095
      // the number of frame transmitted
8096
      num_of_frames = num_of_frames + 1;
8097
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
8098
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
8099
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
8100
          (num_of_frames == 54) || (num_of_frames == 62))
8101
        num_of_bd = 0;
8102
      else
8103
        num_of_bd = num_of_bd + 1;
8104
    end
8105
    // disable TX
8106 274 tadejm
    wait (wbm_working == 0);
8107 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8108
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8109
    @(posedge wb_clk);
8110
    if(fail == 0)
8111
      test_ok;
8112
    else
8113
      fail = 0;
8114
  end
8115
 
8116
 
8117
  ////////////////////////////////////////////////////////////////////
8118
  ////                                                            ////
8119
  ////  Test transmit packets across MAXFL value at               ////
8120
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
8121
  ////                                                            ////
8122
  ////////////////////////////////////////////////////////////////////
8123
  if (test_num == 10) // without and with padding
8124
  begin
8125
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8126
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8127
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8128
 
8129
    // reset MAC registers
8130
    hard_reset;
8131
    // set wb slave response
8132
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8133
 
8134
    max_tmp = 0;
8135
    min_tmp = 0;
8136
    num_of_frames = 0;
8137
    num_of_bd = 0;
8138 315 tadejm
    tx_bd_num = 0;
8139 209 tadejm
    // set 13 TX buffer descriptors - must be set before TX enable
8140 274 tadejm
    wait (wbm_working == 0);
8141 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8142
    // enable TX, set full-duplex mode, NO padding and CRC appending
8143 274 tadejm
    wait (wbm_working == 0);
8144 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8145
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8146
    // prepare a packet of MAXFL + 10 length
8147 274 tadejm
    wait (wbm_working == 0);
8148 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8149
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8150
    min_tmp = tmp[31:16];
8151
    st_data = 8'hA3;
8152
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8153
    // check WB INT signal
8154
    if (wb_int !== 1'b0)
8155
    begin
8156
      test_fail("WB INT signal should not be set");
8157
      fail = fail + 1;
8158
    end
8159
 
8160
    // write to phy's control register for 10Mbps
8161
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8162
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8163
    speed = 10;
8164
 
8165
    i_length = (max_tmp - 5);
8166 279 mohor
    while (num_of_bd <= 3)
8167 209 tadejm
    begin
8168 279 mohor
      // unmask interrupts
8169
      wait (wbm_working == 0);
8170
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8171
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8172
      // not detect carrier sense in FD and no collision
8173
      eth_phy.carrier_sense_tx_fd_detect(0);
8174
      eth_phy.collision(0);
8175 209 tadejm
      // first destination address on ethernet PHY
8176
      eth_phy.set_tx_mem_addr(0);
8177
 
8178 279 mohor
      if (num_of_bd == 0)
8179
      begin
8180
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8181
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8182
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8183
        set_tx_bd_wrap(2);
8184
        set_tx_bd_ready(0, 0);
8185
      end
8186
      else if (num_of_bd == 1)
8187 315 tadejm
      begin
8188 279 mohor
        set_tx_bd_ready(1, 1);
8189 315 tadejm
        tx_bd_num = 1;
8190
      end
8191 279 mohor
      else if (num_of_bd == 2)
8192 315 tadejm
      begin
8193 279 mohor
        set_tx_bd_ready(2, 2);
8194 315 tadejm
        tx_bd_num = 2;
8195
      end
8196 279 mohor
      else if (num_of_bd == 3)
8197
      begin
8198
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8199
        set_tx_bd_wrap(2);
8200
        set_tx_bd_ready(0, 0);
8201 315 tadejm
        i_length = 100;
8202
        tx_bd_num = 0;
8203 279 mohor
      end
8204
 
8205 209 tadejm
 
8206
      // CHECK END OF TRANSMITION
8207 315 tadejm
      check_tx_bd(tx_bd_num, data);
8208 279 mohor
      wait (MTxEn === 1'b1); // start transmit
8209 315 tadejm
      check_tx_bd(tx_bd_num, data);
8210 279 mohor
      if (data[15] !== 1)
8211
      begin
8212
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8213
        fail = fail + 1;
8214
      end
8215
      wait (MTxEn === 1'b0); // end transmit
8216
      while (data[15] === 1)
8217
      begin
8218 315 tadejm
        check_tx_bd(tx_bd_num, data);
8219 279 mohor
        @(posedge wb_clk);
8220
      end
8221
      repeat (1) @(posedge wb_clk);
8222 209 tadejm
      // check length of a PACKET
8223 279 mohor
      tmp_len = eth_phy.tx_len;
8224
      #1;
8225 315 tadejm
      if ((i_length + 4) <= max_tmp)
8226 209 tadejm
      begin
8227 315 tadejm
        if (tmp_len != (i_length + 4))
8228
        begin
8229
          test_fail("Wrong length of the packet out from MAC");
8230
          fail = fail + 1;
8231
        end
8232 209 tadejm
      end
8233 315 tadejm
      else
8234
      begin
8235
        if (tmp_len != (i_length + 4 - 1))
8236
        begin
8237
          test_fail("Wrong length of the packet out from MAC");
8238
          fail = fail + 1;
8239
        end
8240
      end
8241 279 mohor
 
8242
      // check transmitted TX packet data
8243
      if ((i_length + 4) == 100)
8244
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8245
      else if ((i_length + 4) <= max_tmp)
8246
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8247
      else
8248
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8249
 
8250
      if (tmp > 0)
8251
      begin
8252
        test_fail("Wrong data of the transmitted packet");
8253
        fail = fail + 1;
8254
      end
8255
 
8256
      // check transmited TX packet CRC
8257
      if ((i_length + 4) == 100)
8258
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8259
      else if ((i_length + 4) <= max_tmp)
8260
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8261
 
8262
      if (tmp > 0)
8263
      begin
8264
        test_fail("Wrong CRC of the transmitted packet");
8265
        fail = fail + 1;
8266
      end
8267
 
8268
      if (wb_int !== 1'b1)
8269
      begin
8270
        `TIME; $display("*E WB INT signal should be set");
8271
        test_fail("WB INT signal should be set");
8272
        fail = fail + 1;
8273
      end
8274
 
8275 315 tadejm
      check_tx_bd(tx_bd_num, data);
8276 279 mohor
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8277
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8278
      begin
8279
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8280
        test_fail("TX buffer descriptor status is not correct");
8281
        fail = fail + 1;
8282
      end
8283
 
8284 209 tadejm
      // check interrupts
8285 274 tadejm
      wait (wbm_working == 0);
8286 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8287 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8288
      begin
8289
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8290
        test_fail("Interrupt Transmit Buffer was not set");
8291
        fail = fail + 1;
8292
      end
8293
      if ((data & (~`ETH_INT_TXB)) !== 0)
8294
      begin
8295
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8296
        test_fail("Other interrupts (except Transmit Buffer) were set");
8297
        fail = fail + 1;
8298
      end
8299
 
8300 209 tadejm
      // clear interrupts
8301 274 tadejm
      wait (wbm_working == 0);
8302 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8303
      // check WB INT signal
8304
      if (wb_int !== 1'b0)
8305
      begin
8306
        test_fail("WB INT signal should not be set");
8307
        fail = fail + 1;
8308
      end
8309 279 mohor
 
8310 209 tadejm
      // INTERMEDIATE DISPLAYS
8311 279 mohor
      if (num_of_bd == 0)
8312
        $display("    ->packet with length %0d sent", (i_length + 4));
8313
      else if (num_of_bd == 1)
8314
        $display("    ->packet with length %0d sent", (i_length + 4));
8315
      else if (num_of_bd == 2)
8316
        $display("    ->packet with length %0d sent", (i_length + 4));
8317
      else if (num_of_bd == 3)
8318
        $display("    ->packet with length %0d sent", (104));
8319 209 tadejm
      // set length (loop variable)
8320
      i_length = i_length + 1;
8321
      // the number of frame transmitted
8322
      num_of_frames = num_of_frames + 1;
8323
      num_of_bd = num_of_bd + 1;
8324
      @(posedge wb_clk);
8325
    end
8326
    // disable TX
8327 274 tadejm
    wait (wbm_working == 0);
8328 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8329
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8330
    @(posedge wb_clk);
8331
    if(fail == 0)
8332
      test_ok;
8333
    else
8334
      fail = 0;
8335
  end
8336
 
8337
 
8338
  ////////////////////////////////////////////////////////////////////
8339
  ////                                                            ////
8340
  ////  Test transmit packets across MAXFL value at               ////
8341 279 mohor
  ////  13 TX buffer decriptors ( 100Mbps ).                       ////
8342 209 tadejm
  ////                                                            ////
8343
  ////////////////////////////////////////////////////////////////////
8344
  if (test_num == 11) // without and with padding
8345
  begin
8346
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8347
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8348
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8349 279 mohor
 
8350 209 tadejm
    // reset MAC registers
8351
    hard_reset;
8352
    // set wb slave response
8353
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8354
 
8355
    max_tmp = 0;
8356
    min_tmp = 0;
8357
    num_of_frames = 0;
8358
    num_of_bd = 0;
8359 315 tadejm
    tx_bd_num = 0;
8360 209 tadejm
    // set 13 TX buffer descriptors - must be set before TX enable
8361 274 tadejm
    wait (wbm_working == 0);
8362 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8363
    // enable TX, set full-duplex mode, NO padding and CRC appending
8364 274 tadejm
    wait (wbm_working == 0);
8365 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8366
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8367
    // prepare a packet of MAXFL + 10 length
8368 274 tadejm
    wait (wbm_working == 0);
8369 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8370
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8371
    min_tmp = tmp[31:16];
8372
    st_data = 8'hA3;
8373
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8374
    // check WB INT signal
8375
    if (wb_int !== 1'b0)
8376
    begin
8377
      test_fail("WB INT signal should not be set");
8378
      fail = fail + 1;
8379
    end
8380 279 mohor
 
8381
    // write to phy's control register for 10Mbps
8382
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8383
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8384 209 tadejm
    speed = 100;
8385
 
8386
    i_length = (max_tmp - 5);
8387 279 mohor
    while (num_of_bd <= 3)
8388 209 tadejm
    begin
8389
      // unmask interrupts
8390 274 tadejm
      wait (wbm_working == 0);
8391 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8392
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8393
      // not detect carrier sense in FD and no collision
8394
      eth_phy.carrier_sense_tx_fd_detect(0);
8395
      eth_phy.collision(0);
8396
      // first destination address on ethernet PHY
8397
      eth_phy.set_tx_mem_addr(0);
8398 279 mohor
 
8399 209 tadejm
      if (num_of_bd == 0)
8400
      begin
8401
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8402
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8403
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8404
        set_tx_bd_wrap(2);
8405
        set_tx_bd_ready(0, 0);
8406
      end
8407
      else if (num_of_bd == 1)
8408 315 tadejm
      begin
8409 209 tadejm
        set_tx_bd_ready(1, 1);
8410 315 tadejm
        tx_bd_num = 1;
8411
      end
8412 209 tadejm
      else if (num_of_bd == 2)
8413 315 tadejm
      begin
8414 209 tadejm
        set_tx_bd_ready(2, 2);
8415 315 tadejm
        tx_bd_num = 2;
8416
      end
8417 279 mohor
      else if (num_of_bd == 3)
8418
      begin
8419
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8420
        set_tx_bd_wrap(2);
8421
        set_tx_bd_ready(0, 0);
8422 315 tadejm
        i_length = 100;
8423
        tx_bd_num = 0;
8424 279 mohor
      end
8425
 
8426
 
8427 209 tadejm
      // CHECK END OF TRANSMITION
8428 315 tadejm
      check_tx_bd(tx_bd_num, data);
8429 279 mohor
      wait (MTxEn === 1'b1); // start transmit
8430 315 tadejm
      check_tx_bd(tx_bd_num, data);
8431 279 mohor
      if (data[15] !== 1)
8432
      begin
8433
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8434
        fail = fail + 1;
8435
      end
8436
      wait (MTxEn === 1'b0); // end transmit
8437
      while (data[15] === 1)
8438
      begin
8439 315 tadejm
        check_tx_bd(tx_bd_num, data);
8440 279 mohor
        @(posedge wb_clk);
8441
      end
8442
      repeat (1) @(posedge wb_clk);
8443
      repeat (10) @(posedge mtx_clk);
8444 209 tadejm
      // check length of a PACKET
8445
      tmp_len = eth_phy.tx_len;
8446
      #1;
8447 315 tadejm
      if ((i_length + 4) <= max_tmp)
8448 209 tadejm
      begin
8449 315 tadejm
        if (tmp_len != (i_length + 4))
8450
        begin
8451
          test_fail("Wrong length of the packet out from MAC");
8452
          fail = fail + 1;
8453
        end
8454 209 tadejm
      end
8455 315 tadejm
      else
8456
      begin
8457
        if (tmp_len != (i_length + 4 - 1))
8458
        begin
8459
          test_fail("Wrong length of the packet out from MAC");
8460
          fail = fail + 1;
8461
        end
8462
      end
8463 279 mohor
 
8464
      // check transmitted TX packet data
8465
      if ((i_length + 4) == 100)
8466
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8467
      else if ((i_length + 4) <= max_tmp)
8468
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8469
      else
8470
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8471
 
8472 209 tadejm
      if (tmp > 0)
8473
      begin
8474
        test_fail("Wrong data of the transmitted packet");
8475
        fail = fail + 1;
8476
      end
8477 279 mohor
 
8478 209 tadejm
      // check transmited TX packet CRC
8479 279 mohor
      if ((i_length + 4) == 100)
8480
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8481
      else if ((i_length + 4) <= max_tmp)
8482
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8483
 
8484 209 tadejm
      if (tmp > 0)
8485
      begin
8486
        test_fail("Wrong CRC of the transmitted packet");
8487
        fail = fail + 1;
8488
      end
8489 279 mohor
 
8490 209 tadejm
      if (wb_int !== 1'b1)
8491
      begin
8492
        `TIME; $display("*E WB INT signal should be set");
8493
        test_fail("WB INT signal should be set");
8494
        fail = fail + 1;
8495
      end
8496 279 mohor
 
8497 315 tadejm
      check_tx_bd(tx_bd_num, data);
8498 209 tadejm
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8499
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8500
      begin
8501
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8502
        test_fail("TX buffer descriptor status is not correct");
8503
        fail = fail + 1;
8504
      end
8505 279 mohor
 
8506 209 tadejm
      // check interrupts
8507 274 tadejm
      wait (wbm_working == 0);
8508 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8509 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8510 209 tadejm
      begin
8511
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8512
        test_fail("Interrupt Transmit Buffer was not set");
8513
        fail = fail + 1;
8514
      end
8515
      if ((data & (~`ETH_INT_TXB)) !== 0)
8516
      begin
8517
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8518
        test_fail("Other interrupts (except Transmit Buffer) were set");
8519
        fail = fail + 1;
8520
      end
8521 279 mohor
 
8522 209 tadejm
      // clear interrupts
8523 274 tadejm
      wait (wbm_working == 0);
8524 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8525
      // check WB INT signal
8526
      if (wb_int !== 1'b0)
8527
      begin
8528
        test_fail("WB INT signal should not be set");
8529
        fail = fail + 1;
8530
      end
8531 279 mohor
 
8532 209 tadejm
      // INTERMEDIATE DISPLAYS
8533
      if (num_of_bd == 0)
8534
        $display("    ->packet with length %0d sent", (i_length + 4));
8535
      else if (num_of_bd == 1)
8536
        $display("    ->packet with length %0d sent", (i_length + 4));
8537
      else if (num_of_bd == 2)
8538
        $display("    ->packet with length %0d sent", (i_length + 4));
8539 279 mohor
      else if (num_of_bd == 3)
8540
        $display("    ->packet with length %0d sent", (104));
8541 209 tadejm
      // set length (loop variable)
8542
      i_length = i_length + 1;
8543
      // the number of frame transmitted
8544
      num_of_frames = num_of_frames + 1;
8545
      num_of_bd = num_of_bd + 1;
8546
      @(posedge wb_clk);
8547
    end
8548
    // disable TX
8549 274 tadejm
    wait (wbm_working == 0);
8550 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8551
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8552
    @(posedge wb_clk);
8553
    if(fail == 0)
8554
      test_ok;
8555
    else
8556
      fail = 0;
8557
  end
8558
 
8559
 
8560 279 mohor
 
8561
 
8562 209 tadejm
  ////////////////////////////////////////////////////////////////////
8563
  ////                                                            ////
8564
  ////  Test transmit packets across changed MAXFL value at       ////
8565
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8566
  ////                                                            ////
8567
  ////////////////////////////////////////////////////////////////////
8568
  if (test_num == 12) // without and with padding
8569
  begin
8570
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8571
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8572
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8573
 
8574
    // reset MAC registers
8575
    hard_reset;
8576
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8577
 
8578
    max_tmp = 0;
8579
    min_tmp = 0;
8580
    num_of_frames = 0;
8581
    num_of_bd = 0;
8582 315 tadejm
    tx_bd_num = 0;
8583 209 tadejm
    // set 47 TX buffer descriptors - must be set before TX enable
8584 274 tadejm
    wait (wbm_working == 0);
8585 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8586
    // prepare a packet of MAXFL + 10 length
8587 274 tadejm
    wait (wbm_working == 0);
8588 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8589
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8590
    min_tmp = tmp[31:16];
8591
    // change MAXFL value
8592
    max_tmp = min_tmp + 53;
8593 274 tadejm
    wait (wbm_working == 0);
8594 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8595
    st_data = 8'h62;
8596
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8597 274 tadejm
    wait (wbm_working == 0);
8598 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8599
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8600
    // check WB INT signal
8601
    if (wb_int !== 1'b0)
8602
    begin
8603
      test_fail("WB INT signal should not be set");
8604
      fail = fail + 1;
8605
    end
8606
 
8607
    // write to phy's control register for 10Mbps
8608
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8609
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8610
    speed = 10;
8611
 
8612
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8613
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8614
    begin
8615 274 tadejm
      wait (wbm_working == 0);
8616 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8617
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8618
      // not detect carrier sense in FD and no collision
8619
      eth_phy.carrier_sense_tx_fd_detect(0);
8620
      eth_phy.collision(0);
8621
      // first destination address on ethernet PHY
8622
      eth_phy.set_tx_mem_addr(0);
8623
      // prepare BDs
8624
      if (num_of_bd == 0)
8625
      begin
8626 315 tadejm
        set_tx_bd(0, 0, i_length+4, 1'b1, 1'b1, 1'b0, `MEMORY_BASE); // no CRC adding
8627
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b0, 1'b1, `MEMORY_BASE); // no PADDING
8628 209 tadejm
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8629
        set_tx_bd_wrap(2);
8630
        set_tx_bd_ready(0, 0);
8631
      end
8632
      else if (num_of_bd == 1)
8633 315 tadejm
      begin
8634 209 tadejm
        set_tx_bd_ready(1, 1);
8635 315 tadejm
        tx_bd_num = 1;
8636
      end
8637 209 tadejm
      else if (num_of_bd == 2)
8638 315 tadejm
      begin
8639 209 tadejm
        set_tx_bd_ready(2, 2);
8640 315 tadejm
        tx_bd_num = 2;
8641
      end
8642 209 tadejm
      // CHECK END OF TRANSMITION
8643 315 tadejm
      check_tx_bd(tx_bd_num, data);
8644 209 tadejm
        wait (MTxEn === 1'b1); // start transmit
8645 315 tadejm
      check_tx_bd(tx_bd_num, data);
8646 209 tadejm
        if (data[15] !== 1)
8647
        begin
8648
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8649
          fail = fail + 1;
8650
        end
8651
        wait (MTxEn === 1'b0); // end transmit
8652
        while (data[15] === 1)
8653
        begin
8654 315 tadejm
      check_tx_bd(tx_bd_num, data);
8655 209 tadejm
          @(posedge wb_clk);
8656
        end
8657 279 mohor
        repeat (5) @(posedge mtx_clk);
8658 209 tadejm
      // check length of a PACKET
8659
      tmp_len = eth_phy.tx_len;
8660
      #1;
8661 315 tadejm
      if ((i_length + 4) <= max_tmp)
8662 209 tadejm
      begin
8663 315 tadejm
        if (tmp_len != (i_length + 4))
8664
        begin
8665
          test_fail("Wrong length of the packet out from MAC");
8666
          fail = fail + 1;
8667
        end
8668 209 tadejm
      end
8669 315 tadejm
      else
8670
      begin
8671
        if (tmp_len != (i_length + 4 - 1))
8672
        begin
8673
          test_fail("Wrong length of the packet out from MAC");
8674
          fail = fail + 1;
8675
        end
8676
      end
8677
 
8678 209 tadejm
      // checking packet
8679 315 tadejm
      if (num_of_bd === 0)
8680
        check_tx_packet(`MEMORY_BASE, 0, i_length + 4, tmp); // also data representing CRC
8681
      else
8682
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8683 209 tadejm
      if (tmp > 0)
8684
      begin
8685
        test_fail("Wrong data of the transmitted packet");
8686
        fail = fail + 1;
8687
      end
8688
      // check transmited TX packet CRC
8689 315 tadejm
      if (num_of_bd === 1)
8690 279 mohor
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8691 209 tadejm
      if (tmp > 0)
8692
      begin
8693
        test_fail("Wrong CRC of the transmitted packet");
8694
        fail = fail + 1;
8695
      end
8696
      // check WB INT signal
8697
      if (wb_int !== 1'b1)
8698
      begin
8699
        `TIME; $display("*E WB INT signal should be set");
8700
        test_fail("WB INT signal should be set");
8701
        fail = fail + 1;
8702
      end
8703
      // check TX buffer descriptor of a packet
8704 315 tadejm
      check_tx_bd(tx_bd_num, data);
8705 209 tadejm
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8706 315 tadejm
           ((data[15:0] !== 16'h4800) && (num_of_bd == 1)) || // without wrap bit and without pad bit
8707
           ((data[15:0] !== 16'h5000) && (num_of_bd == 0)) )   // without wrap bit and without crc bit
8708 209 tadejm
      begin
8709
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8710
        test_fail("TX buffer descriptor status is not correct");
8711
        fail = fail + 1;
8712
      end
8713
      // check interrupts
8714 274 tadejm
      wait (wbm_working == 0);
8715 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8716
      if ((data & `ETH_INT_TXB) !== 1'b1)
8717
      begin
8718
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8719
        test_fail("Interrupt Transmit Buffer was not set");
8720
        fail = fail + 1;
8721
      end
8722
      if ((data & (~`ETH_INT_TXB)) !== 0)
8723
      begin
8724
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8725
        test_fail("Other interrupts (except Transmit Buffer) were set");
8726
        fail = fail + 1;
8727
      end
8728
      // clear interrupts
8729 274 tadejm
      wait (wbm_working == 0);
8730 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8731
      // check WB INT signal
8732
      if (wb_int !== 1'b0)
8733
      begin
8734
        test_fail("WB INT signal should not be set");
8735
        fail = fail + 1;
8736
      end
8737
      // INTERMEDIATE DISPLAYS
8738
      if (num_of_bd == 0)
8739
        $display("    ->packet with length %0d sent", (i_length + 4));
8740
      else if (num_of_bd == 1)
8741
        $display("    ->packet with length %0d sent", (i_length + 4));
8742
      else if (num_of_bd == 2)
8743
        $display("    ->packet with length %0d sent", (i_length + 4));
8744
      // set length (loop variable)
8745
      i_length = i_length + 1;
8746
      // the number of frame transmitted
8747
      num_of_frames = num_of_frames + 1;
8748
      num_of_bd = num_of_bd + 1;
8749
      @(posedge wb_clk);
8750
    end
8751
    // disable TX
8752 274 tadejm
    wait (wbm_working == 0);
8753 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8754
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8755
    @(posedge wb_clk);
8756
    if(fail == 0)
8757
      test_ok;
8758
    else
8759
      fail = 0;
8760
  end
8761
 
8762
 
8763
  ////////////////////////////////////////////////////////////////////
8764
  ////                                                            ////
8765
  ////  Test transmit packets across changed MAXFL value at       ////
8766
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8767
  ////                                                            ////
8768
  ////////////////////////////////////////////////////////////////////
8769
  if (test_num == 13) // without and with padding
8770
  begin
8771
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8772
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8773
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8774
 
8775
    // reset MAC registers
8776
    hard_reset;
8777
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8778
 
8779
    max_tmp = 0;
8780
    min_tmp = 0;
8781
    num_of_frames = 0;
8782
    num_of_bd = 0;
8783 315 tadejm
    tx_bd_num = 0;
8784 209 tadejm
    // set 47 TX buffer descriptors - must be set before TX enable
8785 274 tadejm
    wait (wbm_working == 0);
8786 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8787
    // prepare a packet of MAXFL + 10 length
8788 274 tadejm
    wait (wbm_working == 0);
8789 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8790
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8791
    min_tmp = tmp[31:16];
8792
    // change MAXFL value
8793
    max_tmp = min_tmp + 53;
8794 274 tadejm
    wait (wbm_working == 0);
8795 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8796
    st_data = 8'h62;
8797
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8798 274 tadejm
    wait (wbm_working == 0);
8799 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8800
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8801
    // check WB INT signal
8802
    if (wb_int !== 1'b0)
8803
    begin
8804
      test_fail("WB INT signal should not be set");
8805
      fail = fail + 1;
8806
    end
8807
 
8808 279 mohor
    // write to phy's control register for 10Mbps
8809
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8810
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8811 209 tadejm
    speed = 100;
8812
 
8813
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8814
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8815
    begin
8816 274 tadejm
      wait (wbm_working == 0);
8817 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8818
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8819
      // not detect carrier sense in FD and no collision
8820
      eth_phy.carrier_sense_tx_fd_detect(0);
8821
      eth_phy.collision(0);
8822
      // first destination address on ethernet PHY
8823
      eth_phy.set_tx_mem_addr(0);
8824
      // prepare BDs
8825
      if (num_of_bd == 0)
8826
      begin
8827 315 tadejm
        set_tx_bd(0, 0, i_length+4, 1'b1, 1'b1, 1'b0, `MEMORY_BASE); // no CRC adding
8828
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b0, 1'b1, `MEMORY_BASE); // no PADDING
8829 209 tadejm
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8830
        set_tx_bd_wrap(2);
8831
        set_tx_bd_ready(0, 0);
8832
      end
8833
      else if (num_of_bd == 1)
8834 315 tadejm
      begin
8835 209 tadejm
        set_tx_bd_ready(1, 1);
8836 315 tadejm
        tx_bd_num = 1;
8837
      end
8838 209 tadejm
      else if (num_of_bd == 2)
8839 315 tadejm
      begin
8840 209 tadejm
        set_tx_bd_ready(2, 2);
8841 315 tadejm
        tx_bd_num = 2;
8842
      end
8843 209 tadejm
      // CHECK END OF TRANSMITION
8844 315 tadejm
      check_tx_bd(tx_bd_num, data);
8845 209 tadejm
        wait (MTxEn === 1'b1); // start transmit
8846 315 tadejm
      check_tx_bd(tx_bd_num, data);
8847 209 tadejm
        if (data[15] !== 1)
8848
        begin
8849
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8850
          fail = fail + 1;
8851
        end
8852
        wait (MTxEn === 1'b0); // end transmit
8853
        while (data[15] === 1)
8854
        begin
8855 315 tadejm
      check_tx_bd(tx_bd_num, data);
8856 209 tadejm
          @(posedge wb_clk);
8857
        end
8858 279 mohor
        repeat (5) @(posedge mtx_clk);
8859 209 tadejm
      // check length of a PACKET
8860
      tmp_len = eth_phy.tx_len;
8861
      #1;
8862 315 tadejm
      if ((i_length + 4) <= max_tmp)
8863 209 tadejm
      begin
8864 315 tadejm
        if (tmp_len != (i_length + 4))
8865
        begin
8866
          test_fail("Wrong length of the packet out from MAC");
8867
          fail = fail + 1;
8868
        end
8869 209 tadejm
      end
8870 315 tadejm
      else
8871
      begin
8872
        if (tmp_len != (i_length + 4 - 1))
8873
        begin
8874
          test_fail("Wrong length of the packet out from MAC");
8875
          fail = fail + 1;
8876
        end
8877
      end
8878
 
8879 209 tadejm
      // checking packet
8880 315 tadejm
      if (num_of_bd === 0)
8881
        check_tx_packet(`MEMORY_BASE, 0, i_length + 4, tmp); // also data representing CRC
8882
      else
8883
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8884 209 tadejm
      if (tmp > 0)
8885
      begin
8886
        test_fail("Wrong data of the transmitted packet");
8887
        fail = fail + 1;
8888
      end
8889
      // check transmited TX packet CRC
8890 315 tadejm
      if (num_of_bd === 1)
8891 279 mohor
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8892 209 tadejm
      if (tmp > 0)
8893
      begin
8894
        test_fail("Wrong CRC of the transmitted packet");
8895
        fail = fail + 1;
8896
      end
8897
      // check WB INT signal
8898
      if (wb_int !== 1'b1)
8899
      begin
8900
        `TIME; $display("*E WB INT signal should be set");
8901
        test_fail("WB INT signal should be set");
8902
        fail = fail + 1;
8903
      end
8904
      // check TX buffer descriptor of a packet
8905 315 tadejm
      check_tx_bd(tx_bd_num, data);
8906 209 tadejm
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8907 315 tadejm
           ((data[15:0] !== 16'h4800) && (num_of_bd == 1)) || // without wrap bit and without pad bit
8908
           ((data[15:0] !== 16'h5000) && (num_of_bd == 0)) )   // without wrap bit and without crc bit
8909 209 tadejm
      begin
8910
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8911
        test_fail("TX buffer descriptor status is not correct");
8912
        fail = fail + 1;
8913
      end
8914
      // check interrupts
8915 274 tadejm
      wait (wbm_working == 0);
8916 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8917
      if ((data & `ETH_INT_TXB) !== 1'b1)
8918
      begin
8919
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8920
        test_fail("Interrupt Transmit Buffer was not set");
8921
        fail = fail + 1;
8922
      end
8923
      if ((data & (~`ETH_INT_TXB)) !== 0)
8924
      begin
8925
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8926
        test_fail("Other interrupts (except Transmit Buffer) were set");
8927
        fail = fail + 1;
8928
      end
8929
      // clear interrupts
8930 274 tadejm
      wait (wbm_working == 0);
8931 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8932
      // check WB INT signal
8933
      if (wb_int !== 1'b0)
8934
      begin
8935
        test_fail("WB INT signal should not be set");
8936
        fail = fail + 1;
8937
      end
8938
      // INTERMEDIATE DISPLAYS
8939
      if (num_of_bd == 0)
8940
        $display("    ->packet with length %0d sent", (i_length + 4));
8941
      else if (num_of_bd == 1)
8942
        $display("    ->packet with length %0d sent", (i_length + 4));
8943
      else if (num_of_bd == 2)
8944
        $display("    ->packet with length %0d sent", (i_length + 4));
8945
      // set length (loop variable)
8946
      i_length = i_length + 1;
8947
      // the number of frame transmitted
8948
      num_of_frames = num_of_frames + 1;
8949
      num_of_bd = num_of_bd + 1;
8950
      @(posedge wb_clk);
8951
    end
8952
    // disable TX
8953 274 tadejm
    wait (wbm_working == 0);
8954 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8955
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8956
    @(posedge wb_clk);
8957
    if(fail == 0)
8958
      test_ok;
8959
    else
8960
      fail = 0;
8961
  end
8962
 
8963
 
8964
  ////////////////////////////////////////////////////////////////////
8965
  ////                                                            ////
8966
  ////  Test transmit packets across changed MINFL value at       ////
8967
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8968
  ////                                                            ////
8969
  ////////////////////////////////////////////////////////////////////
8970
  if (test_num == 14) // without and with padding
8971
  begin
8972
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8973
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8974
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8975
 
8976
    // reset MAC registers
8977
    hard_reset;
8978 279 mohor
 
8979 209 tadejm
    // set wb slave response
8980
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8981
 
8982
    max_tmp = 0;
8983
    min_tmp = 0;
8984
    num_of_frames = 0;
8985
    num_of_bd = 0;
8986
    // set 7 TX buffer descriptors - must be set before TX enable
8987 274 tadejm
    wait (wbm_working == 0);
8988 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8989
    // prepare a packet of MAXFL + 10 length
8990 274 tadejm
    wait (wbm_working == 0);
8991 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8992
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8993
    min_tmp = tmp[31:16];
8994 279 mohor
 
8995 209 tadejm
    // change MINFL value
8996
    min_tmp = max_tmp - 177;
8997 274 tadejm
    wait (wbm_working == 0);
8998 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8999
    st_data = 8'h62;
9000
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
9001
    // enable TX, set full-duplex mode, padding and CRC appending
9002 274 tadejm
    wait (wbm_working == 0);
9003 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9004
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9005
    // check WB INT signal
9006
    if (wb_int !== 1'b0)
9007
    begin
9008
      test_fail("WB INT signal should not be set");
9009
      fail = fail + 1;
9010
    end
9011
 
9012
    // write to phy's control register for 10Mbps
9013
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9014
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9015
    speed = 10;
9016
 
9017
    i_length = (min_tmp - 5);
9018
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
9019
    begin
9020
      // Reset_tx_bd nable interrupt generation
9021
      // unmask interrupts
9022 274 tadejm
      wait (wbm_working == 0);
9023 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9024
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9025
      // not detect carrier sense in FD and no collision
9026
      eth_phy.carrier_sense_tx_fd_detect(0);
9027
      eth_phy.collision(0);
9028
      // first destination address on ethernet PHY
9029
      eth_phy.set_tx_mem_addr(0);
9030
      // prepare BDs
9031
      if (num_of_bd == 0)
9032
      begin
9033
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9034
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9035
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9036
        set_tx_bd_wrap(2);
9037
        set_tx_bd_ready(0, 0);
9038
      end
9039
      else if (num_of_bd == 1)
9040
        set_tx_bd_ready(1, 1);
9041
      else if (num_of_bd == 2)
9042
        set_tx_bd_ready(2, 2);
9043
      // CHECK END OF TRANSMITION
9044
      check_tx_bd(num_of_bd, data);
9045
        wait (MTxEn === 1'b1); // start transmit
9046
      check_tx_bd(num_of_bd, data);
9047
        if (data[15] !== 1)
9048
        begin
9049
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9050
          fail = fail + 1;
9051
        end
9052
        wait (MTxEn === 1'b0); // end transmit
9053
        while (data[15] === 1)
9054
        begin
9055
      check_tx_bd(num_of_bd, data);
9056
          @(posedge wb_clk);
9057
        end
9058
        repeat (1) @(posedge wb_clk);
9059
      // check length of a PACKET
9060
      tmp_len = eth_phy.tx_len;
9061
      #1;
9062 315 tadejm
      if ((i_length + 4) >= min_tmp)
9063 209 tadejm
      begin
9064 315 tadejm
        if (tmp_len != (i_length + 4))
9065
        begin
9066
          test_fail("Wrong length of the packet out from MAC");
9067
          fail = fail + 1;
9068
        end
9069 209 tadejm
      end
9070 315 tadejm
      else
9071
      begin
9072
        if (tmp_len != (i_length + 4 + 1))
9073
        begin
9074
          test_fail("Wrong length of the packet out from MAC");
9075
          fail = fail + 1;
9076
        end
9077
      end
9078 209 tadejm
      // checking packet
9079
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9080
      if (tmp > 0)
9081
      begin
9082
        test_fail("Wrong data of the transmitted packet");
9083
        fail = fail + 1;
9084
      end
9085
      // check transmited TX packet CRC
9086 279 mohor
      if (num_of_bd !== 0)  // First packet is padded and CRC does not match.
9087
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9088
      else
9089
        tmp = 0;
9090 209 tadejm
      if (tmp > 0)
9091
      begin
9092
        test_fail("Wrong CRC of the transmitted packet");
9093
        fail = fail + 1;
9094
      end
9095
      // check WB INT signal
9096
      if (wb_int !== 1'b1)
9097
      begin
9098
        `TIME; $display("*E WB INT signal should be set");
9099
        test_fail("WB INT signal should be set");
9100
        fail = fail + 1;
9101
      end
9102
      // check TX buffer descriptor of a packet
9103
      check_tx_bd(num_of_bd, data);
9104
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
9105
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
9106
      begin
9107
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9108
        test_fail("TX buffer descriptor status is not correct");
9109
        fail = fail + 1;
9110
      end
9111
      // check interrupts
9112 274 tadejm
      wait (wbm_working == 0);
9113 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9114
      if ((data & `ETH_INT_TXB) !== 1'b1)
9115
      begin
9116
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9117
        test_fail("Interrupt Transmit Buffer was not set");
9118
        fail = fail + 1;
9119
      end
9120
      if ((data & (~`ETH_INT_TXB)) !== 0)
9121
      begin
9122
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9123
        test_fail("Other interrupts (except Transmit Buffer) were set");
9124
        fail = fail + 1;
9125
      end
9126
      // clear interrupts
9127 274 tadejm
      wait (wbm_working == 0);
9128 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9129
      // check WB INT signal
9130
      if (wb_int !== 1'b0)
9131
      begin
9132
        test_fail("WB INT signal should not be set");
9133
        fail = fail + 1;
9134
      end
9135
      // INTERMEDIATE DISPLAYS
9136
      if (num_of_bd == 0)
9137
        $display("    ->packet with length %0d sent", (i_length + 4));
9138
      else if (num_of_bd == 1)
9139
        $display("    ->packet with length %0d sent", (i_length + 4));
9140
      else if (num_of_bd == 2)
9141
        $display("    ->packet with length %0d sent", (i_length + 4));
9142
      // set length (loop variable)
9143
      i_length = i_length + 1;
9144
      // the number of frame transmitted
9145
      num_of_frames = num_of_frames + 1;
9146
      num_of_bd = num_of_bd + 1;
9147
      @(posedge wb_clk);
9148
    end
9149
    // disable TX
9150 274 tadejm
    wait (wbm_working == 0);
9151 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9152
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9153
    @(posedge wb_clk);
9154
    if(fail == 0)
9155
      test_ok;
9156
    else
9157
      fail = 0;
9158
  end
9159
 
9160
 
9161
  ////////////////////////////////////////////////////////////////////
9162
  ////                                                            ////
9163
  ////  Test transmit packets across changed MINFL value at       ////
9164
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
9165
  ////                                                            ////
9166
  ////////////////////////////////////////////////////////////////////
9167
  if (test_num == 15) // without and with padding
9168
  begin
9169
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
9170
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
9171
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
9172
 
9173
    hard_reset;
9174 279 mohor
 
9175 209 tadejm
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9176
 
9177
    max_tmp = 0;
9178
    min_tmp = 0;
9179
    num_of_frames = 0;
9180
    num_of_bd = 0;
9181
    // set 7 TX buffer descriptors - must be set before TX enable
9182 274 tadejm
    wait (wbm_working == 0);
9183 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9184
    // prepare a packet of MAXFL + 10 length
9185 274 tadejm
    wait (wbm_working == 0);
9186 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9187
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9188
    min_tmp = tmp[31:16];
9189
    // change MINFL value
9190
    min_tmp = max_tmp - 177;
9191 274 tadejm
    wait (wbm_working == 0);
9192 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9193
    st_data = 8'h62;
9194
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
9195
    // enable TX, set full-duplex mode, padding and CRC appending
9196 274 tadejm
    wait (wbm_working == 0);
9197 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9198
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9199
    // check WB INT signal
9200
    if (wb_int !== 1'b0)
9201
    begin
9202
      test_fail("WB INT signal should not be set");
9203
      fail = fail + 1;
9204
    end
9205
 
9206
    // write to phy's control register for 100Mbps
9207
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9208
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9209
    speed = 100;
9210
 
9211
    i_length = (min_tmp - 5);
9212
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
9213
    begin
9214
      // Reset_tx_bd nable interrupt generation
9215
      // unmask interrupts
9216 274 tadejm
      wait (wbm_working == 0);
9217 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9218
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9219
      // not detect carrier sense in FD and no collision
9220
      eth_phy.carrier_sense_tx_fd_detect(0);
9221
      eth_phy.collision(0);
9222
      // first destination address on ethernet PHY
9223
      eth_phy.set_tx_mem_addr(0);
9224
      // prepare BDs
9225
      if (num_of_bd == 0)
9226
      begin
9227
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9228
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9229
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9230
        set_tx_bd_wrap(2);
9231
        set_tx_bd_ready(0, 0);
9232
      end
9233
      else if (num_of_bd == 1)
9234
        set_tx_bd_ready(1, 1);
9235
      else if (num_of_bd == 2)
9236
        set_tx_bd_ready(2, 2);
9237
      // CHECK END OF TRANSMITION
9238
      check_tx_bd(num_of_bd, data);
9239
        wait (MTxEn === 1'b1); // start transmit
9240
      check_tx_bd(num_of_bd, data);
9241
        if (data[15] !== 1)
9242
        begin
9243
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9244
          fail = fail + 1;
9245
        end
9246
        wait (MTxEn === 1'b0); // end transmit
9247
        while (data[15] === 1)
9248
        begin
9249
      check_tx_bd(num_of_bd, data);
9250
          @(posedge wb_clk);
9251
        end
9252
        repeat (1) @(posedge wb_clk);
9253
      // check length of a PACKET
9254
      tmp_len = eth_phy.tx_len;
9255
      #1;
9256 315 tadejm
      if ((i_length + 4) >= min_tmp)
9257 209 tadejm
      begin
9258 315 tadejm
        if (tmp_len != (i_length + 4))
9259
        begin
9260
          test_fail("Wrong length of the packet out from MAC");
9261
          fail = fail + 1;
9262
        end
9263 209 tadejm
      end
9264 315 tadejm
      else
9265
      begin
9266
        if (tmp_len != (i_length + 4 + 1))
9267
        begin
9268
          test_fail("Wrong length of the packet out from MAC");
9269
          fail = fail + 1;
9270
        end
9271
      end
9272 209 tadejm
      // checking packet
9273
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9274
      if (tmp > 0)
9275
      begin
9276
        test_fail("Wrong data of the transmitted packet");
9277
        fail = fail + 1;
9278
      end
9279
      // check transmited TX packet CRC
9280 279 mohor
      if (num_of_bd !== 0)
9281
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9282
      else
9283
        tmp = 0;
9284
 
9285 209 tadejm
      if (tmp > 0)
9286
      begin
9287
        test_fail("Wrong CRC of the transmitted packet");
9288
        fail = fail + 1;
9289
      end
9290
      // check WB INT signal
9291
      if (wb_int !== 1'b1)
9292
      begin
9293
        `TIME; $display("*E WB INT signal should be set");
9294
        test_fail("WB INT signal should be set");
9295
        fail = fail + 1;
9296
      end
9297
      // check TX buffer descriptor of a packet
9298
      check_tx_bd(num_of_bd, data);
9299
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
9300
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
9301
      begin
9302
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9303
        test_fail("TX buffer descriptor status is not correct");
9304
        fail = fail + 1;
9305
      end
9306
      // check interrupts
9307 274 tadejm
      wait (wbm_working == 0);
9308 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9309
      if ((data & `ETH_INT_TXB) !== 1'b1)
9310
      begin
9311
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9312
        test_fail("Interrupt Transmit Buffer was not set");
9313
        fail = fail + 1;
9314
      end
9315
      if ((data & (~`ETH_INT_TXB)) !== 0)
9316
      begin
9317
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9318
        test_fail("Other interrupts (except Transmit Buffer) were set");
9319
        fail = fail + 1;
9320
      end
9321
      // clear interrupts
9322 274 tadejm
      wait (wbm_working == 0);
9323 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9324
      // check WB INT signal
9325
      if (wb_int !== 1'b0)
9326
      begin
9327
        test_fail("WB INT signal should not be set");
9328
        fail = fail + 1;
9329
      end
9330
      // INTERMEDIATE DISPLAYS
9331
      if (num_of_bd == 0)
9332
        $display("    ->packet with length %0d sent", (i_length + 4));
9333
      else if (num_of_bd == 1)
9334
        $display("    ->packet with length %0d sent", (i_length + 4));
9335
      else if (num_of_bd == 2)
9336
        $display("    ->packet with length %0d sent", (i_length + 4));
9337
      // set length (loop variable)
9338
      i_length = i_length + 1;
9339
      // the number of frame transmitted
9340
      num_of_frames = num_of_frames + 1;
9341
      num_of_bd = num_of_bd + 1;
9342
      @(posedge wb_clk);
9343
    end
9344
    // disable TX
9345 274 tadejm
    wait (wbm_working == 0);
9346 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9347
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9348
    @(posedge wb_clk);
9349
    if(fail == 0)
9350
      test_ok;
9351
    else
9352
      fail = 0;
9353
  end
9354
 
9355
 
9356
  ////////////////////////////////////////////////////////////////////
9357
  ////                                                            ////
9358
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9359
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
9360
  ////                                                            ////
9361
  ////////////////////////////////////////////////////////////////////
9362
  if (test_num == 16) // without and with padding
9363
  begin
9364
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
9365
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
9366
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
9367
 
9368
    // reset MAC registers
9369
    hard_reset;
9370
    // reset MAC and MII LOGIC with soft reset
9371 274 tadejm
//    reset_mac;
9372
//    reset_mii;
9373 209 tadejm
    // set wb slave response
9374
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9375
 
9376
    max_tmp = 0;
9377
    min_tmp = 0;
9378
    num_of_frames = 0;
9379
    num_of_bd = 0;
9380
    // set 19 TX buffer descriptors - must be set before TX enable
9381 274 tadejm
    wait (wbm_working == 0);
9382 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9383
    // prepare a packet of 64k - 1 length (16'hFFFF)
9384 274 tadejm
    wait (wbm_working == 0);
9385 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9386
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9387
    min_tmp = tmp[31:16];
9388
    st_data = 8'h8D;
9389
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9390
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9391 274 tadejm
    wait (wbm_working == 0);
9392 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9393
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9394
    // check WB INT signal
9395
    if (wb_int !== 1'b0)
9396
    begin
9397
      test_fail("WB INT signal should not be set");
9398
      fail = fail + 1;
9399
    end
9400
 
9401
    // write to phy's control register for 10Mbps
9402
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9403
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9404
    speed = 10;
9405
 
9406
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9407
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9408
    begin
9409
      $display("   i_length = %0d", i_length);
9410
      // Reset_tx_bd nable interrupt generation
9411
      // unmask interrupts
9412 274 tadejm
      wait (wbm_working == 0);
9413 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9414
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9415
      // not detect carrier sense in FD and no collision
9416
      eth_phy.carrier_sense_tx_fd_detect(0);
9417
      eth_phy.collision(0);
9418
      // first destination address on ethernet PHY
9419
      eth_phy.set_tx_mem_addr(0);
9420
      // prepare BDs
9421
      if (num_of_bd == 0)
9422
      begin
9423
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9424
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9425
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9426
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9427
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9428
        set_tx_bd_wrap(4);
9429
        set_tx_bd_ready(0, 0);
9430
      end
9431
      else if (num_of_bd == 1)
9432
        set_tx_bd_ready(1, 1);
9433
      else if (num_of_bd == 2)
9434
        set_tx_bd_ready(2, 2);
9435
      else if (num_of_bd == 3)
9436
        set_tx_bd_ready(3, 3);
9437
      else if (num_of_bd == 4)
9438
        set_tx_bd_ready(4, 4);
9439
      // CHECK END OF TRANSMITION
9440
      check_tx_bd(num_of_bd, data);
9441
        wait (MTxEn === 1'b1); // start transmit
9442
      check_tx_bd(num_of_bd, data);
9443
        if (data[15] !== 1)
9444
        begin
9445
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9446
          fail = fail + 1;
9447
        end
9448
        wait (MTxEn === 1'b0); // end transmit
9449
        while (data[15] === 1)
9450
        begin
9451
      check_tx_bd(num_of_bd, data);
9452
          @(posedge wb_clk);
9453
        end
9454
        repeat (1) @(posedge wb_clk);
9455
      // check length of a PACKET
9456
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9457
      tmp_len = eth_phy.tx_len;
9458
      #1;
9459
      if (tmp_len != (i_length + 4))
9460
      begin
9461
        test_fail("Wrong length of the packet out from MAC");
9462
        fail = fail + 1;
9463
      end
9464
      // checking packet
9465
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9466
      if (tmp > 0)
9467
      begin
9468
        test_fail("Wrong data of the transmitted packet");
9469
        fail = fail + 1;
9470
      end
9471
      // check transmited TX packet CRC
9472
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9473
      if (tmp > 0)
9474
      begin
9475
        test_fail("Wrong CRC of the transmitted packet");
9476
        fail = fail + 1;
9477
      end
9478
      // check WB INT signal
9479
      if (wb_int !== 1'b1)
9480
      begin
9481
        `TIME; $display("*E WB INT signal should be set");
9482
        test_fail("WB INT signal should be set");
9483
        fail = fail + 1;
9484
      end
9485
      // check TX buffer descriptor of a packet
9486
      check_tx_bd(num_of_bd, data);
9487
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9488
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9489
      begin
9490
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9491
        test_fail("TX buffer descriptor status is not correct");
9492
        fail = fail + 1;
9493
      end
9494
      // check interrupts
9495 274 tadejm
      wait (wbm_working == 0);
9496 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9497
      if ((data & `ETH_INT_TXB) !== 1'b1)
9498
      begin
9499
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9500
        test_fail("Interrupt Transmit Buffer was not set");
9501
        fail = fail + 1;
9502
      end
9503
      if ((data & (~`ETH_INT_TXB)) !== 0)
9504
      begin
9505
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9506
        test_fail("Other interrupts (except Transmit Buffer) were set");
9507
        fail = fail + 1;
9508
      end
9509
      // clear interrupts
9510 274 tadejm
      wait (wbm_working == 0);
9511 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9512
      // check WB INT signal
9513
      if (wb_int !== 1'b0)
9514
      begin
9515
        test_fail("WB INT signal should not be set");
9516
        fail = fail + 1;
9517
      end
9518
      // INTERMEDIATE DISPLAYS
9519
      $display("    ->packet with length %0d sent", (i_length + 4));
9520
      // set length (loop variable)
9521
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9522
        i_length = i_length + 1;
9523
      else if (num_of_bd == 2)
9524
        i_length = (16'hFFFF - 5);
9525
      // the number of frame transmitted
9526
      num_of_frames = num_of_frames + 1;
9527
      num_of_bd = num_of_bd + 1;
9528
      @(posedge wb_clk);
9529
    end
9530
    // disable TX
9531 274 tadejm
    wait (wbm_working == 0);
9532 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9533
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9534
    @(posedge wb_clk);
9535
    if(fail == 0)
9536
      test_ok;
9537
    else
9538
      fail = 0;
9539
  end
9540
 
9541
 
9542
  ////////////////////////////////////////////////////////////////////
9543
  ////                                                            ////
9544
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9545
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9546
  ////                                                            ////
9547
  ////////////////////////////////////////////////////////////////////
9548
  if (test_num == 17) // without and with padding
9549
  begin
9550
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9551
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9552
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9553
 
9554
    // reset MAC registers
9555
    hard_reset;
9556
    // reset MAC and MII LOGIC with soft reset
9557 274 tadejm
//    reset_mac;
9558
//    reset_mii;
9559 209 tadejm
    // set wb slave response
9560
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9561
 
9562
    max_tmp = 0;
9563
    min_tmp = 0;
9564
    num_of_frames = 0;
9565
    num_of_bd = 0;
9566
    // set 19 TX buffer descriptors - must be set before TX enable
9567 274 tadejm
    wait (wbm_working == 0);
9568 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9569
    // prepare a packet of 64k - 1 length (16'hFFFF)
9570 274 tadejm
    wait (wbm_working == 0);
9571 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9572
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9573
    min_tmp = tmp[31:16];
9574
    st_data = 8'h8D;
9575
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9576
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9577 274 tadejm
    wait (wbm_working == 0);
9578 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9579
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9580
    // check WB INT signal
9581
    if (wb_int !== 1'b0)
9582
    begin
9583
      test_fail("WB INT signal should not be set");
9584
      fail = fail + 1;
9585
    end
9586
 
9587
    // write to phy's control register for 100Mbps
9588
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9589
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9590
    speed = 100;
9591
 
9592
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9593
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9594
    begin
9595
      $display("   i_length = %0d", i_length);
9596
      // Reset_tx_bd nable interrupt generation
9597
      // unmask interrupts
9598 274 tadejm
      wait (wbm_working == 0);
9599 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9600
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9601
      // not detect carrier sense in FD and no collision
9602
      eth_phy.carrier_sense_tx_fd_detect(0);
9603
      eth_phy.collision(0);
9604
      // first destination address on ethernet PHY
9605
      eth_phy.set_tx_mem_addr(0);
9606
      // prepare BDs
9607
      if (num_of_bd == 0)
9608
      begin
9609
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9610
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9611
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9612
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9613
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9614
        set_tx_bd_wrap(4);
9615
        set_tx_bd_ready(0, 0);
9616
      end
9617
      else if (num_of_bd == 1)
9618
        set_tx_bd_ready(1, 1);
9619
      else if (num_of_bd == 2)
9620
        set_tx_bd_ready(2, 2);
9621
      else if (num_of_bd == 3)
9622
        set_tx_bd_ready(3, 3);
9623
      else if (num_of_bd == 4)
9624
        set_tx_bd_ready(4, 4);
9625
      // CHECK END OF TRANSMITION
9626
      check_tx_bd(num_of_bd, data);
9627
        wait (MTxEn === 1'b1); // start transmit
9628
      check_tx_bd(num_of_bd, data);
9629
        if (data[15] !== 1)
9630
        begin
9631
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9632
          fail = fail + 1;
9633
        end
9634
        wait (MTxEn === 1'b0); // end transmit
9635
        while (data[15] === 1)
9636
        begin
9637
      check_tx_bd(num_of_bd, data);
9638
          @(posedge wb_clk);
9639
        end
9640
        repeat (1) @(posedge wb_clk);
9641
      // check length of a PACKET
9642
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9643
      tmp_len = eth_phy.tx_len;
9644
      #1;
9645
      if (tmp_len != (i_length + 4))
9646
      begin
9647
        test_fail("Wrong length of the packet out from MAC");
9648
        fail = fail + 1;
9649
      end
9650
      // checking packet
9651
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9652
      if (tmp > 0)
9653
      begin
9654
        test_fail("Wrong data of the transmitted packet");
9655
        fail = fail + 1;
9656
      end
9657
      // check transmited TX packet CRC
9658
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9659
      if (tmp > 0)
9660
      begin
9661
        test_fail("Wrong CRC of the transmitted packet");
9662
        fail = fail + 1;
9663
      end
9664
      // check WB INT signal
9665
      if (wb_int !== 1'b1)
9666
      begin
9667
        `TIME; $display("*E WB INT signal should be set");
9668
        test_fail("WB INT signal should be set");
9669
        fail = fail + 1;
9670
      end
9671
      // check TX buffer descriptor of a packet
9672
      check_tx_bd(num_of_bd, data);
9673
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9674
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9675
      begin
9676
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9677
        test_fail("TX buffer descriptor status is not correct");
9678
        fail = fail + 1;
9679
      end
9680
      // check interrupts
9681 274 tadejm
      wait (wbm_working == 0);
9682 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9683
      if ((data & `ETH_INT_TXB) !== 1'b1)
9684
      begin
9685
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9686
        test_fail("Interrupt Transmit Buffer was not set");
9687
        fail = fail + 1;
9688
      end
9689
      if ((data & (~`ETH_INT_TXB)) !== 0)
9690
      begin
9691
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9692
        test_fail("Other interrupts (except Transmit Buffer) were set");
9693
        fail = fail + 1;
9694
      end
9695
      // clear interrupts
9696 274 tadejm
      wait (wbm_working == 0);
9697 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9698
      // check WB INT signal
9699
      if (wb_int !== 1'b0)
9700
      begin
9701
        test_fail("WB INT signal should not be set");
9702
        fail = fail + 1;
9703
      end
9704
      // INTERMEDIATE DISPLAYS
9705
      $display("    ->packet with length %0d sent", (i_length + 4));
9706
      // set length (loop variable)
9707
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9708
        i_length = i_length + 1;
9709
      else if (num_of_bd == 2)
9710
        i_length = (16'hFFFF - 5);
9711
      // the number of frame transmitted
9712
      num_of_frames = num_of_frames + 1;
9713
      num_of_bd = num_of_bd + 1;
9714
      @(posedge wb_clk);
9715
    end
9716
    // disable TX
9717 274 tadejm
    wait (wbm_working == 0);
9718 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9719
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9720
    @(posedge wb_clk);
9721
    if(fail == 0)
9722
      test_ok;
9723
    else
9724
      fail = 0;
9725
  end
9726
 
9727
 
9728
  ////////////////////////////////////////////////////////////////////
9729
  ////                                                            ////
9730
  ////  Test IPG during Back-to-Back transmit at                  ////
9731
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9732
  ////                                                            ////
9733
  ////////////////////////////////////////////////////////////////////
9734
  if (test_num == 18) // without and with padding
9735
  begin
9736
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9737
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9738
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9739
 
9740
    // reset MAC registers
9741
    hard_reset;
9742
    // reset MAC and MII LOGIC with soft reset
9743 274 tadejm
//    reset_mac;
9744
//    reset_mii;
9745 209 tadejm
    // set wb slave response
9746
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9747
 
9748
    max_tmp = 0;
9749
    min_tmp = 0;
9750
    num_of_frames = 0;
9751
    num_of_bd = 0;
9752
    tmp_ipgt = 0;
9753
    // set 88 TX buffer descriptors - must be set before TX enable
9754 274 tadejm
    wait (wbm_working == 0);
9755 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9756
    // enable TX, set full-duplex mode, NO padding and CRC appending
9757 274 tadejm
    wait (wbm_working == 0);
9758 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9759
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9760
    // prepare two packets of MAXFL length
9761 274 tadejm
    wait (wbm_working == 0);
9762 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9763
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9764
    min_tmp = tmp[31:16];
9765
    st_data = 8'h29;
9766
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9767
    // check WB INT signal
9768
    if (wb_int !== 1'b0)
9769
    begin
9770
      test_fail("WB INT signal should not be set");
9771
      fail = fail + 1;
9772
    end
9773
 
9774
    // write to phy's control register for 10Mbps
9775
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9776
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9777
    speed = 10;
9778
 
9779
    i_length = (min_tmp - 4);
9780
    while (i_length < (max_tmp - 4))
9781
    begin
9782
      // disable TX, set full-duplex mode, NO padding and CRC appending
9783 274 tadejm
      wait (wbm_working == 0);
9784 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9785
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9786
      // set IPGT register
9787 274 tadejm
      wait (wbm_working == 0);
9788 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9789
      // enable TX, set full-duplex mode, NO padding and CRC appending
9790 274 tadejm
      wait (wbm_working == 0);
9791 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9792
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9793
      // Reset_tx_bd enable interrupt generation
9794
      // unmask interrupts
9795 274 tadejm
      wait (wbm_working == 0);
9796 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9797
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9798
      // not detect carrier sense in FD and no collision
9799
      eth_phy.carrier_sense_tx_fd_detect(0);
9800
      eth_phy.collision(0);
9801
      // first destination address on ethernet PHY
9802
      eth_phy.set_tx_mem_addr(0);
9803
      // prepare BDs
9804
      if (num_of_bd == 0)
9805
      begin
9806
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9807
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9808
        set_tx_bd_wrap(1);
9809
        set_tx_bd_ready(0, 0);
9810
        set_tx_bd_ready(1, 1);
9811
      end
9812
      // CHECK END OF TWO TRANSMITIONs
9813
      // wait for first transmit to end
9814
      check_tx_bd(num_of_bd, data);
9815
      wait (MTxEn === 1'b1); // start transmit
9816
      if (data[15] !== 1)
9817
      begin
9818
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9819
        fail = fail + 1;
9820
      end
9821
      wait (MTxEn === 1'b0); // end transmit
9822
      num_of_frames = num_of_frames + 1;
9823
      num_of_bd = num_of_bd + 1;
9824
      #Tp;
9825
      // destination address on ethernet PHY
9826
      eth_phy.set_tx_mem_addr(0);
9827
      i1 = 0;
9828
      i2 = 0;
9829
      // count IPG clock periods
9830
      fork
9831
        begin
9832
          wait (MTxEn === 1'b1); // start second transmit
9833
          #Tp;
9834
          disable count_rising;
9835
          disable count_falling;
9836
        end
9837
        begin: count_rising
9838
          forever
9839
          begin
9840
            @(posedge mtx_clk);
9841
            i1 = i1 + 1;
9842
            #Tp;
9843
          end
9844
        end
9845
        begin: count_falling
9846
          forever
9847
          begin
9848
            @(negedge mtx_clk);
9849
            i2 = i2 + 1;
9850
            #Tp;
9851
          end
9852
        end
9853
      join
9854
      // check IPG length - INTERMEDIATE DISPLAYS
9855
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9856
      begin
9857
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9858
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9859
      end
9860
      else
9861
      begin
9862
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9863
        fail = fail + 1;
9864
        test_fail("IPG is not correct");
9865
      end
9866
      // wait for second transmit to end
9867
      wait (MTxEn === 1'b0); // end second transmit
9868
      while (data[15] === 1)
9869
      begin
9870
        check_tx_bd(num_of_bd, data);
9871
        @(posedge wb_clk);
9872
      end
9873
      repeat (1) @(posedge wb_clk);
9874
      // check length of a second PACKET
9875
      tmp_len = eth_phy.tx_len;
9876
      #1;
9877
      if (tmp_len != (i_length + 4 + 1))
9878
      begin
9879
        test_fail("Wrong length of second packet out from MAC");
9880
        fail = fail + 1;
9881
      end
9882
      // checking second packet
9883
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9884
      if (tmp > 0)
9885
      begin
9886
        test_fail("Wrong data of second transmitted packet");
9887
        fail = fail + 1;
9888
      end
9889
      // check second transmited TX packet CRC
9890
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9891
      if (tmp > 0)
9892
      begin
9893
        test_fail("Wrong CRC of second transmitted packet");
9894
        fail = fail + 1;
9895
      end
9896
      // check WB INT signal
9897
      if (wb_int !== 1'b1)
9898
      begin
9899
        `TIME; $display("*E WB INT signal should be set");
9900
        test_fail("WB INT signal should be set");
9901
        fail = fail + 1;
9902
      end
9903
      // check TX buffer descriptor of a packet
9904
      check_tx_bd(num_of_bd, data);
9905
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9906
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9907
      begin
9908
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9909
        test_fail("TX buffer descriptor status is not correct");
9910
        fail = fail + 1;
9911
      end
9912
      // check interrupts
9913 274 tadejm
      wait (wbm_working == 0);
9914 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9915
      if ((data & `ETH_INT_TXB) !== 1'b1)
9916
      begin
9917
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9918
        test_fail("Interrupt Transmit Buffer was not set");
9919
        fail = fail + 1;
9920
      end
9921
      if ((data & (~`ETH_INT_TXB)) !== 0)
9922
      begin
9923
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9924
        test_fail("Other interrupts (except Transmit Buffer) were set");
9925
        fail = fail + 1;
9926
      end
9927
      // clear interrupts
9928 274 tadejm
      wait (wbm_working == 0);
9929 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9930
      // check WB INT signal
9931
      if (wb_int !== 1'b0)
9932
      begin
9933
        test_fail("WB INT signal should not be set");
9934
        fail = fail + 1;
9935
      end
9936
      // set length (LOOP variable)
9937
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9938
        i_length = i_length + 2;
9939
      else
9940
        i_length = (max_tmp - 4);
9941
      // set IPGT
9942
      if ((tmp_ipgt + 3) < 10)
9943
        tmp_ipgt = tmp_ipgt + 1;
9944
      else if ((tmp_ipgt + 3) < 24)
9945
        tmp_ipgt = tmp_ipgt + 7;
9946
      else if ((tmp_ipgt + 3) == 24)
9947
        tmp_ipgt = 38 - 3;
9948
      else if ((tmp_ipgt + 3) == 38)
9949
        tmp_ipgt = 72 - 3;
9950
      else if ((tmp_ipgt + 3) == 72)
9951
        tmp_ipgt = 130 - 3; // 124 - 3
9952
      // the number of frame transmitted
9953
      num_of_frames = num_of_frames + 1;
9954
      num_of_bd = 0;
9955
      @(posedge wb_clk);
9956
    end
9957
    // disable TX
9958 274 tadejm
    wait (wbm_working == 0);
9959 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9960
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9961
    @(posedge wb_clk);
9962
    if(fail == 0)
9963
      test_ok;
9964
    else
9965
      fail = 0;
9966
  end
9967
 
9968
 
9969
  ////////////////////////////////////////////////////////////////////
9970
  ////                                                            ////
9971
  ////  Test IPG during Back-to-Back transmit at                  ////
9972
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9973
  ////                                                            ////
9974
  ////////////////////////////////////////////////////////////////////
9975
  if (test_num == 19) // without and with padding
9976
  begin
9977
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9978
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9979
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9980
 
9981
    // reset MAC registers
9982
    hard_reset;
9983
    // reset MAC and MII LOGIC with soft reset
9984 274 tadejm
//    reset_mac;
9985
//    reset_mii;
9986 209 tadejm
    // set wb slave response
9987
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9988
 
9989
    max_tmp = 0;
9990
    min_tmp = 0;
9991
    num_of_frames = 0;
9992
    num_of_bd = 0;
9993
    tmp_ipgt = 0;
9994
    // set 88 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'h58, 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_FULLD | `ETH_MODER_CRCEN,
10000
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10001
    // prepare two packets 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'h29;
10007
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10008
    // check WB INT signal
10009
    if (wb_int !== 1'b0)
10010
    begin
10011
      test_fail("WB INT signal should not be set");
10012
      fail = fail + 1;
10013
    end
10014
 
10015
    // write to phy's control register for 100Mbps
10016
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10017
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10018
    speed = 100;
10019
 
10020
    i_length = (min_tmp - 4);
10021
    while (i_length < (max_tmp - 4))
10022
    begin
10023
      // disable TX, set full-duplex mode, NO padding and CRC appending
10024 274 tadejm
      wait (wbm_working == 0);
10025 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10026
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10027
      // set IPGT register
10028 274 tadejm
      wait (wbm_working == 0);
10029 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10030
      // enable TX, set full-duplex mode, NO padding and CRC appending
10031 274 tadejm
      wait (wbm_working == 0);
10032 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10033
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10034
      // Reset_tx_bd enable interrupt generation
10035
      // unmask interrupts
10036 274 tadejm
      wait (wbm_working == 0);
10037 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10038
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10039
      // not detect carrier sense in FD and no collision
10040
      eth_phy.carrier_sense_tx_fd_detect(0);
10041
      eth_phy.collision(0);
10042
      // first destination address on ethernet PHY
10043
      eth_phy.set_tx_mem_addr(0);
10044
      // prepare BDs
10045
      if (num_of_bd == 0)
10046
      begin
10047
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10048
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10049
        set_tx_bd_wrap(1);
10050
        set_tx_bd_ready(0, 0);
10051
        set_tx_bd_ready(1, 1);
10052
      end
10053
      // CHECK END OF TWO TRANSMITIONs
10054
      // wait for first transmit to end
10055
      check_tx_bd(num_of_bd, data);
10056
      wait (MTxEn === 1'b1); // start transmit
10057
      if (data[15] !== 1)
10058
      begin
10059
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10060
        fail = fail + 1;
10061
      end
10062
      wait (MTxEn === 1'b0); // end transmit
10063
      num_of_frames = num_of_frames + 1;
10064
      num_of_bd = num_of_bd + 1;
10065
      #Tp;
10066
      // destination address on ethernet PHY
10067
      eth_phy.set_tx_mem_addr(0);
10068
      i1 = 0;
10069
      i2 = 0;
10070
      // count IPG clock periods
10071
      fork
10072
        begin
10073
          wait (MTxEn === 1'b1); // start second transmit
10074
          #Tp;
10075
          disable count_rising1;
10076
          disable count_falling1;
10077
        end
10078
        begin: count_rising1
10079
          forever
10080
          begin
10081
            @(posedge mtx_clk);
10082
            i1 = i1 + 1;
10083
            #Tp;
10084
          end
10085
        end
10086
        begin: count_falling1
10087
          forever
10088
          begin
10089
            @(negedge mtx_clk);
10090
            i2 = i2 + 1;
10091
            #Tp;
10092
          end
10093
        end
10094
      join
10095
      // check IPG length - INTERMEDIATE DISPLAYS
10096
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
10097
      begin
10098
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
10099
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
10100
      end
10101
      else
10102
      begin
10103
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
10104
        fail = fail + 1;
10105
        test_fail("IPG is not correct");
10106
      end
10107
      // wait for second transmit to end
10108
      wait (MTxEn === 1'b0); // end second transmit
10109
      while (data[15] === 1)
10110
      begin
10111
        check_tx_bd(num_of_bd, data);
10112
        @(posedge wb_clk);
10113
      end
10114
      repeat (1) @(posedge wb_clk);
10115
      // check length of a second PACKET
10116
      tmp_len = eth_phy.tx_len;
10117
      #1;
10118
      if (tmp_len != (i_length + 4 + 1))
10119
      begin
10120
        test_fail("Wrong length of second packet out from MAC");
10121
        fail = fail + 1;
10122
      end
10123
      // checking second packet
10124
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
10125
      if (tmp > 0)
10126
      begin
10127
        test_fail("Wrong data of second transmitted packet");
10128
        fail = fail + 1;
10129
      end
10130
      // check second transmited TX packet CRC
10131
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
10132
      if (tmp > 0)
10133
      begin
10134
        test_fail("Wrong CRC of second transmitted packet");
10135
        fail = fail + 1;
10136
      end
10137
      // check WB INT signal
10138
      if (wb_int !== 1'b1)
10139
      begin
10140
        `TIME; $display("*E WB INT signal should be set");
10141
        test_fail("WB INT signal should be set");
10142
        fail = fail + 1;
10143
      end
10144
      // check TX buffer descriptor of a packet
10145
      check_tx_bd(num_of_bd, data);
10146
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10147
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10148
      begin
10149
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10150
        test_fail("TX buffer descriptor status is not correct");
10151
        fail = fail + 1;
10152
      end
10153
      // check interrupts
10154 274 tadejm
      wait (wbm_working == 0);
10155 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10156
      if ((data & `ETH_INT_TXB) !== 1'b1)
10157
      begin
10158
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10159
        test_fail("Interrupt Transmit Buffer was not set");
10160
        fail = fail + 1;
10161
      end
10162
      if ((data & (~`ETH_INT_TXB)) !== 0)
10163
      begin
10164
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10165
        test_fail("Other interrupts (except Transmit Buffer) were set");
10166
        fail = fail + 1;
10167
      end
10168
      // clear interrupts
10169 274 tadejm
      wait (wbm_working == 0);
10170 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10171
      // check WB INT signal
10172
      if (wb_int !== 1'b0)
10173
      begin
10174
        test_fail("WB INT signal should not be set");
10175
        fail = fail + 1;
10176
      end
10177
      // set length (LOOP variable)
10178
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
10179
        i_length = i_length + 2;
10180
      else
10181
        i_length = (max_tmp - 4);
10182
      // set IPGT
10183
      if ((tmp_ipgt + 3) < 10)
10184
        tmp_ipgt = tmp_ipgt + 1;
10185
      else if ((tmp_ipgt + 3) < 24)
10186
        tmp_ipgt = tmp_ipgt + 7;
10187
      else if ((tmp_ipgt + 3) == 24)
10188
        tmp_ipgt = 38 - 3;
10189
      else if ((tmp_ipgt + 3) == 38)
10190
        tmp_ipgt = 72 - 3;
10191
      else if ((tmp_ipgt + 3) == 72)
10192
        tmp_ipgt = 130 - 3; // 124 - 3
10193
      // the number of frame transmitted
10194
      num_of_frames = num_of_frames + 1;
10195
      num_of_bd = 0;
10196
      @(posedge wb_clk);
10197
    end
10198
    // disable TX
10199 274 tadejm
    wait (wbm_working == 0);
10200 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10201
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10202
    @(posedge wb_clk);
10203
    if(fail == 0)
10204
      test_ok;
10205
    else
10206
      fail = 0;
10207
  end
10208
 
10209
 
10210
  ////////////////////////////////////////////////////////////////////
10211
  ////                                                            ////
10212
  ////  Test transmit packets after TX under-run on each packet's ////
10213
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
10214
  ////                                                            ////
10215
  ////////////////////////////////////////////////////////////////////
10216
  if (test_num == 20) // without padding
10217
  begin
10218
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
10219
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
10220
    `TIME;
10221
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
10222
 
10223
    // reset MAC registers
10224
    hard_reset;
10225
    // set wb slave response
10226
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10227
 
10228
    max_tmp = 0;
10229
    min_tmp = 0;
10230
    // set 2 TX buffer descriptors - must be set before TX enable
10231 274 tadejm
    wait (wbm_working == 0);
10232 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10233
    // enable TX, set full-duplex mode, NO padding and CRC appending
10234 274 tadejm
    wait (wbm_working == 0);
10235 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10236
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10237
    // prepare a packet of MAXFL length
10238 274 tadejm
    wait (wbm_working == 0);
10239 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10240
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10241
    min_tmp = tmp[31:16];
10242
    st_data = 8'h99;
10243
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10244
    // read IPG value
10245 274 tadejm
    wait (wbm_working == 0);
10246 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10247
    // check WB INT signal
10248
    if (wb_int !== 1'b0)
10249
    begin
10250
      test_fail("WB INT signal should not be set");
10251
      fail = fail + 1;
10252
    end
10253
 
10254
    // write to phy's control register for 10Mbps
10255
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10256
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10257
    speed = 10;
10258
 
10259 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10260 209 tadejm
    num_of_bd = 0;
10261
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10262 279 mohor
    i_length = 80;
10263 209 tadejm
    while (i_length < (max_tmp - 4))
10264
    begin
10265
      // Reset_tx_bd enable interrupt generation
10266
      // unmask interrupts
10267 274 tadejm
      wait (wbm_working == 0);
10268 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10269
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10270
      // not detect carrier sense in FD and no collision
10271
      eth_phy.carrier_sense_tx_fd_detect(0);
10272
      eth_phy.collision(0);
10273
      // first destination address on ethernet PHY
10274
      eth_phy.set_tx_mem_addr(0);
10275
      // prepare BDs
10276
      if (num_of_bd == 0)
10277
      begin
10278
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10279
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10280
        set_tx_bd_wrap(1);
10281
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10282
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10283 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10284 209 tadejm
        set_tx_bd_ready(1, 1);
10285
        set_tx_bd_ready(0, 0);
10286
      end
10287
      // frame under-run checking
10288
      frame_started = 0;
10289
      frame_ended = 0;
10290
      wait_for_frame = 0;
10291 279 mohor
      no_underrun = 0;
10292 209 tadejm
      fork
10293
        begin
10294
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10295
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10296 279 mohor
          i = 0;
10297
          while (i <= (num_of_frames[31:2] + 1))
10298
          begin
10299
            @(negedge wb_clk);
10300
            if (eth_ma_wb_ack_i)
10301
            begin
10302
              i = i + 1;
10303
            end
10304
          end
10305 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10306
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10307 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10308 209 tadejm
          // wait for synchronization and some additional clocks
10309
          wait_for_frame = 1;
10310
          // wait for frame
10311
          wait ((wait_for_frame == 0) || (frame_started == 1))
10312
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10313
          begin
10314
            disable check_fr;
10315
          end
10316
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10317
          begin
10318
            disable wait_fr;
10319 279 mohor
            if (frame_ended == 1)
10320
            begin
10321
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10322
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10323
              no_underrun = 1;
10324
            end
10325
            else
10326
            begin
10327
              wait (frame_ended == 1);
10328
              $display("(%0t) under-run on %0d. byte",
10329
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10330
              no_underrun = 0;
10331
            end
10332 209 tadejm
          end
10333
          repeat (2) @(posedge wb_clk);
10334
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10335
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10336 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10337 209 tadejm
        end
10338
        begin: wait_fr
10339
          wait (wait_for_frame == 1)
10340
          begin
10341
            // wait for synchronization and some additional clocks
10342
            repeat (3) @(posedge wb_clk);
10343
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10344
            repeat (2) @(posedge wb_clk);
10345
            repeat (2) @(posedge mtx_clk);
10346
            wait_for_frame = 0;
10347
          end
10348
        end
10349
        begin: check_fr
10350
          // wait for frame to start
10351
          @(posedge MTxEn);
10352
          frame_started = 1;
10353
          // wait for frame to end due to under-run
10354
          @(negedge MTxEn);
10355
          frame_ended = 1;
10356
        end
10357
      join
10358 279 mohor
 
10359
      repeat (5) @ (posedge mtx_clk);
10360
 
10361 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10362
      if (frame_ended == 0)
10363
      begin
10364
        // WAIT FOR FIRST TRANSMIT
10365
        check_tx_bd(num_of_bd, data);
10366
        wait (MTxEn === 1'b1); // start first transmit
10367
        if (data[15] !== 1)
10368
        begin
10369
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10370
          fail = fail + 1;
10371
        end
10372
        wait (MTxEn === 1'b0); // end first transmit
10373
        while (data[15] === 1)
10374
        begin
10375
          check_tx_bd(num_of_bd, data);
10376
          @(posedge wb_clk);
10377
        end
10378
        repeat (1) @(posedge wb_clk);
10379
        // CHECK FIRST FRAME
10380
        // check length of a first PACKET
10381
        tmp_len = eth_phy.tx_len;
10382 279 mohor
 
10383 209 tadejm
        #1;
10384
        if (tmp_len != (i_length + 4))
10385
        begin
10386 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
10387
          test_fail("Wrong length of first packet out from MAC");
10388 209 tadejm
          fail = fail + 1;
10389
        end
10390
        // checking first packet
10391
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10392
        if (tmp > 0)
10393
        begin
10394 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
10395
          test_fail("Wrong data of first transmitted packet");
10396 209 tadejm
          fail = fail + 1;
10397
        end
10398
        // check first transmited TX packet CRC
10399
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10400
        if (tmp > 0)
10401
        begin
10402 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10403
          test_fail("Wrong CRC of first transmitted packet");
10404 209 tadejm
          fail = fail + 1;
10405
        end
10406
        // check WB INT signal
10407
        if (wb_int !== 1'b1)
10408
        begin
10409
          `TIME; $display("*E WB INT signal should be set");
10410
          test_fail("WB INT signal should be set");
10411
          fail = fail + 1;
10412
        end
10413
        // check TX buffer descriptor of a packet
10414
        check_tx_bd(num_of_bd, data);
10415
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10416
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10417
        begin
10418
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10419
          test_fail("TX buffer descriptor status is not correct");
10420
          fail = fail + 1;
10421
        end
10422
        // check interrupts
10423 274 tadejm
        wait (wbm_working == 0);
10424 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10425
        if ((data & `ETH_INT_TXB) !== 1'b1)
10426
        begin
10427
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10428
          test_fail("Interrupt Transmit Buffer was not set");
10429
          fail = fail + 1;
10430
        end
10431
        if ((data & (~`ETH_INT_TXB)) !== 0)
10432
        begin
10433
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10434
          test_fail("Other interrupts (except Transmit Buffer) were set");
10435
          fail = fail + 1;
10436
        end
10437
        // clear interrupts
10438 274 tadejm
        wait (wbm_working == 0);
10439 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10440
        // check WB INT signal
10441
        if (wb_int !== 1'b0)
10442
        begin
10443
          test_fail("WB INT signal should not be set");
10444
          fail = fail + 1;
10445
        end
10446
      end
10447 279 mohor
      else // if (frame_ended == 1)
10448 223 tadejm
      begin
10449
        // CHECK FIRST FRAME
10450
        // check length of a first PACKET
10451 279 mohor
 
10452
        if (no_underrun)
10453 223 tadejm
        begin
10454 279 mohor
          // CHECK FIRST FRAME, without under-run !!!
10455
          // check length of a first PACKET
10456
          tmp_len = eth_phy.tx_len;
10457
          #1;
10458
          if (tmp_len != (i_length + 4))
10459
          begin
10460
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10461
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10462
            fail = fail + 1;
10463
          end
10464 223 tadejm
        end
10465 279 mohor
        else
10466
        begin
10467
          // CHECK FIRST FRAME, on which under-run occure !!!
10468
          // check length of a first PACKET
10469
          tmp_len = eth_phy.tx_len_err;
10470
          #1;
10471
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10472
          begin
10473
            `TIME; $display("*E Wrong length of first packet out from MAC");
10474
            test_fail("Wrong length of first packet out from MAC");
10475
            fail = fail + 1;
10476
          end
10477
        end
10478 223 tadejm
        // checking first packet
10479 279 mohor
        if (no_underrun)
10480
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10481
        else
10482
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10483 223 tadejm
        if (tmp > 0)
10484
        begin
10485
          `TIME; $display("*E Wrong data of first transmitted packet");
10486
          test_fail("Wrong data of first transmitted packet");
10487
          fail = fail + 1;
10488
        end
10489
        // check WB INT signal
10490
        if (wb_int !== 1'b1)
10491
        begin
10492
          `TIME; $display("*E WB INT signal should be set");
10493
          test_fail("WB INT signal should be set");
10494
          fail = fail + 1;
10495
        end
10496 279 mohor
 
10497 223 tadejm
        // check TX buffer descriptor of a packet
10498
        check_tx_bd(num_of_bd, data);
10499 279 mohor
        if (no_underrun)
10500 223 tadejm
        begin
10501 279 mohor
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10502
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10503
          begin
10504
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10505
            test_fail("TX buffer descriptor status is not correct");
10506
            fail = fail + 1;
10507
          end
10508 223 tadejm
        end
10509 279 mohor
        else
10510
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10511
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10512
          begin
10513
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10514
            test_fail("TX buffer descriptor status is not correct");
10515
            fail = fail + 1;
10516
          end
10517
 
10518 223 tadejm
        // check interrupts
10519 274 tadejm
        wait (wbm_working == 0);
10520 223 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10521 279 mohor
 
10522
        if (no_underrun)
10523 223 tadejm
        begin
10524 279 mohor
          if ((data & `ETH_INT_TXB) !== 2'b01)
10525
          begin
10526
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10527
            test_fail("Interrupt Transmit Buffer was not set");
10528
            fail = fail + 1;
10529
          end
10530
          if ((data & (~`ETH_INT_TXB)) !== 0)
10531
          begin
10532
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10533
            test_fail("Other interrupts (except Transmit Buffer) were set");
10534
            fail = fail + 1;
10535
          end
10536 223 tadejm
        end
10537 279 mohor
        else
10538 223 tadejm
        begin
10539 279 mohor
          if ((data & `ETH_INT_TXE) !== 2'b10)
10540
          begin
10541
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10542
            test_fail("Interrupt Transmit Error was not set");
10543
            fail = fail + 1;
10544
          end
10545
          if ((data & (~`ETH_INT_TXE)) !== 0)
10546
          begin
10547
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10548
            test_fail("Other interrupts (except Transmit Buffer) were set");
10549
            fail = fail + 1;
10550
          end
10551 223 tadejm
        end
10552 279 mohor
 
10553 223 tadejm
        // clear interrupts
10554 274 tadejm
        wait (wbm_working == 0);
10555 223 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10556
        // check WB INT signal
10557
        if (wb_int !== 1'b0)
10558
        begin
10559
          test_fail("WB INT signal should not be set");
10560
          fail = fail + 1;
10561
        end
10562
      end
10563 209 tadejm
      num_of_bd = num_of_bd + 1;
10564
      // destination address on ethernet PHY
10565
      eth_phy.set_tx_mem_addr(0);
10566 223 tadejm
      // WAIT FOR SECOND TRANSMIT
10567 209 tadejm
      check_tx_bd(num_of_bd, data);
10568
      wait (MTxEn === 1'b1); // start first transmit
10569
      if (data[15] !== 1)
10570
      begin
10571
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10572
        fail = fail + 1;
10573
      end
10574
      wait (MTxEn === 1'b0); // end first transmit
10575
      while (data[15] === 1)
10576
      begin
10577
        check_tx_bd(num_of_bd, data);
10578
        @(posedge wb_clk);
10579
      end
10580
      repeat (1) @(posedge wb_clk);
10581
      // CHECK SECOND FRAME
10582
      // check length of a second PACKET
10583
      tmp_len = eth_phy.tx_len;
10584
      #1;
10585
      if (tmp_len != (i_length + 4))
10586
      begin
10587 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10588 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10589
        fail = fail + 1;
10590
      end
10591
      // checking second packet
10592
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10593
      if (tmp > 0)
10594
      begin
10595 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10596 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10597
        fail = fail + 1;
10598
      end
10599
      // check second transmited TX packet CRC
10600
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10601
      if (tmp > 0)
10602
      begin
10603 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10604 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10605
        fail = fail + 1;
10606
      end
10607
      // check WB INT signal
10608
      if (wb_int !== 1'b1)
10609
      begin
10610
        `TIME; $display("*E WB INT signal should be set");
10611
        test_fail("WB INT signal should be set");
10612
        fail = fail + 1;
10613
      end
10614
      // check TX buffer descriptor of a packet
10615
      check_tx_bd(num_of_bd, data);
10616
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10617
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10618
      begin
10619
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10620
        test_fail("TX buffer descriptor status is not correct");
10621
        fail = fail + 1;
10622
      end
10623
      // check interrupts
10624 274 tadejm
      wait (wbm_working == 0);
10625 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10626
      if ((data & `ETH_INT_TXB) !== 1'b1)
10627
      begin
10628
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10629
        test_fail("Interrupt Transmit Buffer was not set");
10630
        fail = fail + 1;
10631
      end
10632
      if ((data & (~`ETH_INT_TXB)) !== 0)
10633
      begin
10634
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10635
        test_fail("Other interrupts (except Transmit Buffer) were set");
10636
        fail = fail + 1;
10637
      end
10638
      // clear interrupts
10639 274 tadejm
      wait (wbm_working == 0);
10640 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10641
      // check WB INT signal
10642
      if (wb_int !== 1'b0)
10643
      begin
10644
        test_fail("WB INT signal should not be set");
10645
        fail = fail + 1;
10646
      end
10647
      // set initial value
10648
      i_data = i_data - 1;
10649 279 mohor
      // the number of frames transmitted
10650 209 tadejm
      num_of_frames = num_of_frames + 1;
10651
      num_of_bd = 0;
10652
      // set length (LOOP variable)
10653 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10654 209 tadejm
        i_length = (max_tmp - 4);
10655
      @(posedge wb_clk);
10656
    end
10657
    // disable TX
10658 274 tadejm
    wait (wbm_working == 0);
10659 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10660
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10661
    @(posedge wb_clk);
10662
    if(fail == 0)
10663
      test_ok;
10664
    else
10665
      fail = 0;
10666
  end
10667
 
10668
 
10669
  ////////////////////////////////////////////////////////////////////
10670
  ////                                                            ////
10671
  ////  Test transmit packets after TX under-run on each packet's ////
10672
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10673
  ////                                                            ////
10674
  ////////////////////////////////////////////////////////////////////
10675
  if (test_num == 21) // without padding
10676
  begin
10677
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10678
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10679
    `TIME;
10680
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10681
 
10682
    // reset MAC registers
10683
    hard_reset;
10684
    // set wb slave response
10685
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10686
 
10687
    max_tmp = 0;
10688
    min_tmp = 0;
10689
    // set 2 TX buffer descriptors - must be set before TX enable
10690 274 tadejm
    wait (wbm_working == 0);
10691 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10692
    // enable TX, set full-duplex mode, NO padding and CRC appending
10693 274 tadejm
    wait (wbm_working == 0);
10694 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10695
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10696
    // prepare a packet of MAXFL length
10697 274 tadejm
    wait (wbm_working == 0);
10698 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10699
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10700
    min_tmp = tmp[31:16];
10701
    st_data = 8'h99;
10702
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10703
    // read IPG value
10704 274 tadejm
    wait (wbm_working == 0);
10705 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10706
    // check WB INT signal
10707
    if (wb_int !== 1'b0)
10708
    begin
10709
      test_fail("WB INT signal should not be set");
10710
      fail = fail + 1;
10711
    end
10712
 
10713
    // write to phy's control register for 100Mbps
10714
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10715 279 mohor
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10716 209 tadejm
    speed = 100;
10717
 
10718 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10719 209 tadejm
    num_of_bd = 0;
10720
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10721 279 mohor
    i_length = 80;
10722 209 tadejm
    while (i_length < (max_tmp - 4))
10723
    begin
10724
      // Reset_tx_bd enable interrupt generation
10725
      // unmask interrupts
10726 274 tadejm
      wait (wbm_working == 0);
10727 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10728
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10729
      // not detect carrier sense in FD and no collision
10730
      eth_phy.carrier_sense_tx_fd_detect(0);
10731
      eth_phy.collision(0);
10732
      // first destination address on ethernet PHY
10733
      eth_phy.set_tx_mem_addr(0);
10734
      // prepare BDs
10735
      if (num_of_bd == 0)
10736
      begin
10737
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10738
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10739
        set_tx_bd_wrap(1);
10740
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10741
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10742 279 mohor
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10743 209 tadejm
        set_tx_bd_ready(1, 1);
10744
        set_tx_bd_ready(0, 0);
10745
      end
10746
      // frame under-run checking
10747
      frame_started = 0;
10748
      frame_ended = 0;
10749
      wait_for_frame = 0;
10750 279 mohor
      no_underrun = 0;
10751 209 tadejm
      fork
10752
        begin
10753
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10754
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10755 279 mohor
          i = 0;
10756
          while (i <= (num_of_frames[31:2] + 1))
10757
          begin
10758
            @(negedge wb_clk);
10759
            if (eth_ma_wb_ack_i)
10760
            begin
10761
              i = i + 1;
10762
            end
10763
          end
10764 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10765
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10766 279 mohor
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10767 209 tadejm
          // wait for synchronization and some additional clocks
10768
          wait_for_frame = 1;
10769
          // wait for frame
10770
          wait ((wait_for_frame == 0) || (frame_started == 1))
10771
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10772
          begin
10773
            disable check_fr1;
10774
          end
10775
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10776
          begin
10777
            disable wait_fr1;
10778 279 mohor
            if (frame_ended == 1)
10779
            begin
10780
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10781
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10782
              no_underrun = 1;
10783
            end
10784
            else
10785
            begin
10786
              wait (frame_ended == 1);
10787
              $display("(%0t) under-run on %0d. byte",
10788
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10789
              no_underrun = 0;
10790
            end
10791 209 tadejm
          end
10792
          repeat (2) @(posedge wb_clk);
10793
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10794
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10795 279 mohor
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10796 209 tadejm
        end
10797
        begin: wait_fr1
10798
          wait (wait_for_frame == 1)
10799
          begin
10800
            // wait for synchronization and some additional clocks
10801
            repeat (3) @(posedge wb_clk);
10802
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10803
            repeat (2) @(posedge wb_clk);
10804
            repeat (2) @(posedge mtx_clk);
10805
            wait_for_frame = 0;
10806
          end
10807
        end
10808
        begin: check_fr1
10809
          // wait for frame to start
10810
          @(posedge MTxEn);
10811
          frame_started = 1;
10812
          // wait for frame to end due to under-run
10813
          @(negedge MTxEn);
10814
          frame_ended = 1;
10815
        end
10816
      join
10817 279 mohor
 
10818
      repeat (5) @ (posedge mtx_clk);
10819
 
10820 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10821
      if (frame_ended == 0)
10822
      begin
10823
        // WAIT FOR FIRST TRANSMIT
10824
        check_tx_bd(num_of_bd, data);
10825
        wait (MTxEn === 1'b1); // start first transmit
10826
        if (data[15] !== 1)
10827
        begin
10828
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10829
          fail = fail + 1;
10830
        end
10831
        wait (MTxEn === 1'b0); // end first transmit
10832
        while (data[15] === 1)
10833
        begin
10834
          check_tx_bd(num_of_bd, data);
10835
          @(posedge wb_clk);
10836
        end
10837 279 mohor
        repeat (10) @(posedge wb_clk);
10838 209 tadejm
        // CHECK FIRST FRAME
10839
        // check length of a first PACKET
10840
        tmp_len = eth_phy.tx_len;
10841 279 mohor
 
10842 209 tadejm
        #1;
10843
        if (tmp_len != (i_length + 4))
10844
        begin
10845 279 mohor
          `TIME; $display("*E Wrong length of first packet out from MAC");
10846
          test_fail("Wrong length of first packet out from MAC");
10847 209 tadejm
          fail = fail + 1;
10848
        end
10849
        // checking first packet
10850
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10851
        if (tmp > 0)
10852
        begin
10853 279 mohor
          `TIME; $display("*E Wrong data of first transmitted packet");
10854
          test_fail("Wrong data of first transmitted packet");
10855 209 tadejm
          fail = fail + 1;
10856
        end
10857
        // check first transmited TX packet CRC
10858
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10859
        if (tmp > 0)
10860
        begin
10861 279 mohor
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10862
          test_fail("Wrong CRC of first transmitted packet");
10863 209 tadejm
          fail = fail + 1;
10864
        end
10865
        // check WB INT signal
10866
        if (wb_int !== 1'b1)
10867
        begin
10868
          `TIME; $display("*E WB INT signal should be set");
10869
          test_fail("WB INT signal should be set");
10870
          fail = fail + 1;
10871
        end
10872
        // check TX buffer descriptor of a packet
10873
        check_tx_bd(num_of_bd, data);
10874
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10875
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10876
        begin
10877
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10878
          test_fail("TX buffer descriptor status is not correct");
10879
          fail = fail + 1;
10880
        end
10881
        // check interrupts
10882 274 tadejm
        wait (wbm_working == 0);
10883 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10884
        if ((data & `ETH_INT_TXB) !== 1'b1)
10885
        begin
10886
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10887
          test_fail("Interrupt Transmit Buffer was not set");
10888
          fail = fail + 1;
10889
        end
10890
        if ((data & (~`ETH_INT_TXB)) !== 0)
10891
        begin
10892
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10893
          test_fail("Other interrupts (except Transmit Buffer) were set");
10894
          fail = fail + 1;
10895
        end
10896
        // clear interrupts
10897 274 tadejm
        wait (wbm_working == 0);
10898 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10899
        // check WB INT signal
10900
        if (wb_int !== 1'b0)
10901
        begin
10902
          test_fail("WB INT signal should not be set");
10903
          fail = fail + 1;
10904
        end
10905
      end
10906 279 mohor
      else // if (frame_ended == 1)
10907
      begin
10908
        // CHECK FIRST FRAME
10909
        // check length of a first PACKET
10910
 
10911
        if (no_underrun)
10912
        begin
10913
          // CHECK FIRST FRAME, without under-run !!!
10914
          // check length of a first PACKET
10915
          tmp_len = eth_phy.tx_len;
10916
          #1;
10917
          if (tmp_len != (i_length + 4))
10918
          begin
10919
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10920
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10921
            fail = fail + 1;
10922
          end
10923
        end
10924
        else
10925
        begin
10926
          // CHECK FIRST FRAME, on which under-run occure !!!
10927
          // check length of a first PACKET
10928
          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)
10929
          #1;
10930
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10931
          begin
10932
            `TIME; $display("*E Wrong length of first packet out from MAC");
10933
            test_fail("Wrong length of first packet out from MAC");
10934
            fail = fail + 1;
10935
          end
10936
        end
10937
        // checking first packet
10938
        if (no_underrun)
10939
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10940
        else
10941
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10942
        if (tmp > 0)
10943
        begin
10944
          `TIME; $display("*E Wrong data of first transmitted packet");
10945
          test_fail("Wrong data of first transmitted packet");
10946
          fail = fail + 1;
10947
        end
10948
        // check WB INT signal
10949
        if (wb_int !== 1'b1)
10950
        begin
10951
          `TIME; $display("*E WB INT signal should be set");
10952
          test_fail("WB INT signal should be set");
10953
          fail = fail + 1;
10954
        end
10955
 
10956
        // check TX buffer descriptor of a packet
10957
        check_tx_bd(num_of_bd, data);
10958
        if (no_underrun)
10959
        begin
10960
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10961
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10962
          begin
10963
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10964
            test_fail("TX buffer descriptor status is not correct");
10965
            fail = fail + 1;
10966
          end
10967
        end
10968
        else
10969
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10970
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10971
          begin
10972
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10973
            test_fail("TX buffer descriptor status is not correct");
10974
            fail = fail + 1;
10975
          end
10976
 
10977
        // check interrupts
10978
        wait (wbm_working == 0);
10979
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10980
 
10981
        if (no_underrun)
10982
        begin
10983
          if ((data & `ETH_INT_TXB) !== 2'b01)
10984
          begin
10985
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10986
            test_fail("Interrupt Transmit Buffer was not set");
10987
            fail = fail + 1;
10988
          end
10989
          if ((data & (~`ETH_INT_TXB)) !== 0)
10990
          begin
10991
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10992
            test_fail("Other interrupts (except Transmit Buffer) were set");
10993
            fail = fail + 1;
10994
          end
10995
        end
10996
        else
10997
        begin
10998
          if ((data & `ETH_INT_TXE) !== 2'b10)
10999
          begin
11000
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
11001
            test_fail("Interrupt Transmit Error was not set");
11002
            fail = fail + 1;
11003
          end
11004
          if ((data & (~`ETH_INT_TXE)) !== 0)
11005
          begin
11006
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
11007
            test_fail("Other interrupts (except Transmit Buffer) were set");
11008
            fail = fail + 1;
11009
          end
11010
        end
11011
 
11012
        // clear interrupts
11013
        wait (wbm_working == 0);
11014
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11015
        // check WB INT signal
11016
        if (wb_int !== 1'b0)
11017
        begin
11018
          test_fail("WB INT signal should not be set");
11019
          fail = fail + 1;
11020
        end
11021
      end
11022 209 tadejm
      num_of_bd = num_of_bd + 1;
11023
      // destination address on ethernet PHY
11024
      eth_phy.set_tx_mem_addr(0);
11025 279 mohor
      // WAIT FOR SECOND TRANSMIT
11026 209 tadejm
      check_tx_bd(num_of_bd, data);
11027
      wait (MTxEn === 1'b1); // start first transmit
11028
      if (data[15] !== 1)
11029
      begin
11030
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11031
        fail = fail + 1;
11032
      end
11033
      wait (MTxEn === 1'b0); // end first transmit
11034
      while (data[15] === 1)
11035
      begin
11036
        check_tx_bd(num_of_bd, data);
11037
        @(posedge wb_clk);
11038
      end
11039
      repeat (1) @(posedge wb_clk);
11040
      // CHECK SECOND FRAME
11041
      // check length of a second PACKET
11042
      tmp_len = eth_phy.tx_len;
11043
      #1;
11044
      if (tmp_len != (i_length + 4))
11045
      begin
11046 279 mohor
        `TIME; $display("*E Wrong length of second packet out from MAC");
11047 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
11048
        fail = fail + 1;
11049
      end
11050
      // checking second packet
11051
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
11052
      if (tmp > 0)
11053
      begin
11054 279 mohor
        `TIME; $display("*E Wrong data of second transmitted packet");
11055 209 tadejm
        test_fail("Wrong data of second transmitted packet");
11056
        fail = fail + 1;
11057
      end
11058
      // check second transmited TX packet CRC
11059
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
11060
      if (tmp > 0)
11061
      begin
11062 279 mohor
        `TIME; $display("*E Wrong CRC of second transmitted packet");
11063 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
11064
        fail = fail + 1;
11065
      end
11066
      // check WB INT signal
11067
      if (wb_int !== 1'b1)
11068
      begin
11069
        `TIME; $display("*E WB INT signal should be set");
11070
        test_fail("WB INT signal should be set");
11071
        fail = fail + 1;
11072
      end
11073
      // check TX buffer descriptor of a packet
11074
      check_tx_bd(num_of_bd, data);
11075
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
11076
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
11077
      begin
11078
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
11079
        test_fail("TX buffer descriptor status is not correct");
11080
        fail = fail + 1;
11081
      end
11082
      // check interrupts
11083 274 tadejm
      wait (wbm_working == 0);
11084 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11085
      if ((data & `ETH_INT_TXB) !== 1'b1)
11086
      begin
11087
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
11088
        test_fail("Interrupt Transmit Buffer was not set");
11089
        fail = fail + 1;
11090
      end
11091
      if ((data & (~`ETH_INT_TXB)) !== 0)
11092
      begin
11093
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
11094
        test_fail("Other interrupts (except Transmit Buffer) were set");
11095
        fail = fail + 1;
11096
      end
11097
      // clear interrupts
11098 274 tadejm
      wait (wbm_working == 0);
11099 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11100
      // check WB INT signal
11101
      if (wb_int !== 1'b0)
11102
      begin
11103
        test_fail("WB INT signal should not be set");
11104
        fail = fail + 1;
11105
      end
11106
      // set initial value
11107
      i_data = i_data - 1;
11108 279 mohor
      // the number of frames transmitted
11109 209 tadejm
      num_of_frames = num_of_frames + 1;
11110
      num_of_bd = 0;
11111
      // set length (LOOP variable)
11112 279 mohor
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
11113 209 tadejm
        i_length = (max_tmp - 4);
11114
      @(posedge wb_clk);
11115
    end
11116
    // disable TX
11117 274 tadejm
    wait (wbm_working == 0);
11118 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
11119
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11120
    @(posedge wb_clk);
11121
    if(fail == 0)
11122
      test_ok;
11123
    else
11124
      fail = 0;
11125
  end
11126
 
11127 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
11128 169 mohor
 
11129
end
11130
endtask // test_mac_full_duplex_transmit
11131
 
11132
 
11133 209 tadejm
task test_mac_full_duplex_receive;
11134
  input  [31:0]  start_task;
11135
  input  [31:0]  end_task;
11136
  integer        bit_start_1;
11137
  integer        bit_end_1;
11138
  integer        bit_start_2;
11139
  integer        bit_end_2;
11140
  integer        num_of_reg;
11141
  integer        num_of_frames;
11142
  integer        num_of_bd;
11143
  integer        i_addr;
11144
  integer        i_data;
11145
  integer        i_length;
11146
  integer        tmp_len;
11147
  integer        tmp_bd;
11148
  integer        tmp_bd_num;
11149
  integer        tmp_data;
11150
  integer        tmp_ipgt;
11151
  integer        test_num;
11152
  reg    [31:0]  tx_bd_num;
11153
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
11154
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
11155
  integer        i;
11156
  integer        i1;
11157
  integer        i2;
11158
  integer        i3;
11159
  integer        fail;
11160
  integer        speed;
11161
  reg            frame_started;
11162
  reg            frame_ended;
11163
  reg            wait_for_frame;
11164 243 tadejm
  reg            check_frame;
11165
  reg            stop_checking_frame;
11166
  reg            first_fr_received;
11167 209 tadejm
  reg    [31:0]  addr;
11168
  reg    [31:0]  data;
11169
  reg    [31:0]  tmp;
11170
  reg    [ 7:0]  st_data;
11171
  reg    [15:0]  max_tmp;
11172
  reg    [15:0]  min_tmp;
11173
begin
11174
// MAC FULL DUPLEX RECEIVE TEST
11175
test_heading("MAC FULL DUPLEX RECEIVE TEST");
11176
$display(" ");
11177
$display("MAC FULL DUPLEX RECEIVE TEST");
11178
fail = 0;
11179
 
11180
// reset MAC registers
11181
hard_reset;
11182
// reset MAC and MII LOGIC with soft reset
11183 274 tadejm
//reset_mac;
11184
//reset_mii;
11185 209 tadejm
// set wb slave response
11186
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
11187
 
11188
  /*
11189
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
11190
  -------------------------------------------------------------------------------------
11191
  set_tx_bd
11192
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
11193
  set_tx_bd_wrap
11194
    (tx_bd_num_end[6:0]);
11195
  set_tx_bd_ready
11196
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
11197
  check_tx_bd
11198
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
11199
  clear_tx_bd
11200
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
11201
 
11202
  TASKS for set and control RX buffer descriptors:
11203
  ------------------------------------------------
11204
  set_rx_bd
11205
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
11206
  set_rx_bd_wrap
11207
    (rx_bd_num_end[6:0]);
11208
  set_rx_bd_empty
11209
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
11210
  check_rx_bd
11211
    (rx_bd_num_end[6:0], rx_bd_status);
11212
  clear_rx_bd
11213
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
11214
 
11215
  TASKS for set and check TX packets:
11216
  -----------------------------------
11217
  set_tx_packet
11218
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
11219
  check_tx_packet
11220
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
11221
 
11222
  TASKS for set and check RX packets:
11223
  -----------------------------------
11224
  set_rx_packet
11225
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
11226
  check_rx_packet
11227
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
11228
 
11229
  TASKS for append and check CRC to/of TX packet:
11230
  -----------------------------------------------
11231
  append_tx_crc
11232
    (txpnt_wb[31:0], len[15:0], negated_crc);
11233
  check_tx_crc
11234
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
11235
 
11236
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
11237
  --------------------------------------------------------------------------------
11238
  append_rx_crc
11239
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
11240
  */
11241
 
11242
//////////////////////////////////////////////////////////////////////
11243
////                                                              ////
11244
////  test_mac_full_duplex_receive:                               ////
11245
////                                                              ////
11246
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
11247
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
11248 243 tadejm
////  2: Test receive packet synchronization with receive         ////
11249
////     disable/enable ( 10Mbps ).                               ////
11250
////  3: Test receive packet synchronization with receive         ////
11251
////     disable/enable ( 100Mbps ).                              ////
11252
////  4: Test receive packets form MINFL to MAXFL sizes at        ////
11253 209 tadejm
////     one RX buffer decriptor ( 10Mbps ).                      ////
11254 243 tadejm
////  5: Test receive packets form MINFL to MAXFL sizes at        ////
11255 209 tadejm
////     one RX buffer decriptor ( 100Mbps ).                     ////
11256
////                                                              ////
11257
//////////////////////////////////////////////////////////////////////
11258
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
11259
begin
11260
 
11261
  ////////////////////////////////////////////////////////////////////
11262
  ////                                                            ////
11263
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
11264
  ////                                                            ////
11265
  ////////////////////////////////////////////////////////////////////
11266
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
11267
  begin
11268
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
11269
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
11270
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
11271
 
11272
    // unmask interrupts
11273 274 tadejm
    wait (wbm_working == 0);
11274 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11275
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11276
    // set all buffer descriptors to TX - must be set before RX enable
11277 274 tadejm
    wait (wbm_working == 0);
11278 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11279 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11280 274 tadejm
    wait (wbm_working == 0);
11281 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11282
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11283
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11284
 
11285
    // write to phy's control register for 10Mbps
11286
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11287
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11288
    speed = 10;
11289
 
11290
    i = 0;
11291
    while (i < 128)
11292
    begin
11293
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11294
      begin
11295
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11296
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11297
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11298
      end
11299
      set_rx_bd_wrap(i);
11300
      set_rx_bd_empty(0, i);
11301
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11302
      begin
11303
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11304
        repeat(10) @(posedge mrx_clk);
11305
      end
11306
      @(posedge mrx_clk);
11307
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11308
      begin
11309
        check_rx_bd(0, tmp);
11310
        #1;
11311
        if (tmp[15] === 1'b0)
11312
        begin
11313
          test_fail("Receive should not start at all");
11314
          fail = fail + 1;
11315
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11316
        end
11317
        if (tmp[7:0] !== 0)
11318
        begin
11319
          test_fail("Receive should not be finished since it should not start at all");
11320
          fail = fail + 1;
11321
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11322
        end
11323
        @(posedge wb_clk);
11324
      end
11325 274 tadejm
      wait (wbm_working == 0);
11326 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11327
      if (tmp[6:0] !== 0)
11328
      begin
11329
        test_fail("Receive should not get INT since it should not start at all");
11330
        fail = fail + 1;
11331
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11332
      end
11333
      clear_rx_bd(0, i);
11334
      if ((i < 5) || (i > 124))
11335
        i = i + 1;
11336
      else
11337
        i = i + 120;
11338
    end
11339
    // disable RX
11340 274 tadejm
    wait (wbm_working == 0);
11341 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11342
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11343
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11344
    if(fail == 0)
11345
      test_ok;
11346
    else
11347
      fail = 0;
11348
  end
11349
 
11350
 
11351
  ////////////////////////////////////////////////////////////////////
11352
  ////                                                            ////
11353
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
11354
  ////                                                            ////
11355
  ////////////////////////////////////////////////////////////////////
11356
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
11357
  begin
11358
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
11359
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
11360
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
11361
 
11362
    // unmask interrupts
11363 274 tadejm
    wait (wbm_working == 0);
11364 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11365
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11366
    // set all buffer descriptors to TX - must be set before RX enable
11367 274 tadejm
    wait (wbm_working == 0);
11368 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11369 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11370 274 tadejm
    wait (wbm_working == 0);
11371 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11372
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11373
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11374
 
11375
    // write to phy's control register for 100Mbps
11376
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11377
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11378
    speed = 100;
11379
 
11380
    i = 0;
11381
    while (i < 128)
11382
    begin
11383
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11384
      begin
11385
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11386
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11387
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11388
      end
11389
      set_rx_bd_wrap(i);
11390
      set_rx_bd_empty(0, i);
11391
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11392
      begin
11393
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11394
        repeat(10) @(posedge mrx_clk);
11395
      end
11396
      @(posedge mrx_clk);
11397
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11398
      begin
11399
        check_rx_bd(0, tmp);
11400
        #1;
11401
        if (tmp[15] === 1'b0)
11402
        begin
11403
          test_fail("Receive should not start at all");
11404
          fail = fail + 1;
11405
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11406
        end
11407
        if (tmp[7:0] !== 0)
11408
        begin
11409
          test_fail("Receive should not be finished since it should not start at all");
11410
          fail = fail + 1;
11411
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11412
        end
11413
        @(posedge wb_clk);
11414
      end
11415 274 tadejm
      wait (wbm_working == 0);
11416 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11417
      if (tmp[6:0] !== 0)
11418
      begin
11419
        test_fail("Receive should not get INT since it should not start at all");
11420
        fail = fail + 1;
11421
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11422
      end
11423
      clear_rx_bd(0, i);
11424
      if ((i < 5) || (i > 124))
11425
        i = i + 1;
11426
      else
11427
        i = i + 120;
11428
    end
11429
    // disable RX
11430 274 tadejm
    wait (wbm_working == 0);
11431 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11432
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11433
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11434
    if(fail == 0)
11435
      test_ok;
11436
    else
11437
      fail = 0;
11438
  end
11439
 
11440
 
11441
  ////////////////////////////////////////////////////////////////////
11442
  ////                                                            ////
11443 243 tadejm
  ////  Test receive packet synchronization with receive          ////
11444
  ////  disable/enable ( 10Mbps ).                                ////
11445
  ////                                                            ////
11446
  ////////////////////////////////////////////////////////////////////
11447
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
11448
  begin
11449
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
11450
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
11451
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
11452
 
11453
    // unmask interrupts
11454 274 tadejm
    wait (wbm_working == 0);
11455 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11456
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11457
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11458 274 tadejm
    wait (wbm_working == 0);
11459 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11460
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11461 274 tadejm
    wait (wbm_working == 0);
11462 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11463
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11464
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11465
    // prepare two packets of MAXFL length
11466 274 tadejm
    wait (wbm_working == 0);
11467 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11468
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11469
    min_tmp = tmp[31:16];
11470
    st_data = 8'h0F;
11471
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11472
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11473
    st_data = 8'h1A;
11474
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11475
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11476
    // check WB INT signal
11477
    if (wb_int !== 1'b0)
11478
    begin
11479
      test_fail("WB INT signal should not be set");
11480
      fail = fail + 1;
11481
    end
11482
 
11483
    // write to phy's control register for 10Mbps
11484
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11485
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11486
    speed = 10;
11487
 
11488
    frame_started = 0;
11489
    frame_ended = 0;
11490
    wait_for_frame = 0;
11491
    check_frame = 0;
11492
    stop_checking_frame = 0;
11493
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11494
 
11495
    num_of_frames = 0; // 
11496
    num_of_bd = 0;
11497
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11498
    while (i_length < (max_tmp - 4))
11499
    begin
11500
      // choose generating carrier sense and collision 
11501
      case (num_of_frames[1:0])
11502
      2'h0: // Interrupt is generated
11503
      begin
11504
        // enable interrupt generation
11505
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11506
        // not detect carrier sense in FD and no collision
11507
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11508
        eth_phy.collision(0);
11509
      end
11510
      2'h1: // Interrupt is generated
11511
      begin
11512
        // enable interrupt generation
11513
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11514
        // detect carrier sense in FD and no collision
11515
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11516
        eth_phy.collision(0);
11517
      end
11518
      2'h2: // Interrupt is generated
11519
      begin
11520
        // disable interrupt generation
11521
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11522
        // not detect carrier sense in FD and set collision
11523
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11524
        eth_phy.collision(1);
11525
      end
11526
      default: // 2'h3: // Interrupt is generated
11527
      begin
11528
        // disable interrupt generation
11529
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11530
        // detect carrier sense in FD and set collision
11531
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11532
        eth_phy.collision(1);
11533
      end
11534
      endcase
11535
      // set wrap bit
11536
      set_rx_bd_wrap(118);
11537
      set_rx_bd_empty(118, 118);
11538
      check_frame = 0;
11539
      stop_checking_frame = 0;
11540
      tmp_data = 0;
11541
      fork
11542
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11543
          if (num_of_frames[0] == 1'b0)
11544
          begin
11545
            repeat(1) @(posedge wb_clk);
11546
            if (num_of_frames[1] == 1'b0)
11547
            begin
11548
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11549
            end
11550
            else
11551
            begin
11552
              @(posedge mrx_clk);
11553
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11554
            end
11555
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11556
            wbm_init_waits = 4'h0;
11557
            wbm_subseq_waits = 4'h0;
11558 274 tadejm
            #1 wait (wbm_working == 0);
11559
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11560 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11561
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11562
          end
11563
        end
11564
        begin // send a packet from PHY RX
11565
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11566
          if (num_of_frames[1] == 1'b0)
11567
          begin
11568
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11569
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11570
          end
11571
          else
11572
          begin
11573
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11574
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11575
          end
11576
        end
11577
        begin: send_packet0
11578
          wait (MRxDV === 1'b1); // start transmit
11579
          wait (MRxDV === 1'b0); // end transmit
11580
          check_frame = 1;
11581
          repeat(10) @(posedge mrx_clk);
11582
          repeat(15) @(posedge wb_clk);
11583
          stop_checking_frame = 1;
11584
        end
11585
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11586
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11587
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11588
          begin
11589
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11590
          end
11591
          else if (MRxDV === 1'b1)
11592
          begin
11593
            while (eth_sl_wb_ack_o === 1'b0)
11594
            begin
11595
              @(posedge wb_clk);
11596
              tmp_data = tmp_data + 1;
11597
            end
11598
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11599
          end
11600
          else if (eth_sl_wb_ack_o === 1'b1)
11601
          begin
11602
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11603
            while (MRxDV === 1'b0)
11604
            begin
11605
              @(posedge wb_clk);
11606
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11607
            end
11608
          end
11609
        end
11610
        begin // check packet
11611
          wait (check_frame == 1);
11612
          check_rx_bd(118, tmp_bd);
11613
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11614
          begin
11615
            #1 check_rx_bd(118, tmp_bd);
11616
            @(posedge wb_clk);
11617
          end
11618
          if (num_of_frames[0] == 1'b0)
11619
          begin
11620
            if (tmp_bd[15] === 1)
11621
            begin
11622
              if (first_fr_received == 1)
11623
              begin
11624
                first_fr_received = 0;
11625
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11626
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11627
                $display("    From this moment:");
11628
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11629
                if (tmp_data[31])
11630
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11631
                else
11632
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11633
              end
11634
            end
11635
          end
11636
          if (stop_checking_frame == 0)
11637
            disable send_packet0;
11638
        end
11639
      join
11640
      // ONLY IF packet was received!
11641
      if (tmp_bd[15] === 0)
11642
      begin
11643
        // check length of a PACKET
11644
        if (tmp_bd[31:16] != (i_length + 4))
11645
        begin
11646
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11647
                          tmp_bd[31:16], (i_length + 4));
11648
          test_fail("Wrong length of the packet out from PHY");
11649
          fail = fail + 1;
11650
        end
11651
        // check received RX packet data and CRC
11652
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11653
        begin
11654
          if (num_of_frames[1] == 1'b0)
11655
          begin
11656
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11657
          end
11658
          else
11659
          begin
11660
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11661
          end
11662
          if (tmp > 0)
11663
          begin
11664
            `TIME; $display("*E Wrong data of the received packet");
11665
            test_fail("Wrong data of the received packet");
11666
            fail = fail + 1;
11667
          end
11668
        end
11669
        else // if PREVIOUS RX buffer descriptor was ready
11670
        begin
11671
          if (num_of_frames[1] == 1'b0)
11672
          begin
11673
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11674
          end
11675
          else
11676
          begin
11677
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11678
          end
11679
          if (tmp > 0)
11680
          begin
11681
            `TIME; $display("*E Wrong data of the received packet");
11682
            test_fail("Wrong data of the received packet");
11683
            fail = fail + 1;
11684
          end
11685
        end
11686
      end
11687
      // check WB INT signal
11688
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11689
      begin
11690
        if (wb_int !== 1'b0)
11691
        begin
11692
          `TIME; $display("*E WB INT signal should not be set");
11693
          test_fail("WB INT signal should not be set");
11694
          fail = fail + 1;
11695
        end
11696
      end
11697
      else
11698
      begin
11699
        if (wb_int !== 1'b1)
11700
        begin
11701
          `TIME; $display("*E WB INT signal should be set");
11702
          test_fail("WB INT signal should be set");
11703
          fail = fail + 1;
11704
        end
11705
      end
11706
      // check RX buffer descriptor of a packet - only 15 LSBits
11707
      check_rx_bd(118, data);
11708
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11709
      begin
11710
        if (data[15:0] !== 16'hE000)
11711
        begin
11712
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11713
          test_fail("RX buffer descriptor status is not correct");
11714
          fail = fail + 1;
11715
        end
11716
      end
11717
      else // interrupt enabled
11718
      begin
11719 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
11720 243 tadejm
        begin
11721
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11722
          test_fail("RX buffer descriptor status is not correct");
11723
          fail = fail + 1;
11724
        end
11725
      end
11726
      // check interrupts
11727 274 tadejm
      wait (wbm_working == 0);
11728 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11729
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11730
      begin
11731
        if (data !== 0)
11732
        begin
11733
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11734
          test_fail("Any of interrupts was set");
11735
          fail = fail + 1;
11736
        end
11737
      end
11738
      else
11739
      begin
11740
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11741
        begin
11742
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11743
          test_fail("Interrupt Receive Buffer was not set");
11744
          fail = fail + 1;
11745
        end
11746
        if ((data & (~`ETH_INT_RXB)) !== 0)
11747
        begin
11748
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11749
          test_fail("Other interrupts (except Receive Buffer) were set");
11750
          fail = fail + 1;
11751
        end
11752
      end
11753
      // clear interrupts
11754 274 tadejm
      wait (wbm_working == 0);
11755 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11756
      // check WB INT signal
11757
      if (wb_int !== 1'b0)
11758
      begin
11759
        test_fail("WB INT signal should not be set");
11760
        fail = fail + 1;
11761
      end
11762
      // disable RX after two packets
11763
      if (num_of_frames[0] == 1'b1)
11764
      begin
11765
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11766 274 tadejm
        wait (wbm_working == 0);
11767 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11768
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11769
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11770
      end
11771
      // the number of frame transmitted
11772
      num_of_frames = num_of_frames + 1;
11773
      num_of_bd = 0;
11774
      // set length (LOOP variable)
11775
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11776
        i_length = (max_tmp - 4);
11777
      @(posedge wb_clk);
11778
    end
11779
    // disable RX
11780 274 tadejm
    wait (wbm_working == 0);
11781 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11782
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11783
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11784
    if(fail == 0)
11785
      test_ok;
11786
    else
11787
      fail = 0;
11788
  end
11789
 
11790
 
11791
  ////////////////////////////////////////////////////////////////////
11792
  ////                                                            ////
11793
  ////  Test receive packet synchronization with receive          ////
11794
  ////  disable/enable ( 100Mbps ).                               ////
11795
  ////                                                            ////
11796
  ////////////////////////////////////////////////////////////////////
11797
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11798
  begin
11799
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
11800
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
11801
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
11802
 
11803
    // unmask interrupts
11804 274 tadejm
    wait (wbm_working == 0);
11805 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11806
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11807
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11808 274 tadejm
    wait (wbm_working == 0);
11809 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11810
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11811 274 tadejm
    wait (wbm_working == 0);
11812 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11813
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11814
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11815
    // prepare two packets of MAXFL length
11816 274 tadejm
    wait (wbm_working == 0);
11817 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11818
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11819
    min_tmp = tmp[31:16];
11820
    st_data = 8'h0F;
11821
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11822
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11823
    st_data = 8'h1A;
11824
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11825
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11826
    // check WB INT signal
11827
    if (wb_int !== 1'b0)
11828
    begin
11829
      test_fail("WB INT signal should not be set");
11830
      fail = fail + 1;
11831
    end
11832
 
11833
    // write to phy's control register for 100Mbps
11834
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11835
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11836
    speed = 100;
11837
 
11838
    frame_started = 0;
11839
    frame_ended = 0;
11840
    wait_for_frame = 0;
11841
    check_frame = 0;
11842
    stop_checking_frame = 0;
11843
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11844
 
11845
    num_of_frames = 0; // 
11846
    num_of_bd = 0;
11847
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11848
    while (i_length < (max_tmp - 4))
11849
    begin
11850
      // choose generating carrier sense and collision 
11851
      case (num_of_frames[1:0])
11852
      2'h0: // Interrupt is generated
11853
      begin
11854
        // enable interrupt generation
11855
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11856
        // not detect carrier sense in FD and no collision
11857
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11858
        eth_phy.collision(0);
11859
      end
11860
      2'h1: // Interrupt is generated
11861
      begin
11862
        // enable interrupt generation
11863
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11864
        // detect carrier sense in FD and no collision
11865
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11866
        eth_phy.collision(0);
11867
      end
11868
      2'h2: // Interrupt is generated
11869
      begin
11870
        // disable interrupt generation
11871
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11872
        // not detect carrier sense in FD and set collision
11873
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11874
        eth_phy.collision(1);
11875
      end
11876
      default: // 2'h3: // Interrupt is generated
11877
      begin
11878
        // disable interrupt generation
11879
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11880
        // detect carrier sense in FD and set collision
11881
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11882
        eth_phy.collision(1);
11883
      end
11884
      endcase
11885
//if (first_fr_received == 0)
11886
//begin
11887
//  check_rx_bd(118, data);
11888 274 tadejm
//  wait (wbm_working == 0);
11889 243 tadejm
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11890
//  $display("RX BD set : %h, %h", data, tmp);
11891
//end
11892
      // set wrap bit
11893
      set_rx_bd_wrap(118);
11894
      set_rx_bd_empty(118, 118);
11895
      check_frame = 0;
11896
      stop_checking_frame = 0;
11897
      tmp_data = 0;
11898
      fork
11899
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11900
          if (num_of_frames[0] == 1'b0)
11901
          begin
11902
            repeat(1) @(posedge wb_clk);
11903
            if (num_of_frames[1] == 1'b0)
11904
            begin
11905
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11906
            end
11907
            else
11908
            begin
11909
              @(posedge mrx_clk);
11910
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11911
            end
11912
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11913
            wbm_init_waits = 4'h0;
11914
            wbm_subseq_waits = 4'h0;
11915 274 tadejm
            #1 wait (wbm_working == 0);
11916
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11917 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11918
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11919
$display("mama 2, num_of_frames=%0h", num_of_frames);
11920
          end
11921
        end
11922
        begin // send a packet from PHY RX
11923
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11924
          if (num_of_frames[1] == 1'b0)
11925
          begin
11926
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11927
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11928
          end
11929
          else
11930
          begin
11931
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11932
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11933
          end
11934
        end
11935
        begin: send_packet1
11936
          wait (MRxDV === 1'b1); // start transmit
11937
          wait (MRxDV === 1'b0); // end transmit
11938
          check_frame = 1;
11939
$display("mama 3");
11940
          repeat(10) @(posedge mrx_clk);
11941
          repeat(15) @(posedge wb_clk);
11942
          stop_checking_frame = 1;
11943
        end
11944
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11945
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11946
$display("mama 4");
11947
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11948
          begin
11949
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11950
$display("mama 4_1");
11951
          end
11952
          else if (MRxDV === 1'b1)
11953
          begin
11954
            while (eth_sl_wb_ack_o === 1'b0)
11955
            begin
11956
              @(posedge wb_clk);
11957
              tmp_data = tmp_data + 1;
11958
            end
11959
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11960
$display("mama 4_2");
11961
          end
11962
          else if (eth_sl_wb_ack_o === 1'b1)
11963
          begin
11964
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11965
            while (MRxDV === 1'b0)
11966
            begin
11967
              @(posedge wb_clk);
11968
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11969
            end
11970
$display("mama 4_3");
11971
          end
11972
        end
11973
        begin // check packet
11974
          wait (check_frame == 1);
11975
          check_rx_bd(118, tmp_bd);
11976
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11977
          begin
11978
            #1 check_rx_bd(118, tmp_bd);
11979
            @(posedge wb_clk);
11980
          end
11981
$display("mama 5, tmp_bd=%0h", tmp_bd);
11982
          if (num_of_frames[0] == 1'b0)
11983
          begin
11984
            if (tmp_bd[15] === 1)
11985
            begin
11986
              if (first_fr_received == 1)
11987
              begin
11988
                first_fr_received = 0;
11989
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11990
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11991
                $display("    From this moment:");
11992
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11993
                if (tmp_data[31])
11994
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11995
                else
11996
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11997
              end
11998
              // check FB, etc.
11999
 
12000
            end
12001
            else // (tmp_bd[15] === 0)
12002
            begin // check FB, packet, etc.
12003
 
12004
            end
12005
$display("mama 5_1");
12006
          end
12007
          else // (num_of_frames[0] == 1'b1)
12008
          begin
12009
            if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
12010
            begin // check NOTHING
12011
 
12012
            end
12013
            else // (tmp_bd[15] === 0)
12014
            begin // check FB, packet, etc.
12015
 
12016
            end
12017
$display("mama 5_2");
12018
          end
12019
          if (stop_checking_frame == 0)
12020
            disable send_packet1;
12021
        end
12022
      join
12023
      // ONLY IF packet was received!
12024
$display("mama 6");
12025
      if (tmp_bd[15] === 0)
12026
      begin
12027
        // check length of a PACKET
12028
        if (tmp_bd[31:16] != (i_length + 4))
12029
        begin
12030
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12031
                          tmp_bd[31:16], (i_length + 4));
12032
          test_fail("Wrong length of the packet out from PHY");
12033
          fail = fail + 1;
12034
        end
12035
        // check received RX packet data and CRC
12036
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
12037
        begin
12038
          if (num_of_frames[1] == 1'b0)
12039
          begin
12040
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
12041
          end
12042
          else
12043
          begin
12044
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
12045
          end
12046
          if (tmp > 0)
12047
          begin
12048
            `TIME; $display("*E Wrong data of the received packet");
12049
            test_fail("Wrong data of the received packet");
12050
            fail = fail + 1;
12051
          end
12052
        end
12053
        else // if PREVIOUS RX buffer descriptor was ready
12054
        begin
12055
          if (num_of_frames[1] == 1'b0)
12056
          begin
12057
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12058
          end
12059
          else
12060
          begin
12061
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12062
          end
12063
          if (tmp > 0)
12064
          begin
12065
            `TIME; $display("*E Wrong data of the received packet");
12066
            test_fail("Wrong data of the received packet");
12067
            fail = fail + 1;
12068
          end
12069
        end
12070
      end
12071
      // check WB INT signal
12072
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
12073
      begin
12074
        if (wb_int !== 1'b0)
12075
        begin
12076
          `TIME; $display("*E WB INT signal should not be set");
12077
          test_fail("WB INT signal should not be set");
12078
          fail = fail + 1;
12079
        end
12080
      end
12081
      else
12082
      begin
12083
        if (wb_int !== 1'b1)
12084
        begin
12085
          `TIME; $display("*E WB INT signal should be set");
12086
          test_fail("WB INT signal should be set");
12087
          fail = fail + 1;
12088
        end
12089
      end
12090
      // check RX buffer descriptor of a packet - only 15 LSBits
12091
      check_rx_bd(118, data);
12092
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
12093
      begin
12094
        if (data[15:0] !== 16'hE000)
12095
        begin
12096
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12097
          test_fail("RX buffer descriptor status is not correct");
12098
          fail = fail + 1;
12099
        end
12100
      end
12101
      else // interrupt enabled
12102
      begin
12103 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
12104 243 tadejm
        begin
12105
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12106
          test_fail("RX buffer descriptor status is not correct");
12107
          fail = fail + 1;
12108
        end
12109
      end
12110
      // check interrupts
12111 274 tadejm
      wait (wbm_working == 0);
12112 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12113
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
12114
      begin
12115
        if (data !== 0)
12116
        begin
12117
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
12118
          test_fail("Any of interrupts was set");
12119
          fail = fail + 1;
12120
        end
12121
      end
12122
      else
12123
      begin
12124
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12125
        begin
12126
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12127
          test_fail("Interrupt Receive Buffer was not set");
12128
          fail = fail + 1;
12129
        end
12130
        if ((data & (~`ETH_INT_RXB)) !== 0)
12131
        begin
12132
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12133
          test_fail("Other interrupts (except Receive Buffer) were set");
12134
          fail = fail + 1;
12135
        end
12136
      end
12137
      // clear interrupts
12138 274 tadejm
      wait (wbm_working == 0);
12139 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12140
      // check WB INT signal
12141
      if (wb_int !== 1'b0)
12142
      begin
12143
        test_fail("WB INT signal should not be set");
12144
        fail = fail + 1;
12145
      end
12146
      // disable RX after two packets
12147
      if (num_of_frames[0] == 1'b1)
12148
      begin
12149
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
12150 274 tadejm
        wait (wbm_working == 0);
12151 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
12152
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12153
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
12154
      end
12155
      // the number of frame transmitted
12156
      num_of_frames = num_of_frames + 1;
12157
      num_of_bd = 0;
12158
      // set length (LOOP variable)
12159
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
12160
        i_length = (max_tmp - 4);
12161
      @(posedge wb_clk);
12162
    end
12163
    // disable RX
12164 274 tadejm
    wait (wbm_working == 0);
12165 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12166
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12167
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12168
    if(fail == 0)
12169
      test_ok;
12170
    else
12171
      fail = 0;
12172
  end
12173
 
12174
 
12175
  ////////////////////////////////////////////////////////////////////
12176
  ////                                                            ////
12177 209 tadejm
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12178
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
12179
  ////                                                            ////
12180
  ////////////////////////////////////////////////////////////////////
12181 243 tadejm
  if (test_num == 4) // 
12182 209 tadejm
  begin
12183 243 tadejm
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
12184
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
12185
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
12186 209 tadejm
 
12187
    // unmask interrupts
12188 274 tadejm
    wait (wbm_working == 0);
12189 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12190
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12191
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
12192 274 tadejm
    wait (wbm_working == 0);
12193 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12194
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12195 274 tadejm
    wait (wbm_working == 0);
12196 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12197
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12198
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12199
    // prepare two packets of MAXFL length
12200 274 tadejm
    wait (wbm_working == 0);
12201 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12202
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12203
    min_tmp = tmp[31:16];
12204
    st_data = 8'h0F;
12205
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12206
    st_data = 8'h1A;
12207
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12208
    // check WB INT signal
12209
    if (wb_int !== 1'b0)
12210
    begin
12211
      test_fail("WB INT signal should not be set");
12212
      fail = fail + 1;
12213
    end
12214
 
12215
    // write to phy's control register for 10Mbps
12216
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12217
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12218
    speed = 10;
12219
 
12220
    i_length = (min_tmp - 4);
12221
    while (i_length <= (max_tmp - 4))
12222
    begin
12223
      // choose generating carrier sense and collision for first and last 64 lengths of frames
12224
      case (i_length[1:0])
12225
      2'h0: // Interrupt is generated
12226
      begin
12227
        // enable interrupt generation
12228
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12229
        // unmask interrupts
12230 274 tadejm
        wait (wbm_working == 0);
12231 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12232
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12233
        // not detect carrier sense in FD and no collision
12234
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12235
        eth_phy.collision(0);
12236
      end
12237
      2'h1: // Interrupt is not generated
12238
      begin
12239
        // enable interrupt generation
12240
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12241
        // mask interrupts
12242 274 tadejm
        wait (wbm_working == 0);
12243 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12244
        // detect carrier sense in FD and no collision
12245
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12246
        eth_phy.collision(0);
12247
      end
12248
      2'h2: // Interrupt is not generated
12249
      begin
12250
        // disable interrupt generation
12251
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12252
        // unmask interrupts
12253 274 tadejm
        wait (wbm_working == 0);
12254 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12255
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12256
        // not detect carrier sense in FD and set collision
12257
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12258
        eth_phy.collision(1);
12259
      end
12260
      default: // 2'h3: // Interrupt is not generated
12261
      begin
12262
        // disable interrupt generation
12263
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12264
        // mask interrupts
12265 274 tadejm
        wait (wbm_working == 0);
12266 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12267
        // detect carrier sense in FD and set collision
12268
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12269
        eth_phy.collision(1);
12270
      end
12271
      endcase
12272
      if (i_length[0] == 1'b0)
12273
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12274
      else
12275
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12276
      // set wrap bit
12277
      set_rx_bd_wrap(127);
12278
      set_rx_bd_empty(127, 127);
12279
      fork
12280
        begin
12281
          if (i_length[0] == 1'b0)
12282
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12283
          else
12284
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12285
          repeat(10) @(posedge mrx_clk);
12286
        end
12287
        begin
12288
          #1 check_rx_bd(127, data);
12289
          if (i_length < min_tmp) // just first four
12290
          begin
12291
            while (data[15] === 1)
12292
            begin
12293
              #1 check_rx_bd(127, data);
12294
              @(posedge wb_clk);
12295
            end
12296
            repeat (1) @(posedge wb_clk);
12297
          end
12298
          else
12299
          begin
12300
            wait (MRxDV === 1'b1); // start transmit
12301
            #1 check_rx_bd(127, data);
12302
            if (data[15] !== 1)
12303
            begin
12304
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12305
              fail = fail + 1;
12306
            end
12307
            wait (MRxDV === 1'b0); // end transmit
12308
            while (data[15] === 1)
12309
            begin
12310
              #1 check_rx_bd(127, data);
12311
              @(posedge wb_clk);
12312
            end
12313
            repeat (1) @(posedge wb_clk);
12314
          end
12315
        end
12316
      join
12317
      // check length of a PACKET
12318
      if (data[31:16] != (i_length + 4))
12319
      begin
12320
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12321
                        data[31:16], (i_length + 4));
12322
        test_fail("Wrong length of the packet out from PHY");
12323
        fail = fail + 1;
12324
      end
12325
      // checking in the following if statement is performed only for first and last 64 lengths
12326
      // check received RX packet data and CRC
12327
      if (i_length[0] == 1'b0)
12328
      begin
12329
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12330
      end
12331
      else
12332
      begin
12333
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12334
      end
12335
      if (tmp > 0)
12336
      begin
12337
        `TIME; $display("*E Wrong data of the received packet");
12338
        test_fail("Wrong data of the received packet");
12339
        fail = fail + 1;
12340
      end
12341
      // check WB INT signal
12342
      if (i_length[1:0] == 2'h0)
12343
      begin
12344
        if (wb_int !== 1'b1)
12345
        begin
12346
          `TIME; $display("*E WB INT signal should be set");
12347
          test_fail("WB INT signal should be set");
12348
          fail = fail + 1;
12349
        end
12350
      end
12351
      else
12352
      begin
12353
        if (wb_int !== 1'b0)
12354
        begin
12355
          `TIME; $display("*E WB INT signal should not be set");
12356
          test_fail("WB INT signal should not be set");
12357
          fail = fail + 1;
12358
        end
12359
      end
12360
      // check RX buffer descriptor of a packet
12361
      check_rx_bd(127, data);
12362
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
12363
      begin
12364 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12365
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12366 209 tadejm
        begin
12367
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12368
          test_fail("RX buffer descriptor status is not correct");
12369
          fail = fail + 1;
12370
        end
12371
      end
12372
      else // interrupt not enabled
12373
      begin
12374 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12375
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12376 209 tadejm
        begin
12377
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12378
          test_fail("RX buffer descriptor status is not correct");
12379
          fail = fail + 1;
12380
        end
12381
      end
12382
      // clear RX buffer descriptor for first 4 frames
12383
      if (i_length < min_tmp)
12384
        clear_rx_bd(127, 127);
12385
      // check interrupts
12386 274 tadejm
      wait (wbm_working == 0);
12387 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12388
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12389
      begin
12390
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12391
        begin
12392
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12393
          test_fail("Interrupt Receive Buffer was not set");
12394
          fail = fail + 1;
12395
        end
12396
        if ((data & (~`ETH_INT_RXB)) !== 0)
12397
        begin
12398
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12399
          test_fail("Other interrupts (except Receive Buffer) were set");
12400
          fail = fail + 1;
12401
        end
12402
      end
12403
      else
12404
      begin
12405
        if (data !== 0)
12406
        begin
12407
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12408
          test_fail("Any of interrupts (except Receive Buffer) was set");
12409
          fail = fail + 1;
12410
        end
12411
      end
12412
      // clear interrupts
12413 274 tadejm
      wait (wbm_working == 0);
12414 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12415
      // check WB INT signal
12416
      if (wb_int !== 1'b0)
12417
      begin
12418
        test_fail("WB INT signal should not be set");
12419
        fail = fail + 1;
12420
      end
12421
      // INTERMEDIATE DISPLAYS
12422
      if ((i_length + 4) == (min_tmp + 64))
12423
      begin
12424
        // starting length is min_tmp, ending length is (min_tmp + 64)
12425
        $display("    receive small packets is NOT selected");
12426
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12427
                 min_tmp, (min_tmp + 64));
12428
        // set receive small, remain the rest
12429 274 tadejm
        wait (wbm_working == 0);
12430 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12431
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12432
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12433
      end
12434
      else if ((i_length + 4) == (max_tmp - 16))
12435
      begin
12436
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12437
        $display("    receive small packets is selected");
12438
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12439
                 (min_tmp + 64 + 128), tmp_data);
12440
        // reset receive small, remain the rest
12441 274 tadejm
        wait (wbm_working == 0);
12442 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12443
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12444
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12445
      end
12446
      else if ((i_length + 4) == max_tmp)
12447
      begin
12448
        $display("    receive small packets is NOT selected");
12449
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12450
                 (max_tmp - (4 + 16)), max_tmp);
12451
      end
12452
      // set length (loop variable)
12453
      if ((i_length + 4) < (min_tmp + 64))
12454
        i_length = i_length + 1;
12455
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12456
      begin
12457
        i_length = i_length + 128;
12458
        tmp_data = i_length + 4; // last tmp_data is ending length
12459
      end
12460
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12461
        i_length = max_tmp - (4 + 16);
12462
      else if ((i_length + 4) >= (max_tmp - 16))
12463
        i_length = i_length + 1;
12464
      else
12465
      begin
12466
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12467
        #10 $stop;
12468
      end
12469
    end
12470
    // disable RX
12471 274 tadejm
    wait (wbm_working == 0);
12472 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12473
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12474
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12475
    if(fail == 0)
12476
      test_ok;
12477
    else
12478
      fail = 0;
12479
  end
12480
 
12481
 
12482
  ////////////////////////////////////////////////////////////////////
12483
  ////                                                            ////
12484
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12485
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
12486
  ////                                                            ////
12487
  ////////////////////////////////////////////////////////////////////
12488 243 tadejm
  if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
12489 209 tadejm
  begin
12490 243 tadejm
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
12491
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
12492
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
12493 209 tadejm
 
12494
    // unmask interrupts
12495 274 tadejm
    wait (wbm_working == 0);
12496 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12497
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12498
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
12499 274 tadejm
    wait (wbm_working == 0);
12500 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12501
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12502 274 tadejm
    wait (wbm_working == 0);
12503 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12504
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12505
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12506
    // prepare two packets of MAXFL length
12507 274 tadejm
    wait (wbm_working == 0);
12508 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12509
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12510
    min_tmp = tmp[31:16];
12511
    st_data = 8'h0F;
12512
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12513
    st_data = 8'h1A;
12514
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12515
    // check WB INT signal
12516
    if (wb_int !== 1'b0)
12517
    begin
12518
      test_fail("WB INT signal should not be set");
12519
      fail = fail + 1;
12520
    end
12521
 
12522
    // write to phy's control register for 100Mbps
12523
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
12524
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
12525
    speed = 100;
12526
 
12527
    i_length = (min_tmp - 4);
12528
    while (i_length <= (max_tmp - 4))
12529
    begin
12530
      // choose generating carrier sense and collision for first and last 64 lengths of frames
12531
      case (i_length[1:0])
12532
      2'h0: // Interrupt is generated
12533
      begin
12534
        // enable interrupt generation
12535
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12536
        // unmask interrupts
12537 274 tadejm
        wait (wbm_working == 0);
12538 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12539
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12540
        // not detect carrier sense in FD and no collision
12541
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12542
        eth_phy.collision(0);
12543
      end
12544
      2'h1: // Interrupt is not generated
12545
      begin
12546
        // enable interrupt generation
12547
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12548
        // mask interrupts
12549 274 tadejm
        wait (wbm_working == 0);
12550 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12551
        // detect carrier sense in FD and no collision
12552
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12553
        eth_phy.collision(0);
12554
      end
12555
      2'h2: // Interrupt is not generated
12556
      begin
12557
        // disable interrupt generation
12558
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12559
        // unmask interrupts
12560 274 tadejm
        wait (wbm_working == 0);
12561 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12562
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12563
        // not detect carrier sense in FD and set collision
12564
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12565
        eth_phy.collision(1);
12566
      end
12567
      default: // 2'h3: // Interrupt is not generated
12568
      begin
12569
        // disable interrupt generation
12570
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12571
        // mask interrupts
12572 274 tadejm
        wait (wbm_working == 0);
12573 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12574
        // detect carrier sense in FD and set collision
12575
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12576
        eth_phy.collision(1);
12577
      end
12578
      endcase
12579
      if (i_length[0] == 1'b0)
12580
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12581
      else
12582
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12583
      // set wrap bit
12584
      set_rx_bd_wrap(127);
12585
      set_rx_bd_empty(127, 127);
12586
      fork
12587
        begin
12588
          if (i_length[0] == 1'b0)
12589
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12590
          else
12591
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12592
          repeat(10) @(posedge mrx_clk);
12593
        end
12594
        begin
12595
          #1 check_rx_bd(127, data);
12596
          if (i_length < min_tmp) // just first four
12597
          begin
12598
            while (data[15] === 1)
12599
            begin
12600
              #1 check_rx_bd(127, data);
12601
              @(posedge wb_clk);
12602
            end
12603
            repeat (1) @(posedge wb_clk);
12604
          end
12605
          else
12606
          begin
12607
            wait (MRxDV === 1'b1); // start transmit
12608
            #1 check_rx_bd(127, data);
12609
            if (data[15] !== 1)
12610
            begin
12611
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12612
              fail = fail + 1;
12613
            end
12614
            wait (MRxDV === 1'b0); // end transmit
12615
            while (data[15] === 1)
12616
            begin
12617
              #1 check_rx_bd(127, data);
12618
              @(posedge wb_clk);
12619
            end
12620
            repeat (1) @(posedge wb_clk);
12621
          end
12622
        end
12623
      join
12624
      // check length of a PACKET
12625
      if (data[31:16] != (i_length + 4))
12626
      begin
12627
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12628
                        data[31:16], (i_length + 4));
12629
        test_fail("Wrong length of the packet out from PHY");
12630
        fail = fail + 1;
12631
      end
12632
      // checking in the following if statement is performed only for first and last 64 lengths
12633
      // check received RX packet data and CRC
12634
      if (i_length[0] == 1'b0)
12635
      begin
12636
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12637
      end
12638
      else
12639
      begin
12640
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12641
      end
12642
      if (tmp > 0)
12643
      begin
12644
        `TIME; $display("*E Wrong data of the received packet");
12645
        test_fail("Wrong data of the received packet");
12646
        fail = fail + 1;
12647
      end
12648
      // check WB INT signal
12649
      if (i_length[1:0] == 2'h0)
12650
      begin
12651
        if (wb_int !== 1'b1)
12652
        begin
12653
          `TIME; $display("*E WB INT signal should be set");
12654
          test_fail("WB INT signal should be set");
12655
          fail = fail + 1;
12656
        end
12657
      end
12658
      else
12659
      begin
12660
        if (wb_int !== 1'b0)
12661
        begin
12662
          `TIME; $display("*E WB INT signal should not be set");
12663
          test_fail("WB INT signal should not be set");
12664
          fail = fail + 1;
12665
        end
12666
      end
12667
      // check RX buffer descriptor of a packet
12668
      check_rx_bd(127, data);
12669
      if (i_length[1] == 1'b0) // interrupt enabled 
12670
      begin
12671 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12672
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12673 209 tadejm
        begin
12674
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12675
          test_fail("RX buffer descriptor status is not correct");
12676
          fail = fail + 1;
12677
        end
12678
      end
12679
      else // interrupt not enabled
12680
      begin
12681 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12682
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12683 209 tadejm
        begin
12684
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12685
          test_fail("RX buffer descriptor status is not correct");
12686
          fail = fail + 1;
12687
        end
12688
      end
12689
      // clear RX buffer descriptor for first 4 frames
12690
      if (i_length < min_tmp)
12691
        clear_rx_bd(127, 127);
12692
      // check interrupts
12693 274 tadejm
      wait (wbm_working == 0);
12694 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12695
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12696
      begin
12697
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12698
        begin
12699
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12700
          test_fail("Interrupt Receive Buffer was not set");
12701
          fail = fail + 1;
12702
        end
12703
        if ((data & (~`ETH_INT_RXB)) !== 0)
12704
        begin
12705
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12706
          test_fail("Other interrupts (except Receive Buffer) were set");
12707
          fail = fail + 1;
12708
        end
12709
      end
12710
      else
12711
      begin
12712
        if (data !== 0)
12713
        begin
12714
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12715
          test_fail("Any of interrupts (except Receive Buffer) was set");
12716
          fail = fail + 1;
12717
        end
12718
      end
12719
      // clear interrupts
12720 274 tadejm
      wait (wbm_working == 0);
12721 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12722
      // check WB INT signal
12723
      if (wb_int !== 1'b0)
12724
      begin
12725
        test_fail("WB INT signal should not be set");
12726
        fail = fail + 1;
12727
      end
12728
      // INTERMEDIATE DISPLAYS
12729
      if ((i_length + 4) == (min_tmp + 64))
12730
      begin
12731
        // starting length is min_tmp, ending length is (min_tmp + 64)
12732
        $display("    receive small packets is NOT selected");
12733
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12734
                 min_tmp, (min_tmp + 64));
12735
        // set receive small, remain the rest
12736 274 tadejm
        wait (wbm_working == 0);
12737 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12738
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12739
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12740
      end
12741
      else if ((i_length + 4) == (max_tmp - 16))
12742
      begin
12743
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12744
        $display("    receive small packets is selected");
12745
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12746
                 (min_tmp + 64 + 128), tmp_data);
12747
        // reset receive small, remain the rest
12748 274 tadejm
        wait (wbm_working == 0);
12749 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12750
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12751
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12752
      end
12753
      else if ((i_length + 4) == max_tmp)
12754
      begin
12755
        $display("    receive small packets is NOT selected");
12756
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12757
                 (max_tmp - (4 + 16)), max_tmp);
12758
      end
12759
      // set length (loop variable)
12760
      if ((i_length + 4) < (min_tmp + 64))
12761
        i_length = i_length + 1;
12762
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12763
      begin
12764
        i_length = i_length + 128;
12765
        tmp_data = i_length + 4; // last tmp_data is ending length
12766
      end
12767
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12768
        i_length = max_tmp - (4 + 16);
12769
      else if ((i_length + 4) >= (max_tmp - 16))
12770
        i_length = i_length + 1;
12771
      else
12772
      begin
12773
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12774
        #10 $stop;
12775
      end
12776
    end
12777
    // disable RX
12778 274 tadejm
    wait (wbm_working == 0);
12779 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12780
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12781
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12782
    if(fail == 0)
12783
      test_ok;
12784
    else
12785
      fail = 0;
12786
  end
12787
 
12788
 
12789
  ////////////////////////////////////////////////////////////////////
12790
  ////                                                            ////
12791
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12792
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
12793
  ////                                                            ////
12794
  ////////////////////////////////////////////////////////////////////
12795 243 tadejm
  if (test_num == 6) // 
12796 209 tadejm
  begin
12797 243 tadejm
    // TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
12798
    test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
12799
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
12800 209 tadejm
 
12801
    // reset MAC registers
12802
    hard_reset;
12803
    // reset MAC and MII LOGIC with soft reset
12804 274 tadejm
//    reset_mac;
12805
//    reset_mii;
12806 209 tadejm
    // set wb slave response
12807
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12808
 
12809
    max_tmp = 0;
12810
    min_tmp = 0;
12811
    num_of_frames = 0;
12812
    num_of_bd = 0;
12813
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12814 274 tadejm
    wait (wbm_working == 0);
12815 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12816
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12817 274 tadejm
    wait (wbm_working == 0);
12818 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12819
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12820
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12821
    // prepare two packets of MAXFL length
12822 274 tadejm
    wait (wbm_working == 0);
12823 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12824
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12825
    min_tmp = tmp[31:16];
12826
    st_data = 8'hAC;
12827
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12828
    st_data = 8'h35;
12829
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12830
    // check WB INT signal
12831
    if (wb_int !== 1'b0)
12832
    begin
12833
      test_fail("WB INT signal should not be set");
12834
      fail = fail + 1;
12835
    end
12836
 
12837
    // write to phy's control register for 10Mbps
12838
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12839
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12840
    speed = 10;
12841
 
12842
    i_length = (min_tmp - 4);
12843
    while (i_length <= (max_tmp - 4))
12844
    begin
12845
      // append CRC to packet
12846
      if (i_length[0] == 1'b0)
12847
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12848
      else
12849
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12850
      // choose generating carrier sense and collision
12851
      case (i_length[1:0])
12852
      2'h0: // Interrupt is generated
12853
      begin
12854
        // Reset_tx_bd nable interrupt generation
12855
        // unmask interrupts
12856 274 tadejm
        wait (wbm_working == 0);
12857 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12858
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12859
        // not detect carrier sense in FD and no collision
12860
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12861
        eth_phy.collision(0);
12862
      end
12863
      2'h1: // Interrupt is not generated
12864
      begin
12865
        // set_tx_bd enable interrupt generation
12866
        // mask interrupts
12867 274 tadejm
        wait (wbm_working == 0);
12868 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12869
        // detect carrier sense in FD and no collision
12870
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12871
        eth_phy.collision(0);
12872
      end
12873
      2'h2: // Interrupt is not generated
12874
      begin
12875
        // set_tx_bd disable the interrupt generation
12876
        // unmask interrupts
12877 274 tadejm
        wait (wbm_working == 0);
12878 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12879
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12880
        // not detect carrier sense in FD and set collision
12881
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12882
        eth_phy.collision(1);
12883
      end
12884
      default: // 2'h3: // Interrupt is not generated
12885
      begin
12886
        // set_tx_bd disable the interrupt generation
12887
        // mask interrupts
12888 274 tadejm
        wait (wbm_working == 0);
12889 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12890
        // detect carrier sense in FD and set collision
12891
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12892
        eth_phy.collision(1);
12893
      end
12894
      endcase
12895
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12896
      // number of all frames is 154 (146 without first 8)
12897
      if (num_of_frames < 8)
12898
      begin
12899
        case (i_length[1:0])
12900
        2'h0: // Interrupt is generated
12901
        begin
12902
          // enable interrupt generation
12903
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12904
          // interrupts are unmasked
12905
        end
12906
        2'h1: // Interrupt is not generated
12907
        begin
12908
          // enable interrupt generation
12909
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12910
          // interrupts are masked
12911
        end
12912
        2'h2: // Interrupt is not generated
12913
        begin
12914
          // disable interrupt generation
12915
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12916
          // interrupts are unmasked
12917
        end
12918
        default: // 2'h3: // Interrupt is not generated
12919
        begin
12920
          // disable interrupt generation
12921
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12922
          // interrupts are masked
12923
        end
12924
        endcase
12925
        // set wrap bit
12926
        set_rx_bd_wrap(0);
12927
      end
12928
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12929
      else if ((num_of_frames - 8) == 0)
12930
      begin
12931
        tmp_len = i_length; // length of frame
12932
        tmp_bd_num = 0; // RX BD number
12933
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12934
        begin
12935
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12936
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12937
          if (tmp_len[0] == 0)
12938
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12939
          else
12940
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12941
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12942
          if ((tmp_len + 4) < (min_tmp + 128))
12943
            tmp_len = tmp_len + 1;
12944
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12945
            tmp_len = 256;
12946
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12947
            tmp_len = tmp_len + 128;
12948
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12949
            tmp_len = max_tmp - (4 + 16);
12950
          else if ((tmp_len + 4) >= (max_tmp - 16))
12951
            tmp_len = tmp_len + 1;
12952
          // set RX BD number
12953
          tmp_bd_num = tmp_bd_num + 1;
12954
        end
12955
        // set wrap bit
12956
        set_rx_bd_wrap(127);
12957
      end
12958
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12959
      else if ((num_of_frames - 8) == 20) // 128
12960
      begin
12961
        tmp_len = tmp_len; // length of frame remaines from previous settings
12962
        tmp_bd_num = 0; // TX BD number
12963
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12964
        begin
12965
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12966
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12967
          if (tmp_len[0] == 0)
12968
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12969
          else
12970
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12971
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12972
          if ((tmp_len + 4) < (min_tmp + 128))
12973
            tmp_len = tmp_len + 1;
12974
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12975
            tmp_len = 256;
12976
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12977
            tmp_len = tmp_len + 128;
12978
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12979
            tmp_len = max_tmp - (4 + 16);
12980
          else if ((tmp_len + 4) >= (max_tmp - 16))
12981
            tmp_len = tmp_len + 1;
12982
          // set TX BD number
12983
          tmp_bd_num = tmp_bd_num + 1;
12984
        end
12985
      end
12986
      // set empty bit
12987
      if (num_of_frames < 8)
12988
        set_rx_bd_empty(0, 0);
12989
      else if ((num_of_frames - 8) < 128)
12990
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12991
      else if ((num_of_frames - 136) < 19)
12992
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12993
      // CHECK END OF RECEIVE
12994
      fork
12995
        begin
12996
          if (i_length[0] == 1'b0)
12997
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12998
          else
12999
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13000
          repeat(10) @(posedge mrx_clk);
13001
        end
13002
        begin
13003
          #1 check_rx_bd(num_of_bd, data);
13004
          if (i_length < min_tmp) // just first four
13005
          begin
13006
            while (data[15] === 1)
13007
            begin
13008
              #1 check_rx_bd(num_of_bd, data);
13009
              @(posedge wb_clk);
13010
            end
13011
            repeat (1) @(posedge wb_clk);
13012
          end
13013
          else
13014
          begin
13015
            wait (MRxDV === 1'b1); // start transmit
13016
            #1 check_rx_bd(num_of_bd, data);
13017
            if (data[15] !== 1)
13018
            begin
13019
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
13020
              fail = fail + 1;
13021
            end
13022
            wait (MRxDV === 1'b0); // end transmit
13023
            while (data[15] === 1)
13024
            begin
13025
              #1 check_rx_bd(num_of_bd, data);
13026
              @(posedge wb_clk);
13027
            end
13028
            repeat (1) @(posedge wb_clk);
13029
          end
13030
        end
13031
      join
13032
      // check length of a PACKET
13033
      if (data[31:16] != (i_length + 4))
13034
      begin
13035
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13036
                        data[31:16], (i_length + 4));
13037
        test_fail("Wrong length of the packet out from PHY");
13038
        fail = fail + 1;
13039
      end
13040
      // checking in the following if statement is performed only for first and last 64 lengths
13041
      // check received RX packet data and CRC
13042
      if (i_length[0] == 1'b0)
13043
      begin
13044
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13045
      end
13046
      else
13047
      begin
13048
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13049
      end
13050
      if (tmp > 0)
13051
      begin
13052
        `TIME; $display("*E Wrong data of the received packet");
13053
        test_fail("Wrong data of the received packet");
13054
        fail = fail + 1;
13055
      end
13056
      // check WB INT signal
13057
      if (i_length[1:0] == 2'h0)
13058
      begin
13059
        if (wb_int !== 1'b1)
13060
        begin
13061
          `TIME; $display("*E WB INT signal should be set");
13062
          test_fail("WB INT signal should be set");
13063
          fail = fail + 1;
13064
        end
13065
      end
13066
      else
13067
      begin
13068
        if (wb_int !== 1'b0)
13069
        begin
13070
          `TIME; $display("*E WB INT signal should not be set");
13071
          test_fail("WB INT signal should not be set");
13072
          fail = fail + 1;
13073
        end
13074
      end
13075
      // check RX buffer descriptor of a packet
13076
      check_rx_bd(num_of_bd, data);
13077
      if (i_length[1] == 1'b0) // interrupt enabled
13078
      begin
13079 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13080
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13081 209 tadejm
        begin
13082
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13083
          test_fail("RX buffer descriptor status is not correct");
13084
          fail = fail + 1;
13085
        end
13086
      end
13087
      else // interrupt not enabled
13088
      begin
13089 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13090
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13091 209 tadejm
        begin
13092
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13093
          test_fail("RX buffer descriptor status is not correct");
13094
          fail = fail + 1;
13095
        end
13096
      end
13097
      // clear first half of 8 frames from RX buffer descriptor 0
13098
      if (num_of_frames < 4)
13099
        clear_rx_bd(num_of_bd, num_of_bd);
13100
      // clear BD with wrap bit
13101
      if (num_of_frames == 140)
13102
        clear_rx_bd(127, 127);
13103
      // check interrupts
13104 274 tadejm
      wait (wbm_working == 0);
13105 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13106
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
13107
      begin
13108
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13109
        begin
13110
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13111
          test_fail("Interrupt Receive Buffer was not set");
13112
          fail = fail + 1;
13113
        end
13114
        if ((data & (~`ETH_INT_RXB)) !== 0)
13115
        begin
13116
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13117
          test_fail("Other interrupts (except Receive Buffer) were set");
13118
          fail = fail + 1;
13119
        end
13120
      end
13121
      else
13122
      begin
13123
        if (data !== 0)
13124
        begin
13125
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
13126
          test_fail("Any of interrupts (except Receive Buffer) was set");
13127
          fail = fail + 1;
13128
        end
13129
      end
13130
      // clear interrupts
13131 274 tadejm
      wait (wbm_working == 0);
13132 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13133
      // check WB INT signal
13134
      if (wb_int !== 1'b0)
13135
      begin
13136
        test_fail("WB INT signal should not be set");
13137
        fail = fail + 1;
13138
      end
13139
      // INTERMEDIATE DISPLAYS
13140
      if ((i_length + 4) == (min_tmp + 7))
13141
      begin
13142
        // starting length is min_tmp, ending length is (min_tmp + 128)
13143
        $display("    receive small packets is NOT selected");
13144
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
13145
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
13146
                 min_tmp, (min_tmp + 7));
13147
        $display("    ->all packets were received on RX BD 0");
13148
        // reset receive small, remain the rest
13149 274 tadejm
        wait (wbm_working == 0);
13150 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13151
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13152
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13153
      end
13154
      else if ((i_length + 4) == (min_tmp + 128))
13155
      begin
13156
        // starting length is min_tmp, ending length is (min_tmp + 128)
13157
        $display("    receive small packets is NOT selected");
13158
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13159
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13160
                 (min_tmp + 8), (min_tmp + 128));
13161
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
13162
                 1'b0, num_of_bd);
13163
        tmp_bd = num_of_bd + 1;
13164
        // set receive small, remain the rest
13165 274 tadejm
        wait (wbm_working == 0);
13166 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13167
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13168
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13169
      end
13170
      else if ((i_length + 4) == (max_tmp - 16))
13171
      begin
13172
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
13173
        $display("    receive small packets is selected");
13174
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13175
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
13176
                 (min_tmp + 64 + 128), tmp_data);
13177
        if (tmp_bd > num_of_bd)
13178
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13179
                   tmp_bd, num_of_bd);
13180
        else
13181
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13182
                   tmp_bd, num_of_bd);
13183
        tmp_bd = num_of_bd + 1;
13184
        // reset receive small, remain the rest
13185 274 tadejm
        wait (wbm_working == 0);
13186 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13187
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13188
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13189
      end
13190
      else if ((i_length + 4) == max_tmp)
13191
      begin
13192
        $display("    receive small packets is NOT selected");
13193
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13194
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
13195
                 (max_tmp - (4 + 16)), max_tmp);
13196
        if (tmp_bd > num_of_bd)
13197
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13198
                   tmp_bd, num_of_bd);
13199
        else
13200
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13201
                   tmp_bd, num_of_bd);
13202
      end
13203
      // set length (loop variable)
13204
      if ((i_length + 4) < (min_tmp + 128))
13205
        i_length = i_length + 1;
13206
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13207
        i_length = 256;
13208
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13209
      begin
13210
        i_length = i_length + 128;
13211
        tmp_data = i_length + 4; // last tmp_data is ending length
13212
      end
13213
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
13214
        i_length = max_tmp - (4 + 16);
13215
      else if ((i_length + 4) >= (max_tmp - 16))
13216
        i_length = i_length + 1;
13217
      else
13218
      begin
13219
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
13220
        #10 $stop;
13221
      end
13222
      // the number of frame transmitted
13223
      num_of_frames = num_of_frames + 1;
13224
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
13225
        num_of_bd = 0;
13226
      else
13227
        num_of_bd = num_of_bd + 1;
13228
    end
13229
    // disable RX
13230 274 tadejm
    wait (wbm_working == 0);
13231 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13232
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13233
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13234
    @(posedge wb_clk);
13235
    if(fail == 0)
13236
      test_ok;
13237
    else
13238
      fail = 0;
13239
  end
13240
 
13241
 
13242
  ////////////////////////////////////////////////////////////////////
13243
  ////                                                            ////
13244
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
13245
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
13246
  ////                                                            ////
13247
  ////////////////////////////////////////////////////////////////////
13248 243 tadejm
  if (test_num == 7) // 
13249 209 tadejm
  begin
13250 243 tadejm
    // TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
13251
    test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
13252
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
13253 209 tadejm
 
13254
    // reset MAC registers
13255
    hard_reset;
13256
    // reset MAC and MII LOGIC with soft reset
13257 274 tadejm
//    reset_mac;
13258
//    reset_mii;
13259 209 tadejm
    // set wb slave response
13260
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13261
 
13262
    max_tmp = 0;
13263
    min_tmp = 0;
13264
    num_of_frames = 0;
13265
    num_of_bd = 0;
13266
    // set maximum RX buffer descriptors (128) - must be set before RX enable
13267 274 tadejm
    wait (wbm_working == 0);
13268 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13269
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
13270 274 tadejm
    wait (wbm_working == 0);
13271 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13272
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13273
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13274
    // prepare two packets of MAXFL length
13275 274 tadejm
    wait (wbm_working == 0);
13276 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13277
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13278
    min_tmp = tmp[31:16];
13279
    st_data = 8'hAC;
13280
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13281
    st_data = 8'h35;
13282
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13283
    // check WB INT signal
13284
    if (wb_int !== 1'b0)
13285
    begin
13286
      test_fail("WB INT signal should not be set");
13287
      fail = fail + 1;
13288
    end
13289
 
13290
    // write to phy's control register for 100Mbps
13291
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
13292
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
13293
    speed = 100;
13294
 
13295
    i_length = (min_tmp - 4);
13296
    while (i_length <= (max_tmp - 4))
13297
    begin
13298
      // append CRC to packet
13299
      if (i_length[0] == 1'b0)
13300
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13301
      else
13302
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13303
      // choose generating carrier sense and collision
13304
      case (i_length[1:0])
13305
      2'h0: // Interrupt is generated
13306
      begin
13307
        // Reset_tx_bd nable interrupt generation
13308
        // unmask interrupts
13309 274 tadejm
        wait (wbm_working == 0);
13310 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13311
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13312
        // not detect carrier sense in FD and no collision
13313
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13314
        eth_phy.collision(0);
13315
      end
13316
      2'h1: // Interrupt is not generated
13317
      begin
13318
        // set_tx_bd enable interrupt generation
13319
        // mask interrupts
13320 274 tadejm
        wait (wbm_working == 0);
13321 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13322
        // detect carrier sense in FD and no collision
13323
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13324
        eth_phy.collision(0);
13325
      end
13326
      2'h2: // Interrupt is not generated
13327
      begin
13328
        // set_tx_bd disable the interrupt generation
13329
        // unmask interrupts
13330 274 tadejm
        wait (wbm_working == 0);
13331 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13332
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13333
        // not detect carrier sense in FD and set collision
13334
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13335
        eth_phy.collision(1);
13336
      end
13337
      default: // 2'h3: // Interrupt is not generated
13338
      begin
13339
        // set_tx_bd disable the interrupt generation
13340
        // mask interrupts
13341 274 tadejm
        wait (wbm_working == 0);
13342 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13343
        // detect carrier sense in FD and set collision
13344
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13345
        eth_phy.collision(1);
13346
      end
13347
      endcase
13348
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
13349
      // number of all frames is 154 (146 without first 8)
13350
      if (num_of_frames < 8)
13351
      begin
13352
        case (i_length[1:0])
13353
        2'h0: // Interrupt is generated
13354
        begin
13355
          // enable interrupt generation
13356
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13357
          // interrupts are unmasked
13358
        end
13359
        2'h1: // Interrupt is not generated
13360
        begin
13361
          // enable interrupt generation
13362
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13363
          // interrupts are masked
13364
        end
13365
        2'h2: // Interrupt is not generated
13366
        begin
13367
          // disable interrupt generation
13368
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
13369
          // interrupts are unmasked
13370
        end
13371
        default: // 2'h3: // Interrupt is not generated
13372
        begin
13373
          // disable interrupt generation
13374
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13375
          // interrupts are masked
13376
        end
13377
        endcase
13378
        // set wrap bit
13379
        set_rx_bd_wrap(0);
13380
      end
13381
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
13382
      else if ((num_of_frames - 8) == 0)
13383
      begin
13384
        tmp_len = i_length; // length of frame
13385
        tmp_bd_num = 0; // RX BD number
13386
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13387
        begin
13388
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13389
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13390
          if (tmp_len[0] == 0)
13391
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13392
          else
13393
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13394
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13395
          if ((tmp_len + 4) < (min_tmp + 128))
13396
            tmp_len = tmp_len + 1;
13397
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13398
            tmp_len = 256;
13399
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13400
            tmp_len = tmp_len + 128;
13401
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13402
            tmp_len = max_tmp - (4 + 16);
13403
          else if ((tmp_len + 4) >= (max_tmp - 16))
13404
            tmp_len = tmp_len + 1;
13405
          // set RX BD number
13406
          tmp_bd_num = tmp_bd_num + 1;
13407
        end
13408
        // set wrap bit
13409
        set_rx_bd_wrap(127);
13410
      end
13411
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
13412
      else if ((num_of_frames - 8) == 20) // 128
13413
      begin
13414
        tmp_len = tmp_len; // length of frame remaines from previous settings
13415
        tmp_bd_num = 0; // TX BD number
13416
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13417
        begin
13418
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13419
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13420
          if (tmp_len[0] == 0)
13421
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13422
          else
13423
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13424
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13425
          if ((tmp_len + 4) < (min_tmp + 128))
13426
            tmp_len = tmp_len + 1;
13427
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13428
            tmp_len = 256;
13429
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13430
            tmp_len = tmp_len + 128;
13431
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13432
            tmp_len = max_tmp - (4 + 16);
13433
          else if ((tmp_len + 4) >= (max_tmp - 16))
13434
            tmp_len = tmp_len + 1;
13435
          // set TX BD number
13436
          tmp_bd_num = tmp_bd_num + 1;
13437
        end
13438
      end
13439
      // set empty bit
13440
      if (num_of_frames < 8)
13441
        set_rx_bd_empty(0, 0);
13442
      else if ((num_of_frames - 8) < 128)
13443
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
13444
      else if ((num_of_frames - 136) < 19)
13445
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
13446
      // CHECK END OF RECEIVE
13447
      fork
13448
        begin
13449
          if (i_length[0] == 1'b0)
13450
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13451
          else
13452
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13453
          repeat(10) @(posedge mrx_clk);
13454
        end
13455
        begin
13456
          #1 check_rx_bd(num_of_bd, data);
13457
          if (i_length < min_tmp) // just first four
13458
          begin
13459
            while (data[15] === 1)
13460
            begin
13461
              #1 check_rx_bd(num_of_bd, data);
13462
              @(posedge wb_clk);
13463
            end
13464
            repeat (1) @(posedge wb_clk);
13465
          end
13466
          else
13467
          begin
13468
            wait (MRxDV === 1'b1); // start transmit
13469
            #1 check_rx_bd(num_of_bd, data);
13470
            if (data[15] !== 1)
13471
            begin
13472
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
13473
              fail = fail + 1;
13474
            end
13475
            wait (MRxDV === 1'b0); // end transmit
13476
            while (data[15] === 1)
13477
            begin
13478
              #1 check_rx_bd(num_of_bd, data);
13479
              @(posedge wb_clk);
13480
            end
13481
            repeat (1) @(posedge wb_clk);
13482
          end
13483
        end
13484
      join
13485
      // check length of a PACKET
13486
      if (data[31:16] != (i_length + 4))
13487
      begin
13488
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13489
                        data[31:16], (i_length + 4));
13490
        test_fail("Wrong length of the packet out from PHY");
13491
        fail = fail + 1;
13492
      end
13493
      // check received RX packet data and CRC
13494
      if (i_length[0] == 1'b0)
13495
      begin
13496
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13497
      end
13498
      else
13499
      begin
13500
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13501
      end
13502
      if (tmp > 0)
13503
      begin
13504
        `TIME; $display("*E Wrong data of the received packet");
13505
        test_fail("Wrong data of the received packet");
13506
        fail = fail + 1;
13507
      end
13508
      // check WB INT signal
13509
      if (i_length[1:0] == 2'h0)
13510
      begin
13511
        if (wb_int !== 1'b1)
13512
        begin
13513
          `TIME; $display("*E WB INT signal should be set");
13514
          test_fail("WB INT signal should be set");
13515
          fail = fail + 1;
13516
        end
13517
      end
13518
      else
13519
      begin
13520
        if (wb_int !== 1'b0)
13521
        begin
13522
          `TIME; $display("*E WB INT signal should not be set");
13523
          test_fail("WB INT signal should not be set");
13524
          fail = fail + 1;
13525
        end
13526
      end
13527
      // check RX buffer descriptor of a packet
13528
      check_rx_bd(num_of_bd, data);
13529
      if (i_length[1] == 1'b0) // interrupt enabled
13530
      begin
13531 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13532
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13533 209 tadejm
        begin
13534
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13535
          test_fail("RX buffer descriptor status is not correct");
13536
          fail = fail + 1;
13537
        end
13538
      end
13539
      else // interrupt not enabled
13540
      begin
13541 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13542
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13543 209 tadejm
        begin
13544
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13545
          test_fail("RX buffer descriptor status is not correct");
13546
          fail = fail + 1;
13547
        end
13548
      end
13549
      // clear first half of 8 frames from RX buffer descriptor 0
13550
      if (num_of_frames < 4)
13551
        clear_rx_bd(num_of_bd, num_of_bd);
13552
      // clear BD with wrap bit
13553
      if (num_of_frames == 140)
13554
        clear_rx_bd(127, 127);
13555
      // check interrupts
13556 274 tadejm
      wait (wbm_working == 0);
13557 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13558
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
13559
      begin
13560
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13561
        begin
13562
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13563
          test_fail("Interrupt Receive Buffer was not set");
13564
          fail = fail + 1;
13565
        end
13566
        if ((data & (~`ETH_INT_RXB)) !== 0)
13567
        begin
13568
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13569
          test_fail("Other interrupts (except Receive Buffer) were set");
13570
          fail = fail + 1;
13571
        end
13572
      end
13573
      else
13574
      begin
13575
        if (data !== 0)
13576
        begin
13577
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
13578
          test_fail("Any of interrupts (except Receive Buffer) was set");
13579
          fail = fail + 1;
13580
        end
13581
      end
13582
      // clear interrupts
13583 274 tadejm
      wait (wbm_working == 0);
13584 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13585
      // check WB INT signal
13586
      if (wb_int !== 1'b0)
13587
      begin
13588
        test_fail("WB INT signal should not be set");
13589
        fail = fail + 1;
13590
      end
13591
      // INTERMEDIATE DISPLAYS
13592
      if ((i_length + 4) == (min_tmp + 7))
13593
      begin
13594
        // starting length is min_tmp, ending length is (min_tmp + 128)
13595
        $display("    receive small packets is NOT selected");
13596
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
13597
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
13598
                 min_tmp, (min_tmp + 7));
13599
        $display("    ->all packets were received on RX BD 0");
13600
        // reset receive small, remain the rest
13601 274 tadejm
        wait (wbm_working == 0);
13602 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13603
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13604
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13605
      end
13606
      else if ((i_length + 4) == (min_tmp + 128))
13607
      begin
13608
        // starting length is min_tmp, ending length is (min_tmp + 128)
13609
        $display("    receive small packets is NOT selected");
13610
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13611
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13612
                 (min_tmp + 8), (min_tmp + 128));
13613
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
13614
                 1'b0, num_of_bd);
13615
        tmp_bd = num_of_bd + 1;
13616
        // set receive small, remain the rest
13617 274 tadejm
        wait (wbm_working == 0);
13618 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13619
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13620
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13621
      end
13622
      else if ((i_length + 4) == (max_tmp - 16))
13623
      begin
13624
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
13625
        $display("    receive small packets is selected");
13626
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13627
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
13628
                 (min_tmp + 64 + 128), tmp_data);
13629
        if (tmp_bd > num_of_bd)
13630
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13631
                   tmp_bd, num_of_bd);
13632
        else
13633
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13634
                   tmp_bd, num_of_bd);
13635
        tmp_bd = num_of_bd + 1;
13636
        // reset receive small, remain the rest
13637 274 tadejm
        wait (wbm_working == 0);
13638 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13639
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13640
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13641
      end
13642
      else if ((i_length + 4) == max_tmp)
13643
      begin
13644
        $display("    receive small packets is NOT selected");
13645
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13646
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
13647
                 (max_tmp - (4 + 16)), max_tmp);
13648
        if (tmp_bd > num_of_bd)
13649
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13650
                   tmp_bd, num_of_bd);
13651
        else
13652
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13653
                   tmp_bd, num_of_bd);
13654
      end
13655
      // set length (loop variable)
13656
      if ((i_length + 4) < (min_tmp + 128))
13657
        i_length = i_length + 1;
13658
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13659
        i_length = 256;
13660
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13661
      begin
13662
        i_length = i_length + 128;
13663
        tmp_data = i_length + 4; // last tmp_data is ending length
13664
      end
13665
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
13666
        i_length = max_tmp - (4 + 16);
13667
      else if ((i_length + 4) >= (max_tmp - 16))
13668
        i_length = i_length + 1;
13669
      else
13670
      begin
13671
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
13672
        #10 $stop;
13673
      end
13674
      // the number of frame transmitted
13675
      num_of_frames = num_of_frames + 1;
13676
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
13677
        num_of_bd = 0;
13678
      else
13679
        num_of_bd = num_of_bd + 1;
13680
    end
13681
    // disable RX
13682 274 tadejm
    wait (wbm_working == 0);
13683 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13684
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13685
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13686
    @(posedge wb_clk);
13687
    if(fail == 0)
13688
      test_ok;
13689
    else
13690
      fail = 0;
13691
  end
13692
 
13693
 
13694
  ////////////////////////////////////////////////////////////////////
13695
  ////                                                            ////
13696 243 tadejm
  ////  Test receive packets form 0 to (MINFL + 12) sizes at       ////
13697 209 tadejm
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
13698
  ////                                                            ////
13699
  ////////////////////////////////////////////////////////////////////
13700 243 tadejm
  if (test_num == 8) // 
13701 209 tadejm
  begin
13702 243 tadejm
    // TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
13703
    test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
13704
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
13705 209 tadejm
 
13706
    // reset MAC registers
13707
    hard_reset;
13708
    // reset MAC and MII LOGIC with soft reset
13709 274 tadejm
//    reset_mac;
13710
//    reset_mii;
13711 209 tadejm
    // set wb slave response
13712
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13713
 
13714
    max_tmp = 0;
13715
    min_tmp = 0;
13716
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
13717 274 tadejm
    wait (wbm_working == 0);
13718 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13719
    // enable RX, set full-duplex mode, receive small, NO correct IFG
13720 274 tadejm
    wait (wbm_working == 0);
13721 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13722
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13723
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13724
    // prepare two packets of MAXFL length
13725 274 tadejm
    wait (wbm_working == 0);
13726 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13727
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13728
    min_tmp = tmp[31:16];
13729
    st_data = 8'hAC;
13730
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13731
    st_data = 8'h35;
13732
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13733
    // check WB INT signal
13734
    if (wb_int !== 1'b0)
13735
    begin
13736
      test_fail("WB INT signal should not be set");
13737
      fail = fail + 1;
13738
    end
13739 243 tadejm
    // unmask interrupts
13740 274 tadejm
    wait (wbm_working == 0);
13741 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13742
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13743 209 tadejm
 
13744
    // write to phy's control register for 10Mbps
13745
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
13746
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
13747
    speed = 10;
13748
 
13749 243 tadejm
    frame_ended = 0;
13750
    num_of_frames = 0;// 0; // 10;
13751
    num_of_bd = 120;
13752
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13753
    while ((i_length + 4) < 78) // (min_tmp - 4))
13754 209 tadejm
    begin
13755 243 tadejm
      // append CRC to packet
13756
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13757
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13758
      else if (num_of_frames > 4)
13759
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13760 209 tadejm
      // choose generating carrier sense and collision
13761
      case (i_length[1:0])
13762 243 tadejm
      2'h0:
13763 209 tadejm
      begin
13764
        // not detect carrier sense in FD and no collision
13765 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13766 209 tadejm
        eth_phy.collision(0);
13767
      end
13768 243 tadejm
      2'h1:
13769 209 tadejm
      begin
13770
        // detect carrier sense in FD and no collision
13771 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13772 209 tadejm
        eth_phy.collision(0);
13773
      end
13774 243 tadejm
      2'h2:
13775 209 tadejm
      begin
13776
        // not detect carrier sense in FD and set collision
13777 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13778 209 tadejm
        eth_phy.collision(1);
13779
      end
13780 243 tadejm
      default: // 2'h3:
13781 209 tadejm
      begin
13782
        // detect carrier sense in FD and set collision
13783 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13784 209 tadejm
        eth_phy.collision(1);
13785
      end
13786
      endcase
13787
      #1;
13788 243 tadejm
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13789 209 tadejm
      if (num_of_frames <= 9)
13790
      begin
13791 243 tadejm
        case (i_length[1:0])
13792
        2'h0: // Interrupt is generated
13793
        begin
13794
          // enable interrupt generation
13795
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13796
        end
13797
        2'h1: // Interrupt is generated
13798
        begin
13799
          // enable interrupt generation
13800
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13801
        end
13802
        2'h2: // Interrupt is generated
13803
        begin
13804
          // enable interrupt generation
13805
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13806
        end
13807
        default: // 2'h3: // Interrupt is generated
13808
        begin
13809
          // enable interrupt generation
13810
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13811
        end
13812
        endcase
13813 209 tadejm
        // set wrap bit
13814 243 tadejm
        set_rx_bd_wrap(120);
13815 209 tadejm
      end
13816 243 tadejm
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13817 209 tadejm
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13818
      begin
13819
        tmp_len = i_length; // length of frame
13820 243 tadejm
        tmp_bd_num = 120; // RX BD number
13821
        while (tmp_bd_num < 124) // 
13822 209 tadejm
        begin
13823
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13824
          if (tmp_len[0] == 0)
13825 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13826 209 tadejm
          else
13827 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13828
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13829 209 tadejm
          tmp_len = tmp_len + 1;
13830 243 tadejm
          // set RX BD number
13831 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13832
        end
13833
        // set wrap bit
13834 243 tadejm
        set_rx_bd_wrap(123);
13835 209 tadejm
      end
13836 243 tadejm
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13837 209 tadejm
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13838
      begin
13839
        tmp_len = i_length; // length of frame
13840 243 tadejm
        tmp_bd_num = 120; // RX BD number
13841
        while (tmp_bd_num < 125) // 
13842 209 tadejm
        begin
13843
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13844
          if (tmp_len[0] == 0)
13845 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13846 209 tadejm
          else
13847 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13848
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13849 209 tadejm
          tmp_len = tmp_len + 1;
13850 243 tadejm
          // set RX BD number
13851 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13852
        end
13853
        // set wrap bit
13854 243 tadejm
        set_rx_bd_wrap(124);
13855 209 tadejm
      end
13856 243 tadejm
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13857 209 tadejm
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13858
      begin
13859
        tmp_len = i_length; // length of frame
13860 243 tadejm
        tmp_bd_num = 120; // RX BD number
13861
        while (tmp_bd_num < 126) // 
13862 209 tadejm
        begin
13863
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13864
          if (tmp_len[0] == 0)
13865 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13866 209 tadejm
          else
13867 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13868
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13869 209 tadejm
          tmp_len = tmp_len + 1;
13870 243 tadejm
          // set RX BD number
13871 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13872
        end
13873
        // set wrap bit
13874 243 tadejm
        set_rx_bd_wrap(125);
13875 209 tadejm
      end
13876 243 tadejm
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13877 209 tadejm
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13878
      begin
13879
        tmp_len = i_length; // length of frame
13880 243 tadejm
        tmp_bd_num = 120; // RX BD number
13881
        while (tmp_bd_num < 127) // 
13882 209 tadejm
        begin
13883
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13884
          if (tmp_len[0] == 0)
13885 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13886 209 tadejm
          else
13887 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13888
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13889 209 tadejm
          tmp_len = tmp_len + 1;
13890 243 tadejm
          // set RX BD number
13891 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13892
        end
13893
        // set wrap bit
13894 243 tadejm
        set_rx_bd_wrap(126);
13895 209 tadejm
      end
13896 243 tadejm
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13897 209 tadejm
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13898
      begin
13899
        tmp_len = i_length; // length of frame
13900 243 tadejm
        tmp_bd_num = 120; // RX BD number
13901
        while (tmp_bd_num < 128) // 
13902 209 tadejm
        begin
13903
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13904
          if (tmp_len[0] == 0)
13905 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13906 209 tadejm
          else
13907 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13908
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13909 209 tadejm
          tmp_len = tmp_len + 1;
13910 243 tadejm
          // set RX BD number
13911 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13912
        end
13913
        // set wrap bit
13914 243 tadejm
        set_rx_bd_wrap(127);
13915 209 tadejm
      end
13916 243 tadejm
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13917
      else if (num_of_frames == 70)
13918
      begin
13919
        tmp_len = i_length; // length of frame
13920
        tmp_bd_num = 120; // RX BD number
13921
        while (tmp_bd_num < 128) // 
13922
        begin
13923
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13924
          if (tmp_len[0] == 0)
13925
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13926
          else
13927
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13928
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13929
          tmp_len = tmp_len + 1;
13930
          // set RX BD number
13931
          tmp_bd_num = tmp_bd_num + 1;
13932
        end
13933
        // set wrap bit
13934
        set_rx_bd_wrap(127);
13935
      end
13936 209 tadejm
      #1;
13937 243 tadejm
      // SET empty bit
13938 209 tadejm
      if (num_of_frames < 10)
13939 243 tadejm
        set_rx_bd_empty(120, 120);
13940 209 tadejm
      else if (num_of_frames < 14)
13941 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13942 209 tadejm
      else if (num_of_frames < 18)
13943 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13944 209 tadejm
      else if (num_of_frames < 23)
13945 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13946 209 tadejm
      else if (num_of_frames < 28)
13947 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13948 209 tadejm
      else if (num_of_frames < 34)
13949 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13950 209 tadejm
      else if (num_of_frames < 40)
13951 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13952 209 tadejm
      else if (num_of_frames < 47)
13953 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13954 209 tadejm
      else if (num_of_frames < 54)
13955 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13956 209 tadejm
      else if (num_of_frames < 62)
13957 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13958 209 tadejm
      else if (num_of_frames < 70)
13959 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13960
      else if (num_of_frames < 78)
13961
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13962
      // CHECK END OF RECEIVE
13963 252 tadejm
      // receive just preamble between some packets
13964
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
13965
      begin
13966
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
13967
        @(posedge mrx_clk);
13968
        wait (MRxDV === 1'b0); // end receive
13969
        repeat(10) @(posedge mrx_clk);
13970
        repeat(15) @(posedge wb_clk);
13971
      end
13972
      // receiving frames and checking end of them
13973 243 tadejm
      frame_ended = 0;
13974
      check_frame = 0;
13975 209 tadejm
      fork
13976
        begin
13977 243 tadejm
          if (i_length[0] == 1'b0)
13978
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13979
          else
13980
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13981
          repeat(10) @(posedge mrx_clk);
13982
        end
13983
        begin: fr_end1
13984
          wait (MRxDV === 1'b1); // start receive
13985
          #1 check_rx_bd(num_of_bd, data);
13986
          if (data[15] !== 1)
13987 209 tadejm
          begin
13988 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13989
            fail = fail + 1;
13990 209 tadejm
          end
13991 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13992
          while ((data[15] === 1) && (check_frame == 0))
13993
          begin
13994
            #1 check_rx_bd(num_of_bd, data);
13995
            @(posedge wb_clk);
13996
          end
13997
          if (data[15] === 0)
13998
            frame_ended = 1;
13999
          repeat (1) @(posedge wb_clk);
14000 209 tadejm
        end
14001 243 tadejm
        begin
14002
          wait (MRxDV === 1'b1); // start receive
14003
          wait (MRxDV === 1'b0); // end receive
14004
          repeat(10) @(posedge mrx_clk);
14005
          repeat(15) @(posedge wb_clk);
14006
          check_frame = 1;
14007
        end
14008
      join
14009
      // check length of a PACKET
14010
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
14011
           ((data[31:16] != 0) && (num_of_frames < 3)) )
14012
      begin
14013
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
14014
                        data[31:16], (i_length + 4));
14015
        test_fail("Wrong length of the packet out from PHY");
14016
        fail = fail + 1;
14017
      end
14018
      // check received RX packet data and CRC
14019
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
14020
      begin                                           // CRC has 4 bytes for itself
14021
        if (i_length[0] == 1'b0)
14022
        begin
14023
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
14024
        end
14025 209 tadejm
        else
14026
        begin
14027 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
14028 209 tadejm
        end
14029 243 tadejm
        if (tmp > 0)
14030
        begin
14031
          `TIME; $display("*E Wrong data of the received packet");
14032
          test_fail("Wrong data of the received packet");
14033
          fail = fail + 1;
14034
        end
14035 209 tadejm
      end
14036 243 tadejm
      // check WB INT signal
14037
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
14038
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
14039
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
14040
        begin
14041
          `TIME; $display("*E WB INT signal should be set");
14042
          test_fail("WB INT signal should be set");
14043
          fail = fail + 1;
14044
        end
14045
      end
14046
      else
14047
      begin
14048
        if (wb_int !== 1'b0)
14049
        begin
14050
          `TIME; $display("*E WB INT signal should not be set");
14051
          test_fail("WB INT signal should not be set");
14052
          fail = fail + 1;
14053
        end
14054
      end
14055
      // check RX buffer descriptor of a packet
14056 254 mohor
      // check RX buffer descriptor of a packet
14057 243 tadejm
      if (num_of_frames >= min_tmp)
14058
      begin
14059 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
14060
             (data[15:0] !== 16'h4080) ) // without wrap bit
14061 243 tadejm
        begin
14062
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14063
          test_fail("RX buffer descriptor status is not correct");
14064
          fail = fail + 1;
14065
        end
14066
      end
14067 254 mohor
      else if (num_of_frames > 6)
14068 243 tadejm
      begin
14069 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
14070
             (data[15:0] !== 16'h4084) ) // without wrap bit
14071
        begin
14072
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14073
          test_fail("RX buffer descriptor status is not correct");
14074
          fail = fail + 1;
14075
        end
14076
      end
14077
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
14078
      begin
14079 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
14080
             (data[15:0] !== 16'h4004) ) // without wrap bit
14081
        begin
14082
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14083
          test_fail("RX buffer descriptor status is not correct");
14084
          fail = fail + 1;
14085
        end
14086
      end
14087 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
14088 243 tadejm
      begin
14089
        if ( (data[15:0] !== 16'h6006) && // wrap bit
14090
             (data[15:0] !== 16'h4006) ) // without wrap bit
14091
        begin
14092
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14093
          test_fail("RX buffer descriptor status is not correct");
14094
          fail = fail + 1;
14095
        end
14096
      end
14097
      else
14098
      begin
14099
        if (data[15] !== 1'b1)
14100
        begin
14101
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14102
          test_fail("RX buffer descriptor status is not correct");
14103
          fail = fail + 1;
14104
        end
14105
      end
14106
      // check interrupts
14107 274 tadejm
      wait (wbm_working == 0);
14108 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14109 209 tadejm
      if (num_of_frames >= 5)
14110
      begin
14111 243 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
14112 209 tadejm
        begin
14113 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
14114
          test_fail("Interrupt Receive Buffer was not set");
14115
          fail = fail + 1;
14116 209 tadejm
        end
14117 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
14118 209 tadejm
        begin
14119 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
14120
          test_fail("Other interrupts (except Receive Buffer) were set");
14121
          fail = fail + 1;
14122 209 tadejm
        end
14123 243 tadejm
      end
14124
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
14125
      begin
14126
        if (data) // Checking if any interrupt is pending)
14127 209 tadejm
        begin
14128 243 tadejm
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
14129
          test_fail("Interrupts were set");
14130
          fail = fail + 1;
14131
        end
14132
      end
14133
      else
14134
      begin
14135
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
14136
        begin
14137
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
14138
          test_fail("Interrupt Receive Buffer Error was not set");
14139
          fail = fail + 1;
14140
        end
14141
        if ((data & (~`ETH_INT_RXE)) !== 0)
14142
        begin
14143
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
14144
          test_fail("Other interrupts (except Receive Buffer Error) were set");
14145
          fail = fail + 1;
14146
        end
14147
      end
14148
      // clear interrupts
14149 274 tadejm
      wait (wbm_working == 0);
14150 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14151
      // check WB INT signal
14152
      if (wb_int !== 1'b0)
14153
      begin
14154
        test_fail("WB INT signal should not be set");
14155
        fail = fail + 1;
14156
      end
14157
      // INTERMEDIATE DISPLAYS
14158
      if (num_of_frames == 3)
14159
      begin
14160
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14161
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
14162
                 0, 3);
14163
      end
14164
      else if (num_of_frames == 9)
14165
      begin
14166
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14167
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
14168
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14169
                 5, 9);
14170
      end
14171
      else if (num_of_frames == 17)
14172
      begin
14173
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
14174
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14175
                 10, 17);
14176
      end
14177
      else if (num_of_frames == 27)
14178
      begin
14179
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
14180
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14181
                 18, 27);
14182
      end
14183
      else if (num_of_frames == 40)
14184
      begin
14185
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
14186
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14187
                 28, 40);
14188
      end
14189
      else if (num_of_frames == 54)
14190
      begin
14191
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
14192
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14193
                 41, 54);
14194
      end
14195
      else if (num_of_frames == 69)
14196
      begin
14197
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14198
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14199
                 55, 69);
14200
      end
14201
      else if (num_of_frames == 69)
14202
      begin
14203
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14204
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14205
                 55, 69);
14206
      end
14207
      else if (num_of_frames == 77)
14208
      begin
14209
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14210
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14211
                 70, 77);
14212
      end
14213
      // set length (loop variable)
14214
      i_length = i_length + 1;
14215
      // the number of frame transmitted
14216
      num_of_frames = num_of_frames + 1;
14217
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
14218
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
14219
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
14220
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
14221
        num_of_bd = 120;
14222
      else
14223
        num_of_bd = num_of_bd + 1;
14224
    end
14225
    // disable RX
14226 274 tadejm
    wait (wbm_working == 0);
14227 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
14228
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14229
    @(posedge wb_clk);
14230
    if(fail == 0)
14231
      test_ok;
14232
    else
14233
      fail = 0;
14234
  end
14235
 
14236
 
14237
  ////////////////////////////////////////////////////////////////////
14238
  ////                                                            ////
14239
  ////  Test receive packets form 0 to (MINFL + 12) sizes at      ////
14240
  ////  8 RX buffer decriptors ( 100Mbps ).                       ////
14241
  ////                                                            ////
14242
  ////////////////////////////////////////////////////////////////////
14243
  if (test_num == 9) // 
14244
  begin
14245
    // TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
14246
    test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
14247
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
14248
 
14249
    // reset MAC registers
14250
    hard_reset;
14251
    // reset MAC and MII LOGIC with soft reset
14252 274 tadejm
//    reset_mac;
14253
//    reset_mii;
14254 243 tadejm
    // set wb slave response
14255
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14256
 
14257
    max_tmp = 0;
14258
    min_tmp = 0;
14259
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
14260 274 tadejm
    wait (wbm_working == 0);
14261 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14262
    // enable RX, set full-duplex mode, receive small, NO correct IFG
14263 274 tadejm
    wait (wbm_working == 0);
14264 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
14265
              `ETH_MODER_PRO | `ETH_MODER_BRO,
14266
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14267
    // prepare two packets of MAXFL length
14268 274 tadejm
    wait (wbm_working == 0);
14269 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14270
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
14271
    min_tmp = tmp[31:16];
14272
    st_data = 8'hAC;
14273
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
14274
    st_data = 8'h35;
14275
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
14276
    // check WB INT signal
14277
    if (wb_int !== 1'b0)
14278
    begin
14279
      test_fail("WB INT signal should not be set");
14280
      fail = fail + 1;
14281
    end
14282
    // unmask interrupts
14283 274 tadejm
    wait (wbm_working == 0);
14284 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14285
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14286
 
14287
    // write to phy's control register for 100Mbps
14288
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
14289
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
14290
    speed = 100;
14291
 
14292
    frame_ended = 0;
14293 252 tadejm
    num_of_frames = 0;// 0; // 10;
14294 243 tadejm
    num_of_bd = 120;
14295
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
14296
    while ((i_length + 4) < 78) // (min_tmp - 4))
14297
    begin
14298
      // append CRC to packet
14299 252 tadejm
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
14300 243 tadejm
        append_rx_crc (0, i_length, 1'b0, 1'b0);
14301 252 tadejm
      else if (num_of_frames > 4)
14302 243 tadejm
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
14303
      // choose generating carrier sense and collision
14304
      case (i_length[1:0])
14305
      2'h0:
14306
      begin
14307
        // not detect carrier sense in FD and no collision
14308
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14309
        eth_phy.collision(0);
14310
      end
14311
      2'h1:
14312
      begin
14313
        // detect carrier sense in FD and no collision
14314
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14315
        eth_phy.collision(0);
14316
      end
14317
      2'h2:
14318
      begin
14319
        // not detect carrier sense in FD and set collision
14320
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14321
        eth_phy.collision(1);
14322
      end
14323
      default: // 2'h3:
14324
      begin
14325
        // detect carrier sense in FD and set collision
14326
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14327
        eth_phy.collision(1);
14328
      end
14329
      endcase
14330
      #1;
14331
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
14332
      if (num_of_frames <= 9)
14333
      begin
14334
        case (i_length[1:0])
14335
        2'h0: // Interrupt is generated
14336
        begin
14337
          // enable interrupt generation
14338
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14339
        end
14340
        2'h1: // Interrupt is generated
14341
        begin
14342
          // enable interrupt generation
14343
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14344
        end
14345
        2'h2: // Interrupt is generated
14346
        begin
14347
          // enable interrupt generation
14348
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14349
        end
14350
        default: // 2'h3: // Interrupt is generated
14351
        begin
14352
          // enable interrupt generation
14353
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14354
        end
14355
        endcase
14356
        // set wrap bit
14357
        set_rx_bd_wrap(120);
14358
      end
14359
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
14360
      else if ((num_of_frames == 10) || (num_of_frames == 14))
14361
      begin
14362
        tmp_len = i_length; // length of frame
14363
        tmp_bd_num = 120; // RX BD number
14364
        while (tmp_bd_num < 124) // 
14365
        begin
14366
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14367
          if (tmp_len[0] == 0)
14368
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14369
          else
14370
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14371
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14372
          tmp_len = tmp_len + 1;
14373
          // set RX BD number
14374
          tmp_bd_num = tmp_bd_num + 1;
14375
        end
14376
        // set wrap bit
14377
        set_rx_bd_wrap(123);
14378
      end
14379
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
14380
      else if ((num_of_frames == 18) || (num_of_frames == 23))
14381
      begin
14382
        tmp_len = i_length; // length of frame
14383
        tmp_bd_num = 120; // RX BD number
14384
        while (tmp_bd_num < 125) // 
14385
        begin
14386
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14387
          if (tmp_len[0] == 0)
14388
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14389
          else
14390
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14391
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14392
          tmp_len = tmp_len + 1;
14393
          // set RX BD number
14394
          tmp_bd_num = tmp_bd_num + 1;
14395
        end
14396
        // set wrap bit
14397
        set_rx_bd_wrap(124);
14398
      end
14399
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
14400
      else if ((num_of_frames == 28) || (num_of_frames == 34))
14401
      begin
14402
        tmp_len = i_length; // length of frame
14403
        tmp_bd_num = 120; // RX BD number
14404
        while (tmp_bd_num < 126) // 
14405
        begin
14406
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14407
          if (tmp_len[0] == 0)
14408
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14409
          else
14410
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14411
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14412
          tmp_len = tmp_len + 1;
14413
          // set RX BD number
14414
          tmp_bd_num = tmp_bd_num + 1;
14415
        end
14416
        // set wrap bit
14417
        set_rx_bd_wrap(125);
14418
      end
14419
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
14420
      else if ((num_of_frames == 40) || (num_of_frames == 47))
14421
      begin
14422
        tmp_len = i_length; // length of frame
14423
        tmp_bd_num = 120; // RX BD number
14424
        while (tmp_bd_num < 127) // 
14425
        begin
14426
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14427
          if (tmp_len[0] == 0)
14428
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14429
          else
14430
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14431
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14432
          tmp_len = tmp_len + 1;
14433
          // set RX BD number
14434
          tmp_bd_num = tmp_bd_num + 1;
14435
        end
14436
        // set wrap bit
14437
        set_rx_bd_wrap(126);
14438
      end
14439
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
14440
      else if ((num_of_frames == 54) || (num_of_frames == 62))
14441
      begin
14442
        tmp_len = i_length; // length of frame
14443
        tmp_bd_num = 120; // RX BD number
14444
        while (tmp_bd_num < 128) // 
14445
        begin
14446
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14447
          if (tmp_len[0] == 0)
14448
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14449
          else
14450
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14451
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14452
          tmp_len = tmp_len + 1;
14453
          // set RX BD number
14454
          tmp_bd_num = tmp_bd_num + 1;
14455
        end
14456
        // set wrap bit
14457
        set_rx_bd_wrap(127);
14458
      end
14459
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
14460
      else if (num_of_frames == 70)
14461
      begin
14462
        tmp_len = i_length; // length of frame
14463
        tmp_bd_num = 120; // RX BD number
14464
        while (tmp_bd_num < 128) // 
14465
        begin
14466
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14467
          if (tmp_len[0] == 0)
14468
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14469
          else
14470
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14471
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14472
          tmp_len = tmp_len + 1;
14473
          // set RX BD number
14474
          tmp_bd_num = tmp_bd_num + 1;
14475
        end
14476
        // set wrap bit
14477
        set_rx_bd_wrap(127);
14478
      end
14479
      #1;
14480
      // SET empty bit
14481
      if (num_of_frames < 10)
14482
        set_rx_bd_empty(120, 120);
14483
      else if (num_of_frames < 14)
14484
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
14485
      else if (num_of_frames < 18)
14486
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
14487
      else if (num_of_frames < 23)
14488
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
14489
      else if (num_of_frames < 28)
14490
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
14491
      else if (num_of_frames < 34)
14492
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
14493
      else if (num_of_frames < 40)
14494
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
14495
      else if (num_of_frames < 47)
14496
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
14497
      else if (num_of_frames < 54)
14498
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
14499
      else if (num_of_frames < 62)
14500
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
14501
      else if (num_of_frames < 70)
14502
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
14503
      else if (num_of_frames < 78)
14504
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
14505
      // CHECK END OF RECEIVE
14506 252 tadejm
      // receive just preamble between some packets
14507
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
14508
      begin
14509
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
14510
        @(posedge mrx_clk);
14511
        wait (MRxDV === 1'b0); // end receive
14512
        repeat(10) @(posedge mrx_clk);
14513
        repeat(15) @(posedge wb_clk);
14514
      end
14515
      // receiving frames and checking end of them
14516 243 tadejm
      frame_ended = 0;
14517
      check_frame = 0;
14518
      fork
14519
        begin
14520
          if (i_length[0] == 1'b0)
14521
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
14522
          else
14523
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
14524
          repeat(10) @(posedge mrx_clk);
14525
        end
14526 254 mohor
        begin: fr_end2
14527 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14528
          #1 check_rx_bd(num_of_bd, data);
14529
          if (data[15] !== 1)
14530 209 tadejm
          begin
14531 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
14532 209 tadejm
            fail = fail + 1;
14533
          end
14534 243 tadejm
          wait (MRxDV === 1'b0); // end receive
14535
          while ((data[15] === 1) && (check_frame == 0))
14536
          begin
14537
            #1 check_rx_bd(num_of_bd, data);
14538
            @(posedge wb_clk);
14539
          end
14540
          if (data[15] === 0)
14541
            frame_ended = 1;
14542
          repeat (1) @(posedge wb_clk);
14543 209 tadejm
        end
14544
        begin
14545 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14546
          wait (MRxDV === 1'b0); // end receive
14547
          repeat(10) @(posedge mrx_clk);
14548
          repeat(15) @(posedge wb_clk);
14549
          check_frame = 1;
14550 209 tadejm
        end
14551 243 tadejm
      join
14552
      // check length of a PACKET
14553 252 tadejm
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
14554
           ((data[31:16] != 0) && (num_of_frames < 3)) )
14555 243 tadejm
      begin
14556
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
14557
                        data[31:16], (i_length + 4));
14558
        test_fail("Wrong length of the packet out from PHY");
14559
        fail = fail + 1;
14560
      end
14561
      // check received RX packet data and CRC
14562 252 tadejm
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
14563
      begin                                           // CRC has 4 bytes for itself
14564 243 tadejm
        if (i_length[0] == 1'b0)
14565 209 tadejm
        begin
14566 243 tadejm
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
14567 209 tadejm
        end
14568 243 tadejm
        else
14569 209 tadejm
        begin
14570 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
14571 209 tadejm
        end
14572
        if (tmp > 0)
14573
        begin
14574 243 tadejm
          `TIME; $display("*E Wrong data of the received packet");
14575
          test_fail("Wrong data of the received packet");
14576 209 tadejm
          fail = fail + 1;
14577
        end
14578
      end
14579
      // check WB INT signal
14580 252 tadejm
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
14581
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
14582
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
14583 209 tadejm
        begin
14584
          `TIME; $display("*E WB INT signal should be set");
14585
          test_fail("WB INT signal should be set");
14586
          fail = fail + 1;
14587
        end
14588
      end
14589 252 tadejm
      else
14590 209 tadejm
      begin
14591
        if (wb_int !== 1'b0)
14592
        begin
14593
          `TIME; $display("*E WB INT signal should not be set");
14594
          test_fail("WB INT signal should not be set");
14595
          fail = fail + 1;
14596
        end
14597
      end
14598 243 tadejm
      // check RX buffer descriptor of a packet
14599
      if (num_of_frames >= min_tmp)
14600
      begin
14601 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
14602
             (data[15:0] !== 16'h4080) ) // without wrap bit
14603 209 tadejm
        begin
14604 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14605
          test_fail("RX buffer descriptor status is not correct");
14606
          fail = fail + 1;
14607 209 tadejm
        end
14608 243 tadejm
      end
14609 254 mohor
      else if (num_of_frames > 6)
14610 243 tadejm
      begin
14611 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
14612
             (data[15:0] !== 16'h4084) ) // without wrap bit
14613
        begin
14614
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14615
          test_fail("RX buffer descriptor status is not correct");
14616
          fail = fail + 1;
14617
        end
14618
      end
14619
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
14620
      begin
14621 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
14622
             (data[15:0] !== 16'h4004) ) // without wrap bit
14623 209 tadejm
        begin
14624 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14625
          test_fail("RX buffer descriptor status is not correct");
14626
          fail = fail + 1;
14627 209 tadejm
        end
14628
      end
14629 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
14630 243 tadejm
      begin
14631
        if ( (data[15:0] !== 16'h6006) && // wrap bit
14632
             (data[15:0] !== 16'h4006) ) // without wrap bit
14633
        begin
14634
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14635
          test_fail("RX buffer descriptor status is not correct");
14636
          fail = fail + 1;
14637
        end
14638
      end
14639 209 tadejm
      else
14640
      begin
14641
        if (data[15] !== 1'b1)
14642
        begin
14643 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14644
          test_fail("RX buffer descriptor status is not correct");
14645 209 tadejm
          fail = fail + 1;
14646
        end
14647
      end
14648
      // check interrupts
14649 274 tadejm
      wait (wbm_working == 0);
14650 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14651 252 tadejm
      if (num_of_frames >= 5)
14652 209 tadejm
      begin
14653 252 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
14654 209 tadejm
        begin
14655 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
14656
          test_fail("Interrupt Receive Buffer was not set");
14657 209 tadejm
          fail = fail + 1;
14658
        end
14659 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
14660 209 tadejm
        begin
14661 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
14662
          test_fail("Other interrupts (except Receive Buffer) were set");
14663 209 tadejm
          fail = fail + 1;
14664
        end
14665
      end
14666 252 tadejm
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
14667
      begin
14668
        if (data) // Checking if any interrupt is pending)
14669
        begin
14670
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
14671
          test_fail("Interrupts were set");
14672
          fail = fail + 1;
14673
        end
14674
      end
14675 209 tadejm
      else
14676
      begin
14677 252 tadejm
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
14678 209 tadejm
        begin
14679 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
14680
          test_fail("Interrupt Receive Buffer Error was not set");
14681 209 tadejm
          fail = fail + 1;
14682
        end
14683 243 tadejm
        if ((data & (~`ETH_INT_RXE)) !== 0)
14684
        begin
14685
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
14686
          test_fail("Other interrupts (except Receive Buffer Error) were set");
14687
          fail = fail + 1;
14688
        end
14689 209 tadejm
      end
14690
      // clear interrupts
14691 274 tadejm
      wait (wbm_working == 0);
14692 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14693
      // check WB INT signal
14694
      if (wb_int !== 1'b0)
14695
      begin
14696
        test_fail("WB INT signal should not be set");
14697
        fail = fail + 1;
14698
      end
14699
      // INTERMEDIATE DISPLAYS
14700 243 tadejm
      if (num_of_frames == 3)
14701 209 tadejm
      begin
14702 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14703
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
14704 209 tadejm
                 0, 3);
14705
      end
14706 243 tadejm
      else if (num_of_frames == 9)
14707 209 tadejm
      begin
14708 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14709
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
14710 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14711
                 5, 9);
14712
      end
14713 243 tadejm
      else if (num_of_frames == 17)
14714 209 tadejm
      begin
14715 243 tadejm
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
14716 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14717
                 10, 17);
14718
      end
14719 243 tadejm
      else if (num_of_frames == 27)
14720 209 tadejm
      begin
14721 243 tadejm
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
14722 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14723
                 18, 27);
14724
      end
14725 243 tadejm
      else if (num_of_frames == 40)
14726 209 tadejm
      begin
14727 243 tadejm
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
14728 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14729
                 28, 40);
14730
      end
14731 243 tadejm
      else if (num_of_frames == 54)
14732 209 tadejm
      begin
14733 243 tadejm
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
14734 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14735
                 41, 54);
14736
      end
14737 243 tadejm
      else if (num_of_frames == 69)
14738 209 tadejm
      begin
14739 243 tadejm
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14740 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14741
                 55, 69);
14742
      end
14743 243 tadejm
      else if (num_of_frames == 69)
14744
      begin
14745
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14746
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14747
                 55, 69);
14748
      end
14749
      else if (num_of_frames == 77)
14750
      begin
14751
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14752
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14753
                 70, 77);
14754
      end
14755 209 tadejm
      // set length (loop variable)
14756
      i_length = i_length + 1;
14757
      // the number of frame transmitted
14758
      num_of_frames = num_of_frames + 1;
14759
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
14760
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
14761
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
14762 243 tadejm
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
14763
        num_of_bd = 120;
14764 209 tadejm
      else
14765
        num_of_bd = num_of_bd + 1;
14766
    end
14767 243 tadejm
    // disable RX
14768 274 tadejm
    wait (wbm_working == 0);
14769 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
14770
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14771
    @(posedge wb_clk);
14772
    if(fail == 0)
14773
      test_ok;
14774
    else
14775
      fail = 0;
14776
  end
14777
 
14778
 
14779 243 tadejm
  ////////////////////////////////////////////////////////////////////
14780
  ////                                                            ////
14781
  ////  Test receive packet synchronization with receive          ////
14782
  ////  disable/enable ( 10Mbps ).                                ////
14783
  ////                                                            ////
14784
  ////////////////////////////////////////////////////////////////////
14785
  if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
14786
  begin
14787
    // TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14788
    test_name   = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14789
    `TIME; $display("  TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14790 209 tadejm
 
14791 243 tadejm
 
14792
 
14793
 
14794
 
14795
 
14796
  end
14797
 
14798
 
14799
  ////////////////////////////////////////////////////////////////////
14800
  ////                                                            ////
14801
  ////  Test receive packet synchronization with receive          ////
14802
  ////  disable/enable ( 10Mbps ).                                ////
14803
  ////                                                            ////
14804
  ////////////////////////////////////////////////////////////////////
14805
  if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
14806
  begin
14807
    // TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14808
    test_name   = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14809
    `TIME; $display("  TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14810
 
14811
 
14812
 
14813
 
14814
 
14815
 
14816
  end
14817
 
14818
 
14819
  ////////////////////////////////////////////////////////////////////
14820
  ////                                                            ////
14821
  ////  Test receive packet synchronization with receive          ////
14822
  ////  disable/enable ( 10Mbps ).                                ////
14823
  ////                                                            ////
14824
  ////////////////////////////////////////////////////////////////////
14825
  if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
14826
  begin
14827
    // TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14828
    test_name   = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14829
    `TIME; $display("  TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14830
 
14831
 
14832
 
14833
 
14834
 
14835
 
14836
  end
14837
 
14838
 
14839
  ////////////////////////////////////////////////////////////////////
14840
  ////                                                            ////
14841
  ////  Test receive packet synchronization with receive          ////
14842
  ////  disable/enable ( 10Mbps ).                                ////
14843
  ////                                                            ////
14844
  ////////////////////////////////////////////////////////////////////
14845
  if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
14846
  begin
14847
    // TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14848
    test_name   = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14849
    `TIME; $display("  TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14850
 
14851
 
14852
 
14853
 
14854
 
14855
 
14856
  end
14857
 
14858
 
14859
 
14860 209 tadejm
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14861
 
14862
end
14863
endtask // test_mac_full_duplex_receive
14864
 
14865
 
14866 263 mohor
task test_mac_full_duplex_flow_control;
14867 209 tadejm
  input  [31:0]  start_task;
14868
  input  [31:0]  end_task;
14869
  integer        bit_start_1;
14870
  integer        bit_end_1;
14871
  integer        bit_start_2;
14872
  integer        bit_end_2;
14873
  integer        num_of_reg;
14874
  integer        num_of_frames;
14875 274 tadejm
  integer        num_of_rx_frames;
14876 209 tadejm
  integer        num_of_bd;
14877
  integer        i_addr;
14878
  integer        i_data;
14879
  integer        i_length;
14880
  integer        tmp_len;
14881
  integer        tmp_bd;
14882
  integer        tmp_bd_num;
14883
  integer        tmp_data;
14884
  integer        tmp_ipgt;
14885
  integer        test_num;
14886 274 tadejm
  integer        rx_len;
14887
  integer        tx_len;
14888 209 tadejm
  reg    [31:0]  tx_bd_num;
14889 274 tadejm
  reg    [31:0]  rx_bd_num;
14890 209 tadejm
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
14891
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
14892
  integer        i;
14893
  integer        i1;
14894
  integer        i2;
14895
  integer        i3;
14896
  integer        fail;
14897
  integer        speed;
14898 260 mohor
  integer        mac_hi_addr;
14899
  integer        mac_lo_addr;
14900 209 tadejm
  reg            frame_started;
14901
  reg            frame_ended;
14902
  reg            wait_for_frame;
14903
  reg    [31:0]  addr;
14904
  reg    [31:0]  data;
14905
  reg    [31:0]  tmp;
14906
  reg    [ 7:0]  st_data;
14907
  reg    [15:0]  max_tmp;
14908
  reg    [15:0]  min_tmp;
14909 263 mohor
  reg            PassAll;
14910
  reg            RxFlow;
14911 266 mohor
  reg            enable_irq_in_rxbd;
14912 267 mohor
  reg    [15:0]  pause_value;
14913 274 tadejm
 
14914 209 tadejm
begin
14915 263 mohor
// MAC FULL DUPLEX FLOW CONTROL TEST
14916
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
14917 209 tadejm
$display(" ");
14918 263 mohor
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
14919 209 tadejm
fail = 0;
14920
 
14921
// reset MAC registers
14922
hard_reset;
14923
// reset MAC and MII LOGIC with soft reset
14924 274 tadejm
//reset_mac;
14925
//reset_mii;
14926 209 tadejm
// set wb slave response
14927
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14928
 
14929
  /*
14930
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
14931
  -------------------------------------------------------------------------------------
14932
  set_tx_bd
14933
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
14934
  set_tx_bd_wrap
14935
    (tx_bd_num_end[6:0]);
14936
  set_tx_bd_ready
14937
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14938
  check_tx_bd
14939
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
14940
  clear_tx_bd
14941
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14942
 
14943
  TASKS for set and control RX buffer descriptors:
14944
  ------------------------------------------------
14945
  set_rx_bd
14946
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
14947
  set_rx_bd_wrap
14948
    (rx_bd_num_end[6:0]);
14949
  set_rx_bd_empty
14950
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14951
  check_rx_bd
14952
    (rx_bd_num_end[6:0], rx_bd_status);
14953
  clear_rx_bd
14954
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14955
 
14956
  TASKS for set and check TX packets:
14957
  -----------------------------------
14958
  set_tx_packet
14959
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
14960
  check_tx_packet
14961
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
14962
 
14963
  TASKS for set and check RX packets:
14964
  -----------------------------------
14965
  set_rx_packet
14966
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
14967
  check_rx_packet
14968
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
14969
 
14970
  TASKS for append and check CRC to/of TX packet:
14971
  -----------------------------------------------
14972
  append_tx_crc
14973
    (txpnt_wb[31:0], len[15:0], negated_crc);
14974
  check_tx_crc
14975
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
14976
 
14977
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
14978
  --------------------------------------------------------------------------------
14979
  append_rx_crc
14980
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
14981
  */
14982
 
14983
//////////////////////////////////////////////////////////////////////
14984
////                                                              ////
14985 263 mohor
////  test_mac_full_duplex_flow_control:                          ////
14986 209 tadejm
////                                                              ////
14987
////  0: Test                                                     ////
14988
////                                                              ////
14989
//////////////////////////////////////////////////////////////////////
14990 260 mohor
 
14991 209 tadejm
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
14992
begin
14993
 
14994
  ////////////////////////////////////////////////////////////////////
14995
  ////                                                            ////
14996 254 mohor
  ////  Test inserts control frames while transmitting normal     ////
14997
  ////  frames. Using 4 TX buffer decriptors ( 10Mbps ).          ////
14998 209 tadejm
  ////                                                            ////
14999
  ////////////////////////////////////////////////////////////////////
15000 254 mohor
  if (test_num == 0) // 
15001 209 tadejm
  begin
15002 254 mohor
    // TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )
15003
    test_name = "TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )";
15004
    `TIME; $display("  TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )");
15005 260 mohor
 
15006 254 mohor
    // reset MAC completely
15007
    hard_reset;
15008
    // set wb slave response
15009
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
15010
    max_tmp = 0;
15011
    min_tmp = 0;
15012
    // set 4 TX buffer descriptors - must be set before TX enable
15013
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15014
    // enable TX, set full-duplex mode, padding and CRC appending
15015
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
15016
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15017
    // enable TX flow control
15018
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15019 260 mohor
    // Set MAC address
15020
    mac_hi_addr = 32'h00000001;
15021
    mac_lo_addr = 32'h02030405;
15022
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15023
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15024 254 mohor
    // prepare two packets of MAXFL length
15025
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15026
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
15027
    min_tmp = tmp[31:16];
15028 260 mohor
    st_data = 8'h34;
15029 254 mohor
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15030 260 mohor
    st_data = 8'h56;
15031 254 mohor
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15032
    // check WB INT signal
15033
    if (wb_int !== 1'b0)
15034
    begin
15035
      test_fail("WB INT signal should not be set");
15036
      fail = fail + 1;
15037
    end
15038
 
15039
    // write to phy's control register for 10Mbps
15040
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
15041
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
15042
    speed = 10;
15043
 
15044
    frame_started = 0;
15045
    num_of_frames = 0;
15046
    num_of_bd = 0;
15047
    i_length = 0; // 0;
15048 260 mohor
    // Initialize one part of memory with data of control packet
15049
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
15050
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
15051
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
15052
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
15053
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
15054
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
15055
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
15056
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
15057
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
15058
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
15059
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
15060
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
15061
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
15062
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
15063
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
15064
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
15065 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15066
    // In the following section, control frame will be sent while no other transmission is in progress.//
15067
    // TXC interrupt won't be unmasked.                                                                //
15068
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15069 274 tadejm
    // check interrupts
15070 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15071
    if(data)
15072
      begin
15073
        test_fail("IRQ already pending!");
15074
        fail = fail + 1;
15075
        `TIME; $display("*E IRQ already pending!");
15076
      end
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 260 mohor
    // first destination address on ethernet PHY
15084
    eth_phy.set_tx_mem_addr(0);
15085
    // Request sending the control frame with pause value = 0x1111
15086
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15087 274 tadejm
    // wait for transmission to come over
15088 254 mohor
    wait (MTxEn === 1'b1); // start transmit
15089
    wait (MTxEn === 1'b0); // end transmit
15090
    repeat(10) @ (posedge wb_clk);  // wait some time
15091
    repeat(10) @ (posedge mtx_clk); // wait some time
15092 274 tadejm
    // check interrupt
15093 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15094
    if(data !== `ETH_INT_TXC)
15095
      begin
15096
        test_fail("TXC IRQ should be set!");
15097
        fail = fail + 1;
15098
        `TIME; $display("*E TXC IRQ should be set!");
15099
      end
15100
    if (wb_int)
15101
    begin
15102
      test_fail("WB INT signal should not be set because TXC irq is masked!");
15103
      fail = fail + 1;
15104
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
15105
    end
15106
    // Clear TXC interrupt
15107
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15108
    if (wb_int)
15109
    begin
15110
      test_fail("WB INT signal should not be set!");
15111
      fail = fail + 1;
15112
      `TIME; $display("*E WB INT signal should not be set!");
15113
    end
15114 274 tadejm
    // check transmited TX packet
15115 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15116
    if (tmp > 0)
15117
    begin
15118
      $display("Wrong data of the transmitted packet");
15119
      test_fail("Wrong data of the transmitted packet");
15120
      fail = fail + 1;
15121
    end
15122
    // check transmited TX packet CRC
15123
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15124
    if (tmp > 0)
15125
    begin
15126
      $display("Wrong CRC of the transmitted packet");
15127
      test_fail("Wrong CRC of the transmitted packet");
15128
      fail = fail + 1;
15129
    end
15130 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15131
    // In the following section, control frame will be sent while no other transmission is in progress.//
15132
    // TXC interrupt is unmasked.                                                                      //
15133
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15134
    // unmask all interrupts
15135
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15136
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15137 274 tadejm
    // check interrupts
15138 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15139
    if(data)
15140
      begin
15141
        test_fail("IRQ already pending!");
15142
        fail = fail + 1;
15143
        `TIME; $display("*E IRQ already pending!");
15144
      end
15145
    if (wb_int)
15146
    begin
15147
      test_fail("WB INT signal should not be set!");
15148
      fail = fail + 1;
15149
      `TIME; $display("*E WB INT signal should not be set!");
15150
    end
15151
    // unmask only TXC interrupts
15152
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15153 260 mohor
    // first destination address on ethernet PHY
15154
    eth_phy.set_tx_mem_addr(0);
15155
    // Request sending the control frame with pause value = 0x2222
15156
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
15157
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15158 274 tadejm
    // wait for transmit to come over
15159 254 mohor
    wait (MTxEn === 1'b1); // start transmit
15160
    wait (MTxEn === 1'b0); // end transmit
15161
    repeat(10) @ (posedge wb_clk);  // wait some time
15162
    repeat(10) @ (posedge mtx_clk); // wait some time
15163 274 tadejm
    // check INT
15164 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15165
    if(data !== `ETH_INT_TXC)
15166
      begin
15167
        test_fail("TXC IRQ should be set!");
15168
        fail = fail + 1;
15169
        `TIME; $display("*E TXC IRQ should be set!");
15170
      end
15171
    if (!wb_int)
15172
    begin
15173
      test_fail("WB INT signal should be set!");
15174
      fail = fail + 1;
15175
      `TIME; $display("*E WB INT signal should be set!");
15176
    end
15177
    // Clear TXC interrupt
15178
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15179
    if (wb_int)
15180
    begin
15181
      test_fail("WB INT signal should not be set!");
15182
      fail = fail + 1;
15183
      `TIME; $display("*E WB INT signal should not be set!");
15184
    end
15185 274 tadejm
    // check transmited TX packet
15186 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15187
    if (tmp > 0)
15188
    begin
15189
      $display("Wrong data of the transmitted packet");
15190
      test_fail("Wrong data of the transmitted packet");
15191
      fail = fail + 1;
15192
    end
15193
    // check transmited TX packet CRC
15194
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15195
    if (tmp > 0)
15196
    begin
15197
      $display("Wrong CRC of the transmitted packet");
15198
      test_fail("Wrong CRC of the transmitted packet");
15199
      fail = fail + 1;
15200
    end
15201 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15202 260 mohor
    // In the following section, control frame sending is requested while no other transmission        //
15203
    // is in progress. TXC interrupt is unmasked.                                                      //
15204 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15205
    // unmask all interrupts
15206
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15207
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15208
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15209
    if(data)
15210
      begin
15211
        test_fail("IRQ already pending!");
15212
        fail = fail + 1;
15213
        `TIME; $display("*E IRQ already pending!");
15214
      end
15215
    if (wb_int)
15216
    begin
15217
      test_fail("WB INT signal should not be set!");
15218
      fail = fail + 1;
15219
      `TIME; $display("*E WB INT signal should not be set!");
15220
    end
15221 260 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15222
    // In the following section, control frame request and data send request are both set. At the      //
15223
    // beginning control frame request will be faster than data send request, later the opposite.      //
15224
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15225
    for (i=0; i<32; i=i+1)
15226
    begin
15227
      // Request sending the control frame with pause value = 0x5678
15228
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
15229
      set_tx_bd_wrap(0);
15230
      // first destination address on ethernet PHY
15231
      eth_phy.set_tx_mem_addr(0);
15232
      set_tx_bd_ready(0, 0);
15233 274 tadejm
      // wait for transmission to start  
15234 260 mohor
      wait (MTxEn === 1'b1); // start transmit
15235
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
15236
      // Send control frame request
15237
      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
15238
      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);
15239 274 tadejm
      // wait until transmission is over  
15240 260 mohor
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15241
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15242
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15243
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15244
      // first destination address on ethernet PHY
15245
      eth_phy.set_tx_mem_addr(0);
15246 274 tadejm
      // check interrupt depending on which packet was sent
15247 260 mohor
      if(tmp_len == 64)  // Control frame
15248 254 mohor
      begin
15249 260 mohor
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15250
        if(data !== `ETH_INT_TXC)
15251
        begin
15252
          test_fail("TXC IRQ should be set!");
15253
          fail = fail + 1;
15254
          `TIME; $display("*E TXC IRQ should be set!");
15255
          `TIME; $display("ETH_INT = 0x%0x", data);
15256
        end
15257
      end
15258
      else
15259
      begin
15260
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15261
        if(data !== `ETH_INT_TXB)
15262
        begin
15263
          test_fail("TXB IRQ should be set!");
15264
          fail = fail + 1;
15265
          `TIME; $display("*E TXB IRQ should be set!");
15266
          `TIME; $display("ETH_INT = 0x%0x", data);
15267
        end
15268
      end
15269 274 tadejm
      // check transmited TX packet
15270 260 mohor
      if(tmp_len == 64)  // Control frame
15271
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15272
      else
15273
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15274
      if (tmp > 0)
15275
      begin
15276
        $display("Wrong data of the transmitted packet");
15277
        test_fail("Wrong data of the transmitted packet");
15278 254 mohor
        fail = fail + 1;
15279
      end
15280 260 mohor
      // check transmited TX packet CRC
15281
      if(tmp_len == 64)  // Control frame
15282
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15283
      else
15284
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15285
 
15286
      if (tmp > 0)
15287 254 mohor
      begin
15288 260 mohor
        $display("Wrong CRC of the transmitted packet");
15289
        test_fail("Wrong CRC of the transmitted packet");
15290
        fail = fail + 1;
15291
      end
15292 274 tadejm
      // wait for control frame to transmit
15293 260 mohor
      wait (MTxEn === 1'b1); // start transmit of the control frame
15294
      wait (MTxEn === 1'b0); // end transmit of the control frame
15295
      repeat(10) @ (posedge wb_clk);  // wait some time
15296
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15297 274 tadejm
      // check interrupts  
15298 260 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15299
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15300
      begin
15301 254 mohor
        test_fail("TXC and TXB IRQ should be set!");
15302
        fail = fail + 1;
15303 260 mohor
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15304 254 mohor
      end
15305 260 mohor
      if (!wb_int)
15306
      begin
15307
        test_fail("WB INT signal should be set!");
15308
        fail = fail + 1;
15309
        `TIME; $display("*E WB INT signal should be set!");
15310
      end
15311
      // Clear TXC and TXB interrupt
15312
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15313
      if (wb_int)
15314
      begin
15315
        test_fail("WB INT signal should not be set!");
15316
        fail = fail + 1;
15317
        `TIME; $display("*E WB INT signal should not be set!");
15318
      end
15319
      if(tmp_len == 64)  // Control frame
15320
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15321
      else
15322
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15323
      if (tmp > 0)
15324
      begin
15325
        $display("Wrong data of the transmitted packet");
15326
        test_fail("Wrong data of the transmitted packet");
15327
        fail = fail + 1;
15328
      end
15329
      // check transmited TX packet CRC
15330
      if(tmp_len == 64)  // Control frame
15331
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15332
      else
15333
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15334
      if (tmp > 0)
15335
      begin
15336
        $display("Wrong CRC of the transmitted packet");
15337
        test_fail("Wrong CRC of the transmitted packet");
15338
        fail = fail + 1;
15339
      end
15340
    end // for loop
15341
    if(fail == 0)
15342
      test_ok;
15343
    else
15344
      fail = 0;
15345
  end
15346 254 mohor
 
15347
 
15348 274 tadejm
  ////////////////////////////////////////////////////////////////////
15349
  ////                                                            ////
15350
  ////  Test inserts control frames while transmitting normal     ////
15351
  ////  frames. Using 4 TX buffer decriptors ( 100Mbps ).         ////
15352
  ////                                                            ////
15353
  ////////////////////////////////////////////////////////////////////
15354 263 mohor
  if (test_num == 1) // 
15355
  begin
15356
    // TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
15357
    test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
15358
    `TIME; $display("  TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
15359 274 tadejm
 
15360
    // reset MAC completely
15361
    hard_reset;
15362
    // set wb slave response
15363
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
15364
    max_tmp = 0;
15365
    min_tmp = 0;
15366
    // set 4 TX buffer descriptors - must be set before TX enable
15367
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15368
    // enable TX, set full-duplex mode, padding and CRC appending
15369
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
15370
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15371
    // enable TX flow control
15372
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15373
    // Set MAC address
15374
    mac_hi_addr = 32'h00000001;
15375
    mac_lo_addr = 32'h02030405;
15376
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15377
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15378
    // prepare two packets of MAXFL length
15379
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15380
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
15381
    min_tmp = tmp[31:16];
15382
    st_data = 8'h34;
15383
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15384
    st_data = 8'h56;
15385
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15386
    // check WB INT signal
15387
    if (wb_int !== 1'b0)
15388
    begin
15389
      test_fail("WB INT signal should not be set");
15390
      fail = fail + 1;
15391
    end
15392
 
15393
    // write to phy's control register for 100Mbps
15394
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
15395
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
15396
    speed = 100;
15397
 
15398
    frame_started = 0;
15399
    num_of_frames = 0;
15400
    num_of_bd = 0;
15401
    i_length = 0; // 0;
15402
    // Initialize one part of memory with data of control packet
15403
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
15404
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
15405
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
15406
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
15407
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
15408
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
15409
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
15410
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
15411
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
15412
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
15413
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
15414
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
15415
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
15416
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
15417
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
15418
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
15419
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15420
    // In the following section, control frame will be sent while no other transmission is in progress.//
15421
    // TXC interrupt won't be unmasked.                                                                //
15422
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15423
    // check interrupts
15424
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15425
    if(data)
15426
      begin
15427
        test_fail("IRQ already pending!");
15428
        fail = fail + 1;
15429
        `TIME; $display("*E IRQ already pending!");
15430
      end
15431
    if (wb_int)
15432
    begin
15433
      test_fail("WB INT signal should not be set!");
15434
      fail = fail + 1;
15435
      `TIME; $display("*E WB INT signal should not be set!");
15436
    end
15437
    // first destination address on ethernet PHY
15438
    eth_phy.set_tx_mem_addr(0);
15439
    // Request sending the control frame with pause value = 0x1111
15440
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15441
    // wait for transmission to come over
15442
    wait (MTxEn === 1'b1); // start transmit
15443
    wait (MTxEn === 1'b0); // end transmit
15444
    repeat(10) @ (posedge wb_clk);  // wait some time
15445
    repeat(10) @ (posedge mtx_clk); // wait some time
15446
    // check interrupt
15447
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15448
    if(data !== `ETH_INT_TXC)
15449
      begin
15450
        test_fail("TXC IRQ should be set!");
15451
        fail = fail + 1;
15452
        `TIME; $display("*E TXC IRQ should be set!");
15453
      end
15454
    if (wb_int)
15455
    begin
15456
      test_fail("WB INT signal should not be set because TXC irq is masked!");
15457
      fail = fail + 1;
15458
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
15459
    end
15460
    // Clear TXC interrupt
15461
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15462
    if (wb_int)
15463
    begin
15464
      test_fail("WB INT signal should not be set!");
15465
      fail = fail + 1;
15466
      `TIME; $display("*E WB INT signal should not be set!");
15467
    end
15468
    // check transmited TX packet
15469
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15470
    if (tmp > 0)
15471
    begin
15472
      $display("Wrong data of the transmitted packet");
15473
      test_fail("Wrong data of the transmitted packet");
15474
      fail = fail + 1;
15475
    end
15476
    // check transmited TX packet CRC
15477
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15478
    if (tmp > 0)
15479
    begin
15480
      $display("Wrong CRC of the transmitted packet");
15481
      test_fail("Wrong CRC of the transmitted packet");
15482
      fail = fail + 1;
15483
    end
15484
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15485
    // In the following section, control frame will be sent while no other transmission is in progress.//
15486
    // TXC interrupt is unmasked.                                                                      //
15487
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15488
    // unmask all interrupts
15489
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15490
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15491
    // check interrupts
15492
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15493
    if(data)
15494
      begin
15495
        test_fail("IRQ already pending!");
15496
        fail = fail + 1;
15497
        `TIME; $display("*E IRQ already pending!");
15498
      end
15499
    if (wb_int)
15500
    begin
15501
      test_fail("WB INT signal should not be set!");
15502
      fail = fail + 1;
15503
      `TIME; $display("*E WB INT signal should not be set!");
15504
    end
15505
    // unmask only TXC interrupts
15506
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15507
    // first destination address on ethernet PHY
15508
    eth_phy.set_tx_mem_addr(0);
15509
    // Request sending the control frame with pause value = 0x2222
15510
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
15511
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15512
    // wait for transmit to come over
15513
    wait (MTxEn === 1'b1); // start transmit
15514
    wait (MTxEn === 1'b0); // end transmit
15515
    repeat(10) @ (posedge wb_clk);  // wait some time
15516
    repeat(10) @ (posedge mtx_clk); // wait some time
15517
    // check INT
15518
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15519
    if(data !== `ETH_INT_TXC)
15520
      begin
15521
        test_fail("TXC IRQ should be set!");
15522
        fail = fail + 1;
15523
        `TIME; $display("*E TXC IRQ should be set!");
15524
      end
15525
    if (!wb_int)
15526
    begin
15527
      test_fail("WB INT signal should be set!");
15528
      fail = fail + 1;
15529
      `TIME; $display("*E WB INT signal should be set!");
15530
    end
15531
    // Clear TXC interrupt
15532
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15533
    if (wb_int)
15534
    begin
15535
      test_fail("WB INT signal should not be set!");
15536
      fail = fail + 1;
15537
      `TIME; $display("*E WB INT signal should not be set!");
15538
    end
15539
    // check transmited TX packet
15540
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15541
    if (tmp > 0)
15542
    begin
15543
      $display("Wrong data of the transmitted packet");
15544
      test_fail("Wrong data of the transmitted packet");
15545
      fail = fail + 1;
15546
    end
15547
    // check transmited TX packet CRC
15548
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15549
    if (tmp > 0)
15550
    begin
15551
      $display("Wrong CRC of the transmitted packet");
15552
      test_fail("Wrong CRC of the transmitted packet");
15553
      fail = fail + 1;
15554
    end
15555
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15556
    // In the following section, control frame sending is requested while no other transmission        //
15557
    // is in progress. TXC interrupt is unmasked.                                                      //
15558
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15559
    // unmask all interrupts
15560
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15561
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15562
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15563
    if(data)
15564
      begin
15565
        test_fail("IRQ already pending!");
15566
        fail = fail + 1;
15567
        `TIME; $display("*E IRQ already pending!");
15568
      end
15569
    if (wb_int)
15570
    begin
15571
      test_fail("WB INT signal should not be set!");
15572
      fail = fail + 1;
15573
      `TIME; $display("*E WB INT signal should not be set!");
15574
    end
15575
 
15576
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15577
    // In the following section, control frame request and data send request are both set. At the      //
15578
    // beginning control frame request will be faster than data send request, later the opposite.      //
15579
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15580
    for (i=0; i<32; i=i+1)
15581
    begin
15582
      // Request sending the control frame with pause value = 0x5678
15583
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
15584
      set_tx_bd_wrap(0);
15585
      // first destination address on ethernet PHY
15586
      eth_phy.set_tx_mem_addr(0);
15587
      set_tx_bd_ready(0, 0);
15588
      // wait for transmission to start  
15589
      wait (MTxEn === 1'b1); // start transmit
15590
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
15591
      // Send control frame request
15592
      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
15593
      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);
15594
      // wait until transmission is over  
15595
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15596
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15597
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15598
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15599
      // first destination address on ethernet PHY
15600
      eth_phy.set_tx_mem_addr(0);
15601
      // check interrupt depending on which packet was sent
15602
 
15603
      if(tmp_len == 64)  // Control frame
15604
      begin
15605
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15606
        if(data !== `ETH_INT_TXC)
15607
        begin
15608
          test_fail("TXC IRQ should be set!");
15609
          fail = fail + 1;
15610
          `TIME; $display("*E TXC IRQ should be set!");
15611
          `TIME; $display("ETH_INT = 0x%0x", data);
15612
        end
15613
      end
15614
      else
15615
      begin
15616
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15617
        if(data !== `ETH_INT_TXB)
15618
        begin
15619
          test_fail("TXB IRQ should be set!");
15620
          fail = fail + 1;
15621
          `TIME; $display("*E TXB IRQ should be set!");
15622
          `TIME; $display("ETH_INT = 0x%0x", data);
15623
        end
15624
      end
15625
      // check transmited TX packet
15626
      if(tmp_len == 64)  // Control frame
15627
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15628
      else
15629
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15630
      if (tmp > 0)
15631
      begin
15632
        $display("Wrong data of the transmitted packet");
15633
        test_fail("Wrong data of the transmitted packet");
15634
        fail = fail + 1;
15635
      end
15636
      // check transmited TX packet CRC
15637
      if(tmp_len == 64)  // Control frame
15638
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15639
      else
15640
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15641
 
15642
      if (tmp > 0)
15643
      begin
15644
        $display("Wrong CRC of the transmitted packet");
15645
        test_fail("Wrong CRC of the transmitted packet");
15646
        fail = fail + 1;
15647
      end
15648
      // wait for control frame to transmit
15649
      wait (MTxEn === 1'b1); // start transmit of the control frame
15650
      wait (MTxEn === 1'b0); // end transmit of the control frame
15651
      repeat(10) @ (posedge wb_clk);  // wait some time
15652
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15653
      // check interrupts  
15654
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15655
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15656
      begin
15657
        test_fail("TXC and TXB IRQ should be set!");
15658
        fail = fail + 1;
15659
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15660
      end
15661
      if (!wb_int)
15662
      begin
15663
        test_fail("WB INT signal should be set!");
15664
        fail = fail + 1;
15665
        `TIME; $display("*E WB INT signal should be set!");
15666
      end
15667
      // Clear TXC and TXB interrupt
15668
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15669
      if (wb_int)
15670
      begin
15671
        test_fail("WB INT signal should not be set!");
15672
        fail = fail + 1;
15673
        `TIME; $display("*E WB INT signal should not be set!");
15674
      end
15675
      if(tmp_len == 64)  // Control frame
15676
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15677
      else
15678
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15679
      if (tmp > 0)
15680
      begin
15681
        $display("Wrong data of the transmitted packet");
15682
        test_fail("Wrong data of the transmitted packet");
15683
        fail = fail + 1;
15684
      end
15685
      // check transmited TX packet CRC
15686
      if(tmp_len == 64)  // Control frame
15687
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15688
      else
15689
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15690
      if (tmp > 0)
15691
      begin
15692
        $display("Wrong CRC of the transmitted packet");
15693
        test_fail("Wrong CRC of the transmitted packet");
15694
        fail = fail + 1;
15695
      end
15696
    end // for loop
15697
    if(fail == 0)
15698
      test_ok;
15699
    else
15700
      fail = 0;
15701 263 mohor
  end
15702 254 mohor
 
15703 274 tadejm
 
15704 260 mohor
  ////////////////////////////////////////////////////////////////////
15705
  ////                                                            ////
15706 267 mohor
  ////  Receive control frames with PASSALL option turned on and  ////
15707
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
15708 260 mohor
  ////                                                            ////
15709
  ////////////////////////////////////////////////////////////////////
15710 263 mohor
  if (test_num == 2) // 
15711 260 mohor
  begin
15712 267 mohor
    // TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
15713
    test_name   = "TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )";
15714
    `TIME; $display("  TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )");
15715 254 mohor
 
15716 260 mohor
    // unmask interrupts
15717
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15718
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15719
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
15720
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15721
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
15722 267 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
15723 260 mohor
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15724
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15725 263 mohor
    // enable RX_FLOW control
15726
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15727 260 mohor
    // prepare one packet of 100 bytes long
15728 267 mohor
//    st_data = 8'h1A;
15729
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
15730
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
15731
    st_data = 8'h01;
15732
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
15733
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
15734
    set_tx_bd_wrap(0);
15735 260 mohor
    // check WB INT signal
15736
    if (wb_int !== 1'b0)
15737
    begin
15738
      test_fail("WB INT signal should not be set");
15739
      fail = fail + 1;
15740
    end
15741 274 tadejm
 
15742 260 mohor
    // write to phy's control register for 10Mbps
15743
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
15744
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
15745
    speed = 10;
15746 254 mohor
 
15747 266 mohor
    // RXB and RXC interrupts masked
15748
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
15749
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15750
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
15751
    for (i=0; i<3; i=i+1)
15752
    begin
15753 274 tadejm
      pause_value = i+2;
15754 267 mohor
      set_rx_control_packet(0, pause_value);  // CRC already appended
15755 266 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15756
      case (i)
15757
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
15758
      begin
15759
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
15760
        // enable interrupt generation
15761
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15762
        // Set PASSALL = 0 and RXFLOW = 0
15763
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15764
      end
15765
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
15766
      begin
15767
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
15768
        // enable interrupt generation
15769
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15770
        // Set PASSALL = 0 and RXFLOW = 0
15771
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15772
      end
15773
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
15774
      begin
15775
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
15776
        // enable interrupt generation
15777
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
15778
        // Set PASSALL = 0 and RXFLOW = 0
15779
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15780
      end
15781
      default:
15782
      begin
15783
        $display("*E We should never get here !!!");
15784
        test_fail("We should never get here !!!");
15785
        fail = fail + 1;
15786
      end
15787
      endcase
15788
      // not detect carrier sense in FD and no collision
15789
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15790
      eth_phy.collision(0);
15791
      // set wrap bit and empty bit
15792
      set_rx_bd_wrap(127);
15793
      set_rx_bd_empty(127, 127);
15794 274 tadejm
      // transmit
15795 266 mohor
      fork
15796
        begin
15797
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15798
          repeat(10) @(posedge mrx_clk);
15799
        end
15800
        begin
15801
          wait (MRxDV === 1'b1); // start transmit
15802
          #1 check_rx_bd(127, data);
15803
          if (data[15] !== 1)
15804
          begin
15805
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15806
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15807
            fail = fail + 1;
15808
          end
15809 267 mohor
          wait (MRxDV === 1'b0); // received pause frame
15810
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
15811
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
15812
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
15813
                                 // and RxFlow enabled.
15814
          // When we exit the while loop, status frame is received
15815
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
15816
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
15817 266 mohor
        end
15818
      join
15819
      #1 check_rx_bd(127, data);
15820
      // Checking buffer descriptor
15821
      if(PassAll)
15822
      begin
15823
        if(enable_irq_in_rxbd)
15824
        begin
15825
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15826
          begin
15827
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15828
            $display("RxBD = 0x%0x", data);
15829
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15830
            fail = fail + 1;
15831
          end
15832
        end
15833
        else
15834
        begin
15835
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
15836
          begin
15837
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15838
            $display("RxBD = 0x%0x", data);
15839
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15840
            fail = fail + 1;
15841
          end
15842
        end
15843
      end
15844
      else
15845
      begin
15846
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
15847
        begin
15848
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15849
          $display("RxBD = 0x%0x", data);
15850
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15851
          fail = fail + 1;
15852
        end
15853
      end
15854
      // Checking if interrupt was generated
15855
      if (wb_int)
15856
      begin
15857
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
15858
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
15859
        fail = fail + 1;
15860
      end
15861
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15862
      if(RxFlow)
15863
      begin
15864
        if(data !== (`ETH_INT_RXC))
15865
        begin
15866
          test_fail("RXC is not set or multiple IRQs active!");
15867
          fail = fail + 1;
15868
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15869
        end
15870
        // Clear RXC interrupt
15871
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
15872
      end
15873
      else if(enable_irq_in_rxbd)
15874
      begin
15875
        if(data !== (`ETH_INT_RXB))
15876
        begin
15877
          test_fail("RXB is not set or multiple IRQs active!");
15878
          fail = fail + 1;
15879
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15880
        end
15881
        // Clear RXC interrupt
15882
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
15883
      end
15884
      else
15885
      begin
15886
        if(data !== 0)
15887
        begin
15888
          test_fail("Some IRQs is active!");
15889
          fail = fail + 1;
15890
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
15891
        end
15892
      end
15893 267 mohor
      if(RxFlow)
15894
        begin
15895
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
15896
            begin
15897
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
15898
              test_fail("Transmission should not be started because pause frame was received.");
15899
              fail = fail + 1;
15900
            end
15901
          while(pause_value)
15902
            begin
15903
              pause_value=pause_value-1;
15904
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
15905
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
15906
                begin
15907
                  `TIME; $display("*E Transmission should be started because pause passed.");
15908
                  test_fail("Transmission should be started because pause passed.");
15909
                  fail = fail + 1;
15910
                end
15911
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
15912
                begin
15913
                  `TIME; $display("*E Transmission should still be paused.");
15914
                  test_fail("Transmission should still be paused.");
15915
                  fail = fail + 1;
15916
                end
15917
            end
15918
        end
15919
      else
15920
        begin
15921
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
15922
            begin
15923
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
15924
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
15925
              fail = fail + 1;
15926
            end
15927
        end
15928
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
15929
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15930
      if(data !== (`ETH_INT_TXB))
15931
        begin
15932
          test_fail("TXB is not set or multiple IRQs active!");
15933
          fail = fail + 1;
15934
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15935
        end
15936
        // Clear TXB interrupt
15937
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15938 266 mohor
    end
15939
    // End: Test is irq is set while RXB and RXC interrupts are masked.
15940
 
15941
    // Now all interrupts are unmasked. Performing tests again.
15942 263 mohor
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15943
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15944 260 mohor
    for (i=0; i<4; i=i+1)
15945 254 mohor
    begin
15946 267 mohor
      pause_value = i+1;
15947
      set_rx_control_packet(0, pause_value);  // CRC already appended
15948 260 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15949
      case (i)
15950 263 mohor
      0: // PASSALL = 0, RXFLOW = 0
15951 254 mohor
      begin
15952 263 mohor
        PassAll=0; RxFlow=0;
15953 260 mohor
        // enable interrupt generation
15954 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15955
        // Set PASSALL = 0 and RXFLOW = 0
15956
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15957 254 mohor
      end
15958 263 mohor
      1: // PASSALL = 0, RXFLOW = 1
15959 254 mohor
      begin
15960 263 mohor
        PassAll=0; RxFlow=1;
15961 260 mohor
        // enable interrupt generation
15962 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15963
        // Set PASSALL = 0 and RXFLOW = 0
15964
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15965 254 mohor
      end
15966 263 mohor
      2: // PASSALL = 1, RXFLOW = 0
15967 254 mohor
      begin
15968 263 mohor
        PassAll=1; RxFlow=0;
15969
        // enable interrupt generation
15970
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15971
        // Set PASSALL = 0 and RXFLOW = 0
15972
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15973 254 mohor
      end
15974 263 mohor
      default: // 3: PASSALL = 1, RXFLOW = 1
15975 254 mohor
      begin
15976 263 mohor
        PassAll=1; RxFlow=1;
15977
        // enable interrupt generation
15978
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15979
        // Set PASSALL = 1 and RXFLOW = 1
15980
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15981 254 mohor
      end
15982
      endcase
15983 263 mohor
      // not detect carrier sense in FD and no collision
15984
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15985
      eth_phy.collision(0);
15986
      // set wrap bit and empty bit
15987 260 mohor
      set_rx_bd_wrap(127);
15988
      set_rx_bd_empty(127, 127);
15989 274 tadejm
      // transmit
15990 260 mohor
      fork
15991 254 mohor
        begin
15992 260 mohor
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15993
          repeat(10) @(posedge mrx_clk);
15994 254 mohor
        end
15995
        begin
15996 260 mohor
          #1 check_rx_bd(127, data);
15997
          wait (MRxDV === 1'b1); // start transmit
15998 263 mohor
          #1 check_rx_bd(127, data);
15999 260 mohor
          if (data[15] !== 1)
16000
          begin
16001 263 mohor
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
16002 260 mohor
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16003
            fail = fail + 1;
16004
          end
16005
          wait (MRxDV === 1'b0); // end transmit
16006 263 mohor
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
16007
          repeat (100) @(posedge wb_clk); // status/irq is written.
16008 267 mohor
 
16009
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
16010
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
16011 254 mohor
        end
16012 260 mohor
      join
16013 263 mohor
      #1 check_rx_bd(127, data);
16014
      // Checking buffer descriptor
16015
      if(PassAll)
16016 254 mohor
      begin
16017 263 mohor
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
16018
        begin
16019
          $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16020
          $display("RxBD = 0x%0x", data);
16021
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16022
          fail = fail + 1;
16023
        end
16024 254 mohor
      end
16025 260 mohor
      else
16026 254 mohor
      begin
16027 263 mohor
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16028
        begin
16029
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16030
          $display("RxBD = 0x%0x", data);
16031
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16032
          fail = fail + 1;
16033
        end
16034 254 mohor
      end
16035 263 mohor
      // Checking if interrupt was generated
16036
      if(RxFlow || PassAll)
16037 254 mohor
      begin
16038 263 mohor
        if (!wb_int)
16039 254 mohor
        begin
16040
          `TIME; $display("*E WB INT signal should be set");
16041
          test_fail("WB INT signal should be set");
16042
          fail = fail + 1;
16043
        end
16044
      end
16045
      else
16046
      begin
16047 263 mohor
        if (wb_int)
16048 254 mohor
        begin
16049
          `TIME; $display("*E WB INT signal should not be set");
16050
          test_fail("WB INT signal should not be set");
16051
          fail = fail + 1;
16052
        end
16053
      end
16054 274 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16055
      if(RxFlow)
16056
      begin
16057
        if(data !== (`ETH_INT_RXC))
16058
        begin
16059
          test_fail("RXC is not set or multiple IRQs active!");
16060
          fail = fail + 1;
16061
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16062
        end
16063
        // Clear RXC interrupt
16064
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16065
      end
16066
      else if(PassAll)
16067
      begin
16068
        if(data !== (`ETH_INT_RXB))
16069
        begin
16070
          test_fail("RXB is not set or multiple IRQs active!");
16071
          fail = fail + 1;
16072
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16073
        end
16074
        // Clear RXB interrupt
16075
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16076
      end
16077
      else
16078
      begin
16079
        if(data !== 0)
16080
        begin
16081
          test_fail("No interrupt should be set!");
16082
          fail = fail + 1;
16083
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
16084
        end
16085
      end
16086
    end
16087
    // disable RX
16088
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16089
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16090
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16091
    if(fail == 0)
16092
      test_ok;
16093
    else
16094
      fail = 0;
16095
  end
16096 263 mohor
 
16097 274 tadejm
 
16098
  ////////////////////////////////////////////////////////////////////
16099
  ////                                                            ////
16100
  ////  Receive control frames with PASSALL option turned on and  ////
16101
  ////  off. Using only one RX buffer decriptor ( 100Mbps ).      ////
16102
  ////                                                            ////
16103
  ////////////////////////////////////////////////////////////////////
16104
  if (test_num == 3) // 
16105
  begin
16106
    // TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )
16107
    test_name   = "TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )";
16108
    `TIME; $display("  TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )");
16109
 
16110
    // unmask interrupts
16111
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16112
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16113
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
16114
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16115
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
16116
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
16117
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16118
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16119
    // enable RX_FLOW control
16120
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16121
    // prepare one packet of 100 bytes long
16122
//    st_data = 8'h1A;
16123
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
16124
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
16125
    st_data = 8'h01;
16126
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
16127
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
16128
    set_tx_bd_wrap(0);
16129
    // check WB INT signal
16130
    if (wb_int !== 1'b0)
16131
    begin
16132
      test_fail("WB INT signal should not be set");
16133
      fail = fail + 1;
16134
    end
16135
 
16136
    // write to phy's control register for 100Mbps
16137
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
16138
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
16139
    speed = 100;
16140
 
16141
    // RXB and RXC interrupts masked
16142
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
16143
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16144
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
16145
    for (i=0; i<3; i=i+1)
16146
    begin
16147
      pause_value = i+2;
16148
      set_rx_control_packet(0, pause_value);  // CRC already appended
16149
      // choose generating carrier sense and collision for first and last 64 lengths of frames
16150
      case (i)
16151
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
16152
      begin
16153
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
16154
        // enable interrupt generation
16155
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16156
        // Set PASSALL = 0 and RXFLOW = 0
16157
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16158
      end
16159
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
16160
      begin
16161
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
16162
        // enable interrupt generation
16163
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16164
        // Set PASSALL = 0 and RXFLOW = 0
16165
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16166
      end
16167
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
16168
      begin
16169
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
16170
        // enable interrupt generation
16171
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
16172
        // Set PASSALL = 0 and RXFLOW = 0
16173
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16174
      end
16175
      default:
16176
      begin
16177
        `TIME; $display("*E We should never get here !!!");
16178
        test_fail("We should never get here !!!");
16179
        fail = fail + 1;
16180
      end
16181
      endcase
16182
      // not detect carrier sense in FD and no collision
16183
      eth_phy.no_carrier_sense_rx_fd_detect(0);
16184
      eth_phy.collision(0);
16185
      // set wrap bit and empty bit
16186
      set_rx_bd_wrap(127);
16187
      set_rx_bd_empty(127, 127);
16188
      // transmit
16189
      fork
16190
        begin
16191
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
16192
          repeat(10) @(posedge mrx_clk);
16193
        end
16194
        begin
16195
          wait (MRxDV === 1'b1); // start transmit
16196
          #1 check_rx_bd(127, data);
16197
          if (data[15] !== 1)
16198
          begin
16199
            `TIME; $display("*E Wrong buffer descriptor's ready bit read out from MAC");
16200
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16201
            fail = fail + 1;
16202
          end
16203
          wait (MRxDV === 1'b0); // received pause frame
16204
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
16205
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
16206
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
16207
                                 // and RxFlow enabled.
16208
          // When we exit the while loop, status frame is received
16209
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
16210
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
16211
        end
16212
      join
16213
      #1 check_rx_bd(127, data);
16214
      // Checking buffer descriptor
16215
      if(PassAll)
16216
      begin
16217
        if(enable_irq_in_rxbd)
16218
        begin
16219
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
16220
          begin
16221
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16222
            $display("RxBD = 0x%0x", data);
16223
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16224
            fail = fail + 1;
16225
          end
16226
        end
16227
        else
16228
        begin
16229
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
16230
          begin
16231
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16232
            $display("RxBD = 0x%0x", data);
16233
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16234
            fail = fail + 1;
16235
          end
16236
        end
16237
      end
16238
      else
16239
      begin
16240
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16241
        begin
16242
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16243
          $display("RxBD = 0x%0x", data);
16244
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16245
          fail = fail + 1;
16246
        end
16247
      end
16248
      // Checking if interrupt was generated
16249
      if (wb_int)
16250
      begin
16251
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
16252
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
16253
        fail = fail + 1;
16254
      end
16255 263 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16256
      if(RxFlow)
16257 254 mohor
      begin
16258 263 mohor
        if(data !== (`ETH_INT_RXC))
16259 254 mohor
        begin
16260 263 mohor
          test_fail("RXC is not set or multiple IRQs active!");
16261 260 mohor
          fail = fail + 1;
16262 263 mohor
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16263 254 mohor
        end
16264 263 mohor
        // Clear RXC interrupt
16265
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16266 254 mohor
      end
16267 274 tadejm
      else if(enable_irq_in_rxbd)
16268
      begin
16269
        if(data !== (`ETH_INT_RXB))
16270
        begin
16271
          test_fail("RXB is not set or multiple IRQs active!");
16272
          fail = fail + 1;
16273
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16274
        end
16275
        // Clear RXC interrupt
16276
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16277
      end
16278
      else
16279
      begin
16280
        if(data !== 0)
16281
        begin
16282
          test_fail("Some IRQs is active!");
16283
          fail = fail + 1;
16284
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
16285
        end
16286
      end
16287
      if(RxFlow)
16288
        begin
16289
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
16290
            begin
16291
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
16292
              test_fail("Transmission should not be started because pause frame was received.");
16293
              fail = fail + 1;
16294
            end
16295
          while(pause_value)
16296
            begin
16297
              pause_value=pause_value-1;
16298
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
16299
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
16300
                begin
16301
                  `TIME; $display("*E Transmission should be started because pause passed.");
16302
                  test_fail("Transmission should be started because pause passed.");
16303
                  fail = fail + 1;
16304
                end
16305
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
16306
                begin
16307
                  `TIME; $display("*E Transmission should still be paused.");
16308
                  test_fail("Transmission should still be paused.");
16309
                  fail = fail + 1;
16310
                end
16311
            end
16312
        end
16313
      else
16314
        begin
16315
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
16316
            begin
16317
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
16318
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
16319
              fail = fail + 1;
16320
            end
16321
        end
16322
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
16323
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16324
      if(data !== (`ETH_INT_TXB))
16325
        begin
16326
          test_fail("TXB is not set or multiple IRQs active!");
16327
          fail = fail + 1;
16328
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16329
        end
16330
        // Clear TXB interrupt
16331
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
16332
    end
16333
    // End: Test is irq is set while RXB and RXC interrupts are masked.
16334
 
16335
    // Now all interrupts are unmasked. Performing tests again.
16336
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16337
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16338
    for (i=0; i<4; i=i+1)
16339
    begin
16340
      pause_value = i+1;
16341
      set_rx_control_packet(0, pause_value);  // CRC already appended
16342
      // choose generating carrier sense and collision for first and last 64 lengths of frames
16343
      case (i)
16344
      0: // PASSALL = 0, RXFLOW = 0
16345
      begin
16346
        PassAll=0; RxFlow=0;
16347
        // enable interrupt generation
16348
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16349
        // Set PASSALL = 0 and RXFLOW = 0
16350
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16351
      end
16352
      1: // PASSALL = 0, RXFLOW = 1
16353
      begin
16354
        PassAll=0; RxFlow=1;
16355
        // enable interrupt generation
16356
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16357
        // Set PASSALL = 0 and RXFLOW = 0
16358
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16359
      end
16360
      2: // PASSALL = 1, RXFLOW = 0
16361
      begin
16362
        PassAll=1; RxFlow=0;
16363
        // enable interrupt generation
16364
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16365
        // Set PASSALL = 0 and RXFLOW = 0
16366
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16367
      end
16368
      default: // 3: PASSALL = 1, RXFLOW = 1
16369
      begin
16370
        PassAll=1; RxFlow=1;
16371
        // enable interrupt generation
16372
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16373
        // Set PASSALL = 1 and RXFLOW = 1
16374
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16375
      end
16376
      endcase
16377
      // not detect carrier sense in FD and no collision
16378
      eth_phy.no_carrier_sense_rx_fd_detect(0);
16379
      eth_phy.collision(0);
16380
      // set wrap bit and empty bit
16381
      set_rx_bd_wrap(127);
16382
      set_rx_bd_empty(127, 127);
16383
      // transmit
16384
      fork
16385
        begin
16386
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
16387
          repeat(10) @(posedge mrx_clk);
16388
        end
16389
        begin
16390
          #1 check_rx_bd(127, data);
16391
          wait (MRxDV === 1'b1); // start transmit
16392
          #1 check_rx_bd(127, data);
16393
          if (data[15] !== 1)
16394
          begin
16395
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
16396
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16397
            fail = fail + 1;
16398
          end
16399
          wait (MRxDV === 1'b0); // end transmit
16400
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
16401
          repeat (100) @(posedge wb_clk); // status/irq is written.
16402
 
16403
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
16404
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
16405
        end
16406
      join
16407
      #1 check_rx_bd(127, data);
16408
      // Checking buffer descriptor
16409
      if(PassAll)
16410
      begin
16411
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
16412
        begin
16413
          `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16414
          $display("RxBD = 0x%0x", data);
16415
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16416
          fail = fail + 1;
16417
        end
16418
      end
16419
      else
16420
      begin
16421
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16422
        begin
16423
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16424
          $display("RxBD = 0x%0x", data);
16425
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16426
          fail = fail + 1;
16427
        end
16428
      end
16429
      // Checking if interrupt was generated
16430
 
16431
      if(RxFlow | PassAll)
16432
      begin
16433
        if (!wb_int)
16434
        begin
16435
          `TIME; $display("*E WB INT signal should be set");
16436
          test_fail("WB INT signal should be set");
16437
          fail = fail + 1;
16438
        end
16439
      end
16440
      else
16441
      begin
16442
        if (wb_int)
16443
        begin
16444
          `TIME; $display("*E WB INT signal should not be set");
16445
          test_fail("WB INT signal should not be set");
16446
          fail = fail + 1;
16447
        end
16448
      end
16449
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16450
      if(RxFlow)
16451
      begin
16452
        if(data !== (`ETH_INT_RXC))
16453
        begin
16454
          test_fail("RXC is not set or multiple IRQs active!");
16455
          fail = fail + 1;
16456
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16457
        end
16458
        // Clear RXC interrupt
16459
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16460
      end
16461 263 mohor
      else if(PassAll)
16462 254 mohor
      begin
16463 263 mohor
        if(data !== (`ETH_INT_RXB))
16464 254 mohor
        begin
16465 263 mohor
          test_fail("RXB is not set or multiple IRQs active!");
16466 254 mohor
          fail = fail + 1;
16467 263 mohor
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16468 254 mohor
        end
16469 263 mohor
        // Clear RXB interrupt
16470
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16471 254 mohor
      end
16472
      else
16473
      begin
16474 263 mohor
        if(data !== 0)
16475 254 mohor
        begin
16476 263 mohor
          test_fail("No interrupt should be set!");
16477 254 mohor
          fail = fail + 1;
16478 263 mohor
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
16479 254 mohor
        end
16480
      end
16481
    end
16482 274 tadejm
    // disable RX
16483
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16484
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16485
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16486
    if(fail == 0)
16487
      test_ok;
16488
    else
16489
      fail = 0;
16490
  end
16491 266 mohor
 
16492 274 tadejm
 
16493
  ////////////////////////////////////////////////////////////////////
16494
  ////                                                            ////
16495
  ////  Receive control frames with PASSALL option turned on and  ////
16496
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
16497
  ////                                                            ////
16498
  ////////////////////////////////////////////////////////////////////
16499
  if (test_num == 4) // 
16500
  begin
16501
    // TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
16502
    test_name   = "TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )";
16503
    `TIME; $display("  TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )");
16504
 
16505
    // unmask interrupts
16506
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16507
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16508
    // set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
16509
    wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16510
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
16511
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
16512
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16513
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16514
    // enable flow control
16515
 
16516
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
16517
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16518
    // prepare one RX and one TX packet of 100 bytes long
16519
    rx_len = 100; // length of frame without CRC
16520
    st_data = 8'h1A;
16521
    set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
16522
    append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
16523
    tx_len = 64; // length of frame without CRC
16524
    st_data = 8'h01;
16525
    set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
16526
    // set TX and RX Buffer Descriptors 
16527
    tx_bd_num = 0; // tx BDs go from 0 to 0
16528
    rx_bd_num = 1; // rx BDs go from 1 to 1
16529
    // check WB INT signal
16530
    if (wb_int !== 1'b0)
16531
    begin
16532
      test_fail("WB INT signal should not be set");
16533
      fail = fail + 1;
16534
    end
16535
 
16536
    // set EQUAL mrx_clk to mtx_clk!
16537
//    eth_phy.set_mrx_equal_mtx = 1'b1;
16538 263 mohor
 
16539 274 tadejm
    // write to phy's control register for 10Mbps
16540
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
16541
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
16542
    speed = 10;
16543
 
16544
    // TXB and RXB interrupts masked
16545
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY | `ETH_INT_TXC | `ETH_INT_RXC,
16546
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16547
 
16548
    tmp_len = 0;
16549
    num_of_frames = 0;
16550
    num_of_rx_frames = 0;
16551
//    num_of_iter = 0;
16552
    // TX frame loop & RX frame loop work independently
16553
 
16554
 
16555
    fork
16556
      // TX frame loop
16557
      while (num_of_frames < 400)
16558
      begin
16559
        eth_phy.set_tx_mem_addr(64 + num_of_frames);
16560
        // set tx bd
16561
          // wait for WB master if it is working
16562
          @(posedge wb_clk);
16563
          while (wbm_working)
16564
          begin
16565
            @(posedge wb_clk);
16566
          end
16567
        set_tx_bd(0, 0, tx_len, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
16568
        set_tx_bd_wrap(0);
16569
        set_tx_bd_ready(0, 0);
16570
        check_tx_bd(0, data);
16571
        // check frame
16572
        i = 0;
16573
        while((i < 100) && (MTxEn === 1'b0)) // wait for start of TX frame!
16574
        begin
16575
          @(posedge mtx_clk);
16576
          i = i + 1;
16577
        end
16578
        if (MTxEn != 1'b1)
16579
        begin
16580
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't start transmitting the packet", num_of_frames);
16581
          test_fail("MAC TX didn't start transmitting the packet");
16582
          fail = fail + 1;
16583
          #10000 $stop;
16584
        end
16585
 
16586
        repeat (30) @(posedge mtx_clk); // waiting some time so PHY clears the tx_len
16587
 
16588
        wait ((MTxEn === 1'b0) || (eth_phy.tx_len > (tx_len + 4))) // wait for end of TX frame
16589
        if (MTxEn != 1'b0)
16590
        begin
16591
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't stop transmitting the packet", num_of_frames);
16592
          test_fail("MAC TX didn't stop transmitting the packet");
16593
          fail = fail + 1;
16594
          #10000 $stop;
16595
        end
16596
        tmp_len = eth_phy.tx_len;
16597
          // wait for WB master if it is working
16598
          @(posedge wb_clk);
16599
          while (wbm_working)
16600
          begin
16601
            @(posedge wb_clk);
16602
          end
16603
        check_tx_bd(0, data);
16604
        while (data[15] === 1)
16605
        begin
16606
            // wait for WB master if it is working
16607
            @(posedge wb_clk);
16608
            while (wbm_working)
16609
            begin
16610
              @(posedge wb_clk);
16611
            end
16612
          check_tx_bd(0, data);
16613
        end
16614
        repeat (1) @(posedge wb_clk);
16615
        // check length of a PACKET
16616
        if (tmp_len != (tx_len + 4))
16617
        begin
16618
          `TIME; $display("*E Tx Frame %0d: Wrong length of the packet out from MAC (%0d instead of %0d)", num_of_frames,
16619
                          tmp_len, (tx_len + 4));
16620
          test_fail("Wrong length of the packet out from MAC");
16621
          fail = fail + 1;
16622
        end
16623
        // check transmitted TX packet data
16624
        check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
16625
        if (tmp > 0)
16626
        begin
16627
          `TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
16628
          test_fail("Wrong data of the transmitted packet");
16629
          fail = fail + 1;
16630
        end
16631
        // check transmited TX packet CRC
16632
        check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
16633
        if (tmp > 0)
16634
        begin
16635
          `TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
16636
          test_fail("Wrong CRC of the transmitted packet");
16637
          fail = fail + 1;
16638
        end
16639
        // check WB INT signal
16640
        if (wb_int !== 1'b0)
16641
        begin
16642
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16643
          test_fail("WB INT signal should not be set");
16644
          fail = fail + 1;
16645
        end
16646
        // check TX buffer descriptor of a packet
16647
          // wait for WB master if it is working
16648
          @(posedge wb_clk);
16649
          while (wbm_working)
16650
          begin
16651
            @(posedge wb_clk);
16652
          end
16653
        check_tx_bd(0, data);
16654
        if (data[15:0] !== 16'h7800)
16655
        begin
16656
          `TIME; $display("*E Tx Frame %0d: TX buffer descriptor status is not correct: %0h", num_of_frames, data[15:0]);
16657
          test_fail("TX buffer descriptor status is not correct");
16658
          fail = fail + 1;
16659
        end
16660
        // check interrupts
16661
          // wait for WB master if it is working
16662
          @(posedge wb_clk);
16663
          while (wbm_working)
16664
          begin
16665
            @(posedge wb_clk);
16666
          end
16667
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16668
        if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
16669
        begin
16670
          `TIME; $display("*E Tx Frame %0d: Interrupt Transmit Buffer was not set, interrupt reg: %0h", num_of_frames, data);
16671
          test_fail("Interrupt Transmit Buffer was not set");
16672
          fail = fail + 1;
16673
        end
16674
        if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
16675
        begin
16676
          `TIME; $display("*E Tx Frame %0d: Other interrupts (except Tx and Rx Buffer) were set, interrupt reg: %0h",
16677
                          num_of_frames, data);
16678
          test_fail("Other interrupts (except Transmit Buffer) were set");
16679
          fail = fail + 1;
16680
        end
16681
        // clear interrupts (except RXB)
16682
          // wait for WB master if it is working
16683
          @(posedge wb_clk);
16684
          while (wbm_working)
16685
          begin
16686
            @(posedge wb_clk);
16687
          end
16688
        wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16689
        // check WB INT signal
16690
        if (wb_int !== 1'b0)
16691
        begin
16692
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16693
          test_fail("WB INT signal should not be set");
16694
          fail = fail + 1;
16695
        end
16696
        // Displays
16697
        if (num_of_frames[2:0] == 3'b111)
16698
        begin
16699
          `TIME; $display("   ->8 frames transmitted");
16700
        end
16701
        // set length (loop variable)
16702
        num_of_frames = num_of_frames + 1;
16703
      end // TX frame loop
16704
      // RX frame loop
16705
      while (num_of_rx_frames < 400)
16706
      begin
16707
        // set rx bd
16708
          // wait for WB master if it is working
16709
          @(posedge wb_clk);
16710
          #1;
16711
          while (wbm_working)
16712
          begin
16713
            @(posedge wb_clk);
16714
            #1;
16715
          end
16716
        set_rx_bd(1, 1, 1'b1, (`MEMORY_BASE + 200 + num_of_rx_frames));
16717
        set_rx_bd_wrap(1);
16718
        set_rx_bd_empty(1, 1);
16719
        // check frame
16720
        fork
16721
          begin
16722
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
16723
            repeat(10) @(posedge mrx_clk);
16724
          end
16725
          begin
16726
            wait (MRxDV === 1'b1); // start receive
16727
              // wait for WB master if it is working
16728
              @(posedge wb_clk);
16729
              #1;
16730
              while (wbm_working)
16731
              begin
16732
                @(posedge wb_clk);
16733
                #1;
16734
              end
16735
            check_rx_bd(1, data);
16736
            if (data[15] !== 1)
16737
            begin
16738
              `TIME; $display("*E Rx Frame %0d: Wrong buffer descriptor's ready bit read out from MAC", num_of_rx_frames);
16739
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16740
              fail = fail + 1;
16741
            end
16742
            wait (MRxDV === 1'b0); // end receive
16743
 
16744
            while (data[15] === 1)
16745
            begin
16746
                // wait for WB master if it is working
16747
                @(posedge wb_clk);
16748
                #1;
16749
                while (wbm_working)
16750
                begin
16751
                  @(posedge wb_clk);
16752
                  #1;
16753
                end
16754
              check_rx_bd(1, data);
16755
            end
16756
            repeat (1) @(posedge wb_clk);
16757
          end
16758
        join
16759
        // check length of a PACKET
16760
 
16761
        // Additional read because simulator was not working OK.
16762
        // wait for WB master if it is working
16763
        @(posedge wb_clk);
16764
        #1;
16765
        while (wbm_working)
16766
        begin
16767
          @(posedge wb_clk);
16768
          #1;
16769
        end
16770
        check_rx_bd(1, data);
16771
 
16772
        if (data[31:16] != (rx_len + 4))
16773
        begin
16774
          `TIME; $display("*E Rx Frame %0d: Wrong length of the packet written to MAC's register (%0d instead of %0d)",
16775
                          num_of_rx_frames, data[31:16], (rx_len + 4));
16776
          test_fail("Wrong length of the packet out from PHY");
16777
          fail = fail + 1;
16778
        end
16779
        // check received RX packet data and CRC
16780
        check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
16781
        if (tmp > 0)
16782
        begin
16783
          `TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
16784
          test_fail("Wrong data of the received packet");
16785
          fail = fail + 1;
16786
        end
16787
        // check WB INT signal
16788
        if (wb_int !== 1'b0)
16789
        begin
16790
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16791
          test_fail("WB INT signal should not be set");
16792
          fail = fail + 1;
16793
        end
16794
        // check RX buffer descriptor of a packet
16795
          // wait for WB master if it is working
16796
          @(posedge wb_clk);
16797
          #1;
16798
          while (wbm_working)
16799
          begin
16800
            @(posedge wb_clk);
16801
            #1;
16802
          end
16803
        check_rx_bd(1, data);
16804
        if (data[15:0] !== 16'h6080)
16805
        begin
16806
          `TIME; $display("*E Rx Frame %0d: RX buffer descriptor status is not correct: %0h", num_of_rx_frames, data[15:0]);
16807
          test_fail("RX buffer descriptor status is not correct");
16808
          fail = fail + 1;
16809
        end
16810
        // check interrupts
16811
          // wait for WB master if it is working
16812
          @(posedge wb_clk);
16813
          #1;
16814
          while (wbm_working)
16815
          begin
16816
            @(posedge wb_clk);
16817
            #1;
16818
          end
16819
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16820
 
16821
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
16822
        begin
16823
          `TIME; $display("*E Rx Frame %0d: Interrupt Receive Buffer was not set, interrupt reg: %0h",
16824
                          num_of_rx_frames, data);
16825
          test_fail("Interrupt Receive Buffer was not set");
16826
          fail = fail + 1;
16827
        end
16828
        if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
16829
        begin
16830
          `TIME; $display("*E Rx Frame %0d: Other interrupts (except Rx and Tx Buffer) were set, interrupt reg: %0h",
16831
                          num_of_rx_frames, data);
16832
          test_fail("Other interrupts (except Receive Buffer) were set");
16833
          fail = fail + 1;
16834
        end
16835
        // clear interrupts (except TXB)
16836
          // wait for WB master if it is working
16837
          @(posedge wb_clk);
16838
          #1;
16839
          while (wbm_working)
16840
          begin
16841
            @(posedge wb_clk);
16842
            #1;
16843
          end
16844
        wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16845
        // check WB INT signal
16846
        if (wb_int !== 1'b0)
16847
        begin
16848
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16849
          test_fail("WB INT signal should not be set");
16850
          fail = fail + 1;
16851
        end
16852
        // Displays
16853
        if (num_of_rx_frames[2:0] == 3'b111)
16854
        begin
16855
          `TIME; $display("   ->8 frames received");
16856
        end
16857
        // set length (loop variable)
16858
        num_of_rx_frames = num_of_rx_frames + 1;
16859
      end // RX frame loop
16860
    join
16861
    // disable TX & RX
16862
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_PAD | `ETH_MODER_CRCEN |
16863
              `ETH_MODER_IFG | `ETH_MODER_PRO | `ETH_MODER_BRO,
16864
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16865
    // set DIFFERENT mrx_clk to mtx_clk!
16866
//    eth_phy.set_mrx_equal_mtx = 1'b0;
16867
    if(fail == 0)
16868
      test_ok;
16869
    else
16870
      fail = 0;
16871
  end
16872
 
16873
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
16874
 
16875
end
16876
endtask // test_mac_full_duplex_flow_control
16877
 
16878
 
16879
task test_mac_half_duplex_flow;
16880
  input  [31:0]  start_task;
16881
  input  [31:0]  end_task;
16882
  integer        bit_start_1;
16883
  integer        bit_end_1;
16884
  integer        bit_start_2;
16885
  integer        bit_end_2;
16886
  integer        num_of_reg;
16887
  integer        num_of_frames;
16888
  integer        num_of_bd;
16889
  integer        num_of_iter;
16890
  integer        i_addr;
16891
  integer        i_data;
16892
  integer        i_length;
16893
  integer        tmp_len;
16894
  integer        tmp_bd;
16895
  integer        tmp_bd_num;
16896
  integer        tmp_data;
16897
  integer        tmp_ipgt;
16898
  integer        test_num;
16899
  reg    [31:0]  tx_bd_num;
16900
  reg    [31:0]  rx_bd_num;
16901
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
16902
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
16903
  integer        i;
16904
  integer        i1;
16905
  integer        i2;
16906
  integer        i3;
16907
  integer        fail;
16908
  integer        speed;
16909
  integer        mac_hi_addr;
16910
  integer        mac_lo_addr;
16911
  reg            frame_started;
16912
  reg            frame_ended;
16913
  reg            check_rx_frame;
16914
  reg            wait_for_tx_frame;
16915
  reg    [31:0]  addr;
16916
  reg    [31:0]  data;
16917
  reg    [31:0]  tmp;
16918
  reg    [ 7:0]  st_data;
16919
  reg    [15:0]  max_tmp;
16920
  reg    [15:0]  min_tmp;
16921
begin
16922
// MAC HALF DUPLEX FLOW TEST
16923
test_heading("MAC HALF DUPLEX FLOW TEST");
16924
$display(" ");
16925
$display("MAC HALF DUPLEX FLOW TEST");
16926
fail = 0;
16927
 
16928
// reset MAC registers
16929
hard_reset;
16930
// reset MAC and MII LOGIC with soft reset
16931
//reset_mac;
16932
//reset_mii;
16933
// set wb slave response
16934
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
16935
 
16936
  /*
16937
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
16938
  -------------------------------------------------------------------------------------
16939
  set_tx_bd
16940
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
16941
  set_tx_bd_wrap
16942
    (tx_bd_num_end[6:0]);
16943
  set_tx_bd_ready
16944
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16945
  check_tx_bd
16946
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
16947
  clear_tx_bd
16948
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16949
 
16950
  TASKS for set and control RX buffer descriptors:
16951
  ------------------------------------------------
16952
  set_rx_bd
16953
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
16954
  set_rx_bd_wrap
16955
    (rx_bd_num_end[6:0]);
16956
  set_rx_bd_empty
16957
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16958
  check_rx_bd
16959
    (rx_bd_num_end[6:0], rx_bd_status);
16960
  clear_rx_bd
16961
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16962
 
16963
  TASKS for set and check TX packets:
16964
  -----------------------------------
16965
  set_tx_packet
16966
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
16967
  check_tx_packet
16968
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
16969
 
16970
  TASKS for set and check RX packets:
16971
  -----------------------------------
16972
  set_rx_packet
16973
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
16974
  check_rx_packet
16975
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
16976
 
16977
  TASKS for append and check CRC to/of TX packet:
16978
  -----------------------------------------------
16979
  append_tx_crc
16980
    (txpnt_wb[31:0], len[15:0], negated_crc);
16981
  check_tx_crc
16982
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
16983
 
16984
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
16985
  --------------------------------------------------------------------------------
16986
  append_rx_crc
16987
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
16988
  */
16989
 
16990
//////////////////////////////////////////////////////////////////////
16991
////                                                              ////
16992
////  test_mac_half_duplex_flow:                                  ////
16993
////                                                              ////
16994
////  0: Test                                                     ////
16995
////                                                              ////
16996
//////////////////////////////////////////////////////////////////////
16997
 
16998
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
16999
begin
17000
 
17001
  ////////////////////////////////////////////////////////////////////
17002
  ////                                                            ////
17003
  ////  Test collision and late collision while transmitting and  ////
17004
  ////  receiving normal frames. Using 4 TX and RX buffer         ////
17005
  ////  decriptors ( 10Mbps ).                                    ////
17006
  ////                                                            ////
17007
  ////////////////////////////////////////////////////////////////////
17008
  if (test_num == 0) // 
17009
  begin
17010
    // TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )
17011
    //         
17012
    test_name = "TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )";
17013
    `TIME; $display("  TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )");
17014
 
17015
    // reset MAC completely
17016
    hard_reset;
17017
    // set wb slave response
17018
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
17019
 
17020
    max_tmp = 0;
17021
    min_tmp = 0;
17022
    // set 4 TX buffer descriptors (4 TX and 4 RX BDs will be used) - must be set before TX/RX enable
17023
    wait (wbm_working == 0);
17024
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17025
    // enable TX and RX, set half-duplex mode, receive small, NO correct IFG
17026
    wait (wbm_working == 0);
17027
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_RXEN | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17028
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17029
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17030
    // prepare two packets of MAXFL length for TX and RX
17031
    wait (wbm_working == 0);
17032
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17033
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
17034
    min_tmp = tmp[31:16];
17035
    st_data = 8'h17;
17036
    set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
17037
    append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
17038
    st_data = 8'h92;
17039
    set_tx_packet(`MEMORY_BASE, (min_tmp), st_data); // length without CRC
17040
    append_tx_crc (`MEMORY_BASE, (min_tmp), 1'b0);
17041
 
17042
    // check WB INT signal
17043
    if (wb_int !== 1'b0)
17044
    begin
17045
      test_fail("WB INT signal should not be set");
17046
      fail = fail + 1;
17047
    end
17048
    // unmask interrupts
17049
    wait (wbm_working == 0);
17050
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17051
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17052
 
17053
    // write to phy's control register for 10Mbps
17054
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
17055
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
17056
    speed = 10;
17057
 
17058
    // set TX and RX Buffer Descriptors 
17059
    tx_bd_num = 0; // tx BDs go from 0 to 3
17060
    rx_bd_num = 4; // rx BDs go from 4 to 7
17061
    set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
17062
    set_tx_bd_wrap(3);
17063
    set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
17064
    set_rx_bd_wrap(7);
17065
    set_rx_bd_empty(4, 7);
17066
 
17067
//    frame_ended = 0;
17068
    tmp_len = 0;
17069
    num_of_frames = 0;// 0; // 10;
17070
    num_of_iter = 0;
17071
//    num_of_bd = 0;
17072
//    i_length = 0;// (0 - 4); // 6; // 4 less due to CRC
17073
    while (num_of_frames < 80)
17074
    begin
17075
      // change COLLVALID bits in COLLCONF register
17076
      if ((num_of_frames == 0) && (num_of_iter == 0))
17077
      begin
17078
        wait (wbm_working == 0);
17079
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17080
        tmp[5:0] = 6'h00; // 6'b00_0000 ->  0 + 1 =  1 byte from preamble
17081
        wait (wbm_working == 0);
17082
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17083
        $display("    Collision window is set to 1 byte after preamble and SFD");
17084
      end
17085
      else if ((num_of_frames == 0) && (num_of_iter == 1))
17086
      begin
17087
        wait (wbm_working == 0);
17088
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17089
        tmp[5:0] = 6'h15; // 6'b01_0101 -> 21 + 1 = 22 bytes from preamble
17090
        wait (wbm_working == 0);
17091
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17092
        $display("    Collision window is set to 22 bytes after preamble and SFD");
17093
      end
17094
      else if ((num_of_frames == 0) && (num_of_iter == 2))
17095
      begin
17096
        wait (wbm_working == 0);
17097
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17098
        tmp[5:0] = 6'h2A; // 6'b10_1010 -> 42 + 1 = 43 bytes from preamble
17099
        wait (wbm_working == 0);
17100
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17101
        $display("    Collision window is set to 43 bytes after preamble and SFD");
17102
      end
17103
      else if ((num_of_frames == 0) && (num_of_iter == 3))
17104
      begin
17105
        wait (wbm_working == 0);
17106
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17107
        tmp[5:0] = 6'h3F; // 6'b11_1111 -> 63 + 1 = 64 bytes from preamble
17108
        wait (wbm_working == 0);
17109
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17110
        $display("    Collision window is set to 64 bytes after preamble and SFD");
17111
      end
17112
 
17113
 
17114
//wire          MRxDV;    // This goes to PHY
17115
//wire          MRxErr;   // This goes to PHY
17116
//wire          MColl;    // This goes to PHY
17117
//wire          MCrs;     // This goes to PHY
17118
//wire          MTxEn;
17119
//wire          MTxErr;
17120
      // CHECK END OF RECEIVE WHILE TRANSMITTING
17121
      frame_ended = 0;
17122
      check_rx_frame = 0;
17123
      fork
17124
        // send frames
17125
        begin // start with RX frame
17126
          repeat(num_of_frames) @(posedge mrx_clk);
17127
          #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (min_tmp + 4), 1'b0);
17128
          repeat(10) @(posedge mrx_clk);
17129
        end
17130
        begin // start with TX frame 
17131
          repeat(2) @(posedge mrx_clk);
17132
          repeat(2) @(posedge wb_clk);
17133
          #1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
17134
        end
17135
        // observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
17136
        begin
17137
          wait (MCrs || MTxEn);
17138
          #1;
17139
          if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
17140
            wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
17141
          else
17142
          begin
17143
            i = 0;
17144
            while (MColl == 1'b0) // wait for Collision to occure
17145
            begin
17146
              repeat(2) @(posedge mtx_clk); // counting bytes
17147
              #1 i = i + 1'b1;
17148
            end
17149
            i = i - 8; // subtract preamble and SFD (bytes) - Late Collision is measured from SFD!
17150
            tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
17151
            //wait (MTxEn == 1'b0); // wait for TX frame to end
17152
            repeat(10) @(posedge mrx_clk);
17153
            repeat(8) @(posedge wb_clk);
17154
            #1 check_tx_bd(tx_bd_num, data);
17155
            if (data[15] === 0) // if transmit is aborted, then it was Late Collision
17156
            begin
17157
              wait_for_tx_frame = 1'b0; // don't wait for retransmission of TX frame
17158
              $display("    ->Late Collision occured on %0d. byte after frame and SFD", i);
17159
            end
17160
            else
17161
              wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
17162
          end
17163
        end
17164
        // check if RX frame is accepted
17165
        begin
17166
          wait (MRxDV === 1'b1); // start receive
17167
          wait (MRxDV === 1'b0); // end receive
17168
          repeat(10) @(posedge mrx_clk);
17169
          repeat(8) @(posedge wb_clk);
17170
          #1 check_rx_bd(rx_bd_num, data);
17171
          if (data[15] === 0)
17172
          begin
17173
            check_rx_frame = 1'b1; // RX frame accepted and must be checked
17174
            if ((i + 8) == 0) // add preamble and SFD length (bytes)
17175
              $display("    ->RX frame, which started before or at beginning of TX frame, was accepted");
17176
            else
17177
              $display("    ->RX frame, which started %0d byte(s) after beginning of TX frame, was accepted", (i + 8));
17178
          end
17179
          else
17180
            check_rx_frame = 1'b0; // RX frame rejected
17181
          repeat(1) @(posedge wb_clk);
17182
        end
17183
      join
17184
 
17185
 
17186
 
17187
      // check length of a PACKET
17188
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
17189
           ((data[31:16] != 0) && (num_of_frames < 3)) )
17190
      begin
17191
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
17192
                        data[31:16], (i_length + 4));
17193
        test_fail("Wrong length of the packet out from PHY");
17194
        fail = fail + 1;
17195
      end
17196
      // check received RX packet data and CRC
17197
//if ((num_of_frames == 5))
17198
//begin                                           // CRC has 4 bytes for itself
17199
//  if (i_length[0] == 1'b1)
17200
//  begin
17201
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17202
//  end
17203
//  else
17204
//  begin
17205
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17206
//  end
17207
//  if (tmp > 0)
17208
//  begin
17209
//    `TIME; $display("*E Wrong data of the received packet");
17210
//    test_fail("Wrong data of the received packet");
17211
//    fail = fail + 1;
17212
//  end
17213
//end
17214
//else
17215
//if ((num_of_frames == 10))
17216
//begin                                           // CRC has 4 bytes for itself
17217
//  if (i_length[0] == 1'b1)
17218
//  begin
17219
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17220
//  end
17221
//  else
17222
//  begin
17223
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17224
//  end
17225
//  if (tmp > 0)
17226
//  begin
17227
//    `TIME; $display("*E Wrong data of the received packet");
17228
//    test_fail("Wrong data of the received packet");
17229
//    fail = fail + 1;
17230
//  end
17231
//end
17232
//else
17233
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
17234
      begin                                           // CRC has 4 bytes for itself
17235
        if (i_length[0] == 1'b0)
17236
        begin
17237
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17238
        end
17239
        else
17240
        begin
17241
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17242
        end
17243
        if (tmp > 0)
17244
        begin
17245
          `TIME; $display("*E Wrong data of the received packet");
17246
          test_fail("Wrong data of the received packet");
17247
          fail = fail + 1;
17248
        end
17249
      end
17250
 
17251
      // check WB INT signal
17252
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
17253
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
17254
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
17255
        begin
17256
          `TIME; $display("*E WB INT signal should be set");
17257
          test_fail("WB INT signal should be set");
17258
          fail = fail + 1;
17259
        end
17260
      end
17261
      else
17262
      begin
17263
        if (wb_int !== 1'b0)
17264
        begin
17265
          `TIME; $display("*E WB INT signal should not be set");
17266
          test_fail("WB INT signal should not be set");
17267
          fail = fail + 1;
17268
        end
17269
      end
17270
 
17271
      // check RX buffer descriptor of a packet
17272
      if (num_of_frames >= min_tmp)
17273
      begin
17274
        if ( (data[15:0] !== 16'h6000) && // wrap bit
17275
             (data[15:0] !== 16'h4000) ) // without wrap bit
17276
        begin
17277
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17278
          test_fail("RX buffer descriptor status is not correct");
17279
          fail = fail + 1;
17280
        end
17281
      end
17282
      else if (num_of_frames > 4)
17283
      begin
17284
        if ( (data[15:0] !== 16'h6004) && // wrap bit
17285
             (data[15:0] !== 16'h4004) ) // without wrap bit
17286
        begin
17287
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17288
          test_fail("RX buffer descriptor status is not correct");
17289
          fail = fail + 1;
17290
        end
17291
      end
17292
      else if (num_of_frames > 2)
17293
      begin
17294
        if ( (data[15:0] !== 16'h6006) && // wrap bit
17295
             (data[15:0] !== 16'h4006) ) // without wrap bit
17296
        begin
17297
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17298
          test_fail("RX buffer descriptor status is not correct");
17299
          fail = fail + 1;
17300
        end
17301
      end
17302
      else
17303
      begin
17304
        if (data[15] !== 1'b1)
17305
        begin
17306
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17307
          test_fail("RX buffer descriptor status is not correct");
17308
          fail = fail + 1;
17309
        end
17310
      end
17311
      // check interrupts
17312
      wait (wbm_working == 0);
17313
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17314
      if (num_of_frames >= 5)
17315
      begin
17316
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17317
        begin
17318
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17319
          test_fail("Interrupt Receive Buffer was not set");
17320
          fail = fail + 1;
17321
        end
17322
        if ((data & (~`ETH_INT_RXB)) !== 0)
17323
        begin
17324
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17325
          test_fail("Other interrupts (except Receive Buffer) were set");
17326
          fail = fail + 1;
17327
        end
17328
      end
17329
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
17330
      begin
17331
        if (data) // Checking if any interrupt is pending)
17332
        begin
17333
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
17334
          test_fail("Interrupts were set");
17335
          fail = fail + 1;
17336
        end
17337
      end
17338
      else
17339
      begin
17340
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
17341
        begin
17342
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
17343
          test_fail("Interrupt Receive Buffer Error was not set");
17344
          fail = fail + 1;
17345
        end
17346
        if ((data & (~`ETH_INT_RXE)) !== 0)
17347
        begin
17348
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
17349
          test_fail("Other interrupts (except Receive Buffer Error) were set");
17350
          fail = fail + 1;
17351
        end
17352
      end
17353
      // clear interrupts
17354
      wait (wbm_working == 0);
17355
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17356
      // check WB INT signal
17357
      if (wb_int !== 1'b0)
17358
      begin
17359
        test_fail("WB INT signal should not be set");
17360
        fail = fail + 1;
17361
      end
17362
      // INTERMEDIATE DISPLAYS
17363
      if (num_of_frames == 3)
17364
      begin
17365
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17366
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
17367
                 0, 3);
17368
      end
17369
      else if (num_of_frames == 9)
17370
      begin
17371
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17372
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
17373
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17374
                 5, 9);
17375
      end
17376
      else if (num_of_frames == 17)
17377
      begin
17378
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
17379
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17380
                 10, 17);
17381
      end
17382
      else if (num_of_frames == 27)
17383
      begin
17384
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
17385
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17386
                 18, 27);
17387
      end
17388
      else if (num_of_frames == 40)
17389
      begin
17390
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
17391
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17392
                 28, 40);
17393
      end
17394
      else if (num_of_frames == 54)
17395
      begin
17396
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
17397
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17398
                 41, 54);
17399
      end
17400
      else if (num_of_frames == 69)
17401
      begin
17402
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17403
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17404
                 55, 69);
17405
      end
17406
      else if (num_of_frames == 69)
17407
      begin
17408
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17409
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17410
                 55, 69);
17411
      end
17412
      else if (num_of_frames == 77)
17413
      begin
17414
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17415
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17416
                 70, 77);
17417
      end
17418
      // set length (loop variable)
17419
      i_length = i_length + 1;
17420
      // the number of frame transmitted
17421
      num_of_frames = num_of_frames + 1;
17422
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
17423
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
17424
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
17425
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
17426
        num_of_bd = 120;
17427
      else
17428
        num_of_bd = num_of_bd + 1;
17429
    end
17430 260 mohor
    // disable RX
17431 274 tadejm
    wait (wbm_working == 0);
17432
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
17433
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17434
    @(posedge wb_clk);
17435
    if(fail == 0)
17436
      test_ok;
17437
    else
17438
      fail = 0;
17439
  end
17440
 
17441
 
17442
  ////////////////////////////////////////////////////////////////////
17443
  ////                                                            ////
17444
  ////  Receive control frames with PASSALL option turned off     ////
17445
  ////  Using only one RX buffer decriptor ( 10Mbps ).            ////
17446
  ////                                                            ////
17447
  ////////////////////////////////////////////////////////////////////
17448
  if (test_num == 1) // 
17449
  begin
17450
    // TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
17451
    test_name   = "TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
17452
    `TIME; $display("  TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
17453
 
17454
    // unmask interrupts
17455
    wait (wbm_working == 0);
17456
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17457
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17458
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
17459
    wait (wbm_working == 0);
17460
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17461
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
17462
    wait (wbm_working == 0);
17463
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17464
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17465
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17466
    // prepare one control (PAUSE)packet
17467
    st_data = 8'h00;
17468
    set_rx_packet(0, 60, 1'b0, 48'h0180_c200_0001, 48'h0708_090A_0B0C, 16'h8808, st_data); // length without CRC
17469
    // prepare one packet of 100 bytes long
17470
    st_data = 8'h1A;
17471
    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
17472
    // check WB INT signal
17473
    if (wb_int !== 1'b0)
17474
    begin
17475
      test_fail("WB INT signal should not be set");
17476
      fail = fail + 1;
17477
    end
17478
 
17479
    // write to phy's control register for 10Mbps
17480
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
17481
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
17482
    speed = 10;
17483
 
17484
    for (i=0; i<4; i=i+1)
17485
    begin
17486
      // choose generating carrier sense and collision for first and last 64 lengths of frames
17487
      case (i)
17488
      0: // Interrupt is generated
17489
      begin
17490
        // enable interrupt generation
17491
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i));
17492
        // unmask interrupts
17493
        wait (wbm_working == 0);
17494
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17495
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17496
        // not detect carrier sense in FD and no collision
17497
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17498
        eth_phy.collision(0);
17499
      end
17500
      1: // Interrupt is not generated
17501
      begin
17502
        // enable interrupt generation
17503
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i) + 64));
17504
        // mask interrupts
17505
        wait (wbm_working == 0);
17506
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17507
        // detect carrier sense in FD and no collision
17508
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17509
        eth_phy.collision(0);
17510
      end
17511
      2: // Interrupt is not generated
17512
      begin
17513
        // disable interrupt generation
17514
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i));
17515
        // unmask interrupts
17516
        wait (wbm_working == 0);
17517
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17518
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17519
        // not detect carrier sense in FD and set collision
17520
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17521
        eth_phy.collision(1);
17522
      end
17523
      default: // 3: // Interrupt is not generated
17524
      begin
17525
        // disable interrupt generation
17526
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i) + 64));
17527
        // mask interrupts
17528
        wait (wbm_working == 0);
17529
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17530
        // detect carrier sense in FD and set collision
17531
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17532
        eth_phy.collision(1);
17533
      end
17534
      endcase
17535
 
17536
      append_rx_crc (64, 100, 1'b0, 1'b0); // To the second (data) packet
17537
      // set wrap bit
17538
      set_rx_bd_wrap(127);
17539
      set_rx_bd_empty(127, 127);
17540
      fork
17541
        begin
17542
          if (i[0] == 1'b0)
17543
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
17544
          else
17545
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 64, 104, 1'b0);
17546
          repeat(10) @(posedge mrx_clk);
17547
$display("1111");
17548
        end
17549
        begin
17550
          #1 check_rx_bd(127, data);
17551
$display("aaaa");
17552
          wait (MRxDV === 1'b1); // start transmit
17553
$display("bbbb");
17554
          #1 check_rx_bd(127, data);
17555
          if (data[15] !== 1)
17556
          begin
17557
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
17558
            fail = fail + 1;
17559
          end
17560
          wait (MRxDV === 1'b0); // end transmit
17561
$display("cccc");
17562
          while (data[15] === 1)
17563
          begin
17564
            #1 check_rx_bd(127, data);
17565
            @(posedge wb_clk);
17566
          end
17567
          repeat (1) @(posedge wb_clk);
17568
$display("2222");
17569
        end
17570
      join
17571
$display("dddd");
17572
      // check length of a PACKET
17573
      if (data[31:16] != (i_length + 4))
17574
      begin
17575
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
17576
                        data[31:16], (i_length + 4));
17577
        test_fail("Wrong length of the packet out from PHY");
17578
        fail = fail + 1;
17579
      end
17580
      // checking in the following if statement is performed only for first and last 64 lengths
17581
      // check received RX packet data and CRC
17582
      if (i_length[0] == 1'b0)
17583
      begin
17584
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17585
      end
17586
      else
17587
      begin
17588
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17589
      end
17590
      if (tmp > 0)
17591
      begin
17592
        `TIME; $display("*E Wrong data of the received packet");
17593
        test_fail("Wrong data of the received packet");
17594
        fail = fail + 1;
17595
      end
17596
      // check WB INT signal
17597
      if (i_length[1:0] == 2'h0)
17598
      begin
17599
        if (wb_int !== 1'b1)
17600
        begin
17601
          `TIME; $display("*E WB INT signal should be set");
17602
          test_fail("WB INT signal should be set");
17603
          fail = fail + 1;
17604
        end
17605
      end
17606
      else
17607
      begin
17608
        if (wb_int !== 1'b0)
17609
        begin
17610
          `TIME; $display("*E WB INT signal should not be set");
17611
          test_fail("WB INT signal should not be set");
17612
          fail = fail + 1;
17613
        end
17614
      end
17615
      // check RX buffer descriptor of a packet
17616
      check_rx_bd(127, data);
17617
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
17618
      begin
17619
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
17620
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
17621
        begin
17622
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17623
          test_fail("RX buffer descriptor status is not correct");
17624
          fail = fail + 1;
17625
        end
17626
      end
17627
      else // interrupt not enabled
17628
      begin
17629
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
17630
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
17631
        begin
17632
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17633
          test_fail("RX buffer descriptor status is not correct");
17634
          fail = fail + 1;
17635
        end
17636
      end
17637
      // clear RX buffer descriptor for first 4 frames
17638
      if (i_length < min_tmp)
17639
        clear_rx_bd(127, 127);
17640
      // check interrupts
17641
      wait (wbm_working == 0);
17642
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17643
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
17644
      begin
17645
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17646
        begin
17647
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17648
          test_fail("Interrupt Receive Buffer was not set");
17649
          fail = fail + 1;
17650
        end
17651
        if ((data & (~`ETH_INT_RXB)) !== 0)
17652
        begin
17653
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17654
          test_fail("Other interrupts (except Receive Buffer) were set");
17655
          fail = fail + 1;
17656
        end
17657
      end
17658
      else
17659
      begin
17660
        if (data !== 0)
17661
        begin
17662
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
17663
          test_fail("Any of interrupts (except Receive Buffer) was set");
17664
          fail = fail + 1;
17665
        end
17666
      end
17667
      // clear interrupts
17668
      wait (wbm_working == 0);
17669
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17670
      // check WB INT signal
17671
      if (wb_int !== 1'b0)
17672
      begin
17673
        test_fail("WB INT signal should not be set");
17674
        fail = fail + 1;
17675
      end
17676
      // INTERMEDIATE DISPLAYS
17677
      if ((i_length + 4) == (min_tmp + 64))
17678
      begin
17679
        // starting length is min_tmp, ending length is (min_tmp + 64)
17680
        $display("    receive small packets is NOT selected");
17681
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
17682
                 min_tmp, (min_tmp + 64));
17683
        // set receive small, remain the rest
17684
        wait (wbm_working == 0);
17685
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17686
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17687
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17688
      end
17689
      else if ((i_length + 4) == (max_tmp - 16))
17690
      begin
17691
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
17692
        $display("    receive small packets is selected");
17693
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
17694
                 (min_tmp + 64 + 128), tmp_data);
17695
        // reset receive small, remain the rest
17696
        wait (wbm_working == 0);
17697
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17698
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17699
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17700
      end
17701
      else if ((i_length + 4) == max_tmp)
17702
      begin
17703
        $display("    receive small packets is NOT selected");
17704
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
17705
                 (max_tmp - (4 + 16)), max_tmp);
17706
      end
17707
      // set length (loop variable)
17708
      if ((i_length + 4) < (min_tmp + 64))
17709
        i_length = i_length + 1;
17710
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
17711
      begin
17712
        i_length = i_length + 128;
17713
        tmp_data = i_length + 4; // last tmp_data is ending length
17714
      end
17715
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
17716
        i_length = max_tmp - (4 + 16);
17717
      else if ((i_length + 4) >= (max_tmp - 16))
17718
        i_length = i_length + 1;
17719
      else
17720
      begin
17721
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
17722
        #10 $stop;
17723
      end
17724
    end
17725
    // disable RX
17726
    wait (wbm_working == 0);
17727 260 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17728
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17729 254 mohor
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17730
    if(fail == 0)
17731
      test_ok;
17732
    else
17733
      fail = 0;
17734 209 tadejm
  end
17735
 
17736
 
17737
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
17738
 
17739 260 mohor
 
17740 209 tadejm
end
17741 274 tadejm
endtask // test_mac_half_duplex_flow
17742 209 tadejm
 
17743
 
17744 169 mohor
//////////////////////////////////////////////////////////////
17745
// WB Behavioral Models Basic tasks
17746
//////////////////////////////////////////////////////////////
17747
 
17748
task wbm_write;
17749
  input  [31:0] address_i;
17750
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
17751
  input  [3:0]  sel_i;
17752
  input  [31:0] size_i;
17753
  input  [3:0]  init_waits_i;
17754
  input  [3:0]  subseq_waits_i;
17755
 
17756
  reg `WRITE_STIM_TYPE write_data;
17757
  reg `WB_TRANSFER_FLAGS flags;
17758
  reg `WRITE_RETURN_TYPE write_status;
17759
  integer i;
17760
begin
17761 274 tadejm
  wbm_working = 1;
17762
 
17763 169 mohor
  write_status = 0;
17764
 
17765
  flags                    = 0;
17766
  flags`WB_TRANSFER_SIZE   = size_i;
17767
  flags`INIT_WAITS         = init_waits_i;
17768
  flags`SUBSEQ_WAITS       = subseq_waits_i;
17769
 
17770
  write_data               = 0;
17771
  write_data`WRITE_DATA    = data_i[31:0];
17772
  write_data`WRITE_ADDRESS = address_i;
17773
  write_data`WRITE_SEL     = sel_i;
17774
 
17775
  for (i = 0; i < size_i; i = i + 1)
17776
  begin
17777
    wb_master.blk_write_data[i] = write_data;
17778
    data_i                      = data_i >> 32;
17779
    write_data`WRITE_DATA       = data_i[31:0];
17780
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
17781 116 mohor
  end
17782
 
17783 169 mohor
  wb_master.wb_block_write(flags, write_status);
17784 116 mohor
 
17785 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
17786
  begin
17787
    `TIME;
17788
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
17789
  end
17790 274 tadejm
 
17791
  @(posedge wb_clk);
17792
  #3;
17793
  wbm_working = 0;
17794
  #1;
17795 169 mohor
end
17796
endtask // wbm_write
17797 116 mohor
 
17798 169 mohor
task wbm_read;
17799
  input  [31:0] address_i;
17800
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
17801
  input  [3:0]  sel_i;
17802
  input  [31:0] size_i;
17803
  input  [3:0]  init_waits_i;
17804
  input  [3:0]  subseq_waits_i;
17805
 
17806
  reg `READ_RETURN_TYPE read_data;
17807
  reg `WB_TRANSFER_FLAGS flags;
17808
  reg `READ_RETURN_TYPE read_status;
17809
  integer i;
17810
begin
17811 274 tadejm
  wbm_working = 1;
17812
 
17813 169 mohor
  read_status = 0;
17814
  data_o      = 0;
17815
 
17816
  flags                  = 0;
17817
  flags`WB_TRANSFER_SIZE = size_i;
17818
  flags`INIT_WAITS       = init_waits_i;
17819
  flags`SUBSEQ_WAITS     = subseq_waits_i;
17820
 
17821
  read_data              = 0;
17822
  read_data`READ_ADDRESS = address_i;
17823
  read_data`READ_SEL     = sel_i;
17824
 
17825
  for (i = 0; i < size_i; i = i + 1)
17826 116 mohor
  begin
17827 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
17828
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
17829
  end
17830
 
17831
  wb_master.wb_block_read(flags, read_status);
17832
 
17833
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
17834
  begin
17835
    `TIME;
17836
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
17837
  end
17838
 
17839
  for (i = 0; i < size_i; i = i + 1)
17840
  begin
17841
    data_o       = data_o << 32;
17842
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
17843
    data_o[31:0] = read_data`READ_DATA;
17844
  end
17845 274 tadejm
 
17846
  @(posedge wb_clk);
17847
  #3;
17848
  wbm_working = 0;
17849
  #1;
17850 169 mohor
end
17851
endtask // wbm_read
17852
 
17853
 
17854
//////////////////////////////////////////////////////////////
17855
// Ethernet Basic tasks
17856
//////////////////////////////////////////////////////////////
17857
 
17858
task hard_reset; //  MAC registers
17859
begin
17860
  // reset MAC registers
17861
  @(posedge wb_clk);
17862
  #2 wb_rst = 1'b1;
17863
  repeat(2) @(posedge wb_clk);
17864
  #2 wb_rst = 1'b0;
17865
end
17866
endtask // hard_reset
17867
 
17868
task reset_mac; //  MAC module
17869
  reg [31:0] tmp;
17870
  reg [31:0] tmp_no_rst;
17871
begin
17872
  // read MODER register first
17873
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17874
  // set reset bit - write back to MODER register with RESET bit
17875
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17876
  // clear reset bit - write back to MODER register without RESET bit
17877
  tmp_no_rst = `ETH_MODER_RST;
17878
  tmp_no_rst = ~tmp_no_rst;
17879
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17880
end
17881
endtask // reset_mac
17882
 
17883
task set_tx_bd;
17884
  input  [6:0]  tx_bd_num_start;
17885
  input  [6:0]  tx_bd_num_end;
17886
  input  [15:0] len;
17887
  input         irq;
17888
  input         pad;
17889
  input         crc;
17890
  input  [31:0] txpnt;
17891
 
17892
  integer       i;
17893
  integer       bd_status_addr, bd_ptr_addr;
17894
//  integer       buf_addr;
17895
begin
17896
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
17897
  begin
17898
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
17899
    bd_status_addr = `TX_BD_BASE + i * 8;
17900
    bd_ptr_addr = bd_status_addr + 4;
17901
    // initialize BD - status
17902
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
17903
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17904
    // initialize BD - pointer
17905
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17906
  end
17907
end
17908
endtask // set_tx_bd
17909
 
17910
task set_tx_bd_wrap;
17911
  input  [6:0]  tx_bd_num_end;
17912
  integer       bd_status_addr, tmp;
17913
begin
17914
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17915
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17916
  // set wrap bit to this BD - this BD should be last-one
17917
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17918
end
17919
endtask // set_tx_bd_wrap
17920
 
17921
task set_tx_bd_ready;
17922
  input  [6:0]  tx_nd_num_strat;
17923
  input  [6:0]  tx_bd_num_end;
17924
  integer       i;
17925
  integer       bd_status_addr, tmp;
17926
begin
17927
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17928
  begin
17929
    bd_status_addr = `TX_BD_BASE + i * 8;
17930
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17931
    // set empty bit to this BD - this BD should be ready
17932
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17933
  end
17934
end
17935
endtask // set_tx_bd_ready
17936
 
17937
task check_tx_bd;
17938
  input  [6:0]  tx_bd_num_end;
17939
  output [31:0] tx_bd_status;
17940
  integer       bd_status_addr, tmp;
17941
begin
17942
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17943
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17944 274 tadejm
  tx_bd_status = tmp;
17945 169 mohor
end
17946
endtask // check_tx_bd
17947
 
17948
task clear_tx_bd;
17949
  input  [6:0]  tx_nd_num_strat;
17950
  input  [6:0]  tx_bd_num_end;
17951
  integer       i;
17952
  integer       bd_status_addr, bd_ptr_addr;
17953
begin
17954
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17955
  begin
17956
    bd_status_addr = `TX_BD_BASE + i * 8;
17957
    bd_ptr_addr = bd_status_addr + 4;
17958
    // clear BD - status
17959
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17960
    // clear BD - pointer
17961
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17962
  end
17963
end
17964
endtask // clear_tx_bd
17965
 
17966
task set_rx_bd;
17967
  input  [6:0]  rx_bd_num_strat;
17968
  input  [6:0]  rx_bd_num_end;
17969
  input         irq;
17970
  input  [31:0] rxpnt;
17971
//  input  [6:0]  rxbd_num;
17972
  integer       i;
17973
  integer       bd_status_addr, bd_ptr_addr;
17974
//  integer       buf_addr;
17975
begin
17976
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17977
  begin
17978
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
17979 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17980
//    bd_ptr_addr = bd_status_addr + 4; 
17981
    bd_status_addr = `TX_BD_BASE + i * 8;
17982
    bd_ptr_addr = bd_status_addr + 4;
17983 116 mohor
 
17984 169 mohor
    // initialize BD - status
17985
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17986
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
17987
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17988
    // initialize BD - pointer
17989
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17990
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17991
  end
17992
end
17993
endtask // set_rx_bd
17994 116 mohor
 
17995 169 mohor
task set_rx_bd_wrap;
17996
  input  [6:0]  rx_bd_num_end;
17997
  integer       bd_status_addr, tmp;
17998
begin
17999 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
18000
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
18001 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18002
  // set wrap bit to this BD - this BD should be last-one
18003
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18004
end
18005
endtask // set_rx_bd_wrap
18006 116 mohor
 
18007 169 mohor
task set_rx_bd_empty;
18008
  input  [6:0]  rx_bd_num_strat;
18009
  input  [6:0]  rx_bd_num_end;
18010
  integer       i;
18011
  integer       bd_status_addr, tmp;
18012
begin
18013
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
18014
  begin
18015 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
18016
    bd_status_addr = `TX_BD_BASE + i * 8;
18017 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18018
    // set empty bit to this BD - this BD should be ready
18019
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18020 116 mohor
  end
18021 169 mohor
end
18022
endtask // set_rx_bd_empty
18023 116 mohor
 
18024 169 mohor
task check_rx_bd;
18025
  input  [6:0]  rx_bd_num_end;
18026
  output [31:0] rx_bd_status;
18027
  integer       bd_status_addr, tmp;
18028
begin
18029 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
18030
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
18031 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18032 274 tadejm
  rx_bd_status = tmp;
18033 169 mohor
end
18034
endtask // check_rx_bd
18035 116 mohor
 
18036 169 mohor
task clear_rx_bd;
18037
  input  [6:0]  rx_bd_num_strat;
18038
  input  [6:0]  rx_bd_num_end;
18039
  integer       i;
18040
  integer       bd_status_addr, bd_ptr_addr;
18041
begin
18042
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
18043
  begin
18044 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
18045
    bd_status_addr = `TX_BD_BASE + i * 8;
18046 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
18047
    // clear BD - status
18048
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18049
    // clear BD - pointer
18050
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
18051
  end
18052
end
18053
endtask // clear_rx_bd
18054 116 mohor
 
18055 169 mohor
task set_tx_packet;
18056
  input  [31:0] txpnt;
18057
  input  [15:0] len;
18058
  input  [7:0]  eth_start_data;
18059
  integer       i, sd;
18060
  integer       buffer;
18061
  reg           delta_t;
18062
begin
18063
  buffer = txpnt;
18064
  sd = eth_start_data;
18065
  delta_t = 0;
18066 116 mohor
 
18067 169 mohor
  // First write might not be word allign.
18068
  if(buffer[1:0] == 1)
18069
  begin
18070
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
18071
    sd = sd + 3;
18072
    i = 3;
18073
  end
18074
  else if(buffer[1:0] == 2)
18075
  begin
18076
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
18077
    sd = sd + 2;
18078
    i = 2;
18079
  end
18080
  else if(buffer[1:0] == 3)
18081
  begin
18082
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
18083
    sd = sd + 1;
18084
    i = 1;
18085
  end
18086
  else
18087
    i = 0;
18088
  delta_t = !delta_t;
18089 116 mohor
 
18090 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
18091
  begin
18092
    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);
18093
    sd = sd + 4;
18094
  end
18095
  delta_t = !delta_t;
18096
 
18097
  // Last word
18098
  if((len - i) == 3)
18099 116 mohor
  begin
18100 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);
18101
  end
18102
  else if((len - i) == 2)
18103
  begin
18104
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
18105
  end
18106
  else if((len - i) == 1)
18107
  begin
18108
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
18109
  end
18110
  else if((len - i) == 4)
18111
  begin
18112
    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);
18113
  end
18114
  else
18115
    $display("(%0t)(%m) ERROR", $time);
18116
  delta_t = !delta_t;
18117
end
18118
endtask // set_tx_packet
18119
 
18120
task check_tx_packet;
18121
  input  [31:0] txpnt_wb;  // source
18122
  input  [31:0] txpnt_phy; // destination
18123
  input  [15:0] len;
18124
  output [31:0] failure;
18125
  integer       i, data_wb, data_phy;
18126
  reg    [31:0] addr_wb, addr_phy;
18127
  reg    [31:0] failure;
18128
  reg           delta_t;
18129
begin
18130
  addr_wb = txpnt_wb;
18131
  addr_phy = txpnt_phy;
18132
  delta_t = 0;
18133
  failure = 0;
18134 209 tadejm
  #1;
18135 169 mohor
  // First write might not be word allign.
18136
  if(addr_wb[1:0] == 1)
18137
  begin
18138
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
18139
    data_phy[31:24] = 0;
18140
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
18141
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
18142
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
18143
    i = 3;
18144
    if (data_phy[23:0] !== data_wb[23:0])
18145
    begin
18146
      `TIME;
18147 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
18148
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18149 169 mohor
      failure = 1;
18150
    end
18151
  end
18152
  else if (addr_wb[1:0] == 2)
18153
  begin
18154
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
18155
    data_phy[31:16] = 0;
18156
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
18157
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
18158
    i = 2;
18159
    if (data_phy[15:0] !== data_wb[15:0])
18160
    begin
18161
      `TIME;
18162 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
18163
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18164 169 mohor
      failure = 1;
18165
    end
18166
  end
18167
  else if (addr_wb[1:0] == 3)
18168
  begin
18169
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
18170
    data_phy[31: 8] = 0;
18171
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
18172
    i = 1;
18173
    if (data_phy[7:0] !== data_wb[7:0])
18174
    begin
18175
      `TIME;
18176 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
18177
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18178 169 mohor
      failure = 1;
18179
    end
18180
  end
18181
  else
18182
    i = 0;
18183
  delta_t = !delta_t;
18184 209 tadejm
  #1;
18185 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
18186
  begin
18187
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18188
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18189
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18190
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
18191
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
18192 279 mohor
 
18193 169 mohor
    if (data_phy[31:0] !== data_wb[31:0])
18194
    begin
18195
      `TIME;
18196 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]);
18197
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18198 169 mohor
      failure = failure + 1;
18199
    end
18200
  end
18201
  delta_t = !delta_t;
18202 209 tadejm
  #1;
18203 169 mohor
  // Last word
18204
  if((len - i) == 3)
18205
  begin
18206
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
18207
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18208
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18209
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
18210
    data_phy[ 7: 0] = 0;
18211
    if (data_phy[31:8] !== data_wb[31:8])
18212
    begin
18213
      `TIME;
18214 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]);
18215
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18216 169 mohor
      failure = failure + 1;
18217
    end
18218
  end
18219
  else if((len - i) == 2)
18220
  begin
18221
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
18222
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18223
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18224
    data_phy[15: 8] = 0;
18225
    data_phy[ 7: 0] = 0;
18226
    if (data_phy[31:16] !== data_wb[31:16])
18227
    begin
18228
      `TIME;
18229 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]);
18230
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18231 169 mohor
      failure = failure + 1;
18232
    end
18233
  end
18234
  else if((len - i) == 1)
18235
  begin
18236
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
18237
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18238
    data_phy[23:16] = 0;
18239
    data_phy[15: 8] = 0;
18240
    data_phy[ 7: 0] = 0;
18241
    if (data_phy[31:24] !== data_wb[31:24])
18242
    begin
18243
      `TIME;
18244 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]);
18245
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18246 169 mohor
      failure = failure + 1;
18247
    end
18248
  end
18249
  else if((len - i) == 4)
18250
  begin
18251
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18252
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18253
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18254
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
18255
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
18256
    if (data_phy[31:0] !== data_wb[31:0])
18257
    begin
18258
      `TIME;
18259 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]);
18260
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18261 169 mohor
      failure = failure + 1;
18262
    end
18263
  end
18264
  else
18265
    $display("(%0t)(%m) ERROR", $time);
18266
  delta_t = !delta_t;
18267
end
18268
endtask // check_tx_packet
18269
 
18270
task set_rx_packet;
18271
  input  [31:0] rxpnt;
18272
  input  [15:0] len;
18273
  input         plus_dribble_nibble; // if length is longer for one nibble
18274
  input  [47:0] eth_dest_addr;
18275
  input  [47:0] eth_source_addr;
18276
  input  [15:0] eth_type_len;
18277
  input  [7:0]  eth_start_data;
18278
  integer       i, sd;
18279
  reg    [47:0] dest_addr;
18280
  reg    [47:0] source_addr;
18281
  reg    [15:0] type_len;
18282
  reg    [21:0] buffer;
18283
  reg           delta_t;
18284
begin
18285
  buffer = rxpnt[21:0];
18286
  dest_addr = eth_dest_addr;
18287
  source_addr = eth_source_addr;
18288
  type_len = eth_type_len;
18289
  sd = eth_start_data;
18290
  delta_t = 0;
18291
  for(i = 0; i < len; i = i + 1)
18292
  begin
18293
    if (i < 6)
18294
    begin
18295
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18296
      dest_addr = dest_addr << 8;
18297
    end
18298
    else if (i < 12)
18299
    begin
18300
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18301
      source_addr = source_addr << 8;
18302
    end
18303
    else if (i < 14)
18304
    begin
18305
      eth_phy.rx_mem[buffer] = type_len[15:8];
18306
      type_len = type_len << 8;
18307
    end
18308
    else
18309
    begin
18310
      eth_phy.rx_mem[buffer] = sd[7:0];
18311
      sd = sd + 1;
18312
    end
18313
    buffer = buffer + 1;
18314
  end
18315
  delta_t = !delta_t;
18316
  if (plus_dribble_nibble)
18317
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
18318
  delta_t = !delta_t;
18319
end
18320
endtask // set_rx_packet
18321
 
18322 267 mohor
task set_rx_control_packet;
18323
  input  [31:0] rxpnt;
18324
  input  [15:0] PauseTV;
18325
  integer       i;
18326
  reg    [47:0] dest_addr;
18327
  reg    [47:0] source_addr;
18328
  reg    [15:0] type_len;
18329
  reg    [21:0] buffer;
18330
  reg           delta_t;
18331
  reg    [15:0] PTV;
18332
  reg    [15:0] opcode;
18333
begin
18334
  buffer = rxpnt[21:0];
18335
  dest_addr = 48'h0180_c200_0001;
18336
  source_addr = 48'h0708_090A_0B0C;
18337
  type_len = 16'h8808;
18338
  opcode = 16'h0001;
18339
  PTV = PauseTV;
18340
  delta_t = 0;
18341
  for(i = 0; i < 60; i = i + 1)
18342
  begin
18343
    if (i < 6)
18344
    begin
18345
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18346
      dest_addr = dest_addr << 8;
18347
    end
18348
    else if (i < 12)
18349
    begin
18350
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18351
      source_addr = source_addr << 8;
18352
    end
18353
    else if (i < 14)
18354
    begin
18355
      eth_phy.rx_mem[buffer] = type_len[15:8];
18356
      type_len = type_len << 8;
18357
    end
18358
    else if (i < 16)
18359
    begin
18360
      eth_phy.rx_mem[buffer] = opcode[15:8];
18361
      opcode = opcode << 8;
18362
    end
18363
    else if (i < 18)
18364
    begin
18365
      eth_phy.rx_mem[buffer] = PTV[15:8];
18366
      PTV = PTV << 8;
18367
    end
18368
    else
18369
    begin
18370
      eth_phy.rx_mem[buffer] = 0;
18371
    end
18372
    buffer = buffer + 1;
18373
  end
18374
  delta_t = !delta_t;
18375
  append_rx_crc (rxpnt, 60, 1'b0, 1'b0); // CRC for control packet
18376
end
18377
endtask // set_rx_control_packet
18378
 
18379 243 tadejm
task set_rx_addr_type;
18380
  input  [31:0] rxpnt;
18381
  input  [47:0] eth_dest_addr;
18382
  input  [47:0] eth_source_addr;
18383
  input  [15:0] eth_type_len;
18384
  integer       i;
18385
  reg    [47:0] dest_addr;
18386
  reg    [47:0] source_addr;
18387
  reg    [15:0] type_len;
18388
  reg    [21:0] buffer;
18389
  reg           delta_t;
18390
begin
18391
  buffer = rxpnt[21:0];
18392
  dest_addr = eth_dest_addr;
18393
  source_addr = eth_source_addr;
18394
  type_len = eth_type_len;
18395
  delta_t = 0;
18396
  for(i = 0; i < 14; i = i + 1)
18397
  begin
18398
    if (i < 6)
18399
    begin
18400
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18401
      dest_addr = dest_addr << 8;
18402
    end
18403
    else if (i < 12)
18404
    begin
18405
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18406
      source_addr = source_addr << 8;
18407
    end
18408
    else // if (i < 14)
18409
    begin
18410
      eth_phy.rx_mem[buffer] = type_len[15:8];
18411
      type_len = type_len << 8;
18412
    end
18413
    buffer = buffer + 1;
18414
  end
18415
  delta_t = !delta_t;
18416
end
18417
endtask // set_rx_addr_type
18418
 
18419 169 mohor
task check_rx_packet;
18420
  input  [31:0] rxpnt_phy; // source
18421
  input  [31:0] rxpnt_wb;  // destination
18422
  input  [15:0] len;
18423
  input         plus_dribble_nibble; // if length is longer for one nibble
18424
  input         successful_dribble_nibble; // if additional nibble is stored into memory
18425
  output [31:0] failure;
18426
  integer       i, data_wb, data_phy;
18427
  reg    [31:0] addr_wb, addr_phy;
18428
  reg    [31:0] failure;
18429
  reg    [21:0] buffer;
18430
  reg           delta_t;
18431
begin
18432
  addr_phy = rxpnt_phy;
18433
  addr_wb = rxpnt_wb;
18434
  delta_t = 0;
18435
  failure = 0;
18436
 
18437
  // First write might not be word allign.
18438
  if(addr_wb[1:0] == 1)
18439
  begin
18440
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
18441
    data_phy[31:24] = 0;
18442
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
18443
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18444
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
18445
    i = 3;
18446
    if (data_phy[23:0] !== data_wb[23:0])
18447
    begin
18448
      `TIME;
18449 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18450
      $display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
18451 169 mohor
      failure = 1;
18452
    end
18453
  end
18454
  else if (addr_wb[1:0] == 2)
18455
  begin
18456
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
18457
    data_phy[31:16] = 0;
18458
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
18459
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18460
    i = 2;
18461
    if (data_phy[15:0] !== data_wb[15:0])
18462
    begin
18463
      `TIME;
18464 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18465
      $display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
18466 169 mohor
      failure = 1;
18467
    end
18468
  end
18469
  else if (addr_wb[1:0] == 3)
18470
  begin
18471
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
18472
    data_phy[31: 8] = 0;
18473
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
18474
    i = 1;
18475
    if (data_phy[7:0] !== data_wb[7:0])
18476
    begin
18477
      `TIME;
18478 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18479
      $display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
18480 169 mohor
      failure = 1;
18481
    end
18482
  end
18483
  else
18484
    i = 0;
18485
  delta_t = !delta_t;
18486
 
18487
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
18488
  begin
18489
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18490
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18491
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18492
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18493
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18494
    if (data_phy[31:0] !== data_wb[31:0])
18495
    begin
18496
      `TIME;
18497 243 tadejm
      if (i == 0)
18498
        $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18499
      $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]);
18500 169 mohor
      failure = failure + 1;
18501
    end
18502
  end
18503
  delta_t = !delta_t;
18504
 
18505
  // Last word
18506
  if((len - i) == 3)
18507
  begin
18508
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18509
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18510
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18511
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18512
    if (plus_dribble_nibble)
18513
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18514
    else
18515
      data_phy[ 7: 0] = 0;
18516
    if (data_phy[31:8] !== data_wb[31:8])
18517
    begin
18518
      `TIME;
18519 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]);
18520 169 mohor
      failure = failure + 1;
18521
    end
18522
    if (plus_dribble_nibble && successful_dribble_nibble)
18523
    begin
18524
      if (data_phy[3:0] !== data_wb[3:0])
18525 116 mohor
      begin
18526 169 mohor
        `TIME;
18527 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18528 169 mohor
        failure = failure + 1;
18529 116 mohor
      end
18530 169 mohor
    end
18531
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18532
    begin
18533
      if (data_phy[3:0] === data_wb[3:0])
18534 116 mohor
      begin
18535 169 mohor
        `TIME;
18536 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18537 169 mohor
        failure = failure + 1;
18538 116 mohor
      end
18539 169 mohor
    end
18540
  end
18541
  else if((len - i) == 2)
18542
  begin
18543
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
18544
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18545
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18546
    if (plus_dribble_nibble)
18547
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18548
    else
18549
      data_phy[15: 8] = 0;
18550
    data_phy[ 7: 0] = 0;
18551
    if (data_phy[31:16] !== data_wb[31:16])
18552
    begin
18553
      `TIME;
18554 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]);
18555 169 mohor
      failure = failure + 1;
18556
    end
18557
    if (plus_dribble_nibble && successful_dribble_nibble)
18558
    begin
18559
      if (data_phy[11:8] !== data_wb[11:8])
18560
      begin
18561
        `TIME;
18562 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18563 169 mohor
        failure = failure + 1;
18564
      end
18565
    end
18566
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18567
    begin
18568
      if (data_phy[11:8] === data_wb[11:8])
18569
      begin
18570
        `TIME;
18571 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18572 169 mohor
        failure = failure + 1;
18573
      end
18574
    end
18575
  end
18576
  else if((len - i) == 1)
18577
  begin
18578
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
18579
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18580
    if (plus_dribble_nibble)
18581
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18582
    else
18583
      data_phy[23:16] = 0;
18584
    data_phy[15: 8] = 0;
18585
    data_phy[ 7: 0] = 0;
18586
    if (data_phy[31:24] !== data_wb[31:24])
18587
    begin
18588
      `TIME;
18589 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]);
18590 169 mohor
      failure = failure + 1;
18591
    end
18592
    if (plus_dribble_nibble && successful_dribble_nibble)
18593
    begin
18594
      if (data_phy[19:16] !== data_wb[19:16])
18595
      begin
18596
        `TIME;
18597 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18598 169 mohor
        failure = failure + 1;
18599
      end
18600
    end
18601
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18602
    begin
18603
      if (data_phy[19:16] === data_wb[19:16])
18604
      begin
18605
        `TIME;
18606 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18607 169 mohor
        failure = failure + 1;
18608
      end
18609
    end
18610
  end
18611
  else if((len - i) == 4)
18612
  begin
18613
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18614
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18615
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18616
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18617
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18618
    if (data_phy[31:0] !== data_wb[31:0])
18619
    begin
18620
      `TIME;
18621 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]);
18622 169 mohor
      failure = failure + 1;
18623
    end
18624
    if (plus_dribble_nibble)
18625
    begin
18626
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
18627
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
18628
      if (successful_dribble_nibble)
18629
      begin
18630
        if (data_phy[27:24] !== data_wb[27:24])
18631
        begin
18632
          `TIME;
18633 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18634 169 mohor
          failure = failure + 1;
18635
        end
18636
      end
18637
      else
18638
      begin
18639
        if (data_phy[27:24] === data_wb[27:24])
18640
        begin
18641
          `TIME;
18642 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18643 169 mohor
          failure = failure + 1;
18644
        end
18645
      end
18646
    end
18647
  end
18648
  else
18649
    $display("(%0t)(%m) ERROR", $time);
18650
  delta_t = !delta_t;
18651
end
18652
endtask // check_rx_packet
18653 116 mohor
 
18654 169 mohor
//////////////////////////////////////////////////////////////
18655
// Ethernet CRC Basic tasks
18656
//////////////////////////////////////////////////////////////
18657
 
18658
task append_tx_crc;
18659
  input  [31:0] txpnt_wb;  // source
18660
  input  [15:0] len; // length in bytes without CRC
18661
  input         negated_crc; // if appended CRC is correct or not
18662
  reg    [31:0] crc;
18663
  reg    [31:0] addr_wb;
18664
  reg           delta_t;
18665
begin
18666 243 tadejm
  addr_wb = txpnt_wb + {16'h0, len};
18667 169 mohor
  delta_t = 0;
18668
  // calculate CRC from prepared packet
18669
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
18670
  if (negated_crc)
18671
    crc = ~crc;
18672
  delta_t = !delta_t;
18673
 
18674
  // Write might not be word allign.
18675
  if (addr_wb[1:0] == 1)
18676
  begin
18677
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
18678
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
18679 116 mohor
  end
18680 169 mohor
  else if (addr_wb[1:0] == 2)
18681
  begin
18682
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
18683
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
18684
  end
18685
  else if (addr_wb[1:0] == 3)
18686
  begin
18687
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
18688
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
18689
  end
18690
  else
18691
  begin
18692 315 tadejm
//    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
18693
    wb_slave.wr_mem(addr_wb, crc[31:0], 4'hF);
18694 169 mohor
  end
18695
  delta_t = !delta_t;
18696
end
18697
endtask // append_tx_crc
18698 116 mohor
 
18699 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
18700
  input  [31:0] txpnt_phy; // destination
18701
  input  [15:0] len; // length in bytes without CRC
18702
  input         negated_crc; // if appended CRC is correct or not
18703
  output [31:0] failure;
18704
  reg    [31:0] failure;
18705
  reg    [31:0] crc_calc;
18706
  reg    [31:0] crc;
18707
  reg    [31:0] addr_phy;
18708
  reg           delta_t;
18709
begin
18710
  addr_phy = txpnt_phy;
18711
  failure = 0;
18712
  // calculate CRC from sent packet
18713
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18714
//#10;
18715
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18716 209 tadejm
  #1;
18717 169 mohor
  addr_phy = addr_phy + len;
18718
  // Read CRC - BIG endian
18719
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
18720
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
18721
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
18722
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
18723
 
18724
  delta_t = !delta_t;
18725
  if (negated_crc)
18726
  begin
18727
    if ((~crc_calc) !== crc)
18728
    begin
18729
      `TIME;
18730
      $display("*E Negated CRC was not successfuly transmitted!");
18731
      failure = failure + 1;
18732
    end
18733
  end
18734
  else
18735
  begin
18736
    if (crc_calc !== crc)
18737
    begin
18738
      `TIME;
18739 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
18740 169 mohor
      failure = failure + 1;
18741
    end
18742
  end
18743
  delta_t = !delta_t;
18744
end
18745
endtask // check_tx_crc
18746
 
18747
task append_rx_crc;
18748
  input  [31:0] rxpnt_phy; // source
18749
  input  [15:0] len; // length in bytes without CRC
18750
  input         plus_dribble_nibble; // if length is longer for one nibble
18751
  input         negated_crc; // if appended CRC is correct or not
18752
  reg    [31:0] crc;
18753
  reg    [7:0]  tmp;
18754
  reg    [31:0] addr_phy;
18755
  reg           delta_t;
18756
begin
18757
  addr_phy = rxpnt_phy + len;
18758
  delta_t = 0;
18759
  // calculate CRC from prepared packet
18760
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
18761
  if (negated_crc)
18762
    crc = ~crc;
18763
  delta_t = !delta_t;
18764
 
18765
  if (plus_dribble_nibble)
18766
  begin
18767
    tmp = eth_phy.rx_mem[addr_phy];
18768 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
18769
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
18770
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
18771
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
18772
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
18773 169 mohor
  end
18774
  else
18775
  begin
18776 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
18777
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
18778
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
18779
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
18780 169 mohor
  end
18781
end
18782
endtask // append_rx_crc
18783
 
18784
// paralel CRC checking for PHY TX
18785
task paralel_crc_phy_tx;
18786
  input  [31:0] start_addr; // start address
18787
  input  [31:0] len; // length of frame in Bytes without CRC length
18788
  input         plus_dribble_nibble; // if length is longer for one nibble
18789
  output [31:0] crc_out;
18790
  reg    [21:0] addr_cnt; // only 22 address lines
18791
  integer       word_cnt;
18792
  integer       nibble_cnt;
18793
  reg    [31:0] load_reg;
18794
  reg           delta_t;
18795
  reg    [31:0] crc_next;
18796
  reg    [31:0] crc;
18797
  reg           crc_error;
18798
  reg     [3:0] data_in;
18799
  integer       i;
18800
begin
18801
  #1 addr_cnt = start_addr[21:0];
18802
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18803
  crc = 32'hFFFF_FFFF; // INITIAL value
18804
  delta_t = 0;
18805
  // length must include 4 bytes of ZEROs, to generate CRC
18806
  // get number of nibbles from Byte length (2^1 = 2)
18807
  if (plus_dribble_nibble)
18808
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18809
  else
18810
    nibble_cnt = ((len + 4) << 1);
18811
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18812
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18813
  addr_cnt = addr_cnt + 1;
18814
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18815
  addr_cnt = addr_cnt + 1;
18816
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18817
  addr_cnt = addr_cnt + 1;
18818
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18819
  addr_cnt = addr_cnt + 1;
18820
  while (nibble_cnt > 0)
18821
  begin
18822
    // wait for delta time
18823
    delta_t = !delta_t;
18824
    // shift data in
18825
 
18826
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18827
      data_in[3:0] = 4'h0;
18828
    else
18829
 
18830
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18831
    crc_next[0]  = (data_in[0] ^ crc[28]);
18832
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18833
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18834
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18835
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18836
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18837
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18838
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18839
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18840
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18841
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18842
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18843
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18844
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18845
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18846
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18847
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18848
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18849
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18850
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18851
    crc_next[20] =  crc[16];
18852
    crc_next[21] =  crc[17];
18853
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18854
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18855
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18856
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18857
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18858
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18859
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18860
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18861
    crc_next[30] =  crc[26];
18862
    crc_next[31] =  crc[27];
18863
 
18864
    crc = crc_next;
18865
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18866
    case (nibble_cnt)
18867
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18868
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18869
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18870
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18871
    default: crc_out = crc_out;
18872
    endcase
18873
    // wait for delta time
18874
    delta_t = !delta_t;
18875
    // increment address and load new data
18876
    if ((word_cnt+3) == 7)//4)
18877
    begin
18878
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18879
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18880
      addr_cnt = addr_cnt + 1;
18881
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18882
      addr_cnt = addr_cnt + 1;
18883
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18884
      addr_cnt = addr_cnt + 1;
18885
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18886
      addr_cnt = addr_cnt + 1;
18887
    end
18888
    // set new load bit position
18889
    if((word_cnt+3) == 31)
18890
      word_cnt = 16;
18891
    else if ((word_cnt+3) == 23)
18892
      word_cnt = 8;
18893
    else if ((word_cnt+3) == 15)
18894
      word_cnt = 0;
18895
    else if ((word_cnt+3) == 7)
18896
      word_cnt = 24;
18897
    else
18898
      word_cnt = word_cnt + 4;// - 4;
18899
    // decrement nibble counter
18900
    nibble_cnt = nibble_cnt - 1;
18901
    // wait for delta time
18902
    delta_t = !delta_t;
18903
  end // while
18904
  #1;
18905
end
18906
endtask // paralel_crc_phy_tx
18907
 
18908
// paralel CRC calculating for PHY RX
18909
task paralel_crc_phy_rx;
18910
  input  [31:0] start_addr; // start address
18911
  input  [31:0] len; // length of frame in Bytes without CRC length
18912
  input         plus_dribble_nibble; // if length is longer for one nibble
18913 209 tadejm
  output [31:0] crc_out;
18914 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
18915
  integer       word_cnt;
18916 209 tadejm
  integer       nibble_cnt;
18917 169 mohor
  reg    [31:0] load_reg;
18918
  reg           delta_t;
18919 209 tadejm
  reg    [31:0] crc_next;
18920
  reg    [31:0] crc;
18921
  reg           crc_error;
18922
  reg     [3:0] data_in;
18923
  integer       i;
18924 169 mohor
begin
18925
  #1 addr_cnt = start_addr[21:0];
18926 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18927
  crc = 32'hFFFF_FFFF; // INITIAL value
18928 169 mohor
  delta_t = 0;
18929
  // length must include 4 bytes of ZEROs, to generate CRC
18930 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
18931 169 mohor
  if (plus_dribble_nibble)
18932 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18933 169 mohor
  else
18934 209 tadejm
    nibble_cnt = ((len + 4) << 1);
18935
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18936 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
18937
  addr_cnt = addr_cnt + 1;
18938
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
18939
  addr_cnt = addr_cnt + 1;
18940 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
18941 169 mohor
  addr_cnt = addr_cnt + 1;
18942 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
18943
  addr_cnt = addr_cnt + 1;
18944
  while (nibble_cnt > 0)
18945 169 mohor
  begin
18946
    // wait for delta time
18947
    delta_t = !delta_t;
18948
    // shift data in
18949 209 tadejm
 
18950
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18951
      data_in[3:0] = 4'h0;
18952 169 mohor
    else
18953 209 tadejm
 
18954
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18955
    crc_next[0]  = (data_in[0] ^ crc[28]);
18956
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18957
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18958
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18959
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18960
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18961
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18962
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18963
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18964
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18965
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18966
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18967
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18968
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18969
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18970
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18971
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18972
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18973
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18974
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18975
    crc_next[20] =  crc[16];
18976
    crc_next[21] =  crc[17];
18977
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18978
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18979
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18980
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18981
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18982
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18983
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18984
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18985
    crc_next[30] =  crc[26];
18986
    crc_next[31] =  crc[27];
18987
 
18988
    crc = crc_next;
18989
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18990
    case (nibble_cnt)
18991
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18992
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18993
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18994
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18995
    default: crc_out = crc_out;
18996
    endcase
18997 169 mohor
    // wait for delta time
18998
    delta_t = !delta_t;
18999
    // increment address and load new data
19000 209 tadejm
    if ((word_cnt+3) == 7)//4)
19001 169 mohor
    begin
19002 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19003 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19004
      addr_cnt = addr_cnt + 1;
19005
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19006
      addr_cnt = addr_cnt + 1;
19007 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
19008 169 mohor
      addr_cnt = addr_cnt + 1;
19009 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
19010
      addr_cnt = addr_cnt + 1;
19011 169 mohor
    end
19012
    // set new load bit position
19013 209 tadejm
    if((word_cnt+3) == 31)
19014 169 mohor
      word_cnt = 16;
19015 209 tadejm
    else if ((word_cnt+3) == 23)
19016 169 mohor
      word_cnt = 8;
19017 209 tadejm
    else if ((word_cnt+3) == 15)
19018 169 mohor
      word_cnt = 0;
19019 209 tadejm
    else if ((word_cnt+3) == 7)
19020 169 mohor
      word_cnt = 24;
19021
    else
19022 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
19023
    // decrement nibble counter
19024
    nibble_cnt = nibble_cnt - 1;
19025 169 mohor
    // wait for delta time
19026
    delta_t = !delta_t;
19027
  end // while
19028
  #1;
19029
end
19030
endtask // paralel_crc_phy_rx
19031
 
19032
// paralel CRC checking for MAC
19033
task paralel_crc_mac;
19034
  input  [31:0] start_addr; // start address
19035
  input  [31:0] len; // length of frame in Bytes without CRC length
19036
  input         plus_dribble_nibble; // if length is longer for one nibble
19037 209 tadejm
  output [31:0] crc_out;
19038
 
19039
  reg    [21:0] addr_cnt; // only 22 address lines
19040 169 mohor
  integer       word_cnt;
19041 209 tadejm
  integer       nibble_cnt;
19042 169 mohor
  reg    [31:0] load_reg;
19043
  reg           delta_t;
19044 209 tadejm
  reg    [31:0] crc_next;
19045
  reg    [31:0] crc;
19046
  reg           crc_error;
19047
  reg     [3:0] data_in;
19048
  integer       i;
19049 169 mohor
begin
19050
  #1 addr_cnt = start_addr[19:0];
19051
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
19052
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
19053
  if (addr_cnt[1:0] == 2'h1)
19054
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19055
  else if (addr_cnt[1:0] == 2'h2)
19056
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19057
  else if (addr_cnt[1:0] == 2'h3)
19058
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19059
  else
19060
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19061 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
19062 169 mohor
  delta_t = 0;
19063
  // length must include 4 bytes of ZEROs, to generate CRC
19064 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
19065 169 mohor
  if (plus_dribble_nibble)
19066 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
19067 169 mohor
  else
19068 209 tadejm
    nibble_cnt = ((len + 4) << 1);
19069 315 tadejm
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt[21:2]}];
19070 209 tadejm
  addr_cnt = addr_cnt + 4;
19071
  while (nibble_cnt > 0)
19072 169 mohor
  begin
19073
    // wait for delta time
19074
    delta_t = !delta_t;
19075
    // shift data in
19076 209 tadejm
 
19077
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
19078
      data_in[3:0] = 4'h0;
19079 169 mohor
    else
19080 209 tadejm
 
19081
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
19082
    crc_next[0]  = (data_in[0] ^ crc[28]);
19083
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
19084
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
19085
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
19086
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
19087
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
19088
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
19089
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
19090
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
19091
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
19092
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
19093
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
19094
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
19095
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
19096
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
19097
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
19098
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
19099
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
19100
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
19101
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
19102
    crc_next[20] =  crc[16];
19103
    crc_next[21] =  crc[17];
19104
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
19105
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
19106
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
19107
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
19108
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
19109
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
19110
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
19111
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
19112
    crc_next[30] =  crc[26];
19113
    crc_next[31] =  crc[27];
19114
 
19115
    crc = crc_next;
19116
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
19117
    case (nibble_cnt)
19118
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
19119
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
19120
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
19121
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
19122
    default: crc_out = crc_out;
19123
    endcase
19124 169 mohor
    // wait for delta time
19125
    delta_t = !delta_t;
19126 209 tadejm
    // increment address and load new data
19127
    if ((word_cnt+3) == 7)//4)
19128 169 mohor
    begin
19129 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19130 315 tadejm
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt[21:2]}];
19131 169 mohor
      addr_cnt = addr_cnt + 4;
19132
    end
19133 209 tadejm
    // set new load bit position
19134
    if((word_cnt+3) == 31)
19135 169 mohor
      word_cnt = 16;
19136 209 tadejm
    else if ((word_cnt+3) == 23)
19137 169 mohor
      word_cnt = 8;
19138 209 tadejm
    else if ((word_cnt+3) == 15)
19139 169 mohor
      word_cnt = 0;
19140 209 tadejm
    else if ((word_cnt+3) == 7)
19141 169 mohor
      word_cnt = 24;
19142
    else
19143 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
19144
    // decrement nibble counter
19145
    nibble_cnt = nibble_cnt - 1;
19146 169 mohor
    // wait for delta time
19147
    delta_t = !delta_t;
19148
  end // while
19149
  #1;
19150
end
19151
endtask // paralel_crc_mac
19152
 
19153
// serial CRC checking for PHY TX
19154
task serial_crc_phy_tx;
19155
  input  [31:0] start_addr; // start address
19156
  input  [31:0] len; // length of frame in Bytes without CRC length
19157
  input         plus_dribble_nibble; // if length is longer for one nibble
19158
  output [31:0] crc;
19159
  reg    [21:0] addr_cnt; // only 22 address lines
19160
  integer       word_cnt;
19161
  integer       bit_cnt;
19162
  reg    [31:0] load_reg;
19163
  reg    [31:0] crc_shift_reg;
19164
  reg    [31:0] crc_store_reg;
19165
  reg           delta_t;
19166
begin
19167
  #1 addr_cnt = start_addr[21:0];
19168
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
19169
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
19170
  delta_t = 0;
19171
  // length must include 4 bytes of ZEROs, to generate CRC
19172
  // get number of bits from Byte length (2^3 = 8)
19173
  if (plus_dribble_nibble)
19174
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19175
  else
19176
    bit_cnt = ((len + 4) << 3);
19177
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19178
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
19179
  addr_cnt = addr_cnt + 1;
19180
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
19181
  addr_cnt = addr_cnt + 1;
19182
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
19183
  addr_cnt = addr_cnt + 1;
19184
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
19185
  addr_cnt = addr_cnt + 1;
19186
#1;
19187
  while (bit_cnt > 0)
19188
  begin
19189
    // wait for delta time
19190
    delta_t = !delta_t;
19191
#1;
19192
    // shift data in
19193
 
19194
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19195
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19196
    else
19197
 
19198
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19199
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19200
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19201
    crc_shift_reg[3]  = crc_store_reg[2];
19202
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19203
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19204
    crc_shift_reg[6]  = crc_store_reg[5];
19205
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19206
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19207
    crc_shift_reg[9]  = crc_store_reg[8];
19208
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19209
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19210
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19211
    crc_shift_reg[13] = crc_store_reg[12];
19212
    crc_shift_reg[14] = crc_store_reg[13];
19213
    crc_shift_reg[15] = crc_store_reg[14];
19214
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19215
    crc_shift_reg[17] = crc_store_reg[16];
19216
    crc_shift_reg[18] = crc_store_reg[17];
19217
    crc_shift_reg[19] = crc_store_reg[18];
19218
    crc_shift_reg[20] = crc_store_reg[19];
19219
    crc_shift_reg[21] = crc_store_reg[20];
19220
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19221
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19222
    crc_shift_reg[24] = crc_store_reg[23];
19223
    crc_shift_reg[25] = crc_store_reg[24];
19224
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19225
    crc_shift_reg[27] = crc_store_reg[26];
19226
    crc_shift_reg[28] = crc_store_reg[27];
19227
    crc_shift_reg[29] = crc_store_reg[28];
19228
    crc_shift_reg[30] = crc_store_reg[29];
19229
    crc_shift_reg[31] = crc_store_reg[30];
19230
    // wait for delta time
19231
    delta_t = !delta_t;
19232
 
19233
    // store previous data
19234
    crc_store_reg = crc_shift_reg;
19235
 
19236
    // put CRC out
19237
    case (bit_cnt)
19238
    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:
19239
    begin
19240
      crc = crc_store_reg;
19241
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
19242
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
19243
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
19244
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
19245
    end
19246
    default: crc = crc;
19247
    endcase
19248
 
19249
    // increment address and load new data
19250
#1;
19251
    if (word_cnt == 7)//4)
19252
    begin
19253
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19254
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
19255
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
19256
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
19257
      addr_cnt = addr_cnt + 1;
19258
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
19259
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
19260
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
19261
      addr_cnt = addr_cnt + 1;
19262
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
19263
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
19264
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
19265
      addr_cnt = addr_cnt + 1;
19266
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
19267
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
19268
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
19269
      addr_cnt = addr_cnt + 1;
19270
    end
19271
#1;
19272
    // set new load bit position
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
 
19282
//   if(word_cnt == 24)
19283
//     word_cnt = 31;
19284
//   else if (word_cnt == 28)
19285
//     word_cnt = 19;
19286
//   else if (word_cnt == 16)
19287
//     word_cnt = 23;
19288
//   else if (word_cnt == 20)
19289
//     word_cnt = 11;
19290
//   else if(word_cnt == 8)
19291
//     word_cnt = 15;
19292
//   else if (word_cnt == 12)
19293
//     word_cnt = 3;
19294
//   else if (word_cnt == 0)
19295
//     word_cnt = 7;
19296
//   else if (word_cnt == 4)
19297
//     word_cnt = 27;
19298
    else
19299
      word_cnt = word_cnt + 1;// - 1;
19300
#1;
19301
    // decrement bit counter
19302
    bit_cnt = bit_cnt - 1;
19303
#1;
19304
    // wait for delta time
19305
    delta_t = !delta_t;
19306
  end // while
19307
 
19308
  #1;
19309
end
19310
endtask // serial_crc_phy_tx
19311
 
19312
// serial CRC calculating for PHY RX
19313
task serial_crc_phy_rx;
19314
  input  [31:0] start_addr; // start address
19315
  input  [31:0] len; // length of frame in Bytes without CRC length
19316
  input         plus_dribble_nibble; // if length is longer for one nibble
19317
  output [31:0] crc;
19318
  reg    [21:0] addr_cnt; // only 22 address lines
19319
  integer       word_cnt;
19320
  integer       bit_cnt;
19321
  reg    [31:0] load_reg;
19322
  reg    [31:0] crc_shift_reg;
19323
  reg    [31:0] crc_store_reg;
19324
  reg           delta_t;
19325
begin
19326
  #1 addr_cnt = start_addr[21:0];
19327
  word_cnt = 24; // start of the frame
19328
  crc_shift_reg = 0;
19329
  delta_t = 0;
19330
  // length must include 4 bytes of ZEROs, to generate CRC
19331
  // get number of bits from Byte length (2^3 = 8)
19332
  if (plus_dribble_nibble)
19333
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19334
  else
19335
    bit_cnt = ((len + 4) << 3);
19336
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19337
  addr_cnt = addr_cnt + 1;
19338
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19339
  addr_cnt = addr_cnt + 1;
19340
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19341
  addr_cnt = addr_cnt + 1;
19342
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19343
 
19344
  while (bit_cnt > 0)
19345
  begin
19346
    // wait for delta time
19347
    delta_t = !delta_t;
19348
    // store previous data
19349
    crc_store_reg = crc_shift_reg;
19350
    // shift data in
19351
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19352
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19353
    else
19354
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19355
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19356
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19357
    crc_shift_reg[3]  = crc_store_reg[2];
19358
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19359
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19360
    crc_shift_reg[6]  = crc_store_reg[5];
19361
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19362
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19363
    crc_shift_reg[9]  = crc_store_reg[8];
19364
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19365
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19366
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19367
    crc_shift_reg[13] = crc_store_reg[12];
19368
    crc_shift_reg[14] = crc_store_reg[13];
19369
    crc_shift_reg[15] = crc_store_reg[14];
19370
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19371
    crc_shift_reg[17] = crc_store_reg[16];
19372
    crc_shift_reg[18] = crc_store_reg[17];
19373
    crc_shift_reg[19] = crc_store_reg[18];
19374
    crc_shift_reg[20] = crc_store_reg[19];
19375
    crc_shift_reg[21] = crc_store_reg[20];
19376
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19377
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19378
    crc_shift_reg[24] = crc_store_reg[23];
19379
    crc_shift_reg[25] = crc_store_reg[24];
19380
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19381
    crc_shift_reg[27] = crc_store_reg[26];
19382
    crc_shift_reg[28] = crc_store_reg[27];
19383
    crc_shift_reg[29] = crc_store_reg[28];
19384
    crc_shift_reg[30] = crc_store_reg[29];
19385
    crc_shift_reg[31] = crc_store_reg[30];
19386
    // wait for delta time
19387
    delta_t = !delta_t;
19388
    // increment address and load new data
19389
    if (word_cnt == 7)
19390
    begin
19391
      addr_cnt = addr_cnt + 1;
19392
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19393
      addr_cnt = addr_cnt + 1;
19394
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19395
      addr_cnt = addr_cnt + 1;
19396
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19397
      addr_cnt = addr_cnt + 1;
19398
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19399
    end
19400
    // set new load bit position
19401
    if(word_cnt == 31)
19402
      word_cnt = 16;
19403
    else if (word_cnt == 23)
19404
      word_cnt = 8;
19405
    else if (word_cnt == 15)
19406
      word_cnt = 0;
19407
    else if (word_cnt == 7)
19408
      word_cnt = 24;
19409
    else
19410
      word_cnt = word_cnt + 1;
19411
    // decrement bit counter
19412
    bit_cnt = bit_cnt - 1;
19413
    // wait for delta time
19414
    delta_t = !delta_t;
19415
  end // while
19416
 
19417
  // put CRC out
19418
  crc = crc_shift_reg;
19419
  #1;
19420
end
19421
endtask // serial_crc_phy_rx
19422
 
19423
// serial CRC checking for MAC
19424
task serial_crc_mac;
19425
  input  [31:0] start_addr; // start address
19426
  input  [31:0] len; // length of frame in Bytes without CRC length
19427
  input         plus_dribble_nibble; // if length is longer for one nibble
19428
  output [31:0] crc;
19429
  reg    [19:0] addr_cnt; // only 20 address lines
19430
  integer       word_cnt;
19431
  integer       bit_cnt;
19432
  reg    [31:0] load_reg;
19433
  reg    [31:0] crc_shift_reg;
19434
  reg    [31:0] crc_store_reg;
19435
  reg           delta_t;
19436
begin
19437
  #1 addr_cnt = start_addr[19:0];
19438
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
19439
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
19440
  if (addr_cnt[1:0] == 2'h1)
19441
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19442
  else if (addr_cnt[1:0] == 2'h2)
19443
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19444
  else if (addr_cnt[1:0] == 2'h3)
19445
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19446
  else
19447
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19448
 
19449
  crc_shift_reg = 0;
19450
  delta_t = 0;
19451
  // length must include 4 bytes of ZEROs, to generate CRC
19452
  // get number of bits from Byte length (2^3 = 8)
19453
  if (plus_dribble_nibble)
19454
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19455
  else
19456
    bit_cnt = ((len + 4) << 3);
19457
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19458
 
19459
  while (bit_cnt > 0)
19460
  begin
19461
    // wait for delta time
19462
    delta_t = !delta_t;
19463
    // store previous data
19464
    crc_store_reg = crc_shift_reg;
19465
    // shift data in
19466
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19467
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19468
    else
19469
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19470
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19471
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19472
    crc_shift_reg[3]  = crc_store_reg[2];
19473
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19474
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19475
    crc_shift_reg[6]  = crc_store_reg[5];
19476
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19477
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19478
    crc_shift_reg[9]  = crc_store_reg[8];
19479
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19480
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19481
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19482
    crc_shift_reg[13] = crc_store_reg[12];
19483
    crc_shift_reg[14] = crc_store_reg[13];
19484
    crc_shift_reg[15] = crc_store_reg[14];
19485
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19486
    crc_shift_reg[17] = crc_store_reg[16];
19487
    crc_shift_reg[18] = crc_store_reg[17];
19488
    crc_shift_reg[19] = crc_store_reg[18];
19489
    crc_shift_reg[20] = crc_store_reg[19];
19490
    crc_shift_reg[21] = crc_store_reg[20];
19491
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19492
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19493
    crc_shift_reg[24] = crc_store_reg[23];
19494
    crc_shift_reg[25] = crc_store_reg[24];
19495
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19496
    crc_shift_reg[27] = crc_store_reg[26];
19497
    crc_shift_reg[28] = crc_store_reg[27];
19498
    crc_shift_reg[29] = crc_store_reg[28];
19499
    crc_shift_reg[30] = crc_store_reg[29];
19500
    crc_shift_reg[31] = crc_store_reg[30];
19501
    // wait for delta time
19502
    delta_t = !delta_t;
19503
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
19504
    if (word_cnt == 7)
19505
    begin
19506
      addr_cnt = addr_cnt + 4;
19507
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19508
    end
19509
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
19510
    if(word_cnt == 31)
19511
      word_cnt = 16;
19512
    else if (word_cnt == 23)
19513
      word_cnt = 8;
19514
    else if (word_cnt == 15)
19515
      word_cnt = 0;
19516
    else if (word_cnt == 7)
19517
      word_cnt = 24;
19518
    else
19519
      word_cnt = word_cnt + 1;
19520
    // decrement bit counter
19521
    bit_cnt = bit_cnt - 1;
19522
    // wait for delta time
19523
    delta_t = !delta_t;
19524
  end // while
19525
 
19526
  // put CRC out
19527
  crc = crc_shift_reg;
19528
  #1;
19529
end
19530
endtask // serial_crc_mac
19531
 
19532
//////////////////////////////////////////////////////////////
19533
// MIIM Basic tasks
19534
//////////////////////////////////////////////////////////////
19535
 
19536
task reset_mii; //  MII module
19537
  reg [31:0] tmp;
19538
  reg [31:0] tmp_no_rst;
19539
begin
19540
  // read MII mode register first
19541
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19542
  // set reset bit - write back to MII mode register with RESET bit
19543
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19544
  // clear reset bit - write back to MII mode register without RESET bit
19545
  tmp_no_rst = `ETH_MIIMODER_RST;
19546
  tmp_no_rst = ~tmp_no_rst;
19547
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19548
end
19549
endtask // reset_mii
19550
 
19551
task mii_set_clk_div; // set clock divider for MII clock
19552
  input [7:0]  clk_div;
19553
begin
19554
  // MII mode register
19555
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19556
end
19557
endtask // mii_set_clk_div
19558
 
19559
 
19560
task check_mii_busy; // MII - check if BUSY
19561
  reg [31:0] tmp;
19562
begin
19563
  @(posedge wb_clk);
19564
  // MII read status register
19565
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19566
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
19567
  begin
19568
    @(posedge wb_clk);
19569
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19570
  end
19571
end
19572
endtask // check_mii_busy
19573
 
19574
 
19575
task check_mii_scan_valid; // MII - check if SCAN data are valid
19576
  reg [31:0] tmp;
19577
begin
19578
  @(posedge wb_clk);
19579
  // MII read status register
19580
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19581
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
19582
  begin
19583
    @(posedge wb_clk);
19584
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19585
  end
19586
end
19587
endtask // check_mii_scan_valid
19588
 
19589
 
19590
task mii_write_req; // requests write to MII
19591
  input [4:0]  phy_addr;
19592
  input [4:0]  reg_addr;
19593
  input [15:0] data_in;
19594
begin
19595
  // MII address, PHY address = 1, command register address = 0
19596
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19597
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19598
  // MII TX data
19599
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19600
  // MII command
19601
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19602
  @(posedge wb_clk);
19603
end
19604
endtask // mii_write_req
19605
 
19606
 
19607
task mii_read_req; // requests read from MII
19608
  input [4:0]  phy_addr;
19609
  input [4:0]  reg_addr;
19610
begin
19611
  // MII address, PHY address = 1, command register address = 0
19612
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19613
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19614
  // MII command
19615
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19616
  @(posedge wb_clk);
19617
end
19618
endtask // mii_read_req
19619
 
19620
 
19621
task mii_scan_req; // requests scan from MII
19622
  input [4:0]  phy_addr;
19623
  input [4:0]  reg_addr;
19624
begin
19625
  // MII address, PHY address = 1, command register address = 0
19626
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19627
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19628
  // MII command
19629
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19630
  @(posedge wb_clk);
19631
end
19632
endtask // mii_scan_req
19633
 
19634
 
19635
task mii_scan_finish; // finish scan from MII
19636
begin
19637
  // MII command
19638
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19639
  @(posedge wb_clk);
19640
end
19641
endtask // mii_scan_finish
19642
 
19643
//////////////////////////////////////////////////////////////
19644
// Log files and memory tasks
19645
//////////////////////////////////////////////////////////////
19646
 
19647
task clear_memories;
19648
  reg    [22:0]  adr_i;
19649
  reg            delta_t;
19650
begin
19651
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
19652
  begin
19653
    eth_phy.rx_mem[adr_i[21:0]] = 0;
19654
    eth_phy.tx_mem[adr_i[21:0]] = 0;
19655
    wb_slave.wb_memory[adr_i[21:2]] = 0;
19656
  end
19657
end
19658
endtask // clear_memories
19659
 
19660 243 tadejm
task clear_buffer_descriptors;
19661
  reg    [8:0]  adr_i;
19662
  reg            delta_t;
19663
begin
19664
  delta_t = 0;
19665
  for (adr_i = 0; adr_i < 256; adr_i = adr_i + 1)
19666
  begin
19667
    wbm_write((`TX_BD_BASE + {adr_i[7:0], 2'b0}), 32'h0, 4'hF, 1, 4'h1, 4'h1);
19668
    delta_t = !delta_t;
19669
  end
19670
end
19671
endtask // clear_buffer_descriptors
19672
 
19673 169 mohor
task test_note;
19674
  input [799:0] test_note ;
19675
  reg   [799:0] display_note ;
19676
begin
19677
  display_note = test_note;
19678
  while ( display_note[799:792] == 0 )
19679
    display_note = display_note << 8 ;
19680
  $fdisplay( tb_log_file, " " ) ;
19681
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
19682
  $fdisplay( tb_log_file, " " ) ;
19683
end
19684
endtask // test_note
19685
 
19686
task test_heading;
19687
  input [799:0] test_heading ;
19688
  reg   [799:0] display_test ;
19689
begin
19690
  display_test = test_heading;
19691
  while ( display_test[799:792] == 0 )
19692
    display_test = display_test << 8 ;
19693
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19694
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19695
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
19696
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19697
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19698
  $fdisplay( tb_log_file, " " ) ;
19699
end
19700
endtask // test_heading
19701
 
19702
 
19703
task test_fail ;
19704
  input [7999:0] failure_reason ;
19705
//  reg   [8007:0] display_failure ;
19706
  reg   [7999:0] display_failure ;
19707
  reg   [799:0] display_test ;
19708
begin
19709
  tests_failed = tests_failed + 1 ;
19710
 
19711
  display_failure = failure_reason; // {failure_reason, "!"} ;
19712
  while ( display_failure[7999:7992] == 0 )
19713
    display_failure = display_failure << 8 ;
19714
 
19715
  display_test = test_name ;
19716
  while ( display_test[799:792] == 0 )
19717
    display_test = display_test << 8 ;
19718
 
19719
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19720
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19721
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19722
  $fdisplay( tb_log_file, "    *FAILED* because") ;
19723
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
19724
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19725
  $fdisplay( tb_log_file, " " ) ;
19726
 
19727
 `ifdef STOP_ON_FAILURE
19728
    #20 $stop ;
19729
 `endif
19730
end
19731
endtask // test_fail
19732
 
19733
 
19734 315 tadejm
task test_fail_num ;
19735
  input [7999:0] failure_reason ;
19736
  input [31:0]   number ;
19737
//  reg   [8007:0] display_failure ;
19738
  reg   [7999:0] display_failure ;
19739
  reg   [799:0] display_test ;
19740
begin
19741
  tests_failed = tests_failed + 1 ;
19742
 
19743
  display_failure = failure_reason; // {failure_reason, "!"} ;
19744
  while ( display_failure[7999:7992] == 0 )
19745
    display_failure = display_failure << 8 ;
19746
 
19747
  display_test = test_name ;
19748
  while ( display_test[799:792] == 0 )
19749
    display_test = display_test << 8 ;
19750
 
19751
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19752
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19753
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19754
  $fdisplay( tb_log_file, "    *FAILED* because") ;
19755
  $fdisplay( tb_log_file, "    %s; %d", display_failure, number ) ;
19756
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19757
  $fdisplay( tb_log_file, " " ) ;
19758
 
19759
 `ifdef STOP_ON_FAILURE
19760
    #20 $stop ;
19761
 `endif
19762
end
19763
endtask // test_fail_num
19764
 
19765
 
19766 169 mohor
task test_ok ;
19767
  reg [799:0] display_test ;
19768
begin
19769
  tests_successfull = tests_successfull + 1 ;
19770
 
19771
  display_test = test_name ;
19772
  while ( display_test[799:792] == 0 )
19773
    display_test = display_test << 8 ;
19774
 
19775
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19776
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19777
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19778
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
19779
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19780
  $fdisplay( tb_log_file, " " ) ;
19781
end
19782
endtask // test_ok
19783
 
19784
 
19785
task test_summary;
19786
begin
19787
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19788
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
19789
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
19790
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
19791
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19792
  $fclose(tb_log_file) ;
19793
end
19794
endtask // test_summary
19795
 
19796
 
19797 116 mohor
endmodule

powered by: WebSVN 2.1.0

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