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

Subversion Repositories ethmac

[/] [ethmac/] [tags/] [rel_11/] [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 243 tadejm
// Revision 1.18  2002/10/18 17:03:34  tadejm
46
// Changed BIST scan signals.
47
//
48 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
49
// Some code changed due to bug fixes.
50
//
51 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
52
// Just back-up; not completed testbench and some testcases are not
53
// wotking properly yet.
54
//
55 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
56
// Full duplex tests modified and testbench bug repaired.
57
//
58 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
59
// Some additional reports added
60
//
61 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
62
// Full duplex test improved.
63
//
64 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
65
// MIIM test look better.
66
//
67 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
68
// Bench outputs data to display every 128 bytes.
69
//
70 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
71
// Beautiful tests merget together
72
//
73 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
74
// Rearanged testcases
75
//
76 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
77
// Bug in MIIM fixed.
78
//
79 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
80
// Headers changed.
81
//
82 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
83
// New testbench. Thanks to Tadej M - "The Spammer".
84
//
85 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
86
// Clock mrx_clk set to 2.5 MHz.
87
//
88 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
89
// Testing environment also includes traffic cop, memory interface and host
90
// interface.
91 116 mohor
//
92
//
93
//
94
//
95 117 mohor
//
96 116 mohor
 
97
 
98 169 mohor
`include "eth_phy_defines.v"
99
`include "wb_model_defines.v"
100 116 mohor
`include "tb_eth_defines.v"
101
`include "eth_defines.v"
102
`include "timescale.v"
103
 
104
module tb_ethernet();
105
 
106
 
107 169 mohor
reg           wb_clk;
108
reg           wb_rst;
109
wire          wb_int;
110 116 mohor
 
111 169 mohor
wire          mtx_clk;  // This goes to PHY
112
wire          mrx_clk;  // This goes to PHY
113 116 mohor
 
114
wire   [3:0]  MTxD;
115
wire          MTxEn;
116
wire          MTxErr;
117
 
118 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
119
wire          MRxDV;    // This goes to PHY
120
wire          MRxErr;   // This goes to PHY
121
wire          MColl;    // This goes to PHY
122
wire          MCrs;     // This goes to PHY
123 116 mohor
 
124
wire          Mdi_I;
125
wire          Mdo_O;
126
wire          Mdo_OE;
127 169 mohor
tri           Mdio_IO;
128 116 mohor
wire          Mdc_O;
129
 
130
 
131 169 mohor
parameter Tp = 1;
132 116 mohor
 
133 121 mohor
 
134 116 mohor
// Ethernet Slave Interface signals
135 169 mohor
wire [31:0] eth_sl_wb_adr;
136 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
137
wire  [3:0] eth_sl_wb_sel_i;
138
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;
139
 
140
// Ethernet Master Interface signals
141
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
142
wire  [3:0] eth_ma_wb_sel_o;
143
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;
144
 
145
 
146
 
147
 
148
// Connecting Ethernet top module
149 169 mohor
eth_top eth_top
150 116 mohor
(
151
  // WISHBONE common
152 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
153 116 mohor
 
154
  // WISHBONE slave
155 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),
156
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
157
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
158 116 mohor
 
159
  // WISHBONE master
160
  .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),
161
  .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),
162
  .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),
163
 
164
  //TX
165
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
166
 
167
  //RX
168
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
169
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
170
 
171
  // MIIM
172
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
173
 
174 169 mohor
  .int_o(wb_int)
175 227 tadejm
 
176
  // Bist
177
`ifdef ETH_BIST
178
  ,
179
  .scanb_rst      (1'b0),
180
  .scanb_clk      (1'b0),
181
  .scanb_si       (1'b0),
182
  .scanb_so       (),
183
  .scanb_en       (1'b0)
184
`endif
185 116 mohor
);
186
 
187
 
188
 
189 169 mohor
// Connecting Ethernet PHY Module
190
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
191
assign Mdi_I   = Mdio_IO;
192
integer phy_log_file_desc;
193
 
194
eth_phy eth_phy
195 116 mohor
(
196 169 mohor
  // WISHBONE reset
197
  .m_rst_n_i(!wb_rst),
198 116 mohor
 
199 169 mohor
  // MAC TX
200
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
201
 
202
  // MAC RX
203
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
204
  .mcoll_o(MColl),        .mcrs_o(MCrs),
205
 
206
  // MIIM
207
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
208
 
209
  // SYSTEM
210
  .phy_log(phy_log_file_desc)
211 116 mohor
);
212
 
213
 
214 169 mohor
 
215
// Connecting WB Master as Host Interface
216
integer host_log_file_desc;
217
 
218
WB_MASTER_BEHAVIORAL wb_master
219 116 mohor
(
220 169 mohor
    .CLK_I(wb_clk),
221
    .RST_I(wb_rst),
222
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
223
    .TAG_O(),
224
    .ACK_I(eth_sl_wb_ack_o),
225
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
226
    .CYC_O(eth_sl_wb_cyc_i),
227
    .DAT_I(eth_sl_wb_dat_o),
228
    .DAT_O(eth_sl_wb_dat_i),
229
    .ERR_I(eth_sl_wb_err_o),
230
    .RTY_I(1'b0),  // inactive (1'b0)
231
    .SEL_O(eth_sl_wb_sel_i),
232
    .STB_O(eth_sl_wb_stb_i),
233
    .WE_O (eth_sl_wb_we_i),
234
    .CAB_O()       // NOT USED for now!
235
);
236
 
237
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
238
 
239
 
240
 
241
// Connecting WB Slave as Memory Interface Module
242
integer memory_log_file_desc;
243
 
244
WB_SLAVE_BEHAVIORAL wb_slave
245
(
246
    .CLK_I(wb_clk),
247
    .RST_I(wb_rst),
248
    .ACK_O(eth_ma_wb_ack_i),
249
    .ADR_I(eth_ma_wb_adr_o),
250
    .CYC_I(eth_ma_wb_cyc_o),
251
    .DAT_O(eth_ma_wb_dat_i),
252
    .DAT_I(eth_ma_wb_dat_o),
253
    .ERR_O(eth_ma_wb_err_i),
254
    .RTY_O(),      // NOT USED for now!
255
    .SEL_I(eth_ma_wb_sel_o),
256
    .STB_I(eth_ma_wb_stb_o),
257
    .WE_I (eth_ma_wb_we_o),
258
    .CAB_I(1'b0)   // inactive (1'b0)
259
);
260
 
261
 
262
 
263
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
264
integer wb_s_mon_log_file_desc ;
265
integer wb_m_mon_log_file_desc ;
266
 
267
WB_BUS_MON wb_eth_slave_bus_mon
268
(
269 116 mohor
  // WISHBONE common
270 169 mohor
  .CLK_I(wb_clk),
271
  .RST_I(wb_rst),
272 116 mohor
 
273 169 mohor
  // WISHBONE slave
274
  .ACK_I(eth_sl_wb_ack_o),
275
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
276
  .CYC_O(eth_sl_wb_cyc_i),
277
  .DAT_I(eth_sl_wb_dat_o),
278
  .DAT_O(eth_sl_wb_dat_i),
279
  .ERR_I(eth_sl_wb_err_o),
280
  .RTY_I(1'b0),
281
  .SEL_O(eth_sl_wb_sel_i),
282
  .STB_O(eth_sl_wb_stb_i),
283
  .WE_O (eth_sl_wb_we_i),
284
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
285
  .TAG_O(),
286
  .CAB_O(1'b0),
287
  .log_file_desc (wb_s_mon_log_file_desc)
288
);
289
 
290
WB_BUS_MON wb_eth_master_bus_mon
291
(
292
  // WISHBONE common
293
  .CLK_I(wb_clk),
294
  .RST_I(wb_rst),
295
 
296 116 mohor
  // WISHBONE master
297 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
298
  .ADDR_O(eth_ma_wb_adr_o),
299
  .CYC_O(eth_ma_wb_cyc_o),
300
  .DAT_I(eth_ma_wb_dat_i),
301
  .DAT_O(eth_ma_wb_dat_o),
302
  .ERR_I(eth_ma_wb_err_i),
303
  .RTY_I(1'b0),
304
  .SEL_O(eth_ma_wb_sel_o),
305
  .STB_O(eth_ma_wb_stb_o),
306
  .WE_O (eth_ma_wb_we_o),
307
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
308
  .TAG_O(),
309
  .CAB_O(1'b0),
310
  .log_file_desc(wb_m_mon_log_file_desc)
311 116 mohor
);
312
 
313
 
314
 
315 169 mohor
reg         StartTB;
316
integer     tb_log_file;
317 116 mohor
 
318 169 mohor
initial
319
begin
320
  tb_log_file = $fopen("../log/eth_tb.log");
321
  if (tb_log_file < 2)
322
  begin
323
    $display("*E Could not open/create testbench log file in ../log/ directory!");
324
    $finish;
325
  end
326
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
327
  $fdisplay(tb_log_file, " ");
328 116 mohor
 
329 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
330
  if (phy_log_file_desc < 2)
331
  begin
332
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
333
    $finish;
334
  end
335
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
336
  $fdisplay(phy_log_file_desc, " ");
337
 
338
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
339
  if (memory_log_file_desc < 2)
340
  begin
341
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
342
    $finish;
343
  end
344
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
345
  $fdisplay(memory_log_file_desc, " ");
346
 
347
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
348
  if (host_log_file_desc < 2)
349
  begin
350
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
351
    $finish;
352
  end
353
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
354
  $fdisplay(host_log_file_desc, " ");
355
 
356
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
357
  if (wb_s_mon_log_file_desc < 2)
358
  begin
359
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
360
    $finish;
361
  end
362
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
363
  $fdisplay(wb_s_mon_log_file_desc, " ");
364
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
365
  $fdisplay(wb_s_mon_log_file_desc, " ");
366
 
367
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
368
  if (wb_m_mon_log_file_desc < 2)
369
  begin
370
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
371
    $finish;
372
  end
373
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
374
  $fdisplay(wb_m_mon_log_file_desc, " ");
375
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
376
  $fdisplay(wb_m_mon_log_file_desc, " ");
377
 
378 243 tadejm
  // Reset pulse
379
  wb_rst =  1'b1;
380
  #423 wb_rst =  1'b0;
381
 
382 169 mohor
  // Clear memories
383
  clear_memories;
384 243 tadejm
  clear_buffer_descriptors;
385 169 mohor
 
386
  #423 StartTB  =  1'b1;
387
end
388
 
389
 
390
 
391
// Generating wb_clk clock
392 116 mohor
initial
393
begin
394 169 mohor
  wb_clk=0;
395
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
396 209 tadejm
  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
397 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
398
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
399
//  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
400 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
401 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
402
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
403
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
404
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
405 116 mohor
end
406
 
407
 
408
 
409 169 mohor
integer      tests_successfull;
410
integer      tests_failed;
411
reg [799:0]  test_name; // used for tb_log_file
412 121 mohor
 
413 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
414
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
415
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
416
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
417
 
418 116 mohor
initial
419
begin
420 169 mohor
  wait(StartTB);  // Start of testbench
421
 
422
  // Initial global values
423
  tests_successfull = 0;
424
  tests_failed = 0;
425
 
426
  wbm_init_waits = 4'h1;
427
  wbm_subseq_waits = 4'h3;
428
  wbs_waits = 4'h1;
429
  wbs_retries = 8'h2;
430
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
431
 
432
 
433
  //  Call tests
434
  //  ----------
435 194 tadej
//    test_access_to_mac_reg(0, 3);           // 0 - 3
436
//    test_mii(0, 17);                        // 0 - 17
437 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
438
  eth_phy.carrier_sense_real_delay(0);
439 243 tadejm
//    test_mac_full_duplex_transmit(8, 9);    // 0 - (21)
440
    test_mac_full_duplex_receive(8, 9);
441 209 tadejm
//    test_mac_full_duplex_flow(0, 0);
442 169 mohor
 
443 243 tadejm
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
444 169 mohor
  eth_phy.carrier_sense_real_delay(1);
445
 
446
 
447
  // Finish test's logs
448
  test_summary;
449
  $display("\n\n END of SIMULATION");
450
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
451
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
452
 
453
  $stop;
454 116 mohor
end
455 169 mohor
 
456 116 mohor
 
457 169 mohor
 
458
//////////////////////////////////////////////////////////////
459
// Test tasks
460
//////////////////////////////////////////////////////////////
461
 
462
task test_access_to_mac_reg;
463
  input  [31:0]  start_task;
464
  input  [31:0]  end_task;
465
  integer        bit_start_1;
466
  integer        bit_end_1;
467
  integer        bit_start_2;
468
  integer        bit_end_2;
469
  integer        num_of_reg;
470
  integer        i_addr;
471
  integer        i_data;
472
  integer        i_length;
473
  integer        tmp_data;
474
  reg    [31:0]  tx_bd_num;
475
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
476
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
477
  integer        i;
478
  integer        i1;
479
  integer        i2;
480
  integer        i3;
481
  integer        fail;
482 178 mohor
  integer        test_num;
483 169 mohor
  reg    [31:0]  addr;
484
  reg    [31:0]  data;
485
  reg    [31:0]  data_max;
486 116 mohor
begin
487 169 mohor
// ACCESS TO MAC REGISTERS TEST
488
test_heading("ACCESS TO MAC REGISTERS TEST");
489
$display(" ");
490
$display("ACCESS TO MAC REGISTERS TEST");
491
fail = 0;
492
 
493 192 tadej
// reset MAC registers
494
hard_reset;
495
// reset MAC and MII LOGIC with soft reset
496
reset_mac;
497
reset_mii;
498 169 mohor
 
499 192 tadej
 
500 178 mohor
//////////////////////////////////////////////////////////////////////
501
////                                                              ////
502
////  test_access_to_mac_reg:                                     ////
503
////                                                              ////
504
////  0: Walking 1 with single cycles across MAC regs.            ////
505
////  1: Walking 1 with single cycles across MAC buffer descript. ////
506
////  2: Test max reg. values and reg. values after writing       ////
507
////     inverse reset values and hard reset of the MAC           ////
508
////  3: Test buffer desc. RAM preserving values after hard reset ////
509
////     of the MAC and resetting the logic                       ////
510
////                                                              ////
511
//////////////////////////////////////////////////////////////////////
512 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
513 169 mohor
begin
514
 
515 178 mohor
  ////////////////////////////////////////////////////////////////////
516
  ////                                                            ////
517
  ////  Walking 1 with single cycles across MAC regs.             ////
518
  ////                                                            ////
519
  ////////////////////////////////////////////////////////////////////
520
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
521 194 tadej
  begin
522
    // TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
523
    test_name   = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
524
    `TIME; $display("  TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
525 178 mohor
 
526 194 tadej
    data = 0;
527
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
528
      begin
529
        wbm_init_waits = i;
530
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
531
        for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
532
          begin
533
            addr = `ETH_BASE + i_addr;
534
            // set ranges of R/W bits
535
            case (addr)
536
              `ETH_MODER:
537
                begin
538
                  bit_start_1 = 0;
539
                  bit_end_1   = 16;
540
                  bit_start_2 = 32; // not used
541
                  bit_end_2   = 32; // not used
542
                end
543
              `ETH_INT: // READONLY - tested within INT test
544
                begin
545
                  bit_start_1 = 32; // not used
546
                  bit_end_1   = 32; // not used
547
                  bit_start_2 = 32; // not used
548
                  bit_end_2   = 32; // not used
549
                end
550
              `ETH_INT_MASK:
551
                begin
552
                  bit_start_1 = 0;
553
                  bit_end_1   = 6;
554
                  bit_start_2 = 32; // not used
555
                  bit_end_2   = 32; // not used
556
                end
557
              `ETH_IPGT:
558
                begin
559
                  bit_start_1 = 0;
560
                  bit_end_1   = 6;
561
                  bit_start_2 = 32; // not used
562
                  bit_end_2   = 32; // not used
563
                end
564
              `ETH_IPGR1:
565
                begin
566
                  bit_start_1 = 0;
567
                  bit_end_1   = 6;
568
                  bit_start_2 = 32; // not used
569
                  bit_end_2   = 32; // not used
570
                end
571
              `ETH_IPGR2:
572
                begin
573
                  bit_start_1 = 0;
574
                  bit_end_1   = 6;
575
                  bit_start_2 = 32; // not used
576
                  bit_end_2   = 32; // not used
577
                end
578
              `ETH_PACKETLEN:
579
                begin
580
                  bit_start_1 = 0;
581
                  bit_end_1   = 31;
582
                  bit_start_2 = 32; // not used
583
                  bit_end_2   = 32; // not used
584
                end
585
              `ETH_COLLCONF:
586
                begin
587
                  bit_start_1 = 0;
588
                  bit_end_1   = 5;
589
                  bit_start_2 = 16;
590
                  bit_end_2   = 19;
591
                end
592
              `ETH_TX_BD_NUM:
593
                begin
594
                  bit_start_1 = 0;
595
                  bit_end_1   = 7;
596
                  bit_start_2 = 32; // not used
597
                  bit_end_2   = 32; // not used
598
                end
599
              `ETH_CTRLMODER:
600
                begin
601
                  bit_start_1 = 0;
602
                  bit_end_1   = 2;
603
                  bit_start_2 = 32; // not used
604
                  bit_end_2   = 32; // not used
605
                end
606
              `ETH_MIIMODER:
607
                begin
608
                  bit_start_1 = 0;
609
                  bit_end_1   = 9;
610
                  bit_start_2 = 32; // not used
611
                  bit_end_2   = 32; // not used
612
                end
613
              `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
614
                begin
615
                  bit_start_1 = 32; // not used
616
                  bit_end_1   = 32; // not used
617
                  bit_start_2 = 32; // not used
618
                  bit_end_2   = 32; // not used
619
                end
620
              `ETH_MIIADDRESS:
621
                begin
622
                  bit_start_1 = 0;
623
                  bit_end_1   = 4;
624
                  bit_start_2 = 8;
625
                  bit_end_2   = 12;
626
                end
627
              `ETH_MIITX_DATA:
628
                begin
629
                  bit_start_1 = 0;
630
                  bit_end_1   = 15;
631
                  bit_start_2 = 32; // not used
632
                  bit_end_2   = 32; // not used
633
                end
634
              `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
635
                begin
636
                  bit_start_1 = 32; // not used
637
                  bit_end_1   = 32; // not used
638
                  bit_start_2 = 32; // not used
639
                  bit_end_2   = 32; // not used
640
                end
641
              `ETH_MIISTATUS: // READONLY - tested within MIIM test
642
                begin
643
                  bit_start_1 = 32; // not used
644
                  bit_end_1   = 32; // not used
645
                  bit_start_2 = 32; // not used
646
                  bit_end_2   = 32; // not used
647
                end
648
              `ETH_MAC_ADDR0:
649
                begin
650
                  bit_start_1 = 0;
651
                  bit_end_1   = 31;
652
                  bit_start_2 = 32; // not used
653
                  bit_end_2   = 32; // not used
654 178 mohor
                  end
655 194 tadej
              `ETH_MAC_ADDR1:
656
                begin
657
                  bit_start_1 = 0;
658
                  bit_end_1   = 15;
659
                  bit_start_2 = 32; // not used
660
                  bit_end_2   = 32; // not used
661
                end
662
              `ETH_HASH_ADDR0:
663
                begin
664
                  bit_start_1 = 0;
665
                  bit_end_1   = 31;
666
                  bit_start_2 = 32; // not used
667
                  bit_end_2   = 32; // not used
668
                end
669
              default: // `ETH_HASH_ADDR1:
670
                begin
671
                  bit_start_1 = 0;
672
                  bit_end_1   = 31;
673
                  bit_start_2 = 32; // not used
674
                  bit_end_2   = 32; // not used
675
                end
676
            endcase
677
 
678
            for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
679
              begin
680
                data = 1'b1 << i_data;
681
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
682
                  ;
683
                else
684 178 mohor
                  begin
685 194 tadej
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
686
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
687
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
688
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
689
                      begin
690
                        if (tmp_data !== data)
691 178 mohor
                        begin
692 194 tadej
                          fail = fail + 1;
693
                          test_fail("RW bit of the MAC register was not written or not read");
694
                          `TIME;
695
                          $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
696
                                    wbm_init_waits, addr, data, tmp_data);
697
                        end
698
                      end
699
                    else // data should not be equal to tmp_data
700
                      begin
701
                        if (tmp_data === data)
702 178 mohor
                          begin
703
                            fail = fail + 1;
704 194 tadej
                            test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
705 178 mohor
                            `TIME;
706 194 tadej
                            $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
707 178 mohor
                                      wbm_init_waits, addr, data, tmp_data);
708
                          end
709 194 tadej
                      end
710
                  end
711
              end
712
          end
713
      end
714 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
715
    $display("    ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
716 194 tadej
    if(fail == 0)
717
      test_ok;
718
    else
719
      fail = 0;    // Errors were reported previously
720
  end
721 178 mohor
 
722
 
723
  ////////////////////////////////////////////////////////////////////
724
  ////                                                            ////
725
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
726
  ////                                                            ////
727
  ////////////////////////////////////////////////////////////////////
728
  if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
729 169 mohor
  begin
730 194 tadej
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
731
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
732
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
733 178 mohor
 
734
    data = 0;
735
    // set TX and RX buffer descriptors
736
    tx_bd_num = 32'h40;
737
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
738
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
739
    begin
740 169 mohor
      wbm_init_waits = i;
741
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
742 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
743 169 mohor
      begin
744
        addr = `ETH_BASE + i_addr;
745 178 mohor
        if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
746
        begin
747
          // set ranges of R/W bits
748
          case (addr[3])
749
            1'b0: // buffer control bits
750
            begin
751
              bit_start_1 = 0;
752
              bit_end_1   = 31; // 8;
753
              bit_start_2 = 11;
754
              bit_end_2   = 31;
755
            end
756
            default: // 1'b1: // buffer pointer
757
            begin
758
              bit_start_1 = 0;
759
              bit_end_1   = 31;
760
              bit_start_2 = 32; // not used
761
              bit_end_2   = 32; // not used
762
            end
763
          endcase
764
        end
765
        else // RX buffer descriptors
766
        begin
767
          // set ranges of R/W bits
768
          case (addr[3])
769
            1'b0: // buffer control bits
770
            begin
771
              bit_start_1 = 0;
772
              bit_end_1   = 31; // 7;
773
              bit_start_2 = 13;
774
              bit_end_2   = 31;
775
            end
776
            default: // 1'b1: // buffer pointer
777
            begin
778
              bit_start_1 = 0;
779
              bit_end_1   = 31;
780
              bit_start_2 = 32; // not used
781
              bit_end_2   = 32; // not used
782
            end
783
          endcase
784
        end
785
 
786 169 mohor
        for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
787
        begin
788
          data = 1'b1 << i_data;
789 178 mohor
          if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
790
            ;
791 169 mohor
          else
792
          begin
793
            wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
794
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
795
            if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
796
                 ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
797
            begin
798
              if (tmp_data !== data)
799
              begin
800
                fail = fail + 1;
801 178 mohor
                test_fail("RW bit of the MAC buffer descriptors was not written or not read");
802 169 mohor
                `TIME;
803
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
804
                          wbm_init_waits, addr, data, tmp_data);
805
              end
806
            end
807
            else // data should not be equal to tmp_data
808
            begin
809
              if (tmp_data === data)
810
              begin
811
                fail = fail + 1;
812 178 mohor
                test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
813 169 mohor
                `TIME;
814
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
815
                          wbm_init_waits, addr, data, tmp_data);
816
              end
817
            end
818
          end
819
        end
820
      end
821 178 mohor
      // INTERMEDIATE DISPLAYS
822
      case (i)
823 209 tadejm
        0:       $display("    ->buffer descriptors tested with 0 bus delay");
824
        1:       $display("    ->buffer descriptors tested with 1 bus delay cycle");
825
        2:       $display("    ->buffer descriptors tested with 2 bus delay cycles");
826
        3:       $display("    ->buffer descriptors tested with 3 bus delay cycles");
827
        default: $display("    ->buffer descriptors tested with 4 bus delay cycles");
828 178 mohor
      endcase
829
    end
830
    if(fail == 0)
831
      test_ok;
832
    else
833
      fail = 0;
834 169 mohor
  end
835 178 mohor
 
836
 
837
  ////////////////////////////////////////////////////////////////////
838
  ////                                                            ////
839
  ////  Test max reg. values and reg. values after writing        ////
840
  ////  inverse reset values and hard reset of the MAC            ////
841
  ////                                                            ////
842
  ////////////////////////////////////////////////////////////////////
843
  if (test_num == 2) // Start this task
844 169 mohor
  begin
845 194 tadej
    // TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
846 178 mohor
    test_name   =
847 194 tadej
      "TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
848 178 mohor
    `TIME; $display(
849 194 tadej
      "  TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
850 178 mohor
 
851
    // reset MAC registers
852
    hard_reset;
853
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
854 169 mohor
    begin
855 178 mohor
      for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
856 169 mohor
      begin
857 178 mohor
        addr = `ETH_BASE + i_addr;
858
        // set ranges of R/W bits
859
        case (addr)
860
          `ETH_MODER:
861 169 mohor
          begin
862 178 mohor
            data = 32'h0000_A800;
863
            data_max = 32'h0001_FFFF;
864 169 mohor
          end
865 178 mohor
          `ETH_INT: // READONLY - tested within INT test
866 169 mohor
          begin
867 178 mohor
            data = 32'h0000_0000;
868
            data_max = 32'h0000_0000;
869 169 mohor
          end
870
          `ETH_INT_MASK:
871 178 mohor
          begin
872
            data = 32'h0000_0000;
873
            data_max = 32'h0000_007F;
874
          end
875 169 mohor
          `ETH_IPGT:
876 178 mohor
          begin
877
            data = 32'h0000_0012;
878
            data_max = 32'h0000_007F;
879
          end
880 169 mohor
          `ETH_IPGR1:
881 178 mohor
          begin
882
            data = 32'h0000_000C;
883
            data_max = 32'h0000_007F;
884
          end
885 169 mohor
          `ETH_IPGR2:
886 178 mohor
          begin
887
            data = 32'h0000_0012;
888
            data_max = 32'h0000_007F;
889
          end
890 169 mohor
          `ETH_PACKETLEN:
891 178 mohor
          begin
892
            data = 32'h0040_0600;
893
            data_max = 32'hFFFF_FFFF;
894
          end
895 169 mohor
          `ETH_COLLCONF:
896 178 mohor
          begin
897
            data = 32'h000F_003F;
898
            data_max = 32'h000F_003F;
899
          end
900 169 mohor
          `ETH_TX_BD_NUM:
901 178 mohor
          begin
902
            data = 32'h0000_0040;
903
            data_max = 32'h0000_0080;
904
          end
905 169 mohor
          `ETH_CTRLMODER:
906 178 mohor
          begin
907
            data = 32'h0000_0000;
908
            data_max = 32'h0000_0007;
909
          end
910 169 mohor
          `ETH_MIIMODER:
911 178 mohor
          begin
912
            data = 32'h0000_0064;
913
            data_max = 32'h0000_03FF;
914
          end
915 169 mohor
          `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
916 178 mohor
          begin
917
            data = 32'h0000_0000;
918
            data_max = 32'h0000_0007;
919
          end
920 169 mohor
          `ETH_MIIADDRESS:
921 178 mohor
          begin
922
            data = 32'h0000_0000;
923
            data_max = 32'h0000_1F1F;
924
          end
925 169 mohor
          `ETH_MIITX_DATA:
926 178 mohor
          begin
927
            data = 32'h0000_0000;
928
            data_max = 32'h0000_FFFF;
929
          end
930 169 mohor
          `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
931
          begin
932 178 mohor
            data = 32'h0000_0000;
933
            data_max = 32'h0000_0000;
934 169 mohor
          end
935 178 mohor
          `ETH_MIISTATUS: // READONLY - tested within MIIM test
936 169 mohor
          begin
937 178 mohor
            data = 32'h0000_0000;
938
            data_max = 32'h0000_0000;
939 169 mohor
          end
940 178 mohor
          `ETH_MAC_ADDR0:
941 169 mohor
          begin
942 178 mohor
            data = 32'h0000_0000;
943
            data_max = 32'hFFFF_FFFF;
944 169 mohor
          end
945 178 mohor
          `ETH_MAC_ADDR1:
946 169 mohor
          begin
947 178 mohor
            data = 32'h0000_0000;
948
            data_max = 32'h0000_FFFF;
949 169 mohor
          end
950 178 mohor
          `ETH_HASH_ADDR0:
951 169 mohor
          begin
952 178 mohor
            data = 32'h0000_0000;
953
            data_max = 32'hFFFF_FFFF;
954 169 mohor
          end
955 178 mohor
          default: // `ETH_HASH_ADDR1:
956 169 mohor
          begin
957 178 mohor
            data = 32'h0000_0000;
958
            data_max = 32'hFFFF_FFFF;
959 169 mohor
          end
960
        endcase
961 178 mohor
 
962
        wbm_init_waits = {$random} % 3;
963
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
964
        if (i == 0)
965
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
966
        else if (i == 2)
967
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
968
        else if ((i == 1) || (i == 4))
969 169 mohor
        begin
970 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
971
          if (tmp_data !== data)
972
          begin
973
            fail = fail + 1;
974
            test_fail("RESET value of the MAC register is not correct");
975
            `TIME;
976
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
977
          end
978 169 mohor
        end
979 178 mohor
        else // check maximum values
980 169 mohor
        begin
981
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
982 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
983 169 mohor
          begin
984
            if (tmp_data !== data)
985
            begin
986
              fail = fail + 1;
987 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
988 169 mohor
              `TIME;
989 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
990 169 mohor
            end
991 178 mohor
            // try maximum (80)
992
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
993
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
994
            if (tmp_data !== data_max)
995
            begin
996
              fail = fail + 1;
997
              test_fail("MAX value of the TX_BD_NUM register is not correct");
998
              `TIME;
999
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1000
            end
1001
            // try one less than maximum (80)
1002
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1003
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1004
            if (tmp_data !== (data_max - 1))
1005
            begin
1006
              fail = fail + 1;
1007
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1008
              `TIME;
1009
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1010
            end
1011
            // try one more than maximum (80)
1012
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1013
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1014
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1015
            begin
1016
              fail = fail + 1;
1017
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1018
              `TIME;
1019
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1020
            end
1021 169 mohor
          end
1022 178 mohor
          else
1023 169 mohor
          begin
1024 178 mohor
            if (tmp_data !== data_max)
1025 169 mohor
            begin
1026
              fail = fail + 1;
1027 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1028 169 mohor
              `TIME;
1029 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1030 169 mohor
            end
1031
          end
1032
        end
1033
      end
1034 178 mohor
      // reset MAC registers
1035
      if ((i == 0) || (i == 3))
1036
        hard_reset;
1037 169 mohor
    end
1038 178 mohor
    if(fail == 0)
1039
      test_ok;
1040
    else
1041
      fail = 0;
1042 169 mohor
  end
1043 116 mohor
 
1044 156 mohor
 
1045 181 mohor
  ////////////////////////////////////////////////////////////////////
1046
  ////                                                            ////
1047
  ////  Test buffer desc. ram preserving values after hard reset  ////
1048
  ////  of the mac and reseting the logic                         ////
1049
  ////                                                            ////
1050
  ////////////////////////////////////////////////////////////////////
1051 178 mohor
  if (test_num == 3) // Start this task
1052 169 mohor
  begin
1053 194 tadej
    // TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1054
    test_name   = "TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1055 178 mohor
    `TIME;
1056 194 tadej
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1057 178 mohor
 
1058
    // reset MAC registers
1059
    hard_reset;
1060
    // reset LOGIC with soft reset
1061
    reset_mac;
1062
    reset_mii;
1063
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1064 169 mohor
    begin
1065 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1066 169 mohor
      begin
1067 178 mohor
        addr = `ETH_BASE + i_addr;
1068
 
1069
        wbm_init_waits = {$random} % 3;
1070
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1071
        if (i == 0)
1072 169 mohor
        begin
1073 178 mohor
          data = 32'hFFFFFFFF;
1074
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1075 169 mohor
        end
1076 178 mohor
        else if (i == 2)
1077 169 mohor
        begin
1078 178 mohor
          data = 32'h00000000;
1079
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1080 169 mohor
        end
1081
        else
1082
        begin
1083 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1084
          if (tmp_data !== data)
1085 169 mohor
          begin
1086
            fail = fail + 1;
1087 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1088 169 mohor
            `TIME;
1089 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1090 169 mohor
          end
1091
        end
1092
      end
1093 178 mohor
      if ((i == 0) || (i == 2))
1094
      begin
1095
        // reset MAC registers
1096
        hard_reset;
1097
        // reset LOGIC with soft reset
1098
        reset_mac;
1099
        reset_mii;
1100
      end
1101 169 mohor
    end
1102 178 mohor
    if(fail == 0)
1103
      test_ok;
1104
    else
1105
    fail = 0;
1106 169 mohor
  end
1107 116 mohor
 
1108
 
1109 178 mohor
  if (test_num == 4) // Start this task
1110 169 mohor
  begin
1111 194 tadej
        /*  // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1112
          test_name   = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1113
          `TIME; $display("  TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1114 178 mohor
 
1115
          data = 0;
1116
          burst_data = 0;
1117
          burst_tmp_data = 0;
1118
          i_length = 10; // two bursts for length 20
1119
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1120
          begin
1121
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1122
            begin
1123
              wbm_init_waits = i;
1124
              wbm_subseq_waits = i1;
1125
              #1;
1126
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1127
              begin
1128
                data = 1'b1 << i_data;
1129
                #1;
1130
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1131
                begin
1132
                  burst_data = burst_data << 32;
1133
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1134
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1135
                  begin
1136
                    #1 burst_data[31:0] = 0;
1137
                  end
1138
                  else
1139
                  begin
1140
                    #1 burst_data[31:0] = data;
1141
                  end
1142
                end
1143
                #1;
1144
                // 2 burst writes
1145
                addr = `ETH_BASE; // address of a first burst
1146
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1147
                burst_tmp_data = burst_data >> (32 * i_length);
1148
                addr = addr + 32'h28; // address of a second burst
1149
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1150
                #1;
1151
                // 2 burst reads
1152
                addr = `ETH_BASE; // address of a first burst
1153
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1154
                         wbm_init_waits, wbm_subseq_waits); // first burst
1155
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1156
                addr = addr + 32'h28; // address of a second burst
1157
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1158
                         wbm_init_waits, wbm_subseq_waits); // second burst
1159
                #1;
1160
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1161
                begin
1162
                  // set ranges of R/W bits
1163
                  case (`ETH_BASE + i2)
1164
                  `ETH_MODER:
1165
                    begin
1166
                      bit_start_1 = 0;
1167
                      bit_end_1   = 16;
1168
                      bit_start_2 = 32; // not used
1169
                      bit_end_2   = 32; // not used
1170
                    end
1171
                  `ETH_INT: // READONLY - tested within INT test
1172
                    begin
1173
                      bit_start_1 = 32; // not used
1174
                      bit_end_1   = 32; // not used
1175
                      bit_start_2 = 32; // not used
1176
                      bit_end_2   = 32; // not used
1177
                    end
1178
                  `ETH_INT_MASK:
1179
                    begin
1180
                      bit_start_1 = 0;
1181
                      bit_end_1   = 6;
1182
                      bit_start_2 = 32; // not used
1183
                      bit_end_2   = 32; // not used
1184
                    end
1185
                  `ETH_IPGT:
1186
                    begin
1187
                      bit_start_1 = 0;
1188
                      bit_end_1   = 6;
1189
                      bit_start_2 = 32; // not used
1190
                      bit_end_2   = 32; // not used
1191
                    end
1192
                  `ETH_IPGR1:
1193
                    begin
1194
                      bit_start_1 = 0;
1195
                      bit_end_1   = 6;
1196
                      bit_start_2 = 32; // not used
1197
                      bit_end_2   = 32; // not used
1198
                    end
1199
                  `ETH_IPGR2:
1200
                    begin
1201
                      bit_start_1 = 0;
1202
                      bit_end_1   = 6;
1203
                      bit_start_2 = 32; // not used
1204
                      bit_end_2   = 32; // not used
1205
                    end
1206
                  `ETH_PACKETLEN:
1207
                    begin
1208
                      bit_start_1 = 0;
1209
                      bit_end_1   = 31;
1210
                      bit_start_2 = 32; // not used
1211
                      bit_end_2   = 32; // not used
1212
                    end
1213
                  `ETH_COLLCONF:
1214
                    begin
1215
                      bit_start_1 = 0;
1216
                      bit_end_1   = 5;
1217
                      bit_start_2 = 16;
1218
                      bit_end_2   = 19;
1219
                    end
1220
                  `ETH_TX_BD_NUM:
1221
                    begin
1222
                      bit_start_1 = 0;
1223
                      bit_end_1   = 7;
1224
                      bit_start_2 = 32; // not used
1225
                      bit_end_2   = 32; // not used
1226
                    end
1227
                  `ETH_CTRLMODER:
1228
                    begin
1229
                      bit_start_1 = 0;
1230
                      bit_end_1   = 2;
1231
                      bit_start_2 = 32; // not used
1232
                      bit_end_2   = 32; // not used
1233
                    end
1234
                  `ETH_MIIMODER:
1235
                    begin
1236
                      bit_start_1 = 0;
1237
                      bit_end_1   = 9;
1238
                      bit_start_2 = 32; // not used
1239
                      bit_end_2   = 32; // not used
1240
                    end
1241
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1242
                    begin
1243
                      bit_start_1 = 32; // not used
1244
                      bit_end_1   = 32; // not used
1245
                      bit_start_2 = 32; // not used
1246
                      bit_end_2   = 32; // not used
1247
                    end
1248
                  `ETH_MIIADDRESS:
1249
                    begin
1250
                      bit_start_1 = 0;
1251
                      bit_end_1   = 4;
1252
                      bit_start_2 = 8;
1253
                      bit_end_2   = 12;
1254
                    end
1255
                  `ETH_MIITX_DATA:
1256
                    begin
1257
                      bit_start_1 = 0;
1258
                      bit_end_1   = 15;
1259
                      bit_start_2 = 32; // not used
1260
                      bit_end_2   = 32; // not used
1261
                    end
1262
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1263
                    begin
1264
                      bit_start_1 = 32; // not used
1265
                      bit_end_1   = 32; // not used
1266
                      bit_start_2 = 32; // not used
1267
                      bit_end_2   = 32; // not used
1268
                    end
1269
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1270
                    begin
1271
                      bit_start_1 = 32; // not used
1272
                      bit_end_1   = 32; // not used
1273
                      bit_start_2 = 32; // not used
1274
                      bit_end_2   = 32; // not used
1275
                    end
1276
                  `ETH_MAC_ADDR0:
1277
                    begin
1278
                      bit_start_1 = 0;
1279
                      bit_end_1   = 31;
1280
                      bit_start_2 = 32; // not used
1281
                      bit_end_2   = 32; // not used
1282
                    end
1283
                  `ETH_MAC_ADDR1:
1284
                    begin
1285
                      bit_start_1 = 0;
1286
                      bit_end_1   = 15;
1287
                      bit_start_2 = 32; // not used
1288
                      bit_end_2   = 32; // not used
1289
                    end
1290
                  `ETH_HASH_ADDR0:
1291
                    begin
1292
                      bit_start_1 = 0;
1293
                      bit_end_1   = 31;
1294
                      bit_start_2 = 32; // not used
1295
                      bit_end_2   = 32; // not used
1296
                    end
1297
                  default: // `ETH_HASH_ADDR1:
1298
                    begin
1299
                      bit_start_1 = 0;
1300
                      bit_end_1   = 31;
1301
                      bit_start_2 = 32; // not used
1302
                      bit_end_2   = 32; // not used
1303
                    end
1304
                  endcase
1305
                  #1;
1306
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1307
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1308
                  begin
1309
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1310
                    begin
1311
                      fail = fail + 1;
1312
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1313
                      `TIME;
1314
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1315
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1316
                    end
1317
                  end
1318
                  else
1319
                  begin
1320
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1321
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1322
                    begin
1323
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1324
                      begin
1325
                        fail = fail + 1;
1326
                        test_fail("RW bit of the MAC register was not written or not read");
1327
                        `TIME;
1328
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1329
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1330
                      end
1331
                    end
1332
                    else // data should not be equal to tmp_data
1333
                    begin
1334
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1335
                      begin
1336
                        fail = fail + 1;
1337
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1338
                        `TIME;
1339
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1340
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1341
                      end
1342
                    end
1343
                  end
1344
                  burst_tmp_data = burst_tmp_data >> 32;
1345
                  burst_data = burst_data >> 32;
1346
                end
1347
              end
1348
            end
1349
          end
1350
          if(fail == 0)
1351
            test_ok;
1352
          else
1353
            fail = 0;*/
1354
  end
1355 116 mohor
 
1356 169 mohor
end
1357 156 mohor
 
1358 169 mohor
end
1359
endtask // test_access_to_mac_reg
1360 156 mohor
 
1361
 
1362 169 mohor
task test_mii;
1363
  input  [31:0]  start_task;
1364
  input  [31:0]  end_task;
1365
  integer        i;
1366
  integer        i1;
1367
  integer        i2;
1368
  integer        i3;
1369
  integer        cnt;
1370
  integer        fail;
1371 181 mohor
  integer        test_num;
1372 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1373
  reg     [4:0]  phy_addr;
1374
  reg     [4:0]  reg_addr;
1375
  reg     [15:0] phy_data;
1376
  reg     [15:0] tmp_data;
1377
begin
1378
// MIIM MODULE TEST
1379
test_heading("MIIM MODULE TEST");
1380
$display(" ");
1381
$display("MIIM MODULE TEST");
1382
fail = 0;
1383 156 mohor
 
1384 192 tadej
// reset MAC registers
1385
hard_reset;
1386
// reset MAC and MII LOGIC with soft reset
1387
reset_mac;
1388 169 mohor
reset_mii;
1389 116 mohor
 
1390 194 tadej
 
1391 181 mohor
//////////////////////////////////////////////////////////////////////
1392
////                                                              ////
1393
////  test_mii:                                                   ////
1394
////                                                              ////
1395
////  0:  Test clock divider of mii management module with all    ////
1396
////      possible frequences.                                    ////
1397
////  1:  Test various readings from 'real' phy registers.        ////
1398
////  2:  Test various writings to 'real' phy registers (control  ////
1399
////      and non writable registers)                             ////
1400
////  3:  Test reset phy through mii management module            ////
1401
////  4:  Test 'walking one' across phy address (with and without ////
1402
////      preamble)                                               ////
1403
////  5:  Test 'walking one' across phy's register address (with  ////
1404
////      and without preamble)                                   ////
1405
////  6:  Test 'walking one' across phy's data (with and without  ////
1406
////      preamble)                                               ////
1407
////  7:  Test reading from phy with wrong phy address (host      ////
1408
////      reading high 'z' data)                                  ////
1409
////  8:  Test writing to phy with wrong phy address and reading  ////
1410
////      from correct one                                        ////
1411
////  9:  Test sliding stop scan command immediately after read   ////
1412
////      request (with and without preamble)                     ////
1413
//// 10:  Test sliding stop scan command immediately after write  ////
1414
////      request (with and without preamble)                     ////
1415
//// 11:  Test busy and nvalid status durations during write      ////
1416
////      (with and without preamble)                             ////
1417
//// 12:  Test busy and nvalid status durations during write      ////
1418
////      (with and without preamble)                             ////
1419
//// 13:  Test busy and nvalid status durations during scan (with ////
1420
////      and without preamble)                                   ////
1421
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1422
////      (with and without preamble)                             ////
1423
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1424
////      (with and without preamble)                             ////
1425
//// 16:  Test sliding stop scan command immediately after scan   ////
1426
////      request (with and without preamble)                     ////
1427
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1428
////      without preamble)                                       ////
1429
////                                                              ////
1430
//////////////////////////////////////////////////////////////////////
1431 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1432 169 mohor
begin
1433 194 tadej
 
1434 181 mohor
  ////////////////////////////////////////////////////////////////////
1435
  ////                                                            ////
1436
  ////  Test clock divider of mii management module with all      ////
1437
  ////  possible frequences.                                      ////
1438
  ////                                                            ////
1439
  ////////////////////////////////////////////////////////////////////
1440
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1441 169 mohor
  begin
1442 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1443
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1444
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1445 181 mohor
 
1446
    wait(Mdc_O); // wait for MII clock to be 1
1447
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1448
    begin
1449
      i1 = 0;
1450
      i2 = 0;
1451
      #Tp mii_set_clk_div(clk_div[7:0]);
1452
      @(posedge Mdc_O);
1453
      #Tp;
1454
      fork
1455 169 mohor
        begin
1456 181 mohor
          @(posedge Mdc_O);
1457 169 mohor
          #Tp;
1458 181 mohor
          disable count_i1;
1459
          disable count_i2;
1460 169 mohor
        end
1461 181 mohor
        begin: count_i1
1462
          forever
1463
          begin
1464
            @(posedge wb_clk);
1465
            i1 = i1 + 1;
1466
            #Tp;
1467
          end
1468
        end
1469
        begin: count_i2
1470
          forever
1471
          begin
1472
            @(negedge wb_clk);
1473
            i2 = i2 + 1;
1474
            #Tp;
1475
          end
1476
        end
1477
      join
1478
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1479
      begin
1480
        if((i1 == i2) && (i1 == 2))
1481 169 mohor
        begin
1482
        end
1483 181 mohor
        else
1484
        begin
1485
          fail = fail + 1;
1486 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1487 181 mohor
        end
1488 169 mohor
      end
1489
      else
1490
      begin
1491 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1492
        begin
1493
        end
1494
        else
1495
        begin
1496
          fail = fail + 1;
1497
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1498
        end
1499 169 mohor
      end
1500
    end
1501 181 mohor
    if(fail == 0)
1502
      test_ok;
1503 169 mohor
    else
1504 181 mohor
      fail = 0;
1505
  end
1506
 
1507
 
1508
  ////////////////////////////////////////////////////////////////////
1509
  ////                                                            ////
1510
  ////  Test various readings from 'real' phy registers.          ////
1511
  ////                                                            ////
1512
  ////////////////////////////////////////////////////////////////////
1513
  if (test_num == 1) // Test various readings from 'real' phy registers.
1514
  begin
1515 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1516
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1517
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1518 181 mohor
 
1519
    // set the fastest possible MII
1520
    clk_div = 0;
1521
    mii_set_clk_div(clk_div[7:0]);
1522
    // set address
1523
    reg_addr = 5'h1F;
1524
    phy_addr = 5'h1;
1525
    while(reg_addr >= 5'h4)
1526 169 mohor
    begin
1527 181 mohor
      // read request
1528
      #Tp mii_read_req(phy_addr, reg_addr);
1529
      check_mii_busy; // wait for read to finish
1530
      // read data
1531
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1532
      if (phy_data !== 16'hDEAD)
1533 169 mohor
      begin
1534 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1535
        fail = fail + 1;
1536 169 mohor
      end
1537 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1538
        reg_addr = 5'h3;
1539 169 mohor
      else
1540 181 mohor
        reg_addr = reg_addr - 5'h9;
1541 169 mohor
    end
1542 181 mohor
 
1543
    // set address
1544
    reg_addr = 5'h3;
1545
    // read request
1546
    #Tp mii_read_req(phy_addr, reg_addr);
1547
    check_mii_busy; // wait for read to finish
1548
    // read data
1549
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1550
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1551
    begin
1552
      test_fail("Wrong data was read from PHY from ID register 2");
1553
      fail = fail + 1;
1554
    end
1555
    if(fail == 0)
1556
      test_ok;
1557
    else
1558
      fail = 0;
1559 169 mohor
  end
1560 116 mohor
 
1561
 
1562 181 mohor
  ////////////////////////////////////////////////////////////////////
1563
  ////                                                            ////
1564
  ////  Test various writings to 'real' phy registers (control    ////
1565
  ////  and non writable registers)                               ////
1566
  ////                                                            ////
1567
  ////////////////////////////////////////////////////////////////////
1568
  if (test_num == 2) // 
1569 169 mohor
  begin
1570 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1571
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1572
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1573 181 mohor
 
1574
    // negate data and try to write into unwritable register
1575
    tmp_data = ~phy_data;
1576
    // write request
1577
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1578
    check_mii_busy; // wait for write to finish
1579 169 mohor
    // read request
1580
    #Tp mii_read_req(phy_addr, reg_addr);
1581
    check_mii_busy; // wait for read to finish
1582
    // read data
1583 181 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1584
    if (tmp_data !== phy_data)
1585
    begin
1586
      test_fail("Data was written into unwritable PHY register - ID register 2");
1587
      fail = fail + 1;
1588
    end
1589
 
1590
    // set address
1591
    reg_addr = 5'h0; // control register
1592
    // read request
1593
    #Tp mii_read_req(phy_addr, reg_addr);
1594
    check_mii_busy; // wait for read to finish
1595
    // read data
1596
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1597
    // write request
1598
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1599
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1600
    check_mii_busy; // wait for write to finish
1601
    // read request
1602
    #Tp mii_read_req(phy_addr, reg_addr);
1603
    check_mii_busy; // wait for read to finish
1604
    // read data
1605 169 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1606 181 mohor
    if (phy_data !== 16'h7DFF)
1607 169 mohor
    begin
1608 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1609 169 mohor
      fail = fail + 1;
1610
    end
1611 181 mohor
    // write request
1612
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1613
    check_mii_busy; // wait for write to finish
1614
    // read request
1615
    #Tp mii_read_req(phy_addr, reg_addr);
1616
    check_mii_busy; // wait for read to finish
1617
    // read data
1618
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1619
    if (phy_data !== tmp_data)
1620
    begin
1621
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1622
      fail = fail + 1;
1623
    end
1624
    if(fail == 0)
1625
      test_ok;
1626 116 mohor
    else
1627 181 mohor
      fail = 0;
1628 169 mohor
  end
1629 116 mohor
 
1630
 
1631 181 mohor
  ////////////////////////////////////////////////////////////////////
1632
  ////                                                            ////
1633
  ////  Test reset phy through mii management module              ////
1634
  ////                                                            ////
1635
  ////////////////////////////////////////////////////////////////////
1636
  if (test_num == 3) // 
1637 169 mohor
  begin
1638 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1639
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1640
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1641 181 mohor
 
1642
    // set address
1643
    reg_addr = 5'h0; // control register
1644
    // write request
1645
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1646
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1647
    check_mii_busy; // wait for write to finish
1648
    // read request
1649
    #Tp mii_read_req(phy_addr, reg_addr);
1650
    check_mii_busy; // wait for read to finish
1651
    // read data
1652
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1653
    if (phy_data !== tmp_data)
1654
    begin
1655
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1656
      fail = fail + 1;
1657
    end
1658
    // set reset bit - selfclearing bit in PHY
1659
    phy_data = phy_data | 16'h8000;
1660
    // write request
1661
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1662
    check_mii_busy; // wait for write to finish
1663
    // read request
1664
    #Tp mii_read_req(phy_addr, reg_addr);
1665
    check_mii_busy; // wait for read to finish
1666
    // read data
1667
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1668
    // check self clearing of reset bit
1669
    if (tmp_data[15] !== 1'b0)
1670
    begin
1671
      test_fail("Reset bit should be self cleared - control register");
1672
      fail = fail + 1;
1673
    end
1674
    // check reset value of control register
1675
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1676
    begin
1677
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1678
      fail = fail + 1;
1679
    end
1680
    if(fail == 0)
1681
      test_ok;
1682
    else
1683
      fail = 0;
1684 169 mohor
  end
1685
 
1686
 
1687 181 mohor
  ////////////////////////////////////////////////////////////////////
1688
  ////                                                            ////
1689
  ////  Test 'walking one' across phy address (with and without   ////
1690
  ////  preamble)                                                 ////
1691
  ////                                                            ////
1692
  ////////////////////////////////////////////////////////////////////
1693
  if (test_num == 4) // 
1694 169 mohor
  begin
1695 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1696
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1697
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1698 181 mohor
 
1699
    // set PHY to test mode
1700
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1701
    for (i = 0; i <= 1; i = i + 1)
1702 169 mohor
    begin
1703 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1704
      #Tp eth_phy.clear_test_regs;
1705
      // MII mode register
1706
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1707
                wbm_subseq_waits);
1708
      // walk one across phy address
1709
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1710 169 mohor
      begin
1711 181 mohor
        reg_addr = $random;
1712
        tmp_data = $random;
1713
        // write request
1714
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1715
        check_mii_busy; // wait for write to finish
1716
        // read request
1717
        #Tp mii_read_req(phy_addr, reg_addr);
1718
        check_mii_busy; // wait for read to finish
1719
        // read data
1720
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1721
        #Tp;
1722
        if (phy_data !== tmp_data)
1723
        begin
1724
          if (i)
1725
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1726
          else
1727
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1728
          fail = fail + 1;
1729
        end
1730
        @(posedge wb_clk);
1731
        #Tp;
1732 169 mohor
      end
1733
    end
1734 181 mohor
    // set PHY to normal mode
1735
    #Tp eth_phy.test_regs(0);
1736
    #Tp eth_phy.preamble_suppresed(0);
1737
    // MII mode register
1738
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1739
    if(fail == 0)
1740
      test_ok;
1741
    else
1742
      fail = 0;
1743 169 mohor
  end
1744
 
1745
 
1746 181 mohor
  ////////////////////////////////////////////////////////////////////
1747
  ////                                                            ////
1748
  ////  Test 'walking one' across phy's register address (with    ////
1749
  ////  and without preamble)                                     ////
1750
  ////                                                            ////
1751
  ////////////////////////////////////////////////////////////////////
1752
  if (test_num == 5) // 
1753 169 mohor
  begin
1754 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1755
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1756
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1757 181 mohor
 
1758
    // set PHY to test mode
1759
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1760
    for (i = 0; i <= 1; i = i + 1)
1761 169 mohor
    begin
1762 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1763
      #Tp eth_phy.clear_test_regs;
1764
      // MII mode register
1765
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1766
                wbm_subseq_waits);
1767
      // walk one across reg address
1768
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1769 169 mohor
      begin
1770 181 mohor
        phy_addr = $random;
1771
        tmp_data = $random;
1772
        // write request
1773
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1774
        check_mii_busy; // wait for write to finish
1775
        // read request
1776
        #Tp mii_read_req(phy_addr, reg_addr);
1777
        check_mii_busy; // wait for read to finish
1778
        // read data
1779
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1780
        #Tp;
1781
        if (phy_data !== tmp_data)
1782
        begin
1783
          if (i)
1784
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1785
          else
1786
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1787
          fail = fail + 1;
1788
        end
1789
        @(posedge wb_clk);
1790
        #Tp;
1791 169 mohor
      end
1792
    end
1793 181 mohor
    // set PHY to normal mode
1794
    #Tp eth_phy.test_regs(0);
1795
    #Tp eth_phy.preamble_suppresed(0);
1796
    // MII mode register
1797
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1798
    if(fail == 0)
1799
      test_ok;
1800
    else
1801
      fail = 0;
1802 169 mohor
  end
1803
 
1804
 
1805 181 mohor
  ////////////////////////////////////////////////////////////////////
1806
  ////                                                            ////
1807
  ////  Test 'walking one' across phy's data (with and without    ////
1808
  ////  preamble)                                                 ////
1809
  ////                                                            ////
1810
  ////////////////////////////////////////////////////////////////////
1811
  if (test_num == 6) // 
1812 169 mohor
  begin
1813 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
1814
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
1815
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
1816 181 mohor
 
1817
    // set PHY to test mode
1818
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1819
    for (i = 0; i <= 1; i = i + 1)
1820 169 mohor
    begin
1821 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1822
      #Tp eth_phy.clear_test_regs;
1823
      // MII mode register
1824
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1825
                wbm_subseq_waits);
1826
      // walk one across data
1827
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
1828 169 mohor
      begin
1829 181 mohor
        phy_addr = $random;
1830
        reg_addr = $random;
1831
        // write request
1832
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1833
        check_mii_busy; // wait for write to finish
1834
        // read request
1835
        #Tp mii_read_req(phy_addr, reg_addr);
1836
        check_mii_busy; // wait for read to finish
1837
        // read data
1838
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1839
        #Tp;
1840
        if (phy_data !== tmp_data)
1841
        begin
1842
          if (i)
1843
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1844
          else
1845
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1846
          fail = fail + 1;
1847
        end
1848
        @(posedge wb_clk);
1849
        #Tp;
1850 169 mohor
      end
1851
    end
1852 181 mohor
    // set PHY to normal mode
1853
    #Tp eth_phy.test_regs(0);
1854
    #Tp eth_phy.preamble_suppresed(0);
1855
    // MII mode register
1856
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1857
    if(fail == 0)
1858
      test_ok;
1859
    else
1860
      fail = 0;
1861 169 mohor
  end
1862
 
1863
 
1864 181 mohor
  ////////////////////////////////////////////////////////////////////
1865
  ////                                                            ////
1866
  ////  Test reading from phy with wrong phy address (host        ////
1867
  ////  reading high 'z' data)                                    ////
1868
  ////                                                            ////
1869
  ////////////////////////////////////////////////////////////////////
1870
  if (test_num == 7) // 
1871 169 mohor
  begin
1872 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
1873
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
1874
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
1875 181 mohor
 
1876
    phy_addr = 5'h2; // wrong PHY address
1877
    // read request
1878
    #Tp mii_read_req(phy_addr, reg_addr);
1879
    check_mii_busy; // wait for read to finish
1880
    // read data
1881
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
1882
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1883
    if (tmp_data !== 16'hzzzz)
1884
    begin
1885
      test_fail("Data was read from PHY register with wrong PHY address - control register");
1886
      fail = fail + 1;
1887
    end
1888
    if(fail == 0)
1889
      test_ok;
1890
    else
1891
      fail = 0;
1892 169 mohor
  end
1893
 
1894
 
1895 181 mohor
  ////////////////////////////////////////////////////////////////////
1896
  ////                                                            ////
1897
  ////  Test writing to phy with wrong phy address and reading    ////
1898
  ////  from correct one                                          ////
1899
  ////                                                            ////
1900
  ////////////////////////////////////////////////////////////////////
1901
  if (test_num == 8) // 
1902 169 mohor
  begin
1903 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
1904
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
1905
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
1906 181 mohor
 
1907
    // set address
1908
    reg_addr = 5'h0; // control register
1909
    phy_addr = 5'h2; // wrong PHY address
1910
    // write request
1911
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1912
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1913
    check_mii_busy; // wait for write to finish
1914
 
1915
    phy_addr = 5'h1; // correct PHY address
1916
    // read request
1917
    #Tp mii_read_req(phy_addr, reg_addr);
1918
    check_mii_busy; // wait for read to finish
1919
    // read data
1920
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1921
    if (phy_data === tmp_data)
1922
    begin
1923
      test_fail("Data was written into PHY register with wrong PHY address - control register");
1924
      fail = fail + 1;
1925
    end
1926
    if(fail == 0)
1927
      test_ok;
1928
    else
1929
      fail = 0;
1930 169 mohor
  end
1931
 
1932
 
1933 181 mohor
  ////////////////////////////////////////////////////////////////////
1934
  ////                                                            ////
1935
  ////  Test sliding stop scan command immediately after read     ////
1936
  ////  request (with and without preamble)                       ////
1937
  ////                                                            ////
1938
  ////////////////////////////////////////////////////////////////////
1939
  if (test_num == 9) // 
1940 169 mohor
  begin
1941 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
1942
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
1943 181 mohor
    `TIME;
1944 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
1945 181 mohor
 
1946
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
1947 169 mohor
    begin
1948 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
1949
      // MII mode register
1950
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
1951
               wbm_subseq_waits);
1952
      i = 0;
1953
      cnt = 0;
1954
      while (i < 80) // delay for sliding of writing a STOP SCAN command
1955 169 mohor
      begin
1956 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
1957
        begin
1958
          // set address
1959
          reg_addr = 5'h0; // control register
1960
          phy_addr = 5'h1; // correct PHY address
1961
          cnt = 0;
1962
          // read request
1963
          #Tp mii_read_req(phy_addr, reg_addr);
1964
          fork
1965
            begin
1966
              repeat(i) @(posedge Mdc_O);
1967
              // write command 0x0 into MII command register
1968
              // MII command written while read in progress
1969
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1970
              @(posedge wb_clk);
1971
              #Tp check_mii_busy; // wait for read to finish
1972
            end
1973
            begin
1974
              // wait for serial bus to become active
1975
              wait(Mdio_IO !== 1'bz);
1976
              // count transfer length
1977
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
1978
              begin
1979
                @(posedge Mdc_O);
1980
                #Tp cnt = cnt + 1;
1981
              end
1982
            end
1983
          join
1984
          // check transfer length
1985
          if (i2) // without preamble
1986 169 mohor
          begin
1987 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
1988
            begin
1989
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
1990
              fail = fail + 1;
1991
            end
1992 169 mohor
          end
1993 181 mohor
          else // with preamble
1994 169 mohor
          begin
1995 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
1996
            begin
1997
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
1998
              fail = fail + 1;
1999
            end
2000
          end
2001
          // check the BUSY signal to see if the bus is still IDLE
2002
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2003
            check_mii_busy; // wait for bus to become idle
2004
 
2005
          // try normal write or read after read was finished
2006
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2007
          #Tp cnt = 0;
2008
          if (i3 == 0) // write after read
2009
          begin
2010
            // write request
2011
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2012 169 mohor
            // wait for serial bus to become active
2013
            wait(Mdio_IO !== 1'bz);
2014
            // count transfer length
2015 181 mohor
            while(Mdio_IO !== 1'bz)
2016 169 mohor
            begin
2017
              @(posedge Mdc_O);
2018
              #Tp cnt = cnt + 1;
2019
            end
2020 181 mohor
            @(posedge Mdc_O);
2021
            // read request
2022
            #Tp mii_read_req(phy_addr, reg_addr);
2023
            check_mii_busy; // wait for read to finish
2024
            // read and check data
2025
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2026
            if (phy_data !== tmp_data)
2027
            begin
2028
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2029
              fail = fail + 1;
2030
            end
2031 169 mohor
          end
2032 181 mohor
          else // read after read
2033 169 mohor
          begin
2034 181 mohor
            // read request
2035
            #Tp mii_read_req(phy_addr, reg_addr);
2036
            // wait for serial bus to become active
2037
            wait(Mdio_IO !== 1'bz);
2038
            // count transfer length
2039
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2040
            begin
2041
              @(posedge Mdc_O);
2042
              #Tp cnt = cnt + 1;
2043
            end
2044 169 mohor
            @(posedge Mdc_O);
2045 181 mohor
            check_mii_busy; // wait for read to finish
2046
            // read and check data
2047
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2048
            if (phy_data !== tmp_data)
2049
            begin
2050
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2051
              fail = fail + 1;
2052
            end
2053 169 mohor
          end
2054 181 mohor
          // check if transfer was a proper length
2055
          if (i2) // without preamble
2056 169 mohor
          begin
2057 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2058
            begin
2059
              test_fail("New request did not proceed correctly, after read request");
2060
              fail = fail + 1;
2061
            end
2062 169 mohor
          end
2063 181 mohor
          else // with preamble
2064 169 mohor
          begin
2065 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2066
            begin
2067
              test_fail("New request did not proceed correctly, after read request");
2068
              fail = fail + 1;
2069
            end
2070 169 mohor
          end
2071
        end
2072 181 mohor
        #Tp;
2073
        // set delay of writing the command
2074 169 mohor
        if (i2) // without preamble
2075
        begin
2076 181 mohor
          case(i)
2077
            0, 1:               i = i + 1;
2078
            18, 19, 20, 21, 22,
2079
            23, 24, 25, 26, 27,
2080
            28, 29, 30, 31, 32,
2081
            33, 34, 35:         i = i + 1;
2082
            36:                 i = 80;
2083
            default:            i = 18;
2084
          endcase
2085 169 mohor
        end
2086
        else // with preamble
2087
        begin
2088 181 mohor
          case(i)
2089
            0, 1:               i = i + 1;
2090
            50, 51, 52, 53, 54,
2091
            55, 56, 57, 58, 59,
2092
            60, 61, 62, 63, 64,
2093
            65, 66, 67:         i = i + 1;
2094
            68:                 i = 80;
2095
            default:            i = 50;
2096
          endcase
2097 169 mohor
        end
2098 181 mohor
        @(posedge wb_clk);
2099 169 mohor
      end
2100
    end
2101 181 mohor
    // set PHY to normal mode
2102
    #Tp eth_phy.preamble_suppresed(0);
2103
    // MII mode register
2104
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2105
    if(fail == 0)
2106
      test_ok;
2107
    else
2108
      fail = 0;
2109 169 mohor
  end
2110
 
2111
 
2112 181 mohor
  ////////////////////////////////////////////////////////////////////
2113
  ////                                                            ////
2114
  ////  Test sliding stop scan command immediately after write    ////
2115
  ////  request (with and without preamble)                       ////
2116
  ////                                                            ////
2117
  ////////////////////////////////////////////////////////////////////
2118
  if (test_num == 10) // 
2119 169 mohor
  begin
2120 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2121
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2122 181 mohor
    `TIME;
2123 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2124 181 mohor
 
2125
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2126 169 mohor
    begin
2127 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2128
      // MII mode register
2129
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2130
                wbm_subseq_waits);
2131
      i = 0;
2132
      cnt = 0;
2133
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2134 169 mohor
      begin
2135 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2136
        begin
2137
          // set address
2138
          reg_addr = 5'h0; // control register
2139
          phy_addr = 5'h1; // correct PHY address
2140
          cnt = 0;
2141
          // write request
2142
          phy_data = {8'h75, (i[7:0] + 1)};
2143
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2144
          fork
2145
            begin
2146
              repeat(i) @(posedge Mdc_O);
2147
              // write command 0x0 into MII command register
2148
              // MII command written while read in progress
2149
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2150
              @(posedge wb_clk);
2151
              #Tp check_mii_busy; // wait for write to finish
2152
            end
2153
            begin
2154
              // wait for serial bus to become active
2155
              wait(Mdio_IO !== 1'bz);
2156
              // count transfer length
2157
              while(Mdio_IO !== 1'bz)
2158
              begin
2159
                @(posedge Mdc_O);
2160
                #Tp cnt = cnt + 1;
2161
              end
2162
            end
2163
          join
2164
          // check transfer length
2165
          if (i2) // without preamble
2166 169 mohor
          begin
2167 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2168
            begin
2169
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2170
              fail = fail + 1;
2171
            end
2172 169 mohor
          end
2173 181 mohor
          else // with preamble
2174 169 mohor
          begin
2175 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2176
            begin
2177
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2178
              fail = fail + 1;
2179
            end
2180
          end
2181
          // check the BUSY signal to see if the bus is still IDLE
2182
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2183
            check_mii_busy; // wait for bus to become idle
2184
 
2185
          // try normal write or read after write was finished
2186
          #Tp cnt = 0;
2187
          if (i3 == 0) // write after write
2188
          begin
2189
            phy_data = {8'h7A, (i[7:0] + 1)};
2190
            // write request
2191
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2192 169 mohor
            // wait for serial bus to become active
2193
            wait(Mdio_IO !== 1'bz);
2194
            // count transfer length
2195
            while(Mdio_IO !== 1'bz)
2196
            begin
2197
              @(posedge Mdc_O);
2198
              #Tp cnt = cnt + 1;
2199
            end
2200 181 mohor
            @(posedge Mdc_O);
2201
            // read request
2202
            #Tp mii_read_req(phy_addr, reg_addr);
2203
            check_mii_busy; // wait for read to finish
2204
            // read and check data
2205
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2206
            if (phy_data !== tmp_data)
2207
            begin
2208
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2209
              fail = fail + 1;
2210
            end
2211 169 mohor
          end
2212 181 mohor
          else // read after write
2213 169 mohor
          begin
2214 181 mohor
            // read request
2215
            #Tp mii_read_req(phy_addr, reg_addr);
2216
            // wait for serial bus to become active
2217
            wait(Mdio_IO !== 1'bz);
2218
            // count transfer length
2219
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2220
            begin
2221
              @(posedge Mdc_O);
2222
              #Tp cnt = cnt + 1;
2223
            end
2224 169 mohor
            @(posedge Mdc_O);
2225 181 mohor
            check_mii_busy; // wait for read to finish
2226
            // read and check data
2227
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2228
            if (phy_data !== tmp_data)
2229
            begin
2230
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2231
              fail = fail + 1;
2232
            end
2233 169 mohor
          end
2234 181 mohor
          // check if transfer was a proper length
2235
          if (i2) // without preamble
2236 169 mohor
          begin
2237 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2238
            begin
2239
              test_fail("New request did not proceed correctly, after write request");
2240
              fail = fail + 1;
2241
            end
2242 169 mohor
          end
2243 181 mohor
          else // with preamble
2244 169 mohor
          begin
2245 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2246
            begin
2247
              test_fail("New request did not proceed correctly, after write request");
2248
              fail = fail + 1;
2249
            end
2250 169 mohor
          end
2251
        end
2252 181 mohor
        #Tp;
2253
        // set delay of writing the command
2254 169 mohor
        if (i2) // without preamble
2255
        begin
2256 181 mohor
          case(i)
2257
            0, 1:               i = i + 1;
2258
            18, 19, 20, 21, 22,
2259
            23, 24, 25, 26, 27,
2260
            28, 29, 30, 31, 32,
2261
            33, 34, 35:         i = i + 1;
2262
            36:                 i = 80;
2263
            default:            i = 18;
2264
          endcase
2265 169 mohor
        end
2266
        else // with preamble
2267
        begin
2268 181 mohor
          case(i)
2269
            0, 1:               i = i + 1;
2270
            50, 51, 52, 53, 54,
2271
            55, 56, 57, 58, 59,
2272
            60, 61, 62, 63, 64,
2273
            65, 66, 67:         i = i + 1;
2274
            68:                 i = 80;
2275
            default:            i = 50;
2276
          endcase
2277 169 mohor
        end
2278 181 mohor
        @(posedge wb_clk);
2279 169 mohor
      end
2280
    end
2281 181 mohor
    // set PHY to normal mode
2282
    #Tp eth_phy.preamble_suppresed(0);
2283
    // MII mode register
2284
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2285
    if(fail == 0)
2286
      test_ok;
2287
    else
2288
      fail = 0;
2289 169 mohor
  end
2290
 
2291
 
2292 181 mohor
  ////////////////////////////////////////////////////////////////////
2293
  ////                                                            ////
2294
  ////  Test busy and nvalid status durations during write (with  ////
2295
  ////  and without preamble)                                     ////
2296
  ////                                                            ////
2297
  ////////////////////////////////////////////////////////////////////
2298
  if (test_num == 11) // 
2299 169 mohor
  begin
2300 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2301
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2302
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2303 181 mohor
 
2304
    reset_mii; // reset MII
2305
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2306
    #Tp eth_phy.link_up_down(1);
2307
    // set the MII
2308
    clk_div = 64;
2309
    mii_set_clk_div(clk_div[7:0]);
2310
    // set address
2311
    reg_addr = 5'h1; // status register
2312
    phy_addr = 5'h1; // correct PHY address
2313
 
2314
    for (i = 0; i <= 1; i = i + 1)
2315 169 mohor
    begin
2316 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2317
      // MII mode register
2318
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2319
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2320
      @(posedge Mdc_O);
2321
      // write request
2322
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2323
      // read data from MII status register - Busy and Nvalid bits
2324
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2325
 
2326
      // check MII IO signal and Busy and Nvalid bits
2327
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2328 169 mohor
      begin
2329 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2330
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2331
        begin
2332
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2333
          fail = fail + 1;
2334
        end
2335
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2336
        begin
2337
          test_fail("Nvalid signal was set during write");
2338
          fail = fail + 1;
2339
        end
2340 169 mohor
      end
2341 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2342 169 mohor
      begin
2343 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2344
        begin
2345
          test_fail("Busy signal should be set after write, due to reads from MII status register");
2346
          fail = fail + 1;
2347
        end
2348
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2349
        begin
2350
          test_fail("Nvalid signal was set during write");
2351
          fail = fail + 1;
2352
        end
2353 169 mohor
      end
2354 181 mohor
 
2355
      // wait for serial bus to become active
2356
      wait(Mdio_IO !== 1'bz);
2357
      // count transfer bits
2358
      if (i)
2359 169 mohor
      begin
2360 181 mohor
        repeat(32) @(posedge Mdc_O);
2361 169 mohor
      end
2362 181 mohor
      else
2363 169 mohor
      begin
2364 181 mohor
        repeat(64) @(posedge Mdc_O);
2365 169 mohor
      end
2366 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2367
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2368
 
2369
      // check MII IO signal and Busy and Nvalid bits
2370
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2371 169 mohor
      begin
2372 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2373
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2374
        begin
2375
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2376
          fail = fail + 1;
2377
        end
2378
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2379
        begin
2380
          test_fail("Nvalid signal was set during write");
2381
          fail = fail + 1;
2382
        end
2383 169 mohor
      end
2384 181 mohor
      else // Busy bit should still be set to '1'
2385 169 mohor
      begin
2386 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2387
        begin
2388
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2389
          fail = fail + 1;
2390
        end
2391
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2392
        begin
2393
          test_fail("Nvalid signal was set during write");
2394
          fail = fail + 1;
2395
        end
2396 169 mohor
      end
2397 181 mohor
 
2398
      // wait for next negative clock edge
2399
      @(negedge Mdc_O);
2400 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2401
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2402 181 mohor
 
2403 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2404
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2405
      begin
2406
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2407
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2408
        begin
2409
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2410
          fail = fail + 1;
2411
        end
2412
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2413
        begin
2414
          test_fail("Nvalid signal was set during write");
2415
          fail = fail + 1;
2416
        end
2417
      end
2418 181 mohor
      else // Busy bit should still be set to '1'
2419 169 mohor
      begin
2420
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2421
        begin
2422 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2423
          fail = fail + 1;
2424 169 mohor
        end
2425 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2426 169 mohor
        begin
2427 181 mohor
          test_fail("Nvalid signal was set during write");
2428
          fail = fail + 1;
2429
        end
2430
      end
2431
 
2432
      // wait for Busy to become inactive
2433
      i1 = 0;
2434
      while (i1 <= 2)
2435
      begin
2436
        // wait for next positive clock edge
2437
        @(posedge Mdc_O);
2438
        // read data from MII status register - Busy and Nvalid bits
2439
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2440
 
2441
        // check MII IO signal and Busy and Nvalid bits
2442
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2443
        begin
2444
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2445
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2446 169 mohor
          begin
2447 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2448 169 mohor
            fail = fail + 1;
2449
          end
2450 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2451
          begin
2452
            test_fail("Nvalid signal was set during write");
2453
            fail = fail + 1;
2454
          end
2455 169 mohor
        end
2456 181 mohor
        else // wait for Busy bit to be set to '0'
2457 169 mohor
        begin
2458 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2459
          begin
2460
            i1 = 3; // end of Busy checking
2461
          end
2462
          else
2463
          begin
2464
            if (i1 == 2)
2465
            begin
2466
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2467
              fail = fail + 1;
2468
            end
2469
            #Tp i1 = i1 + 1;
2470
          end
2471
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2472
          begin
2473
            test_fail("Nvalid signal was set after write");
2474
            fail = fail + 1;
2475
          end
2476 169 mohor
        end
2477
      end
2478
    end
2479 181 mohor
    // set PHY to normal mode
2480
    #Tp eth_phy.preamble_suppresed(0);
2481
    // MII mode register
2482
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2483
    if(fail == 0)
2484
      test_ok;
2485
    else
2486
      fail = 0;
2487 116 mohor
  end
2488
 
2489
 
2490 181 mohor
  ////////////////////////////////////////////////////////////////////
2491
  ////                                                            ////
2492
  ////  Test busy and nvalid status durations during write (with  ////
2493
  ////  and without preamble)                                     ////
2494
  ////                                                            ////
2495
  ////////////////////////////////////////////////////////////////////
2496
  if (test_num == 12) // 
2497 169 mohor
  begin
2498 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2499
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2500
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2501 181 mohor
 
2502
    reset_mii; // reset MII
2503
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2504
    #Tp eth_phy.link_up_down(1);
2505
    // set the MII
2506
    clk_div = 64;
2507
    mii_set_clk_div(clk_div[7:0]);
2508
    // set address
2509
    reg_addr = 5'h1; // status register
2510
    phy_addr = 5'h1; // correct PHY address
2511
 
2512
    for (i = 0; i <= 1; i = i + 1)
2513 169 mohor
    begin
2514 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2515
      // MII mode register
2516
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2517
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2518 169 mohor
      @(posedge Mdc_O);
2519 181 mohor
      // read request
2520
      #Tp mii_read_req(phy_addr, reg_addr);
2521 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2522
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2523 181 mohor
 
2524 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2525
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2526
      begin
2527 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2528 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2529
        begin
2530 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2531 169 mohor
          fail = fail + 1;
2532
        end
2533
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2534
        begin
2535
          test_fail("Nvalid signal was set during read");
2536
          fail = fail + 1;
2537
        end
2538
      end
2539 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2540 169 mohor
      begin
2541
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2542
        begin
2543 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2544
          fail = fail + 1;
2545 169 mohor
        end
2546
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2547
        begin
2548 181 mohor
          test_fail("Nvalid signal was set during read");
2549 169 mohor
          fail = fail + 1;
2550
        end
2551
      end
2552 181 mohor
 
2553
      // wait for serial bus to become active
2554
      wait(Mdio_IO !== 1'bz);
2555
      // count transfer bits
2556
      if (i)
2557 169 mohor
      begin
2558 181 mohor
        repeat(31) @(posedge Mdc_O);
2559 169 mohor
      end
2560 181 mohor
      else
2561 169 mohor
      begin
2562 181 mohor
        repeat(63) @(posedge Mdc_O);
2563 169 mohor
      end
2564 181 mohor
      // wait for next negative clock edge
2565
      @(negedge Mdc_O);
2566
      // read data from MII status register - Busy and Nvalid bits
2567
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2568
 
2569
      // check MII IO signal and Busy and Nvalid bits
2570
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2571 169 mohor
      begin
2572 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2573
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2574
        begin
2575
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2576
          fail = fail + 1;
2577
        end
2578
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2579
        begin
2580
          test_fail("Nvalid signal was set during read");
2581
          fail = fail + 1;
2582
        end
2583 169 mohor
      end
2584 181 mohor
      else // Busy bit should still be set to '1'
2585 169 mohor
      begin
2586 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2587
        begin
2588
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2589
          fail = fail + 1;
2590
        end
2591
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2592
        begin
2593
          test_fail("Nvalid signal was set during read");
2594
          fail = fail + 1;
2595
        end
2596 169 mohor
      end
2597 181 mohor
 
2598 169 mohor
      // wait for next positive clock edge
2599
      @(posedge Mdc_O);
2600
      // read data from MII status register - Busy and Nvalid bits
2601
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2602 181 mohor
 
2603 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2604
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2605
      begin
2606
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2607 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2608 169 mohor
        begin
2609 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2610
          fail = fail + 1;
2611
        end
2612
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2613
        begin
2614
          test_fail("Nvalid signal was set during read");
2615
          fail = fail + 1;
2616
        end
2617
      end
2618
      else // Busy bit should still be set to '1'
2619
      begin
2620
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2621
        begin
2622
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2623
          fail = fail + 1;
2624
        end
2625
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2626
        begin
2627
          test_fail("Nvalid signal was set during read");
2628
          fail = fail + 1;
2629
        end
2630
      end
2631
 
2632
      // wait for Busy to become inactive
2633
      i1 = 0;
2634
      while (i1 <= 2)
2635
      begin
2636
        // wait for next positive clock edge
2637
        @(posedge Mdc_O);
2638
        // read data from MII status register - Busy and Nvalid bits
2639
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2640
 
2641
        // check MII IO signal and Busy and Nvalid bits
2642
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2643
        begin
2644
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2645 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2646
          begin
2647
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2648
            fail = fail + 1;
2649
          end
2650 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2651 169 mohor
          begin
2652 181 mohor
            test_fail("Nvalid signal was set during read");
2653 169 mohor
            fail = fail + 1;
2654
          end
2655
        end
2656 181 mohor
        else // wait for Busy bit to be set to '0'
2657 169 mohor
        begin
2658
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2659
          begin
2660
            i1 = 3; // end of Busy checking
2661
          end
2662
          else
2663
          begin
2664
            if (i1 == 2)
2665
            begin
2666
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2667
              fail = fail + 1;
2668
            end
2669
            #Tp i1 = i1 + 1;
2670
          end
2671 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2672 169 mohor
          begin
2673 181 mohor
            test_fail("Nvalid signal was set after read");
2674 169 mohor
            fail = fail + 1;
2675
          end
2676
        end
2677
      end
2678
    end
2679 181 mohor
    // set PHY to normal mode
2680
    #Tp eth_phy.preamble_suppresed(0);
2681
    // MII mode register
2682
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2683
    if(fail == 0)
2684
      test_ok;
2685
    else
2686
      fail = 0;
2687 169 mohor
  end
2688
 
2689
 
2690 181 mohor
  ////////////////////////////////////////////////////////////////////
2691
  ////                                                            ////
2692
  ////  Test busy and nvalid status durations during scan (with   ////
2693
  ////  and without preamble)                                     ////
2694
  ////                                                            ////
2695
  ////////////////////////////////////////////////////////////////////
2696
  if (test_num == 13) // 
2697 169 mohor
  begin
2698 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2699
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2700
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2701 181 mohor
 
2702
    reset_mii; // reset MII
2703
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2704
    #Tp eth_phy.link_up_down(1);
2705
    // set the MII
2706
    clk_div = 64;
2707
    mii_set_clk_div(clk_div[7:0]);
2708
    // set address
2709
    reg_addr = 5'h1; // status register
2710
    phy_addr = 5'h1; // correct PHY address
2711
 
2712
    for (i = 0; i <= 1; i = i + 1)
2713 169 mohor
    begin
2714 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2715
      // MII mode register
2716
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2717
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2718
      @(posedge Mdc_O);
2719
      // scan request
2720
      #Tp mii_scan_req(phy_addr, reg_addr);
2721
      // read data from MII status register - Busy and Nvalid bits
2722
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2723
 
2724
      // check MII IO signal and Busy and Nvalid bits
2725
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2726 169 mohor
      begin
2727 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2728
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2729
        begin
2730
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2731
          fail = fail + 1;
2732
        end
2733
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2734
        begin
2735
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2736
          fail = fail + 1;
2737
        end
2738 169 mohor
      end
2739 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2740 169 mohor
      begin
2741 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2742
        begin
2743
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2744
          fail = fail + 1;
2745
        end
2746
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2747
        begin
2748
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2749
          fail = fail + 1;
2750
        end
2751 169 mohor
      end
2752 181 mohor
 
2753
      // wait for serial bus to become active
2754 169 mohor
      wait(Mdio_IO !== 1'bz);
2755 181 mohor
      // count transfer bits
2756
      if (i)
2757 169 mohor
      begin
2758 181 mohor
        repeat(21) @(posedge Mdc_O);
2759 169 mohor
      end
2760 181 mohor
      else
2761 169 mohor
      begin
2762 181 mohor
        repeat(53) @(posedge Mdc_O);
2763 169 mohor
      end
2764 181 mohor
      // stop scan
2765
      #Tp mii_scan_finish; // finish scan operation
2766
 
2767
      // wait for next positive clock edge
2768
      repeat(10) @(posedge Mdc_O);
2769
      // read data from MII status register - Busy and Nvalid bits
2770
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2771
 
2772
      // check MII IO signal and Busy and Nvalid bits
2773
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2774 169 mohor
      begin
2775 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2776
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2777 169 mohor
        begin
2778 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2779 169 mohor
          fail = fail + 1;
2780
        end
2781 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2782 169 mohor
      end
2783 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2784 169 mohor
      begin
2785 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2786 169 mohor
        begin
2787 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2788 169 mohor
          fail = fail + 1;
2789
        end
2790 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2791 169 mohor
        begin
2792 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2793 169 mohor
          fail = fail + 1;
2794
        end
2795 181 mohor
      end
2796
 
2797
      // wait for next negative clock edge
2798
      @(negedge Mdc_O);
2799
      // read data from MII status register - Busy and Nvalid bits
2800
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2801
 
2802
      // check MII IO signal and Busy and Nvalid bits
2803
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2804
      begin
2805
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2806
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2807 169 mohor
        begin
2808 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2809
          fail = fail + 1;
2810 169 mohor
        end
2811 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2812 169 mohor
      end
2813 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2814 169 mohor
      begin
2815 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2816 169 mohor
        begin
2817 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2818
          fail = fail + 1;
2819 169 mohor
        end
2820 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2821 169 mohor
        begin
2822 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2823
          fail = fail + 1;
2824 169 mohor
        end
2825
      end
2826 181 mohor
 
2827
      // wait for next negative clock edge
2828
      @(posedge Mdc_O);
2829
      // read data from MII status register - Busy and Nvalid bits
2830 169 mohor
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2831 181 mohor
 
2832
      // check MII IO signal and Busy and Nvalid bits
2833
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2834 169 mohor
      begin
2835 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2836
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2837 169 mohor
        begin
2838 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2839 169 mohor
          fail = fail + 1;
2840
        end
2841 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2842 169 mohor
        begin
2843 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2844 169 mohor
          fail = fail + 1;
2845
        end
2846
      end
2847 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
2848 169 mohor
      begin
2849 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2850 169 mohor
        begin
2851 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2852
          fail = fail + 1;
2853 169 mohor
        end
2854 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2855 169 mohor
        begin
2856 181 mohor
          i2 = 1; // check finished
2857 169 mohor
        end
2858 181 mohor
        else
2859 169 mohor
        begin
2860 181 mohor
          i2 = 0; // check must continue
2861 169 mohor
        end
2862
      end
2863 181 mohor
 
2864
      // wait for Busy to become inactive
2865
      i1 = 0;
2866
      while ((i1 <= 2) || (i2 == 0))
2867
      begin
2868
        // wait for next positive clock edge
2869
        @(posedge Mdc_O);
2870
        // read data from MII status register - Busy and Nvalid bits
2871
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2872
 
2873
        // check MII IO signal and Busy and Nvalid bits
2874
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2875 169 mohor
        begin
2876 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2877
          if (i1 <= 2)
2878 169 mohor
          begin
2879 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2880 169 mohor
            begin
2881 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2882 169 mohor
              fail = fail + 1;
2883
            end
2884
          end
2885 181 mohor
          if (i2 == 0)
2886 169 mohor
          begin
2887 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2888 169 mohor
            begin
2889 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2890 169 mohor
              fail = fail + 1;
2891
            end
2892
          end
2893
        end
2894 181 mohor
        else // wait for Busy bit to be set to '0'
2895 169 mohor
        begin
2896 181 mohor
          if (i1 <= 2)
2897 169 mohor
          begin
2898 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2899 169 mohor
            begin
2900 181 mohor
              i1 = 3; // end of Busy checking
2901 169 mohor
            end
2902 181 mohor
            else
2903 169 mohor
            begin
2904 181 mohor
              if (i1 == 2)
2905 169 mohor
              begin
2906 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2907 169 mohor
                fail = fail + 1;
2908
              end
2909 181 mohor
              #Tp i1 = i1 + 1;
2910 169 mohor
            end
2911 181 mohor
          end
2912
          if (i2 == 0)
2913
          begin
2914
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2915 169 mohor
            begin
2916 181 mohor
              i2 = 1;
2917 169 mohor
            end
2918 181 mohor
            else
2919
            begin
2920
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
2921
              fail = fail + 1;
2922
            end
2923 169 mohor
          end
2924
        end
2925 181 mohor
      end
2926
    end
2927
    // set PHY to normal mode
2928
    #Tp eth_phy.preamble_suppresed(0);
2929
    // MII mode register
2930
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2931
    if(fail == 0)
2932
      test_ok;
2933
    else
2934
      fail = 0;
2935
  end
2936
 
2937
 
2938
  ////////////////////////////////////////////////////////////////////
2939
  ////                                                            ////
2940
  ////  Test scan status from phy with detecting link-fail bit    ////
2941
  ////  (with and without preamble)                               ////
2942
  ////                                                            ////
2943
  ////////////////////////////////////////////////////////////////////
2944
  if (test_num == 14) // 
2945
  begin
2946 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
2947
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
2948
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
2949 181 mohor
 
2950
    reset_mii; // reset MII
2951
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2952
    #Tp eth_phy.link_up_down(1);
2953
    // set MII speed
2954
    clk_div = 6;
2955
    mii_set_clk_div(clk_div[7:0]);
2956
    // set address
2957
    reg_addr = 5'h1; // status register
2958
    phy_addr = 5'h1; // correct PHY address
2959
 
2960
    // read request
2961
    #Tp mii_read_req(phy_addr, reg_addr);
2962
    check_mii_busy; // wait for read to finish
2963
    // read data from PHY status register - remember LINK-UP status
2964
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2965
 
2966
    for (i = 0; i <= 1; i = i + 1)
2967
    begin
2968
      #Tp eth_phy.preamble_suppresed(i);
2969
      // MII mode register
2970
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2971
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2972
      if (i)
2973
      begin
2974
        // change saved data when preamble is suppressed
2975
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
2976
      end
2977
 
2978
      // scan request
2979
      #Tp mii_scan_req(phy_addr, reg_addr);
2980
      check_mii_scan_valid; // wait for scan to make first data valid
2981
 
2982 169 mohor
      fork
2983 181 mohor
      begin
2984 169 mohor
        repeat(2) @(posedge Mdc_O);
2985
        // read data from PHY status register
2986
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2987 181 mohor
        if (phy_data !== tmp_data)
2988 169 mohor
        begin
2989 181 mohor
          test_fail("Data was not correctly scaned from status register");
2990 169 mohor
          fail = fail + 1;
2991
        end
2992
        // read data from MII status register
2993
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2994 181 mohor
        if (phy_data[0] !== 1'b0)
2995 169 mohor
        begin
2996 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
2997 169 mohor
          fail = fail + 1;
2998
        end
2999
      end
3000
      begin
3001 181 mohor
      // Completely check second scan
3002 169 mohor
        #Tp cnt = 0;
3003
        // wait for serial bus to become active - second scan
3004
        wait(Mdio_IO !== 1'bz);
3005
        // count transfer length
3006 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3007 169 mohor
        begin
3008
          @(posedge Mdc_O);
3009
          #Tp cnt = cnt + 1;
3010
        end
3011
        // check transfer length
3012 181 mohor
        if (i) // without preamble
3013 169 mohor
        begin
3014
          if (cnt != 33) // at this value Mdio_IO is HIGH Z
3015
          begin
3016 181 mohor
            test_fail("Second scan request did not proceed correctly");
3017 169 mohor
            fail = fail + 1;
3018
          end
3019
        end
3020
        else // with preamble
3021
        begin
3022
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3023
          begin
3024 181 mohor
            test_fail("Second scan request did not proceed correctly");
3025 169 mohor
            fail = fail + 1;
3026
          end
3027
        end
3028
      end
3029
      join
3030 181 mohor
      // check third to fifth scans
3031
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3032
      begin
3033
        fork
3034 169 mohor
        begin
3035
          repeat(2) @(posedge Mdc_O);
3036
          // read data from PHY status register
3037
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3038 181 mohor
          if (phy_data !== tmp_data)
3039 169 mohor
          begin
3040 181 mohor
            test_fail("Data was not correctly scaned from status register");
3041
            fail = fail + 1;
3042 169 mohor
          end
3043
          // read data from MII status register
3044
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3045 181 mohor
          if (phy_data[0] !== 1'b0)
3046 169 mohor
          begin
3047 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3048
            fail = fail + 1;
3049 169 mohor
          end
3050 181 mohor
          if (i3 == 2) // after fourth scan read
3051 169 mohor
          begin
3052 181 mohor
            @(posedge Mdc_O);
3053
            // change saved data
3054
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3055
            // set link down
3056
            #Tp eth_phy.link_up_down(0);
3057 169 mohor
          end
3058
        end
3059
        begin
3060 181 mohor
        // Completely check scans
3061
          #Tp cnt = 0;
3062
          // wait for serial bus to become active - second scan
3063
          wait(Mdio_IO !== 1'bz);
3064
          // count transfer length
3065
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3066 169 mohor
          begin
3067 181 mohor
            @(posedge Mdc_O);
3068
            #Tp cnt = cnt + 1;
3069
          end
3070
          // check transfer length
3071
          if (i) // without preamble
3072
          begin
3073
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3074 169 mohor
            begin
3075 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3076
              fail = fail + 1;
3077 169 mohor
            end
3078 181 mohor
          end
3079
          else // with preamble
3080
          begin
3081
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3082 169 mohor
            begin
3083 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3084
              fail = fail + 1;
3085 169 mohor
            end
3086
          end
3087
        end
3088 181 mohor
        join
3089
      end
3090
 
3091
      fork
3092
      begin
3093
        repeat(2) @(posedge Mdc_O);
3094
        // read data from PHY status register
3095
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3096
        if (phy_data !== tmp_data)
3097
        begin
3098
          test_fail("Data was not correctly scaned from status register");
3099
          fail = fail + 1;
3100
        end
3101
        // read data from MII status register
3102
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3103
        if (phy_data[0] === 1'b0)
3104
        begin
3105
          test_fail("Link FAIL bit was not set in the MII status register");
3106
          fail = fail + 1;
3107
        end
3108
        // wait to see if data stayed latched
3109
        repeat(4) @(posedge Mdc_O);
3110
        // read data from PHY status register
3111
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3112
        if (phy_data !== tmp_data)
3113
        begin
3114
          test_fail("Data was not latched correctly in status register");
3115
          fail = fail + 1;
3116
        end
3117
        // read data from MII status register
3118
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3119
        if (phy_data[0] === 1'b0)
3120
        begin
3121
          test_fail("Link FAIL bit was not set in the MII status register");
3122
          fail = fail + 1;
3123
        end
3124
        // change saved data
3125
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3126
        // set link up
3127
        #Tp eth_phy.link_up_down(1);
3128
      end
3129
      begin
3130
      // Wait for sixth scan
3131
        // wait for serial bus to become active - sixth scan
3132
        wait(Mdio_IO !== 1'bz);
3133
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3134
        wait(Mdio_IO === 1'bz);
3135
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3136
        wait(Mdio_IO !== 1'bz);
3137
        // wait for serial bus to become inactive - end of sixth scan
3138
        wait(Mdio_IO === 1'bz);
3139
      end
3140 169 mohor
      join
3141 181 mohor
 
3142
      @(posedge Mdc_O);
3143 169 mohor
      // read data from PHY status register
3144
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3145
      if (phy_data !== tmp_data)
3146
      begin
3147 181 mohor
        test_fail("Data was not correctly scaned from status register");
3148 169 mohor
        fail = fail + 1;
3149
      end
3150
      // read data from MII status register
3151
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3152
      if (phy_data[0] !== 1'b0)
3153
      begin
3154
        test_fail("Link FAIL bit was set in the MII status register");
3155
        fail = fail + 1;
3156
      end
3157 181 mohor
      // wait to see if data stayed latched
3158
      repeat(4) @(posedge Mdc_O);
3159
      // read data from PHY status register
3160
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3161
      if (phy_data !== tmp_data)
3162 169 mohor
      begin
3163 181 mohor
        test_fail("Data was not correctly scaned from status register");
3164
        fail = fail + 1;
3165 169 mohor
      end
3166 181 mohor
      // read data from MII status register
3167
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3168
      if (phy_data[0] !== 1'b0)
3169 169 mohor
      begin
3170 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3171
        fail = fail + 1;
3172 169 mohor
      end
3173 181 mohor
 
3174
      // STOP SCAN
3175
      #Tp mii_scan_finish; // finish scan operation
3176
      #Tp check_mii_busy; // wait for scan to finish
3177 169 mohor
    end
3178 181 mohor
    // set PHY to normal mode
3179
    #Tp eth_phy.preamble_suppresed(0);
3180
    // MII mode register
3181
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3182
    if(fail == 0)
3183
      test_ok;
3184
    else
3185
      fail = 0;
3186 169 mohor
  end
3187
 
3188
 
3189 181 mohor
  ////////////////////////////////////////////////////////////////////
3190
  ////                                                            ////
3191
  ////  Test scan status from phy with sliding link-fail bit      ////
3192
  ////  (with and without preamble)                               ////
3193
  ////                                                            ////
3194
  ////////////////////////////////////////////////////////////////////
3195
  if (test_num == 15) // 
3196 169 mohor
  begin
3197 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3198
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3199
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3200 181 mohor
 
3201
    // set address
3202
    reg_addr = 5'h1; // status register
3203
    phy_addr = 5'h1; // correct PHY address
3204
 
3205
    // read request
3206
    #Tp mii_read_req(phy_addr, reg_addr);
3207
    check_mii_busy; // wait for read to finish
3208
    // read data from PHY status register - remember LINK-UP status
3209
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3210
 
3211
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3212 169 mohor
    begin
3213 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3214
      // MII mode register
3215
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3216
                    wbm_subseq_waits);
3217
      if (i2)
3218 169 mohor
      begin
3219 181 mohor
        // change saved data when preamble is suppressed
3220
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3221
      end
3222
 
3223
      i = 0;
3224
      while (i < 80) // delay for sliding of LinkFail bit
3225
      begin
3226
        // first there are two scans
3227
        #Tp cnt = 0;
3228 169 mohor
        // scan request
3229
        #Tp mii_scan_req(phy_addr, reg_addr);
3230 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3231
 
3232
        // check second scan
3233 169 mohor
        fork
3234 181 mohor
        begin
3235
          repeat(4) @(posedge Mdc_O);
3236
          // read data from PHY status register
3237
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3238
          if (phy_data !== tmp_data)
3239 169 mohor
          begin
3240 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3241
            fail = fail + 1;
3242 169 mohor
          end
3243 181 mohor
          // read data from MII status register
3244
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3245
          if (phy_data[0] !== 1'b0)
3246
          begin
3247
            test_fail("Link FAIL bit was set in the MII status register");
3248
            fail = fail + 1;
3249
          end
3250
        end
3251
        begin
3252
        // Completely check scan
3253
          #Tp cnt = 0;
3254
          // wait for serial bus to become active - second scan
3255
          wait(Mdio_IO !== 1'bz);
3256
          // count transfer length
3257
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3258
          begin
3259
            @(posedge Mdc_O);
3260
            #Tp cnt = cnt + 1;
3261
          end
3262
          // check transfer length
3263
          if (i2) // without preamble
3264
          begin
3265
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3266 169 mohor
            begin
3267 181 mohor
              test_fail("Second scan request did not proceed correctly");
3268
              fail = fail + 1;
3269 169 mohor
            end
3270 181 mohor
          end
3271
          else // with preamble
3272
          begin
3273
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3274
            begin
3275
              test_fail("Second scan request did not proceed correctly");
3276
              fail = fail + 1;
3277
            end
3278
          end
3279
        end
3280
        join
3281
        // reset counter 
3282
        #Tp cnt = 0;
3283
        // SLIDING LINK DOWN and CHECK
3284
        fork
3285
          begin
3286
          // set link down
3287
            repeat(i) @(posedge Mdc_O);
3288
            // set link down
3289
            #Tp eth_phy.link_up_down(0);
3290
          end
3291
          begin
3292
          // check data in MII registers after each scan in this fork statement
3293 169 mohor
            if (i2) // without preamble
3294 181 mohor
              wait (cnt == 32);
3295
            else // with preamble
3296
              wait (cnt == 64);
3297
            repeat(3) @(posedge Mdc_O);
3298
            // read data from PHY status register
3299
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3300
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3301 169 mohor
            begin
3302 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3303 169 mohor
              begin
3304 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3305 169 mohor
                fail = fail + 1;
3306
              end
3307
            end
3308 181 mohor
            else
3309 169 mohor
            begin
3310 181 mohor
              if (phy_data !== tmp_data)
3311 169 mohor
              begin
3312 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3313 169 mohor
                fail = fail + 1;
3314
              end
3315
            end
3316 181 mohor
            // read data from MII status register
3317
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3318
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3319 169 mohor
            begin
3320 181 mohor
              if (phy_data[0] === 1'b0)
3321
              begin
3322
                test_fail("Link FAIL bit was not set in the MII status register");
3323
                fail = fail + 1;
3324
              end
3325 169 mohor
            end
3326 181 mohor
            else
3327 169 mohor
            begin
3328 181 mohor
              if (phy_data[0] !== 1'b0)
3329 169 mohor
              begin
3330 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3331 169 mohor
                fail = fail + 1;
3332
              end
3333
            end
3334 181 mohor
          end
3335
          begin
3336
          // check length
3337
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3338 169 mohor
            begin
3339 181 mohor
              #Tp cnt = 0;
3340
              // wait for serial bus to become active if there is more than one scan
3341
              wait(Mdio_IO !== 1'bz);
3342
              // count transfer length
3343
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3344 169 mohor
              begin
3345 181 mohor
                @(posedge Mdc_O);
3346
                #Tp cnt = cnt + 1;
3347 169 mohor
              end
3348 181 mohor
              // check transfer length
3349
              if (i2) // without preamble
3350
              begin
3351
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3352
                begin
3353
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3354
                  fail = fail + 1;
3355
                end
3356
              end
3357
              else // with preamble
3358
              begin
3359
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3360
                begin
3361
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3362
                  fail = fail + 1;
3363
                end
3364
              end
3365 169 mohor
            end
3366
          end
3367
        join
3368 181 mohor
        // reset counter
3369
        #Tp cnt = 0;
3370
        // check fifth scan and data from fourth scan
3371
        fork
3372 169 mohor
        begin
3373 181 mohor
          repeat(2) @(posedge Mdc_O);
3374
          // read data from PHY status register
3375
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3376
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3377 169 mohor
          begin
3378 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3379
            fail = fail + 1;
3380 169 mohor
          end
3381 181 mohor
          // read data from MII status register
3382
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3383
          if (phy_data[0] === 1'b0)
3384 169 mohor
          begin
3385 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3386 169 mohor
            fail = fail + 1;
3387
          end
3388
        end
3389
        begin
3390 181 mohor
        // Completely check intermediate scan
3391
          #Tp cnt = 0;
3392
          // wait for serial bus to become active - second scan
3393 169 mohor
          wait(Mdio_IO !== 1'bz);
3394
          // count transfer length
3395
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3396
          begin
3397
            @(posedge Mdc_O);
3398
            #Tp cnt = cnt + 1;
3399
          end
3400 181 mohor
          // check transfer length
3401
          if (i2) // without preamble
3402 169 mohor
          begin
3403 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3404
            begin
3405
              test_fail("Fifth scan request did not proceed correctly");
3406
              fail = fail + 1;
3407
            end
3408 169 mohor
          end
3409 181 mohor
          else // with preamble
3410
          begin
3411
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3412
            begin
3413
              test_fail("Fifth scan request did not proceed correctly");
3414
              fail = fail + 1;
3415
            end
3416
          end
3417 169 mohor
        end
3418 181 mohor
        join
3419
        // reset counter 
3420
        #Tp cnt = 0;
3421
        // SLIDING LINK UP and CHECK
3422
        fork
3423 169 mohor
          begin
3424 181 mohor
          // set link up
3425
            repeat(i) @(posedge Mdc_O);
3426
            // set link up
3427
            #Tp eth_phy.link_up_down(1);
3428 169 mohor
          end
3429 181 mohor
          begin
3430
          // check data in MII registers after each scan in this fork statement
3431
            repeat(2) @(posedge Mdc_O);
3432
            if (i2) // without preamble
3433
              wait (cnt == 32);
3434
            else // with preamble
3435
              wait (cnt == 64);
3436
            repeat(3) @(posedge Mdc_O);
3437
            // read data from PHY status register
3438
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3439
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3440
            begin
3441
              if (phy_data !== tmp_data)
3442
              begin
3443
                test_fail("6. data was not correctly scaned from status register");
3444
                fail = fail + 1;
3445
              end
3446
            end
3447
            else
3448
            begin
3449
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3450
              begin
3451
                test_fail("6. data was not correctly scaned from status register");
3452
                fail = fail + 1;
3453
              end
3454
            end
3455
            // read data from MII status register
3456
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3457
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3458
            begin
3459
              if (phy_data[0] !== 1'b0)
3460
              begin
3461
                test_fail("Link FAIL bit was set in the MII status register");
3462
                fail = fail + 1;
3463
              end
3464
            end
3465
            else
3466
            begin
3467
              if (phy_data[0] === 1'b0)
3468
              begin
3469
                test_fail("Link FAIL bit was not set in the MII status register");
3470
                fail = fail + 1;
3471
              end
3472
            end
3473
          end
3474
          begin
3475
          // check length
3476
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3477
            begin
3478
              #Tp cnt = 0;
3479
              // wait for serial bus to become active if there is more than one scan
3480
              wait(Mdio_IO !== 1'bz);
3481
              // count transfer length
3482
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3483
              begin
3484
                @(posedge Mdc_O);
3485
                #Tp cnt = cnt + 1;
3486
              end
3487
              // check transfer length
3488
              if (i2) // without preamble
3489
              begin
3490
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3491
                begin
3492
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3493
                  fail = fail + 1;
3494
                end
3495
              end
3496
              else // with preamble
3497
              begin
3498
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3499
                begin
3500
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3501
                  fail = fail + 1;
3502
                end
3503
              end
3504
            end
3505
          end
3506
        join
3507
        // check last scan 
3508
        repeat(4) @(posedge Mdc_O);
3509
        // read data from PHY status register
3510
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3511
        if (phy_data !== tmp_data)
3512
        begin
3513
          test_fail("7. data was not correctly scaned from status register");
3514
          fail = fail + 1;
3515 169 mohor
        end
3516 181 mohor
        // read data from MII status register
3517
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3518
        if (phy_data[0] !== 1'b0)
3519
        begin
3520
          test_fail("Link FAIL bit was set in the MII status register");
3521
          fail = fail + 1;
3522
        end
3523
 
3524
        #Tp mii_scan_finish; // finish scan operation
3525
        #Tp check_mii_busy; // wait for scan to finish
3526
        #Tp;
3527
        // set delay of writing the command
3528
        if (i2) // without preamble
3529
        begin
3530
          case(i)
3531
            0,  1,  2,  3,  4:  i = i + 1;
3532
            13, 14, 15, 16, 17,
3533
            18, 19, 20, 21, 22,
3534
            23, 24, 25, 26, 27,
3535
            28, 29, 30, 31, 32,
3536
            33, 34, 35:         i = i + 1;
3537
            36:                 i = 80;
3538
            default:            i = 13;
3539
          endcase
3540
        end
3541 169 mohor
        else // with preamble
3542
        begin
3543 181 mohor
          case(i)
3544
            0,  1,  2,  3,  4:  i = i + 1;
3545
            45, 46, 47, 48, 49,
3546
            50, 51, 52, 53, 54,
3547
            55, 56, 57, 58, 59,
3548
            60, 61, 62, 63, 64,
3549
            65, 66, 67:         i = i + 1;
3550
            68:                 i = 80;
3551
            default:            i = 45;
3552
          endcase
3553 169 mohor
        end
3554 181 mohor
        @(posedge wb_clk);
3555
        #Tp;
3556 169 mohor
      end
3557
    end
3558 181 mohor
    // set PHY to normal mode
3559
    #Tp eth_phy.preamble_suppresed(0);
3560
    // MII mode register
3561
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3562
    if(fail == 0)
3563
      test_ok;
3564
    else
3565
      fail = 0;
3566 169 mohor
  end
3567
 
3568
 
3569 181 mohor
  ////////////////////////////////////////////////////////////////////
3570
  ////                                                            ////
3571
  ////  Test sliding stop scan command immediately after scan     ////
3572
  ////  request (with and without preamble)                       ////
3573
  ////                                                            ////
3574
  ////////////////////////////////////////////////////////////////////
3575
  if (test_num == 16) // 
3576 116 mohor
  begin
3577 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3578
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3579 181 mohor
    `TIME;
3580 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3581 181 mohor
 
3582
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3583 169 mohor
    begin
3584 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3585
      // MII mode register
3586
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3587
                wbm_subseq_waits);
3588
      i = 0;
3589
      cnt = 0;
3590
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3591 169 mohor
      begin
3592 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3593 169 mohor
        begin
3594 181 mohor
          // set address
3595
          reg_addr = 5'h0; // control register
3596
          phy_addr = 5'h1; // correct PHY address
3597
          cnt = 0;
3598
          // scan request
3599
          #Tp mii_scan_req(phy_addr, reg_addr);
3600
          fork
3601
            begin
3602
              repeat(i) @(posedge Mdc_O);
3603
              // write command 0x0 into MII command register
3604
              // MII command written while scan in progress
3605
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3606
              @(posedge wb_clk);
3607
              #Tp check_mii_busy; // wait for scan to finish
3608
              @(posedge wb_clk);
3609
              disable check;
3610
            end
3611
            begin: check
3612
              // wait for serial bus to become active
3613
              wait(Mdio_IO !== 1'bz);
3614
              // count transfer length
3615
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3616
              begin
3617
                @(posedge Mdc_O);
3618
                #Tp cnt = cnt + 1;
3619
              end
3620
              // check transfer length
3621
              if (i2) // without preamble
3622
              begin
3623
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3624
                begin
3625
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3626
                  fail = fail + 1;
3627
                end
3628
              end
3629
              else // with preamble
3630
              begin
3631
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3632
                begin
3633
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3634
                  fail = fail + 1;
3635
                end
3636
              end
3637
              cnt = 0;
3638
              // wait for serial bus to become active if there is more than one scan
3639
              wait(Mdio_IO !== 1'bz);
3640
              // count transfer length
3641
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3642
              begin
3643
                @(posedge Mdc_O);
3644
                #Tp cnt = cnt + 1;
3645
              end
3646
              // check transfer length
3647
              if (i2) // without preamble
3648
              begin
3649
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3650
                begin
3651
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3652
                  fail = fail + 1;
3653
                end
3654
              end
3655
              else // with preamble
3656
              begin
3657
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3658
                begin
3659
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3660
                  fail = fail + 1;
3661
                end
3662
              end
3663
            end
3664
          join
3665
          // check the BUSY signal to see if the bus is still IDLE
3666
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3667
            check_mii_busy; // wait for bus to become idle
3668
 
3669
          // try normal write or read after scan was finished
3670
          phy_data = {8'h7D, (i[7:0] + 1)};
3671
          cnt = 0;
3672
          if (i3 == 0) // write after scan
3673 169 mohor
          begin
3674 181 mohor
            // write request
3675
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3676
            // wait for serial bus to become active
3677
            wait(Mdio_IO !== 1'bz);
3678
            // count transfer length
3679
            while(Mdio_IO !== 1'bz)
3680
            begin
3681
              @(posedge Mdc_O);
3682
              #Tp cnt = cnt + 1;
3683
            end
3684 169 mohor
            @(posedge Mdc_O);
3685 181 mohor
            // read request
3686
            #Tp mii_read_req(phy_addr, reg_addr);
3687
            check_mii_busy; // wait for read to finish
3688
            // read and check data
3689
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3690
            if (phy_data !== tmp_data)
3691 169 mohor
            begin
3692 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3693 169 mohor
              fail = fail + 1;
3694
            end
3695
          end
3696 181 mohor
          else // read after scan
3697 169 mohor
          begin
3698 181 mohor
            // read request
3699
            #Tp mii_read_req(phy_addr, reg_addr);
3700
            // wait for serial bus to become active
3701
            wait(Mdio_IO !== 1'bz);
3702
            // count transfer length
3703
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3704 169 mohor
            begin
3705 181 mohor
              @(posedge Mdc_O);
3706
              #Tp cnt = cnt + 1;
3707
            end
3708
            @(posedge Mdc_O);
3709
            check_mii_busy; // wait for read to finish
3710
            // read and check data
3711
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3712
            if (phy_data !== tmp_data)
3713
            begin
3714
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3715 169 mohor
              fail = fail + 1;
3716
            end
3717
          end
3718 181 mohor
          // check if transfer was a proper length
3719 169 mohor
          if (i2) // without preamble
3720
          begin
3721
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3722
            begin
3723 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3724 169 mohor
              fail = fail + 1;
3725
            end
3726
          end
3727
          else // with preamble
3728
          begin
3729
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3730
            begin
3731 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3732 169 mohor
              fail = fail + 1;
3733
            end
3734
          end
3735
        end
3736 181 mohor
        #Tp;
3737
        // set delay of writing the command
3738
        if (i2) // without preamble
3739
        begin
3740
          case(i)
3741
            0, 1:               i = i + 1;
3742
            18, 19, 20, 21, 22,
3743
            23, 24, 25, 26, 27,
3744
            28, 29, 30, 31, 32,
3745
            33, 34, 35:         i = i + 1;
3746
            36:                 i = 80;
3747
            default:            i = 18;
3748
          endcase
3749
        end
3750
        else // with preamble
3751
        begin
3752
          case(i)
3753
            0, 1:               i = i + 1;
3754
            50, 51, 52, 53, 54,
3755
            55, 56, 57, 58, 59,
3756
            60, 61, 62, 63, 64,
3757
            65, 66, 67:         i = i + 1;
3758
            68:                 i = 80;
3759
            default:            i = 50;
3760
          endcase
3761
        end
3762
        @(posedge wb_clk);
3763
      end
3764
    end
3765
    // set PHY to normal mode
3766
    #Tp eth_phy.preamble_suppresed(0);
3767
    // MII mode register
3768
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3769
    if(fail == 0)
3770
      test_ok;
3771
    else
3772
      fail = 0;
3773
  end
3774 169 mohor
 
3775 181 mohor
 
3776
  ////////////////////////////////////////////////////////////////////
3777
  ////                                                            ////
3778
  ////  Test sliding stop scan command after 2. scan (with and    ////
3779
  ////  without preamble)                                         ////
3780
  ////                                                            ////
3781
  ////////////////////////////////////////////////////////////////////
3782
  if (test_num == 17) // 
3783
  begin
3784 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3785
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3786
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3787 181 mohor
 
3788
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3789
    begin
3790
      #Tp eth_phy.preamble_suppresed(i2);
3791
      // MII mode register
3792
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3793
                wbm_subseq_waits);
3794
 
3795
      i = 0;
3796
      cnt = 0;
3797
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3798
      begin
3799
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3800
        begin
3801
          // first there are two scans
3802
          // set address
3803
          reg_addr = 5'h0; // control register
3804
          phy_addr = 5'h1; // correct PHY address
3805
          cnt = 0;
3806
          // scan request
3807
          #Tp mii_scan_req(phy_addr, reg_addr);
3808
          // wait and check first 2 scans
3809 169 mohor
          begin
3810
            // wait for serial bus to become active
3811
            wait(Mdio_IO !== 1'bz);
3812
            // count transfer length
3813
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3814
            begin
3815
              @(posedge Mdc_O);
3816
              #Tp cnt = cnt + 1;
3817
            end
3818
            // check transfer length
3819
            if (i2) // without preamble
3820
            begin
3821
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3822
              begin
3823
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3824
                fail = fail + 1;
3825
              end
3826
            end
3827
            else // with preamble
3828
            begin
3829
              if (cnt != 65) // 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
            cnt = 0;
3836
            // wait for serial bus to become active if there is more than one scan
3837
            wait(Mdio_IO !== 1'bz);
3838
            // count transfer length
3839
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3840
            begin
3841
              @(posedge Mdc_O);
3842
              #Tp cnt = cnt + 1;
3843
            end
3844
            // check transfer length
3845
            if (i2) // without preamble
3846
            begin
3847
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3848
              begin
3849
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3850
                fail = fail + 1;
3851
              end
3852
            end
3853
            else // with preamble
3854
            begin
3855
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3856
              begin
3857
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3858
                fail = fail + 1;
3859
              end
3860
            end
3861
          end
3862
 
3863 181 mohor
          // reset counter 
3864
          cnt = 0;
3865
          fork
3866
            begin
3867
              repeat(i) @(posedge Mdc_O);
3868
              // write command 0x0 into MII command register
3869
              // MII command written while scan in progress
3870
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3871
              @(posedge wb_clk);
3872
              #Tp check_mii_busy; // wait for scan to finish
3873
              @(posedge wb_clk);
3874
              disable check_3;
3875
            end
3876
            begin: check_3
3877
              // wait for serial bus to become active
3878
              wait(Mdio_IO !== 1'bz);
3879
              // count transfer length
3880
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3881
              begin
3882
                @(posedge Mdc_O);
3883
                #Tp cnt = cnt + 1;
3884
              end
3885
              // check transfer length
3886
              if (i2) // without preamble
3887
              begin
3888
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3889
                begin
3890
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3891
                  fail = fail + 1;
3892
                end
3893
              end
3894
              else // with preamble
3895
              begin
3896
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3897
                begin
3898
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3899
                  fail = fail + 1;
3900
                end
3901
              end
3902
              cnt = 0;
3903
              // wait for serial bus to become active if there is more than one scan
3904
              wait(Mdio_IO !== 1'bz);
3905
              // count transfer length
3906
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3907
              begin
3908
                @(posedge Mdc_O);
3909
                #Tp cnt = cnt + 1;
3910
              end
3911
              // check transfer length
3912
              if (i2) // without preamble
3913
              begin
3914
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3915
                begin
3916
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3917
                  fail = fail + 1;
3918
                end
3919
              end
3920
              else // with preamble
3921
              begin
3922
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3923
                begin
3924
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3925
                  fail = fail + 1;
3926
                end
3927
              end
3928
            end
3929
          join
3930
          // check the BUSY signal to see if the bus is still IDLE
3931
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3932
            check_mii_busy; // wait for bus to become idle
3933
 
3934
          // try normal write or read after scan was finished
3935
          phy_data = {8'h7D, (i[7:0] + 1)};
3936
          cnt = 0;
3937
          if (i3 == 0) // write after scan
3938 169 mohor
          begin
3939 181 mohor
            // write request
3940
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3941
            // wait for serial bus to become active
3942
            wait(Mdio_IO !== 1'bz);
3943
            // count transfer length
3944
            while(Mdio_IO !== 1'bz)
3945
            begin
3946
              @(posedge Mdc_O);
3947
              #Tp cnt = cnt + 1;
3948
            end
3949 169 mohor
            @(posedge Mdc_O);
3950 181 mohor
            // read request
3951
            #Tp mii_read_req(phy_addr, reg_addr);
3952
            check_mii_busy; // wait for read to finish
3953
            // read and check data
3954
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3955
            if (phy_data !== tmp_data)
3956
            begin
3957
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3958
              fail = fail + 1;
3959
            end
3960 169 mohor
          end
3961 181 mohor
          else // read after scan
3962 169 mohor
          begin
3963 181 mohor
            // read request
3964
            #Tp mii_read_req(phy_addr, reg_addr);
3965
            // wait for serial bus to become active
3966
            wait(Mdio_IO !== 1'bz);
3967
            // count transfer length
3968
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3969
            begin
3970
              @(posedge Mdc_O);
3971
              #Tp cnt = cnt + 1;
3972
            end
3973
            @(posedge Mdc_O);
3974
            check_mii_busy; // wait for read to finish
3975
            // read and check data
3976
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3977
            if (phy_data !== tmp_data)
3978
            begin
3979
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3980
              fail = fail + 1;
3981
            end
3982 169 mohor
          end
3983 181 mohor
          // check if transfer was a proper length
3984
          if (i2) // without preamble
3985 169 mohor
          begin
3986 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3987
            begin
3988
              test_fail("New request did not proceed correctly, after scan request");
3989
              fail = fail + 1;
3990
            end
3991 169 mohor
          end
3992 181 mohor
          else // with preamble
3993 169 mohor
          begin
3994 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3995
            begin
3996
              test_fail("New request did not proceed correctly, after scan request");
3997
              fail = fail + 1;
3998
            end
3999 169 mohor
          end
4000
        end
4001 181 mohor
        #Tp;
4002
        // set delay of writing the command
4003 169 mohor
        if (i2) // without preamble
4004
        begin
4005 181 mohor
          case(i)
4006
            0, 1:               i = i + 1;
4007
            18, 19, 20, 21, 22,
4008
            23, 24, 25, 26, 27,
4009
            28, 29, 30, 31, 32,
4010
            33, 34, 35:         i = i + 1;
4011
            36:                 i = 80;
4012
            default:            i = 18;
4013
          endcase
4014 169 mohor
        end
4015
        else // with preamble
4016
        begin
4017 181 mohor
          case(i)
4018
            0, 1:               i = i + 1;
4019
            50, 51, 52, 53, 54,
4020
            55, 56, 57, 58, 59,
4021
            60, 61, 62, 63, 64,
4022
            65, 66, 67:         i = i + 1;
4023
            68:                 i = 80;
4024
            default:            i = 50;
4025
          endcase
4026 169 mohor
        end
4027 181 mohor
        @(posedge wb_clk);
4028 116 mohor
      end
4029
    end
4030 181 mohor
    // set PHY to normal mode
4031
    #Tp eth_phy.preamble_suppresed(0);
4032
    // MII mode register
4033
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4034
    if(fail == 0)
4035
      test_ok;
4036
    else
4037
      fail = 0;
4038 169 mohor
  end
4039 116 mohor
 
4040 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4041
 
4042 169 mohor
end
4043
endtask // test_mii
4044
 
4045
 
4046
task test_mac_full_duplex_transmit;
4047
  input  [31:0]  start_task;
4048
  input  [31:0]  end_task;
4049
  integer        bit_start_1;
4050
  integer        bit_end_1;
4051
  integer        bit_start_2;
4052
  integer        bit_end_2;
4053
  integer        num_of_reg;
4054 209 tadejm
  integer        num_of_frames;
4055
  integer        num_of_bd;
4056 169 mohor
  integer        i_addr;
4057
  integer        i_data;
4058
  integer        i_length;
4059 209 tadejm
  integer        tmp_len;
4060
  integer        tmp_bd;
4061
  integer        tmp_bd_num;
4062 169 mohor
  integer        tmp_data;
4063 209 tadejm
  integer        tmp_ipgt;
4064 194 tadej
  integer        test_num;
4065 169 mohor
  reg    [31:0]  tx_bd_num;
4066
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4067
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4068
  integer        i;
4069
  integer        i1;
4070
  integer        i2;
4071
  integer        i3;
4072
  integer        fail;
4073
  integer        speed;
4074 209 tadejm
  reg            frame_started;
4075
  reg            frame_ended;
4076
  reg            wait_for_frame;
4077 169 mohor
  reg    [31:0]  addr;
4078
  reg    [31:0]  data;
4079
  reg    [31:0]  tmp;
4080
  reg    [ 7:0]  st_data;
4081
  reg    [15:0]  max_tmp;
4082
  reg    [15:0]  min_tmp;
4083
begin
4084
// MAC FULL DUPLEX TRANSMIT TEST
4085
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4086
$display(" ");
4087
$display("MAC FULL DUPLEX TRANSMIT TEST");
4088
fail = 0;
4089
 
4090
// reset MAC registers
4091
hard_reset;
4092
// reset MAC and MII LOGIC with soft reset
4093
reset_mac;
4094
reset_mii;
4095
// set wb slave response
4096
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4097
 
4098
  /*
4099
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4100
  -------------------------------------------------------------------------------------
4101
  set_tx_bd
4102
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4103
  set_tx_bd_wrap
4104
    (tx_bd_num_end[6:0]);
4105
  set_tx_bd_ready
4106
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4107
  check_tx_bd
4108
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4109
  clear_tx_bd
4110
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4111
 
4112
  TASKS for set and control RX buffer descriptors:
4113
  ------------------------------------------------
4114
  set_rx_bd
4115
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4116
  set_rx_bd_wrap
4117
    (rx_bd_num_end[6:0]);
4118
  set_rx_bd_empty
4119
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4120
  check_rx_bd
4121
    (rx_bd_num_end[6:0], rx_bd_status);
4122
  clear_rx_bd
4123
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4124
 
4125
  TASKS for set and check TX packets:
4126
  -----------------------------------
4127
  set_tx_packet
4128
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4129
  check_tx_packet
4130
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4131
 
4132
  TASKS for set and check RX packets:
4133
  -----------------------------------
4134
  set_rx_packet
4135
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4136
  check_rx_packet
4137
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4138
 
4139
  TASKS for append and check CRC to/of TX packet:
4140
  -----------------------------------------------
4141
  append_tx_crc
4142
    (txpnt_wb[31:0], len[15:0], negated_crc);
4143
  check_tx_crc
4144
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4145
 
4146
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4147
  --------------------------------------------------------------------------------
4148
  append_rx_crc
4149
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4150
  */
4151
 
4152 194 tadej
//////////////////////////////////////////////////////////////////////
4153
////                                                              ////
4154
////  test_mac_full_duplex_transmit:                              ////
4155
////                                                              ////
4156
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4157
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4158
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4159
////     one TX buffer decriptor ( 10Mbps ).                      ////
4160
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4161
////     one TX buffer decriptor ( 100Mbps ).                     ////
4162
////                                                              ////
4163
//////////////////////////////////////////////////////////////////////
4164
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4165 169 mohor
begin
4166
 
4167 194 tadej
  ////////////////////////////////////////////////////////////////////
4168
  ////                                                            ////
4169
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4170
  ////                                                            ////
4171
  ////////////////////////////////////////////////////////////////////
4172
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4173 169 mohor
  begin
4174 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4175
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4176
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4177
 
4178
    // unmask interrupts
4179 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4180 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4181
    // set all buffer descriptors to RX - must be set before TX enable
4182
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4183
    // enable TX, set full-duplex mode, padding and CRC appending
4184
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4185
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4186
 
4187
    // write to phy's control register for 10Mbps
4188
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4189
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4190
    speed = 10;
4191
 
4192
    i = 0;
4193
    while (i < 128)
4194 169 mohor
    begin
4195 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4196 169 mohor
      begin
4197 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4198
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4199 169 mohor
      end
4200 194 tadej
      set_tx_bd_wrap(i);
4201
      fork
4202
        begin
4203
          set_tx_bd_ready(0, i);
4204
          repeat(20) @(negedge mtx_clk);
4205
          #1 disable check_tx_en10;
4206
        end
4207
        begin: check_tx_en10
4208
          wait (MTxEn === 1'b1);
4209
          test_fail("Tramsmit should not start at all");
4210
          fail = fail + 1;
4211
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4212
        end
4213
      join
4214
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4215 169 mohor
      begin
4216 194 tadej
        check_tx_bd(0, tmp);
4217
        #1;
4218
        if (tmp[15] === 1'b0)
4219
        begin
4220
          test_fail("Tramsmit should not start at all");
4221
          fail = fail + 1;
4222
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4223
        end
4224
        if (tmp[8:0] !== 0)
4225
        begin
4226
          test_fail("Tramsmit should not be finished since it should not start at all");
4227
          fail = fail + 1;
4228
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4229
        end
4230
        @(posedge wb_clk);
4231 169 mohor
      end
4232 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4233
      if (tmp[6:0] !== 0)
4234 169 mohor
      begin
4235 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4236 169 mohor
        fail = fail + 1;
4237 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4238 169 mohor
      end
4239 194 tadej
      clear_tx_bd(0, i);
4240
      if ((i < 5) || (i > 124))
4241
        i = i + 1;
4242
      else
4243
        i = i + 120;
4244 116 mohor
    end
4245 194 tadej
    // disable TX
4246
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4247
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4248
    if(fail == 0)
4249
      test_ok;
4250 116 mohor
    else
4251 194 tadej
      fail = 0;
4252 169 mohor
  end
4253 116 mohor
 
4254
 
4255 194 tadej
  ////////////////////////////////////////////////////////////////////
4256
  ////                                                            ////
4257
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4258
  ////                                                            ////
4259
  ////////////////////////////////////////////////////////////////////
4260
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4261 169 mohor
  begin
4262 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4263
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4264
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4265
 
4266
    // unmask interrupts
4267 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4268 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4269
    // set all buffer descriptors to RX - must be set before TX enable
4270
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4271
    // enable TX, set full-duplex mode, padding and CRC appending
4272
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4273
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4274
 
4275
    // write to phy's control register for 100Mbps
4276
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4277
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4278
    speed = 100;
4279
 
4280
    i = 0;
4281
    while (i < 128)
4282 169 mohor
    begin
4283 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4284 169 mohor
      begin
4285 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4286
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4287 169 mohor
      end
4288 194 tadej
      set_tx_bd_wrap(i);
4289
      fork
4290
        begin
4291
          set_tx_bd_ready(0, i);
4292
          repeat(20) @(negedge mtx_clk);
4293
          #1 disable check_tx_en100;
4294
        end
4295
        begin: check_tx_en100
4296
          wait (MTxEn === 1'b1);
4297
          test_fail("Tramsmit should not start at all");
4298
          fail = fail + 1;
4299
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4300
        end
4301
      join
4302
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4303 169 mohor
      begin
4304 194 tadej
        check_tx_bd(0, tmp);
4305
        #1;
4306
        if (tmp[15] === 1'b0)
4307
        begin
4308
          test_fail("Tramsmit should not start at all");
4309
          fail = fail + 1;
4310
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4311
        end
4312
        if (tmp[8:0] !== 0)
4313
        begin
4314
          test_fail("Tramsmit should not be finished since it should not start at all");
4315
          fail = fail + 1;
4316
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4317
        end
4318
        @(posedge wb_clk);
4319 169 mohor
      end
4320 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4321
      if (tmp[6:0] !== 0)
4322 169 mohor
      begin
4323 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4324 169 mohor
        fail = fail + 1;
4325 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4326 169 mohor
      end
4327 194 tadej
      clear_tx_bd(0, i);
4328
      if ((i < 5) || (i > 124))
4329
        i = i + 1;
4330
      else
4331
        i = i + 120;
4332 169 mohor
    end
4333 194 tadej
    // disable TX
4334
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4335
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4336
    if(fail == 0)
4337
      test_ok;
4338 169 mohor
    else
4339 194 tadej
      fail = 0;
4340 169 mohor
  end
4341
 
4342
 
4343 194 tadej
  ////////////////////////////////////////////////////////////////////
4344
  ////                                                            ////
4345
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4346
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4347
  ////                                                            ////
4348
  ////////////////////////////////////////////////////////////////////
4349 209 tadejm
  if (test_num == 2) // without and with padding
4350 169 mohor
  begin
4351 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4352
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4353
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4354
 
4355
    max_tmp = 0;
4356
    min_tmp = 0;
4357
    // set one TX buffer descriptor - must be set before TX enable
4358
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4359 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4360
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4361 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4362
    // prepare two packets of MAXFL length
4363
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4364
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4365
    min_tmp = tmp[31:16];
4366 209 tadejm
    st_data = 8'h01;
4367
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4368 194 tadej
    st_data = 8'h10;
4369 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4370 194 tadej
    // check WB INT signal
4371
    if (wb_int !== 1'b0)
4372 169 mohor
    begin
4373 194 tadej
      test_fail("WB INT signal should not be set");
4374
      fail = fail + 1;
4375 169 mohor
    end
4376 194 tadej
 
4377
    // write to phy's control register for 10Mbps
4378
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4379
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4380
    speed = 10;
4381
 
4382
    i_length = (min_tmp - 4);
4383
    while (i_length <= (max_tmp - 4))
4384 169 mohor
    begin
4385 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4386
      case (i_length[1:0])
4387
      2'h0: // Interrupt is generated
4388 169 mohor
      begin
4389 194 tadej
        // enable interrupt generation
4390 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4391 194 tadej
        // unmask interrupts
4392 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4393 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4394
        // not detect carrier sense in FD and no collision
4395
        eth_phy.carrier_sense_tx_fd_detect(0);
4396
        eth_phy.collision(0);
4397 169 mohor
      end
4398 194 tadej
      2'h1: // Interrupt is not generated
4399 169 mohor
      begin
4400 194 tadej
        // enable interrupt generation
4401 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4402 194 tadej
        // mask interrupts
4403
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4404
        // detect carrier sense in FD and no collision
4405
        eth_phy.carrier_sense_tx_fd_detect(1);
4406
        eth_phy.collision(0);
4407 169 mohor
      end
4408 194 tadej
      2'h2: // Interrupt is not generated
4409
      begin
4410
        // disable interrupt generation
4411 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4412 194 tadej
        // unmask interrupts
4413 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4414 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4415
        // not detect carrier sense in FD and set collision
4416
        eth_phy.carrier_sense_tx_fd_detect(0);
4417
        eth_phy.collision(1);
4418
      end
4419
      default: // 2'h3: // Interrupt is not generated
4420
      begin
4421
        // disable interrupt generation
4422 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4423 194 tadej
        // mask interrupts
4424
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4425
        // detect carrier sense in FD and set collision
4426
        eth_phy.carrier_sense_tx_fd_detect(1);
4427
        eth_phy.collision(1);
4428
      end
4429
      endcase
4430
      eth_phy.set_tx_mem_addr(max_tmp);
4431
      // set wrap bit
4432
      set_tx_bd_wrap(0);
4433
      set_tx_bd_ready(0, 0);
4434 169 mohor
      #1 check_tx_bd(0, data);
4435 194 tadej
      if (i_length < min_tmp) // just first four
4436 169 mohor
      begin
4437 194 tadej
        while (data[15] === 1)
4438
        begin
4439
          #1 check_tx_bd(0, data);
4440
          @(posedge wb_clk);
4441
        end
4442 209 tadejm
        repeat (1) @(posedge wb_clk);
4443 169 mohor
      end
4444 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4445 192 tadej
      begin
4446 194 tadej
        tmp = 0;
4447
        wait (MTxEn === 1'b1); // start transmit
4448
        while (tmp < (i_length - 20))
4449
        begin
4450
          #1 tmp = tmp + 1;
4451
          @(posedge wb_clk);
4452
        end
4453
        #1 check_tx_bd(0, data);
4454
        while (data[15] === 1)
4455
        begin
4456
          #1 check_tx_bd(0, data);
4457
          @(posedge wb_clk);
4458
        end
4459 209 tadejm
        repeat (1) @(posedge wb_clk);
4460 192 tadej
      end
4461
      else
4462
      begin
4463 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4464
        #1 check_tx_bd(0, data);
4465
        if (data[15] !== 1)
4466
        begin
4467
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4468
          fail = fail + 1;
4469
        end
4470
        wait (MTxEn === 1'b0); // end transmit
4471
        while (data[15] === 1)
4472
        begin
4473
          #1 check_tx_bd(0, data);
4474
          @(posedge wb_clk);
4475
        end
4476
        repeat (1) @(posedge wb_clk);
4477 192 tadej
      end
4478 194 tadej
      // check length of a PACKET
4479
      if (eth_phy.tx_len != (i_length + 4))
4480 192 tadej
      begin
4481 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4482 192 tadej
        fail = fail + 1;
4483
      end
4484 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4485
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4486 192 tadej
      begin
4487 194 tadej
        // check transmitted TX packet data
4488
        if (i_length[0] == 0)
4489
        begin
4490 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4491 194 tadej
        end
4492
        else
4493
        begin
4494 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4495 194 tadej
        end
4496
        if (tmp > 0)
4497
        begin
4498
          test_fail("Wrong data of the transmitted packet");
4499
          fail = fail + 1;
4500
        end
4501
        // check transmited TX packet CRC
4502
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4503
        if (tmp > 0)
4504
        begin
4505
          test_fail("Wrong CRC of the transmitted packet");
4506
          fail = fail + 1;
4507
        end
4508 192 tadej
      end
4509 194 tadej
      // check WB INT signal
4510
      if (i_length[1:0] == 2'h0)
4511 192 tadej
      begin
4512 194 tadej
        if (wb_int !== 1'b1)
4513
        begin
4514
          `TIME; $display("*E WB INT signal should be set");
4515
          test_fail("WB INT signal should be set");
4516
          fail = fail + 1;
4517
        end
4518 192 tadej
      end
4519 194 tadej
      else
4520 192 tadej
      begin
4521 194 tadej
        if (wb_int !== 1'b0)
4522
        begin
4523
          `TIME; $display("*E WB INT signal should not be set");
4524
          test_fail("WB INT signal should not be set");
4525
          fail = fail + 1;
4526
        end
4527 192 tadej
      end
4528 194 tadej
      // check TX buffer descriptor of a packet
4529
      check_tx_bd(0, data);
4530
      if (i_length[1] == 1'b0) // interrupt enabled
4531 192 tadej
      begin
4532 194 tadej
        if (data[15:0] !== 16'h7800)
4533
        begin
4534
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4535
          test_fail("TX buffer descriptor status is not correct");
4536
          fail = fail + 1;
4537
        end
4538 192 tadej
      end
4539 194 tadej
      else // interrupt not enabled
4540 192 tadej
      begin
4541 194 tadej
        if (data[15:0] !== 16'h3800)
4542
        begin
4543
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4544
          test_fail("TX buffer descriptor status is not correct");
4545
          fail = fail + 1;
4546
        end
4547 192 tadej
      end
4548 194 tadej
      // clear TX buffer descriptor
4549
      clear_tx_bd(0, 0);
4550
      // check interrupts
4551
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4552
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4553 192 tadej
      begin
4554 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4555
        begin
4556
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4557
          test_fail("Interrupt Transmit Buffer was not set");
4558
          fail = fail + 1;
4559
        end
4560
        if ((data & (~`ETH_INT_TXB)) !== 0)
4561
        begin
4562
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4563
          test_fail("Other interrupts (except Transmit Buffer) were set");
4564
          fail = fail + 1;
4565
        end
4566 192 tadej
      end
4567 194 tadej
      else
4568 192 tadej
      begin
4569 194 tadej
        if (data !== 0)
4570
        begin
4571
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4572
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4573
          fail = fail + 1;
4574
        end
4575 192 tadej
      end
4576 194 tadej
      // clear interrupts
4577
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4578
      // check WB INT signal
4579
      if (wb_int !== 1'b0)
4580 192 tadej
      begin
4581 194 tadej
        test_fail("WB INT signal should not be set");
4582 192 tadej
        fail = fail + 1;
4583
      end
4584 194 tadej
      // INTERMEDIATE DISPLAYS
4585
      if ((i_length + 4) == (min_tmp + 64))
4586 209 tadejm
      begin
4587 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4588 209 tadejm
        $display("    pads appending to packets is NOT selected");
4589
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4590 194 tadej
                 min_tmp, (min_tmp + 64));
4591 209 tadejm
        // set padding, remain the rest
4592
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4593
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4594
      end
4595 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4596 209 tadejm
      begin
4597 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4598 209 tadejm
        $display("    pads appending to packets is selected");
4599
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4600 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4601 209 tadejm
        // reset padding, remain the rest
4602
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4603
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4604
      end
4605 194 tadej
      else if ((i_length + 4) == max_tmp)
4606 209 tadejm
      begin
4607
        $display("    pads appending to packets is NOT selected");
4608
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4609 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4610 209 tadejm
      end
4611 194 tadej
      // set length (loop variable)
4612
      if ((i_length + 4) < (min_tmp + 64))
4613
        i_length = i_length + 1;
4614
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4615
      begin
4616
        i_length = i_length + 128;
4617
        tmp_data = i_length + 4; // last tmp_data is ending length
4618
      end
4619
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4620
        i_length = max_tmp - (4 + 16);
4621
      else if ((i_length + 4) >= (max_tmp - 16))
4622
        i_length = i_length + 1;
4623
      else
4624
      begin
4625
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4626
        #10 $stop;
4627
      end
4628 192 tadej
    end
4629 194 tadej
    // disable TX
4630
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4631
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4632
    if(fail == 0)
4633
      test_ok;
4634
    else
4635
      fail = 0;
4636
  end
4637
 
4638
 
4639
  ////////////////////////////////////////////////////////////////////
4640
  ////                                                            ////
4641
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4642
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4643
  ////                                                            ////
4644
  ////////////////////////////////////////////////////////////////////
4645 209 tadejm
  if (test_num == 3) // with and without padding
4646 194 tadej
  begin
4647
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4648
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4649
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4650
 
4651
    max_tmp = 0;
4652
    min_tmp = 0;
4653
    // set one TX buffer descriptor - must be set before TX enable
4654
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4655 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4656
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4657 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4658
    // prepare two packets of MAXFL length
4659
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4660
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4661
    min_tmp = tmp[31:16];
4662
    st_data = 8'h5A;
4663 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4664 194 tadej
    st_data = 8'h10;
4665 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4666 169 mohor
    // check WB INT signal
4667 192 tadej
    if (wb_int !== 1'b0)
4668 169 mohor
    begin
4669
      test_fail("WB INT signal should not be set");
4670
      fail = fail + 1;
4671
    end
4672 194 tadej
 
4673
    // write to phy's control register for 100Mbps
4674
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4675
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4676
    speed = 100;
4677 192 tadej
 
4678 194 tadej
    i_length = (min_tmp - 4);
4679
    while (i_length <= (max_tmp - 4))
4680 192 tadej
    begin
4681 194 tadej
      // choose generating carrier sense and collision
4682
      case (i_length[1:0])
4683
      2'h0: // Interrupt is generated
4684 192 tadej
      begin
4685 194 tadej
        // enable interrupt generation
4686 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4687 194 tadej
        // unmask interrupts
4688 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4689 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4690
        // not detect carrier sense in FD and no collision
4691
        eth_phy.carrier_sense_tx_fd_detect(0);
4692
        eth_phy.collision(0);
4693 192 tadej
      end
4694 194 tadej
      2'h1: // Interrupt is not generated
4695 192 tadej
      begin
4696 194 tadej
        // enable interrupt generation
4697 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4698 194 tadej
        // mask interrupts
4699
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4700
        // detect carrier sense in FD and no collision
4701
        eth_phy.carrier_sense_tx_fd_detect(1);
4702
        eth_phy.collision(0);
4703 192 tadej
      end
4704 194 tadej
      2'h2: // Interrupt is not generated
4705
      begin
4706
        // disable interrupt generation
4707 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4708 194 tadej
        // unmask interrupts
4709 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4710 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4711
        // not detect carrier sense in FD and set collision
4712
        eth_phy.carrier_sense_tx_fd_detect(0);
4713
        eth_phy.collision(1);
4714
      end
4715
      default: // 2'h3: // Interrupt is not generated
4716
      begin
4717
        // disable interrupt generation
4718 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4719 194 tadej
        // mask interrupts
4720
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4721
        // detect carrier sense in FD and set collision
4722
        eth_phy.carrier_sense_tx_fd_detect(1);
4723
        eth_phy.collision(1);
4724
      end
4725
      endcase
4726
      eth_phy.set_tx_mem_addr(max_tmp);
4727
      // set wrap bit
4728
      set_tx_bd_wrap(0);
4729
      set_tx_bd_ready(0, 0);
4730 192 tadej
      #1 check_tx_bd(0, data);
4731 194 tadej
      if (i_length < min_tmp) // just first four
4732 192 tadej
      begin
4733 194 tadej
        while (data[15] === 1)
4734
        begin
4735
          #1 check_tx_bd(0, data);
4736
          @(posedge wb_clk);
4737
        end
4738 209 tadejm
        repeat (1) @(posedge wb_clk);
4739 194 tadej
      end
4740
      else if (i_length > (max_tmp - 8)) // just last four
4741
      begin
4742
        tmp = 0;
4743
        wait (MTxEn === 1'b1); // start transmit
4744
        while (tmp < (i_length - 20))
4745
        begin
4746
          #1 tmp = tmp + 1;
4747
          @(posedge wb_clk);
4748
        end
4749 192 tadej
        #1 check_tx_bd(0, data);
4750 194 tadej
        while (data[15] === 1)
4751
        begin
4752
          #1 check_tx_bd(0, data);
4753
          @(posedge wb_clk);
4754
        end
4755 209 tadejm
        repeat (1) @(posedge wb_clk);
4756 192 tadej
      end
4757 194 tadej
      else
4758
      begin
4759
        wait (MTxEn === 1'b1); // start transmit
4760
        #1 check_tx_bd(0, data);
4761
        if (data[15] !== 1)
4762
        begin
4763
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4764
          fail = fail + 1;
4765
        end
4766
        wait (MTxEn === 1'b0); // end transmit
4767
        while (data[15] === 1)
4768
        begin
4769
          #1 check_tx_bd(0, data);
4770
          @(posedge wb_clk);
4771
        end
4772
        repeat (1) @(posedge wb_clk);
4773
      end
4774
      // check length of a PACKET
4775
      if (eth_phy.tx_len != (i_length + 4))
4776
      begin
4777
        test_fail("Wrong length of the packet out from MAC");
4778
        fail = fail + 1;
4779
      end
4780 192 tadej
      // check transmitted TX packet data
4781
      if (i_length[0] == 0)
4782
      begin
4783 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4784 192 tadej
      end
4785
      else
4786
      begin
4787 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4788 192 tadej
      end
4789
      if (tmp > 0)
4790
      begin
4791
        test_fail("Wrong data of the transmitted packet");
4792
        fail = fail + 1;
4793
      end
4794
      // check transmited TX packet CRC
4795
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4796
      if (tmp > 0)
4797
      begin
4798
        test_fail("Wrong CRC of the transmitted packet");
4799
        fail = fail + 1;
4800
      end
4801 194 tadej
      // check WB INT signal
4802
      if (i_length[1:0] == 2'h0)
4803 192 tadej
      begin
4804 194 tadej
        if (wb_int !== 1'b1)
4805
        begin
4806
          `TIME; $display("*E WB INT signal should be set");
4807
          test_fail("WB INT signal should be set");
4808
          fail = fail + 1;
4809
        end
4810 192 tadej
      end
4811 194 tadej
      else
4812 192 tadej
      begin
4813 194 tadej
        if (wb_int !== 1'b0)
4814
        begin
4815
          `TIME; $display("*E WB INT signal should not be set");
4816
          test_fail("WB INT signal should not be set");
4817
          fail = fail + 1;
4818
        end
4819 192 tadej
      end
4820 194 tadej
      // check TX buffer descriptor of a packet
4821
      check_tx_bd(0, data);
4822
      if (i_length[1] == 1'b0) // interrupt enabled
4823 192 tadej
      begin
4824 194 tadej
        if (data[15:0] !== 16'h7800)
4825
        begin
4826
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4827
          test_fail("TX buffer descriptor status is not correct");
4828
          fail = fail + 1;
4829
        end
4830 192 tadej
      end
4831 194 tadej
      else // interrupt not enabled
4832 192 tadej
      begin
4833 194 tadej
        if (data[15:0] !== 16'h3800)
4834
        begin
4835
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4836
          test_fail("TX buffer descriptor status is not correct");
4837
          fail = fail + 1;
4838
        end
4839 192 tadej
      end
4840 194 tadej
      // clear TX buffer descriptor
4841
      clear_tx_bd(0, 0);
4842
      // check interrupts
4843
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4844
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4845 192 tadej
      begin
4846 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4847
        begin
4848
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4849
          test_fail("Interrupt Transmit Buffer was not set");
4850
          fail = fail + 1;
4851
        end
4852
        if ((data & (~`ETH_INT_TXB)) !== 0)
4853
        begin
4854
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4855
          test_fail("Other interrupts (except Transmit Buffer) were set");
4856
          fail = fail + 1;
4857
        end
4858 192 tadej
      end
4859 194 tadej
      else
4860 192 tadej
      begin
4861 194 tadej
        if (data !== 0)
4862
        begin
4863
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
4864
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4865
          fail = fail + 1;
4866
        end
4867 192 tadej
      end
4868 194 tadej
      // clear interrupts
4869
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4870
      // check WB INT signal
4871
      if (wb_int !== 1'b0)
4872 192 tadej
      begin
4873 194 tadej
        test_fail("WB INT signal should not be set");
4874 192 tadej
        fail = fail + 1;
4875
      end
4876 194 tadej
      // INTERMEDIATE DISPLAYS
4877
      if ((i_length + 4) == (min_tmp + 64))
4878 209 tadejm
      begin
4879 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4880 209 tadejm
        $display("    pads appending to packets is NOT selected");
4881
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4882 194 tadej
                 min_tmp, (min_tmp + 64));
4883 209 tadejm
        // set padding, remain the rest
4884
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4885
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4886
      end
4887 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4888 209 tadejm
      begin
4889 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4890 209 tadejm
        $display("    pads appending to packets is selected");
4891
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4892 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4893 209 tadejm
        // reset padding, remain the rest
4894
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4895
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4896
      end
4897 194 tadej
      else if ((i_length + 4) == max_tmp)
4898 209 tadejm
      begin
4899
        $display("    pads appending to packets is NOT selected");
4900
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4901 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4902 209 tadejm
      end
4903 194 tadej
      // set length (loop variable)
4904
      if ((i_length + 4) < (min_tmp + 64))
4905
        i_length = i_length + 1;
4906
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4907
      begin
4908
        i_length = i_length + 128;
4909
        tmp_data = i_length + 4; // last tmp_data is ending length
4910
      end
4911
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4912
        i_length = max_tmp - (4 + 16);
4913
      else if ((i_length + 4) >= (max_tmp - 16))
4914
        i_length = i_length + 1;
4915 192 tadej
      else
4916 194 tadej
      begin
4917
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4918
        #10 $stop;
4919
      end
4920 179 mohor
    end
4921 194 tadej
    // disable TX
4922
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4923
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4924
    if(fail == 0)
4925
      test_ok;
4926
    else
4927
      fail = 0;
4928 169 mohor
  end
4929
 
4930
 
4931 209 tadejm
  ////////////////////////////////////////////////////////////////////
4932
  ////                                                            ////
4933
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4934
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
4935
  ////                                                            ////
4936
  ////////////////////////////////////////////////////////////////////
4937
  if (test_num == 4) // without and with padding
4938
  begin
4939
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
4940
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
4941
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
4942
 
4943
    // reset MAC registers
4944
    hard_reset;
4945
    // reset MAC and MII LOGIC with soft reset
4946
    reset_mac;
4947
    reset_mii;
4948
    // set wb slave response
4949
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4950 192 tadej
 
4951 209 tadejm
    max_tmp = 0;
4952
    min_tmp = 0;
4953
    num_of_frames = 0;
4954
    num_of_bd = 0;
4955
    // set maximum TX buffer descriptors (128) - must be set before TX enable
4956
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4957
    // enable TX, set full-duplex mode, NO padding and CRC appending
4958
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4959
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4960
    // prepare two packets of MAXFL length
4961
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4962
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4963
    min_tmp = tmp[31:16];
4964
    st_data = 8'hA3;
4965
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4966
    st_data = 8'h81;
4967
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4968
    // check WB INT signal
4969
    if (wb_int !== 1'b0)
4970
    begin
4971
      test_fail("WB INT signal should not be set");
4972
      fail = fail + 1;
4973
    end
4974
 
4975
    // write to phy's control register for 10Mbps
4976
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4977
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4978
    speed = 10;
4979
 
4980
    i_length = (min_tmp - 4);
4981
    while (i_length <= (max_tmp - 4))
4982
    begin
4983
      // choose generating carrier sense and collision
4984
      case (i_length[1:0])
4985
      2'h0: // Interrupt is generated
4986
      begin
4987
        // Reset_tx_bd nable interrupt generation
4988
        // unmask interrupts
4989
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4990
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4991
        // not detect carrier sense in FD and no collision
4992
        eth_phy.carrier_sense_tx_fd_detect(0);
4993
        eth_phy.collision(0);
4994
      end
4995
      2'h1: // Interrupt is not generated
4996
      begin
4997
        // set_tx_bd enable interrupt generation
4998
        // mask interrupts
4999
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5000
        // detect carrier sense in FD and no collision
5001
        eth_phy.carrier_sense_tx_fd_detect(1);
5002
        eth_phy.collision(0);
5003
      end
5004
      2'h2: // Interrupt is not generated
5005
      begin
5006
        // set_tx_bd disable the interrupt generation
5007
        // unmask interrupts
5008
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5009
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5010
        // not detect carrier sense in FD and set collision
5011
        eth_phy.carrier_sense_tx_fd_detect(0);
5012
        eth_phy.collision(1);
5013
      end
5014
      default: // 2'h3: // Interrupt is not generated
5015
      begin
5016
        // set_tx_bd disable the interrupt generation
5017
        // mask interrupts
5018
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5019
        // detect carrier sense in FD and set collision
5020
        eth_phy.carrier_sense_tx_fd_detect(1);
5021
        eth_phy.collision(1);
5022
      end
5023
      endcase
5024
      // first destination address on ethernet PHY
5025
      if (i_length[0] == 0)
5026
        eth_phy.set_tx_mem_addr(0);
5027
      else
5028
        eth_phy.set_tx_mem_addr(max_tmp);
5029
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5030
      // number of all frames is 154 (146 without first 8)
5031
      if (num_of_frames < 8)
5032
      begin
5033
        case (i_length[1:0])
5034
        2'h0: // Interrupt is generated
5035
        begin
5036
          // enable interrupt generation
5037
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5038
          // interrupts are unmasked
5039
        end
5040
        2'h1: // Interrupt is not generated
5041
        begin
5042
          // enable interrupt generation
5043
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5044
          // interrupts are masked
5045
        end
5046
        2'h2: // Interrupt is not generated
5047
        begin
5048
          // disable interrupt generation
5049
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5050
          // interrupts are unmasked
5051
        end
5052
        default: // 2'h3: // Interrupt is not generated
5053
        begin
5054
          // disable interrupt generation
5055
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5056
          // interrupts are masked
5057
        end
5058
        endcase
5059
        // set wrap bit
5060
        set_tx_bd_wrap(0);
5061
      end
5062
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5063
      else if ((num_of_frames - 8) == 0)
5064
      begin
5065
        tmp_len = i_length; // length of frame
5066
        tmp_bd_num = 0; // TX BD number
5067
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5068
        begin
5069
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5070
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5071
          if (tmp_len[0] == 0)
5072
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5073
          else
5074
            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));
5075
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5076
          if ((tmp_len + 4) < (min_tmp + 128))
5077
            tmp_len = tmp_len + 1;
5078
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5079
            tmp_len = 256;
5080
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5081
            tmp_len = tmp_len + 128;
5082
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5083
            tmp_len = max_tmp - (4 + 16);
5084
          else if ((tmp_len + 4) >= (max_tmp - 16))
5085
            tmp_len = tmp_len + 1;
5086
          // set TX BD number
5087
          tmp_bd_num = tmp_bd_num + 1;
5088
        end
5089
        // set wrap bit
5090
        set_tx_bd_wrap(127);
5091
      end
5092
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5093
      else if ((num_of_frames - 8) == 20) // 128
5094
      begin
5095
        tmp_len = tmp_len; // length of frame remaines from previous settings
5096
        tmp_bd_num = 0; // TX BD number
5097
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5098
        begin
5099
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5100
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5101
          if (tmp_len[0] == 0)
5102
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5103
          else
5104
            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));
5105
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5106
          if ((tmp_len + 4) < (min_tmp + 128))
5107
            tmp_len = tmp_len + 1;
5108
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5109
            tmp_len = 256;
5110
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5111
            tmp_len = tmp_len + 128;
5112
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5113
            tmp_len = max_tmp - (4 + 16);
5114
          else if ((tmp_len + 4) >= (max_tmp - 16))
5115
            tmp_len = tmp_len + 1;
5116
          // set TX BD number
5117
          tmp_bd_num = tmp_bd_num + 1;
5118
        end
5119
      end
5120
      // set ready bit
5121
      if (num_of_frames < 8)
5122
        set_tx_bd_ready(0, 0);
5123
      else if ((num_of_frames - 8) < 128)
5124
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5125
      else if ((num_of_frames - 136) < 19)
5126
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5127
      // CHECK END OF TRANSMITION
5128
      #1 check_tx_bd(num_of_bd, data);
5129
      if (i_length < min_tmp) // just first four
5130
      begin
5131
        while (data[15] === 1)
5132
        begin
5133
          #1 check_tx_bd(num_of_bd, data);
5134
          @(posedge wb_clk);
5135
        end
5136
        repeat (1) @(posedge wb_clk);
5137
      end
5138
      else if (i_length > (max_tmp - 8)) // just last four
5139
      begin
5140
        tmp = 0;
5141
        wait (MTxEn === 1'b1); // start transmit
5142
        while (tmp < (i_length - 20))
5143
        begin
5144
          #1 tmp = tmp + 1;
5145
          @(posedge wb_clk);
5146
        end
5147
        #1 check_tx_bd(num_of_bd, data);
5148
        while (data[15] === 1)
5149
        begin
5150
          #1 check_tx_bd(num_of_bd, data);
5151
          @(posedge wb_clk);
5152
        end
5153
        repeat (1) @(posedge wb_clk);
5154
      end
5155
      else
5156
      begin
5157
        wait (MTxEn === 1'b1); // start transmit
5158
        #1 check_tx_bd(num_of_bd, data);
5159
        if (data[15] !== 1)
5160
        begin
5161
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5162
          fail = fail + 1;
5163
        end
5164
        wait (MTxEn === 1'b0); // end transmit
5165
        while (data[15] === 1)
5166
        begin
5167
          #1 check_tx_bd(num_of_bd, data);
5168
          @(posedge wb_clk);
5169
        end
5170
        repeat (1) @(posedge wb_clk);
5171
      end
5172
      // check length of a PACKET
5173
      if (eth_phy.tx_len != (i_length + 4))
5174
      begin
5175
        test_fail("Wrong length of the packet out from MAC");
5176
        fail = fail + 1;
5177
      end
5178
        // check transmitted TX packet data
5179
        if (i_length[0] == 0)
5180
        begin
5181
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5182
        end
5183
        else
5184
        begin
5185
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5186
        end
5187
        if (tmp > 0)
5188
        begin
5189
          test_fail("Wrong data of the transmitted packet");
5190
          fail = fail + 1;
5191
        end
5192
        // check transmited TX packet CRC
5193
        if (i_length[0] == 0)
5194
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5195
        else
5196
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5197
        if (tmp > 0)
5198
        begin
5199
          test_fail("Wrong CRC of the transmitted packet");
5200
          fail = fail + 1;
5201
        end
5202
      // check WB INT signal
5203
      if (i_length[1:0] == 2'h0)
5204
      begin
5205
        if (wb_int !== 1'b1)
5206
        begin
5207
          `TIME; $display("*E WB INT signal should be set");
5208
          test_fail("WB INT signal should be set");
5209
          fail = fail + 1;
5210
        end
5211
      end
5212
      else
5213
      begin
5214
        if (wb_int !== 1'b0)
5215
        begin
5216
          `TIME; $display("*E WB INT signal should not be set");
5217
          test_fail("WB INT signal should not be set");
5218
          fail = fail + 1;
5219
        end
5220
      end
5221
      // check TX buffer descriptor of a packet
5222
      check_tx_bd(num_of_bd, data);
5223
      if (i_length[1] == 1'b0) // interrupt enabled
5224
      begin
5225
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5226
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5227
        begin
5228
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5229
          test_fail("TX buffer descriptor status is not correct");
5230
          fail = fail + 1;
5231
        end
5232
      end
5233
      else // interrupt not enabled
5234
      begin
5235
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5236
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5237
        begin
5238
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5239
          test_fail("TX buffer descriptor status is not correct");
5240
          fail = fail + 1;
5241
        end
5242
      end
5243
      // clear first half of 8 frames from TX buffer descriptor 0
5244
      if (num_of_frames < 4)
5245
        clear_tx_bd(num_of_bd, num_of_bd);
5246
      // clear BD with wrap bit
5247
      if (num_of_frames == 140)
5248
        clear_tx_bd(127, 127);
5249
      // check interrupts
5250
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5251
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5252
      begin
5253
        if ((data & `ETH_INT_TXB) !== 1'b1)
5254
        begin
5255
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5256
          test_fail("Interrupt Transmit Buffer was not set");
5257
          fail = fail + 1;
5258
        end
5259
        if ((data & (~`ETH_INT_TXB)) !== 0)
5260
        begin
5261
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5262
          test_fail("Other interrupts (except Transmit Buffer) were set");
5263
          fail = fail + 1;
5264
        end
5265
      end
5266
      else
5267
      begin
5268
        if (data !== 0)
5269
        begin
5270
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5271
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5272
          fail = fail + 1;
5273
        end
5274
      end
5275
      // clear interrupts
5276
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5277
      // check WB INT signal
5278
      if (wb_int !== 1'b0)
5279
      begin
5280
        test_fail("WB INT signal should not be set");
5281
        fail = fail + 1;
5282
      end
5283
      // INTERMEDIATE DISPLAYS
5284
      if ((i_length + 4) == (min_tmp + 7))
5285
      begin
5286
        // starting length is min_tmp, ending length is (min_tmp + 128)
5287
        $display("    pads appending to packets is NOT selected");
5288
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5289
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5290
                 min_tmp, (min_tmp + 7));
5291
        $display("    ->all packets were send from TX BD 0");
5292
        // set padding, remain the rest
5293
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5294
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5295
      end
5296
      else if ((i_length + 4) == (min_tmp + 128))
5297
      begin
5298
        // starting length is min_tmp, ending length is (min_tmp + 128)
5299
        $display("    pads appending to packets is NOT selected");
5300
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5301
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5302
                 (min_tmp + 8), (min_tmp + 128));
5303
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5304
                 1'b0, num_of_bd);
5305
        tmp_bd = num_of_bd + 1;
5306
        // set padding, remain the rest
5307
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5308
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5309
      end
5310
      else if ((i_length + 4) == (max_tmp - 16))
5311
      begin
5312
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5313
        $display("    pads appending to packets is selected");
5314
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5315
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5316
                 (min_tmp + 64 + 128), tmp_data);
5317
        if (tmp_bd > num_of_bd)
5318
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5319
                   tmp_bd, num_of_bd);
5320
        else
5321
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5322
                   tmp_bd, num_of_bd);
5323
        tmp_bd = num_of_bd + 1;
5324
        // reset padding, remain the rest
5325
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5326
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5327
      end
5328
      else if ((i_length + 4) == max_tmp)
5329
      begin
5330
        $display("    pads appending to packets is NOT selected");
5331
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5332
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5333
                 (max_tmp - (4 + 16)), max_tmp);
5334
        if (tmp_bd > num_of_bd)
5335
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5336
                   tmp_bd, num_of_bd);
5337
        else
5338
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5339
                   tmp_bd, num_of_bd);
5340
      end
5341
      // set length (loop variable)
5342
      if ((i_length + 4) < (min_tmp + 128))
5343
        i_length = i_length + 1;
5344
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5345
        i_length = 256;
5346
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5347
      begin
5348
        i_length = i_length + 128;
5349
        tmp_data = i_length + 4; // last tmp_data is ending length
5350
      end
5351
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5352
        i_length = max_tmp - (4 + 16);
5353
      else if ((i_length + 4) >= (max_tmp - 16))
5354
        i_length = i_length + 1;
5355
      else
5356
      begin
5357
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5358
        #10 $stop;
5359
      end
5360
      // the number of frame transmitted
5361
      num_of_frames = num_of_frames + 1;
5362
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5363
        num_of_bd = 0;
5364
      else
5365
        num_of_bd = num_of_bd + 1;
5366
    end
5367
    // disable TX
5368
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5369
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5370
    @(posedge wb_clk);
5371
    if(fail == 0)
5372
      test_ok;
5373
    else
5374
      fail = 0;
5375
  end
5376
 
5377
 
5378
  ////////////////////////////////////////////////////////////////////
5379
  ////                                                            ////
5380
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5381
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5382
  ////                                                            ////
5383
  ////////////////////////////////////////////////////////////////////
5384
  if (test_num == 5) // with and without padding
5385
  begin
5386
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5387
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5388
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5389
 
5390
    // reset MAC registers
5391
    hard_reset;
5392
    // reset MAC and MII LOGIC with soft reset
5393
    reset_mac;
5394
    reset_mii;
5395
    // set wb slave response
5396
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5397
 
5398
    max_tmp = 0;
5399
    min_tmp = 0;
5400
    num_of_frames = 0;
5401
    num_of_bd = 0;
5402
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5403
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5404
    // enable TX, set full-duplex mode, NO padding and CRC appending
5405
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5406
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5407
    // prepare two packets of MAXFL length
5408
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5409
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5410
    min_tmp = tmp[31:16];
5411
    st_data = 8'hA5;
5412
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5413
    st_data = 8'h71;
5414
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5415
    // check WB INT signal
5416
    if (wb_int !== 1'b0)
5417
    begin
5418
      test_fail("WB INT signal should not be set");
5419
      fail = fail + 1;
5420
    end
5421
 
5422
    // write to phy's control register for 100Mbps
5423
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5424
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5425
    speed = 100;
5426
 
5427
    i_length = (min_tmp - 4);
5428
    while (i_length <= (max_tmp - 4))
5429
    begin
5430
      // choose generating carrier sense and collision
5431
      case (i_length[1:0])
5432
      2'h0: // Interrupt is generated
5433
      begin
5434
        // Reset_tx_bd nable interrupt generation
5435
        // unmask interrupts
5436
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5437
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5438
        // not detect carrier sense in FD and no collision
5439
        eth_phy.carrier_sense_tx_fd_detect(0);
5440
        eth_phy.collision(0);
5441
      end
5442
      2'h1: // Interrupt is not generated
5443
      begin
5444
        // set_tx_bd enable interrupt generation
5445
        // mask interrupts
5446
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5447
        // detect carrier sense in FD and no collision
5448
        eth_phy.carrier_sense_tx_fd_detect(1);
5449
        eth_phy.collision(0);
5450
      end
5451
      2'h2: // Interrupt is not generated
5452
      begin
5453
        // set_tx_bd disable the interrupt generation
5454
        // unmask interrupts
5455
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5456
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5457
        // not detect carrier sense in FD and set collision
5458
        eth_phy.carrier_sense_tx_fd_detect(0);
5459
        eth_phy.collision(1);
5460
      end
5461
      default: // 2'h3: // Interrupt is not generated
5462
      begin
5463
        // set_tx_bd disable the interrupt generation
5464
        // mask interrupts
5465
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5466
        // detect carrier sense in FD and set collision
5467
        eth_phy.carrier_sense_tx_fd_detect(1);
5468
        eth_phy.collision(1);
5469
      end
5470
      endcase
5471
      // first destination address on ethernet PHY
5472
      if (i_length[0] == 0)
5473
        eth_phy.set_tx_mem_addr(0);
5474
      else
5475
        eth_phy.set_tx_mem_addr(max_tmp);
5476
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5477
      // number of all frames is 154 (146 without first 8)
5478
      if (num_of_frames < 8)
5479
      begin
5480
        case (i_length[1:0])
5481
        2'h0: // Interrupt is generated
5482
        begin
5483
          // enable interrupt generation
5484
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5485
          // interrupts are unmasked
5486
        end
5487
        2'h1: // Interrupt is not generated
5488
        begin
5489
          // enable interrupt generation
5490
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5491
          // interrupts are masked
5492
        end
5493
        2'h2: // Interrupt is not generated
5494
        begin
5495
          // disable interrupt generation
5496
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5497
          // interrupts are unmasked
5498
        end
5499
        default: // 2'h3: // Interrupt is not generated
5500
        begin
5501
          // disable interrupt generation
5502
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5503
          // interrupts are masked
5504
        end
5505
        endcase
5506
        // set wrap bit
5507
        set_tx_bd_wrap(0);
5508
      end
5509
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5510
      else if ((num_of_frames - 8) == 0)
5511
      begin
5512
        tmp_len = i_length; // length of frame
5513
        tmp_bd_num = 0; // TX BD number
5514
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5515
        begin
5516
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5517
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5518
          if (tmp_len[0] == 0)
5519
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5520
          else
5521
            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));
5522
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5523
          if ((tmp_len + 4) < (min_tmp + 128))
5524
            tmp_len = tmp_len + 1;
5525
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5526
            tmp_len = 256;
5527
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5528
            tmp_len = tmp_len + 128;
5529
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5530
            tmp_len = max_tmp - (4 + 16);
5531
          else if ((tmp_len + 4) >= (max_tmp - 16))
5532
            tmp_len = tmp_len + 1;
5533
          // set TX BD number
5534
          tmp_bd_num = tmp_bd_num + 1;
5535
        end
5536
        // set wrap bit
5537
        set_tx_bd_wrap(127);
5538
      end
5539
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5540
      else if ((num_of_frames - 8) == 20) // 128
5541
      begin
5542
        tmp_len = tmp_len; // length of frame remaines from previous settings
5543
        tmp_bd_num = 0; // TX BD number
5544
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5545
        begin
5546
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5547
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5548
          if (tmp_len[0] == 0)
5549
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5550
          else
5551
            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));
5552
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5553
          if ((tmp_len + 4) < (min_tmp + 128))
5554
            tmp_len = tmp_len + 1;
5555
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5556
            tmp_len = 256;
5557
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5558
            tmp_len = tmp_len + 128;
5559
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5560
            tmp_len = max_tmp - (4 + 16);
5561
          else if ((tmp_len + 4) >= (max_tmp - 16))
5562
            tmp_len = tmp_len + 1;
5563
          // set TX BD number
5564
          tmp_bd_num = tmp_bd_num + 1;
5565
        end
5566
      end
5567
      // set ready bit
5568
      if (num_of_frames < 8)
5569
        set_tx_bd_ready(0, 0);
5570
      else if ((num_of_frames - 8) < 128)
5571
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5572
      else if ((num_of_frames - 136) < 19)
5573
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5574
      // CHECK END OF TRANSMITION
5575
      #1 check_tx_bd(num_of_bd, data);
5576
      if (i_length < min_tmp) // just first four
5577
      begin
5578
        while (data[15] === 1)
5579
        begin
5580
          #1 check_tx_bd(num_of_bd, data);
5581
          @(posedge wb_clk);
5582
        end
5583
        repeat (1) @(posedge wb_clk);
5584
      end
5585
      else if (i_length > (max_tmp - 8)) // just last four
5586
      begin
5587
        tmp = 0;
5588
        wait (MTxEn === 1'b1); // start transmit
5589
        while (tmp < (i_length - 20))
5590
        begin
5591
          #1 tmp = tmp + 1;
5592
          @(posedge wb_clk);
5593
        end
5594
        #1 check_tx_bd(num_of_bd, data);
5595
        while (data[15] === 1)
5596
        begin
5597
          #1 check_tx_bd(num_of_bd, data);
5598
          @(posedge wb_clk);
5599
        end
5600
        repeat (1) @(posedge wb_clk);
5601
      end
5602
      else
5603
      begin
5604
        wait (MTxEn === 1'b1); // start transmit
5605
        #1 check_tx_bd(num_of_bd, data);
5606
        if (data[15] !== 1)
5607
        begin
5608
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5609
          fail = fail + 1;
5610
        end
5611
        wait (MTxEn === 1'b0); // end transmit
5612
        while (data[15] === 1)
5613
        begin
5614
          #1 check_tx_bd(num_of_bd, data);
5615
          @(posedge wb_clk);
5616
        end
5617
        repeat (1) @(posedge wb_clk);
5618
      end
5619
      // check length of a PACKET
5620
      if (eth_phy.tx_len != (i_length + 4))
5621
      begin
5622
        test_fail("Wrong length of the packet out from MAC");
5623
        fail = fail + 1;
5624
      end
5625
      // checking in the following if statement is performed only for first and last 64 lengths
5626
        // check transmitted TX packet data
5627
        if (i_length[0] == 0)
5628
        begin
5629
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5630
        end
5631
        else
5632
        begin
5633
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5634
        end
5635
        if (tmp > 0)
5636
        begin
5637
          test_fail("Wrong data of the transmitted packet");
5638
          fail = fail + 1;
5639
        end
5640
        // check transmited TX packet CRC
5641
        if (i_length[0] == 0)
5642
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5643
        else
5644
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5645
        if (tmp > 0)
5646
        begin
5647
          test_fail("Wrong CRC of the transmitted packet");
5648
          fail = fail + 1;
5649
        end
5650
      // check WB INT signal
5651
      if (i_length[1:0] == 2'h0)
5652
      begin
5653
        if (wb_int !== 1'b1)
5654
        begin
5655
          `TIME; $display("*E WB INT signal should be set");
5656
          test_fail("WB INT signal should be set");
5657
          fail = fail + 1;
5658
        end
5659
      end
5660
      else
5661
      begin
5662
        if (wb_int !== 1'b0)
5663
        begin
5664
          `TIME; $display("*E WB INT signal should not be set");
5665
          test_fail("WB INT signal should not be set");
5666
          fail = fail + 1;
5667
        end
5668
      end
5669
      // check TX buffer descriptor of a packet
5670
      check_tx_bd(num_of_bd, data);
5671
      if (i_length[1] == 1'b0) // interrupt enabled
5672
      begin
5673
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5674
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5675
        begin
5676
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5677
          test_fail("TX buffer descriptor status is not correct");
5678
          fail = fail + 1;
5679
        end
5680
      end
5681
      else // interrupt not enabled
5682
      begin
5683
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5684
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5685
        begin
5686
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5687
          test_fail("TX buffer descriptor status is not correct");
5688
          fail = fail + 1;
5689
        end
5690
      end
5691
      // clear first half of 8 frames from TX buffer descriptor 0
5692
      if (num_of_frames < 4)
5693
        clear_tx_bd(num_of_bd, num_of_bd);
5694
      // clear BD with wrap bit
5695
      if (num_of_frames == 140)
5696
        clear_tx_bd(127, 127);
5697
      // check interrupts
5698
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5699
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5700
      begin
5701
        if ((data & `ETH_INT_TXB) !== 1'b1)
5702
        begin
5703
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5704
          test_fail("Interrupt Transmit Buffer was not set");
5705
          fail = fail + 1;
5706
        end
5707
        if ((data & (~`ETH_INT_TXB)) !== 0)
5708
        begin
5709
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5710
          test_fail("Other interrupts (except Transmit Buffer) were set");
5711
          fail = fail + 1;
5712
        end
5713
      end
5714
      else
5715
      begin
5716
        if (data !== 0)
5717
        begin
5718
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5719
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5720
          fail = fail + 1;
5721
        end
5722
      end
5723
      // clear interrupts
5724
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5725
      // check WB INT signal
5726
      if (wb_int !== 1'b0)
5727
      begin
5728
        test_fail("WB INT signal should not be set");
5729
        fail = fail + 1;
5730
      end
5731
      // INTERMEDIATE DISPLAYS
5732
      if ((i_length + 4) == (min_tmp + 7))
5733
      begin
5734
        // starting length is min_tmp, ending length is (min_tmp + 128)
5735
        $display("    pads appending to packets is NOT selected");
5736
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5737
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5738
                 min_tmp, (min_tmp + 7));
5739
        $display("    ->all packets were send from TX BD 0");
5740
        // set padding, remain the rest
5741
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5742
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5743
      end
5744
      else if ((i_length + 4) == (min_tmp + 128))
5745
      begin
5746
        // starting length is min_tmp, ending length is (min_tmp + 128)
5747
        $display("    pads appending to packets is NOT selected");
5748
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5749
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5750
                 (min_tmp + 8), (min_tmp + 128));
5751
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5752
                 1'b0, num_of_bd);
5753
        tmp_bd = num_of_bd + 1;
5754
        // set padding, remain the rest
5755
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5756
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5757
      end
5758
      else if ((i_length + 4) == (max_tmp - 16))
5759
      begin
5760
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5761
        $display("    pads appending to packets is selected");
5762
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5763
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5764
                 (min_tmp + 64 + 128), tmp_data);
5765
        if (tmp_bd > num_of_bd)
5766
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5767
                   tmp_bd, num_of_bd);
5768
        else
5769
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5770
                   tmp_bd, num_of_bd);
5771
        tmp_bd = num_of_bd + 1;
5772
        // reset padding, remain the rest
5773
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5774
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5775
      end
5776
      else if ((i_length + 4) == max_tmp)
5777
      begin
5778
        $display("    pads appending to packets is NOT selected");
5779
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5780
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5781
                 (max_tmp - (4 + 16)), max_tmp);
5782
        if (tmp_bd > num_of_bd)
5783
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5784
                   tmp_bd, num_of_bd);
5785
        else
5786
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5787
                   tmp_bd, num_of_bd);
5788
      end
5789
      // set length (loop variable)
5790
      if ((i_length + 4) < (min_tmp + 128))
5791
        i_length = i_length + 1;
5792
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5793
        i_length = 256;
5794
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5795
      begin
5796
        i_length = i_length + 128;
5797
        tmp_data = i_length + 4; // last tmp_data is ending length
5798
      end
5799
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5800
        i_length = max_tmp - (4 + 16);
5801
      else if ((i_length + 4) >= (max_tmp - 16))
5802
        i_length = i_length + 1;
5803
      else
5804
      begin
5805
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5806
        #10 $stop;
5807
      end
5808
      // the number of frame transmitted
5809
      num_of_frames = num_of_frames + 1;
5810
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5811
        num_of_bd = 0;
5812
      else
5813
        num_of_bd = num_of_bd + 1;
5814
    end
5815
    // disable TX
5816
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5817
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5818
    @(posedge wb_clk);
5819
    if(fail == 0)
5820
      test_ok;
5821
    else
5822
      fail = 0;
5823
  end
5824
 
5825
 
5826
  ////////////////////////////////////////////////////////////////////
5827
  ////                                                            ////
5828
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
5829
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
5830
  ////                                                            ////
5831
  ////////////////////////////////////////////////////////////////////
5832
  if (test_num == 6) // 
5833
  begin
5834
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
5835
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
5836
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
5837
 
5838
    // reset MAC registers
5839
    hard_reset;
5840
    // reset MAC and MII LOGIC with soft reset
5841
    reset_mac;
5842
    reset_mii;
5843
    // set wb slave response
5844
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5845
 
5846
    max_tmp = 0;
5847
    min_tmp = 0;
5848
    // set 8 TX buffer descriptors - must be set before TX enable
5849
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5850
    // enable TX, set full-duplex mode, padding and CRC appending
5851
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5852
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5853
    // prepare two packets of MAXFL length
5854
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5855
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5856
    min_tmp = tmp[31:16];
5857
    st_data = 8'h12;
5858
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
5859
    st_data = 8'h34;
5860
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
5861
    // check WB INT signal
5862
    if (wb_int !== 1'b0)
5863
    begin
5864
      test_fail("WB INT signal should not be set");
5865
      fail = fail + 1;
5866
    end
5867
 
5868
    // write to phy's control register for 10Mbps
5869
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5870
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5871
    speed = 10;
5872
 
5873
    frame_started = 0;
5874
    num_of_frames = 0;
5875
    num_of_bd = 0;
5876
    i_length = 0; // 0;
5877
    while (i_length < 70) // (min_tmp - 4))
5878
    begin
5879
      #1;
5880
      // choose generating carrier sense and collision
5881
      case (i_length[1:0])
5882
      2'h0: // Interrupt is generated
5883
      begin
5884
        // Reset_tx_bd nable interrupt generation
5885
        // unmask interrupts
5886
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5887
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5888
        // not detect carrier sense in FD and no collision
5889
        eth_phy.carrier_sense_tx_fd_detect(0);
5890
        eth_phy.collision(0);
5891
      end
5892
      2'h1: // Interrupt is not generated
5893
      begin
5894
        // set_tx_bd enable interrupt generation
5895
        // mask interrupts
5896
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5897
        // detect carrier sense in FD and no collision
5898
        eth_phy.carrier_sense_tx_fd_detect(1);
5899
        eth_phy.collision(0);
5900
      end
5901
      2'h2: // Interrupt is not generated
5902
      begin
5903
        // set_tx_bd disable the interrupt generation
5904
        // unmask interrupts
5905
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5906
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5907
        // not detect carrier sense in FD and set collision
5908
        eth_phy.carrier_sense_tx_fd_detect(0);
5909
        eth_phy.collision(1);
5910
      end
5911
      default: // 2'h3: // Interrupt is not generated
5912
      begin
5913
        // set_tx_bd disable the interrupt generation
5914
        // mask interrupts
5915
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5916
        // detect carrier sense in FD and set collision
5917
        eth_phy.carrier_sense_tx_fd_detect(1);
5918
        eth_phy.collision(1);
5919
      end
5920
      endcase
5921
      #1;
5922
      // first destination address on ethernet PHY
5923
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
5924
      // SET packets and wrap bit
5925
      // num_of_frames <= 9 => wrap set to TX BD 0
5926
      if (num_of_frames <= 9)
5927
      begin
5928
        tmp_len = i_length; // length of frame
5929
        tmp_bd_num = 0; // TX BD number
5930
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5931
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5932
        if (tmp_len[0] == 0)
5933
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5934
        else
5935
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5936
        // set wrap bit
5937
        set_tx_bd_wrap(0);
5938
      end
5939
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
5940
      else if ((num_of_frames == 10) || (num_of_frames == 14))
5941
      begin
5942
        tmp_len = i_length; // length of frame
5943
        tmp_bd_num = 0; // TX BD number
5944
        while (tmp_bd_num < 4) //
5945
        begin
5946
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5947
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5948
          if (tmp_len[0] == 0)
5949
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5950
          else
5951
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5952
          tmp_len = tmp_len + 1;
5953
          // set TX BD number
5954
          tmp_bd_num = tmp_bd_num + 1;
5955
        end
5956
        // set wrap bit
5957
        set_tx_bd_wrap(3);
5958
      end
5959
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
5960
      else if ((num_of_frames == 18) || (num_of_frames == 23))
5961
      begin
5962
        tmp_len = i_length; // length of frame
5963
        tmp_bd_num = 0; // TX BD number
5964
        while (tmp_bd_num < 5) //
5965
        begin
5966
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5967
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5968
          if (tmp_len[0] == 0)
5969
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5970
          else
5971
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5972
          tmp_len = tmp_len + 1;
5973
          // set TX BD number
5974
          tmp_bd_num = tmp_bd_num + 1;
5975
        end
5976
        // set wrap bit
5977
        set_tx_bd_wrap(4);
5978
      end
5979
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
5980
      else if ((num_of_frames == 28) || (num_of_frames == 34))
5981
      begin
5982
        tmp_len = i_length; // length of frame
5983
        tmp_bd_num = 0; // TX BD number
5984
        while (tmp_bd_num < 6) //
5985
        begin
5986
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5987
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5988
          if (tmp_len[0] == 0)
5989
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5990
          else
5991
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5992
          tmp_len = tmp_len + 1;
5993
          // set TX BD number
5994
          tmp_bd_num = tmp_bd_num + 1;
5995
        end
5996
        // set wrap bit
5997
        set_tx_bd_wrap(5);
5998
      end
5999
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6000
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6001
      begin
6002
        tmp_len = i_length; // length of frame
6003
        tmp_bd_num = 0; // TX BD number
6004
        while (tmp_bd_num < 7) //
6005
        begin
6006
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6007
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6008
          if (tmp_len[0] == 0)
6009
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6010
          else
6011
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6012
          tmp_len = tmp_len + 1;
6013
          // set TX BD number
6014
          tmp_bd_num = tmp_bd_num + 1;
6015
        end
6016
        // set wrap bit
6017
        set_tx_bd_wrap(6);
6018
      end
6019
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6020
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6021
      begin
6022
        tmp_len = i_length; // length of frame
6023
        tmp_bd_num = 0; // TX BD number
6024
        while (tmp_bd_num < 8) //
6025
        begin
6026
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6027
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6028
          if (tmp_len[0] == 0)
6029
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6030
          else
6031
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6032
          tmp_len = tmp_len + 1;
6033
          // set TX BD number
6034
          tmp_bd_num = tmp_bd_num + 1;
6035
        end
6036
        // set wrap bit
6037
        set_tx_bd_wrap(7);
6038
      end
6039
      #1;
6040
      // SET ready bit
6041
      if (num_of_frames < 10)
6042
        set_tx_bd_ready(0, 0);
6043
      else if (num_of_frames < 14)
6044
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6045
      else if (num_of_frames < 18)
6046
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6047
      else if (num_of_frames < 23)
6048
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6049
      else if (num_of_frames < 28)
6050
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6051
      else if (num_of_frames < 34)
6052
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6053
      else if (num_of_frames < 40)
6054
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6055
      else if (num_of_frames < 47)
6056
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6057
      else if (num_of_frames < 54)
6058
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6059
      else if (num_of_frames < 62)
6060
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6061
      else if (num_of_frames < 70)
6062
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6063
      // CHECK END OF TRANSMITION
6064
      frame_started = 0;
6065
      if (num_of_frames >= 5)
6066
        #1 check_tx_bd(num_of_bd, data);
6067
      fork
6068
      begin: fr_st
6069
        wait (MTxEn === 1'b1); // start transmit
6070
        frame_started = 1;
6071
      end
6072
      begin
6073
        repeat (30) @(posedge mtx_clk);
6074
        if (num_of_frames < 5)
6075
        begin
6076
          if (frame_started == 1)
6077
          begin
6078
            `TIME; $display("*E Frame should NOT start!");
6079
          end
6080
          disable fr_st;
6081
        end
6082
        else
6083
        begin
6084
          if (frame_started == 0)
6085
          begin
6086
            `TIME; $display("*W Frame should start!");
6087
            disable fr_st;
6088
          end
6089
        end
6090
      end
6091
      join
6092
      // check packets larger than 4 bytes
6093
      if (num_of_frames >= 5)
6094
      begin
6095
        wait (MTxEn === 1'b0); // end transmit
6096
        while (data[15] === 1)
6097
        begin
6098
          #1 check_tx_bd(num_of_bd, data);
6099
          @(posedge wb_clk);
6100
        end
6101
        repeat (1) @(posedge wb_clk);
6102
        // check length of a PACKET
6103
        if (i_length <= (min_tmp - 4))
6104
        begin
6105
          if (eth_phy.tx_len != min_tmp)
6106
          begin
6107
            test_fail("Wrong length of the packet out from MAC");
6108
            fail = fail + 1;
6109
          end
6110
        end
6111
        else
6112
        begin
6113
          if (eth_phy.tx_len != (i_length + 4))
6114
          begin
6115
            test_fail("Wrong length of the packet out from MAC");
6116
            fail = fail + 1;
6117
          end
6118
        end
6119
        // check transmitted TX packet data
6120
        if (i_length[0] == 0)
6121
        begin
6122
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6123
        end
6124
        else
6125
        begin
6126
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6127
        end
6128
        if (tmp > 0)
6129
        begin
6130
          test_fail("Wrong data of the transmitted packet");
6131
          fail = fail + 1;
6132
        end
6133
        // check transmited TX packet CRC
6134
        if (num_of_frames < (min_tmp - 4))
6135
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6136
        else
6137
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6138
        if (tmp > 0)
6139
        begin
6140
          test_fail("Wrong CRC of the transmitted packet");
6141
          fail = fail + 1;
6142
        end
6143
      end
6144
      // check WB INT signal
6145
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6146
      begin
6147
        if (wb_int !== 1'b1)
6148
        begin
6149
          `TIME; $display("*E WB INT signal should be set");
6150
          test_fail("WB INT signal should be set");
6151
          fail = fail + 1;
6152
        end
6153
      end
6154
      else
6155
      begin
6156
        if (wb_int !== 1'b0)
6157
        begin
6158
          `TIME; $display("*E WB INT signal should not be set");
6159
          test_fail("WB INT signal should not be set");
6160
          fail = fail + 1;
6161
        end
6162
      end
6163
      // check TX buffer descriptor of a packet
6164
      check_tx_bd(num_of_bd, data);
6165
      if (num_of_frames >= 5)
6166
      begin
6167
        if (i_length[1] == 1'b0) // interrupt enabled
6168
        begin
6169
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6170
               (data[15:0] !== 16'h5800) ) // without wrap bit
6171
          begin
6172
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6173
            test_fail("TX buffer descriptor status is not correct");
6174
            fail = fail + 1;
6175
          end
6176
        end
6177
        else // interrupt not enabled
6178
        begin
6179
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6180
               (data[15:0] !== 16'h1800) ) // without wrap bit
6181
          begin
6182
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6183
            test_fail("TX buffer descriptor status is not correct");
6184
            fail = fail + 1;
6185
          end
6186
        end
6187
      end
6188
      else
6189
      begin
6190
        if (data[15] !== 1'b1)
6191
        begin
6192
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6193
          test_fail("TX buffer descriptor status is not correct");
6194
          fail = fail + 1;
6195
        end
6196
      end
6197
      // clear TX BD with wrap bit
6198
      if (num_of_frames == 63)
6199
        clear_tx_bd(16, 16);
6200
      // check interrupts
6201
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6202
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6203
      begin
6204
        if ((data & `ETH_INT_TXB) !== 1'b1)
6205
        begin
6206
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6207
          test_fail("Interrupt Transmit Buffer was not set");
6208
          fail = fail + 1;
6209
        end
6210
        if ((data & (~`ETH_INT_TXB)) !== 0)
6211
        begin
6212
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6213
          test_fail("Other interrupts (except Transmit Buffer) were set");
6214
          fail = fail + 1;
6215
        end
6216
      end
6217
      else
6218
      begin
6219
        if (data !== 0)
6220
        begin
6221
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6222
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6223
          fail = fail + 1;
6224
        end
6225
      end
6226
      // clear interrupts
6227
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6228
      // check WB INT signal
6229
      if (wb_int !== 1'b0)
6230
      begin
6231
        test_fail("WB INT signal should not be set");
6232
        fail = fail + 1;
6233
      end
6234
      // INTERMEDIATE DISPLAYS
6235
      if (i_length == 3)
6236
      begin
6237
        $display("    pads appending to packets is selected");
6238
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6239
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6240
                 0, 3);
6241
      end
6242
      else if (i_length == 9)
6243
      begin
6244
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6245
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6246
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6247
                 5, 9);
6248
      end
6249
      else if (i_length == 17)
6250
      begin
6251
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6252
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6253
                 10, 17);
6254
      end
6255
      else if (i_length == 27)
6256
      begin
6257
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6258
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6259
                 18, 27);
6260
      end
6261
      else if (i_length == 40)
6262
      begin
6263
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6264
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6265
                 28, 40);
6266
      end
6267
      else if (i_length == 54)
6268
      begin
6269
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6270
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6271
                 41, 54);
6272
      end
6273
      else if (i_length == 69)
6274
      begin
6275
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6276
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6277
                 55, 69);
6278
      end
6279
      // set length (loop variable)
6280
      i_length = i_length + 1;
6281
      // the number of frame transmitted
6282
      num_of_frames = num_of_frames + 1;
6283
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6284
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6285
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6286
          (num_of_frames == 54) || (num_of_frames == 62))
6287
        num_of_bd = 0;
6288
      else
6289
        num_of_bd = num_of_bd + 1;
6290
    end
6291
    // disable TX
6292
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6293
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6294
    @(posedge wb_clk);
6295
    if(fail == 0)
6296
      test_ok;
6297
    else
6298
      fail = 0;
6299
  end
6300
 
6301
 
6302
  ////////////////////////////////////////////////////////////////////
6303
  ////                                                            ////
6304
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6305
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6306
  ////                                                            ////
6307
  ////////////////////////////////////////////////////////////////////
6308
  if (test_num == 7) // 
6309
  begin
6310
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6311
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6312
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6313
 
6314
    // reset MAC registers
6315
    hard_reset;
6316
    // reset MAC and MII LOGIC with soft reset
6317
    reset_mac;
6318
    reset_mii;
6319
    // set wb slave response
6320
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6321
 
6322
    max_tmp = 0;
6323
    min_tmp = 0;
6324
    // set 8 TX buffer descriptors - must be set before TX enable
6325
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6326
    // enable TX, set full-duplex mode, padding and CRC appending
6327
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6328
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6329
    // prepare two packets of MAXFL length
6330
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6331
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6332
    min_tmp = tmp[31:16];
6333
    st_data = 8'h12;
6334
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6335
    st_data = 8'h34;
6336
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6337
    // check WB INT signal
6338
    if (wb_int !== 1'b0)
6339
    begin
6340
      test_fail("WB INT signal should not be set");
6341
      fail = fail + 1;
6342
    end
6343
 
6344
    // write to phy's control register for 100Mbps
6345
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6346
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6347
    speed = 100;
6348
 
6349
    frame_started = 0;
6350
    num_of_frames = 0;
6351
    num_of_bd = 0;
6352
    i_length = 0; // 0;
6353
    while (i_length < 70) // (min_tmp - 4))
6354
    begin
6355
      #1;
6356
      // choose generating carrier sense and collision
6357
      case (i_length[1:0])
6358
      2'h0: // Interrupt is generated
6359
      begin
6360
        // Reset_tx_bd nable interrupt generation
6361
        // unmask interrupts
6362
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6363
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6364
        // not detect carrier sense in FD and no collision
6365
        eth_phy.carrier_sense_tx_fd_detect(0);
6366
        eth_phy.collision(0);
6367
      end
6368
      2'h1: // Interrupt is not generated
6369
      begin
6370
        // set_tx_bd enable interrupt generation
6371
        // mask interrupts
6372
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6373
        // detect carrier sense in FD and no collision
6374
        eth_phy.carrier_sense_tx_fd_detect(1);
6375
        eth_phy.collision(0);
6376
      end
6377
      2'h2: // Interrupt is not generated
6378
      begin
6379
        // set_tx_bd disable the interrupt generation
6380
        // unmask interrupts
6381
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6382
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6383
        // not detect carrier sense in FD and set collision
6384
        eth_phy.carrier_sense_tx_fd_detect(0);
6385
        eth_phy.collision(1);
6386
      end
6387
      default: // 2'h3: // Interrupt is not generated
6388
      begin
6389
        // set_tx_bd disable the interrupt generation
6390
        // mask interrupts
6391
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6392
        // detect carrier sense in FD and set collision
6393
        eth_phy.carrier_sense_tx_fd_detect(1);
6394
        eth_phy.collision(1);
6395
      end
6396
      endcase
6397
      #1;
6398
      // first destination address on ethernet PHY
6399
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6400
      // SET packets and wrap bit
6401
      // num_of_frames <= 9 => wrap set to TX BD 0
6402
      if (num_of_frames <= 9)
6403
      begin
6404
        tmp_len = i_length; // length of frame
6405
        tmp_bd_num = 0; // TX BD number
6406
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6407
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6408
        if (tmp_len[0] == 0)
6409
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6410
        else
6411
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6412
        // set wrap bit
6413
        set_tx_bd_wrap(0);
6414
      end
6415
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6416
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6417
      begin
6418
        tmp_len = i_length; // length of frame
6419
        tmp_bd_num = 0; // TX BD number
6420
        while (tmp_bd_num < 4) //
6421
        begin
6422
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6423
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6424
          if (tmp_len[0] == 0)
6425
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6426
          else
6427
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6428
          tmp_len = tmp_len + 1;
6429
          // set TX BD number
6430
          tmp_bd_num = tmp_bd_num + 1;
6431
        end
6432
        // set wrap bit
6433
        set_tx_bd_wrap(3);
6434
      end
6435
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6436
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6437
      begin
6438
        tmp_len = i_length; // length of frame
6439
        tmp_bd_num = 0; // TX BD number
6440
        while (tmp_bd_num < 5) //
6441
        begin
6442
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6443
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6444
          if (tmp_len[0] == 0)
6445
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6446
          else
6447
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6448
          tmp_len = tmp_len + 1;
6449
          // set TX BD number
6450
          tmp_bd_num = tmp_bd_num + 1;
6451
        end
6452
        // set wrap bit
6453
        set_tx_bd_wrap(4);
6454
      end
6455
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6456
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6457
      begin
6458
        tmp_len = i_length; // length of frame
6459
        tmp_bd_num = 0; // TX BD number
6460
        while (tmp_bd_num < 6) //
6461
        begin
6462
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6463
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6464
          if (tmp_len[0] == 0)
6465
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6466
          else
6467
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6468
          tmp_len = tmp_len + 1;
6469
          // set TX BD number
6470
          tmp_bd_num = tmp_bd_num + 1;
6471
        end
6472
        // set wrap bit
6473
        set_tx_bd_wrap(5);
6474
      end
6475
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6476
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6477
      begin
6478
        tmp_len = i_length; // length of frame
6479
        tmp_bd_num = 0; // TX BD number
6480
        while (tmp_bd_num < 7) //
6481
        begin
6482
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6483
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6484
          if (tmp_len[0] == 0)
6485
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6486
          else
6487
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6488
          tmp_len = tmp_len + 1;
6489
          // set TX BD number
6490
          tmp_bd_num = tmp_bd_num + 1;
6491
        end
6492
        // set wrap bit
6493
        set_tx_bd_wrap(6);
6494
      end
6495
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6496
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6497
      begin
6498
        tmp_len = i_length; // length of frame
6499
        tmp_bd_num = 0; // TX BD number
6500
        while (tmp_bd_num < 8) //
6501
        begin
6502
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6503
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6504
          if (tmp_len[0] == 0)
6505
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6506
          else
6507
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6508
          tmp_len = tmp_len + 1;
6509
          // set TX BD number
6510
          tmp_bd_num = tmp_bd_num + 1;
6511
        end
6512
        // set wrap bit
6513
        set_tx_bd_wrap(7);
6514
      end
6515
      #1;
6516
      // SET ready bit
6517
      if (num_of_frames < 10)
6518
        set_tx_bd_ready(0, 0);
6519
      else if (num_of_frames < 14)
6520
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6521
      else if (num_of_frames < 18)
6522
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6523
      else if (num_of_frames < 23)
6524
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6525
      else if (num_of_frames < 28)
6526
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6527
      else if (num_of_frames < 34)
6528
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6529
      else if (num_of_frames < 40)
6530
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6531
      else if (num_of_frames < 47)
6532
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6533
      else if (num_of_frames < 54)
6534
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6535
      else if (num_of_frames < 62)
6536
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6537
      else if (num_of_frames < 70)
6538
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6539
      // CHECK END OF TRANSMITION
6540
      frame_started = 0;
6541
      if (num_of_frames >= 5)
6542
        #1 check_tx_bd(num_of_bd, data);
6543
      fork
6544
      begin: fr_st1
6545
        wait (MTxEn === 1'b1); // start transmit
6546
        frame_started = 1;
6547
      end
6548
      begin
6549
        repeat (30) @(posedge mtx_clk);
6550
        if (num_of_frames < 5)
6551
        begin
6552
          if (frame_started == 1)
6553
          begin
6554
            `TIME; $display("*E Frame should NOT start!");
6555
          end
6556
          disable fr_st1;
6557
        end
6558
        else
6559
        begin
6560
          if (frame_started == 0)
6561
          begin
6562
            `TIME; $display("*W Frame should start!");
6563
            disable fr_st1;
6564
          end
6565
        end
6566
      end
6567
      join
6568
      // check packets larger than 4 bytes
6569
      if (num_of_frames >= 5)
6570
      begin
6571
        wait (MTxEn === 1'b0); // end transmit
6572
        while (data[15] === 1)
6573
        begin
6574
          #1 check_tx_bd(num_of_bd, data);
6575
          @(posedge wb_clk);
6576
        end
6577
        repeat (1) @(posedge wb_clk);
6578
        // check length of a PACKET
6579
        if (i_length <= (min_tmp - 4))
6580
        begin
6581
          if (eth_phy.tx_len != min_tmp)
6582
          begin
6583
            test_fail("Wrong length of the packet out from MAC");
6584
            fail = fail + 1;
6585
          end
6586
        end
6587
        else
6588
        begin
6589
          if (eth_phy.tx_len != (i_length + 4))
6590
          begin
6591
            test_fail("Wrong length of the packet out from MAC");
6592
            fail = fail + 1;
6593
          end
6594
        end
6595
        // check transmitted TX packet data
6596
        if (i_length[0] == 0)
6597
        begin
6598
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6599
        end
6600
        else
6601
        begin
6602
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6603
        end
6604
        if (tmp > 0)
6605
        begin
6606
          test_fail("Wrong data of the transmitted packet");
6607
          fail = fail + 1;
6608
        end
6609
        // check transmited TX packet CRC
6610
        if (num_of_frames < (min_tmp - 4))
6611
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6612
        else
6613
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6614
        if (tmp > 0)
6615
        begin
6616
          test_fail("Wrong CRC of the transmitted packet");
6617
          fail = fail + 1;
6618
        end
6619
      end
6620
      // check WB INT signal
6621
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6622
      begin
6623
        if (wb_int !== 1'b1)
6624
        begin
6625
          `TIME; $display("*E WB INT signal should be set");
6626
          test_fail("WB INT signal should be set");
6627
          fail = fail + 1;
6628
        end
6629
      end
6630
      else
6631
      begin
6632
        if (wb_int !== 1'b0)
6633
        begin
6634
          `TIME; $display("*E WB INT signal should not be set");
6635
          test_fail("WB INT signal should not be set");
6636
          fail = fail + 1;
6637
        end
6638
      end
6639
      // check TX buffer descriptor of a packet
6640
      check_tx_bd(num_of_bd, data);
6641
      if (num_of_frames >= 5)
6642
      begin
6643
        if (i_length[1] == 1'b0) // interrupt enabled
6644
        begin
6645
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6646
               (data[15:0] !== 16'h5800) ) // without wrap bit
6647
          begin
6648
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6649
            test_fail("TX buffer descriptor status is not correct");
6650
            fail = fail + 1;
6651
          end
6652
        end
6653
        else // interrupt not enabled
6654
        begin
6655
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6656
               (data[15:0] !== 16'h1800) ) // without wrap bit
6657
          begin
6658
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6659
            test_fail("TX buffer descriptor status is not correct");
6660
            fail = fail + 1;
6661
          end
6662
        end
6663
      end
6664
      else
6665
      begin
6666
        if (data[15] !== 1'b1)
6667
        begin
6668
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6669
          test_fail("TX buffer descriptor status is not correct");
6670
          fail = fail + 1;
6671
        end
6672
      end
6673
      // clear TX BD with wrap bit
6674
      if (num_of_frames == 63)
6675
        clear_tx_bd(16, 16);
6676
      // check interrupts
6677
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6678
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6679
      begin
6680
        if ((data & `ETH_INT_TXB) !== 1'b1)
6681
        begin
6682
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6683
          test_fail("Interrupt Transmit Buffer was not set");
6684
          fail = fail + 1;
6685
        end
6686
        if ((data & (~`ETH_INT_TXB)) !== 0)
6687
        begin
6688
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6689
          test_fail("Other interrupts (except Transmit Buffer) were set");
6690
          fail = fail + 1;
6691
        end
6692
      end
6693
      else
6694
      begin
6695
        if (data !== 0)
6696
        begin
6697
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6698
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6699
          fail = fail + 1;
6700
        end
6701
      end
6702
      // clear interrupts
6703
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6704
      // check WB INT signal
6705
      if (wb_int !== 1'b0)
6706
      begin
6707
        test_fail("WB INT signal should not be set");
6708
        fail = fail + 1;
6709
      end
6710
      // INTERMEDIATE DISPLAYS
6711
      if (i_length == 3)
6712
      begin
6713
        $display("    pads appending to packets is selected");
6714
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6715
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6716
                 0, 3);
6717
      end
6718
      else if (i_length == 9)
6719
      begin
6720
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6721
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6722
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6723
                 5, 9);
6724
      end
6725
      else if (i_length == 17)
6726
      begin
6727
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6728
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6729
                 10, 17);
6730
      end
6731
      else if (i_length == 27)
6732
      begin
6733
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6734
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6735
                 18, 27);
6736
      end
6737
      else if (i_length == 40)
6738
      begin
6739
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6740
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6741
                 28, 40);
6742
      end
6743
      else if (i_length == 54)
6744
      begin
6745
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6746
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6747
                 41, 54);
6748
      end
6749
      else if (i_length == 69)
6750
      begin
6751
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6752
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6753
                 55, 69);
6754
      end
6755
      // set length (loop variable)
6756
      i_length = i_length + 1;
6757
      // the number of frame transmitted
6758
      num_of_frames = num_of_frames + 1;
6759
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6760
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6761
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6762
          (num_of_frames == 54) || (num_of_frames == 62))
6763
        num_of_bd = 0;
6764
      else
6765
        num_of_bd = num_of_bd + 1;
6766
    end
6767
    // disable TX
6768
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6769
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6770
    @(posedge wb_clk);
6771
    if(fail == 0)
6772
      test_ok;
6773
    else
6774
      fail = 0;
6775
  end
6776
 
6777
 
6778
  ////////////////////////////////////////////////////////////////////
6779
  ////                                                            ////
6780 243 tadejm
  ////  Test transmit packets (no pads) from 0 to (MINFL - 1)     ////
6781 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
6782
  ////                                                            ////
6783
  ////////////////////////////////////////////////////////////////////
6784
  if (test_num == 8) // 
6785
  begin
6786 243 tadejm
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6787
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6788
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6789 209 tadejm
 
6790
    // reset MAC registers
6791
    hard_reset;
6792
    // reset MAC and MII LOGIC with soft reset
6793
    reset_mac;
6794
    reset_mii;
6795
    // set wb slave response
6796
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6797
 
6798
    max_tmp = 0;
6799
    min_tmp = 0;
6800
    // set 8 TX buffer descriptors - must be set before TX enable
6801
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6802
    // enable TX, set full-duplex mode, padding and CRC appending
6803 243 tadejm
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6804
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
6805 209 tadejm
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6806
    // prepare two packets of MAXFL length
6807
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6808
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6809
    min_tmp = tmp[31:16];
6810
    st_data = 8'h12;
6811
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6812
    st_data = 8'h34;
6813
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6814
    // check WB INT signal
6815
    if (wb_int !== 1'b0)
6816
    begin
6817
      test_fail("WB INT signal should not be set");
6818
      fail = fail + 1;
6819
    end
6820
 
6821
    // write to phy's control register for 10Mbps
6822
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6823
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6824
    speed = 10;
6825
 
6826
    frame_started = 0;
6827
    num_of_frames = 0;
6828
    num_of_bd = 0;
6829
    i_length = 0; // 0;
6830
    while (i_length < 70) // (min_tmp - 4))
6831
    begin
6832
      #1;
6833
      // choose generating carrier sense and collision
6834
      case (i_length[1:0])
6835
      2'h0: // Interrupt is generated
6836
      begin
6837
        // Reset_tx_bd nable interrupt generation
6838
        // unmask interrupts
6839
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6840
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6841
        // not detect carrier sense in FD and no collision
6842
        eth_phy.carrier_sense_tx_fd_detect(0);
6843
        eth_phy.collision(0);
6844
      end
6845
      2'h1: // Interrupt is not generated
6846
      begin
6847
        // set_tx_bd enable interrupt generation
6848
        // mask interrupts
6849
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6850
        // detect carrier sense in FD and no collision
6851
        eth_phy.carrier_sense_tx_fd_detect(1);
6852
        eth_phy.collision(0);
6853
      end
6854
      2'h2: // Interrupt is not generated
6855
      begin
6856
        // set_tx_bd disable the interrupt generation
6857
        // unmask interrupts
6858
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6859
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6860
        // not detect carrier sense in FD and set collision
6861
        eth_phy.carrier_sense_tx_fd_detect(0);
6862
        eth_phy.collision(1);
6863
      end
6864
      default: // 2'h3: // Interrupt is not generated
6865
      begin
6866
        // set_tx_bd disable the interrupt generation
6867
        // mask interrupts
6868
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6869
        // detect carrier sense in FD and set collision
6870
        eth_phy.carrier_sense_tx_fd_detect(1);
6871
        eth_phy.collision(1);
6872
      end
6873
      endcase
6874 243 tadejm
//      // append CRC
6875
//      if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
6876
//      begin
6877
//        append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
6878
//      end
6879 209 tadejm
      #1;
6880
      // first destination address on ethernet PHY
6881
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6882
      // SET packets and wrap bit
6883
      // num_of_frames <= 9 => wrap set to TX BD 0
6884 243 tadejm
      if (num_of_frames <= 5)
6885
        begin
6886
          tmp_len = i_length; // length of frame
6887
          tmp_bd_num = 0; // TX BD number
6888
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6889
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6890
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
6891
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
6892
          else
6893
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6894
          // set wrap bit
6895
          set_tx_bd_wrap(0);
6896
        end
6897
        else if (num_of_frames <= 9)
6898
        begin
6899
          tmp_len = i_length; // length of frame
6900
          tmp_bd_num = 0; // TX BD number
6901
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6902
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6903
          if (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
6904
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6905
          else
6906
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6907
          // set wrap bit
6908
          set_tx_bd_wrap(0);
6909 209 tadejm
      end
6910
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6911
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6912
      begin
6913
        tmp_len = i_length; // length of frame
6914
        tmp_bd_num = 0; // TX BD number
6915
        while (tmp_bd_num < 4) //
6916
        begin
6917
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6918
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6919
          if (tmp_len[0] == 0)
6920 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6921 209 tadejm
          else
6922 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6923 209 tadejm
          tmp_len = tmp_len + 1;
6924
          // set TX BD number
6925
          tmp_bd_num = tmp_bd_num + 1;
6926
        end
6927
        // set wrap bit
6928
        set_tx_bd_wrap(3);
6929
      end
6930
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6931
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6932
      begin
6933
        tmp_len = i_length; // length of frame
6934
        tmp_bd_num = 0; // TX BD number
6935
        while (tmp_bd_num < 5) //
6936
        begin
6937
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6938
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6939
          if (tmp_len[0] == 0)
6940 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6941
          else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
6942
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
6943
                      ((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
6944 209 tadejm
          tmp_len = tmp_len + 1;
6945
          // set TX BD number
6946
          tmp_bd_num = tmp_bd_num + 1;
6947
        end
6948
        // set wrap bit
6949
        set_tx_bd_wrap(4);
6950
      end
6951
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6952
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6953
      begin
6954
        tmp_len = i_length; // length of frame
6955
        tmp_bd_num = 0; // TX BD number
6956
        while (tmp_bd_num < 6) //
6957
        begin
6958
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6959
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6960
          if (tmp_len[0] == 0)
6961 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6962 209 tadejm
          else
6963 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6964 209 tadejm
          tmp_len = tmp_len + 1;
6965
          // set TX BD number
6966
          tmp_bd_num = tmp_bd_num + 1;
6967
        end
6968
        // set wrap bit
6969
        set_tx_bd_wrap(5);
6970
      end
6971
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6972
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6973
      begin
6974
        tmp_len = i_length; // length of frame
6975
        tmp_bd_num = 0; // TX BD number
6976
        while (tmp_bd_num < 7) //
6977
        begin
6978
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6979
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6980
          if (tmp_len[0] == 0)
6981 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6982 209 tadejm
          else
6983 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6984 209 tadejm
          tmp_len = tmp_len + 1;
6985
          // set TX BD number
6986
          tmp_bd_num = tmp_bd_num + 1;
6987
        end
6988
        // set wrap bit
6989
        set_tx_bd_wrap(6);
6990
      end
6991
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6992
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6993
      begin
6994
        tmp_len = i_length; // length of frame
6995
        tmp_bd_num = 0; // TX BD number
6996
        while (tmp_bd_num < 8) //
6997
        begin
6998
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6999
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7000
          if (tmp_len[0] == 0)
7001 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7002 209 tadejm
          else
7003 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7004 209 tadejm
          tmp_len = tmp_len + 1;
7005
          // set TX BD number
7006
          tmp_bd_num = tmp_bd_num + 1;
7007
        end
7008
        // set wrap bit
7009
        set_tx_bd_wrap(7);
7010
      end
7011
      #1;
7012
      // SET ready bit
7013
      if (num_of_frames < 10)
7014
        set_tx_bd_ready(0, 0);
7015
      else if (num_of_frames < 14)
7016
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7017
      else if (num_of_frames < 18)
7018
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7019
      else if (num_of_frames < 23)
7020
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7021
      else if (num_of_frames < 28)
7022
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7023
      else if (num_of_frames < 34)
7024
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7025
      else if (num_of_frames < 40)
7026
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7027
      else if (num_of_frames < 47)
7028
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7029
      else if (num_of_frames < 54)
7030
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7031
      else if (num_of_frames < 62)
7032
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7033
      else if (num_of_frames < 70)
7034
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7035
      // CHECK END OF TRANSMITION
7036
      frame_started = 0;
7037
      if (num_of_frames >= 5)
7038
        #1 check_tx_bd(num_of_bd, data);
7039
      fork
7040
      begin: fr_st2
7041
        wait (MTxEn === 1'b1); // start transmit
7042
        frame_started = 1;
7043
      end
7044
      begin
7045
        repeat (30) @(posedge mtx_clk);
7046
        if (num_of_frames < 5)
7047
        begin
7048
          if (frame_started == 1)
7049
          begin
7050
            `TIME; $display("*E Frame should NOT start!");
7051
          end
7052
          disable fr_st2;
7053
        end
7054
        else
7055
        begin
7056
          if (frame_started == 0)
7057
          begin
7058
            `TIME; $display("*W Frame should start!");
7059
            disable fr_st2;
7060
          end
7061
        end
7062
      end
7063
      join
7064
      // check packets larger than 4 bytes
7065
      if (num_of_frames >= 5)
7066
      begin
7067
        wait (MTxEn === 1'b0); // end transmit
7068
        while (data[15] === 1)
7069
        begin
7070
          #1 check_tx_bd(num_of_bd, data);
7071
          @(posedge wb_clk);
7072
        end
7073
        repeat (1) @(posedge wb_clk);
7074 243 tadejm
        // check length of a PACKET 
7075
        if ((eth_phy.tx_len != i_length) && (i_length[0] == 1'b0) && (num_of_frames >= 6))
7076 209 tadejm
        begin
7077
          `TIME; $display("*E Wrong length of the packet out from MAC");
7078
          test_fail("Wrong length of the packet out from MAC");
7079
          fail = fail + 1;
7080
        end
7081 243 tadejm
        else if ((eth_phy.tx_len != (i_length + 4)) && (num_of_frames != 23))
7082
        begin
7083
          `TIME; $display("*E Wrong length of the packet out from MAC");
7084
          test_fail("Wrong length of the packet out from MAC");
7085
          fail = fail + 1;
7086
        end
7087
        else if ((eth_phy.tx_len != (min_tmp)) && (num_of_frames == 23))
7088
        begin
7089
          `TIME; $display("*E Wrong length of the packet out from MAC");
7090
          test_fail("Wrong length of the packet out from MAC");
7091
          fail = fail + 1;
7092
        end
7093 209 tadejm
        // check transmitted TX packet data
7094
        if (i_length[0] == 0)
7095
        begin
7096
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7097
        end
7098 243 tadejm
        else if (num_of_frames == 23) // i_length[0] == 1 here
7099
        begin
7100
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), (min_tmp - 4), tmp);
7101
        end
7102 209 tadejm
        else
7103
        begin
7104
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7105
        end
7106
        if (tmp > 0)
7107
        begin
7108
          test_fail("Wrong data of the transmitted packet");
7109
          fail = fail + 1;
7110
        end
7111
        // check transmited TX packet CRC
7112 243 tadejm
        #1;
7113
        if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7114
        begin
7115
        end
7116
        else
7117
          check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7118 209 tadejm
        if (tmp > 0)
7119
        begin
7120
          test_fail("Wrong CRC of the transmitted packet");
7121
          fail = fail + 1;
7122
        end
7123
      end
7124
      // check WB INT signal
7125
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7126
      begin
7127
        if (wb_int !== 1'b1)
7128
        begin
7129
          `TIME; $display("*E WB INT signal should be set");
7130
          test_fail("WB INT signal should be set");
7131
          fail = fail + 1;
7132
        end
7133
      end
7134
      else
7135
      begin
7136
        if (wb_int !== 1'b0)
7137
        begin
7138
          `TIME; $display("*E WB INT signal should not be set");
7139
          test_fail("WB INT signal should not be set");
7140
          fail = fail + 1;
7141
        end
7142
      end
7143
      // check TX buffer descriptor of a packet
7144
      check_tx_bd(num_of_bd, data);
7145
      if (num_of_frames >= 5)
7146
      begin
7147 243 tadejm
        if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
7148 209 tadejm
        begin
7149 243 tadejm
          if ( (data[15:0] !== 16'h6000) &&  // wrap bit
7150
               (data[15:0] !== 16'h4000) )  // without wrap bit
7151 209 tadejm
          begin
7152
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7153
            test_fail("TX buffer descriptor status is not correct");
7154
            fail = fail + 1;
7155
          end
7156
        end
7157 243 tadejm
        else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
7158 209 tadejm
        begin
7159 243 tadejm
          if ( (data[15:0] !== 16'h2000) && // wrap bit
7160
               (data[15:0] !== 16'h0000) ) // without wrap bit
7161
          begin
7162
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7163
            test_fail("TX buffer descriptor status is not correct");
7164
            fail = fail + 1;
7165
          end
7166
        end
7167
        else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
7168
        begin
7169
          if ( (data[15:0] !== 16'h6800) && // wrap bit
7170
               (data[15:0] !== 16'h4800) ) // without wrap bit
7171
          begin
7172
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7173
            test_fail("TX buffer descriptor status is not correct");
7174
            fail = fail + 1;
7175
          end
7176
        end
7177
        else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7178
        begin
7179
          if ( (data[15:0] !== 16'h2800) && // wrap bit
7180
               (data[15:0] !== 16'h0800) ) // without wrap bit
7181
          begin
7182
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7183
            test_fail("TX buffer descriptor status is not correct");
7184
            fail = fail + 1;
7185
          end
7186
        end
7187
        else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7188
        begin
7189 209 tadejm
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7190
               (data[15:0] !== 16'h1800) ) // without wrap bit
7191
          begin
7192
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7193
            test_fail("TX buffer descriptor status is not correct");
7194
            fail = fail + 1;
7195
          end
7196
        end
7197
      end
7198
      else
7199
      begin
7200
        if (data[15] !== 1'b1)
7201
        begin
7202
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7203
          test_fail("TX buffer descriptor status is not correct");
7204
          fail = fail + 1;
7205
        end
7206
      end
7207
      // clear TX BD with wrap bit
7208
      if (num_of_frames == 63)
7209
        clear_tx_bd(16, 16);
7210
      // check interrupts
7211
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7212
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7213
      begin
7214
        if ((data & `ETH_INT_TXB) !== 1'b1)
7215
        begin
7216
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7217
          test_fail("Interrupt Transmit Buffer was not set");
7218
          fail = fail + 1;
7219
        end
7220
        if ((data & (~`ETH_INT_TXB)) !== 0)
7221
        begin
7222
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7223
          test_fail("Other interrupts (except Transmit Buffer) were set");
7224
          fail = fail + 1;
7225
        end
7226
      end
7227
      else
7228
      begin
7229
        if (data !== 0)
7230
        begin
7231
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7232
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7233
          fail = fail + 1;
7234
        end
7235
      end
7236
      // clear interrupts
7237
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7238
      // check WB INT signal
7239
      if (wb_int !== 1'b0)
7240
      begin
7241
        test_fail("WB INT signal should not be set");
7242
        fail = fail + 1;
7243
      end
7244
      // INTERMEDIATE DISPLAYS
7245
      if (i_length == 3)
7246
      begin
7247
        $display("    pads appending to packets is selected");
7248
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7249
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7250
                 0, 3);
7251
      end
7252
      else if (i_length == 9)
7253
      begin
7254
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7255
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7256
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7257
                 5, 9);
7258
      end
7259
      else if (i_length == 17)
7260
      begin
7261
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7262
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7263
                 10, 17);
7264
      end
7265
      else if (i_length == 27)
7266
      begin
7267
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7268
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7269
                 18, 27);
7270
      end
7271
      else if (i_length == 40)
7272
      begin
7273
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7274
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7275
                 28, 40);
7276
      end
7277
      else if (i_length == 54)
7278
      begin
7279
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7280
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7281
                 41, 54);
7282
      end
7283
      else if (i_length == 69)
7284
      begin
7285
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7286
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7287
                 55, 69);
7288
      end
7289
      // set length (loop variable)
7290
      i_length = i_length + 1;
7291
      // the number of frame transmitted
7292
      num_of_frames = num_of_frames + 1;
7293
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7294
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7295
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7296
          (num_of_frames == 54) || (num_of_frames == 62))
7297
        num_of_bd = 0;
7298
      else
7299
        num_of_bd = num_of_bd + 1;
7300
    end
7301
    // disable TX
7302
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7303
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7304
    @(posedge wb_clk);
7305
    if(fail == 0)
7306
      test_ok;
7307
    else
7308
      fail = 0;
7309
  end
7310
 
7311
 
7312
  ////////////////////////////////////////////////////////////////////
7313
  ////                                                            ////
7314 243 tadejm
  ////  Test transmit packets (no pads) form 0 to (MINFL - 1)     ////
7315 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7316
  ////                                                            ////
7317
  ////////////////////////////////////////////////////////////////////
7318
  if (test_num == 9) // 
7319
  begin
7320 243 tadejm
    // TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7321
    test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7322
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7323 209 tadejm
 
7324
    // reset MAC registers
7325
    hard_reset;
7326
    // reset MAC and MII LOGIC with soft reset
7327
    reset_mac;
7328
    reset_mii;
7329
    // set wb slave response
7330
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7331
 
7332
    max_tmp = 0;
7333
    min_tmp = 0;
7334
    // set 8 TX buffer descriptors - must be set before TX enable
7335
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7336
    // enable TX, set full-duplex mode, padding and CRC appending
7337
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7338
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7339
    // prepare two packets of MAXFL length
7340
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7341
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7342
    min_tmp = tmp[31:16];
7343
    st_data = 8'h12;
7344
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7345
    st_data = 8'h34;
7346
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7347
    // check WB INT signal
7348
    if (wb_int !== 1'b0)
7349
    begin
7350
      test_fail("WB INT signal should not be set");
7351
      fail = fail + 1;
7352
    end
7353
 
7354
    // write to phy's control register for 100Mbps
7355
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7356
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7357
    speed = 100;
7358
 
7359
    frame_started = 0;
7360
    num_of_frames = 0;
7361
    num_of_bd = 0;
7362
    i_length = 0; // 0;
7363
    while (i_length < 70) // (min_tmp - 4))
7364
    begin
7365
      #1;
7366
      // choose generating carrier sense and collision
7367
      case (i_length[1:0])
7368
      2'h0: // Interrupt is generated
7369
      begin
7370
        // Reset_tx_bd nable interrupt generation
7371
        // unmask interrupts
7372
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7373
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7374
        // not detect carrier sense in FD and no collision
7375
        eth_phy.carrier_sense_tx_fd_detect(0);
7376
        eth_phy.collision(0);
7377
      end
7378
      2'h1: // Interrupt is not generated
7379
      begin
7380
        // set_tx_bd enable interrupt generation
7381
        // mask interrupts
7382
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7383
        // detect carrier sense in FD and no collision
7384
        eth_phy.carrier_sense_tx_fd_detect(1);
7385
        eth_phy.collision(0);
7386
      end
7387
      2'h2: // Interrupt is not generated
7388
      begin
7389
        // set_tx_bd disable the interrupt generation
7390
        // unmask interrupts
7391
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7392
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7393
        // not detect carrier sense in FD and set collision
7394
        eth_phy.carrier_sense_tx_fd_detect(0);
7395
        eth_phy.collision(1);
7396
      end
7397
      default: // 2'h3: // Interrupt is not generated
7398
      begin
7399
        // set_tx_bd disable the interrupt generation
7400
        // mask interrupts
7401
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7402
        // detect carrier sense in FD and set collision
7403
        eth_phy.carrier_sense_tx_fd_detect(1);
7404
        eth_phy.collision(1);
7405
      end
7406
      endcase
7407
      #1;
7408
      // first destination address on ethernet PHY
7409
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7410
      // SET packets and wrap bit
7411
      // num_of_frames <= 9 => wrap set to TX BD 0
7412
      if (num_of_frames <= 9)
7413
      begin
7414
        tmp_len = i_length; // length of frame
7415
        tmp_bd_num = 0; // TX BD number
7416
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7417
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7418
        if (tmp_len[0] == 0)
7419
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7420
        else
7421
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7422
        // set wrap bit
7423
        set_tx_bd_wrap(0);
7424
      end
7425
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7426
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7427
      begin
7428
        tmp_len = i_length; // length of frame
7429
        tmp_bd_num = 0; // TX BD number
7430
        while (tmp_bd_num < 4) //
7431
        begin
7432
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7433
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7434
          if (tmp_len[0] == 0)
7435
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7436
          else
7437
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7438
          tmp_len = tmp_len + 1;
7439
          // set TX BD number
7440
          tmp_bd_num = tmp_bd_num + 1;
7441
        end
7442
        // set wrap bit
7443
        set_tx_bd_wrap(3);
7444
      end
7445
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7446
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7447
      begin
7448
        tmp_len = i_length; // length of frame
7449
        tmp_bd_num = 0; // TX BD number
7450
        while (tmp_bd_num < 5) //
7451
        begin
7452
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7453
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7454
          if (tmp_len[0] == 0)
7455
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7456
          else
7457
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7458
          tmp_len = tmp_len + 1;
7459
          // set TX BD number
7460
          tmp_bd_num = tmp_bd_num + 1;
7461
        end
7462
        // set wrap bit
7463
        set_tx_bd_wrap(4);
7464
      end
7465
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7466
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7467
      begin
7468
        tmp_len = i_length; // length of frame
7469
        tmp_bd_num = 0; // TX BD number
7470
        while (tmp_bd_num < 6) //
7471
        begin
7472
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7473
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7474
          if (tmp_len[0] == 0)
7475
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7476
          else
7477
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7478
          tmp_len = tmp_len + 1;
7479
          // set TX BD number
7480
          tmp_bd_num = tmp_bd_num + 1;
7481
        end
7482
        // set wrap bit
7483
        set_tx_bd_wrap(5);
7484
      end
7485
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7486
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7487
      begin
7488
        tmp_len = i_length; // length of frame
7489
        tmp_bd_num = 0; // TX BD number
7490
        while (tmp_bd_num < 7) //
7491
        begin
7492
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7493
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7494
          if (tmp_len[0] == 0)
7495
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7496
          else
7497
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7498
          tmp_len = tmp_len + 1;
7499
          // set TX BD number
7500
          tmp_bd_num = tmp_bd_num + 1;
7501
        end
7502
        // set wrap bit
7503
        set_tx_bd_wrap(6);
7504
      end
7505
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7506
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7507
      begin
7508
        tmp_len = i_length; // length of frame
7509
        tmp_bd_num = 0; // TX BD number
7510
        while (tmp_bd_num < 8) //
7511
        begin
7512
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7513
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7514
          if (tmp_len[0] == 0)
7515
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7516
          else
7517
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7518
          tmp_len = tmp_len + 1;
7519
          // set TX BD number
7520
          tmp_bd_num = tmp_bd_num + 1;
7521
        end
7522
        // set wrap bit
7523
        set_tx_bd_wrap(7);
7524
      end
7525
      #1;
7526
      // SET ready bit
7527
      if (num_of_frames < 10)
7528
        set_tx_bd_ready(0, 0);
7529
      else if (num_of_frames < 14)
7530
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7531
      else if (num_of_frames < 18)
7532
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7533
      else if (num_of_frames < 23)
7534
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7535
      else if (num_of_frames < 28)
7536
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7537
      else if (num_of_frames < 34)
7538
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7539
      else if (num_of_frames < 40)
7540
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7541
      else if (num_of_frames < 47)
7542
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7543
      else if (num_of_frames < 54)
7544
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7545
      else if (num_of_frames < 62)
7546
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7547
      else if (num_of_frames < 70)
7548
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7549
      // CHECK END OF TRANSMITION
7550
      frame_started = 0;
7551
      if (num_of_frames >= 5)
7552
        #1 check_tx_bd(num_of_bd, data);
7553
      fork
7554
      begin: fr_st3
7555
        wait (MTxEn === 1'b1); // start transmit
7556
        frame_started = 1;
7557
      end
7558
      begin
7559
        repeat (30) @(posedge mtx_clk);
7560
        if (num_of_frames < 5)
7561
        begin
7562
          if (frame_started == 1)
7563
          begin
7564
            `TIME; $display("*E Frame should NOT start!");
7565
          end
7566
          disable fr_st3;
7567
        end
7568
        else
7569
        begin
7570
          if (frame_started == 0)
7571
          begin
7572
            `TIME; $display("*W Frame should start!");
7573
            disable fr_st3;
7574
          end
7575
        end
7576
      end
7577
      join
7578
      // check packets larger than 4 bytes
7579
      if (num_of_frames >= 5)
7580
      begin
7581
        wait (MTxEn === 1'b0); // end transmit
7582
        while (data[15] === 1)
7583
        begin
7584
          #1 check_tx_bd(num_of_bd, data);
7585
          @(posedge wb_clk);
7586
        end
7587
        repeat (1) @(posedge wb_clk);
7588
        // check length of a PACKET
7589
        if (eth_phy.tx_len != (i_length + 4))
7590
        begin
7591
          `TIME; $display("*E Wrong length of the packet out from MAC");
7592
          test_fail("Wrong length of the packet out from MAC");
7593
          fail = fail + 1;
7594
        end
7595
        // check transmitted TX packet data
7596
        if (i_length[0] == 0)
7597
        begin
7598
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7599
        end
7600
        else
7601
        begin
7602
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7603
        end
7604
        if (tmp > 0)
7605
        begin
7606
          test_fail("Wrong data of the transmitted packet");
7607
          fail = fail + 1;
7608
        end
7609
        // check transmited TX packet CRC
7610
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7611
        if (tmp > 0)
7612
        begin
7613
          test_fail("Wrong CRC of the transmitted packet");
7614
          fail = fail + 1;
7615
        end
7616
      end
7617
      // check WB INT signal
7618
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7619
      begin
7620
        if (wb_int !== 1'b1)
7621
        begin
7622
          `TIME; $display("*E WB INT signal should be set");
7623
          test_fail("WB INT signal should be set");
7624
          fail = fail + 1;
7625
        end
7626
      end
7627
      else
7628
      begin
7629
        if (wb_int !== 1'b0)
7630
        begin
7631
          `TIME; $display("*E WB INT signal should not be set");
7632
          test_fail("WB INT signal should not be set");
7633
          fail = fail + 1;
7634
        end
7635
      end
7636
      // check TX buffer descriptor of a packet
7637
      check_tx_bd(num_of_bd, data);
7638
      if (num_of_frames >= 5)
7639
      begin
7640
        if (i_length[1] == 1'b0) // interrupt enabled
7641
        begin
7642
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7643
               (data[15:0] !== 16'h5800) ) // without wrap bit
7644
          begin
7645
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7646
            test_fail("TX buffer descriptor status is not correct");
7647
            fail = fail + 1;
7648
          end
7649
        end
7650
        else // interrupt not enabled
7651
        begin
7652
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7653
               (data[15:0] !== 16'h1800) ) // without wrap bit
7654
          begin
7655
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7656
            test_fail("TX buffer descriptor status is not correct");
7657
            fail = fail + 1;
7658
          end
7659
        end
7660
      end
7661
      else
7662
      begin
7663
        if (data[15] !== 1'b1)
7664
        begin
7665
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7666
          test_fail("TX buffer descriptor status is not correct");
7667
          fail = fail + 1;
7668
        end
7669
      end
7670
      // clear TX BD with wrap bit
7671
      if (num_of_frames == 63)
7672
        clear_tx_bd(16, 16);
7673
      // check interrupts
7674
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7675
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7676
      begin
7677
        if ((data & `ETH_INT_TXB) !== 1'b1)
7678
        begin
7679
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7680
          test_fail("Interrupt Transmit Buffer was not set");
7681
          fail = fail + 1;
7682
        end
7683
        if ((data & (~`ETH_INT_TXB)) !== 0)
7684
        begin
7685
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7686
          test_fail("Other interrupts (except Transmit Buffer) were set");
7687
          fail = fail + 1;
7688
        end
7689
      end
7690
      else
7691
      begin
7692
        if (data !== 0)
7693
        begin
7694
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7695
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7696
          fail = fail + 1;
7697
        end
7698
      end
7699
      // clear interrupts
7700
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7701
      // check WB INT signal
7702
      if (wb_int !== 1'b0)
7703
      begin
7704
        test_fail("WB INT signal should not be set");
7705
        fail = fail + 1;
7706
      end
7707
      // INTERMEDIATE DISPLAYS
7708
      if (i_length == 3)
7709
      begin
7710
        $display("    pads appending to packets is selected");
7711
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7712
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7713
                 0, 3);
7714
      end
7715
      else if (i_length == 9)
7716
      begin
7717
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7718
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7719
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7720
                 5, 9);
7721
      end
7722
      else if (i_length == 17)
7723
      begin
7724
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7725
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7726
                 10, 17);
7727
      end
7728
      else if (i_length == 27)
7729
      begin
7730
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7731
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7732
                 18, 27);
7733
      end
7734
      else if (i_length == 40)
7735
      begin
7736
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7737
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7738
                 28, 40);
7739
      end
7740
      else if (i_length == 54)
7741
      begin
7742
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7743
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7744
                 41, 54);
7745
      end
7746
      else if (i_length == 69)
7747
      begin
7748
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7749
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7750
                 55, 69);
7751
      end
7752
      // set length (loop variable)
7753
      i_length = i_length + 1;
7754
      // the number of frame transmitted
7755
      num_of_frames = num_of_frames + 1;
7756
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7757
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7758
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7759
          (num_of_frames == 54) || (num_of_frames == 62))
7760
        num_of_bd = 0;
7761
      else
7762
        num_of_bd = num_of_bd + 1;
7763
    end
7764
    // disable TX
7765
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7766
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7767
    @(posedge wb_clk);
7768
    if(fail == 0)
7769
      test_ok;
7770
    else
7771
      fail = 0;
7772
  end
7773
 
7774
 
7775
  ////////////////////////////////////////////////////////////////////
7776
  ////                                                            ////
7777
  ////  Test transmit packets across MAXFL value at               ////
7778
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
7779
  ////                                                            ////
7780
  ////////////////////////////////////////////////////////////////////
7781
  if (test_num == 10) // without and with padding
7782
  begin
7783
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
7784
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
7785
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
7786
 
7787
    // reset MAC registers
7788
    hard_reset;
7789
    // reset MAC and MII LOGIC with soft reset
7790
    reset_mac;
7791
    reset_mii;
7792
    // set wb slave response
7793
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7794
 
7795
    max_tmp = 0;
7796
    min_tmp = 0;
7797
    num_of_frames = 0;
7798
    num_of_bd = 0;
7799
    // set 13 TX buffer descriptors - must be set before TX enable
7800
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7801
    // enable TX, set full-duplex mode, NO padding and CRC appending
7802
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7803
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7804
    // prepare a packet of MAXFL + 10 length
7805
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7806
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7807
    min_tmp = tmp[31:16];
7808
    st_data = 8'hA3;
7809
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
7810
    // check WB INT signal
7811
    if (wb_int !== 1'b0)
7812
    begin
7813
      test_fail("WB INT signal should not be set");
7814
      fail = fail + 1;
7815
    end
7816
 
7817
    // write to phy's control register for 10Mbps
7818
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
7819
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
7820
    speed = 10;
7821
 
7822
    i_length = (max_tmp - 5);
7823
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
7824
    begin
7825
$display("   i_length = %0d", i_length);
7826
      // choose generating carrier sense and collision
7827
//      case (i_length[1:0])
7828
//      2'h0: // Interrupt is generated
7829
//      begin
7830
        // Reset_tx_bd nable interrupt generation
7831
        // unmask interrupts
7832
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7833
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7834
        // not detect carrier sense in FD and no collision
7835
        eth_phy.carrier_sense_tx_fd_detect(0);
7836
        eth_phy.collision(0);
7837
//      end
7838
//      2'h1: // Interrupt is not generated
7839
//      begin
7840
        // set_tx_bd enable interrupt generation
7841
        // mask interrupts
7842
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7843
        // detect carrier sense in FD and no collision
7844
//        eth_phy.carrier_sense_tx_fd_detect(1);
7845
//        eth_phy.collision(0);
7846
//      end
7847
//      2'h2: // Interrupt is not generated
7848
//      begin
7849
        // set_tx_bd disable the interrupt generation
7850
        // unmask interrupts
7851
//        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7852
//                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7853
        // not detect carrier sense in FD and set collision
7854
//        eth_phy.carrier_sense_tx_fd_detect(0);
7855
//        eth_phy.collision(1);
7856
//      end
7857
//      default: // 2'h3: // Interrupt is not generated
7858
//      begin
7859
        // set_tx_bd disable the interrupt generation
7860
        // mask interrupts
7861
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7862
        // detect carrier sense in FD and set collision
7863
//        eth_phy.carrier_sense_tx_fd_detect(1);
7864
//        eth_phy.collision(1);
7865
//      end
7866
//      endcase
7867
      // first destination address on ethernet PHY
7868
      eth_phy.set_tx_mem_addr(0);
7869
      // 
7870
if (num_of_bd == 0)
7871
begin
7872
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7873
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7874
set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7875
set_tx_bd_wrap(2);
7876
set_tx_bd_ready(0, 0);
7877
end
7878
else if (num_of_bd == 1)
7879
set_tx_bd_ready(1, 1);
7880
else if (num_of_bd == 2)
7881
set_tx_bd_ready(2, 2);
7882
 
7883
 
7884
//        tmp_len = i_length; // length of frame
7885
//        tmp_bd_num = 0; // TX BD number
7886
//        while (tmp_bd_num < 8) // 
7887
//        begin
7888
//          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7889
//          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7890
//          if (tmp_len[0] == 0)
7891
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7892
//          else
7893
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + 2*max_tmp));
7894
//          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
7895
//          tmp_len = tmp_len + 1;
7896
//          // set TX BD number
7897
//          tmp_bd_num = tmp_bd_num + 1;
7898
//        end
7899
//        // set wrap bit
7900
//        set_tx_bd_wrap(7);
7901
//      // set ready bit
7902
//      set_tx_bd_ready((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
7903
      // CHECK END OF TRANSMITION
7904
check_tx_bd(num_of_bd, data);
7905
//      #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7906
        wait (MTxEn === 1'b1); // start transmit
7907
check_tx_bd(num_of_bd, data);
7908
//        #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7909
        if (data[15] !== 1)
7910
        begin
7911
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
7912
          fail = fail + 1;
7913
        end
7914
        wait (MTxEn === 1'b0); // end transmit
7915
        while (data[15] === 1)
7916
        begin
7917
check_tx_bd(num_of_bd, data);
7918
//          #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7919
          @(posedge wb_clk);
7920
        end
7921
        repeat (1) @(posedge wb_clk);
7922
      // check length of a PACKET
7923
$display("   eth_phy length = %0d", eth_phy.tx_len);
7924
tmp_len = eth_phy.tx_len;
7925
#1;
7926
if (tmp_len != (i_length + 4))
7927
//      if (eth_phy.tx_len != (i_length + 4))
7928
      begin
7929
        test_fail("Wrong length of the packet out from MAC");
7930
        fail = fail + 1;
7931
      end
7932
      // checking in the following if statement is performed only for first and last 64 lengths
7933
//      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
7934
//      begin
7935
        // check transmitted TX packet data
7936
//        if (i_length[0] == 0)
7937
//        begin
7938
          check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
7939
//        end
7940
//        else
7941
//        begin
7942
//          check_tx_packet((`MEMORY_BASE + 2*max_tmp), 0, i_length, tmp);
7943
//        end
7944
        if (tmp > 0)
7945
        begin
7946
          test_fail("Wrong data of the transmitted packet");
7947
          fail = fail + 1;
7948
        end
7949
        // check transmited TX packet CRC
7950
//        if (i_length[0] == 0)
7951
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7952
//        else
7953
//          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7954
        if (tmp > 0)
7955
        begin
7956
          test_fail("Wrong CRC of the transmitted packet");
7957
          fail = fail + 1;
7958
        end
7959
//      end
7960
      // check WB INT signal
7961
//      if (i_length[1:0] == 2'h0)
7962
//      begin
7963
        if (wb_int !== 1'b1)
7964
        begin
7965
          `TIME; $display("*E WB INT signal should be set");
7966
          test_fail("WB INT signal should be set");
7967
          fail = fail + 1;
7968
        end
7969
//      end
7970
//      else
7971
//      begin
7972
//        if (wb_int !== 1'b0)
7973
//        begin
7974
//          `TIME; $display("*E WB INT signal should not be set");
7975
//          test_fail("WB INT signal should not be set");
7976
//          fail = fail + 1;
7977
//        end
7978
//      end
7979
//      // check TX buffer descriptor of a packet
7980
//      check_tx_bd((i_length - (max_tmp - 8)), data);
7981
check_tx_bd(num_of_bd, data);
7982
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
7983
     ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
7984
//      if (i_length[1] == 1'b0) // interrupt enabled
7985
//      begin
7986
//        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
7987
//             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
7988
        begin
7989
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7990
          test_fail("TX buffer descriptor status is not correct");
7991
          fail = fail + 1;
7992
        end
7993
//      end
7994
//      else // interrupt not enabled
7995
//      begin
7996
//        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
7997
//             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
7998
//        begin
7999
//          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8000
//          test_fail("TX buffer descriptor status is not correct");
8001
//          fail = fail + 1;
8002
//        end
8003
//      end
8004
//      // clear first half of 8 frames from TX buffer descriptor 0
8005
//      if (num_of_frames < 4)
8006
//        clear_tx_bd((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
8007
      // check interrupts
8008
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8009
//      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
8010
//      begin
8011
        if ((data & `ETH_INT_TXB) !== 1'b1)
8012
        begin
8013
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8014
          test_fail("Interrupt Transmit Buffer was not set");
8015
          fail = fail + 1;
8016
        end
8017
        if ((data & (~`ETH_INT_TXB)) !== 0)
8018
        begin
8019
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8020
          test_fail("Other interrupts (except Transmit Buffer) were set");
8021
          fail = fail + 1;
8022
        end
8023
//      end
8024
//      else
8025
//      begin
8026
//        if (data !== 0)
8027
//        begin
8028
//          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
8029
//          test_fail("Any of interrupts (except Transmit Buffer) was set");
8030
//          fail = fail + 1;
8031
//        end
8032
//      end
8033
      // clear interrupts
8034
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8035
      // check WB INT signal
8036
      if (wb_int !== 1'b0)
8037
      begin
8038
        test_fail("WB INT signal should not be set");
8039
        fail = fail + 1;
8040
      end
8041
      // INTERMEDIATE DISPLAYS
8042
if (num_of_bd == 0)
8043
  $display("    ->packet with length %0d sent", (i_length + 4));
8044
else if (num_of_bd == 1)
8045
  $display("    ->packet with length %0d sent", (i_length + 4));
8046
else if (num_of_bd == 2)
8047
  $display("    ->packet with length %0d sent", (i_length + 4));
8048
      // set length (loop variable)
8049
      i_length = i_length + 1;
8050
      // the number of frame transmitted
8051
      num_of_frames = num_of_frames + 1;
8052
      num_of_bd = num_of_bd + 1;
8053
      @(posedge wb_clk);
8054
    end
8055
    // disable TX
8056
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8057
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8058
    @(posedge wb_clk);
8059
    if(fail == 0)
8060
      test_ok;
8061
    else
8062
      fail = 0;
8063
  end
8064
 
8065
 
8066
  ////////////////////////////////////////////////////////////////////
8067
  ////                                                            ////
8068
  ////  Test transmit packets across MAXFL value at               ////
8069
  ////  13 TX buffer decriptors ( 100Mbps ).                      ////
8070
  ////                                                            ////
8071
  ////////////////////////////////////////////////////////////////////
8072
  if (test_num == 11) // without and with padding
8073
  begin
8074
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8075
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8076
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8077
 
8078
    // reset MAC registers
8079
    hard_reset;
8080
    // reset MAC and MII LOGIC with soft reset
8081
    reset_mac;
8082
    reset_mii;
8083
    // set wb slave response
8084
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8085
 
8086
    max_tmp = 0;
8087
    min_tmp = 0;
8088
    num_of_frames = 0;
8089
    num_of_bd = 0;
8090
    // set 13 TX buffer descriptors - must be set before TX enable
8091
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8092
    // enable TX, set full-duplex mode, NO padding and CRC appending
8093
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8094
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8095
    // prepare a packet of MAXFL + 10 length
8096
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8097
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8098
    min_tmp = tmp[31:16];
8099
    st_data = 8'hA3;
8100
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8101
    // check WB INT signal
8102
    if (wb_int !== 1'b0)
8103
    begin
8104
      test_fail("WB INT signal should not be set");
8105
      fail = fail + 1;
8106
    end
8107
 
8108
    // write to phy's control register for 100Mbps
8109
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8110
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8111
    speed = 100;
8112
 
8113
    i_length = (max_tmp - 5);
8114
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
8115
    begin
8116
      $display("   i_length = %0d", i_length);
8117
      // Reset_tx_bd nable interrupt generation
8118
      // unmask interrupts
8119
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8120
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8121
      // not detect carrier sense in FD and no collision
8122
      eth_phy.carrier_sense_tx_fd_detect(0);
8123
      eth_phy.collision(0);
8124
      // first destination address on ethernet PHY
8125
      eth_phy.set_tx_mem_addr(0);
8126
      // prepare BDs
8127
      if (num_of_bd == 0)
8128
      begin
8129
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8130
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8131
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8132
        set_tx_bd_wrap(2);
8133
        set_tx_bd_ready(0, 0);
8134
      end
8135
      else if (num_of_bd == 1)
8136
        set_tx_bd_ready(1, 1);
8137
      else if (num_of_bd == 2)
8138
        set_tx_bd_ready(2, 2);
8139
      // CHECK END OF TRANSMITION
8140
      check_tx_bd(num_of_bd, data);
8141
        wait (MTxEn === 1'b1); // start transmit
8142
      check_tx_bd(num_of_bd, data);
8143
        if (data[15] !== 1)
8144
        begin
8145
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8146
          fail = fail + 1;
8147
        end
8148
        wait (MTxEn === 1'b0); // end transmit
8149
        while (data[15] === 1)
8150
        begin
8151
      check_tx_bd(num_of_bd, data);
8152
          @(posedge wb_clk);
8153
        end
8154
        repeat (1) @(posedge wb_clk);
8155
      // check length of a PACKET
8156
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8157
      tmp_len = eth_phy.tx_len;
8158
      #1;
8159
      if (tmp_len != (i_length + 4))
8160
      begin
8161
        test_fail("Wrong length of the packet out from MAC");
8162
        fail = fail + 1;
8163
      end
8164
      // checking packet
8165
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8166
      if (tmp > 0)
8167
      begin
8168
        test_fail("Wrong data of the transmitted packet");
8169
        fail = fail + 1;
8170
      end
8171
      // check transmited TX packet CRC
8172
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8173
      if (tmp > 0)
8174
      begin
8175
        test_fail("Wrong CRC of the transmitted packet");
8176
        fail = fail + 1;
8177
      end
8178
      // check WB INT signal
8179
      if (wb_int !== 1'b1)
8180
      begin
8181
        `TIME; $display("*E WB INT signal should be set");
8182
        test_fail("WB INT signal should be set");
8183
        fail = fail + 1;
8184
      end
8185
      // check TX buffer descriptor of a packet
8186
      check_tx_bd(num_of_bd, data);
8187
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8188
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8189
      begin
8190
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8191
        test_fail("TX buffer descriptor status is not correct");
8192
        fail = fail + 1;
8193
      end
8194
      // check interrupts
8195
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8196
      if ((data & `ETH_INT_TXB) !== 1'b1)
8197
      begin
8198
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8199
        test_fail("Interrupt Transmit Buffer was not set");
8200
        fail = fail + 1;
8201
      end
8202
      if ((data & (~`ETH_INT_TXB)) !== 0)
8203
      begin
8204
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8205
        test_fail("Other interrupts (except Transmit Buffer) were set");
8206
        fail = fail + 1;
8207
      end
8208
      // clear interrupts
8209
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8210
      // check WB INT signal
8211
      if (wb_int !== 1'b0)
8212
      begin
8213
        test_fail("WB INT signal should not be set");
8214
        fail = fail + 1;
8215
      end
8216
      // INTERMEDIATE DISPLAYS
8217
      if (num_of_bd == 0)
8218
        $display("    ->packet with length %0d sent", (i_length + 4));
8219
      else if (num_of_bd == 1)
8220
        $display("    ->packet with length %0d sent", (i_length + 4));
8221
      else if (num_of_bd == 2)
8222
        $display("    ->packet with length %0d sent", (i_length + 4));
8223
      // set length (loop variable)
8224
      i_length = i_length + 1;
8225
      // the number of frame transmitted
8226
      num_of_frames = num_of_frames + 1;
8227
      num_of_bd = num_of_bd + 1;
8228
      @(posedge wb_clk);
8229
    end
8230
    // disable TX
8231
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8232
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8233
    @(posedge wb_clk);
8234
    if(fail == 0)
8235
      test_ok;
8236
    else
8237
      fail = 0;
8238
  end
8239
 
8240
 
8241
  ////////////////////////////////////////////////////////////////////
8242
  ////                                                            ////
8243
  ////  Test transmit packets across changed MAXFL value at       ////
8244
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8245
  ////                                                            ////
8246
  ////////////////////////////////////////////////////////////////////
8247
  if (test_num == 12) // without and with padding
8248
  begin
8249
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8250
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8251
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8252
 
8253
    // reset MAC registers
8254
    hard_reset;
8255
    // reset MAC and MII LOGIC with soft reset
8256
    reset_mac;
8257
    reset_mii;
8258
    // set wb slave response
8259
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8260
 
8261
    max_tmp = 0;
8262
    min_tmp = 0;
8263
    num_of_frames = 0;
8264
    num_of_bd = 0;
8265
    // set 47 TX buffer descriptors - must be set before TX enable
8266
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8267
    // prepare a packet of MAXFL + 10 length
8268
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8269
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8270
    min_tmp = tmp[31:16];
8271
    // change MAXFL value
8272
    max_tmp = min_tmp + 53;
8273
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8274
    st_data = 8'h62;
8275
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8276
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8277
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8278
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8279
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8280
    // check WB INT signal
8281
    if (wb_int !== 1'b0)
8282
    begin
8283
      test_fail("WB INT signal should not be set");
8284
      fail = fail + 1;
8285
    end
8286
 
8287
    // write to phy's control register for 10Mbps
8288
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8289
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8290
    speed = 10;
8291
 
8292
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8293
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8294
    begin
8295
      $display("   i_length = %0d", i_length);
8296
      // prepare packet's CRC
8297
      if (num_of_bd == 1)
8298
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8299
      // Reset_tx_bd nable interrupt generation
8300
      // unmask interrupts
8301
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8302
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8303
      // not detect carrier sense in FD and no collision
8304
      eth_phy.carrier_sense_tx_fd_detect(0);
8305
      eth_phy.collision(0);
8306
      // first destination address on ethernet PHY
8307
      eth_phy.set_tx_mem_addr(0);
8308
      // prepare BDs
8309
      if (num_of_bd == 0)
8310
      begin
8311
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8312
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8313
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8314
        set_tx_bd_wrap(2);
8315
        set_tx_bd_ready(0, 0);
8316
      end
8317
      else if (num_of_bd == 1)
8318
        set_tx_bd_ready(1, 1);
8319
      else if (num_of_bd == 2)
8320
        set_tx_bd_ready(2, 2);
8321
      // CHECK END OF TRANSMITION
8322
      check_tx_bd(num_of_bd, data);
8323
        wait (MTxEn === 1'b1); // start transmit
8324
      check_tx_bd(num_of_bd, data);
8325
        if (data[15] !== 1)
8326
        begin
8327
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8328
          fail = fail + 1;
8329
        end
8330
        wait (MTxEn === 1'b0); // end transmit
8331
        while (data[15] === 1)
8332
        begin
8333
      check_tx_bd(num_of_bd, data);
8334
          @(posedge wb_clk);
8335
        end
8336
        repeat (1) @(posedge wb_clk);
8337
      // check length of a PACKET
8338
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8339
      tmp_len = eth_phy.tx_len;
8340
      #1;
8341
      if (tmp_len != (i_length + 4))
8342
      begin
8343
        test_fail("Wrong length of the packet out from MAC");
8344
        fail = fail + 1;
8345
      end
8346
      // checking packet
8347
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8348
      if (tmp > 0)
8349
      begin
8350
        test_fail("Wrong data of the transmitted packet");
8351
        fail = fail + 1;
8352
      end
8353
      // check transmited TX packet CRC
8354
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8355
      if (tmp > 0)
8356
      begin
8357
        test_fail("Wrong CRC of the transmitted packet");
8358
        fail = fail + 1;
8359
      end
8360
      // check WB INT signal
8361
      if (wb_int !== 1'b1)
8362
      begin
8363
        `TIME; $display("*E WB INT signal should be set");
8364
        test_fail("WB INT signal should be set");
8365
        fail = fail + 1;
8366
      end
8367
      // check TX buffer descriptor of a packet
8368
      check_tx_bd(num_of_bd, data);
8369
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8370
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8371
      begin
8372
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8373
        test_fail("TX buffer descriptor status is not correct");
8374
        fail = fail + 1;
8375
      end
8376
      // check interrupts
8377
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8378
      if ((data & `ETH_INT_TXB) !== 1'b1)
8379
      begin
8380
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8381
        test_fail("Interrupt Transmit Buffer was not set");
8382
        fail = fail + 1;
8383
      end
8384
      if ((data & (~`ETH_INT_TXB)) !== 0)
8385
      begin
8386
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8387
        test_fail("Other interrupts (except Transmit Buffer) were set");
8388
        fail = fail + 1;
8389
      end
8390
      // clear interrupts
8391
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8392
      // check WB INT signal
8393
      if (wb_int !== 1'b0)
8394
      begin
8395
        test_fail("WB INT signal should not be set");
8396
        fail = fail + 1;
8397
      end
8398
      // INTERMEDIATE DISPLAYS
8399
      if (num_of_bd == 0)
8400
        $display("    ->packet with length %0d sent", (i_length + 4));
8401
      else if (num_of_bd == 1)
8402
        $display("    ->packet with length %0d sent", (i_length + 4));
8403
      else if (num_of_bd == 2)
8404
        $display("    ->packet with length %0d sent", (i_length + 4));
8405
      // set length (loop variable)
8406
      i_length = i_length + 1;
8407
      // the number of frame transmitted
8408
      num_of_frames = num_of_frames + 1;
8409
      num_of_bd = num_of_bd + 1;
8410
      @(posedge wb_clk);
8411
    end
8412
    // disable TX
8413
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8414
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8415
    @(posedge wb_clk);
8416
    if(fail == 0)
8417
      test_ok;
8418
    else
8419
      fail = 0;
8420
  end
8421
 
8422
 
8423
  ////////////////////////////////////////////////////////////////////
8424
  ////                                                            ////
8425
  ////  Test transmit packets across changed MAXFL value at       ////
8426
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8427
  ////                                                            ////
8428
  ////////////////////////////////////////////////////////////////////
8429
  if (test_num == 13) // without and with padding
8430
  begin
8431
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8432
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8433
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8434
 
8435
    // reset MAC registers
8436
    hard_reset;
8437
    // reset MAC and MII LOGIC with soft reset
8438
    reset_mac;
8439
    reset_mii;
8440
    // set wb slave response
8441
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8442
 
8443
    max_tmp = 0;
8444
    min_tmp = 0;
8445
    num_of_frames = 0;
8446
    num_of_bd = 0;
8447
    // set 47 TX buffer descriptors - must be set before TX enable
8448
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8449
    // prepare a packet of MAXFL + 10 length
8450
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8451
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8452
    min_tmp = tmp[31:16];
8453
    // change MAXFL value
8454
    max_tmp = min_tmp + 53;
8455
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8456
    st_data = 8'h62;
8457
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8458
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8459
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8460
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8461
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8462
    // check WB INT signal
8463
    if (wb_int !== 1'b0)
8464
    begin
8465
      test_fail("WB INT signal should not be set");
8466
      fail = fail + 1;
8467
    end
8468
 
8469
    // write to phy's control register for 100Mbps
8470
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8471
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8472
    speed = 100;
8473
 
8474
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8475
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8476
    begin
8477
      $display("   i_length = %0d", i_length);
8478
      // prepare packet's CRC
8479
      if (num_of_bd == 1)
8480
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8481
      // Reset_tx_bd nable interrupt generation
8482
      // unmask interrupts
8483
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8484
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8485
      // not detect carrier sense in FD and no collision
8486
      eth_phy.carrier_sense_tx_fd_detect(0);
8487
      eth_phy.collision(0);
8488
      // first destination address on ethernet PHY
8489
      eth_phy.set_tx_mem_addr(0);
8490
      // prepare BDs
8491
      if (num_of_bd == 0)
8492
      begin
8493
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8494
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8495
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8496
        set_tx_bd_wrap(2);
8497
        set_tx_bd_ready(0, 0);
8498
      end
8499
      else if (num_of_bd == 1)
8500
        set_tx_bd_ready(1, 1);
8501
      else if (num_of_bd == 2)
8502
        set_tx_bd_ready(2, 2);
8503
      // CHECK END OF TRANSMITION
8504
      check_tx_bd(num_of_bd, data);
8505
        wait (MTxEn === 1'b1); // start transmit
8506
      check_tx_bd(num_of_bd, data);
8507
        if (data[15] !== 1)
8508
        begin
8509
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8510
          fail = fail + 1;
8511
        end
8512
        wait (MTxEn === 1'b0); // end transmit
8513
        while (data[15] === 1)
8514
        begin
8515
      check_tx_bd(num_of_bd, data);
8516
          @(posedge wb_clk);
8517
        end
8518
        repeat (1) @(posedge wb_clk);
8519
      // check length of a PACKET
8520
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8521
      tmp_len = eth_phy.tx_len;
8522
      #1;
8523
      if (tmp_len != (i_length + 4))
8524
      begin
8525
        test_fail("Wrong length of the packet out from MAC");
8526
        fail = fail + 1;
8527
      end
8528
      // checking packet
8529
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8530
      if (tmp > 0)
8531
      begin
8532
        test_fail("Wrong data of the transmitted packet");
8533
        fail = fail + 1;
8534
      end
8535
      // check transmited TX packet CRC
8536
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8537
      if (tmp > 0)
8538
      begin
8539
        test_fail("Wrong CRC of the transmitted packet");
8540
        fail = fail + 1;
8541
      end
8542
      // check WB INT signal
8543
      if (wb_int !== 1'b1)
8544
      begin
8545
        `TIME; $display("*E WB INT signal should be set");
8546
        test_fail("WB INT signal should be set");
8547
        fail = fail + 1;
8548
      end
8549
      // check TX buffer descriptor of a packet
8550
      check_tx_bd(num_of_bd, data);
8551
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8552
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8553
      begin
8554
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8555
        test_fail("TX buffer descriptor status is not correct");
8556
        fail = fail + 1;
8557
      end
8558
      // check interrupts
8559
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8560
      if ((data & `ETH_INT_TXB) !== 1'b1)
8561
      begin
8562
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8563
        test_fail("Interrupt Transmit Buffer was not set");
8564
        fail = fail + 1;
8565
      end
8566
      if ((data & (~`ETH_INT_TXB)) !== 0)
8567
      begin
8568
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8569
        test_fail("Other interrupts (except Transmit Buffer) were set");
8570
        fail = fail + 1;
8571
      end
8572
      // clear interrupts
8573
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8574
      // check WB INT signal
8575
      if (wb_int !== 1'b0)
8576
      begin
8577
        test_fail("WB INT signal should not be set");
8578
        fail = fail + 1;
8579
      end
8580
      // INTERMEDIATE DISPLAYS
8581
      if (num_of_bd == 0)
8582
        $display("    ->packet with length %0d sent", (i_length + 4));
8583
      else if (num_of_bd == 1)
8584
        $display("    ->packet with length %0d sent", (i_length + 4));
8585
      else if (num_of_bd == 2)
8586
        $display("    ->packet with length %0d sent", (i_length + 4));
8587
      // set length (loop variable)
8588
      i_length = i_length + 1;
8589
      // the number of frame transmitted
8590
      num_of_frames = num_of_frames + 1;
8591
      num_of_bd = num_of_bd + 1;
8592
      @(posedge wb_clk);
8593
    end
8594
    // disable TX
8595
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8596
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8597
    @(posedge wb_clk);
8598
    if(fail == 0)
8599
      test_ok;
8600
    else
8601
      fail = 0;
8602
  end
8603
 
8604
 
8605
  ////////////////////////////////////////////////////////////////////
8606
  ////                                                            ////
8607
  ////  Test transmit packets across changed MINFL value at       ////
8608
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8609
  ////                                                            ////
8610
  ////////////////////////////////////////////////////////////////////
8611
  if (test_num == 14) // without and with padding
8612
  begin
8613
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8614
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8615
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8616
 
8617
    // reset MAC registers
8618
    hard_reset;
8619
    // reset MAC and MII LOGIC with soft reset
8620
    reset_mac;
8621
    reset_mii;
8622
    // set wb slave response
8623
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8624
 
8625
    max_tmp = 0;
8626
    min_tmp = 0;
8627
    num_of_frames = 0;
8628
    num_of_bd = 0;
8629
    // set 7 TX buffer descriptors - must be set before TX enable
8630
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8631
    // prepare a packet of MAXFL + 10 length
8632
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8633
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8634
    min_tmp = tmp[31:16];
8635
    // change MINFL value
8636
    min_tmp = max_tmp - 177;
8637
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8638
    st_data = 8'h62;
8639
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8640
    // enable TX, set full-duplex mode, padding and CRC appending
8641
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8642
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8643
    // check WB INT signal
8644
    if (wb_int !== 1'b0)
8645
    begin
8646
      test_fail("WB INT signal should not be set");
8647
      fail = fail + 1;
8648
    end
8649
 
8650
    // write to phy's control register for 10Mbps
8651
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8652
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8653
    speed = 10;
8654
 
8655
    i_length = (min_tmp - 5);
8656
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8657
    begin
8658
      $display("   i_length = %0d", i_length);
8659
      // Reset_tx_bd nable interrupt generation
8660
      // unmask interrupts
8661
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8662
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8663
      // not detect carrier sense in FD and no collision
8664
      eth_phy.carrier_sense_tx_fd_detect(0);
8665
      eth_phy.collision(0);
8666
      // first destination address on ethernet PHY
8667
      eth_phy.set_tx_mem_addr(0);
8668
      // prepare BDs
8669
      if (num_of_bd == 0)
8670
      begin
8671
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8672
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8673
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8674
        set_tx_bd_wrap(2);
8675
        set_tx_bd_ready(0, 0);
8676
      end
8677
      else if (num_of_bd == 1)
8678
        set_tx_bd_ready(1, 1);
8679
      else if (num_of_bd == 2)
8680
        set_tx_bd_ready(2, 2);
8681
      // CHECK END OF TRANSMITION
8682
      check_tx_bd(num_of_bd, data);
8683
        wait (MTxEn === 1'b1); // start transmit
8684
      check_tx_bd(num_of_bd, data);
8685
        if (data[15] !== 1)
8686
        begin
8687
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8688
          fail = fail + 1;
8689
        end
8690
        wait (MTxEn === 1'b0); // end transmit
8691
        while (data[15] === 1)
8692
        begin
8693
      check_tx_bd(num_of_bd, data);
8694
          @(posedge wb_clk);
8695
        end
8696
        repeat (1) @(posedge wb_clk);
8697
      // check length of a PACKET
8698
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8699
      tmp_len = eth_phy.tx_len;
8700
      #1;
8701
      if (tmp_len != (i_length + 4))
8702
      begin
8703
        test_fail("Wrong length of the packet out from MAC");
8704
        fail = fail + 1;
8705
      end
8706
      // checking packet
8707
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8708
      if (tmp > 0)
8709
      begin
8710
        test_fail("Wrong data of the transmitted packet");
8711
        fail = fail + 1;
8712
      end
8713
      // check transmited TX packet CRC
8714
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8715
      if (tmp > 0)
8716
      begin
8717
        test_fail("Wrong CRC of the transmitted packet");
8718
        fail = fail + 1;
8719
      end
8720
      // check WB INT signal
8721
      if (wb_int !== 1'b1)
8722
      begin
8723
        `TIME; $display("*E WB INT signal should be set");
8724
        test_fail("WB INT signal should be set");
8725
        fail = fail + 1;
8726
      end
8727
      // check TX buffer descriptor of a packet
8728
      check_tx_bd(num_of_bd, data);
8729
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8730
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8731
      begin
8732
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8733
        test_fail("TX buffer descriptor status is not correct");
8734
        fail = fail + 1;
8735
      end
8736
      // check interrupts
8737
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8738
      if ((data & `ETH_INT_TXB) !== 1'b1)
8739
      begin
8740
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8741
        test_fail("Interrupt Transmit Buffer was not set");
8742
        fail = fail + 1;
8743
      end
8744
      if ((data & (~`ETH_INT_TXB)) !== 0)
8745
      begin
8746
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8747
        test_fail("Other interrupts (except Transmit Buffer) were set");
8748
        fail = fail + 1;
8749
      end
8750
      // clear interrupts
8751
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8752
      // check WB INT signal
8753
      if (wb_int !== 1'b0)
8754
      begin
8755
        test_fail("WB INT signal should not be set");
8756
        fail = fail + 1;
8757
      end
8758
      // INTERMEDIATE DISPLAYS
8759
      if (num_of_bd == 0)
8760
        $display("    ->packet with length %0d sent", (i_length + 4));
8761
      else if (num_of_bd == 1)
8762
        $display("    ->packet with length %0d sent", (i_length + 4));
8763
      else if (num_of_bd == 2)
8764
        $display("    ->packet with length %0d sent", (i_length + 4));
8765
      // set length (loop variable)
8766
      i_length = i_length + 1;
8767
      // the number of frame transmitted
8768
      num_of_frames = num_of_frames + 1;
8769
      num_of_bd = num_of_bd + 1;
8770
      @(posedge wb_clk);
8771
    end
8772
    // disable TX
8773
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8774
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8775
    @(posedge wb_clk);
8776
    if(fail == 0)
8777
      test_ok;
8778
    else
8779
      fail = 0;
8780
  end
8781
 
8782
 
8783
  ////////////////////////////////////////////////////////////////////
8784
  ////                                                            ////
8785
  ////  Test transmit packets across changed MINFL value at       ////
8786
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
8787
  ////                                                            ////
8788
  ////////////////////////////////////////////////////////////////////
8789
  if (test_num == 15) // without and with padding
8790
  begin
8791
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
8792
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
8793
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
8794
 
8795
    // reset MAC registers
8796
    hard_reset;
8797
    // reset MAC and MII LOGIC with soft reset
8798
    reset_mac;
8799
    reset_mii;
8800
    // set wb slave response
8801
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8802
 
8803
    max_tmp = 0;
8804
    min_tmp = 0;
8805
    num_of_frames = 0;
8806
    num_of_bd = 0;
8807
    // set 7 TX buffer descriptors - must be set before TX enable
8808
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8809
    // prepare a packet of MAXFL + 10 length
8810
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8811
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8812
    min_tmp = tmp[31:16];
8813
    // change MINFL value
8814
    min_tmp = max_tmp - 177;
8815
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8816
    st_data = 8'h62;
8817
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8818
    // enable TX, set full-duplex mode, padding and CRC appending
8819
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8820
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8821
    // check WB INT signal
8822
    if (wb_int !== 1'b0)
8823
    begin
8824
      test_fail("WB INT signal should not be set");
8825
      fail = fail + 1;
8826
    end
8827
 
8828
    // write to phy's control register for 100Mbps
8829
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8830
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8831
    speed = 100;
8832
 
8833
    i_length = (min_tmp - 5);
8834
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8835
    begin
8836
      $display("   i_length = %0d", i_length);
8837
      // Reset_tx_bd nable interrupt generation
8838
      // unmask interrupts
8839
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8840
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8841
      // not detect carrier sense in FD and no collision
8842
      eth_phy.carrier_sense_tx_fd_detect(0);
8843
      eth_phy.collision(0);
8844
      // first destination address on ethernet PHY
8845
      eth_phy.set_tx_mem_addr(0);
8846
      // prepare BDs
8847
      if (num_of_bd == 0)
8848
      begin
8849
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8850
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8851
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8852
        set_tx_bd_wrap(2);
8853
        set_tx_bd_ready(0, 0);
8854
      end
8855
      else if (num_of_bd == 1)
8856
        set_tx_bd_ready(1, 1);
8857
      else if (num_of_bd == 2)
8858
        set_tx_bd_ready(2, 2);
8859
      // CHECK END OF TRANSMITION
8860
      check_tx_bd(num_of_bd, data);
8861
        wait (MTxEn === 1'b1); // start transmit
8862
      check_tx_bd(num_of_bd, data);
8863
        if (data[15] !== 1)
8864
        begin
8865
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8866
          fail = fail + 1;
8867
        end
8868
        wait (MTxEn === 1'b0); // end transmit
8869
        while (data[15] === 1)
8870
        begin
8871
      check_tx_bd(num_of_bd, data);
8872
          @(posedge wb_clk);
8873
        end
8874
        repeat (1) @(posedge wb_clk);
8875
      // check length of a PACKET
8876
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8877
      tmp_len = eth_phy.tx_len;
8878
      #1;
8879
      if (tmp_len != (i_length + 4))
8880
      begin
8881
        test_fail("Wrong length of the packet out from MAC");
8882
        fail = fail + 1;
8883
      end
8884
      // checking packet
8885
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8886
      if (tmp > 0)
8887
      begin
8888
        test_fail("Wrong data of the transmitted packet");
8889
        fail = fail + 1;
8890
      end
8891
      // check transmited TX packet CRC
8892
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8893
      if (tmp > 0)
8894
      begin
8895
        test_fail("Wrong CRC of the transmitted packet");
8896
        fail = fail + 1;
8897
      end
8898
      // check WB INT signal
8899
      if (wb_int !== 1'b1)
8900
      begin
8901
        `TIME; $display("*E WB INT signal should be set");
8902
        test_fail("WB INT signal should be set");
8903
        fail = fail + 1;
8904
      end
8905
      // check TX buffer descriptor of a packet
8906
      check_tx_bd(num_of_bd, data);
8907
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8908
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8909
      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
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8916
      if ((data & `ETH_INT_TXB) !== 1'b1)
8917
      begin
8918
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8919
        test_fail("Interrupt Transmit Buffer was not set");
8920
        fail = fail + 1;
8921
      end
8922
      if ((data & (~`ETH_INT_TXB)) !== 0)
8923
      begin
8924
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8925
        test_fail("Other interrupts (except Transmit Buffer) were set");
8926
        fail = fail + 1;
8927
      end
8928
      // clear interrupts
8929
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8930
      // check WB INT signal
8931
      if (wb_int !== 1'b0)
8932
      begin
8933
        test_fail("WB INT signal should not be set");
8934
        fail = fail + 1;
8935
      end
8936
      // INTERMEDIATE DISPLAYS
8937
      if (num_of_bd == 0)
8938
        $display("    ->packet with length %0d sent", (i_length + 4));
8939
      else if (num_of_bd == 1)
8940
        $display("    ->packet with length %0d sent", (i_length + 4));
8941
      else if (num_of_bd == 2)
8942
        $display("    ->packet with length %0d sent", (i_length + 4));
8943
      // set length (loop variable)
8944
      i_length = i_length + 1;
8945
      // the number of frame transmitted
8946
      num_of_frames = num_of_frames + 1;
8947
      num_of_bd = num_of_bd + 1;
8948
      @(posedge wb_clk);
8949
    end
8950
    // disable TX
8951
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8952
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8953
    @(posedge wb_clk);
8954
    if(fail == 0)
8955
      test_ok;
8956
    else
8957
      fail = 0;
8958
  end
8959
 
8960
 
8961
  ////////////////////////////////////////////////////////////////////
8962
  ////                                                            ////
8963
  ////  Test transmit packets across MAXFL with HUGEN at          ////
8964
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
8965
  ////                                                            ////
8966
  ////////////////////////////////////////////////////////////////////
8967
  if (test_num == 16) // without and with padding
8968
  begin
8969
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
8970
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
8971
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
8972
 
8973
    // reset MAC registers
8974
    hard_reset;
8975
    // reset MAC and MII LOGIC with soft reset
8976
    reset_mac;
8977
    reset_mii;
8978
    // set wb slave response
8979
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8980
 
8981
    max_tmp = 0;
8982
    min_tmp = 0;
8983
    num_of_frames = 0;
8984
    num_of_bd = 0;
8985
    // set 19 TX buffer descriptors - must be set before TX enable
8986
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8987
    // prepare a packet of 64k - 1 length (16'hFFFF)
8988
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8989
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8990
    min_tmp = tmp[31:16];
8991
    st_data = 8'h8D;
8992
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
8993
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
8994
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
8995
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8996
    // check WB INT signal
8997
    if (wb_int !== 1'b0)
8998
    begin
8999
      test_fail("WB INT signal should not be set");
9000
      fail = fail + 1;
9001
    end
9002
 
9003
    // write to phy's control register for 10Mbps
9004
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9005
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9006
    speed = 10;
9007
 
9008
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9009
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9010
    begin
9011
      $display("   i_length = %0d", i_length);
9012
      // Reset_tx_bd nable interrupt generation
9013
      // unmask interrupts
9014
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9015
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9016
      // not detect carrier sense in FD and no collision
9017
      eth_phy.carrier_sense_tx_fd_detect(0);
9018
      eth_phy.collision(0);
9019
      // first destination address on ethernet PHY
9020
      eth_phy.set_tx_mem_addr(0);
9021
      // prepare BDs
9022
      if (num_of_bd == 0)
9023
      begin
9024
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9025
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9026
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9027
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9028
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9029
        set_tx_bd_wrap(4);
9030
        set_tx_bd_ready(0, 0);
9031
      end
9032
      else if (num_of_bd == 1)
9033
        set_tx_bd_ready(1, 1);
9034
      else if (num_of_bd == 2)
9035
        set_tx_bd_ready(2, 2);
9036
      else if (num_of_bd == 3)
9037
        set_tx_bd_ready(3, 3);
9038
      else if (num_of_bd == 4)
9039
        set_tx_bd_ready(4, 4);
9040
      // CHECK END OF TRANSMITION
9041
      check_tx_bd(num_of_bd, data);
9042
        wait (MTxEn === 1'b1); // start transmit
9043
      check_tx_bd(num_of_bd, data);
9044
        if (data[15] !== 1)
9045
        begin
9046
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9047
          fail = fail + 1;
9048
        end
9049
        wait (MTxEn === 1'b0); // end transmit
9050
        while (data[15] === 1)
9051
        begin
9052
      check_tx_bd(num_of_bd, data);
9053
          @(posedge wb_clk);
9054
        end
9055
        repeat (1) @(posedge wb_clk);
9056
      // check length of a PACKET
9057
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9058
      tmp_len = eth_phy.tx_len;
9059
      #1;
9060
      if (tmp_len != (i_length + 4))
9061
      begin
9062
        test_fail("Wrong length of the packet out from MAC");
9063
        fail = fail + 1;
9064
      end
9065
      // checking packet
9066
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9067
      if (tmp > 0)
9068
      begin
9069
        test_fail("Wrong data of the transmitted packet");
9070
        fail = fail + 1;
9071
      end
9072
      // check transmited TX packet CRC
9073
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9074
      if (tmp > 0)
9075
      begin
9076
        test_fail("Wrong CRC of the transmitted packet");
9077
        fail = fail + 1;
9078
      end
9079
      // check WB INT signal
9080
      if (wb_int !== 1'b1)
9081
      begin
9082
        `TIME; $display("*E WB INT signal should be set");
9083
        test_fail("WB INT signal should be set");
9084
        fail = fail + 1;
9085
      end
9086
      // check TX buffer descriptor of a packet
9087
      check_tx_bd(num_of_bd, data);
9088
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9089
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9090
      begin
9091
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9092
        test_fail("TX buffer descriptor status is not correct");
9093
        fail = fail + 1;
9094
      end
9095
      // check interrupts
9096
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9097
      if ((data & `ETH_INT_TXB) !== 1'b1)
9098
      begin
9099
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9100
        test_fail("Interrupt Transmit Buffer was not set");
9101
        fail = fail + 1;
9102
      end
9103
      if ((data & (~`ETH_INT_TXB)) !== 0)
9104
      begin
9105
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9106
        test_fail("Other interrupts (except Transmit Buffer) were set");
9107
        fail = fail + 1;
9108
      end
9109
      // clear interrupts
9110
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9111
      // check WB INT signal
9112
      if (wb_int !== 1'b0)
9113
      begin
9114
        test_fail("WB INT signal should not be set");
9115
        fail = fail + 1;
9116
      end
9117
      // INTERMEDIATE DISPLAYS
9118
      $display("    ->packet with length %0d sent", (i_length + 4));
9119
      // set length (loop variable)
9120
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9121
        i_length = i_length + 1;
9122
      else if (num_of_bd == 2)
9123
        i_length = (16'hFFFF - 5);
9124
      // the number of frame transmitted
9125
      num_of_frames = num_of_frames + 1;
9126
      num_of_bd = num_of_bd + 1;
9127
      @(posedge wb_clk);
9128
    end
9129
    // disable TX
9130
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9131
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9132
    @(posedge wb_clk);
9133
    if(fail == 0)
9134
      test_ok;
9135
    else
9136
      fail = 0;
9137
  end
9138
 
9139
 
9140
  ////////////////////////////////////////////////////////////////////
9141
  ////                                                            ////
9142
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9143
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9144
  ////                                                            ////
9145
  ////////////////////////////////////////////////////////////////////
9146
  if (test_num == 17) // without and with padding
9147
  begin
9148
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9149
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9150
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9151
 
9152
    // reset MAC registers
9153
    hard_reset;
9154
    // reset MAC and MII LOGIC with soft reset
9155
    reset_mac;
9156
    reset_mii;
9157
    // set wb slave response
9158
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9159
 
9160
    max_tmp = 0;
9161
    min_tmp = 0;
9162
    num_of_frames = 0;
9163
    num_of_bd = 0;
9164
    // set 19 TX buffer descriptors - must be set before TX enable
9165
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9166
    // prepare a packet of 64k - 1 length (16'hFFFF)
9167
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9168
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9169
    min_tmp = tmp[31:16];
9170
    st_data = 8'h8D;
9171
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9172
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9173
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9174
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9175
    // check WB INT signal
9176
    if (wb_int !== 1'b0)
9177
    begin
9178
      test_fail("WB INT signal should not be set");
9179
      fail = fail + 1;
9180
    end
9181
 
9182
    // write to phy's control register for 100Mbps
9183
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9184
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9185
    speed = 100;
9186
 
9187
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9188
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9189
    begin
9190
      $display("   i_length = %0d", i_length);
9191
      // Reset_tx_bd nable interrupt generation
9192
      // unmask interrupts
9193
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9194
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9195
      // not detect carrier sense in FD and no collision
9196
      eth_phy.carrier_sense_tx_fd_detect(0);
9197
      eth_phy.collision(0);
9198
      // first destination address on ethernet PHY
9199
      eth_phy.set_tx_mem_addr(0);
9200
      // prepare BDs
9201
      if (num_of_bd == 0)
9202
      begin
9203
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9204
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9205
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9206
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9207
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9208
        set_tx_bd_wrap(4);
9209
        set_tx_bd_ready(0, 0);
9210
      end
9211
      else if (num_of_bd == 1)
9212
        set_tx_bd_ready(1, 1);
9213
      else if (num_of_bd == 2)
9214
        set_tx_bd_ready(2, 2);
9215
      else if (num_of_bd == 3)
9216
        set_tx_bd_ready(3, 3);
9217
      else if (num_of_bd == 4)
9218
        set_tx_bd_ready(4, 4);
9219
      // CHECK END OF TRANSMITION
9220
      check_tx_bd(num_of_bd, data);
9221
        wait (MTxEn === 1'b1); // start transmit
9222
      check_tx_bd(num_of_bd, data);
9223
        if (data[15] !== 1)
9224
        begin
9225
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9226
          fail = fail + 1;
9227
        end
9228
        wait (MTxEn === 1'b0); // end transmit
9229
        while (data[15] === 1)
9230
        begin
9231
      check_tx_bd(num_of_bd, data);
9232
          @(posedge wb_clk);
9233
        end
9234
        repeat (1) @(posedge wb_clk);
9235
      // check length of a PACKET
9236
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9237
      tmp_len = eth_phy.tx_len;
9238
      #1;
9239
      if (tmp_len != (i_length + 4))
9240
      begin
9241
        test_fail("Wrong length of the packet out from MAC");
9242
        fail = fail + 1;
9243
      end
9244
      // checking packet
9245
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9246
      if (tmp > 0)
9247
      begin
9248
        test_fail("Wrong data of the transmitted packet");
9249
        fail = fail + 1;
9250
      end
9251
      // check transmited TX packet CRC
9252
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9253
      if (tmp > 0)
9254
      begin
9255
        test_fail("Wrong CRC of the transmitted packet");
9256
        fail = fail + 1;
9257
      end
9258
      // check WB INT signal
9259
      if (wb_int !== 1'b1)
9260
      begin
9261
        `TIME; $display("*E WB INT signal should be set");
9262
        test_fail("WB INT signal should be set");
9263
        fail = fail + 1;
9264
      end
9265
      // check TX buffer descriptor of a packet
9266
      check_tx_bd(num_of_bd, data);
9267
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9268
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9269
      begin
9270
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9271
        test_fail("TX buffer descriptor status is not correct");
9272
        fail = fail + 1;
9273
      end
9274
      // check interrupts
9275
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9276
      if ((data & `ETH_INT_TXB) !== 1'b1)
9277
      begin
9278
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9279
        test_fail("Interrupt Transmit Buffer was not set");
9280
        fail = fail + 1;
9281
      end
9282
      if ((data & (~`ETH_INT_TXB)) !== 0)
9283
      begin
9284
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9285
        test_fail("Other interrupts (except Transmit Buffer) were set");
9286
        fail = fail + 1;
9287
      end
9288
      // clear interrupts
9289
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9290
      // check WB INT signal
9291
      if (wb_int !== 1'b0)
9292
      begin
9293
        test_fail("WB INT signal should not be set");
9294
        fail = fail + 1;
9295
      end
9296
      // INTERMEDIATE DISPLAYS
9297
      $display("    ->packet with length %0d sent", (i_length + 4));
9298
      // set length (loop variable)
9299
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9300
        i_length = i_length + 1;
9301
      else if (num_of_bd == 2)
9302
        i_length = (16'hFFFF - 5);
9303
      // the number of frame transmitted
9304
      num_of_frames = num_of_frames + 1;
9305
      num_of_bd = num_of_bd + 1;
9306
      @(posedge wb_clk);
9307
    end
9308
    // disable TX
9309
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9310
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9311
    @(posedge wb_clk);
9312
    if(fail == 0)
9313
      test_ok;
9314
    else
9315
      fail = 0;
9316
  end
9317
 
9318
 
9319
  ////////////////////////////////////////////////////////////////////
9320
  ////                                                            ////
9321
  ////  Test IPG during Back-to-Back transmit at                  ////
9322
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9323
  ////                                                            ////
9324
  ////////////////////////////////////////////////////////////////////
9325
  if (test_num == 18) // without and with padding
9326
  begin
9327
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9328
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9329
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9330
 
9331
    // reset MAC registers
9332
    hard_reset;
9333
    // reset MAC and MII LOGIC with soft reset
9334
    reset_mac;
9335
    reset_mii;
9336
    // set wb slave response
9337
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9338
 
9339
    max_tmp = 0;
9340
    min_tmp = 0;
9341
    num_of_frames = 0;
9342
    num_of_bd = 0;
9343
    tmp_ipgt = 0;
9344
    // set 88 TX buffer descriptors - must be set before TX enable
9345
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9346
    // enable TX, set full-duplex mode, NO padding and CRC appending
9347
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9348
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9349
    // prepare two packets of MAXFL length
9350
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9351
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9352
    min_tmp = tmp[31:16];
9353
    st_data = 8'h29;
9354
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9355
    // check WB INT signal
9356
    if (wb_int !== 1'b0)
9357
    begin
9358
      test_fail("WB INT signal should not be set");
9359
      fail = fail + 1;
9360
    end
9361
 
9362
    // write to phy's control register for 10Mbps
9363
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9364
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9365
    speed = 10;
9366
 
9367
    i_length = (min_tmp - 4);
9368
    while (i_length < (max_tmp - 4))
9369
    begin
9370
      // disable TX, set full-duplex mode, NO padding and CRC appending
9371
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9372
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9373
      // set IPGT register
9374
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9375
      // enable TX, set full-duplex mode, NO padding and CRC appending
9376
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9377
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9378
      // Reset_tx_bd enable interrupt generation
9379
      // unmask interrupts
9380
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9381
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9382
      // not detect carrier sense in FD and no collision
9383
      eth_phy.carrier_sense_tx_fd_detect(0);
9384
      eth_phy.collision(0);
9385
      // first destination address on ethernet PHY
9386
      eth_phy.set_tx_mem_addr(0);
9387
      // prepare BDs
9388
      if (num_of_bd == 0)
9389
      begin
9390
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9391
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9392
        set_tx_bd_wrap(1);
9393
        set_tx_bd_ready(0, 0);
9394
        set_tx_bd_ready(1, 1);
9395
      end
9396
      // CHECK END OF TWO TRANSMITIONs
9397
      // wait for first transmit to end
9398
      check_tx_bd(num_of_bd, data);
9399
      wait (MTxEn === 1'b1); // start transmit
9400
      if (data[15] !== 1)
9401
      begin
9402
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9403
        fail = fail + 1;
9404
      end
9405
      wait (MTxEn === 1'b0); // end transmit
9406
      num_of_frames = num_of_frames + 1;
9407
      num_of_bd = num_of_bd + 1;
9408
      #Tp;
9409
      // destination address on ethernet PHY
9410
      eth_phy.set_tx_mem_addr(0);
9411
      i1 = 0;
9412
      i2 = 0;
9413
      // count IPG clock periods
9414
      fork
9415
        begin
9416
          wait (MTxEn === 1'b1); // start second transmit
9417
          #Tp;
9418
          disable count_rising;
9419
          disable count_falling;
9420
        end
9421
        begin: count_rising
9422
          forever
9423
          begin
9424
            @(posedge mtx_clk);
9425
            i1 = i1 + 1;
9426
            #Tp;
9427
          end
9428
        end
9429
        begin: count_falling
9430
          forever
9431
          begin
9432
            @(negedge mtx_clk);
9433
            i2 = i2 + 1;
9434
            #Tp;
9435
          end
9436
        end
9437
      join
9438
      // check IPG length - INTERMEDIATE DISPLAYS
9439
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9440
      begin
9441
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9442
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9443
      end
9444
      else
9445
      begin
9446
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9447
        fail = fail + 1;
9448
        test_fail("IPG is not correct");
9449
      end
9450
      // wait for second transmit to end
9451
      wait (MTxEn === 1'b0); // end second transmit
9452
      while (data[15] === 1)
9453
      begin
9454
        check_tx_bd(num_of_bd, data);
9455
        @(posedge wb_clk);
9456
      end
9457
      repeat (1) @(posedge wb_clk);
9458
      // check length of a second PACKET
9459
      tmp_len = eth_phy.tx_len;
9460
      #1;
9461
      if (tmp_len != (i_length + 4 + 1))
9462
      begin
9463
        test_fail("Wrong length of second packet out from MAC");
9464
        fail = fail + 1;
9465
      end
9466
      // checking second packet
9467
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9468
      if (tmp > 0)
9469
      begin
9470
        test_fail("Wrong data of second transmitted packet");
9471
        fail = fail + 1;
9472
      end
9473
      // check second transmited TX packet CRC
9474
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9475
      if (tmp > 0)
9476
      begin
9477
        test_fail("Wrong CRC of second transmitted packet");
9478
        fail = fail + 1;
9479
      end
9480
      // check WB INT signal
9481
      if (wb_int !== 1'b1)
9482
      begin
9483
        `TIME; $display("*E WB INT signal should be set");
9484
        test_fail("WB INT signal should be set");
9485
        fail = fail + 1;
9486
      end
9487
      // check TX buffer descriptor of a packet
9488
      check_tx_bd(num_of_bd, data);
9489
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9490
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9491
      begin
9492
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9493
        test_fail("TX buffer descriptor status is not correct");
9494
        fail = fail + 1;
9495
      end
9496
      // check interrupts
9497
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9498
      if ((data & `ETH_INT_TXB) !== 1'b1)
9499
      begin
9500
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9501
        test_fail("Interrupt Transmit Buffer was not set");
9502
        fail = fail + 1;
9503
      end
9504
      if ((data & (~`ETH_INT_TXB)) !== 0)
9505
      begin
9506
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9507
        test_fail("Other interrupts (except Transmit Buffer) were set");
9508
        fail = fail + 1;
9509
      end
9510
      // clear interrupts
9511
      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
      // set length (LOOP variable)
9519
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9520
        i_length = i_length + 2;
9521
      else
9522
        i_length = (max_tmp - 4);
9523
      // set IPGT
9524
      if ((tmp_ipgt + 3) < 10)
9525
        tmp_ipgt = tmp_ipgt + 1;
9526
      else if ((tmp_ipgt + 3) < 24)
9527
        tmp_ipgt = tmp_ipgt + 7;
9528
      else if ((tmp_ipgt + 3) == 24)
9529
        tmp_ipgt = 38 - 3;
9530
      else if ((tmp_ipgt + 3) == 38)
9531
        tmp_ipgt = 72 - 3;
9532
      else if ((tmp_ipgt + 3) == 72)
9533
        tmp_ipgt = 130 - 3; // 124 - 3
9534
      // the number of frame transmitted
9535
      num_of_frames = num_of_frames + 1;
9536
      num_of_bd = 0;
9537
      @(posedge wb_clk);
9538
    end
9539
    // disable TX
9540
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9541
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9542
    @(posedge wb_clk);
9543
    if(fail == 0)
9544
      test_ok;
9545
    else
9546
      fail = 0;
9547
  end
9548
 
9549
 
9550
  ////////////////////////////////////////////////////////////////////
9551
  ////                                                            ////
9552
  ////  Test IPG during Back-to-Back transmit at                  ////
9553
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9554
  ////                                                            ////
9555
  ////////////////////////////////////////////////////////////////////
9556
  if (test_num == 19) // without and with padding
9557
  begin
9558
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9559
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9560
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9561
 
9562
    // reset MAC registers
9563
    hard_reset;
9564
    // reset MAC and MII LOGIC with soft reset
9565
    reset_mac;
9566
    reset_mii;
9567
    // set wb slave response
9568
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9569
 
9570
    max_tmp = 0;
9571
    min_tmp = 0;
9572
    num_of_frames = 0;
9573
    num_of_bd = 0;
9574
    tmp_ipgt = 0;
9575
    // set 88 TX buffer descriptors - must be set before TX enable
9576
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9577
    // enable TX, set full-duplex mode, NO padding and CRC appending
9578
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9579
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9580
    // prepare two packets of MAXFL length
9581
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9582
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9583
    min_tmp = tmp[31:16];
9584
    st_data = 8'h29;
9585
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9586
    // check WB INT signal
9587
    if (wb_int !== 1'b0)
9588
    begin
9589
      test_fail("WB INT signal should not be set");
9590
      fail = fail + 1;
9591
    end
9592
 
9593
    // write to phy's control register for 100Mbps
9594
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9595
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9596
    speed = 100;
9597
 
9598
    i_length = (min_tmp - 4);
9599
    while (i_length < (max_tmp - 4))
9600
    begin
9601
      // disable TX, set full-duplex mode, NO padding and CRC appending
9602
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9603
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9604
      // set IPGT register
9605
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9606
      // enable TX, set full-duplex mode, NO padding and CRC appending
9607
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9608
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9609
      // Reset_tx_bd enable interrupt generation
9610
      // unmask interrupts
9611
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9612
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9613
      // not detect carrier sense in FD and no collision
9614
      eth_phy.carrier_sense_tx_fd_detect(0);
9615
      eth_phy.collision(0);
9616
      // first destination address on ethernet PHY
9617
      eth_phy.set_tx_mem_addr(0);
9618
      // prepare BDs
9619
      if (num_of_bd == 0)
9620
      begin
9621
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9622
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9623
        set_tx_bd_wrap(1);
9624
        set_tx_bd_ready(0, 0);
9625
        set_tx_bd_ready(1, 1);
9626
      end
9627
      // CHECK END OF TWO TRANSMITIONs
9628
      // wait for first transmit to end
9629
      check_tx_bd(num_of_bd, data);
9630
      wait (MTxEn === 1'b1); // start transmit
9631
      if (data[15] !== 1)
9632
      begin
9633
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9634
        fail = fail + 1;
9635
      end
9636
      wait (MTxEn === 1'b0); // end transmit
9637
      num_of_frames = num_of_frames + 1;
9638
      num_of_bd = num_of_bd + 1;
9639
      #Tp;
9640
      // destination address on ethernet PHY
9641
      eth_phy.set_tx_mem_addr(0);
9642
      i1 = 0;
9643
      i2 = 0;
9644
      // count IPG clock periods
9645
      fork
9646
        begin
9647
          wait (MTxEn === 1'b1); // start second transmit
9648
          #Tp;
9649
          disable count_rising1;
9650
          disable count_falling1;
9651
        end
9652
        begin: count_rising1
9653
          forever
9654
          begin
9655
            @(posedge mtx_clk);
9656
            i1 = i1 + 1;
9657
            #Tp;
9658
          end
9659
        end
9660
        begin: count_falling1
9661
          forever
9662
          begin
9663
            @(negedge mtx_clk);
9664
            i2 = i2 + 1;
9665
            #Tp;
9666
          end
9667
        end
9668
      join
9669
      // check IPG length - INTERMEDIATE DISPLAYS
9670
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9671
      begin
9672
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9673
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9674
      end
9675
      else
9676
      begin
9677
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9678
        fail = fail + 1;
9679
        test_fail("IPG is not correct");
9680
      end
9681
      // wait for second transmit to end
9682
      wait (MTxEn === 1'b0); // end second transmit
9683
      while (data[15] === 1)
9684
      begin
9685
        check_tx_bd(num_of_bd, data);
9686
        @(posedge wb_clk);
9687
      end
9688
      repeat (1) @(posedge wb_clk);
9689
      // check length of a second PACKET
9690
      tmp_len = eth_phy.tx_len;
9691
      #1;
9692
      if (tmp_len != (i_length + 4 + 1))
9693
      begin
9694
        test_fail("Wrong length of second packet out from MAC");
9695
        fail = fail + 1;
9696
      end
9697
      // checking second packet
9698
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9699
      if (tmp > 0)
9700
      begin
9701
        test_fail("Wrong data of second transmitted packet");
9702
        fail = fail + 1;
9703
      end
9704
      // check second transmited TX packet CRC
9705
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9706
      if (tmp > 0)
9707
      begin
9708
        test_fail("Wrong CRC of second transmitted packet");
9709
        fail = fail + 1;
9710
      end
9711
      // check WB INT signal
9712
      if (wb_int !== 1'b1)
9713
      begin
9714
        `TIME; $display("*E WB INT signal should be set");
9715
        test_fail("WB INT signal should be set");
9716
        fail = fail + 1;
9717
      end
9718
      // check TX buffer descriptor of a packet
9719
      check_tx_bd(num_of_bd, data);
9720
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9721
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9722
      begin
9723
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9724
        test_fail("TX buffer descriptor status is not correct");
9725
        fail = fail + 1;
9726
      end
9727
      // check interrupts
9728
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9729
      if ((data & `ETH_INT_TXB) !== 1'b1)
9730
      begin
9731
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9732
        test_fail("Interrupt Transmit Buffer was not set");
9733
        fail = fail + 1;
9734
      end
9735
      if ((data & (~`ETH_INT_TXB)) !== 0)
9736
      begin
9737
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9738
        test_fail("Other interrupts (except Transmit Buffer) were set");
9739
        fail = fail + 1;
9740
      end
9741
      // clear interrupts
9742
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9743
      // check WB INT signal
9744
      if (wb_int !== 1'b0)
9745
      begin
9746
        test_fail("WB INT signal should not be set");
9747
        fail = fail + 1;
9748
      end
9749
      // set length (LOOP variable)
9750
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9751
        i_length = i_length + 2;
9752
      else
9753
        i_length = (max_tmp - 4);
9754
      // set IPGT
9755
      if ((tmp_ipgt + 3) < 10)
9756
        tmp_ipgt = tmp_ipgt + 1;
9757
      else if ((tmp_ipgt + 3) < 24)
9758
        tmp_ipgt = tmp_ipgt + 7;
9759
      else if ((tmp_ipgt + 3) == 24)
9760
        tmp_ipgt = 38 - 3;
9761
      else if ((tmp_ipgt + 3) == 38)
9762
        tmp_ipgt = 72 - 3;
9763
      else if ((tmp_ipgt + 3) == 72)
9764
        tmp_ipgt = 130 - 3; // 124 - 3
9765
      // the number of frame transmitted
9766
      num_of_frames = num_of_frames + 1;
9767
      num_of_bd = 0;
9768
      @(posedge wb_clk);
9769
    end
9770
    // disable TX
9771
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9772
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9773
    @(posedge wb_clk);
9774
    if(fail == 0)
9775
      test_ok;
9776
    else
9777
      fail = 0;
9778
  end
9779
 
9780
 
9781
  ////////////////////////////////////////////////////////////////////
9782
  ////                                                            ////
9783
  ////  Test transmit packets after TX under-run on each packet's ////
9784
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
9785
  ////                                                            ////
9786
  ////////////////////////////////////////////////////////////////////
9787
  if (test_num == 20) // without padding
9788
  begin
9789
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
9790
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
9791
    `TIME;
9792
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
9793
 
9794
    // reset MAC registers
9795
    hard_reset;
9796
    // reset MAC and MII LOGIC with soft reset
9797
    reset_mac;
9798
    reset_mii;
9799
    // set wb slave response
9800
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9801
 
9802
    max_tmp = 0;
9803
    min_tmp = 0;
9804
    // set 2 TX buffer descriptors - must be set before TX enable
9805
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9806
    // enable TX, set full-duplex mode, NO padding and CRC appending
9807
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9808
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9809
    // prepare a packet of MAXFL length
9810
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9811
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9812
    min_tmp = tmp[31:16];
9813
    st_data = 8'h99;
9814
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9815
    // read IPG value
9816
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9817
    // check WB INT signal
9818
    if (wb_int !== 1'b0)
9819
    begin
9820
      test_fail("WB INT signal should not be set");
9821
      fail = fail + 1;
9822
    end
9823
 
9824
    // write to phy's control register for 10Mbps
9825
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9826
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9827
    speed = 10;
9828
 
9829 223 tadejm
    num_of_frames = 40; // (0..3) => start under-run on first word
9830 209 tadejm
    num_of_bd = 0;
9831
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
9832
    i_length = (min_tmp + 4);
9833
    while (i_length < (max_tmp - 4))
9834
    begin
9835
      // Reset_tx_bd enable interrupt generation
9836
      // unmask interrupts
9837
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9838
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9839
      // not detect carrier sense in FD and no collision
9840
      eth_phy.carrier_sense_tx_fd_detect(0);
9841
      eth_phy.collision(0);
9842
      // first destination address on ethernet PHY
9843
      eth_phy.set_tx_mem_addr(0);
9844
      // prepare BDs
9845
      if (num_of_bd == 0)
9846
      begin
9847
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
9848
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9849
        set_tx_bd_wrap(1);
9850
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9851
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9852 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9853 209 tadejm
        set_tx_bd_ready(1, 1);
9854
        set_tx_bd_ready(0, 0);
9855
      end
9856
      // frame under-run checking
9857
      frame_started = 0;
9858
      frame_ended = 0;
9859
      wait_for_frame = 0;
9860
      fork
9861
        begin
9862
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
9863
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
9864
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
9865
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
9866
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9867
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9868 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
9869 209 tadejm
          // wait for synchronization and some additional clocks
9870
          wait_for_frame = 1;
9871
          // wait for frame
9872
          wait ((wait_for_frame == 0) || (frame_started == 1))
9873
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
9874
          begin
9875
            disable check_fr;
9876
          end
9877
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
9878
          begin
9879
            disable wait_fr;
9880
            wait (frame_ended == 1);
9881
          end
9882
          repeat (2) @(posedge wb_clk);
9883
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9884
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9885 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9886 209 tadejm
        end
9887
        begin: wait_fr
9888
          wait (wait_for_frame == 1)
9889
          begin
9890
            // wait for synchronization and some additional clocks
9891
            repeat (3) @(posedge wb_clk);
9892
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
9893
            repeat (2) @(posedge wb_clk);
9894
            repeat (2) @(posedge mtx_clk);
9895
            wait_for_frame = 0;
9896
          end
9897
        end
9898
        begin: check_fr
9899
          // wait for frame to start
9900
          @(posedge MTxEn);
9901
          frame_started = 1;
9902 223 tadejm
`TIME; $display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
9903 209 tadejm
          // wait for frame to end due to under-run
9904
          @(negedge MTxEn);
9905
          frame_ended = 1;
9906 223 tadejm
`TIME; $display("  Under-run frame ended");
9907 209 tadejm
        end
9908
      join
9909
      // wait for first transmit to end, if under-run didn't happen
9910
      if (frame_ended == 0)
9911
      begin
9912
        // WAIT FOR FIRST TRANSMIT
9913
        check_tx_bd(num_of_bd, data);
9914
        wait (MTxEn === 1'b1); // start first transmit
9915
        if (data[15] !== 1)
9916
        begin
9917
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9918
          fail = fail + 1;
9919
        end
9920
        wait (MTxEn === 1'b0); // end first transmit
9921
        while (data[15] === 1)
9922
        begin
9923
          check_tx_bd(num_of_bd, data);
9924
          @(posedge wb_clk);
9925
        end
9926
        repeat (1) @(posedge wb_clk);
9927
        // CHECK FIRST FRAME
9928
        // check length of a first PACKET
9929
        tmp_len = eth_phy.tx_len;
9930
        #1;
9931
        if (tmp_len != (i_length + 4))
9932
        begin
9933 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
9934
          test_fail("Wrong length of first packet out from MAC");
9935 209 tadejm
          fail = fail + 1;
9936
        end
9937
        // checking first packet
9938
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
9939
        if (tmp > 0)
9940
        begin
9941 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
9942
          test_fail("Wrong data of first transmitted packet");
9943 209 tadejm
          fail = fail + 1;
9944
        end
9945
        // check first transmited TX packet CRC
9946
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
9947
        if (tmp > 0)
9948
        begin
9949 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
9950
          test_fail("Wrong CRC of first transmitted packet");
9951 209 tadejm
          fail = fail + 1;
9952
        end
9953
        // check WB INT signal
9954
        if (wb_int !== 1'b1)
9955
        begin
9956
          `TIME; $display("*E WB INT signal should be set");
9957
          test_fail("WB INT signal should be set");
9958
          fail = fail + 1;
9959
        end
9960
        // check TX buffer descriptor of a packet
9961
        check_tx_bd(num_of_bd, data);
9962
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9963
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9964
        begin
9965
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9966
          test_fail("TX buffer descriptor status is not correct");
9967
          fail = fail + 1;
9968
        end
9969
        // check interrupts
9970
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9971
        if ((data & `ETH_INT_TXB) !== 1'b1)
9972
        begin
9973
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9974
          test_fail("Interrupt Transmit Buffer was not set");
9975
          fail = fail + 1;
9976
        end
9977
        if ((data & (~`ETH_INT_TXB)) !== 0)
9978
        begin
9979
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9980
          test_fail("Other interrupts (except Transmit Buffer) were set");
9981
          fail = fail + 1;
9982
        end
9983
        // clear interrupts
9984
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9985
        // check WB INT signal
9986
        if (wb_int !== 1'b0)
9987
        begin
9988
          test_fail("WB INT signal should not be set");
9989
          fail = fail + 1;
9990
        end
9991
      end
9992 223 tadejm
      else
9993
      begin
9994
        // CHECK FIRST FRAME
9995
        // check length of a first PACKET
9996
        tmp_len = eth_phy.tx_len_err;
9997
        #1;
9998
        if (tmp_len != (num_of_frames + (4 - i_data)))
9999
        begin
10000
          `TIME; $display("*E Wrong length of first packet out from MAC");
10001
          test_fail("Wrong length of first packet out from MAC");
10002
          fail = fail + 1;
10003
        end
10004
        // checking first packet
10005
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10006
        if (tmp > 0)
10007
        begin
10008
          `TIME; $display("*E Wrong data of first transmitted packet");
10009
          test_fail("Wrong data of first transmitted packet");
10010
          fail = fail + 1;
10011
        end
10012
        // check WB INT signal
10013
        if (wb_int !== 1'b1)
10014
        begin
10015
          `TIME; $display("*E WB INT signal should be set");
10016
          test_fail("WB INT signal should be set");
10017
          fail = fail + 1;
10018
        end
10019
        // check TX buffer descriptor of a packet
10020
        check_tx_bd(num_of_bd, data);
10021
        if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10022
             ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10023
        begin
10024
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10025
          test_fail("TX buffer descriptor status is not correct");
10026
          fail = fail + 1;
10027
        end
10028
        // check interrupts
10029
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10030
        if ((data & `ETH_INT_TXE) !== 2'b10)
10031
        begin
10032
          `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10033
          test_fail("Interrupt Transmit Buffer was not set");
10034
          fail = fail + 1;
10035
        end
10036
        if ((data & (~`ETH_INT_TXE)) !== 0)
10037
        begin
10038
          `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10039
          test_fail("Other interrupts (except Transmit Buffer) were set");
10040
          fail = fail + 1;
10041
        end
10042
        // clear interrupts
10043
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10044
        // check WB INT signal
10045
        if (wb_int !== 1'b0)
10046
        begin
10047
          test_fail("WB INT signal should not be set");
10048
          fail = fail + 1;
10049
        end
10050
      end
10051 209 tadejm
      num_of_bd = num_of_bd + 1;
10052
      // destination address on ethernet PHY
10053
      eth_phy.set_tx_mem_addr(0);
10054 223 tadejm
      // WAIT FOR SECOND TRANSMIT
10055 209 tadejm
      check_tx_bd(num_of_bd, data);
10056
      wait (MTxEn === 1'b1); // start first 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 first transmit
10063
      while (data[15] === 1)
10064
      begin
10065
        check_tx_bd(num_of_bd, data);
10066
        @(posedge wb_clk);
10067
      end
10068
      repeat (1) @(posedge wb_clk);
10069
      // CHECK SECOND FRAME
10070
      // check length of a second PACKET
10071 223 tadejm
if (frame_ended == 1'b1)
10072
begin
10073
`TIME; $display("  Second frame after under-run ended");
10074
end
10075 209 tadejm
      tmp_len = eth_phy.tx_len;
10076
      #1;
10077
      if (tmp_len != (i_length + 4))
10078
      begin
10079 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10080 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10081
        fail = fail + 1;
10082
      end
10083
      // checking second packet
10084
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10085
      if (tmp > 0)
10086
      begin
10087 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10088 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10089
        fail = fail + 1;
10090
      end
10091
      // check second transmited TX packet CRC
10092
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10093
      if (tmp > 0)
10094
      begin
10095 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10096 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10097
        fail = fail + 1;
10098
      end
10099
      // check WB INT signal
10100
      if (wb_int !== 1'b1)
10101
      begin
10102
        `TIME; $display("*E WB INT signal should be set");
10103
        test_fail("WB INT signal should be set");
10104
        fail = fail + 1;
10105
      end
10106
      // check TX buffer descriptor of a packet
10107
      check_tx_bd(num_of_bd, data);
10108
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10109
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10110
      begin
10111
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10112
        test_fail("TX buffer descriptor status is not correct");
10113
        fail = fail + 1;
10114
      end
10115
      // check interrupts
10116
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10117
      if ((data & `ETH_INT_TXB) !== 1'b1)
10118
      begin
10119
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10120
        test_fail("Interrupt Transmit Buffer was not set");
10121
        fail = fail + 1;
10122
      end
10123
      if ((data & (~`ETH_INT_TXB)) !== 0)
10124
      begin
10125
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10126
        test_fail("Other interrupts (except Transmit Buffer) were set");
10127
        fail = fail + 1;
10128
      end
10129
      // clear interrupts
10130
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10131
      // check WB INT signal
10132
      if (wb_int !== 1'b0)
10133
      begin
10134
        test_fail("WB INT signal should not be set");
10135
        fail = fail + 1;
10136
      end
10137
      // set initial value
10138
      i_data = i_data - 1;
10139
      // the number of frame transmitted
10140
      num_of_frames = num_of_frames + 1;
10141
      num_of_bd = 0;
10142
      // set length (LOOP variable)
10143 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10144 209 tadejm
        i_length = (max_tmp - 4);
10145
      @(posedge wb_clk);
10146
    end
10147
    // disable TX
10148
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10149
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10150
    @(posedge wb_clk);
10151
    if(fail == 0)
10152
      test_ok;
10153
    else
10154
      fail = 0;
10155
  end
10156
 
10157
 
10158
  ////////////////////////////////////////////////////////////////////
10159
  ////                                                            ////
10160
  ////  Test transmit packets after TX under-run on each packet's ////
10161
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10162
  ////                                                            ////
10163
  ////////////////////////////////////////////////////////////////////
10164
  if (test_num == 21) // without padding
10165
  begin
10166
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10167
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10168
    `TIME;
10169
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10170
 
10171
    // reset MAC registers
10172
    hard_reset;
10173
    // reset MAC and MII LOGIC with soft reset
10174
    reset_mac;
10175
    reset_mii;
10176
    // set wb slave response
10177
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10178
 
10179
    max_tmp = 0;
10180
    min_tmp = 0;
10181
    // set 2 TX buffer descriptors - must be set before TX enable
10182
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10183
    // enable TX, set full-duplex mode, NO padding and CRC appending
10184
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10185
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10186
    // prepare a packet of MAXFL length
10187
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10188
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10189
    min_tmp = tmp[31:16];
10190
    st_data = 8'h99;
10191
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10192
    // read IPG value
10193
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10194
    // check WB INT signal
10195
    if (wb_int !== 1'b0)
10196
    begin
10197
      test_fail("WB INT signal should not be set");
10198
      fail = fail + 1;
10199
    end
10200
 
10201
    // write to phy's control register for 100Mbps
10202
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10203
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10204
    speed = 100;
10205
 
10206
    num_of_frames = 0; // (0..3) => start under-run on first word
10207
    num_of_bd = 0;
10208
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10209
    i_length = (min_tmp + 4);
10210
    while (i_length < (max_tmp - 4))
10211
    begin
10212
      // Reset_tx_bd enable interrupt generation
10213
      // unmask interrupts
10214
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10215
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10216
      // not detect carrier sense in FD and no collision
10217
      eth_phy.carrier_sense_tx_fd_detect(0);
10218
      eth_phy.collision(0);
10219
      // first destination address on ethernet PHY
10220
      eth_phy.set_tx_mem_addr(0);
10221
      // prepare BDs
10222
      if (num_of_bd == 0)
10223
      begin
10224
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10225
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10226
        set_tx_bd_wrap(1);
10227
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10228
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10229
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10230
        set_tx_bd_ready(1, 1);
10231
        set_tx_bd_ready(0, 0);
10232
      end
10233
      // frame under-run checking
10234
      frame_started = 0;
10235
      frame_ended = 0;
10236
      wait_for_frame = 0;
10237
      fork
10238
        begin
10239
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10240
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10241
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
10242
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
10243
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10244
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10245
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h7, 8'hFF);
10246
          // wait for synchronization and some additional clocks
10247
          wait_for_frame = 1;
10248
          // wait for frame
10249
          wait ((wait_for_frame == 0) || (frame_started == 1))
10250
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10251
          begin
10252
            disable check_fr1;
10253
          end
10254
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10255
          begin
10256
            disable wait_fr1;
10257
            wait (frame_ended == 1);
10258
          end
10259
          repeat (2) @(posedge wb_clk);
10260
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10261
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10262
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10263
        end
10264
        begin: wait_fr1
10265
          wait (wait_for_frame == 1)
10266
          begin
10267
            // wait for synchronization and some additional clocks
10268
            repeat (3) @(posedge wb_clk);
10269
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10270
            repeat (2) @(posedge wb_clk);
10271
            repeat (2) @(posedge mtx_clk);
10272
            wait_for_frame = 0;
10273
          end
10274
        end
10275
        begin: check_fr1
10276
          // wait for frame to start
10277
          @(posedge MTxEn);
10278
          frame_started = 1;
10279
$display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
10280
          // wait for frame to end due to under-run
10281
          @(negedge MTxEn);
10282
          frame_ended = 1;
10283
$display("  Under-run frame ended");
10284
        end
10285
      join
10286
      // wait for first transmit to end, if under-run didn't happen
10287
      if (frame_ended == 0)
10288
      begin
10289
        // WAIT FOR FIRST TRANSMIT
10290
        check_tx_bd(num_of_bd, data);
10291
        wait (MTxEn === 1'b1); // start first transmit
10292
        if (data[15] !== 1)
10293
        begin
10294
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10295
          fail = fail + 1;
10296
        end
10297
        wait (MTxEn === 1'b0); // end first transmit
10298
        while (data[15] === 1)
10299
        begin
10300
          check_tx_bd(num_of_bd, data);
10301
          @(posedge wb_clk);
10302
        end
10303
        repeat (1) @(posedge wb_clk);
10304
        // CHECK FIRST FRAME
10305
        // check length of a first PACKET
10306
        tmp_len = eth_phy.tx_len;
10307
        #1;
10308
        if (tmp_len != (i_length + 4))
10309
        begin
10310
          test_fail("Wrong length of second packet out from MAC");
10311
          fail = fail + 1;
10312
        end
10313
        // checking first packet
10314
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10315
        if (tmp > 0)
10316
        begin
10317
          test_fail("Wrong data of second transmitted packet");
10318
          fail = fail + 1;
10319
        end
10320
        // check first transmited TX packet CRC
10321
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10322
        if (tmp > 0)
10323
        begin
10324
          test_fail("Wrong CRC of second transmitted packet");
10325
          fail = fail + 1;
10326
        end
10327
        // check WB INT signal
10328
        if (wb_int !== 1'b1)
10329
        begin
10330
          `TIME; $display("*E WB INT signal should be set");
10331
          test_fail("WB INT signal should be set");
10332
          fail = fail + 1;
10333
        end
10334
        // check TX buffer descriptor of a packet
10335
        check_tx_bd(num_of_bd, data);
10336
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10337
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10338
        begin
10339
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10340
          test_fail("TX buffer descriptor status is not correct");
10341
          fail = fail + 1;
10342
        end
10343
        // check interrupts
10344
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10345
        if ((data & `ETH_INT_TXB) !== 1'b1)
10346
        begin
10347
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10348
          test_fail("Interrupt Transmit Buffer was not set");
10349
          fail = fail + 1;
10350
        end
10351
        if ((data & (~`ETH_INT_TXB)) !== 0)
10352
        begin
10353
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10354
          test_fail("Other interrupts (except Transmit Buffer) were set");
10355
          fail = fail + 1;
10356
        end
10357
        // clear interrupts
10358
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10359
        // check WB INT signal
10360
        if (wb_int !== 1'b0)
10361
        begin
10362
          test_fail("WB INT signal should not be set");
10363
          fail = fail + 1;
10364
        end
10365
      end
10366
      num_of_bd = num_of_bd + 1;
10367
      // destination address on ethernet PHY
10368
      eth_phy.set_tx_mem_addr(0);
10369
      // WAIT FOR FIRST TRANSMIT
10370
      check_tx_bd(num_of_bd, data);
10371
      wait (MTxEn === 1'b1); // start first transmit
10372
      if (data[15] !== 1)
10373
      begin
10374
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10375
        fail = fail + 1;
10376
      end
10377
      wait (MTxEn === 1'b0); // end first transmit
10378
      while (data[15] === 1)
10379
      begin
10380
        check_tx_bd(num_of_bd, data);
10381
        @(posedge wb_clk);
10382
      end
10383
      repeat (1) @(posedge wb_clk);
10384
      // CHECK SECOND FRAME
10385
      // check length of a second PACKET
10386
      tmp_len = eth_phy.tx_len;
10387
      #1;
10388
      if (tmp_len != (i_length + 4))
10389
      begin
10390
        test_fail("Wrong length of second packet out from MAC");
10391
        fail = fail + 1;
10392
      end
10393
      // checking second packet
10394
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10395
      if (tmp > 0)
10396
      begin
10397
        test_fail("Wrong data of second transmitted packet");
10398
        fail = fail + 1;
10399
      end
10400
      // check second transmited TX packet CRC
10401
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10402
      if (tmp > 0)
10403
      begin
10404
        test_fail("Wrong CRC of second transmitted packet");
10405
        fail = fail + 1;
10406
      end
10407
      // check WB INT signal
10408
      if (wb_int !== 1'b1)
10409
      begin
10410
        `TIME; $display("*E WB INT signal should be set");
10411
        test_fail("WB INT signal should be set");
10412
        fail = fail + 1;
10413
      end
10414
      // check TX buffer descriptor of a packet
10415
      check_tx_bd(num_of_bd, data);
10416
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10417
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10418
      begin
10419
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10420
        test_fail("TX buffer descriptor status is not correct");
10421
        fail = fail + 1;
10422
      end
10423
      // check interrupts
10424
      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
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10439
      // check WB INT signal
10440
      if (wb_int !== 1'b0)
10441
      begin
10442
        test_fail("WB INT signal should not be set");
10443
        fail = fail + 1;
10444
      end
10445
      // set initial value
10446
      i_data = i_data - 1;
10447
      // the number of frame transmitted
10448
      num_of_frames = num_of_frames + 1;
10449
      num_of_bd = 0;
10450
      // set length (LOOP variable)
10451
      if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
10452
        i_length = (max_tmp - 4);
10453
      @(posedge wb_clk);
10454
    end
10455
    // disable TX
10456
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10457
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10458
    @(posedge wb_clk);
10459
    if(fail == 0)
10460
      test_ok;
10461
    else
10462
      fail = 0;
10463
  end
10464
 
10465 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
10466 169 mohor
 
10467
end
10468
endtask // test_mac_full_duplex_transmit
10469
 
10470
 
10471 209 tadejm
task test_mac_full_duplex_receive;
10472
  input  [31:0]  start_task;
10473
  input  [31:0]  end_task;
10474
  integer        bit_start_1;
10475
  integer        bit_end_1;
10476
  integer        bit_start_2;
10477
  integer        bit_end_2;
10478
  integer        num_of_reg;
10479
  integer        num_of_frames;
10480
  integer        num_of_bd;
10481
  integer        i_addr;
10482
  integer        i_data;
10483
  integer        i_length;
10484
  integer        tmp_len;
10485
  integer        tmp_bd;
10486
  integer        tmp_bd_num;
10487
  integer        tmp_data;
10488
  integer        tmp_ipgt;
10489
  integer        test_num;
10490
  reg    [31:0]  tx_bd_num;
10491
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
10492
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
10493
  integer        i;
10494
  integer        i1;
10495
  integer        i2;
10496
  integer        i3;
10497
  integer        fail;
10498
  integer        speed;
10499
  reg            frame_started;
10500
  reg            frame_ended;
10501
  reg            wait_for_frame;
10502 243 tadejm
  reg            check_frame;
10503
  reg            stop_checking_frame;
10504
  reg            first_fr_received;
10505 209 tadejm
  reg    [31:0]  addr;
10506
  reg    [31:0]  data;
10507
  reg    [31:0]  tmp;
10508
  reg    [ 7:0]  st_data;
10509
  reg    [15:0]  max_tmp;
10510
  reg    [15:0]  min_tmp;
10511
begin
10512
// MAC FULL DUPLEX RECEIVE TEST
10513
test_heading("MAC FULL DUPLEX RECEIVE TEST");
10514
$display(" ");
10515
$display("MAC FULL DUPLEX RECEIVE TEST");
10516
fail = 0;
10517
 
10518
// reset MAC registers
10519
hard_reset;
10520
// reset MAC and MII LOGIC with soft reset
10521
reset_mac;
10522
reset_mii;
10523
// set wb slave response
10524
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10525
 
10526
  /*
10527
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
10528
  -------------------------------------------------------------------------------------
10529
  set_tx_bd
10530
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
10531
  set_tx_bd_wrap
10532
    (tx_bd_num_end[6:0]);
10533
  set_tx_bd_ready
10534
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10535
  check_tx_bd
10536
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
10537
  clear_tx_bd
10538
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10539
 
10540
  TASKS for set and control RX buffer descriptors:
10541
  ------------------------------------------------
10542
  set_rx_bd
10543
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
10544
  set_rx_bd_wrap
10545
    (rx_bd_num_end[6:0]);
10546
  set_rx_bd_empty
10547
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10548
  check_rx_bd
10549
    (rx_bd_num_end[6:0], rx_bd_status);
10550
  clear_rx_bd
10551
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10552
 
10553
  TASKS for set and check TX packets:
10554
  -----------------------------------
10555
  set_tx_packet
10556
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
10557
  check_tx_packet
10558
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
10559
 
10560
  TASKS for set and check RX packets:
10561
  -----------------------------------
10562
  set_rx_packet
10563
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
10564
  check_rx_packet
10565
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
10566
 
10567
  TASKS for append and check CRC to/of TX packet:
10568
  -----------------------------------------------
10569
  append_tx_crc
10570
    (txpnt_wb[31:0], len[15:0], negated_crc);
10571
  check_tx_crc
10572
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
10573
 
10574
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
10575
  --------------------------------------------------------------------------------
10576
  append_rx_crc
10577
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
10578
  */
10579
 
10580
//////////////////////////////////////////////////////////////////////
10581
////                                                              ////
10582
////  test_mac_full_duplex_receive:                               ////
10583
////                                                              ////
10584
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
10585
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
10586 243 tadejm
////  2: Test receive packet synchronization with receive         ////
10587
////     disable/enable ( 10Mbps ).                               ////
10588
////  3: Test receive packet synchronization with receive         ////
10589
////     disable/enable ( 100Mbps ).                              ////
10590
////  4: Test receive packets form MINFL to MAXFL sizes at        ////
10591 209 tadejm
////     one RX buffer decriptor ( 10Mbps ).                      ////
10592 243 tadejm
////  5: Test receive packets form MINFL to MAXFL sizes at        ////
10593 209 tadejm
////     one RX buffer decriptor ( 100Mbps ).                     ////
10594
////                                                              ////
10595
//////////////////////////////////////////////////////////////////////
10596
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
10597
begin
10598
 
10599
  ////////////////////////////////////////////////////////////////////
10600
  ////                                                            ////
10601
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
10602
  ////                                                            ////
10603
  ////////////////////////////////////////////////////////////////////
10604
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
10605
  begin
10606
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
10607
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
10608
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
10609
 
10610
    // unmask interrupts
10611
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10612
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10613
    // set all buffer descriptors to TX - must be set before RX enable
10614
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10615 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10616 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10617
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10618
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10619
 
10620
    // write to phy's control register for 10Mbps
10621
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10622
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10623
    speed = 10;
10624
 
10625
    i = 0;
10626
    while (i < 128)
10627
    begin
10628
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10629
      begin
10630
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10631
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10632
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10633
      end
10634
      set_rx_bd_wrap(i);
10635
      set_rx_bd_empty(0, i);
10636
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10637
      begin
10638
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10639
        repeat(10) @(posedge mrx_clk);
10640
      end
10641
      @(posedge mrx_clk);
10642
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10643
      begin
10644
        check_rx_bd(0, tmp);
10645
        #1;
10646
        if (tmp[15] === 1'b0)
10647
        begin
10648
          test_fail("Receive should not start at all");
10649
          fail = fail + 1;
10650
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10651
        end
10652
        if (tmp[7:0] !== 0)
10653
        begin
10654
          test_fail("Receive should not be finished since it should not start at all");
10655
          fail = fail + 1;
10656
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10657
        end
10658
        @(posedge wb_clk);
10659
      end
10660
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10661
      if (tmp[6:0] !== 0)
10662
      begin
10663
        test_fail("Receive should not get INT since it should not start at all");
10664
        fail = fail + 1;
10665
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10666
      end
10667
      clear_rx_bd(0, i);
10668
      if ((i < 5) || (i > 124))
10669
        i = i + 1;
10670
      else
10671
        i = i + 120;
10672
    end
10673
    // disable RX
10674
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10675
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10676
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10677
    if(fail == 0)
10678
      test_ok;
10679
    else
10680
      fail = 0;
10681
  end
10682
 
10683
 
10684
  ////////////////////////////////////////////////////////////////////
10685
  ////                                                            ////
10686
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
10687
  ////                                                            ////
10688
  ////////////////////////////////////////////////////////////////////
10689
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
10690
  begin
10691
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
10692
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
10693
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
10694
 
10695
    // unmask interrupts
10696
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10697
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10698
    // set all buffer descriptors to TX - must be set before RX enable
10699
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10700 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10701 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10702
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10703
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10704
 
10705
    // write to phy's control register for 100Mbps
10706
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10707
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10708
    speed = 100;
10709
 
10710
    i = 0;
10711
    while (i < 128)
10712
    begin
10713
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10714
      begin
10715
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10716
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10717
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10718
      end
10719
      set_rx_bd_wrap(i);
10720
      set_rx_bd_empty(0, i);
10721
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10722
      begin
10723
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10724
        repeat(10) @(posedge mrx_clk);
10725
      end
10726
      @(posedge mrx_clk);
10727
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10728
      begin
10729
        check_rx_bd(0, tmp);
10730
        #1;
10731
        if (tmp[15] === 1'b0)
10732
        begin
10733
          test_fail("Receive should not start at all");
10734
          fail = fail + 1;
10735
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10736
        end
10737
        if (tmp[7:0] !== 0)
10738
        begin
10739
          test_fail("Receive should not be finished since it should not start at all");
10740
          fail = fail + 1;
10741
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10742
        end
10743
        @(posedge wb_clk);
10744
      end
10745
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10746
      if (tmp[6:0] !== 0)
10747
      begin
10748
        test_fail("Receive should not get INT since it should not start at all");
10749
        fail = fail + 1;
10750
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10751
      end
10752
      clear_rx_bd(0, i);
10753
      if ((i < 5) || (i > 124))
10754
        i = i + 1;
10755
      else
10756
        i = i + 120;
10757
    end
10758
    // disable RX
10759
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10760
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10761
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10762
    if(fail == 0)
10763
      test_ok;
10764
    else
10765
      fail = 0;
10766
  end
10767
 
10768
 
10769
  ////////////////////////////////////////////////////////////////////
10770
  ////                                                            ////
10771 243 tadejm
  ////  Test receive packet synchronization with receive          ////
10772
  ////  disable/enable ( 10Mbps ).                                ////
10773
  ////                                                            ////
10774
  ////////////////////////////////////////////////////////////////////
10775
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
10776
  begin
10777
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
10778
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
10779
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
10780
 
10781
    // unmask interrupts
10782
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10783
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10784
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
10785
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10786
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
10787
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
10788
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10789
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10790
    // prepare two packets of MAXFL length
10791
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10792
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10793
    min_tmp = tmp[31:16];
10794
    st_data = 8'h0F;
10795
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
10796
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
10797
    st_data = 8'h1A;
10798
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
10799
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
10800
    // check WB INT signal
10801
    if (wb_int !== 1'b0)
10802
    begin
10803
      test_fail("WB INT signal should not be set");
10804
      fail = fail + 1;
10805
    end
10806
 
10807
    // write to phy's control register for 10Mbps
10808
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10809
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10810
    speed = 10;
10811
 
10812
    frame_started = 0;
10813
    frame_ended = 0;
10814
    wait_for_frame = 0;
10815
    check_frame = 0;
10816
    stop_checking_frame = 0;
10817
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
10818
 
10819
    num_of_frames = 0; // 
10820
    num_of_bd = 0;
10821
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
10822
    while (i_length < (max_tmp - 4))
10823
    begin
10824
      // choose generating carrier sense and collision 
10825
      case (num_of_frames[1:0])
10826
      2'h0: // Interrupt is generated
10827
      begin
10828
        // enable interrupt generation
10829
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10830
        // not detect carrier sense in FD and no collision
10831
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10832
        eth_phy.collision(0);
10833
      end
10834
      2'h1: // Interrupt is generated
10835
      begin
10836
        // enable interrupt generation
10837
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10838
        // detect carrier sense in FD and no collision
10839
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10840
        eth_phy.collision(0);
10841
      end
10842
      2'h2: // Interrupt is generated
10843
      begin
10844
        // disable interrupt generation
10845
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10846
        // not detect carrier sense in FD and set collision
10847
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10848
        eth_phy.collision(1);
10849
      end
10850
      default: // 2'h3: // Interrupt is generated
10851
      begin
10852
        // disable interrupt generation
10853
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10854
        // detect carrier sense in FD and set collision
10855
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10856
        eth_phy.collision(1);
10857
      end
10858
      endcase
10859
      // set wrap bit
10860
      set_rx_bd_wrap(118);
10861
      set_rx_bd_empty(118, 118);
10862
      check_frame = 0;
10863
      stop_checking_frame = 0;
10864
      tmp_data = 0;
10865
      fork
10866
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
10867
          if (num_of_frames[0] == 1'b0)
10868
          begin
10869
            repeat(1) @(posedge wb_clk);
10870
            if (num_of_frames[1] == 1'b0)
10871
            begin
10872
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
10873
            end
10874
            else
10875
            begin
10876
              @(posedge mrx_clk);
10877
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
10878
            end
10879
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
10880
            wbm_init_waits = 4'h0;
10881
            wbm_subseq_waits = 4'h0;
10882
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
10883
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
10884
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
10885
          end
10886
        end
10887
        begin // send a packet from PHY RX
10888
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
10889
          if (num_of_frames[1] == 1'b0)
10890
          begin
10891
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
10892
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
10893
          end
10894
          else
10895
          begin
10896
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
10897
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
10898
          end
10899
        end
10900
        begin: send_packet0
10901
          wait (MRxDV === 1'b1); // start transmit
10902
          wait (MRxDV === 1'b0); // end transmit
10903
          check_frame = 1;
10904
          repeat(10) @(posedge mrx_clk);
10905
          repeat(15) @(posedge wb_clk);
10906
          stop_checking_frame = 1;
10907
        end
10908
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
10909
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
10910
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
10911
          begin
10912
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
10913
          end
10914
          else if (MRxDV === 1'b1)
10915
          begin
10916
            while (eth_sl_wb_ack_o === 1'b0)
10917
            begin
10918
              @(posedge wb_clk);
10919
              tmp_data = tmp_data + 1;
10920
            end
10921
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
10922
          end
10923
          else if (eth_sl_wb_ack_o === 1'b1)
10924
          begin
10925
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
10926
            while (MRxDV === 1'b0)
10927
            begin
10928
              @(posedge wb_clk);
10929
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
10930
            end
10931
          end
10932
        end
10933
        begin // check packet
10934
          wait (check_frame == 1);
10935
          check_rx_bd(118, tmp_bd);
10936
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
10937
          begin
10938
            #1 check_rx_bd(118, tmp_bd);
10939
            @(posedge wb_clk);
10940
          end
10941
          if (num_of_frames[0] == 1'b0)
10942
          begin
10943
            if (tmp_bd[15] === 1)
10944
            begin
10945
              if (first_fr_received == 1)
10946
              begin
10947
                first_fr_received = 0;
10948
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
10949
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
10950
                $display("    From this moment:");
10951
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
10952
                if (tmp_data[31])
10953
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
10954
                else
10955
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
10956
              end
10957
            end
10958
          end
10959
          if (stop_checking_frame == 0)
10960
            disable send_packet0;
10961
        end
10962
      join
10963
      // ONLY IF packet was received!
10964
      if (tmp_bd[15] === 0)
10965
      begin
10966
        // check length of a PACKET
10967
        if (tmp_bd[31:16] != (i_length + 4))
10968
        begin
10969
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
10970
                          tmp_bd[31:16], (i_length + 4));
10971
          test_fail("Wrong length of the packet out from PHY");
10972
          fail = fail + 1;
10973
        end
10974
        // check received RX packet data and CRC
10975
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
10976
        begin
10977
          if (num_of_frames[1] == 1'b0)
10978
          begin
10979
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
10980
          end
10981
          else
10982
          begin
10983
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
10984
          end
10985
          if (tmp > 0)
10986
          begin
10987
            `TIME; $display("*E Wrong data of the received packet");
10988
            test_fail("Wrong data of the received packet");
10989
            fail = fail + 1;
10990
          end
10991
        end
10992
        else // if PREVIOUS RX buffer descriptor was ready
10993
        begin
10994
          if (num_of_frames[1] == 1'b0)
10995
          begin
10996
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
10997
          end
10998
          else
10999
          begin
11000
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11001
          end
11002
          if (tmp > 0)
11003
          begin
11004
            `TIME; $display("*E Wrong data of the received packet");
11005
            test_fail("Wrong data of the received packet");
11006
            fail = fail + 1;
11007
          end
11008
        end
11009
      end
11010
      // check WB INT signal
11011
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11012
      begin
11013
        if (wb_int !== 1'b0)
11014
        begin
11015
          `TIME; $display("*E WB INT signal should not be set");
11016
          test_fail("WB INT signal should not be set");
11017
          fail = fail + 1;
11018
        end
11019
      end
11020
      else
11021
      begin
11022
        if (wb_int !== 1'b1)
11023
        begin
11024
          `TIME; $display("*E WB INT signal should be set");
11025
          test_fail("WB INT signal should be set");
11026
          fail = fail + 1;
11027
        end
11028
      end
11029
      // check RX buffer descriptor of a packet - only 15 LSBits
11030
      check_rx_bd(118, data);
11031
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11032
      begin
11033
        if (data[15:0] !== 16'hE000)
11034
        begin
11035
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11036
          test_fail("RX buffer descriptor status is not correct");
11037
          fail = fail + 1;
11038
        end
11039
      end
11040
      else // interrupt enabled
11041
      begin
11042
        if (data[15:0] !== 16'h6000)
11043
        begin
11044
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11045
          test_fail("RX buffer descriptor status is not correct");
11046
          fail = fail + 1;
11047
        end
11048
      end
11049
      // check interrupts
11050
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11051
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11052
      begin
11053
        if (data !== 0)
11054
        begin
11055
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11056
          test_fail("Any of interrupts was set");
11057
          fail = fail + 1;
11058
        end
11059
      end
11060
      else
11061
      begin
11062
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11063
        begin
11064
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11065
          test_fail("Interrupt Receive Buffer was not set");
11066
          fail = fail + 1;
11067
        end
11068
        if ((data & (~`ETH_INT_RXB)) !== 0)
11069
        begin
11070
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11071
          test_fail("Other interrupts (except Receive Buffer) were set");
11072
          fail = fail + 1;
11073
        end
11074
      end
11075
      // clear interrupts
11076
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11077
      // check WB INT signal
11078
      if (wb_int !== 1'b0)
11079
      begin
11080
        test_fail("WB INT signal should not be set");
11081
        fail = fail + 1;
11082
      end
11083
      // disable RX after two packets
11084
      if (num_of_frames[0] == 1'b1)
11085
      begin
11086
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11087
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11088
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11089
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11090
      end
11091
      // the number of frame transmitted
11092
      num_of_frames = num_of_frames + 1;
11093
      num_of_bd = 0;
11094
      // set length (LOOP variable)
11095
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11096
        i_length = (max_tmp - 4);
11097
      @(posedge wb_clk);
11098
    end
11099
    // disable RX
11100
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11101
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11102
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11103
    if(fail == 0)
11104
      test_ok;
11105
    else
11106
      fail = 0;
11107
  end
11108
 
11109
 
11110
  ////////////////////////////////////////////////////////////////////
11111
  ////                                                            ////
11112
  ////  Test receive packet synchronization with receive          ////
11113
  ////  disable/enable ( 100Mbps ).                               ////
11114
  ////                                                            ////
11115
  ////////////////////////////////////////////////////////////////////
11116
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11117
  begin
11118
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
11119
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
11120
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
11121
 
11122
    // unmask interrupts
11123
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11124
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11125
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11126
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11127
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11128
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11129
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11130
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11131
    // prepare two packets of MAXFL length
11132
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11133
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11134
    min_tmp = tmp[31:16];
11135
    st_data = 8'h0F;
11136
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11137
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11138
    st_data = 8'h1A;
11139
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11140
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11141
    // check WB INT signal
11142
    if (wb_int !== 1'b0)
11143
    begin
11144
      test_fail("WB INT signal should not be set");
11145
      fail = fail + 1;
11146
    end
11147
 
11148
    // write to phy's control register for 100Mbps
11149
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11150
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11151
    speed = 100;
11152
 
11153
    frame_started = 0;
11154
    frame_ended = 0;
11155
    wait_for_frame = 0;
11156
    check_frame = 0;
11157
    stop_checking_frame = 0;
11158
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11159
 
11160
    num_of_frames = 0; // 
11161
    num_of_bd = 0;
11162
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11163
    while (i_length < (max_tmp - 4))
11164
    begin
11165
      // choose generating carrier sense and collision 
11166
      case (num_of_frames[1:0])
11167
      2'h0: // Interrupt is generated
11168
      begin
11169
        // enable interrupt generation
11170
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11171
        // not detect carrier sense in FD and no collision
11172
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11173
        eth_phy.collision(0);
11174
      end
11175
      2'h1: // Interrupt is generated
11176
      begin
11177
        // enable interrupt generation
11178
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11179
        // detect carrier sense in FD and no collision
11180
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11181
        eth_phy.collision(0);
11182
      end
11183
      2'h2: // Interrupt is generated
11184
      begin
11185
        // disable interrupt generation
11186
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11187
        // not detect carrier sense in FD and set collision
11188
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11189
        eth_phy.collision(1);
11190
      end
11191
      default: // 2'h3: // Interrupt is generated
11192
      begin
11193
        // disable interrupt generation
11194
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11195
        // detect carrier sense in FD and set collision
11196
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11197
        eth_phy.collision(1);
11198
      end
11199
      endcase
11200
//if (first_fr_received == 0)
11201
//begin
11202
//  check_rx_bd(118, data);
11203
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11204
//  $display("RX BD set : %h, %h", data, tmp);
11205
//end
11206
      // set wrap bit
11207
      set_rx_bd_wrap(118);
11208
      set_rx_bd_empty(118, 118);
11209
      check_frame = 0;
11210
      stop_checking_frame = 0;
11211
      tmp_data = 0;
11212
$display("mama 1");
11213
      fork
11214
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11215
          if (num_of_frames[0] == 1'b0)
11216
          begin
11217
            repeat(1) @(posedge wb_clk);
11218
            if (num_of_frames[1] == 1'b0)
11219
            begin
11220
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11221
            end
11222
            else
11223
            begin
11224
              @(posedge mrx_clk);
11225
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11226
            end
11227
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11228
            wbm_init_waits = 4'h0;
11229
            wbm_subseq_waits = 4'h0;
11230
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11231
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11232
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11233
$display("mama 2, num_of_frames=%0h", num_of_frames);
11234
          end
11235
        end
11236
        begin // send a packet from PHY RX
11237
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11238
          if (num_of_frames[1] == 1'b0)
11239
          begin
11240
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11241
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11242
          end
11243
          else
11244
          begin
11245
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11246
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11247
          end
11248
        end
11249
        begin: send_packet1
11250
          wait (MRxDV === 1'b1); // start transmit
11251
          wait (MRxDV === 1'b0); // end transmit
11252
          check_frame = 1;
11253
$display("mama 3");
11254
          repeat(10) @(posedge mrx_clk);
11255
          repeat(15) @(posedge wb_clk);
11256
          stop_checking_frame = 1;
11257
        end
11258
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11259
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11260
$display("mama 4");
11261
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11262
          begin
11263
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11264
$display("mama 4_1");
11265
          end
11266
          else if (MRxDV === 1'b1)
11267
          begin
11268
            while (eth_sl_wb_ack_o === 1'b0)
11269
            begin
11270
              @(posedge wb_clk);
11271
              tmp_data = tmp_data + 1;
11272
            end
11273
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11274
$display("mama 4_2");
11275
          end
11276
          else if (eth_sl_wb_ack_o === 1'b1)
11277
          begin
11278
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11279
            while (MRxDV === 1'b0)
11280
            begin
11281
              @(posedge wb_clk);
11282
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11283
            end
11284
$display("mama 4_3");
11285
          end
11286
        end
11287
        begin // check packet
11288
          wait (check_frame == 1);
11289
          check_rx_bd(118, tmp_bd);
11290
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11291
          begin
11292
            #1 check_rx_bd(118, tmp_bd);
11293
            @(posedge wb_clk);
11294
          end
11295
$display("mama 5, tmp_bd=%0h", tmp_bd);
11296
          if (num_of_frames[0] == 1'b0)
11297
          begin
11298
            if (tmp_bd[15] === 1)
11299
            begin
11300
              if (first_fr_received == 1)
11301
              begin
11302
                first_fr_received = 0;
11303
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11304
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11305
                $display("    From this moment:");
11306
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11307
                if (tmp_data[31])
11308
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11309
                else
11310
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11311
              end
11312
              // check FB, etc.
11313
 
11314
            end
11315
            else // (tmp_bd[15] === 0)
11316
            begin // check FB, packet, etc.
11317
 
11318
            end
11319
$display("mama 5_1");
11320
          end
11321
          else // (num_of_frames[0] == 1'b1)
11322
          begin
11323
            if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
11324
            begin // check NOTHING
11325
 
11326
            end
11327
            else // (tmp_bd[15] === 0)
11328
            begin // check FB, packet, etc.
11329
 
11330
            end
11331
$display("mama 5_2");
11332
          end
11333
          if (stop_checking_frame == 0)
11334
            disable send_packet1;
11335
        end
11336
      join
11337
      // ONLY IF packet was received!
11338
$display("mama 6");
11339
      if (tmp_bd[15] === 0)
11340
      begin
11341
        // check length of a PACKET
11342
        if (tmp_bd[31:16] != (i_length + 4))
11343
        begin
11344
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11345
                          tmp_bd[31:16], (i_length + 4));
11346
          test_fail("Wrong length of the packet out from PHY");
11347
          fail = fail + 1;
11348
        end
11349
        // check received RX packet data and CRC
11350
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11351
        begin
11352
          if (num_of_frames[1] == 1'b0)
11353
          begin
11354
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11355
          end
11356
          else
11357
          begin
11358
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11359
          end
11360
          if (tmp > 0)
11361
          begin
11362
            `TIME; $display("*E Wrong data of the received packet");
11363
            test_fail("Wrong data of the received packet");
11364
            fail = fail + 1;
11365
          end
11366
        end
11367
        else // if PREVIOUS RX buffer descriptor was ready
11368
        begin
11369
          if (num_of_frames[1] == 1'b0)
11370
          begin
11371
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11372
          end
11373
          else
11374
          begin
11375
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11376
          end
11377
          if (tmp > 0)
11378
          begin
11379
            `TIME; $display("*E Wrong data of the received packet");
11380
            test_fail("Wrong data of the received packet");
11381
            fail = fail + 1;
11382
          end
11383
        end
11384
      end
11385
      // check WB INT signal
11386
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11387
      begin
11388
        if (wb_int !== 1'b0)
11389
        begin
11390
          `TIME; $display("*E WB INT signal should not be set");
11391
          test_fail("WB INT signal should not be set");
11392
          fail = fail + 1;
11393
        end
11394
      end
11395
      else
11396
      begin
11397
        if (wb_int !== 1'b1)
11398
        begin
11399
          `TIME; $display("*E WB INT signal should be set");
11400
          test_fail("WB INT signal should be set");
11401
          fail = fail + 1;
11402
        end
11403
      end
11404
      // check RX buffer descriptor of a packet - only 15 LSBits
11405
      check_rx_bd(118, data);
11406
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11407
      begin
11408
        if (data[15:0] !== 16'hE000)
11409
        begin
11410
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11411
          test_fail("RX buffer descriptor status is not correct");
11412
          fail = fail + 1;
11413
        end
11414
      end
11415
      else // interrupt enabled
11416
      begin
11417
        if (data[15:0] !== 16'h6000)
11418
        begin
11419
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11420
          test_fail("RX buffer descriptor status is not correct");
11421
          fail = fail + 1;
11422
        end
11423
      end
11424
      // check interrupts
11425
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11426
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11427
      begin
11428
        if (data !== 0)
11429
        begin
11430
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11431
          test_fail("Any of interrupts was set");
11432
          fail = fail + 1;
11433
        end
11434
      end
11435
      else
11436
      begin
11437
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11438
        begin
11439
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11440
          test_fail("Interrupt Receive Buffer was not set");
11441
          fail = fail + 1;
11442
        end
11443
        if ((data & (~`ETH_INT_RXB)) !== 0)
11444
        begin
11445
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11446
          test_fail("Other interrupts (except Receive Buffer) were set");
11447
          fail = fail + 1;
11448
        end
11449
      end
11450
      // clear interrupts
11451
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11452
      // check WB INT signal
11453
      if (wb_int !== 1'b0)
11454
      begin
11455
        test_fail("WB INT signal should not be set");
11456
        fail = fail + 1;
11457
      end
11458
      // disable RX after two packets
11459
      if (num_of_frames[0] == 1'b1)
11460
      begin
11461
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11462
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11463
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11464
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11465
      end
11466
      // the number of frame transmitted
11467
      num_of_frames = num_of_frames + 1;
11468
      num_of_bd = 0;
11469
      // set length (LOOP variable)
11470
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11471
        i_length = (max_tmp - 4);
11472
      @(posedge wb_clk);
11473
    end
11474
    // disable RX
11475
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11476
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11477
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11478
    if(fail == 0)
11479
      test_ok;
11480
    else
11481
      fail = 0;
11482
  end
11483
 
11484
 
11485
  ////////////////////////////////////////////////////////////////////
11486
  ////                                                            ////
11487 209 tadejm
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11488
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
11489
  ////                                                            ////
11490
  ////////////////////////////////////////////////////////////////////
11491 243 tadejm
  if (test_num == 4) // 
11492 209 tadejm
  begin
11493 243 tadejm
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
11494
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
11495
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
11496 209 tadejm
 
11497
    // unmask interrupts
11498
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11499
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11500
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11501
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11502
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11503
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11504
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11505
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11506
    // prepare two packets of MAXFL length
11507
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11508
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11509
    min_tmp = tmp[31:16];
11510
    st_data = 8'h0F;
11511
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11512
    st_data = 8'h1A;
11513
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11514
    // check WB INT signal
11515
    if (wb_int !== 1'b0)
11516
    begin
11517
      test_fail("WB INT signal should not be set");
11518
      fail = fail + 1;
11519
    end
11520
 
11521
    // write to phy's control register for 10Mbps
11522
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11523
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11524
    speed = 10;
11525
 
11526
    i_length = (min_tmp - 4);
11527
    while (i_length <= (max_tmp - 4))
11528
    begin
11529
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11530
      case (i_length[1:0])
11531
      2'h0: // Interrupt is generated
11532
      begin
11533
        // enable interrupt generation
11534
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11535
        // unmask interrupts
11536
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11537
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11538
        // not detect carrier sense in FD and no collision
11539
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11540
        eth_phy.collision(0);
11541
      end
11542
      2'h1: // Interrupt is not generated
11543
      begin
11544
        // enable interrupt generation
11545
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11546
        // mask interrupts
11547
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11548
        // detect carrier sense in FD and no collision
11549
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11550
        eth_phy.collision(0);
11551
      end
11552
      2'h2: // Interrupt is not generated
11553
      begin
11554
        // disable interrupt generation
11555
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11556
        // unmask interrupts
11557
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11558
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11559
        // not detect carrier sense in FD and set collision
11560
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11561
        eth_phy.collision(1);
11562
      end
11563
      default: // 2'h3: // Interrupt is not generated
11564
      begin
11565
        // disable interrupt generation
11566
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11567
        // mask interrupts
11568
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11569
        // detect carrier sense in FD and set collision
11570
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11571
        eth_phy.collision(1);
11572
      end
11573
      endcase
11574
      if (i_length[0] == 1'b0)
11575
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11576
      else
11577
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11578
      // set wrap bit
11579
      set_rx_bd_wrap(127);
11580
      set_rx_bd_empty(127, 127);
11581
      fork
11582
        begin
11583
          if (i_length[0] == 1'b0)
11584
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11585
          else
11586
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11587
          repeat(10) @(posedge mrx_clk);
11588
        end
11589
        begin
11590
          #1 check_rx_bd(127, data);
11591
          if (i_length < min_tmp) // just first four
11592
          begin
11593
            while (data[15] === 1)
11594
            begin
11595
              #1 check_rx_bd(127, data);
11596
              @(posedge wb_clk);
11597
            end
11598
            repeat (1) @(posedge wb_clk);
11599
          end
11600
          else
11601
          begin
11602
            wait (MRxDV === 1'b1); // start transmit
11603
            #1 check_rx_bd(127, data);
11604
            if (data[15] !== 1)
11605
            begin
11606
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11607
              fail = fail + 1;
11608
            end
11609
            wait (MRxDV === 1'b0); // end transmit
11610
            while (data[15] === 1)
11611
            begin
11612
              #1 check_rx_bd(127, data);
11613
              @(posedge wb_clk);
11614
            end
11615
            repeat (1) @(posedge wb_clk);
11616
          end
11617
        end
11618
      join
11619
      // check length of a PACKET
11620
      if (data[31:16] != (i_length + 4))
11621
      begin
11622
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11623
                        data[31:16], (i_length + 4));
11624
        test_fail("Wrong length of the packet out from PHY");
11625
        fail = fail + 1;
11626
      end
11627
      // checking in the following if statement is performed only for first and last 64 lengths
11628
      // check received RX packet data and CRC
11629
      if (i_length[0] == 1'b0)
11630
      begin
11631
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11632
      end
11633
      else
11634
      begin
11635
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11636
      end
11637
      if (tmp > 0)
11638
      begin
11639
        `TIME; $display("*E Wrong data of the received packet");
11640
        test_fail("Wrong data of the received packet");
11641
        fail = fail + 1;
11642
      end
11643
      // check WB INT signal
11644
      if (i_length[1:0] == 2'h0)
11645
      begin
11646
        if (wb_int !== 1'b1)
11647
        begin
11648
          `TIME; $display("*E WB INT signal should be set");
11649
          test_fail("WB INT signal should be set");
11650
          fail = fail + 1;
11651
        end
11652
      end
11653
      else
11654
      begin
11655
        if (wb_int !== 1'b0)
11656
        begin
11657
          `TIME; $display("*E WB INT signal should not be set");
11658
          test_fail("WB INT signal should not be set");
11659
          fail = fail + 1;
11660
        end
11661
      end
11662
      // check RX buffer descriptor of a packet
11663
      check_rx_bd(127, data);
11664
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
11665
      begin
11666
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
11667
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
11668
        begin
11669
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11670
          test_fail("RX buffer descriptor status is not correct");
11671
          fail = fail + 1;
11672
        end
11673
      end
11674
      else // interrupt not enabled
11675
      begin
11676
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
11677
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
11678
        begin
11679
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11680
          test_fail("RX buffer descriptor status is not correct");
11681
          fail = fail + 1;
11682
        end
11683
      end
11684
      // clear RX buffer descriptor for first 4 frames
11685
      if (i_length < min_tmp)
11686
        clear_rx_bd(127, 127);
11687
      // check interrupts
11688
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11689
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11690
      begin
11691
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11692
        begin
11693
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11694
          test_fail("Interrupt Receive Buffer was not set");
11695
          fail = fail + 1;
11696
        end
11697
        if ((data & (~`ETH_INT_RXB)) !== 0)
11698
        begin
11699
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11700
          test_fail("Other interrupts (except Receive Buffer) were set");
11701
          fail = fail + 1;
11702
        end
11703
      end
11704
      else
11705
      begin
11706
        if (data !== 0)
11707
        begin
11708
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
11709
          test_fail("Any of interrupts (except Receive Buffer) was set");
11710
          fail = fail + 1;
11711
        end
11712
      end
11713
      // clear interrupts
11714
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11715
      // check WB INT signal
11716
      if (wb_int !== 1'b0)
11717
      begin
11718
        test_fail("WB INT signal should not be set");
11719
        fail = fail + 1;
11720
      end
11721
      // INTERMEDIATE DISPLAYS
11722
      if ((i_length + 4) == (min_tmp + 64))
11723
      begin
11724
        // starting length is min_tmp, ending length is (min_tmp + 64)
11725
        $display("    receive small packets is NOT selected");
11726
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
11727
                 min_tmp, (min_tmp + 64));
11728
        // set receive small, remain the rest
11729
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11730
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11731
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11732
      end
11733
      else if ((i_length + 4) == (max_tmp - 16))
11734
      begin
11735
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
11736
        $display("    receive small packets is selected");
11737
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
11738
                 (min_tmp + 64 + 128), tmp_data);
11739
        // reset receive small, remain the rest
11740
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11741
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11742
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11743
      end
11744
      else if ((i_length + 4) == max_tmp)
11745
      begin
11746
        $display("    receive small packets is NOT selected");
11747
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
11748
                 (max_tmp - (4 + 16)), max_tmp);
11749
      end
11750
      // set length (loop variable)
11751
      if ((i_length + 4) < (min_tmp + 64))
11752
        i_length = i_length + 1;
11753
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
11754
      begin
11755
        i_length = i_length + 128;
11756
        tmp_data = i_length + 4; // last tmp_data is ending length
11757
      end
11758
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
11759
        i_length = max_tmp - (4 + 16);
11760
      else if ((i_length + 4) >= (max_tmp - 16))
11761
        i_length = i_length + 1;
11762
      else
11763
      begin
11764
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
11765
        #10 $stop;
11766
      end
11767
    end
11768
    // disable RX
11769
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11770
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11771
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11772
    if(fail == 0)
11773
      test_ok;
11774
    else
11775
      fail = 0;
11776
  end
11777
 
11778
 
11779
  ////////////////////////////////////////////////////////////////////
11780
  ////                                                            ////
11781
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11782
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
11783
  ////                                                            ////
11784
  ////////////////////////////////////////////////////////////////////
11785 243 tadejm
  if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
11786 209 tadejm
  begin
11787 243 tadejm
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
11788
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
11789
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
11790 209 tadejm
 
11791
    // unmask interrupts
11792
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11793
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11794
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11795
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11796
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11797
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11798
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11799
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11800
    // prepare two packets of MAXFL length
11801
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11802
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11803
    min_tmp = tmp[31:16];
11804
    st_data = 8'h0F;
11805
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11806
    st_data = 8'h1A;
11807
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11808
    // check WB INT signal
11809
    if (wb_int !== 1'b0)
11810
    begin
11811
      test_fail("WB INT signal should not be set");
11812
      fail = fail + 1;
11813
    end
11814
 
11815
    // write to phy's control register for 100Mbps
11816
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11817
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11818
    speed = 100;
11819
 
11820
    i_length = (min_tmp - 4);
11821
    while (i_length <= (max_tmp - 4))
11822
    begin
11823
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11824
      case (i_length[1:0])
11825
      2'h0: // Interrupt is generated
11826
      begin
11827
        // enable interrupt generation
11828
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11829
        // unmask interrupts
11830
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11831
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11832
        // not detect carrier sense in FD and no collision
11833
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11834
        eth_phy.collision(0);
11835
      end
11836
      2'h1: // Interrupt is not generated
11837
      begin
11838
        // enable interrupt generation
11839
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11840
        // mask interrupts
11841
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11842
        // detect carrier sense in FD and no collision
11843
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11844
        eth_phy.collision(0);
11845
      end
11846
      2'h2: // Interrupt is not generated
11847
      begin
11848
        // disable interrupt generation
11849
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11850
        // unmask interrupts
11851
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11852
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11853
        // not detect carrier sense in FD and set collision
11854
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11855
        eth_phy.collision(1);
11856
      end
11857
      default: // 2'h3: // Interrupt is not generated
11858
      begin
11859
        // disable interrupt generation
11860
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11861
        // mask interrupts
11862
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11863
        // detect carrier sense in FD and set collision
11864
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11865
        eth_phy.collision(1);
11866
      end
11867
      endcase
11868
      if (i_length[0] == 1'b0)
11869
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11870
      else
11871
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11872
      // set wrap bit
11873
      set_rx_bd_wrap(127);
11874
      set_rx_bd_empty(127, 127);
11875
      fork
11876
        begin
11877
          if (i_length[0] == 1'b0)
11878
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11879
          else
11880
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11881
          repeat(10) @(posedge mrx_clk);
11882
        end
11883
        begin
11884
          #1 check_rx_bd(127, data);
11885
          if (i_length < min_tmp) // just first four
11886
          begin
11887
            while (data[15] === 1)
11888
            begin
11889
              #1 check_rx_bd(127, data);
11890
              @(posedge wb_clk);
11891
            end
11892
            repeat (1) @(posedge wb_clk);
11893
          end
11894
          else
11895
          begin
11896
            wait (MRxDV === 1'b1); // start transmit
11897
            #1 check_rx_bd(127, data);
11898
            if (data[15] !== 1)
11899
            begin
11900
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11901
              fail = fail + 1;
11902
            end
11903
            wait (MRxDV === 1'b0); // end transmit
11904
            while (data[15] === 1)
11905
            begin
11906
              #1 check_rx_bd(127, data);
11907
              @(posedge wb_clk);
11908
            end
11909
            repeat (1) @(posedge wb_clk);
11910
          end
11911
        end
11912
      join
11913
      // check length of a PACKET
11914
      if (data[31:16] != (i_length + 4))
11915
      begin
11916
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11917
                        data[31:16], (i_length + 4));
11918
        test_fail("Wrong length of the packet out from PHY");
11919
        fail = fail + 1;
11920
      end
11921
      // checking in the following if statement is performed only for first and last 64 lengths
11922
      // check received RX packet data and CRC
11923
      if (i_length[0] == 1'b0)
11924
      begin
11925
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11926
      end
11927
      else
11928
      begin
11929
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11930
      end
11931
      if (tmp > 0)
11932
      begin
11933
        `TIME; $display("*E Wrong data of the received packet");
11934
        test_fail("Wrong data of the received packet");
11935
        fail = fail + 1;
11936
      end
11937
      // check WB INT signal
11938
      if (i_length[1:0] == 2'h0)
11939
      begin
11940
        if (wb_int !== 1'b1)
11941
        begin
11942
          `TIME; $display("*E WB INT signal should be set");
11943
          test_fail("WB INT signal should be set");
11944
          fail = fail + 1;
11945
        end
11946
      end
11947
      else
11948
      begin
11949
        if (wb_int !== 1'b0)
11950
        begin
11951
          `TIME; $display("*E WB INT signal should not be set");
11952
          test_fail("WB INT signal should not be set");
11953
          fail = fail + 1;
11954
        end
11955
      end
11956
      // check RX buffer descriptor of a packet
11957
      check_rx_bd(127, data);
11958
      if (i_length[1] == 1'b0) // interrupt enabled 
11959
      begin
11960
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
11961
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
11962
        begin
11963
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11964
          test_fail("RX buffer descriptor status is not correct");
11965
          fail = fail + 1;
11966
        end
11967
      end
11968
      else // interrupt not enabled
11969
      begin
11970
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
11971
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
11972
        begin
11973
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11974
          test_fail("RX buffer descriptor status is not correct");
11975
          fail = fail + 1;
11976
        end
11977
      end
11978
      // clear RX buffer descriptor for first 4 frames
11979
      if (i_length < min_tmp)
11980
        clear_rx_bd(127, 127);
11981
      // check interrupts
11982
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11983
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11984
      begin
11985
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11986
        begin
11987
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11988
          test_fail("Interrupt Receive Buffer was not set");
11989
          fail = fail + 1;
11990
        end
11991
        if ((data & (~`ETH_INT_RXB)) !== 0)
11992
        begin
11993
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11994
          test_fail("Other interrupts (except Receive Buffer) were set");
11995
          fail = fail + 1;
11996
        end
11997
      end
11998
      else
11999
      begin
12000
        if (data !== 0)
12001
        begin
12002
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12003
          test_fail("Any of interrupts (except Receive Buffer) was set");
12004
          fail = fail + 1;
12005
        end
12006
      end
12007
      // clear interrupts
12008
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12009
      // check WB INT signal
12010
      if (wb_int !== 1'b0)
12011
      begin
12012
        test_fail("WB INT signal should not be set");
12013
        fail = fail + 1;
12014
      end
12015
      // INTERMEDIATE DISPLAYS
12016
      if ((i_length + 4) == (min_tmp + 64))
12017
      begin
12018
        // starting length is min_tmp, ending length is (min_tmp + 64)
12019
        $display("    receive small packets is NOT selected");
12020
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12021
                 min_tmp, (min_tmp + 64));
12022
        // set receive small, remain the rest
12023
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12024
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12025
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12026
      end
12027
      else if ((i_length + 4) == (max_tmp - 16))
12028
      begin
12029
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12030
        $display("    receive small packets is selected");
12031
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12032
                 (min_tmp + 64 + 128), tmp_data);
12033
        // reset receive small, remain the rest
12034
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12035
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12036
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12037
      end
12038
      else if ((i_length + 4) == max_tmp)
12039
      begin
12040
        $display("    receive small packets is NOT selected");
12041
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12042
                 (max_tmp - (4 + 16)), max_tmp);
12043
      end
12044
      // set length (loop variable)
12045
      if ((i_length + 4) < (min_tmp + 64))
12046
        i_length = i_length + 1;
12047
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12048
      begin
12049
        i_length = i_length + 128;
12050
        tmp_data = i_length + 4; // last tmp_data is ending length
12051
      end
12052
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12053
        i_length = max_tmp - (4 + 16);
12054
      else if ((i_length + 4) >= (max_tmp - 16))
12055
        i_length = i_length + 1;
12056
      else
12057
      begin
12058
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12059
        #10 $stop;
12060
      end
12061
    end
12062
    // disable RX
12063
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12064
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12065
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12066
    if(fail == 0)
12067
      test_ok;
12068
    else
12069
      fail = 0;
12070
  end
12071
 
12072
 
12073
  ////////////////////////////////////////////////////////////////////
12074
  ////                                                            ////
12075
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12076
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
12077
  ////                                                            ////
12078
  ////////////////////////////////////////////////////////////////////
12079 243 tadejm
  if (test_num == 6) // 
12080 209 tadejm
  begin
12081 243 tadejm
    // TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
12082
    test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
12083
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
12084 209 tadejm
 
12085
    // reset MAC registers
12086
    hard_reset;
12087
    // reset MAC and MII LOGIC with soft reset
12088
    reset_mac;
12089
    reset_mii;
12090
    // set wb slave response
12091
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12092
 
12093
    max_tmp = 0;
12094
    min_tmp = 0;
12095
    num_of_frames = 0;
12096
    num_of_bd = 0;
12097
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12098
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12099
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12100
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12101
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12102
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12103
    // prepare two packets of MAXFL length
12104
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12105
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12106
    min_tmp = tmp[31:16];
12107
    st_data = 8'hAC;
12108
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12109
    st_data = 8'h35;
12110
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12111
    // check WB INT signal
12112
    if (wb_int !== 1'b0)
12113
    begin
12114
      test_fail("WB INT signal should not be set");
12115
      fail = fail + 1;
12116
    end
12117
 
12118
    // write to phy's control register for 10Mbps
12119
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12120
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12121
    speed = 10;
12122
 
12123
    i_length = (min_tmp - 4);
12124
    while (i_length <= (max_tmp - 4))
12125
    begin
12126
      // append CRC to packet
12127
      if (i_length[0] == 1'b0)
12128
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12129
      else
12130
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12131
      // choose generating carrier sense and collision
12132
      case (i_length[1:0])
12133
      2'h0: // Interrupt is generated
12134
      begin
12135
        // Reset_tx_bd nable interrupt generation
12136
        // unmask interrupts
12137
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12138
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12139
        // not detect carrier sense in FD and no collision
12140
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12141
        eth_phy.collision(0);
12142
      end
12143
      2'h1: // Interrupt is not generated
12144
      begin
12145
        // set_tx_bd enable interrupt generation
12146
        // mask interrupts
12147
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12148
        // detect carrier sense in FD and no collision
12149
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12150
        eth_phy.collision(0);
12151
      end
12152
      2'h2: // Interrupt is not generated
12153
      begin
12154
        // set_tx_bd disable the interrupt generation
12155
        // unmask interrupts
12156
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12157
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12158
        // not detect carrier sense in FD and set collision
12159
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12160
        eth_phy.collision(1);
12161
      end
12162
      default: // 2'h3: // Interrupt is not generated
12163
      begin
12164
        // set_tx_bd disable the interrupt generation
12165
        // mask interrupts
12166
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12167
        // detect carrier sense in FD and set collision
12168
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12169
        eth_phy.collision(1);
12170
      end
12171
      endcase
12172
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12173
      // number of all frames is 154 (146 without first 8)
12174
      if (num_of_frames < 8)
12175
      begin
12176
        case (i_length[1:0])
12177
        2'h0: // Interrupt is generated
12178
        begin
12179
          // enable interrupt generation
12180
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12181
          // interrupts are unmasked
12182
        end
12183
        2'h1: // Interrupt is not generated
12184
        begin
12185
          // enable interrupt generation
12186
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12187
          // interrupts are masked
12188
        end
12189
        2'h2: // Interrupt is not generated
12190
        begin
12191
          // disable interrupt generation
12192
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12193
          // interrupts are unmasked
12194
        end
12195
        default: // 2'h3: // Interrupt is not generated
12196
        begin
12197
          // disable interrupt generation
12198
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12199
          // interrupts are masked
12200
        end
12201
        endcase
12202
        // set wrap bit
12203
        set_rx_bd_wrap(0);
12204
      end
12205
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12206
      else if ((num_of_frames - 8) == 0)
12207
      begin
12208
        tmp_len = i_length; // length of frame
12209
        tmp_bd_num = 0; // RX BD number
12210
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12211
        begin
12212
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12213
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12214
          if (tmp_len[0] == 0)
12215
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12216
          else
12217
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12218
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12219
          if ((tmp_len + 4) < (min_tmp + 128))
12220
            tmp_len = tmp_len + 1;
12221
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12222
            tmp_len = 256;
12223
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12224
            tmp_len = tmp_len + 128;
12225
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12226
            tmp_len = max_tmp - (4 + 16);
12227
          else if ((tmp_len + 4) >= (max_tmp - 16))
12228
            tmp_len = tmp_len + 1;
12229
          // set RX BD number
12230
          tmp_bd_num = tmp_bd_num + 1;
12231
        end
12232
        // set wrap bit
12233
        set_rx_bd_wrap(127);
12234
      end
12235
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12236
      else if ((num_of_frames - 8) == 20) // 128
12237
      begin
12238
        tmp_len = tmp_len; // length of frame remaines from previous settings
12239
        tmp_bd_num = 0; // TX BD number
12240
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12241
        begin
12242
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12243
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12244
          if (tmp_len[0] == 0)
12245
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12246
          else
12247
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12248
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12249
          if ((tmp_len + 4) < (min_tmp + 128))
12250
            tmp_len = tmp_len + 1;
12251
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12252
            tmp_len = 256;
12253
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12254
            tmp_len = tmp_len + 128;
12255
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12256
            tmp_len = max_tmp - (4 + 16);
12257
          else if ((tmp_len + 4) >= (max_tmp - 16))
12258
            tmp_len = tmp_len + 1;
12259
          // set TX BD number
12260
          tmp_bd_num = tmp_bd_num + 1;
12261
        end
12262
      end
12263
      // set empty bit
12264
      if (num_of_frames < 8)
12265
        set_rx_bd_empty(0, 0);
12266
      else if ((num_of_frames - 8) < 128)
12267
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12268
      else if ((num_of_frames - 136) < 19)
12269
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12270
      // CHECK END OF RECEIVE
12271
      fork
12272
        begin
12273
          if (i_length[0] == 1'b0)
12274
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12275
          else
12276
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12277
          repeat(10) @(posedge mrx_clk);
12278
        end
12279
        begin
12280
          #1 check_rx_bd(num_of_bd, data);
12281
          if (i_length < min_tmp) // just first four
12282
          begin
12283
            while (data[15] === 1)
12284
            begin
12285
              #1 check_rx_bd(num_of_bd, data);
12286
              @(posedge wb_clk);
12287
            end
12288
            repeat (1) @(posedge wb_clk);
12289
          end
12290
          else
12291
          begin
12292
            wait (MRxDV === 1'b1); // start transmit
12293
            #1 check_rx_bd(num_of_bd, data);
12294
            if (data[15] !== 1)
12295
            begin
12296
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12297
              fail = fail + 1;
12298
            end
12299
            wait (MRxDV === 1'b0); // end transmit
12300
            while (data[15] === 1)
12301
            begin
12302
              #1 check_rx_bd(num_of_bd, data);
12303
              @(posedge wb_clk);
12304
            end
12305
            repeat (1) @(posedge wb_clk);
12306
          end
12307
        end
12308
      join
12309
      // check length of a PACKET
12310
      if (data[31:16] != (i_length + 4))
12311
      begin
12312
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12313
                        data[31:16], (i_length + 4));
12314
        test_fail("Wrong length of the packet out from PHY");
12315
        fail = fail + 1;
12316
      end
12317
      // checking in the following if statement is performed only for first and last 64 lengths
12318
      // check received RX packet data and CRC
12319
      if (i_length[0] == 1'b0)
12320
      begin
12321
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12322
      end
12323
      else
12324
      begin
12325
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12326
      end
12327
      if (tmp > 0)
12328
      begin
12329
        `TIME; $display("*E Wrong data of the received packet");
12330
        test_fail("Wrong data of the received packet");
12331
        fail = fail + 1;
12332
      end
12333
      // check WB INT signal
12334
      if (i_length[1:0] == 2'h0)
12335
      begin
12336
        if (wb_int !== 1'b1)
12337
        begin
12338
          `TIME; $display("*E WB INT signal should be set");
12339
          test_fail("WB INT signal should be set");
12340
          fail = fail + 1;
12341
        end
12342
      end
12343
      else
12344
      begin
12345
        if (wb_int !== 1'b0)
12346
        begin
12347
          `TIME; $display("*E WB INT signal should not be set");
12348
          test_fail("WB INT signal should not be set");
12349
          fail = fail + 1;
12350
        end
12351
      end
12352
      // check RX buffer descriptor of a packet
12353
      check_rx_bd(num_of_bd, data);
12354
      if (i_length[1] == 1'b0) // interrupt enabled
12355
      begin
12356
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12357
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12358
        begin
12359
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12360
          test_fail("RX buffer descriptor status is not correct");
12361
          fail = fail + 1;
12362
        end
12363
      end
12364
      else // interrupt not enabled
12365
      begin
12366
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12367
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12368
        begin
12369
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12370
          test_fail("RX buffer descriptor status is not correct");
12371
          fail = fail + 1;
12372
        end
12373
      end
12374
      // clear first half of 8 frames from RX buffer descriptor 0
12375
      if (num_of_frames < 4)
12376
        clear_rx_bd(num_of_bd, num_of_bd);
12377
      // clear BD with wrap bit
12378
      if (num_of_frames == 140)
12379
        clear_rx_bd(127, 127);
12380
      // check interrupts
12381
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12382
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12383
      begin
12384
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12385
        begin
12386
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12387
          test_fail("Interrupt Receive Buffer was not set");
12388
          fail = fail + 1;
12389
        end
12390
        if ((data & (~`ETH_INT_RXB)) !== 0)
12391
        begin
12392
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12393
          test_fail("Other interrupts (except Receive Buffer) were set");
12394
          fail = fail + 1;
12395
        end
12396
      end
12397
      else
12398
      begin
12399
        if (data !== 0)
12400
        begin
12401
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12402
          test_fail("Any of interrupts (except Receive Buffer) was set");
12403
          fail = fail + 1;
12404
        end
12405
      end
12406
      // clear interrupts
12407
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12408
      // check WB INT signal
12409
      if (wb_int !== 1'b0)
12410
      begin
12411
        test_fail("WB INT signal should not be set");
12412
        fail = fail + 1;
12413
      end
12414
      // INTERMEDIATE DISPLAYS
12415
      if ((i_length + 4) == (min_tmp + 7))
12416
      begin
12417
        // starting length is min_tmp, ending length is (min_tmp + 128)
12418
        $display("    receive small packets is NOT selected");
12419
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12420
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12421
                 min_tmp, (min_tmp + 7));
12422
        $display("    ->all packets were received on RX BD 0");
12423
        // reset receive small, remain the rest
12424
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12425
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12426
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12427
      end
12428
      else if ((i_length + 4) == (min_tmp + 128))
12429
      begin
12430
        // starting length is min_tmp, ending length is (min_tmp + 128)
12431
        $display("    receive small packets is NOT selected");
12432
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12433
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12434
                 (min_tmp + 8), (min_tmp + 128));
12435
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12436
                 1'b0, num_of_bd);
12437
        tmp_bd = num_of_bd + 1;
12438
        // set receive small, remain the rest
12439
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12440
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12441
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12442
      end
12443
      else if ((i_length + 4) == (max_tmp - 16))
12444
      begin
12445
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12446
        $display("    receive small packets is selected");
12447
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12448
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12449
                 (min_tmp + 64 + 128), tmp_data);
12450
        if (tmp_bd > num_of_bd)
12451
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12452
                   tmp_bd, num_of_bd);
12453
        else
12454
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12455
                   tmp_bd, num_of_bd);
12456
        tmp_bd = num_of_bd + 1;
12457
        // reset receive small, remain the rest
12458
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12459
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12460
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12461
      end
12462
      else if ((i_length + 4) == max_tmp)
12463
      begin
12464
        $display("    receive small packets is NOT selected");
12465
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12466
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12467
                 (max_tmp - (4 + 16)), max_tmp);
12468
        if (tmp_bd > num_of_bd)
12469
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12470
                   tmp_bd, num_of_bd);
12471
        else
12472
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12473
                   tmp_bd, num_of_bd);
12474
      end
12475
      // set length (loop variable)
12476
      if ((i_length + 4) < (min_tmp + 128))
12477
        i_length = i_length + 1;
12478
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12479
        i_length = 256;
12480
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12481
      begin
12482
        i_length = i_length + 128;
12483
        tmp_data = i_length + 4; // last tmp_data is ending length
12484
      end
12485
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12486
        i_length = max_tmp - (4 + 16);
12487
      else if ((i_length + 4) >= (max_tmp - 16))
12488
        i_length = i_length + 1;
12489
      else
12490
      begin
12491
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12492
        #10 $stop;
12493
      end
12494
      // the number of frame transmitted
12495
      num_of_frames = num_of_frames + 1;
12496
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12497
        num_of_bd = 0;
12498
      else
12499
        num_of_bd = num_of_bd + 1;
12500
    end
12501
    // disable RX
12502
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12503
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12504
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12505
    @(posedge wb_clk);
12506
    if(fail == 0)
12507
      test_ok;
12508
    else
12509
      fail = 0;
12510
  end
12511
 
12512
 
12513
  ////////////////////////////////////////////////////////////////////
12514
  ////                                                            ////
12515
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12516
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
12517
  ////                                                            ////
12518
  ////////////////////////////////////////////////////////////////////
12519 243 tadejm
  if (test_num == 7) // 
12520 209 tadejm
  begin
12521 243 tadejm
    // TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
12522
    test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
12523
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
12524 209 tadejm
 
12525
    // reset MAC registers
12526
    hard_reset;
12527
    // reset MAC and MII LOGIC with soft reset
12528
    reset_mac;
12529
    reset_mii;
12530
    // set wb slave response
12531
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12532
 
12533
    max_tmp = 0;
12534
    min_tmp = 0;
12535
    num_of_frames = 0;
12536
    num_of_bd = 0;
12537
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12538
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12539
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12540
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12541
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12542
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12543
    // prepare two packets of MAXFL length
12544
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12545
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12546
    min_tmp = tmp[31:16];
12547
    st_data = 8'hAC;
12548
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12549
    st_data = 8'h35;
12550
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12551
    // check WB INT signal
12552
    if (wb_int !== 1'b0)
12553
    begin
12554
      test_fail("WB INT signal should not be set");
12555
      fail = fail + 1;
12556
    end
12557
 
12558
    // write to phy's control register for 100Mbps
12559
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
12560
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
12561
    speed = 100;
12562
 
12563
    i_length = (min_tmp - 4);
12564
    while (i_length <= (max_tmp - 4))
12565
    begin
12566
      // append CRC to packet
12567
      if (i_length[0] == 1'b0)
12568
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12569
      else
12570
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12571
      // choose generating carrier sense and collision
12572
      case (i_length[1:0])
12573
      2'h0: // Interrupt is generated
12574
      begin
12575
        // Reset_tx_bd nable interrupt generation
12576
        // unmask interrupts
12577
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12578
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12579
        // not detect carrier sense in FD and no collision
12580
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12581
        eth_phy.collision(0);
12582
      end
12583
      2'h1: // Interrupt is not generated
12584
      begin
12585
        // set_tx_bd enable interrupt generation
12586
        // mask interrupts
12587
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12588
        // detect carrier sense in FD and no collision
12589
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12590
        eth_phy.collision(0);
12591
      end
12592
      2'h2: // Interrupt is not generated
12593
      begin
12594
        // set_tx_bd disable the interrupt generation
12595
        // unmask interrupts
12596
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12597
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12598
        // not detect carrier sense in FD and set collision
12599
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12600
        eth_phy.collision(1);
12601
      end
12602
      default: // 2'h3: // Interrupt is not generated
12603
      begin
12604
        // set_tx_bd disable the interrupt generation
12605
        // mask interrupts
12606
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12607
        // detect carrier sense in FD and set collision
12608
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12609
        eth_phy.collision(1);
12610
      end
12611
      endcase
12612
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12613
      // number of all frames is 154 (146 without first 8)
12614
      if (num_of_frames < 8)
12615
      begin
12616
        case (i_length[1:0])
12617
        2'h0: // Interrupt is generated
12618
        begin
12619
          // enable interrupt generation
12620
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12621
          // interrupts are unmasked
12622
        end
12623
        2'h1: // Interrupt is not generated
12624
        begin
12625
          // enable interrupt generation
12626
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12627
          // interrupts are masked
12628
        end
12629
        2'h2: // Interrupt is not generated
12630
        begin
12631
          // disable interrupt generation
12632
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12633
          // interrupts are unmasked
12634
        end
12635
        default: // 2'h3: // Interrupt is not generated
12636
        begin
12637
          // disable interrupt generation
12638
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12639
          // interrupts are masked
12640
        end
12641
        endcase
12642
        // set wrap bit
12643
        set_rx_bd_wrap(0);
12644
      end
12645
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12646
      else if ((num_of_frames - 8) == 0)
12647
      begin
12648
        tmp_len = i_length; // length of frame
12649
        tmp_bd_num = 0; // RX BD number
12650
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12651
        begin
12652
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12653
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12654
          if (tmp_len[0] == 0)
12655
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12656
          else
12657
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12658
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12659
          if ((tmp_len + 4) < (min_tmp + 128))
12660
            tmp_len = tmp_len + 1;
12661
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12662
            tmp_len = 256;
12663
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12664
            tmp_len = tmp_len + 128;
12665
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12666
            tmp_len = max_tmp - (4 + 16);
12667
          else if ((tmp_len + 4) >= (max_tmp - 16))
12668
            tmp_len = tmp_len + 1;
12669
          // set RX BD number
12670
          tmp_bd_num = tmp_bd_num + 1;
12671
        end
12672
        // set wrap bit
12673
        set_rx_bd_wrap(127);
12674
      end
12675
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12676
      else if ((num_of_frames - 8) == 20) // 128
12677
      begin
12678
        tmp_len = tmp_len; // length of frame remaines from previous settings
12679
        tmp_bd_num = 0; // TX BD number
12680
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12681
        begin
12682
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12683
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12684
          if (tmp_len[0] == 0)
12685
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12686
          else
12687
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12688
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12689
          if ((tmp_len + 4) < (min_tmp + 128))
12690
            tmp_len = tmp_len + 1;
12691
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12692
            tmp_len = 256;
12693
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12694
            tmp_len = tmp_len + 128;
12695
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12696
            tmp_len = max_tmp - (4 + 16);
12697
          else if ((tmp_len + 4) >= (max_tmp - 16))
12698
            tmp_len = tmp_len + 1;
12699
          // set TX BD number
12700
          tmp_bd_num = tmp_bd_num + 1;
12701
        end
12702
      end
12703
      // set empty bit
12704
      if (num_of_frames < 8)
12705
        set_rx_bd_empty(0, 0);
12706
      else if ((num_of_frames - 8) < 128)
12707
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12708
      else if ((num_of_frames - 136) < 19)
12709
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12710
      // CHECK END OF RECEIVE
12711
      fork
12712
        begin
12713
          if (i_length[0] == 1'b0)
12714
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12715
          else
12716
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12717
          repeat(10) @(posedge mrx_clk);
12718
        end
12719
        begin
12720
          #1 check_rx_bd(num_of_bd, data);
12721
          if (i_length < min_tmp) // just first four
12722
          begin
12723
            while (data[15] === 1)
12724
            begin
12725
              #1 check_rx_bd(num_of_bd, data);
12726
              @(posedge wb_clk);
12727
            end
12728
            repeat (1) @(posedge wb_clk);
12729
          end
12730
          else
12731
          begin
12732
            wait (MRxDV === 1'b1); // start transmit
12733
            #1 check_rx_bd(num_of_bd, data);
12734
            if (data[15] !== 1)
12735
            begin
12736
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12737
              fail = fail + 1;
12738
            end
12739
            wait (MRxDV === 1'b0); // end transmit
12740
            while (data[15] === 1)
12741
            begin
12742
              #1 check_rx_bd(num_of_bd, data);
12743
              @(posedge wb_clk);
12744
            end
12745
            repeat (1) @(posedge wb_clk);
12746
          end
12747
        end
12748
      join
12749
      // check length of a PACKET
12750
      if (data[31:16] != (i_length + 4))
12751
      begin
12752
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12753
                        data[31:16], (i_length + 4));
12754
        test_fail("Wrong length of the packet out from PHY");
12755
        fail = fail + 1;
12756
      end
12757
      // check received RX packet data and CRC
12758
      if (i_length[0] == 1'b0)
12759
      begin
12760
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12761
      end
12762
      else
12763
      begin
12764
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12765
      end
12766
      if (tmp > 0)
12767
      begin
12768
        `TIME; $display("*E Wrong data of the received packet");
12769
        test_fail("Wrong data of the received packet");
12770
        fail = fail + 1;
12771
      end
12772
      // check WB INT signal
12773
      if (i_length[1:0] == 2'h0)
12774
      begin
12775
        if (wb_int !== 1'b1)
12776
        begin
12777
          `TIME; $display("*E WB INT signal should be set");
12778
          test_fail("WB INT signal should be set");
12779
          fail = fail + 1;
12780
        end
12781
      end
12782
      else
12783
      begin
12784
        if (wb_int !== 1'b0)
12785
        begin
12786
          `TIME; $display("*E WB INT signal should not be set");
12787
          test_fail("WB INT signal should not be set");
12788
          fail = fail + 1;
12789
        end
12790
      end
12791
      // check RX buffer descriptor of a packet
12792
      check_rx_bd(num_of_bd, data);
12793
      if (i_length[1] == 1'b0) // interrupt enabled
12794
      begin
12795
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12796
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12797
        begin
12798
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12799
          test_fail("RX buffer descriptor status is not correct");
12800
          fail = fail + 1;
12801
        end
12802
      end
12803
      else // interrupt not enabled
12804
      begin
12805
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12806
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12807
        begin
12808
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12809
          test_fail("RX buffer descriptor status is not correct");
12810
          fail = fail + 1;
12811
        end
12812
      end
12813
      // clear first half of 8 frames from RX buffer descriptor 0
12814
      if (num_of_frames < 4)
12815
        clear_rx_bd(num_of_bd, num_of_bd);
12816
      // clear BD with wrap bit
12817
      if (num_of_frames == 140)
12818
        clear_rx_bd(127, 127);
12819
      // check interrupts
12820
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12821
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12822
      begin
12823
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12824
        begin
12825
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12826
          test_fail("Interrupt Receive Buffer was not set");
12827
          fail = fail + 1;
12828
        end
12829
        if ((data & (~`ETH_INT_RXB)) !== 0)
12830
        begin
12831
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12832
          test_fail("Other interrupts (except Receive Buffer) were set");
12833
          fail = fail + 1;
12834
        end
12835
      end
12836
      else
12837
      begin
12838
        if (data !== 0)
12839
        begin
12840
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12841
          test_fail("Any of interrupts (except Receive Buffer) was set");
12842
          fail = fail + 1;
12843
        end
12844
      end
12845
      // clear interrupts
12846
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12847
      // check WB INT signal
12848
      if (wb_int !== 1'b0)
12849
      begin
12850
        test_fail("WB INT signal should not be set");
12851
        fail = fail + 1;
12852
      end
12853
      // INTERMEDIATE DISPLAYS
12854
      if ((i_length + 4) == (min_tmp + 7))
12855
      begin
12856
        // starting length is min_tmp, ending length is (min_tmp + 128)
12857
        $display("    receive small packets is NOT selected");
12858
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12859
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12860
                 min_tmp, (min_tmp + 7));
12861
        $display("    ->all packets were received on RX BD 0");
12862
        // reset receive small, remain the rest
12863
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12864
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12865
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12866
      end
12867
      else if ((i_length + 4) == (min_tmp + 128))
12868
      begin
12869
        // starting length is min_tmp, ending length is (min_tmp + 128)
12870
        $display("    receive small packets is NOT selected");
12871
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12872
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12873
                 (min_tmp + 8), (min_tmp + 128));
12874
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12875
                 1'b0, num_of_bd);
12876
        tmp_bd = num_of_bd + 1;
12877
        // set receive small, remain the rest
12878
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12879
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12880
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12881
      end
12882
      else if ((i_length + 4) == (max_tmp - 16))
12883
      begin
12884
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12885
        $display("    receive small packets is selected");
12886
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12887
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12888
                 (min_tmp + 64 + 128), tmp_data);
12889
        if (tmp_bd > num_of_bd)
12890
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12891
                   tmp_bd, num_of_bd);
12892
        else
12893
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12894
                   tmp_bd, num_of_bd);
12895
        tmp_bd = num_of_bd + 1;
12896
        // reset receive small, remain the rest
12897
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12898
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12899
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12900
      end
12901
      else if ((i_length + 4) == max_tmp)
12902
      begin
12903
        $display("    receive small packets is NOT selected");
12904
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12905
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12906
                 (max_tmp - (4 + 16)), max_tmp);
12907
        if (tmp_bd > num_of_bd)
12908
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12909
                   tmp_bd, num_of_bd);
12910
        else
12911
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12912
                   tmp_bd, num_of_bd);
12913
      end
12914
      // set length (loop variable)
12915
      if ((i_length + 4) < (min_tmp + 128))
12916
        i_length = i_length + 1;
12917
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12918
        i_length = 256;
12919
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12920
      begin
12921
        i_length = i_length + 128;
12922
        tmp_data = i_length + 4; // last tmp_data is ending length
12923
      end
12924
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12925
        i_length = max_tmp - (4 + 16);
12926
      else if ((i_length + 4) >= (max_tmp - 16))
12927
        i_length = i_length + 1;
12928
      else
12929
      begin
12930
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12931
        #10 $stop;
12932
      end
12933
      // the number of frame transmitted
12934
      num_of_frames = num_of_frames + 1;
12935
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12936
        num_of_bd = 0;
12937
      else
12938
        num_of_bd = num_of_bd + 1;
12939
    end
12940
    // disable RX
12941
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12942
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12943
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12944
    @(posedge wb_clk);
12945
    if(fail == 0)
12946
      test_ok;
12947
    else
12948
      fail = 0;
12949
  end
12950
 
12951
 
12952
  ////////////////////////////////////////////////////////////////////
12953
  ////                                                            ////
12954 243 tadejm
  ////  Test receive packets form 0 to (MINFL + 12) sizes at       ////
12955 209 tadejm
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
12956
  ////                                                            ////
12957
  ////////////////////////////////////////////////////////////////////
12958 243 tadejm
  if (test_num == 8) // 
12959 209 tadejm
  begin
12960 243 tadejm
    // TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
12961
    test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
12962
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
12963 209 tadejm
 
12964
    // reset MAC registers
12965
    hard_reset;
12966
    // reset MAC and MII LOGIC with soft reset
12967
    reset_mac;
12968
    reset_mii;
12969
    // set wb slave response
12970
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12971
 
12972
    max_tmp = 0;
12973
    min_tmp = 0;
12974
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
12975
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12976
    // enable RX, set full-duplex mode, receive small, NO correct IFG
12977
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12978
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12979
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12980
    // prepare two packets of MAXFL length
12981
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12982
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12983
    min_tmp = tmp[31:16];
12984
    st_data = 8'hAC;
12985
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12986
    st_data = 8'h35;
12987
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12988
    // check WB INT signal
12989
    if (wb_int !== 1'b0)
12990
    begin
12991
      test_fail("WB INT signal should not be set");
12992
      fail = fail + 1;
12993
    end
12994 243 tadejm
    // unmask interrupts
12995
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12996
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12997 209 tadejm
 
12998
    // write to phy's control register for 10Mbps
12999
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
13000
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
13001
    speed = 10;
13002
 
13003 243 tadejm
    frame_ended = 0;
13004
    num_of_frames = 0;// 0; // 10;
13005
    num_of_bd = 120;
13006
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13007
    while ((i_length + 4) < 78) // (min_tmp - 4))
13008 209 tadejm
    begin
13009 243 tadejm
      // append CRC to packet
13010
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13011
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13012
      else if (num_of_frames > 4)
13013
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13014 209 tadejm
      // choose generating carrier sense and collision
13015
      case (i_length[1:0])
13016 243 tadejm
      2'h0:
13017 209 tadejm
      begin
13018
        // not detect carrier sense in FD and no collision
13019 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13020 209 tadejm
        eth_phy.collision(0);
13021
      end
13022 243 tadejm
      2'h1:
13023 209 tadejm
      begin
13024
        // detect carrier sense in FD and no collision
13025 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13026 209 tadejm
        eth_phy.collision(0);
13027
      end
13028 243 tadejm
      2'h2:
13029 209 tadejm
      begin
13030
        // not detect carrier sense in FD and set collision
13031 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13032 209 tadejm
        eth_phy.collision(1);
13033
      end
13034 243 tadejm
      default: // 2'h3:
13035 209 tadejm
      begin
13036
        // detect carrier sense in FD and set collision
13037 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13038 209 tadejm
        eth_phy.collision(1);
13039
      end
13040
      endcase
13041
      #1;
13042 243 tadejm
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13043 209 tadejm
      if (num_of_frames <= 9)
13044
      begin
13045 243 tadejm
        case (i_length[1:0])
13046
        2'h0: // Interrupt is generated
13047
        begin
13048
          // enable interrupt generation
13049
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13050
        end
13051
        2'h1: // Interrupt is generated
13052
        begin
13053
          // enable interrupt generation
13054
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13055
        end
13056
        2'h2: // Interrupt is generated
13057
        begin
13058
          // enable interrupt generation
13059
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13060
        end
13061
        default: // 2'h3: // Interrupt is generated
13062
        begin
13063
          // enable interrupt generation
13064
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13065
        end
13066
        endcase
13067 209 tadejm
        // set wrap bit
13068 243 tadejm
        set_rx_bd_wrap(120);
13069 209 tadejm
      end
13070 243 tadejm
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13071 209 tadejm
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13072
      begin
13073
        tmp_len = i_length; // length of frame
13074 243 tadejm
        tmp_bd_num = 120; // RX BD number
13075
        while (tmp_bd_num < 124) // 
13076 209 tadejm
        begin
13077
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13078
          if (tmp_len[0] == 0)
13079 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13080 209 tadejm
          else
13081 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13082
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13083 209 tadejm
          tmp_len = tmp_len + 1;
13084 243 tadejm
          // set RX BD number
13085 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13086
        end
13087
        // set wrap bit
13088 243 tadejm
        set_rx_bd_wrap(123);
13089 209 tadejm
      end
13090 243 tadejm
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13091 209 tadejm
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13092
      begin
13093
        tmp_len = i_length; // length of frame
13094 243 tadejm
        tmp_bd_num = 120; // RX BD number
13095
        while (tmp_bd_num < 125) // 
13096 209 tadejm
        begin
13097
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13098
          if (tmp_len[0] == 0)
13099 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13100 209 tadejm
          else
13101 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13102
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13103 209 tadejm
          tmp_len = tmp_len + 1;
13104 243 tadejm
          // set RX BD number
13105 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13106
        end
13107
        // set wrap bit
13108 243 tadejm
        set_rx_bd_wrap(124);
13109 209 tadejm
      end
13110 243 tadejm
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13111 209 tadejm
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13112
      begin
13113
        tmp_len = i_length; // length of frame
13114 243 tadejm
        tmp_bd_num = 120; // RX BD number
13115
        while (tmp_bd_num < 126) // 
13116 209 tadejm
        begin
13117
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13118
          if (tmp_len[0] == 0)
13119 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13120 209 tadejm
          else
13121 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13122
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13123 209 tadejm
          tmp_len = tmp_len + 1;
13124 243 tadejm
          // set RX BD number
13125 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13126
        end
13127
        // set wrap bit
13128 243 tadejm
        set_rx_bd_wrap(125);
13129 209 tadejm
      end
13130 243 tadejm
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13131 209 tadejm
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13132
      begin
13133
        tmp_len = i_length; // length of frame
13134 243 tadejm
        tmp_bd_num = 120; // RX BD number
13135
        while (tmp_bd_num < 127) // 
13136 209 tadejm
        begin
13137
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13138
          if (tmp_len[0] == 0)
13139 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13140 209 tadejm
          else
13141 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13142
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13143 209 tadejm
          tmp_len = tmp_len + 1;
13144 243 tadejm
          // set RX BD number
13145 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13146
        end
13147
        // set wrap bit
13148 243 tadejm
        set_rx_bd_wrap(126);
13149 209 tadejm
      end
13150 243 tadejm
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13151 209 tadejm
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13152
      begin
13153
        tmp_len = i_length; // length of frame
13154 243 tadejm
        tmp_bd_num = 120; // RX BD number
13155
        while (tmp_bd_num < 128) // 
13156 209 tadejm
        begin
13157
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13158
          if (tmp_len[0] == 0)
13159 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13160 209 tadejm
          else
13161 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13162
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13163 209 tadejm
          tmp_len = tmp_len + 1;
13164 243 tadejm
          // set RX BD number
13165 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13166
        end
13167
        // set wrap bit
13168 243 tadejm
        set_rx_bd_wrap(127);
13169 209 tadejm
      end
13170 243 tadejm
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13171
      else if (num_of_frames == 70)
13172
      begin
13173
        tmp_len = i_length; // length of frame
13174
        tmp_bd_num = 120; // RX BD number
13175
        while (tmp_bd_num < 128) // 
13176
        begin
13177
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13178
          if (tmp_len[0] == 0)
13179
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13180
          else
13181
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13182
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13183
          tmp_len = tmp_len + 1;
13184
          // set RX BD number
13185
          tmp_bd_num = tmp_bd_num + 1;
13186
        end
13187
        // set wrap bit
13188
        set_rx_bd_wrap(127);
13189
      end
13190 209 tadejm
      #1;
13191 243 tadejm
      // SET empty bit
13192 209 tadejm
      if (num_of_frames < 10)
13193 243 tadejm
        set_rx_bd_empty(120, 120);
13194 209 tadejm
      else if (num_of_frames < 14)
13195 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13196 209 tadejm
      else if (num_of_frames < 18)
13197 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13198 209 tadejm
      else if (num_of_frames < 23)
13199 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13200 209 tadejm
      else if (num_of_frames < 28)
13201 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13202 209 tadejm
      else if (num_of_frames < 34)
13203 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13204 209 tadejm
      else if (num_of_frames < 40)
13205 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13206 209 tadejm
      else if (num_of_frames < 47)
13207 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13208 209 tadejm
      else if (num_of_frames < 54)
13209 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13210 209 tadejm
      else if (num_of_frames < 62)
13211 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13212 209 tadejm
      else if (num_of_frames < 70)
13213 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13214
      else if (num_of_frames < 78)
13215
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13216
      // CHECK END OF RECEIVE
13217
      frame_ended = 0;
13218
      check_frame = 0;
13219 209 tadejm
      fork
13220
        begin
13221 243 tadejm
          if (i_length[0] == 1'b0)
13222
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13223
          else
13224
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13225
          repeat(10) @(posedge mrx_clk);
13226
        end
13227
        begin: fr_end1
13228
          wait (MRxDV === 1'b1); // start receive
13229
          #1 check_rx_bd(num_of_bd, data);
13230
          if (data[15] !== 1)
13231 209 tadejm
          begin
13232 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13233
            fail = fail + 1;
13234 209 tadejm
          end
13235 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13236
          while ((data[15] === 1) && (check_frame == 0))
13237
          begin
13238
            #1 check_rx_bd(num_of_bd, data);
13239
            @(posedge wb_clk);
13240
          end
13241
          if (data[15] === 0)
13242
            frame_ended = 1;
13243
          repeat (1) @(posedge wb_clk);
13244 209 tadejm
        end
13245 243 tadejm
        begin
13246
          wait (MRxDV === 1'b1); // start receive
13247
          wait (MRxDV === 1'b0); // end receive
13248
          repeat(10) @(posedge mrx_clk);
13249
          repeat(15) @(posedge wb_clk);
13250
          check_frame = 1;
13251
        end
13252
      join
13253
      // check length of a PACKET
13254
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
13255
           ((data[31:16] != 0) && (num_of_frames < 3)) )
13256
      begin
13257
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13258
                        data[31:16], (i_length + 4));
13259
        test_fail("Wrong length of the packet out from PHY");
13260
        fail = fail + 1;
13261
      end
13262
      // check received RX packet data and CRC
13263
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
13264
      begin                                           // CRC has 4 bytes for itself
13265
        if (i_length[0] == 1'b0)
13266
        begin
13267
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13268
        end
13269 209 tadejm
        else
13270
        begin
13271 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13272 209 tadejm
        end
13273 243 tadejm
        if (tmp > 0)
13274
        begin
13275
          `TIME; $display("*E Wrong data of the received packet");
13276
          test_fail("Wrong data of the received packet");
13277
          fail = fail + 1;
13278
        end
13279 209 tadejm
      end
13280 243 tadejm
 
13281
      // check WB INT signal
13282
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
13283
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
13284
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
13285
        begin
13286
          `TIME; $display("*E WB INT signal should be set");
13287
          test_fail("WB INT signal should be set");
13288
          fail = fail + 1;
13289
        end
13290
      end
13291
      else
13292
      begin
13293
        if (wb_int !== 1'b0)
13294
        begin
13295
          `TIME; $display("*E WB INT signal should not be set");
13296
          test_fail("WB INT signal should not be set");
13297
          fail = fail + 1;
13298
        end
13299
      end
13300
 
13301
      // check RX buffer descriptor of a packet
13302
      if (num_of_frames >= min_tmp)
13303
      begin
13304
        if ( (data[15:0] !== 16'h6000) && // wrap bit
13305
             (data[15:0] !== 16'h4000) ) // without wrap bit
13306
        begin
13307
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13308
          test_fail("RX buffer descriptor status is not correct");
13309
          fail = fail + 1;
13310
        end
13311
      end
13312
      else if (num_of_frames > 4)
13313
      begin
13314
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13315
             (data[15:0] !== 16'h4004) ) // without wrap bit
13316
        begin
13317
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13318
          test_fail("RX buffer descriptor status is not correct");
13319
          fail = fail + 1;
13320
        end
13321
      end
13322
      else if (num_of_frames > 2)
13323
      begin
13324
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13325
             (data[15:0] !== 16'h4006) ) // without wrap bit
13326
        begin
13327
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13328
          test_fail("RX buffer descriptor status is not correct");
13329
          fail = fail + 1;
13330
        end
13331
      end
13332
      else
13333
      begin
13334
        if (data[15] !== 1'b1)
13335
        begin
13336
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13337
          test_fail("RX buffer descriptor status is not correct");
13338
          fail = fail + 1;
13339
        end
13340
      end
13341
      // check interrupts
13342
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13343 209 tadejm
      if (num_of_frames >= 5)
13344
      begin
13345 243 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13346 209 tadejm
        begin
13347 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13348
          test_fail("Interrupt Receive Buffer was not set");
13349
          fail = fail + 1;
13350 209 tadejm
        end
13351 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13352 209 tadejm
        begin
13353 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13354
          test_fail("Other interrupts (except Receive Buffer) were set");
13355
          fail = fail + 1;
13356 209 tadejm
        end
13357 243 tadejm
      end
13358
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
13359
      begin
13360
        if (data) // Checking if any interrupt is pending)
13361 209 tadejm
        begin
13362 243 tadejm
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
13363
          test_fail("Interrupts were set");
13364
          fail = fail + 1;
13365
        end
13366
      end
13367
      else
13368
      begin
13369
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
13370
        begin
13371
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13372
          test_fail("Interrupt Receive Buffer Error was not set");
13373
          fail = fail + 1;
13374
        end
13375
        if ((data & (~`ETH_INT_RXE)) !== 0)
13376
        begin
13377
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13378
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13379
          fail = fail + 1;
13380
        end
13381
      end
13382
      // clear interrupts
13383
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13384
      // check WB INT signal
13385
      if (wb_int !== 1'b0)
13386
      begin
13387
        test_fail("WB INT signal should not be set");
13388
        fail = fail + 1;
13389
      end
13390
      // INTERMEDIATE DISPLAYS
13391
      if (num_of_frames == 3)
13392
      begin
13393
        $display("    pads appending to packets is selected");
13394
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13395
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13396
                 0, 3);
13397
      end
13398
      else if (num_of_frames == 9)
13399
      begin
13400
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13401
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13402
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13403
                 5, 9);
13404
      end
13405
      else if (num_of_frames == 17)
13406
      begin
13407
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13408
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13409
                 10, 17);
13410
      end
13411
      else if (num_of_frames == 27)
13412
      begin
13413
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13414
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13415
                 18, 27);
13416
      end
13417
      else if (num_of_frames == 40)
13418
      begin
13419
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13420
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13421
                 28, 40);
13422
      end
13423
      else if (num_of_frames == 54)
13424
      begin
13425
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13426
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13427
                 41, 54);
13428
      end
13429
      else if (num_of_frames == 69)
13430
      begin
13431
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13432
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13433
                 55, 69);
13434
      end
13435
      else if (num_of_frames == 69)
13436
      begin
13437
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13438
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13439
                 55, 69);
13440
      end
13441
      else if (num_of_frames == 77)
13442
      begin
13443
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13444
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13445
                 70, 77);
13446
      end
13447
      // set length (loop variable)
13448
      i_length = i_length + 1;
13449
      // the number of frame transmitted
13450
      num_of_frames = num_of_frames + 1;
13451
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13452
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13453
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13454
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13455
        num_of_bd = 120;
13456
      else
13457
        num_of_bd = num_of_bd + 1;
13458
    end
13459
    // disable RX
13460
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13461
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13462
    @(posedge wb_clk);
13463
    if(fail == 0)
13464
      test_ok;
13465
    else
13466
      fail = 0;
13467
  end
13468
 
13469
 
13470
  ////////////////////////////////////////////////////////////////////
13471
  ////                                                            ////
13472
  ////  Test receive packets form 0 to (MINFL + 12) sizes at      ////
13473
  ////  8 RX buffer decriptors ( 100Mbps ).                       ////
13474
  ////                                                            ////
13475
  ////////////////////////////////////////////////////////////////////
13476
  if (test_num == 9) // 
13477
  begin
13478
    // TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
13479
    test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
13480
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
13481
 
13482
    // reset MAC registers
13483
    hard_reset;
13484
    // reset MAC and MII LOGIC with soft reset
13485
    reset_mac;
13486
    reset_mii;
13487
    // set wb slave response
13488
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13489
 
13490
    max_tmp = 0;
13491
    min_tmp = 0;
13492
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
13493
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13494
    // enable RX, set full-duplex mode, receive small, NO correct IFG
13495
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13496
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13497
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13498
    // prepare two packets of MAXFL length
13499
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13500
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13501
    min_tmp = tmp[31:16];
13502
    st_data = 8'hAC;
13503
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13504
    st_data = 8'h35;
13505
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13506
    // check WB INT signal
13507
    if (wb_int !== 1'b0)
13508
    begin
13509
      test_fail("WB INT signal should not be set");
13510
      fail = fail + 1;
13511
    end
13512
    // unmask interrupts
13513
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13514
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13515
 
13516
    // write to phy's control register for 100Mbps
13517
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
13518
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
13519
    speed = 100;
13520
 
13521
    frame_ended = 0;
13522
    num_of_frames = 0;
13523
    num_of_bd = 120;
13524
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13525
    while ((i_length + 4) < 78) // (min_tmp - 4))
13526
    begin
13527
      // append CRC to packet
13528
      if ((i_length[0] == 1'b0) && (i_length > 0))
13529
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13530
      else if (i_length > 0)
13531
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13532
      // choose generating carrier sense and collision
13533
      case (i_length[1:0])
13534
      2'h0:
13535
      begin
13536
        // not detect carrier sense in FD and no collision
13537
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13538
        eth_phy.collision(0);
13539
      end
13540
      2'h1:
13541
      begin
13542
        // detect carrier sense in FD and no collision
13543
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13544
        eth_phy.collision(0);
13545
      end
13546
      2'h2:
13547
      begin
13548
        // not detect carrier sense in FD and set collision
13549
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13550
        eth_phy.collision(1);
13551
      end
13552
      default: // 2'h3:
13553
      begin
13554
        // detect carrier sense in FD and set collision
13555
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13556
        eth_phy.collision(1);
13557
      end
13558
      endcase
13559
      #1;
13560
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13561
      if (num_of_frames <= 9)
13562
      begin
13563
        case (i_length[1:0])
13564
        2'h0: // Interrupt is generated
13565
        begin
13566
          // enable interrupt generation
13567
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13568
        end
13569
        2'h1: // Interrupt is generated
13570
        begin
13571
          // enable interrupt generation
13572
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13573
        end
13574
        2'h2: // Interrupt is generated
13575
        begin
13576
          // enable interrupt generation
13577
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13578
        end
13579
        default: // 2'h3: // Interrupt is generated
13580
        begin
13581
          // enable interrupt generation
13582
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13583
        end
13584
        endcase
13585
        // set wrap bit
13586
        set_rx_bd_wrap(120);
13587
      end
13588
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13589
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13590
      begin
13591
        tmp_len = i_length; // length of frame
13592
        tmp_bd_num = 120; // RX BD number
13593
        while (tmp_bd_num < 124) // 
13594
        begin
13595
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13596
          if (tmp_len[0] == 0)
13597
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13598
          else
13599
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13600
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13601
          tmp_len = tmp_len + 1;
13602
          // set RX BD number
13603
          tmp_bd_num = tmp_bd_num + 1;
13604
        end
13605
        // set wrap bit
13606
        set_rx_bd_wrap(123);
13607
      end
13608
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13609
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13610
      begin
13611
        tmp_len = i_length; // length of frame
13612
        tmp_bd_num = 120; // RX BD number
13613
        while (tmp_bd_num < 125) // 
13614
        begin
13615
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13616
          if (tmp_len[0] == 0)
13617
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13618
          else
13619
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13620
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13621
          tmp_len = tmp_len + 1;
13622
          // set RX BD number
13623
          tmp_bd_num = tmp_bd_num + 1;
13624
        end
13625
        // set wrap bit
13626
        set_rx_bd_wrap(124);
13627
      end
13628
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13629
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13630
      begin
13631
        tmp_len = i_length; // length of frame
13632
        tmp_bd_num = 120; // RX BD number
13633
        while (tmp_bd_num < 126) // 
13634
        begin
13635
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13636
          if (tmp_len[0] == 0)
13637
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13638
          else
13639
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13640
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13641
          tmp_len = tmp_len + 1;
13642
          // set RX BD number
13643
          tmp_bd_num = tmp_bd_num + 1;
13644
        end
13645
        // set wrap bit
13646
        set_rx_bd_wrap(125);
13647
      end
13648
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13649
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13650
      begin
13651
        tmp_len = i_length; // length of frame
13652
        tmp_bd_num = 120; // RX BD number
13653
        while (tmp_bd_num < 127) // 
13654
        begin
13655
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13656
          if (tmp_len[0] == 0)
13657
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13658
          else
13659
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13660
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13661
          tmp_len = tmp_len + 1;
13662
          // set RX BD number
13663
          tmp_bd_num = tmp_bd_num + 1;
13664
        end
13665
        // set wrap bit
13666
        set_rx_bd_wrap(126);
13667
      end
13668
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13669
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13670
      begin
13671
        tmp_len = i_length; // length of frame
13672
        tmp_bd_num = 120; // RX BD number
13673
        while (tmp_bd_num < 128) // 
13674
        begin
13675
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13676
          if (tmp_len[0] == 0)
13677
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13678
          else
13679
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13680
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13681
          tmp_len = tmp_len + 1;
13682
          // set RX BD number
13683
          tmp_bd_num = tmp_bd_num + 1;
13684
        end
13685
        // set wrap bit
13686
        set_rx_bd_wrap(127);
13687
      end
13688
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13689
      else if (num_of_frames == 70)
13690
      begin
13691
        tmp_len = i_length; // length of frame
13692
        tmp_bd_num = 120; // RX BD number
13693
        while (tmp_bd_num < 128) // 
13694
        begin
13695
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13696
          if (tmp_len[0] == 0)
13697
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13698
          else
13699
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13700
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13701
          tmp_len = tmp_len + 1;
13702
          // set RX BD number
13703
          tmp_bd_num = tmp_bd_num + 1;
13704
        end
13705
        // set wrap bit
13706
        set_rx_bd_wrap(127);
13707
      end
13708
      #1;
13709
      // SET empty bit
13710
      if (num_of_frames < 10)
13711
        set_rx_bd_empty(120, 120);
13712
      else if (num_of_frames < 14)
13713
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13714
      else if (num_of_frames < 18)
13715
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13716
      else if (num_of_frames < 23)
13717
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13718
      else if (num_of_frames < 28)
13719
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13720
      else if (num_of_frames < 34)
13721
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13722
      else if (num_of_frames < 40)
13723
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13724
      else if (num_of_frames < 47)
13725
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13726
      else if (num_of_frames < 54)
13727
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13728
      else if (num_of_frames < 62)
13729
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13730
      else if (num_of_frames < 70)
13731
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13732
      else if (num_of_frames < 78)
13733
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13734
      // CHECK END OF RECEIVE
13735
      frame_ended = 0;
13736
      check_frame = 0;
13737
      fork
13738
        begin
13739
          if (i_length[0] == 1'b0)
13740
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13741
          else
13742
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13743
          repeat(10) @(posedge mrx_clk);
13744
        end
13745
        begin: fr_end2
13746
          wait (MRxDV === 1'b1); // start receive
13747
          #1 check_rx_bd(num_of_bd, data);
13748
          if (data[15] !== 1)
13749 209 tadejm
          begin
13750 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13751 209 tadejm
            fail = fail + 1;
13752
          end
13753 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13754
          while ((data[15] === 1) && (check_frame == 0))
13755
          begin
13756
            #1 check_rx_bd(num_of_bd, data);
13757
            @(posedge wb_clk);
13758
          end
13759
          if (data[15] === 0)
13760
            frame_ended = 1;
13761
          repeat (1) @(posedge wb_clk);
13762 209 tadejm
        end
13763
        begin
13764 243 tadejm
          wait (MRxDV === 1'b1); // start receive
13765
          wait (MRxDV === 1'b0); // end receive
13766
          repeat(10) @(posedge mrx_clk);
13767
          repeat(15) @(posedge wb_clk);
13768
          check_frame = 1;
13769 209 tadejm
        end
13770 243 tadejm
      join
13771
      // check length of a PACKET
13772
      if ( (data[31:16] != (i_length + 4))/* && (frame_ended == 1)*/ )
13773
      begin
13774
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13775
                        data[31:16], (i_length + 4));
13776
        test_fail("Wrong length of the packet out from PHY");
13777
        fail = fail + 1;
13778
      end
13779
      // check received RX packet data and CRC
13780
      if ((frame_ended == 1) && (num_of_frames >= 5))
13781
      begin
13782
        if (i_length[0] == 1'b0)
13783 209 tadejm
        begin
13784 243 tadejm
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13785 209 tadejm
        end
13786 243 tadejm
        else
13787 209 tadejm
        begin
13788 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13789 209 tadejm
        end
13790
        if (tmp > 0)
13791
        begin
13792 243 tadejm
          `TIME; $display("*E Wrong data of the received packet");
13793
          test_fail("Wrong data of the received packet");
13794 209 tadejm
          fail = fail + 1;
13795
        end
13796
      end
13797 243 tadejm
 
13798 209 tadejm
      // check WB INT signal
13799 243 tadejm
      if (num_of_frames >= 5)
13800 209 tadejm
      begin
13801
        if (wb_int !== 1'b1)
13802
        begin
13803
          `TIME; $display("*E WB INT signal should be set");
13804
          test_fail("WB INT signal should be set");
13805
          fail = fail + 1;
13806
        end
13807
      end
13808
      else
13809
      begin
13810
        if (wb_int !== 1'b0)
13811
        begin
13812
          `TIME; $display("*E WB INT signal should not be set");
13813
          test_fail("WB INT signal should not be set");
13814
          fail = fail + 1;
13815
        end
13816
      end
13817 243 tadejm
 
13818
      // display RX buffer descriptor of a packet with length smaller than 7
13819
      check_rx_bd(num_of_bd, data);
13820
      if (num_of_frames <= 6)
13821 209 tadejm
      begin
13822 243 tadejm
        `TIME; $display("=> RX buffer descriptor is: %0h - len: %0d", data[15:0], num_of_frames);
13823
      end
13824
      // check RX buffer descriptor of a packet
13825
      if (num_of_frames >= min_tmp)
13826
      begin
13827
        if ( (data[15:0] !== 16'h6000) && // wrap bit
13828
             (data[15:0] !== 16'h4000) ) // without wrap bit
13829 209 tadejm
        begin
13830 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13831
          test_fail("RX buffer descriptor status is not correct");
13832
          fail = fail + 1;
13833 209 tadejm
        end
13834 243 tadejm
      end
13835
      else if (num_of_frames > 4)
13836
      begin
13837
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13838
             (data[15:0] !== 16'h4004) ) // without wrap bit
13839 209 tadejm
        begin
13840 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13841
          test_fail("RX buffer descriptor status is not correct");
13842
          fail = fail + 1;
13843 209 tadejm
        end
13844
      end
13845 243 tadejm
      else if (num_of_frames > 2)
13846
      begin
13847
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13848
             (data[15:0] !== 16'h4006) ) // without wrap bit
13849
        begin
13850
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13851
          test_fail("RX buffer descriptor status is not correct");
13852
          fail = fail + 1;
13853
        end
13854
      end
13855 209 tadejm
      else
13856
      begin
13857
        if (data[15] !== 1'b1)
13858
        begin
13859 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13860
          test_fail("RX buffer descriptor status is not correct");
13861 209 tadejm
          fail = fail + 1;
13862
        end
13863
      end
13864
      // check interrupts
13865
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13866 243 tadejm
      if (num_of_frames >= 40)
13867 209 tadejm
      begin
13868 243 tadejm
        if ((data & `ETH_INT_RXB) !== 1'b1)//`ETH_INT_RXB)
13869 209 tadejm
        begin
13870 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13871
          test_fail("Interrupt Receive Buffer was not set");
13872 209 tadejm
          fail = fail + 1;
13873
        end
13874 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13875 209 tadejm
        begin
13876 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13877
          test_fail("Other interrupts (except Receive Buffer) were set");
13878 209 tadejm
          fail = fail + 1;
13879
        end
13880
      end
13881
      else
13882
      begin
13883 243 tadejm
        if ((data & `ETH_INT_RXE) !== 1'b1)//`ETH_INT_RXE)
13884 209 tadejm
        begin
13885 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13886
          test_fail("Interrupt Receive Buffer Error was not set");
13887 209 tadejm
          fail = fail + 1;
13888
        end
13889 243 tadejm
        if ((data & (~`ETH_INT_RXE)) !== 0)
13890
        begin
13891
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13892
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13893
          fail = fail + 1;
13894
        end
13895 209 tadejm
      end
13896
      // clear interrupts
13897
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13898
      // check WB INT signal
13899
      if (wb_int !== 1'b0)
13900
      begin
13901
        test_fail("WB INT signal should not be set");
13902
        fail = fail + 1;
13903
      end
13904
      // INTERMEDIATE DISPLAYS
13905 243 tadejm
      if (num_of_frames == 3)
13906 209 tadejm
      begin
13907
        $display("    pads appending to packets is selected");
13908 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13909
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13910 209 tadejm
                 0, 3);
13911
      end
13912 243 tadejm
      else if (num_of_frames == 9)
13913 209 tadejm
      begin
13914 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13915
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13916 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13917
                 5, 9);
13918
      end
13919 243 tadejm
      else if (num_of_frames == 17)
13920 209 tadejm
      begin
13921 243 tadejm
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13922 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13923
                 10, 17);
13924
      end
13925 243 tadejm
      else if (num_of_frames == 27)
13926 209 tadejm
      begin
13927 243 tadejm
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13928 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13929
                 18, 27);
13930
      end
13931 243 tadejm
      else if (num_of_frames == 40)
13932 209 tadejm
      begin
13933 243 tadejm
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13934 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13935
                 28, 40);
13936
      end
13937 243 tadejm
      else if (num_of_frames == 54)
13938 209 tadejm
      begin
13939 243 tadejm
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13940 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13941
                 41, 54);
13942
      end
13943 243 tadejm
      else if (num_of_frames == 69)
13944 209 tadejm
      begin
13945 243 tadejm
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13946 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13947
                 55, 69);
13948
      end
13949 243 tadejm
      else if (num_of_frames == 69)
13950
      begin
13951
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13952
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13953
                 55, 69);
13954
      end
13955
      else if (num_of_frames == 77)
13956
      begin
13957
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13958
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13959
                 70, 77);
13960
      end
13961 209 tadejm
      // set length (loop variable)
13962
      i_length = i_length + 1;
13963
      // the number of frame transmitted
13964
      num_of_frames = num_of_frames + 1;
13965
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13966
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13967
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13968 243 tadejm
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13969
        num_of_bd = 120;
13970 209 tadejm
      else
13971
        num_of_bd = num_of_bd + 1;
13972
    end
13973 243 tadejm
    // disable RX
13974 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13975
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13976
    @(posedge wb_clk);
13977
    if(fail == 0)
13978
      test_ok;
13979
    else
13980
      fail = 0;
13981
  end
13982
 
13983
 
13984 243 tadejm
  ////////////////////////////////////////////////////////////////////
13985
  ////                                                            ////
13986
  ////  Test receive packet synchronization with receive          ////
13987
  ////  disable/enable ( 10Mbps ).                                ////
13988
  ////                                                            ////
13989
  ////////////////////////////////////////////////////////////////////
13990
  if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
13991
  begin
13992
    // TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
13993
    test_name   = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
13994
    `TIME; $display("  TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
13995 209 tadejm
 
13996 243 tadejm
 
13997
 
13998
 
13999
 
14000
 
14001
  end
14002
 
14003
 
14004
  ////////////////////////////////////////////////////////////////////
14005
  ////                                                            ////
14006
  ////  Test receive packet synchronization with receive          ////
14007
  ////  disable/enable ( 10Mbps ).                                ////
14008
  ////                                                            ////
14009
  ////////////////////////////////////////////////////////////////////
14010
  if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
14011
  begin
14012
    // TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14013
    test_name   = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14014
    `TIME; $display("  TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14015
 
14016
 
14017
 
14018
 
14019
 
14020
 
14021
  end
14022
 
14023
 
14024
  ////////////////////////////////////////////////////////////////////
14025
  ////                                                            ////
14026
  ////  Test receive packet synchronization with receive          ////
14027
  ////  disable/enable ( 10Mbps ).                                ////
14028
  ////                                                            ////
14029
  ////////////////////////////////////////////////////////////////////
14030
  if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
14031
  begin
14032
    // TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14033
    test_name   = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14034
    `TIME; $display("  TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14035
 
14036
 
14037
 
14038
 
14039
 
14040
 
14041
  end
14042
 
14043
 
14044
  ////////////////////////////////////////////////////////////////////
14045
  ////                                                            ////
14046
  ////  Test receive packet synchronization with receive          ////
14047
  ////  disable/enable ( 10Mbps ).                                ////
14048
  ////                                                            ////
14049
  ////////////////////////////////////////////////////////////////////
14050
  if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
14051
  begin
14052
    // TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14053
    test_name   = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14054
    `TIME; $display("  TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14055
 
14056
 
14057
 
14058
 
14059
 
14060
 
14061
  end
14062
 
14063
 
14064
 
14065 209 tadejm
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14066
 
14067
end
14068
endtask // test_mac_full_duplex_receive
14069
 
14070
 
14071
task test_mac_full_duplex_flow;
14072
  input  [31:0]  start_task;
14073
  input  [31:0]  end_task;
14074
  integer        bit_start_1;
14075
  integer        bit_end_1;
14076
  integer        bit_start_2;
14077
  integer        bit_end_2;
14078
  integer        num_of_reg;
14079
  integer        num_of_frames;
14080
  integer        num_of_bd;
14081
  integer        i_addr;
14082
  integer        i_data;
14083
  integer        i_length;
14084
  integer        tmp_len;
14085
  integer        tmp_bd;
14086
  integer        tmp_bd_num;
14087
  integer        tmp_data;
14088
  integer        tmp_ipgt;
14089
  integer        test_num;
14090
  reg    [31:0]  tx_bd_num;
14091
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
14092
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
14093
  integer        i;
14094
  integer        i1;
14095
  integer        i2;
14096
  integer        i3;
14097
  integer        fail;
14098
  integer        speed;
14099
  reg            frame_started;
14100
  reg            frame_ended;
14101
  reg            wait_for_frame;
14102
  reg    [31:0]  addr;
14103
  reg    [31:0]  data;
14104
  reg    [31:0]  tmp;
14105
  reg    [ 7:0]  st_data;
14106
  reg    [15:0]  max_tmp;
14107
  reg    [15:0]  min_tmp;
14108
begin
14109
// MAC FULL DUPLEX FLOW TEST
14110
test_heading("MAC FULL DUPLEX FLOW TEST");
14111
$display(" ");
14112
$display("MAC FULL DUPLEX FLOW TEST");
14113
fail = 0;
14114
 
14115
// reset MAC registers
14116
hard_reset;
14117
// reset MAC and MII LOGIC with soft reset
14118
reset_mac;
14119
reset_mii;
14120
// set wb slave response
14121
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14122
 
14123
  /*
14124
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
14125
  -------------------------------------------------------------------------------------
14126
  set_tx_bd
14127
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
14128
  set_tx_bd_wrap
14129
    (tx_bd_num_end[6:0]);
14130
  set_tx_bd_ready
14131
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14132
  check_tx_bd
14133
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
14134
  clear_tx_bd
14135
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14136
 
14137
  TASKS for set and control RX buffer descriptors:
14138
  ------------------------------------------------
14139
  set_rx_bd
14140
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
14141
  set_rx_bd_wrap
14142
    (rx_bd_num_end[6:0]);
14143
  set_rx_bd_empty
14144
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14145
  check_rx_bd
14146
    (rx_bd_num_end[6:0], rx_bd_status);
14147
  clear_rx_bd
14148
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14149
 
14150
  TASKS for set and check TX packets:
14151
  -----------------------------------
14152
  set_tx_packet
14153
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
14154
  check_tx_packet
14155
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
14156
 
14157
  TASKS for set and check RX packets:
14158
  -----------------------------------
14159
  set_rx_packet
14160
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
14161
  check_rx_packet
14162
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
14163
 
14164
  TASKS for append and check CRC to/of TX packet:
14165
  -----------------------------------------------
14166
  append_tx_crc
14167
    (txpnt_wb[31:0], len[15:0], negated_crc);
14168
  check_tx_crc
14169
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
14170
 
14171
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
14172
  --------------------------------------------------------------------------------
14173
  append_rx_crc
14174
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
14175
  */
14176
 
14177
//////////////////////////////////////////////////////////////////////
14178
////                                                              ////
14179
////  test_mac_full_duplex_flow:                                  ////
14180
////                                                              ////
14181
////  0: Test                                                     ////
14182
////                                                              ////
14183
//////////////////////////////////////////////////////////////////////
14184
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
14185
begin
14186
 
14187
  ////////////////////////////////////////////////////////////////////
14188
  ////                                                            ////
14189
  ////  Test                                                      ////
14190
  ////                                                            ////
14191
  ////////////////////////////////////////////////////////////////////
14192
  if (test_num == 0) // Test 
14193
  begin
14194
    // TEST 0: 
14195
    test_name   = "TEST 0: ";
14196
    `TIME; $display("  TEST 0: ");
14197
 
14198
 
14199
  end
14200
 
14201
 
14202
 
14203
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14204
 
14205
end
14206
endtask // test_mac_full_duplex_flow
14207
 
14208
 
14209 169 mohor
//////////////////////////////////////////////////////////////
14210
// WB Behavioral Models Basic tasks
14211
//////////////////////////////////////////////////////////////
14212
 
14213
task wbm_write;
14214
  input  [31:0] address_i;
14215
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
14216
  input  [3:0]  sel_i;
14217
  input  [31:0] size_i;
14218
  input  [3:0]  init_waits_i;
14219
  input  [3:0]  subseq_waits_i;
14220
 
14221
  reg `WRITE_STIM_TYPE write_data;
14222
  reg `WB_TRANSFER_FLAGS flags;
14223
  reg `WRITE_RETURN_TYPE write_status;
14224
  integer i;
14225
begin
14226
  write_status = 0;
14227
 
14228
  flags                    = 0;
14229
  flags`WB_TRANSFER_SIZE   = size_i;
14230
  flags`INIT_WAITS         = init_waits_i;
14231
  flags`SUBSEQ_WAITS       = subseq_waits_i;
14232
 
14233
  write_data               = 0;
14234
  write_data`WRITE_DATA    = data_i[31:0];
14235
  write_data`WRITE_ADDRESS = address_i;
14236
  write_data`WRITE_SEL     = sel_i;
14237
 
14238
  for (i = 0; i < size_i; i = i + 1)
14239
  begin
14240
    wb_master.blk_write_data[i] = write_data;
14241
    data_i                      = data_i >> 32;
14242
    write_data`WRITE_DATA       = data_i[31:0];
14243
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
14244 116 mohor
  end
14245
 
14246 169 mohor
  wb_master.wb_block_write(flags, write_status);
14247 116 mohor
 
14248 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
14249
  begin
14250
    `TIME;
14251
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
14252
  end
14253
end
14254
endtask // wbm_write
14255 116 mohor
 
14256 169 mohor
task wbm_read;
14257
  input  [31:0] address_i;
14258
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
14259
  input  [3:0]  sel_i;
14260
  input  [31:0] size_i;
14261
  input  [3:0]  init_waits_i;
14262
  input  [3:0]  subseq_waits_i;
14263
 
14264
  reg `READ_RETURN_TYPE read_data;
14265
  reg `WB_TRANSFER_FLAGS flags;
14266
  reg `READ_RETURN_TYPE read_status;
14267
  integer i;
14268
begin
14269
  read_status = 0;
14270
  data_o      = 0;
14271
 
14272
  flags                  = 0;
14273
  flags`WB_TRANSFER_SIZE = size_i;
14274
  flags`INIT_WAITS       = init_waits_i;
14275
  flags`SUBSEQ_WAITS     = subseq_waits_i;
14276
 
14277
  read_data              = 0;
14278
  read_data`READ_ADDRESS = address_i;
14279
  read_data`READ_SEL     = sel_i;
14280
 
14281
  for (i = 0; i < size_i; i = i + 1)
14282 116 mohor
  begin
14283 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
14284
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
14285
  end
14286
 
14287
  wb_master.wb_block_read(flags, read_status);
14288
 
14289
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
14290
  begin
14291
    `TIME;
14292
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
14293
  end
14294
 
14295
  for (i = 0; i < size_i; i = i + 1)
14296
  begin
14297
    data_o       = data_o << 32;
14298
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
14299
    data_o[31:0] = read_data`READ_DATA;
14300
  end
14301
end
14302
endtask // wbm_read
14303
 
14304
 
14305
//////////////////////////////////////////////////////////////
14306
// Ethernet Basic tasks
14307
//////////////////////////////////////////////////////////////
14308
 
14309
task hard_reset; //  MAC registers
14310
begin
14311
  // reset MAC registers
14312
  @(posedge wb_clk);
14313
  #2 wb_rst = 1'b1;
14314
  repeat(2) @(posedge wb_clk);
14315
  #2 wb_rst = 1'b0;
14316
end
14317
endtask // hard_reset
14318
 
14319
task reset_mac; //  MAC module
14320
  reg [31:0] tmp;
14321
  reg [31:0] tmp_no_rst;
14322
begin
14323
  // read MODER register first
14324
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14325
  // set reset bit - write back to MODER register with RESET bit
14326
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14327
  // clear reset bit - write back to MODER register without RESET bit
14328
  tmp_no_rst = `ETH_MODER_RST;
14329
  tmp_no_rst = ~tmp_no_rst;
14330
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14331
end
14332
endtask // reset_mac
14333
 
14334
task set_tx_bd;
14335
  input  [6:0]  tx_bd_num_start;
14336
  input  [6:0]  tx_bd_num_end;
14337
  input  [15:0] len;
14338
  input         irq;
14339
  input         pad;
14340
  input         crc;
14341
  input  [31:0] txpnt;
14342
 
14343
  integer       i;
14344
  integer       bd_status_addr, bd_ptr_addr;
14345
//  integer       buf_addr;
14346
begin
14347
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
14348
  begin
14349
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
14350
    bd_status_addr = `TX_BD_BASE + i * 8;
14351
    bd_ptr_addr = bd_status_addr + 4;
14352
    // initialize BD - status
14353
//    wbm_write(bd_status_addr, 32'h00005800, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14354
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
14355
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14356
    // initialize BD - pointer
14357
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14358
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14359
  end
14360
end
14361
endtask // set_tx_bd
14362
 
14363
task set_tx_bd_wrap;
14364
  input  [6:0]  tx_bd_num_end;
14365
  integer       bd_status_addr, tmp;
14366
begin
14367
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
14368
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14369
  // set wrap bit to this BD - this BD should be last-one
14370
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14371
end
14372
endtask // set_tx_bd_wrap
14373
 
14374
task set_tx_bd_ready;
14375
  input  [6:0]  tx_nd_num_strat;
14376
  input  [6:0]  tx_bd_num_end;
14377
  integer       i;
14378
  integer       bd_status_addr, tmp;
14379
begin
14380
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
14381
  begin
14382
    bd_status_addr = `TX_BD_BASE + i * 8;
14383
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14384
    // set empty bit to this BD - this BD should be ready
14385
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14386
  end
14387
end
14388
endtask // set_tx_bd_ready
14389
 
14390
task check_tx_bd;
14391
  input  [6:0]  tx_bd_num_end;
14392
  output [31:0] tx_bd_status;
14393
  integer       bd_status_addr, tmp;
14394
begin
14395
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
14396
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14397
  #1 tx_bd_status = tmp;
14398
  #1;
14399
end
14400
endtask // check_tx_bd
14401
 
14402
task clear_tx_bd;
14403
  input  [6:0]  tx_nd_num_strat;
14404
  input  [6:0]  tx_bd_num_end;
14405
  integer       i;
14406
  integer       bd_status_addr, bd_ptr_addr;
14407
begin
14408
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
14409
  begin
14410
    bd_status_addr = `TX_BD_BASE + i * 8;
14411
    bd_ptr_addr = bd_status_addr + 4;
14412
    // clear BD - status
14413
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14414
    // clear BD - pointer
14415
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14416
  end
14417
end
14418
endtask // clear_tx_bd
14419
 
14420
task set_rx_bd;
14421
  input  [6:0]  rx_bd_num_strat;
14422
  input  [6:0]  rx_bd_num_end;
14423
  input         irq;
14424
  input  [31:0] rxpnt;
14425
//  input  [6:0]  rxbd_num;
14426
  integer       i;
14427
  integer       bd_status_addr, bd_ptr_addr;
14428
//  integer       buf_addr;
14429
begin
14430
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14431
  begin
14432
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
14433 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14434
//    bd_ptr_addr = bd_status_addr + 4; 
14435
    bd_status_addr = `TX_BD_BASE + i * 8;
14436
    bd_ptr_addr = bd_status_addr + 4;
14437 116 mohor
 
14438 169 mohor
    // initialize BD - status
14439
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14440
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
14441
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14442
    // initialize BD - pointer
14443
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14444
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14445
  end
14446
end
14447
endtask // set_rx_bd
14448 116 mohor
 
14449 169 mohor
task set_rx_bd_wrap;
14450
  input  [6:0]  rx_bd_num_end;
14451
  integer       bd_status_addr, tmp;
14452
begin
14453 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
14454
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
14455 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14456
  // set wrap bit to this BD - this BD should be last-one
14457
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14458
end
14459
endtask // set_rx_bd_wrap
14460 116 mohor
 
14461 169 mohor
task set_rx_bd_empty;
14462
  input  [6:0]  rx_bd_num_strat;
14463
  input  [6:0]  rx_bd_num_end;
14464
  integer       i;
14465
  integer       bd_status_addr, tmp;
14466
begin
14467
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14468
  begin
14469 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14470
    bd_status_addr = `TX_BD_BASE + i * 8;
14471 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14472
    // set empty bit to this BD - this BD should be ready
14473
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14474 116 mohor
  end
14475 169 mohor
end
14476
endtask // set_rx_bd_empty
14477 116 mohor
 
14478 169 mohor
task check_rx_bd;
14479
  input  [6:0]  rx_bd_num_end;
14480
  output [31:0] rx_bd_status;
14481
  integer       bd_status_addr, tmp;
14482
begin
14483 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
14484
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
14485 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14486
  #1 rx_bd_status = tmp;
14487
  #1;
14488
end
14489
endtask // check_rx_bd
14490 116 mohor
 
14491 169 mohor
task clear_rx_bd;
14492
  input  [6:0]  rx_bd_num_strat;
14493
  input  [6:0]  rx_bd_num_end;
14494
  integer       i;
14495
  integer       bd_status_addr, bd_ptr_addr;
14496
begin
14497
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14498
  begin
14499 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14500
    bd_status_addr = `TX_BD_BASE + i * 8;
14501 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
14502
    // clear BD - status
14503
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14504
    // clear BD - pointer
14505
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14506
  end
14507
end
14508
endtask // clear_rx_bd
14509 116 mohor
 
14510 169 mohor
task set_tx_packet;
14511
  input  [31:0] txpnt;
14512
  input  [15:0] len;
14513
  input  [7:0]  eth_start_data;
14514
  integer       i, sd;
14515
  integer       buffer;
14516
  reg           delta_t;
14517
begin
14518
  buffer = txpnt;
14519
  sd = eth_start_data;
14520
  delta_t = 0;
14521 116 mohor
 
14522 169 mohor
  // First write might not be word allign.
14523
  if(buffer[1:0] == 1)
14524
  begin
14525
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
14526
    sd = sd + 3;
14527
    i = 3;
14528
  end
14529
  else if(buffer[1:0] == 2)
14530
  begin
14531
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
14532
    sd = sd + 2;
14533
    i = 2;
14534
  end
14535
  else if(buffer[1:0] == 3)
14536
  begin
14537
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
14538
    sd = sd + 1;
14539
    i = 1;
14540
  end
14541
  else
14542
    i = 0;
14543
  delta_t = !delta_t;
14544 116 mohor
 
14545 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
14546
  begin
14547
    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);
14548
    sd = sd + 4;
14549
  end
14550
  delta_t = !delta_t;
14551
 
14552
  // Last word
14553
  if((len - i) == 3)
14554 116 mohor
  begin
14555 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);
14556
  end
14557
  else if((len - i) == 2)
14558
  begin
14559
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
14560
  end
14561
  else if((len - i) == 1)
14562
  begin
14563
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
14564
  end
14565
  else if((len - i) == 4)
14566
  begin
14567
    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);
14568
  end
14569
  else
14570
    $display("(%0t)(%m) ERROR", $time);
14571
  delta_t = !delta_t;
14572
end
14573
endtask // set_tx_packet
14574
 
14575
task check_tx_packet;
14576
  input  [31:0] txpnt_wb;  // source
14577
  input  [31:0] txpnt_phy; // destination
14578
  input  [15:0] len;
14579
  output [31:0] failure;
14580
  integer       i, data_wb, data_phy;
14581
  reg    [31:0] addr_wb, addr_phy;
14582
  reg    [31:0] failure;
14583
  reg           delta_t;
14584
begin
14585
  addr_wb = txpnt_wb;
14586
  addr_phy = txpnt_phy;
14587
  delta_t = 0;
14588
  failure = 0;
14589 209 tadejm
  #1;
14590 169 mohor
  // First write might not be word allign.
14591
  if(addr_wb[1:0] == 1)
14592
  begin
14593
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
14594
    data_phy[31:24] = 0;
14595
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
14596
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
14597
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
14598
    i = 3;
14599
    if (data_phy[23:0] !== data_wb[23:0])
14600
    begin
14601
      `TIME;
14602 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
14603
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14604 169 mohor
      failure = 1;
14605
    end
14606
  end
14607
  else if (addr_wb[1:0] == 2)
14608
  begin
14609
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
14610
    data_phy[31:16] = 0;
14611
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
14612
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
14613
    i = 2;
14614
    if (data_phy[15:0] !== data_wb[15:0])
14615
    begin
14616
      `TIME;
14617 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
14618
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14619 169 mohor
      failure = 1;
14620
    end
14621
  end
14622
  else if (addr_wb[1:0] == 3)
14623
  begin
14624
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
14625
    data_phy[31: 8] = 0;
14626
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
14627
    i = 1;
14628
    if (data_phy[7:0] !== data_wb[7:0])
14629
    begin
14630
      `TIME;
14631 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
14632
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14633 169 mohor
      failure = 1;
14634
    end
14635
  end
14636
  else
14637
    i = 0;
14638
  delta_t = !delta_t;
14639 209 tadejm
  #1;
14640 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
14641
  begin
14642
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14643
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14644
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14645
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14646
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
14647
    if (data_phy[31:0] !== data_wb[31:0])
14648
    begin
14649
      `TIME;
14650 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]);
14651
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14652 169 mohor
      failure = failure + 1;
14653
    end
14654
  end
14655
  delta_t = !delta_t;
14656 209 tadejm
  #1;
14657 169 mohor
  // Last word
14658
  if((len - i) == 3)
14659
  begin
14660
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
14661
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14662
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14663
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14664
    data_phy[ 7: 0] = 0;
14665
    if (data_phy[31:8] !== data_wb[31:8])
14666
    begin
14667
      `TIME;
14668 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]);
14669
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14670 169 mohor
      failure = failure + 1;
14671
    end
14672
  end
14673
  else if((len - i) == 2)
14674
  begin
14675
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
14676
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14677
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14678
    data_phy[15: 8] = 0;
14679
    data_phy[ 7: 0] = 0;
14680
    if (data_phy[31:16] !== data_wb[31:16])
14681
    begin
14682
      `TIME;
14683 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]);
14684
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14685 169 mohor
      failure = failure + 1;
14686
    end
14687
  end
14688
  else if((len - i) == 1)
14689
  begin
14690
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
14691
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14692
    data_phy[23:16] = 0;
14693
    data_phy[15: 8] = 0;
14694
    data_phy[ 7: 0] = 0;
14695
    if (data_phy[31:24] !== data_wb[31:24])
14696
    begin
14697
      `TIME;
14698 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]);
14699
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14700 169 mohor
      failure = failure + 1;
14701
    end
14702
  end
14703
  else if((len - i) == 4)
14704
  begin
14705
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14706
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14707
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14708
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14709
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
14710
    if (data_phy[31:0] !== data_wb[31:0])
14711
    begin
14712
      `TIME;
14713 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]);
14714
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14715 169 mohor
      failure = failure + 1;
14716
    end
14717
  end
14718
  else
14719
    $display("(%0t)(%m) ERROR", $time);
14720
  delta_t = !delta_t;
14721
end
14722
endtask // check_tx_packet
14723
 
14724
task set_rx_packet;
14725
  input  [31:0] rxpnt;
14726
  input  [15:0] len;
14727
  input         plus_dribble_nibble; // if length is longer for one nibble
14728
  input  [47:0] eth_dest_addr;
14729
  input  [47:0] eth_source_addr;
14730
  input  [15:0] eth_type_len;
14731
  input  [7:0]  eth_start_data;
14732
  integer       i, sd;
14733
  reg    [47:0] dest_addr;
14734
  reg    [47:0] source_addr;
14735
  reg    [15:0] type_len;
14736
  reg    [21:0] buffer;
14737
  reg           delta_t;
14738
begin
14739
  buffer = rxpnt[21:0];
14740
  dest_addr = eth_dest_addr;
14741
  source_addr = eth_source_addr;
14742
  type_len = eth_type_len;
14743
  sd = eth_start_data;
14744
  delta_t = 0;
14745
  for(i = 0; i < len; i = i + 1)
14746
  begin
14747
    if (i < 6)
14748
    begin
14749
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
14750
      dest_addr = dest_addr << 8;
14751
    end
14752
    else if (i < 12)
14753
    begin
14754
      eth_phy.rx_mem[buffer] = source_addr[47:40];
14755
      source_addr = source_addr << 8;
14756
    end
14757
    else if (i < 14)
14758
    begin
14759
      eth_phy.rx_mem[buffer] = type_len[15:8];
14760
      type_len = type_len << 8;
14761
    end
14762
    else
14763
    begin
14764
      eth_phy.rx_mem[buffer] = sd[7:0];
14765
      sd = sd + 1;
14766
    end
14767
    buffer = buffer + 1;
14768
  end
14769
  delta_t = !delta_t;
14770
  if (plus_dribble_nibble)
14771
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
14772
  delta_t = !delta_t;
14773
end
14774
endtask // set_rx_packet
14775
 
14776 243 tadejm
task set_rx_addr_type;
14777
  input  [31:0] rxpnt;
14778
  input  [47:0] eth_dest_addr;
14779
  input  [47:0] eth_source_addr;
14780
  input  [15:0] eth_type_len;
14781
  integer       i;
14782
  reg    [47:0] dest_addr;
14783
  reg    [47:0] source_addr;
14784
  reg    [15:0] type_len;
14785
  reg    [21:0] buffer;
14786
  reg           delta_t;
14787
begin
14788
  buffer = rxpnt[21:0];
14789
  dest_addr = eth_dest_addr;
14790
  source_addr = eth_source_addr;
14791
  type_len = eth_type_len;
14792
  delta_t = 0;
14793
  for(i = 0; i < 14; i = i + 1)
14794
  begin
14795
    if (i < 6)
14796
    begin
14797
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
14798
      dest_addr = dest_addr << 8;
14799
    end
14800
    else if (i < 12)
14801
    begin
14802
      eth_phy.rx_mem[buffer] = source_addr[47:40];
14803
      source_addr = source_addr << 8;
14804
    end
14805
    else // if (i < 14)
14806
    begin
14807
      eth_phy.rx_mem[buffer] = type_len[15:8];
14808
      type_len = type_len << 8;
14809
    end
14810
    buffer = buffer + 1;
14811
  end
14812
  delta_t = !delta_t;
14813
end
14814
endtask // set_rx_addr_type
14815
 
14816 169 mohor
task check_rx_packet;
14817
  input  [31:0] rxpnt_phy; // source
14818
  input  [31:0] rxpnt_wb;  // destination
14819
  input  [15:0] len;
14820
  input         plus_dribble_nibble; // if length is longer for one nibble
14821
  input         successful_dribble_nibble; // if additional nibble is stored into memory
14822
  output [31:0] failure;
14823
  integer       i, data_wb, data_phy;
14824
  reg    [31:0] addr_wb, addr_phy;
14825
  reg    [31:0] failure;
14826
  reg    [21:0] buffer;
14827
  reg           delta_t;
14828
begin
14829
  addr_phy = rxpnt_phy;
14830
  addr_wb = rxpnt_wb;
14831
  delta_t = 0;
14832
  failure = 0;
14833
 
14834
  // First write might not be word allign.
14835
  if(addr_wb[1:0] == 1)
14836
  begin
14837
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
14838
    data_phy[31:24] = 0;
14839
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
14840
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
14841
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
14842
    i = 3;
14843
    if (data_phy[23:0] !== data_wb[23:0])
14844
    begin
14845
      `TIME;
14846 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14847
      $display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
14848 169 mohor
      failure = 1;
14849
    end
14850
  end
14851
  else if (addr_wb[1:0] == 2)
14852
  begin
14853
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
14854
    data_phy[31:16] = 0;
14855
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
14856
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
14857
    i = 2;
14858
    if (data_phy[15:0] !== data_wb[15:0])
14859
    begin
14860
      `TIME;
14861 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14862
      $display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
14863 169 mohor
      failure = 1;
14864
    end
14865
  end
14866
  else if (addr_wb[1:0] == 3)
14867
  begin
14868
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
14869
    data_phy[31: 8] = 0;
14870
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
14871
    i = 1;
14872
    if (data_phy[7:0] !== data_wb[7:0])
14873
    begin
14874
      `TIME;
14875 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14876
      $display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
14877 169 mohor
      failure = 1;
14878
    end
14879
  end
14880
  else
14881
    i = 0;
14882
  delta_t = !delta_t;
14883
 
14884
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
14885
  begin
14886
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14887
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14888
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14889
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14890
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
14891
    if (data_phy[31:0] !== data_wb[31:0])
14892
    begin
14893
      `TIME;
14894 243 tadejm
      if (i == 0)
14895
        $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14896
      $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]);
14897 169 mohor
      failure = failure + 1;
14898
    end
14899
  end
14900
  delta_t = !delta_t;
14901
 
14902
  // Last word
14903
  if((len - i) == 3)
14904
  begin
14905
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14906
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14907
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14908
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14909
    if (plus_dribble_nibble)
14910
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
14911
    else
14912
      data_phy[ 7: 0] = 0;
14913
    if (data_phy[31:8] !== data_wb[31:8])
14914
    begin
14915
      `TIME;
14916 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]);
14917 169 mohor
      failure = failure + 1;
14918
    end
14919
    if (plus_dribble_nibble && successful_dribble_nibble)
14920
    begin
14921
      if (data_phy[3:0] !== data_wb[3:0])
14922 116 mohor
      begin
14923 169 mohor
        `TIME;
14924 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
14925 169 mohor
        failure = failure + 1;
14926 116 mohor
      end
14927 169 mohor
    end
14928
    else if (plus_dribble_nibble && !successful_dribble_nibble)
14929
    begin
14930
      if (data_phy[3:0] === data_wb[3:0])
14931 116 mohor
      begin
14932 169 mohor
        `TIME;
14933 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
14934 169 mohor
        failure = failure + 1;
14935 116 mohor
      end
14936 169 mohor
    end
14937
  end
14938
  else if((len - i) == 2)
14939
  begin
14940
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
14941
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14942
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14943
    if (plus_dribble_nibble)
14944
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14945
    else
14946
      data_phy[15: 8] = 0;
14947
    data_phy[ 7: 0] = 0;
14948
    if (data_phy[31:16] !== data_wb[31:16])
14949
    begin
14950
      `TIME;
14951 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]);
14952 169 mohor
      failure = failure + 1;
14953
    end
14954
    if (plus_dribble_nibble && successful_dribble_nibble)
14955
    begin
14956
      if (data_phy[11:8] !== data_wb[11:8])
14957
      begin
14958
        `TIME;
14959 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
14960 169 mohor
        failure = failure + 1;
14961
      end
14962
    end
14963
    else if (plus_dribble_nibble && !successful_dribble_nibble)
14964
    begin
14965
      if (data_phy[11:8] === data_wb[11:8])
14966
      begin
14967
        `TIME;
14968 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
14969 169 mohor
        failure = failure + 1;
14970
      end
14971
    end
14972
  end
14973
  else if((len - i) == 1)
14974
  begin
14975
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
14976
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14977
    if (plus_dribble_nibble)
14978
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14979
    else
14980
      data_phy[23:16] = 0;
14981
    data_phy[15: 8] = 0;
14982
    data_phy[ 7: 0] = 0;
14983
    if (data_phy[31:24] !== data_wb[31:24])
14984
    begin
14985
      `TIME;
14986 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]);
14987 169 mohor
      failure = failure + 1;
14988
    end
14989
    if (plus_dribble_nibble && successful_dribble_nibble)
14990
    begin
14991
      if (data_phy[19:16] !== data_wb[19:16])
14992
      begin
14993
        `TIME;
14994 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
14995 169 mohor
        failure = failure + 1;
14996
      end
14997
    end
14998
    else if (plus_dribble_nibble && !successful_dribble_nibble)
14999
    begin
15000
      if (data_phy[19:16] === data_wb[19:16])
15001
      begin
15002
        `TIME;
15003 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
15004 169 mohor
        failure = failure + 1;
15005
      end
15006
    end
15007
  end
15008
  else if((len - i) == 4)
15009
  begin
15010
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
15011
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
15012
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
15013
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
15014
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
15015
    if (data_phy[31:0] !== data_wb[31:0])
15016
    begin
15017
      `TIME;
15018 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]);
15019 169 mohor
      failure = failure + 1;
15020
    end
15021
    if (plus_dribble_nibble)
15022
    begin
15023
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
15024
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
15025
      if (successful_dribble_nibble)
15026
      begin
15027
        if (data_phy[27:24] !== data_wb[27:24])
15028
        begin
15029
          `TIME;
15030 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
15031 169 mohor
          failure = failure + 1;
15032
        end
15033
      end
15034
      else
15035
      begin
15036
        if (data_phy[27:24] === data_wb[27:24])
15037
        begin
15038
          `TIME;
15039 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
15040 169 mohor
          failure = failure + 1;
15041
        end
15042
      end
15043
    end
15044
  end
15045
  else
15046
    $display("(%0t)(%m) ERROR", $time);
15047
  delta_t = !delta_t;
15048
end
15049
endtask // check_rx_packet
15050 116 mohor
 
15051 169 mohor
//////////////////////////////////////////////////////////////
15052
// Ethernet CRC Basic tasks
15053
//////////////////////////////////////////////////////////////
15054
 
15055
task append_tx_crc;
15056
  input  [31:0] txpnt_wb;  // source
15057
  input  [15:0] len; // length in bytes without CRC
15058
  input         negated_crc; // if appended CRC is correct or not
15059
  reg    [31:0] crc;
15060
  reg    [31:0] addr_wb;
15061
  reg           delta_t;
15062
begin
15063 243 tadejm
  addr_wb = txpnt_wb + {16'h0, len};
15064 169 mohor
  delta_t = 0;
15065
  // calculate CRC from prepared packet
15066
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
15067
  if (negated_crc)
15068
    crc = ~crc;
15069
  delta_t = !delta_t;
15070
 
15071
  // Write might not be word allign.
15072
  if (addr_wb[1:0] == 1)
15073
  begin
15074
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
15075
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
15076 116 mohor
  end
15077 169 mohor
  else if (addr_wb[1:0] == 2)
15078
  begin
15079
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
15080
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
15081
  end
15082
  else if (addr_wb[1:0] == 3)
15083
  begin
15084
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
15085
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
15086
  end
15087
  else
15088
  begin
15089
    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
15090
  end
15091
  delta_t = !delta_t;
15092
end
15093
endtask // append_tx_crc
15094 116 mohor
 
15095 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
15096
  input  [31:0] txpnt_phy; // destination
15097
  input  [15:0] len; // length in bytes without CRC
15098
  input         negated_crc; // if appended CRC is correct or not
15099
  output [31:0] failure;
15100
  reg    [31:0] failure;
15101
  reg    [31:0] crc_calc;
15102
  reg    [31:0] crc;
15103
  reg    [31:0] addr_phy;
15104
  reg           delta_t;
15105
begin
15106
  addr_phy = txpnt_phy;
15107
  failure = 0;
15108
  // calculate CRC from sent packet
15109
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
15110
//#10;
15111
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
15112 209 tadejm
  #1;
15113 169 mohor
  addr_phy = addr_phy + len;
15114
  // Read CRC - BIG endian
15115
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
15116
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
15117
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
15118
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
15119
 
15120
  delta_t = !delta_t;
15121
  if (negated_crc)
15122
  begin
15123
    if ((~crc_calc) !== crc)
15124
    begin
15125
      `TIME;
15126
      $display("*E Negated CRC was not successfuly transmitted!");
15127
      failure = failure + 1;
15128
    end
15129
  end
15130
  else
15131
  begin
15132
    if (crc_calc !== crc)
15133
    begin
15134
      `TIME;
15135 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
15136 169 mohor
      failure = failure + 1;
15137
    end
15138
  end
15139
  delta_t = !delta_t;
15140
end
15141
endtask // check_tx_crc
15142
 
15143
task append_rx_crc;
15144
  input  [31:0] rxpnt_phy; // source
15145
  input  [15:0] len; // length in bytes without CRC
15146
  input         plus_dribble_nibble; // if length is longer for one nibble
15147
  input         negated_crc; // if appended CRC is correct or not
15148
  reg    [31:0] crc;
15149
  reg    [7:0]  tmp;
15150
  reg    [31:0] addr_phy;
15151
  reg           delta_t;
15152
begin
15153
  addr_phy = rxpnt_phy + len;
15154
  delta_t = 0;
15155
  // calculate CRC from prepared packet
15156
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
15157
  if (negated_crc)
15158
    crc = ~crc;
15159
  delta_t = !delta_t;
15160
 
15161
  if (plus_dribble_nibble)
15162
  begin
15163
    tmp = eth_phy.rx_mem[addr_phy];
15164 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
15165
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
15166
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
15167
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
15168
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
15169 169 mohor
  end
15170
  else
15171
  begin
15172 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
15173
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
15174
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
15175
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
15176 169 mohor
  end
15177
end
15178
endtask // append_rx_crc
15179
 
15180
// paralel CRC checking for PHY TX
15181
task paralel_crc_phy_tx;
15182
  input  [31:0] start_addr; // start address
15183
  input  [31:0] len; // length of frame in Bytes without CRC length
15184
  input         plus_dribble_nibble; // if length is longer for one nibble
15185
  output [31:0] crc_out;
15186
  reg    [21:0] addr_cnt; // only 22 address lines
15187
  integer       word_cnt;
15188
  integer       nibble_cnt;
15189
  reg    [31:0] load_reg;
15190
  reg           delta_t;
15191
  reg    [31:0] crc_next;
15192
  reg    [31:0] crc;
15193
  reg           crc_error;
15194
  reg     [3:0] data_in;
15195
  integer       i;
15196
begin
15197
  #1 addr_cnt = start_addr[21:0];
15198
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15199
  crc = 32'hFFFF_FFFF; // INITIAL value
15200
  delta_t = 0;
15201
  // length must include 4 bytes of ZEROs, to generate CRC
15202
  // get number of nibbles from Byte length (2^1 = 2)
15203
  if (plus_dribble_nibble)
15204
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15205
  else
15206
    nibble_cnt = ((len + 4) << 1);
15207
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15208
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15209
  addr_cnt = addr_cnt + 1;
15210
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15211
  addr_cnt = addr_cnt + 1;
15212
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15213
  addr_cnt = addr_cnt + 1;
15214
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15215
  addr_cnt = addr_cnt + 1;
15216
  while (nibble_cnt > 0)
15217
  begin
15218
    // wait for delta time
15219
    delta_t = !delta_t;
15220
    // shift data in
15221
 
15222
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15223
      data_in[3:0] = 4'h0;
15224
    else
15225
 
15226
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15227
    crc_next[0]  = (data_in[0] ^ crc[28]);
15228
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15229
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15230
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15231
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15232
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15233
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15234
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15235
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15236
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15237
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15238
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15239
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15240
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15241
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15242
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15243
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15244
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15245
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15246
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15247
    crc_next[20] =  crc[16];
15248
    crc_next[21] =  crc[17];
15249
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15250
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15251
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15252
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15253
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15254
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15255
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15256
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15257
    crc_next[30] =  crc[26];
15258
    crc_next[31] =  crc[27];
15259
 
15260
    crc = crc_next;
15261
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15262
    case (nibble_cnt)
15263
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15264
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15265
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15266
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15267
    default: crc_out = crc_out;
15268
    endcase
15269
    // wait for delta time
15270
    delta_t = !delta_t;
15271
    // increment address and load new data
15272
    if ((word_cnt+3) == 7)//4)
15273
    begin
15274
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15275
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15276
      addr_cnt = addr_cnt + 1;
15277
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15278
      addr_cnt = addr_cnt + 1;
15279
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15280
      addr_cnt = addr_cnt + 1;
15281
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15282
      addr_cnt = addr_cnt + 1;
15283
    end
15284
    // set new load bit position
15285
    if((word_cnt+3) == 31)
15286
      word_cnt = 16;
15287
    else if ((word_cnt+3) == 23)
15288
      word_cnt = 8;
15289
    else if ((word_cnt+3) == 15)
15290
      word_cnt = 0;
15291
    else if ((word_cnt+3) == 7)
15292
      word_cnt = 24;
15293
    else
15294
      word_cnt = word_cnt + 4;// - 4;
15295
    // decrement nibble counter
15296
    nibble_cnt = nibble_cnt - 1;
15297
    // wait for delta time
15298
    delta_t = !delta_t;
15299
  end // while
15300
  #1;
15301
end
15302
endtask // paralel_crc_phy_tx
15303
 
15304
// paralel CRC calculating for PHY RX
15305
task paralel_crc_phy_rx;
15306
  input  [31:0] start_addr; // start address
15307
  input  [31:0] len; // length of frame in Bytes without CRC length
15308
  input         plus_dribble_nibble; // if length is longer for one nibble
15309 209 tadejm
  output [31:0] crc_out;
15310 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
15311
  integer       word_cnt;
15312 209 tadejm
  integer       nibble_cnt;
15313 169 mohor
  reg    [31:0] load_reg;
15314
  reg           delta_t;
15315 209 tadejm
  reg    [31:0] crc_next;
15316
  reg    [31:0] crc;
15317
  reg           crc_error;
15318
  reg     [3:0] data_in;
15319
  integer       i;
15320 169 mohor
begin
15321
  #1 addr_cnt = start_addr[21:0];
15322 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15323
  crc = 32'hFFFF_FFFF; // INITIAL value
15324 169 mohor
  delta_t = 0;
15325
  // length must include 4 bytes of ZEROs, to generate CRC
15326 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
15327 169 mohor
  if (plus_dribble_nibble)
15328 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15329 169 mohor
  else
15330 209 tadejm
    nibble_cnt = ((len + 4) << 1);
15331
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15332 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15333
  addr_cnt = addr_cnt + 1;
15334
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15335
  addr_cnt = addr_cnt + 1;
15336 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
15337 169 mohor
  addr_cnt = addr_cnt + 1;
15338 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
15339
  addr_cnt = addr_cnt + 1;
15340
  while (nibble_cnt > 0)
15341 169 mohor
  begin
15342
    // wait for delta time
15343
    delta_t = !delta_t;
15344
    // shift data in
15345 209 tadejm
 
15346
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15347
      data_in[3:0] = 4'h0;
15348 169 mohor
    else
15349 209 tadejm
 
15350
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15351
    crc_next[0]  = (data_in[0] ^ crc[28]);
15352
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15353
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15354
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15355
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15356
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15357
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15358
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15359
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15360
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15361
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15362
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15363
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15364
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15365
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15366
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15367
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15368
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15369
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15370
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15371
    crc_next[20] =  crc[16];
15372
    crc_next[21] =  crc[17];
15373
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15374
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15375
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15376
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15377
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15378
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15379
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15380
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15381
    crc_next[30] =  crc[26];
15382
    crc_next[31] =  crc[27];
15383
 
15384
    crc = crc_next;
15385
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15386
    case (nibble_cnt)
15387
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15388
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15389
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15390
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15391
    default: crc_out = crc_out;
15392
    endcase
15393 169 mohor
    // wait for delta time
15394
    delta_t = !delta_t;
15395
    // increment address and load new data
15396 209 tadejm
    if ((word_cnt+3) == 7)//4)
15397 169 mohor
    begin
15398 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15399 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15400
      addr_cnt = addr_cnt + 1;
15401
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15402
      addr_cnt = addr_cnt + 1;
15403 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
15404 169 mohor
      addr_cnt = addr_cnt + 1;
15405 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
15406
      addr_cnt = addr_cnt + 1;
15407 169 mohor
    end
15408
    // set new load bit position
15409 209 tadejm
    if((word_cnt+3) == 31)
15410 169 mohor
      word_cnt = 16;
15411 209 tadejm
    else if ((word_cnt+3) == 23)
15412 169 mohor
      word_cnt = 8;
15413 209 tadejm
    else if ((word_cnt+3) == 15)
15414 169 mohor
      word_cnt = 0;
15415 209 tadejm
    else if ((word_cnt+3) == 7)
15416 169 mohor
      word_cnt = 24;
15417
    else
15418 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
15419
    // decrement nibble counter
15420
    nibble_cnt = nibble_cnt - 1;
15421 169 mohor
    // wait for delta time
15422
    delta_t = !delta_t;
15423
  end // while
15424
  #1;
15425
end
15426
endtask // paralel_crc_phy_rx
15427
 
15428
// paralel CRC checking for MAC
15429
task paralel_crc_mac;
15430
  input  [31:0] start_addr; // start address
15431
  input  [31:0] len; // length of frame in Bytes without CRC length
15432
  input         plus_dribble_nibble; // if length is longer for one nibble
15433 209 tadejm
  output [31:0] crc_out;
15434
 
15435
  reg    [21:0] addr_cnt; // only 22 address lines
15436 169 mohor
  integer       word_cnt;
15437 209 tadejm
  integer       nibble_cnt;
15438 169 mohor
  reg    [31:0] load_reg;
15439
  reg           delta_t;
15440 209 tadejm
  reg    [31:0] crc_next;
15441
  reg    [31:0] crc;
15442
  reg           crc_error;
15443
  reg     [3:0] data_in;
15444
  integer       i;
15445 169 mohor
begin
15446
  #1 addr_cnt = start_addr[19:0];
15447
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
15448
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
15449
  if (addr_cnt[1:0] == 2'h1)
15450
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15451
  else if (addr_cnt[1:0] == 2'h2)
15452
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15453
  else if (addr_cnt[1:0] == 2'h3)
15454
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15455
  else
15456
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15457 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
15458 169 mohor
  delta_t = 0;
15459
  // length must include 4 bytes of ZEROs, to generate CRC
15460 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
15461 169 mohor
  if (plus_dribble_nibble)
15462 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15463 169 mohor
  else
15464 209 tadejm
    nibble_cnt = ((len + 4) << 1);
15465 169 mohor
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15466 209 tadejm
  addr_cnt = addr_cnt + 4;
15467
  while (nibble_cnt > 0)
15468 169 mohor
  begin
15469
    // wait for delta time
15470
    delta_t = !delta_t;
15471
    // shift data in
15472 209 tadejm
 
15473
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15474
      data_in[3:0] = 4'h0;
15475 169 mohor
    else
15476 209 tadejm
 
15477
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15478
    crc_next[0]  = (data_in[0] ^ crc[28]);
15479
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15480
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15481
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15482
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15483
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15484
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15485
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15486
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15487
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15488
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15489
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15490
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15491
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15492
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15493
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15494
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15495
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15496
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15497
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15498
    crc_next[20] =  crc[16];
15499
    crc_next[21] =  crc[17];
15500
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15501
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15502
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15503
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15504
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15505
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15506
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15507
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15508
    crc_next[30] =  crc[26];
15509
    crc_next[31] =  crc[27];
15510
 
15511
    crc = crc_next;
15512
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15513
    case (nibble_cnt)
15514
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15515
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15516
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15517
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15518
    default: crc_out = crc_out;
15519
    endcase
15520 169 mohor
    // wait for delta time
15521
    delta_t = !delta_t;
15522 209 tadejm
    // increment address and load new data
15523
    if ((word_cnt+3) == 7)//4)
15524 169 mohor
    begin
15525 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15526
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15527 169 mohor
      addr_cnt = addr_cnt + 4;
15528
    end
15529 209 tadejm
    // set new load bit position
15530
    if((word_cnt+3) == 31)
15531 169 mohor
      word_cnt = 16;
15532 209 tadejm
    else if ((word_cnt+3) == 23)
15533 169 mohor
      word_cnt = 8;
15534 209 tadejm
    else if ((word_cnt+3) == 15)
15535 169 mohor
      word_cnt = 0;
15536 209 tadejm
    else if ((word_cnt+3) == 7)
15537 169 mohor
      word_cnt = 24;
15538
    else
15539 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
15540
    // decrement nibble counter
15541
    nibble_cnt = nibble_cnt - 1;
15542 169 mohor
    // wait for delta time
15543
    delta_t = !delta_t;
15544
  end // while
15545
  #1;
15546
end
15547
endtask // paralel_crc_mac
15548
 
15549
// serial CRC checking for PHY TX
15550
task serial_crc_phy_tx;
15551
  input  [31:0] start_addr; // start address
15552
  input  [31:0] len; // length of frame in Bytes without CRC length
15553
  input         plus_dribble_nibble; // if length is longer for one nibble
15554
  output [31:0] crc;
15555
  reg    [21:0] addr_cnt; // only 22 address lines
15556
  integer       word_cnt;
15557
  integer       bit_cnt;
15558
  reg    [31:0] load_reg;
15559
  reg    [31:0] crc_shift_reg;
15560
  reg    [31:0] crc_store_reg;
15561
  reg           delta_t;
15562
begin
15563
  #1 addr_cnt = start_addr[21:0];
15564
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15565
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
15566
  delta_t = 0;
15567
  // length must include 4 bytes of ZEROs, to generate CRC
15568
  // get number of bits from Byte length (2^3 = 8)
15569
  if (plus_dribble_nibble)
15570
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15571
  else
15572
    bit_cnt = ((len + 4) << 3);
15573
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15574
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15575
  addr_cnt = addr_cnt + 1;
15576
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15577
  addr_cnt = addr_cnt + 1;
15578
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15579
  addr_cnt = addr_cnt + 1;
15580
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15581
  addr_cnt = addr_cnt + 1;
15582
#1;
15583
  while (bit_cnt > 0)
15584
  begin
15585
    // wait for delta time
15586
    delta_t = !delta_t;
15587
#1;
15588
    // shift data in
15589
 
15590
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15591
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15592
    else
15593
 
15594
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15595
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15596
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15597
    crc_shift_reg[3]  = crc_store_reg[2];
15598
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15599
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15600
    crc_shift_reg[6]  = crc_store_reg[5];
15601
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15602
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15603
    crc_shift_reg[9]  = crc_store_reg[8];
15604
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15605
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15606
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15607
    crc_shift_reg[13] = crc_store_reg[12];
15608
    crc_shift_reg[14] = crc_store_reg[13];
15609
    crc_shift_reg[15] = crc_store_reg[14];
15610
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15611
    crc_shift_reg[17] = crc_store_reg[16];
15612
    crc_shift_reg[18] = crc_store_reg[17];
15613
    crc_shift_reg[19] = crc_store_reg[18];
15614
    crc_shift_reg[20] = crc_store_reg[19];
15615
    crc_shift_reg[21] = crc_store_reg[20];
15616
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15617
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15618
    crc_shift_reg[24] = crc_store_reg[23];
15619
    crc_shift_reg[25] = crc_store_reg[24];
15620
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15621
    crc_shift_reg[27] = crc_store_reg[26];
15622
    crc_shift_reg[28] = crc_store_reg[27];
15623
    crc_shift_reg[29] = crc_store_reg[28];
15624
    crc_shift_reg[30] = crc_store_reg[29];
15625
    crc_shift_reg[31] = crc_store_reg[30];
15626
    // wait for delta time
15627
    delta_t = !delta_t;
15628
 
15629
    // store previous data
15630
    crc_store_reg = crc_shift_reg;
15631
 
15632
    // put CRC out
15633
    case (bit_cnt)
15634
    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:
15635
    begin
15636
      crc = crc_store_reg;
15637
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15638
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15639
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15640
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15641
    end
15642
    default: crc = crc;
15643
    endcase
15644
 
15645
    // increment address and load new data
15646
#1;
15647
    if (word_cnt == 7)//4)
15648
    begin
15649
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15650
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15651
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
15652
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
15653
      addr_cnt = addr_cnt + 1;
15654
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15655
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
15656
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
15657
      addr_cnt = addr_cnt + 1;
15658
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15659
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
15660
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
15661
      addr_cnt = addr_cnt + 1;
15662
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15663
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
15664
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
15665
      addr_cnt = addr_cnt + 1;
15666
    end
15667
#1;
15668
    // set new load bit position
15669
    if(word_cnt == 31)
15670
      word_cnt = 16;
15671
    else if (word_cnt == 23)
15672
      word_cnt = 8;
15673
    else if (word_cnt == 15)
15674
      word_cnt = 0;
15675
    else if (word_cnt == 7)
15676
      word_cnt = 24;
15677
 
15678
//   if(word_cnt == 24)
15679
//     word_cnt = 31;
15680
//   else if (word_cnt == 28)
15681
//     word_cnt = 19;
15682
//   else if (word_cnt == 16)
15683
//     word_cnt = 23;
15684
//   else if (word_cnt == 20)
15685
//     word_cnt = 11;
15686
//   else if(word_cnt == 8)
15687
//     word_cnt = 15;
15688
//   else if (word_cnt == 12)
15689
//     word_cnt = 3;
15690
//   else if (word_cnt == 0)
15691
//     word_cnt = 7;
15692
//   else if (word_cnt == 4)
15693
//     word_cnt = 27;
15694
    else
15695
      word_cnt = word_cnt + 1;// - 1;
15696
#1;
15697
    // decrement bit counter
15698
    bit_cnt = bit_cnt - 1;
15699
#1;
15700
    // wait for delta time
15701
    delta_t = !delta_t;
15702
  end // while
15703
 
15704
  #1;
15705
end
15706
endtask // serial_crc_phy_tx
15707
 
15708
// serial CRC calculating for PHY RX
15709
task serial_crc_phy_rx;
15710
  input  [31:0] start_addr; // start address
15711
  input  [31:0] len; // length of frame in Bytes without CRC length
15712
  input         plus_dribble_nibble; // if length is longer for one nibble
15713
  output [31:0] crc;
15714
  reg    [21:0] addr_cnt; // only 22 address lines
15715
  integer       word_cnt;
15716
  integer       bit_cnt;
15717
  reg    [31:0] load_reg;
15718
  reg    [31:0] crc_shift_reg;
15719
  reg    [31:0] crc_store_reg;
15720
  reg           delta_t;
15721
begin
15722
  #1 addr_cnt = start_addr[21:0];
15723
  word_cnt = 24; // start of the frame
15724
  crc_shift_reg = 0;
15725
  delta_t = 0;
15726
  // length must include 4 bytes of ZEROs, to generate CRC
15727
  // get number of bits from Byte length (2^3 = 8)
15728
  if (plus_dribble_nibble)
15729
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15730
  else
15731
    bit_cnt = ((len + 4) << 3);
15732
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15733
  addr_cnt = addr_cnt + 1;
15734
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15735
  addr_cnt = addr_cnt + 1;
15736
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
15737
  addr_cnt = addr_cnt + 1;
15738
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
15739
 
15740
  while (bit_cnt > 0)
15741
  begin
15742
    // wait for delta time
15743
    delta_t = !delta_t;
15744
    // store previous data
15745
    crc_store_reg = crc_shift_reg;
15746
    // shift data in
15747
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15748
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15749
    else
15750
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15751
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15752
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15753
    crc_shift_reg[3]  = crc_store_reg[2];
15754
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15755
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15756
    crc_shift_reg[6]  = crc_store_reg[5];
15757
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15758
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15759
    crc_shift_reg[9]  = crc_store_reg[8];
15760
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15761
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15762
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15763
    crc_shift_reg[13] = crc_store_reg[12];
15764
    crc_shift_reg[14] = crc_store_reg[13];
15765
    crc_shift_reg[15] = crc_store_reg[14];
15766
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15767
    crc_shift_reg[17] = crc_store_reg[16];
15768
    crc_shift_reg[18] = crc_store_reg[17];
15769
    crc_shift_reg[19] = crc_store_reg[18];
15770
    crc_shift_reg[20] = crc_store_reg[19];
15771
    crc_shift_reg[21] = crc_store_reg[20];
15772
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15773
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15774
    crc_shift_reg[24] = crc_store_reg[23];
15775
    crc_shift_reg[25] = crc_store_reg[24];
15776
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15777
    crc_shift_reg[27] = crc_store_reg[26];
15778
    crc_shift_reg[28] = crc_store_reg[27];
15779
    crc_shift_reg[29] = crc_store_reg[28];
15780
    crc_shift_reg[30] = crc_store_reg[29];
15781
    crc_shift_reg[31] = crc_store_reg[30];
15782
    // wait for delta time
15783
    delta_t = !delta_t;
15784
    // increment address and load new data
15785
    if (word_cnt == 7)
15786
    begin
15787
      addr_cnt = addr_cnt + 1;
15788
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15789
      addr_cnt = addr_cnt + 1;
15790
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15791
      addr_cnt = addr_cnt + 1;
15792
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
15793
      addr_cnt = addr_cnt + 1;
15794
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
15795
    end
15796
    // set new load bit position
15797
    if(word_cnt == 31)
15798
      word_cnt = 16;
15799
    else if (word_cnt == 23)
15800
      word_cnt = 8;
15801
    else if (word_cnt == 15)
15802
      word_cnt = 0;
15803
    else if (word_cnt == 7)
15804
      word_cnt = 24;
15805
    else
15806
      word_cnt = word_cnt + 1;
15807
    // decrement bit counter
15808
    bit_cnt = bit_cnt - 1;
15809
    // wait for delta time
15810
    delta_t = !delta_t;
15811
  end // while
15812
 
15813
  // put CRC out
15814
  crc = crc_shift_reg;
15815
  #1;
15816
end
15817
endtask // serial_crc_phy_rx
15818
 
15819
// serial CRC checking for MAC
15820
task serial_crc_mac;
15821
  input  [31:0] start_addr; // start address
15822
  input  [31:0] len; // length of frame in Bytes without CRC length
15823
  input         plus_dribble_nibble; // if length is longer for one nibble
15824
  output [31:0] crc;
15825
  reg    [19:0] addr_cnt; // only 20 address lines
15826
  integer       word_cnt;
15827
  integer       bit_cnt;
15828
  reg    [31:0] load_reg;
15829
  reg    [31:0] crc_shift_reg;
15830
  reg    [31:0] crc_store_reg;
15831
  reg           delta_t;
15832
begin
15833
  #1 addr_cnt = start_addr[19:0];
15834
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
15835
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
15836
  if (addr_cnt[1:0] == 2'h1)
15837
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15838
  else if (addr_cnt[1:0] == 2'h2)
15839
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15840
  else if (addr_cnt[1:0] == 2'h3)
15841
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15842
  else
15843
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15844
 
15845
  crc_shift_reg = 0;
15846
  delta_t = 0;
15847
  // length must include 4 bytes of ZEROs, to generate CRC
15848
  // get number of bits from Byte length (2^3 = 8)
15849
  if (plus_dribble_nibble)
15850
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15851
  else
15852
    bit_cnt = ((len + 4) << 3);
15853
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15854
 
15855
  while (bit_cnt > 0)
15856
  begin
15857
    // wait for delta time
15858
    delta_t = !delta_t;
15859
    // store previous data
15860
    crc_store_reg = crc_shift_reg;
15861
    // shift data in
15862
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15863
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15864
    else
15865
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15866
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15867
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15868
    crc_shift_reg[3]  = crc_store_reg[2];
15869
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15870
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15871
    crc_shift_reg[6]  = crc_store_reg[5];
15872
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15873
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15874
    crc_shift_reg[9]  = crc_store_reg[8];
15875
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15876
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15877
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15878
    crc_shift_reg[13] = crc_store_reg[12];
15879
    crc_shift_reg[14] = crc_store_reg[13];
15880
    crc_shift_reg[15] = crc_store_reg[14];
15881
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15882
    crc_shift_reg[17] = crc_store_reg[16];
15883
    crc_shift_reg[18] = crc_store_reg[17];
15884
    crc_shift_reg[19] = crc_store_reg[18];
15885
    crc_shift_reg[20] = crc_store_reg[19];
15886
    crc_shift_reg[21] = crc_store_reg[20];
15887
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15888
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15889
    crc_shift_reg[24] = crc_store_reg[23];
15890
    crc_shift_reg[25] = crc_store_reg[24];
15891
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15892
    crc_shift_reg[27] = crc_store_reg[26];
15893
    crc_shift_reg[28] = crc_store_reg[27];
15894
    crc_shift_reg[29] = crc_store_reg[28];
15895
    crc_shift_reg[30] = crc_store_reg[29];
15896
    crc_shift_reg[31] = crc_store_reg[30];
15897
    // wait for delta time
15898
    delta_t = !delta_t;
15899
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
15900
    if (word_cnt == 7)
15901
    begin
15902
      addr_cnt = addr_cnt + 4;
15903
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15904
    end
15905
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
15906
    if(word_cnt == 31)
15907
      word_cnt = 16;
15908
    else if (word_cnt == 23)
15909
      word_cnt = 8;
15910
    else if (word_cnt == 15)
15911
      word_cnt = 0;
15912
    else if (word_cnt == 7)
15913
      word_cnt = 24;
15914
    else
15915
      word_cnt = word_cnt + 1;
15916
    // decrement bit counter
15917
    bit_cnt = bit_cnt - 1;
15918
    // wait for delta time
15919
    delta_t = !delta_t;
15920
  end // while
15921
 
15922
  // put CRC out
15923
  crc = crc_shift_reg;
15924
  #1;
15925
end
15926
endtask // serial_crc_mac
15927
 
15928
//////////////////////////////////////////////////////////////
15929
// MIIM Basic tasks
15930
//////////////////////////////////////////////////////////////
15931
 
15932
task reset_mii; //  MII module
15933
  reg [31:0] tmp;
15934
  reg [31:0] tmp_no_rst;
15935
begin
15936
  // read MII mode register first
15937
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15938
  // set reset bit - write back to MII mode register with RESET bit
15939
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15940
  // clear reset bit - write back to MII mode register without RESET bit
15941
  tmp_no_rst = `ETH_MIIMODER_RST;
15942
  tmp_no_rst = ~tmp_no_rst;
15943
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15944
end
15945
endtask // reset_mii
15946
 
15947
task mii_set_clk_div; // set clock divider for MII clock
15948
  input [7:0]  clk_div;
15949
begin
15950
  // MII mode register
15951
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15952
end
15953
endtask // mii_set_clk_div
15954
 
15955
 
15956
task check_mii_busy; // MII - check if BUSY
15957
  reg [31:0] tmp;
15958
begin
15959
  @(posedge wb_clk);
15960
  // MII read status register
15961
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15962
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
15963
  begin
15964
    @(posedge wb_clk);
15965
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15966
  end
15967
end
15968
endtask // check_mii_busy
15969
 
15970
 
15971
task check_mii_scan_valid; // MII - check if SCAN data are valid
15972
  reg [31:0] tmp;
15973
begin
15974
  @(posedge wb_clk);
15975
  // MII read status register
15976
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15977
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
15978
  begin
15979
    @(posedge wb_clk);
15980
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15981
  end
15982
end
15983
endtask // check_mii_scan_valid
15984
 
15985
 
15986
task mii_write_req; // requests write to MII
15987
  input [4:0]  phy_addr;
15988
  input [4:0]  reg_addr;
15989
  input [15:0] data_in;
15990
begin
15991
  // MII address, PHY address = 1, command register address = 0
15992
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
15993
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15994
  // MII TX data
15995
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15996
  // MII command
15997
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15998
  @(posedge wb_clk);
15999
end
16000
endtask // mii_write_req
16001
 
16002
 
16003
task mii_read_req; // requests read from MII
16004
  input [4:0]  phy_addr;
16005
  input [4:0]  reg_addr;
16006
begin
16007
  // MII address, PHY address = 1, command register address = 0
16008
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
16009
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16010
  // MII command
16011
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16012
  @(posedge wb_clk);
16013
end
16014
endtask // mii_read_req
16015
 
16016
 
16017
task mii_scan_req; // requests scan from MII
16018
  input [4:0]  phy_addr;
16019
  input [4:0]  reg_addr;
16020
begin
16021
  // MII address, PHY address = 1, command register address = 0
16022
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
16023
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16024
  // MII command
16025
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16026
  @(posedge wb_clk);
16027
end
16028
endtask // mii_scan_req
16029
 
16030
 
16031
task mii_scan_finish; // finish scan from MII
16032
begin
16033
  // MII command
16034
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16035
  @(posedge wb_clk);
16036
end
16037
endtask // mii_scan_finish
16038
 
16039
//////////////////////////////////////////////////////////////
16040
// Log files and memory tasks
16041
//////////////////////////////////////////////////////////////
16042
 
16043
task clear_memories;
16044
  reg    [22:0]  adr_i;
16045
  reg            delta_t;
16046
begin
16047
  delta_t = 0;
16048
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
16049
  begin
16050
    eth_phy.rx_mem[adr_i[21:0]] = 0;
16051
    eth_phy.tx_mem[adr_i[21:0]] = 0;
16052
    wb_slave.wb_memory[adr_i[21:2]] = 0;
16053
    delta_t = !delta_t;
16054
  end
16055
end
16056
endtask // clear_memories
16057
 
16058 243 tadejm
task clear_buffer_descriptors;
16059
  reg    [8:0]  adr_i;
16060
  reg            delta_t;
16061
begin
16062
  delta_t = 0;
16063
  for (adr_i = 0; adr_i < 256; adr_i = adr_i + 1)
16064
  begin
16065
    wbm_write((`TX_BD_BASE + {adr_i[7:0], 2'b0}), 32'h0, 4'hF, 1, 4'h1, 4'h1);
16066
    delta_t = !delta_t;
16067
  end
16068
end
16069
endtask // clear_buffer_descriptors
16070
 
16071 169 mohor
task test_note;
16072
  input [799:0] test_note ;
16073
  reg   [799:0] display_note ;
16074
begin
16075
  display_note = test_note;
16076
  while ( display_note[799:792] == 0 )
16077
    display_note = display_note << 8 ;
16078
  $fdisplay( tb_log_file, " " ) ;
16079
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
16080
  $fdisplay( tb_log_file, " " ) ;
16081
end
16082
endtask // test_note
16083
 
16084
task test_heading;
16085
  input [799:0] test_heading ;
16086
  reg   [799:0] display_test ;
16087
begin
16088
  display_test = test_heading;
16089
  while ( display_test[799:792] == 0 )
16090
    display_test = display_test << 8 ;
16091
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16092
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16093
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
16094
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16095
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16096
  $fdisplay( tb_log_file, " " ) ;
16097
end
16098
endtask // test_heading
16099
 
16100
 
16101
task test_fail ;
16102
  input [7999:0] failure_reason ;
16103
//  reg   [8007:0] display_failure ;
16104
  reg   [7999:0] display_failure ;
16105
  reg   [799:0] display_test ;
16106
begin
16107
  tests_failed = tests_failed + 1 ;
16108
 
16109
  display_failure = failure_reason; // {failure_reason, "!"} ;
16110
  while ( display_failure[7999:7992] == 0 )
16111
    display_failure = display_failure << 8 ;
16112
 
16113
  display_test = test_name ;
16114
  while ( display_test[799:792] == 0 )
16115
    display_test = display_test << 8 ;
16116
 
16117
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16118
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
16119
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
16120
  $fdisplay( tb_log_file, "    *FAILED* because") ;
16121
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
16122
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16123
  $fdisplay( tb_log_file, " " ) ;
16124
 
16125
 `ifdef STOP_ON_FAILURE
16126
    #20 $stop ;
16127
 `endif
16128
end
16129
endtask // test_fail
16130
 
16131
 
16132
task test_ok ;
16133
  reg [799:0] display_test ;
16134
begin
16135
  tests_successfull = tests_successfull + 1 ;
16136
 
16137
  display_test = test_name ;
16138
  while ( display_test[799:792] == 0 )
16139
    display_test = display_test << 8 ;
16140
 
16141
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16142
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
16143
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
16144
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
16145
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16146
  $fdisplay( tb_log_file, " " ) ;
16147
end
16148
endtask // test_ok
16149
 
16150
 
16151
task test_summary;
16152
begin
16153
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
16154
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
16155
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
16156
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
16157
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
16158
  $fclose(tb_log_file) ;
16159
end
16160
endtask // test_summary
16161
 
16162
 
16163 116 mohor
endmodule

powered by: WebSVN 2.1.0

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