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

Subversion Repositories ethmac

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

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

Line No. Rev Author Line
1 116 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  tb_ethernet.v                                               ////
4
////                                                              ////
5
////  This file is part of the Ethernet IP core project           ////
6
////  http://www.opencores.org/projects/ethmac/                   ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9 169 mohor
////      - Tadej Markovic, tadej@opencores.org                   ////
10 170 mohor
////      - Igor Mohor,     igormM@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 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
46
// Some code changed due to bug fixes.
47
//
48 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
49
// Just back-up; not completed testbench and some testcases are not
50
// wotking properly yet.
51
//
52 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
53
// Full duplex tests modified and testbench bug repaired.
54
//
55 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
56
// Some additional reports added
57
//
58 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
59
// Full duplex test improved.
60
//
61 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
62
// MIIM test look better.
63
//
64 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
65
// Bench outputs data to display every 128 bytes.
66
//
67 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
68
// Beautiful tests merget together
69
//
70 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
71
// Rearanged testcases
72
//
73 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
74
// Bug in MIIM fixed.
75
//
76 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
77
// Headers changed.
78
//
79 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
80
// New testbench. Thanks to Tadej M - "The Spammer".
81
//
82 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
83
// Clock mrx_clk set to 2.5 MHz.
84
//
85 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
86
// Testing environment also includes traffic cop, memory interface and host
87
// interface.
88 116 mohor
//
89
//
90
//
91
//
92 117 mohor
//
93 116 mohor
 
94
 
95 169 mohor
`include "eth_phy_defines.v"
96
`include "wb_model_defines.v"
97 116 mohor
`include "tb_eth_defines.v"
98
`include "eth_defines.v"
99
`include "timescale.v"
100
 
101
module tb_ethernet();
102
 
103
 
104 169 mohor
reg           wb_clk;
105
reg           wb_rst;
106
wire          wb_int;
107 116 mohor
 
108 169 mohor
wire          mtx_clk;  // This goes to PHY
109
wire          mrx_clk;  // This goes to PHY
110 116 mohor
 
111
wire   [3:0]  MTxD;
112
wire          MTxEn;
113
wire          MTxErr;
114
 
115 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
116
wire          MRxDV;    // This goes to PHY
117
wire          MRxErr;   // This goes to PHY
118
wire          MColl;    // This goes to PHY
119
wire          MCrs;     // This goes to PHY
120 116 mohor
 
121
wire          Mdi_I;
122
wire          Mdo_O;
123
wire          Mdo_OE;
124 169 mohor
tri           Mdio_IO;
125 116 mohor
wire          Mdc_O;
126
 
127
 
128 169 mohor
parameter Tp = 1;
129 116 mohor
 
130 121 mohor
 
131 116 mohor
// Ethernet Slave Interface signals
132 169 mohor
wire [31:0] eth_sl_wb_adr;
133 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
134
wire  [3:0] eth_sl_wb_sel_i;
135
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;
136
 
137
// Ethernet Master Interface signals
138
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
139
wire  [3:0] eth_ma_wb_sel_o;
140
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;
141
 
142
 
143
 
144
 
145
// Connecting Ethernet top module
146 169 mohor
eth_top eth_top
147 116 mohor
(
148
  // WISHBONE common
149 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
150 116 mohor
 
151
  // WISHBONE slave
152 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),
153
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
154
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
155 116 mohor
 
156
  // WISHBONE master
157
  .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),
158
  .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),
159
  .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),
160
 
161
  //TX
162
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
163
 
164
  //RX
165
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
166
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
167
 
168
  // MIIM
169
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
170
 
171 169 mohor
  .int_o(wb_int)
172 227 tadejm
 
173
  // Bist
174
`ifdef ETH_BIST
175
  ,
176
  .scanb_rst      (1'b0),
177
  .scanb_clk      (1'b0),
178
  .scanb_si       (1'b0),
179
  .scanb_so       (),
180
  .scanb_en       (1'b0)
181
`endif
182 116 mohor
);
183
 
184
 
185
 
186 169 mohor
// Connecting Ethernet PHY Module
187
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
188
assign Mdi_I   = Mdio_IO;
189
integer phy_log_file_desc;
190
 
191
eth_phy eth_phy
192 116 mohor
(
193 169 mohor
  // WISHBONE reset
194
  .m_rst_n_i(!wb_rst),
195 116 mohor
 
196 169 mohor
  // MAC TX
197
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
198
 
199
  // MAC RX
200
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
201
  .mcoll_o(MColl),        .mcrs_o(MCrs),
202
 
203
  // MIIM
204
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
205
 
206
  // SYSTEM
207
  .phy_log(phy_log_file_desc)
208 116 mohor
);
209
 
210
 
211 169 mohor
 
212
// Connecting WB Master as Host Interface
213
integer host_log_file_desc;
214
 
215
WB_MASTER_BEHAVIORAL wb_master
216 116 mohor
(
217 169 mohor
    .CLK_I(wb_clk),
218
    .RST_I(wb_rst),
219
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
220
    .TAG_O(),
221
    .ACK_I(eth_sl_wb_ack_o),
222
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
223
    .CYC_O(eth_sl_wb_cyc_i),
224
    .DAT_I(eth_sl_wb_dat_o),
225
    .DAT_O(eth_sl_wb_dat_i),
226
    .ERR_I(eth_sl_wb_err_o),
227
    .RTY_I(1'b0),  // inactive (1'b0)
228
    .SEL_O(eth_sl_wb_sel_i),
229
    .STB_O(eth_sl_wb_stb_i),
230
    .WE_O (eth_sl_wb_we_i),
231
    .CAB_O()       // NOT USED for now!
232
);
233
 
234
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
235
 
236
 
237
 
238
// Connecting WB Slave as Memory Interface Module
239
integer memory_log_file_desc;
240
 
241
WB_SLAVE_BEHAVIORAL wb_slave
242
(
243
    .CLK_I(wb_clk),
244
    .RST_I(wb_rst),
245
    .ACK_O(eth_ma_wb_ack_i),
246
    .ADR_I(eth_ma_wb_adr_o),
247
    .CYC_I(eth_ma_wb_cyc_o),
248
    .DAT_O(eth_ma_wb_dat_i),
249
    .DAT_I(eth_ma_wb_dat_o),
250
    .ERR_O(eth_ma_wb_err_i),
251
    .RTY_O(),      // NOT USED for now!
252
    .SEL_I(eth_ma_wb_sel_o),
253
    .STB_I(eth_ma_wb_stb_o),
254
    .WE_I (eth_ma_wb_we_o),
255
    .CAB_I(1'b0)   // inactive (1'b0)
256
);
257
 
258
 
259
 
260
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
261
integer wb_s_mon_log_file_desc ;
262
integer wb_m_mon_log_file_desc ;
263
 
264
WB_BUS_MON wb_eth_slave_bus_mon
265
(
266 116 mohor
  // WISHBONE common
267 169 mohor
  .CLK_I(wb_clk),
268
  .RST_I(wb_rst),
269 116 mohor
 
270 169 mohor
  // WISHBONE slave
271
  .ACK_I(eth_sl_wb_ack_o),
272
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
273
  .CYC_O(eth_sl_wb_cyc_i),
274
  .DAT_I(eth_sl_wb_dat_o),
275
  .DAT_O(eth_sl_wb_dat_i),
276
  .ERR_I(eth_sl_wb_err_o),
277
  .RTY_I(1'b0),
278
  .SEL_O(eth_sl_wb_sel_i),
279
  .STB_O(eth_sl_wb_stb_i),
280
  .WE_O (eth_sl_wb_we_i),
281
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
282
  .TAG_O(),
283
  .CAB_O(1'b0),
284
  .log_file_desc (wb_s_mon_log_file_desc)
285
);
286
 
287
WB_BUS_MON wb_eth_master_bus_mon
288
(
289
  // WISHBONE common
290
  .CLK_I(wb_clk),
291
  .RST_I(wb_rst),
292
 
293 116 mohor
  // WISHBONE master
294 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
295
  .ADDR_O(eth_ma_wb_adr_o),
296
  .CYC_O(eth_ma_wb_cyc_o),
297
  .DAT_I(eth_ma_wb_dat_i),
298
  .DAT_O(eth_ma_wb_dat_o),
299
  .ERR_I(eth_ma_wb_err_i),
300
  .RTY_I(1'b0),
301
  .SEL_O(eth_ma_wb_sel_o),
302
  .STB_O(eth_ma_wb_stb_o),
303
  .WE_O (eth_ma_wb_we_o),
304
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
305
  .TAG_O(),
306
  .CAB_O(1'b0),
307
  .log_file_desc(wb_m_mon_log_file_desc)
308 116 mohor
);
309
 
310
 
311
 
312 169 mohor
reg         StartTB;
313
integer     tb_log_file;
314 116 mohor
 
315 169 mohor
initial
316
begin
317
  tb_log_file = $fopen("../log/eth_tb.log");
318
  if (tb_log_file < 2)
319
  begin
320
    $display("*E Could not open/create testbench log file in ../log/ directory!");
321
    $finish;
322
  end
323
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
324
  $fdisplay(tb_log_file, " ");
325 116 mohor
 
326 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
327
  if (phy_log_file_desc < 2)
328
  begin
329
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
330
    $finish;
331
  end
332
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
333
  $fdisplay(phy_log_file_desc, " ");
334
 
335
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
336
  if (memory_log_file_desc < 2)
337
  begin
338
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
339
    $finish;
340
  end
341
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
342
  $fdisplay(memory_log_file_desc, " ");
343
 
344
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
345
  if (host_log_file_desc < 2)
346
  begin
347
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
348
    $finish;
349
  end
350
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
351
  $fdisplay(host_log_file_desc, " ");
352
 
353
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
354
  if (wb_s_mon_log_file_desc < 2)
355
  begin
356
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
357
    $finish;
358
  end
359
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
360
  $fdisplay(wb_s_mon_log_file_desc, " ");
361
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
362
  $fdisplay(wb_s_mon_log_file_desc, " ");
363
 
364
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
365
  if (wb_m_mon_log_file_desc < 2)
366
  begin
367
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
368
    $finish;
369
  end
370
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
371
  $fdisplay(wb_m_mon_log_file_desc, " ");
372
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
373
  $fdisplay(wb_m_mon_log_file_desc, " ");
374
 
375
  // Clear memories
376
  clear_memories;
377
 
378
  // Reset pulse
379
  wb_rst =  1'b1;
380
  #423 wb_rst =  1'b0;
381
  #423 StartTB  =  1'b1;
382
end
383
 
384
 
385
 
386
// Generating wb_clk clock
387 116 mohor
initial
388
begin
389 169 mohor
  wb_clk=0;
390
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
391 209 tadejm
  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
392 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
393
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
394
//  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
395 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
396 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
397
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
398
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
399
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
400 116 mohor
end
401
 
402
 
403
 
404 169 mohor
integer      tests_successfull;
405
integer      tests_failed;
406
reg [799:0]  test_name; // used for tb_log_file
407 121 mohor
 
408 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
409
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
410
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
411
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
412
 
413 116 mohor
initial
414
begin
415 169 mohor
  wait(StartTB);  // Start of testbench
416
 
417
  // Initial global values
418
  tests_successfull = 0;
419
  tests_failed = 0;
420
 
421
  wbm_init_waits = 4'h1;
422
  wbm_subseq_waits = 4'h3;
423
  wbs_waits = 4'h1;
424
  wbs_retries = 8'h2;
425
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
426
 
427
 
428
  //  Call tests
429
  //  ----------
430 194 tadej
//    test_access_to_mac_reg(0, 3);           // 0 - 3
431
//    test_mii(0, 17);                        // 0 - 17
432 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
433
  eth_phy.carrier_sense_real_delay(0);
434 223 tadejm
    test_mac_full_duplex_transmit(20, 20);    // 0 - (21)
435
//    test_mac_full_duplex_receive(0, 5);
436 209 tadejm
//    test_mac_full_duplex_flow(0, 0);
437 169 mohor
 
438
  test_note("PHY generates 'real' Carrier sense and Collision signals for following tests");
439
  eth_phy.carrier_sense_real_delay(1);
440
 
441
 
442
  // Finish test's logs
443
  test_summary;
444
  $display("\n\n END of SIMULATION");
445
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
446
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
447
 
448
  $stop;
449 116 mohor
end
450 169 mohor
 
451 116 mohor
 
452 169 mohor
 
453
//////////////////////////////////////////////////////////////
454
// Test tasks
455
//////////////////////////////////////////////////////////////
456
 
457
task test_access_to_mac_reg;
458
  input  [31:0]  start_task;
459
  input  [31:0]  end_task;
460
  integer        bit_start_1;
461
  integer        bit_end_1;
462
  integer        bit_start_2;
463
  integer        bit_end_2;
464
  integer        num_of_reg;
465
  integer        i_addr;
466
  integer        i_data;
467
  integer        i_length;
468
  integer        tmp_data;
469
  reg    [31:0]  tx_bd_num;
470
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
471
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
472
  integer        i;
473
  integer        i1;
474
  integer        i2;
475
  integer        i3;
476
  integer        fail;
477 178 mohor
  integer        test_num;
478 169 mohor
  reg    [31:0]  addr;
479
  reg    [31:0]  data;
480
  reg    [31:0]  data_max;
481 116 mohor
begin
482 169 mohor
// ACCESS TO MAC REGISTERS TEST
483
test_heading("ACCESS TO MAC REGISTERS TEST");
484
$display(" ");
485
$display("ACCESS TO MAC REGISTERS TEST");
486
fail = 0;
487
 
488 192 tadej
// reset MAC registers
489
hard_reset;
490
// reset MAC and MII LOGIC with soft reset
491
reset_mac;
492
reset_mii;
493 169 mohor
 
494 192 tadej
 
495 178 mohor
//////////////////////////////////////////////////////////////////////
496
////                                                              ////
497
////  test_access_to_mac_reg:                                     ////
498
////                                                              ////
499
////  0: Walking 1 with single cycles across MAC regs.            ////
500
////  1: Walking 1 with single cycles across MAC buffer descript. ////
501
////  2: Test max reg. values and reg. values after writing       ////
502
////     inverse reset values and hard reset of the MAC           ////
503
////  3: Test buffer desc. RAM preserving values after hard reset ////
504
////     of the MAC and resetting the logic                       ////
505
////                                                              ////
506
//////////////////////////////////////////////////////////////////////
507 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
508 169 mohor
begin
509
 
510 178 mohor
  ////////////////////////////////////////////////////////////////////
511
  ////                                                            ////
512
  ////  Walking 1 with single cycles across MAC regs.             ////
513
  ////                                                            ////
514
  ////////////////////////////////////////////////////////////////////
515
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
516 194 tadej
  begin
517
    // TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
518
    test_name   = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
519
    `TIME; $display("  TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
520 178 mohor
 
521 194 tadej
    data = 0;
522
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
523
      begin
524
        wbm_init_waits = i;
525
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
526
        for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
527
          begin
528
            addr = `ETH_BASE + i_addr;
529
            // set ranges of R/W bits
530
            case (addr)
531
              `ETH_MODER:
532
                begin
533
                  bit_start_1 = 0;
534
                  bit_end_1   = 16;
535
                  bit_start_2 = 32; // not used
536
                  bit_end_2   = 32; // not used
537
                end
538
              `ETH_INT: // READONLY - tested within INT test
539
                begin
540
                  bit_start_1 = 32; // not used
541
                  bit_end_1   = 32; // not used
542
                  bit_start_2 = 32; // not used
543
                  bit_end_2   = 32; // not used
544
                end
545
              `ETH_INT_MASK:
546
                begin
547
                  bit_start_1 = 0;
548
                  bit_end_1   = 6;
549
                  bit_start_2 = 32; // not used
550
                  bit_end_2   = 32; // not used
551
                end
552
              `ETH_IPGT:
553
                begin
554
                  bit_start_1 = 0;
555
                  bit_end_1   = 6;
556
                  bit_start_2 = 32; // not used
557
                  bit_end_2   = 32; // not used
558
                end
559
              `ETH_IPGR1:
560
                begin
561
                  bit_start_1 = 0;
562
                  bit_end_1   = 6;
563
                  bit_start_2 = 32; // not used
564
                  bit_end_2   = 32; // not used
565
                end
566
              `ETH_IPGR2:
567
                begin
568
                  bit_start_1 = 0;
569
                  bit_end_1   = 6;
570
                  bit_start_2 = 32; // not used
571
                  bit_end_2   = 32; // not used
572
                end
573
              `ETH_PACKETLEN:
574
                begin
575
                  bit_start_1 = 0;
576
                  bit_end_1   = 31;
577
                  bit_start_2 = 32; // not used
578
                  bit_end_2   = 32; // not used
579
                end
580
              `ETH_COLLCONF:
581
                begin
582
                  bit_start_1 = 0;
583
                  bit_end_1   = 5;
584
                  bit_start_2 = 16;
585
                  bit_end_2   = 19;
586
                end
587
              `ETH_TX_BD_NUM:
588
                begin
589
                  bit_start_1 = 0;
590
                  bit_end_1   = 7;
591
                  bit_start_2 = 32; // not used
592
                  bit_end_2   = 32; // not used
593
                end
594
              `ETH_CTRLMODER:
595
                begin
596
                  bit_start_1 = 0;
597
                  bit_end_1   = 2;
598
                  bit_start_2 = 32; // not used
599
                  bit_end_2   = 32; // not used
600
                end
601
              `ETH_MIIMODER:
602
                begin
603
                  bit_start_1 = 0;
604
                  bit_end_1   = 9;
605
                  bit_start_2 = 32; // not used
606
                  bit_end_2   = 32; // not used
607
                end
608
              `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
609
                begin
610
                  bit_start_1 = 32; // not used
611
                  bit_end_1   = 32; // not used
612
                  bit_start_2 = 32; // not used
613
                  bit_end_2   = 32; // not used
614
                end
615
              `ETH_MIIADDRESS:
616
                begin
617
                  bit_start_1 = 0;
618
                  bit_end_1   = 4;
619
                  bit_start_2 = 8;
620
                  bit_end_2   = 12;
621
                end
622
              `ETH_MIITX_DATA:
623
                begin
624
                  bit_start_1 = 0;
625
                  bit_end_1   = 15;
626
                  bit_start_2 = 32; // not used
627
                  bit_end_2   = 32; // not used
628
                end
629
              `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
630
                begin
631
                  bit_start_1 = 32; // not used
632
                  bit_end_1   = 32; // not used
633
                  bit_start_2 = 32; // not used
634
                  bit_end_2   = 32; // not used
635
                end
636
              `ETH_MIISTATUS: // READONLY - tested within MIIM test
637
                begin
638
                  bit_start_1 = 32; // not used
639
                  bit_end_1   = 32; // not used
640
                  bit_start_2 = 32; // not used
641
                  bit_end_2   = 32; // not used
642
                end
643
              `ETH_MAC_ADDR0:
644
                begin
645
                  bit_start_1 = 0;
646
                  bit_end_1   = 31;
647
                  bit_start_2 = 32; // not used
648
                  bit_end_2   = 32; // not used
649 178 mohor
                  end
650 194 tadej
              `ETH_MAC_ADDR1:
651
                begin
652
                  bit_start_1 = 0;
653
                  bit_end_1   = 15;
654
                  bit_start_2 = 32; // not used
655
                  bit_end_2   = 32; // not used
656
                end
657
              `ETH_HASH_ADDR0:
658
                begin
659
                  bit_start_1 = 0;
660
                  bit_end_1   = 31;
661
                  bit_start_2 = 32; // not used
662
                  bit_end_2   = 32; // not used
663
                end
664
              default: // `ETH_HASH_ADDR1:
665
                begin
666
                  bit_start_1 = 0;
667
                  bit_end_1   = 31;
668
                  bit_start_2 = 32; // not used
669
                  bit_end_2   = 32; // not used
670
                end
671
            endcase
672
 
673
            for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
674
              begin
675
                data = 1'b1 << i_data;
676
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
677
                  ;
678
                else
679 178 mohor
                  begin
680 194 tadej
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
681
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
682
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
683
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
684
                      begin
685
                        if (tmp_data !== data)
686 178 mohor
                        begin
687 194 tadej
                          fail = fail + 1;
688
                          test_fail("RW bit of the MAC register was not written or not read");
689
                          `TIME;
690
                          $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
691
                                    wbm_init_waits, addr, data, tmp_data);
692
                        end
693
                      end
694
                    else // data should not be equal to tmp_data
695
                      begin
696
                        if (tmp_data === data)
697 178 mohor
                          begin
698
                            fail = fail + 1;
699 194 tadej
                            test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
700 178 mohor
                            `TIME;
701 194 tadej
                            $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
702 178 mohor
                                      wbm_init_waits, addr, data, tmp_data);
703
                          end
704 194 tadej
                      end
705
                  end
706
              end
707
          end
708
      end
709 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
710
    $display("    ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
711 194 tadej
    if(fail == 0)
712
      test_ok;
713
    else
714
      fail = 0;    // Errors were reported previously
715
  end
716 178 mohor
 
717
 
718
  ////////////////////////////////////////////////////////////////////
719
  ////                                                            ////
720
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
721
  ////                                                            ////
722
  ////////////////////////////////////////////////////////////////////
723
  if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
724 169 mohor
  begin
725 194 tadej
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
726
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
727
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
728 178 mohor
 
729
    data = 0;
730
    // set TX and RX buffer descriptors
731
    tx_bd_num = 32'h40;
732
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
733
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
734
    begin
735 169 mohor
      wbm_init_waits = i;
736
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
737 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
738 169 mohor
      begin
739
        addr = `ETH_BASE + i_addr;
740 178 mohor
        if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
741
        begin
742
          // set ranges of R/W bits
743
          case (addr[3])
744
            1'b0: // buffer control bits
745
            begin
746
              bit_start_1 = 0;
747
              bit_end_1   = 31; // 8;
748
              bit_start_2 = 11;
749
              bit_end_2   = 31;
750
            end
751
            default: // 1'b1: // buffer pointer
752
            begin
753
              bit_start_1 = 0;
754
              bit_end_1   = 31;
755
              bit_start_2 = 32; // not used
756
              bit_end_2   = 32; // not used
757
            end
758
          endcase
759
        end
760
        else // RX buffer descriptors
761
        begin
762
          // set ranges of R/W bits
763
          case (addr[3])
764
            1'b0: // buffer control bits
765
            begin
766
              bit_start_1 = 0;
767
              bit_end_1   = 31; // 7;
768
              bit_start_2 = 13;
769
              bit_end_2   = 31;
770
            end
771
            default: // 1'b1: // buffer pointer
772
            begin
773
              bit_start_1 = 0;
774
              bit_end_1   = 31;
775
              bit_start_2 = 32; // not used
776
              bit_end_2   = 32; // not used
777
            end
778
          endcase
779
        end
780
 
781 169 mohor
        for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
782
        begin
783
          data = 1'b1 << i_data;
784 178 mohor
          if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
785
            ;
786 169 mohor
          else
787
          begin
788
            wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
789
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
790
            if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
791
                 ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
792
            begin
793
              if (tmp_data !== data)
794
              begin
795
                fail = fail + 1;
796 178 mohor
                test_fail("RW bit of the MAC buffer descriptors was not written or not read");
797 169 mohor
                `TIME;
798
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
799
                          wbm_init_waits, addr, data, tmp_data);
800
              end
801
            end
802
            else // data should not be equal to tmp_data
803
            begin
804
              if (tmp_data === data)
805
              begin
806
                fail = fail + 1;
807 178 mohor
                test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
808 169 mohor
                `TIME;
809
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
810
                          wbm_init_waits, addr, data, tmp_data);
811
              end
812
            end
813
          end
814
        end
815
      end
816 178 mohor
      // INTERMEDIATE DISPLAYS
817
      case (i)
818 209 tadejm
        0:       $display("    ->buffer descriptors tested with 0 bus delay");
819
        1:       $display("    ->buffer descriptors tested with 1 bus delay cycle");
820
        2:       $display("    ->buffer descriptors tested with 2 bus delay cycles");
821
        3:       $display("    ->buffer descriptors tested with 3 bus delay cycles");
822
        default: $display("    ->buffer descriptors tested with 4 bus delay cycles");
823 178 mohor
      endcase
824
    end
825
    if(fail == 0)
826
      test_ok;
827
    else
828
      fail = 0;
829 169 mohor
  end
830 178 mohor
 
831
 
832
  ////////////////////////////////////////////////////////////////////
833
  ////                                                            ////
834
  ////  Test max reg. values and reg. values after writing        ////
835
  ////  inverse reset values and hard reset of the MAC            ////
836
  ////                                                            ////
837
  ////////////////////////////////////////////////////////////////////
838
  if (test_num == 2) // Start this task
839 169 mohor
  begin
840 194 tadej
    // TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
841 178 mohor
    test_name   =
842 194 tadej
      "TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
843 178 mohor
    `TIME; $display(
844 194 tadej
      "  TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
845 178 mohor
 
846
    // reset MAC registers
847
    hard_reset;
848
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
849 169 mohor
    begin
850 178 mohor
      for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
851 169 mohor
      begin
852 178 mohor
        addr = `ETH_BASE + i_addr;
853
        // set ranges of R/W bits
854
        case (addr)
855
          `ETH_MODER:
856 169 mohor
          begin
857 178 mohor
            data = 32'h0000_A800;
858
            data_max = 32'h0001_FFFF;
859 169 mohor
          end
860 178 mohor
          `ETH_INT: // READONLY - tested within INT test
861 169 mohor
          begin
862 178 mohor
            data = 32'h0000_0000;
863
            data_max = 32'h0000_0000;
864 169 mohor
          end
865
          `ETH_INT_MASK:
866 178 mohor
          begin
867
            data = 32'h0000_0000;
868
            data_max = 32'h0000_007F;
869
          end
870 169 mohor
          `ETH_IPGT:
871 178 mohor
          begin
872
            data = 32'h0000_0012;
873
            data_max = 32'h0000_007F;
874
          end
875 169 mohor
          `ETH_IPGR1:
876 178 mohor
          begin
877
            data = 32'h0000_000C;
878
            data_max = 32'h0000_007F;
879
          end
880 169 mohor
          `ETH_IPGR2:
881 178 mohor
          begin
882
            data = 32'h0000_0012;
883
            data_max = 32'h0000_007F;
884
          end
885 169 mohor
          `ETH_PACKETLEN:
886 178 mohor
          begin
887
            data = 32'h0040_0600;
888
            data_max = 32'hFFFF_FFFF;
889
          end
890 169 mohor
          `ETH_COLLCONF:
891 178 mohor
          begin
892
            data = 32'h000F_003F;
893
            data_max = 32'h000F_003F;
894
          end
895 169 mohor
          `ETH_TX_BD_NUM:
896 178 mohor
          begin
897
            data = 32'h0000_0040;
898
            data_max = 32'h0000_0080;
899
          end
900 169 mohor
          `ETH_CTRLMODER:
901 178 mohor
          begin
902
            data = 32'h0000_0000;
903
            data_max = 32'h0000_0007;
904
          end
905 169 mohor
          `ETH_MIIMODER:
906 178 mohor
          begin
907
            data = 32'h0000_0064;
908
            data_max = 32'h0000_03FF;
909
          end
910 169 mohor
          `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
911 178 mohor
          begin
912
            data = 32'h0000_0000;
913
            data_max = 32'h0000_0007;
914
          end
915 169 mohor
          `ETH_MIIADDRESS:
916 178 mohor
          begin
917
            data = 32'h0000_0000;
918
            data_max = 32'h0000_1F1F;
919
          end
920 169 mohor
          `ETH_MIITX_DATA:
921 178 mohor
          begin
922
            data = 32'h0000_0000;
923
            data_max = 32'h0000_FFFF;
924
          end
925 169 mohor
          `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
926
          begin
927 178 mohor
            data = 32'h0000_0000;
928
            data_max = 32'h0000_0000;
929 169 mohor
          end
930 178 mohor
          `ETH_MIISTATUS: // READONLY - tested within MIIM test
931 169 mohor
          begin
932 178 mohor
            data = 32'h0000_0000;
933
            data_max = 32'h0000_0000;
934 169 mohor
          end
935 178 mohor
          `ETH_MAC_ADDR0:
936 169 mohor
          begin
937 178 mohor
            data = 32'h0000_0000;
938
            data_max = 32'hFFFF_FFFF;
939 169 mohor
          end
940 178 mohor
          `ETH_MAC_ADDR1:
941 169 mohor
          begin
942 178 mohor
            data = 32'h0000_0000;
943
            data_max = 32'h0000_FFFF;
944 169 mohor
          end
945 178 mohor
          `ETH_HASH_ADDR0:
946 169 mohor
          begin
947 178 mohor
            data = 32'h0000_0000;
948
            data_max = 32'hFFFF_FFFF;
949 169 mohor
          end
950 178 mohor
          default: // `ETH_HASH_ADDR1:
951 169 mohor
          begin
952 178 mohor
            data = 32'h0000_0000;
953
            data_max = 32'hFFFF_FFFF;
954 169 mohor
          end
955
        endcase
956 178 mohor
 
957
        wbm_init_waits = {$random} % 3;
958
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
959
        if (i == 0)
960
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
961
        else if (i == 2)
962
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
963
        else if ((i == 1) || (i == 4))
964 169 mohor
        begin
965 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
966
          if (tmp_data !== data)
967
          begin
968
            fail = fail + 1;
969
            test_fail("RESET value of the MAC register is not correct");
970
            `TIME;
971
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
972
          end
973 169 mohor
        end
974 178 mohor
        else // check maximum values
975 169 mohor
        begin
976
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
977 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
978 169 mohor
          begin
979
            if (tmp_data !== data)
980
            begin
981
              fail = fail + 1;
982 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
983 169 mohor
              `TIME;
984 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
985 169 mohor
            end
986 178 mohor
            // try maximum (80)
987
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
988
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
989
            if (tmp_data !== data_max)
990
            begin
991
              fail = fail + 1;
992
              test_fail("MAX value of the TX_BD_NUM register is not correct");
993
              `TIME;
994
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
995
            end
996
            // try one less than maximum (80)
997
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
998
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
999
            if (tmp_data !== (data_max - 1))
1000
            begin
1001
              fail = fail + 1;
1002
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1003
              `TIME;
1004
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1005
            end
1006
            // try one more than maximum (80)
1007
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1008
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1009
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1010
            begin
1011
              fail = fail + 1;
1012
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1013
              `TIME;
1014
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1015
            end
1016 169 mohor
          end
1017 178 mohor
          else
1018 169 mohor
          begin
1019 178 mohor
            if (tmp_data !== data_max)
1020 169 mohor
            begin
1021
              fail = fail + 1;
1022 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1023 169 mohor
              `TIME;
1024 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1025 169 mohor
            end
1026
          end
1027
        end
1028
      end
1029 178 mohor
      // reset MAC registers
1030
      if ((i == 0) || (i == 3))
1031
        hard_reset;
1032 169 mohor
    end
1033 178 mohor
    if(fail == 0)
1034
      test_ok;
1035
    else
1036
      fail = 0;
1037 169 mohor
  end
1038 116 mohor
 
1039 156 mohor
 
1040 181 mohor
  ////////////////////////////////////////////////////////////////////
1041
  ////                                                            ////
1042
  ////  Test buffer desc. ram preserving values after hard reset  ////
1043
  ////  of the mac and reseting the logic                         ////
1044
  ////                                                            ////
1045
  ////////////////////////////////////////////////////////////////////
1046 178 mohor
  if (test_num == 3) // Start this task
1047 169 mohor
  begin
1048 194 tadej
    // TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1049
    test_name   = "TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1050 178 mohor
    `TIME;
1051 194 tadej
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1052 178 mohor
 
1053
    // reset MAC registers
1054
    hard_reset;
1055
    // reset LOGIC with soft reset
1056
    reset_mac;
1057
    reset_mii;
1058
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1059 169 mohor
    begin
1060 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1061 169 mohor
      begin
1062 178 mohor
        addr = `ETH_BASE + i_addr;
1063
 
1064
        wbm_init_waits = {$random} % 3;
1065
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1066
        if (i == 0)
1067 169 mohor
        begin
1068 178 mohor
          data = 32'hFFFFFFFF;
1069
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1070 169 mohor
        end
1071 178 mohor
        else if (i == 2)
1072 169 mohor
        begin
1073 178 mohor
          data = 32'h00000000;
1074
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1075 169 mohor
        end
1076
        else
1077
        begin
1078 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1079
          if (tmp_data !== data)
1080 169 mohor
          begin
1081
            fail = fail + 1;
1082 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1083 169 mohor
            `TIME;
1084 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1085 169 mohor
          end
1086
        end
1087
      end
1088 178 mohor
      if ((i == 0) || (i == 2))
1089
      begin
1090
        // reset MAC registers
1091
        hard_reset;
1092
        // reset LOGIC with soft reset
1093
        reset_mac;
1094
        reset_mii;
1095
      end
1096 169 mohor
    end
1097 178 mohor
    if(fail == 0)
1098
      test_ok;
1099
    else
1100
    fail = 0;
1101 169 mohor
  end
1102 116 mohor
 
1103
 
1104 178 mohor
  if (test_num == 4) // Start this task
1105 169 mohor
  begin
1106 194 tadej
        /*  // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1107
          test_name   = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1108
          `TIME; $display("  TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1109 178 mohor
 
1110
          data = 0;
1111
          burst_data = 0;
1112
          burst_tmp_data = 0;
1113
          i_length = 10; // two bursts for length 20
1114
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1115
          begin
1116
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1117
            begin
1118
              wbm_init_waits = i;
1119
              wbm_subseq_waits = i1;
1120
              #1;
1121
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1122
              begin
1123
                data = 1'b1 << i_data;
1124
                #1;
1125
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1126
                begin
1127
                  burst_data = burst_data << 32;
1128
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1129
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1130
                  begin
1131
                    #1 burst_data[31:0] = 0;
1132
                  end
1133
                  else
1134
                  begin
1135
                    #1 burst_data[31:0] = data;
1136
                  end
1137
                end
1138
                #1;
1139
                // 2 burst writes
1140
                addr = `ETH_BASE; // address of a first burst
1141
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1142
                burst_tmp_data = burst_data >> (32 * i_length);
1143
                addr = addr + 32'h28; // address of a second burst
1144
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1145
                #1;
1146
                // 2 burst reads
1147
                addr = `ETH_BASE; // address of a first burst
1148
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1149
                         wbm_init_waits, wbm_subseq_waits); // first burst
1150
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1151
                addr = addr + 32'h28; // address of a second burst
1152
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1153
                         wbm_init_waits, wbm_subseq_waits); // second burst
1154
                #1;
1155
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1156
                begin
1157
                  // set ranges of R/W bits
1158
                  case (`ETH_BASE + i2)
1159
                  `ETH_MODER:
1160
                    begin
1161
                      bit_start_1 = 0;
1162
                      bit_end_1   = 16;
1163
                      bit_start_2 = 32; // not used
1164
                      bit_end_2   = 32; // not used
1165
                    end
1166
                  `ETH_INT: // READONLY - tested within INT test
1167
                    begin
1168
                      bit_start_1 = 32; // not used
1169
                      bit_end_1   = 32; // not used
1170
                      bit_start_2 = 32; // not used
1171
                      bit_end_2   = 32; // not used
1172
                    end
1173
                  `ETH_INT_MASK:
1174
                    begin
1175
                      bit_start_1 = 0;
1176
                      bit_end_1   = 6;
1177
                      bit_start_2 = 32; // not used
1178
                      bit_end_2   = 32; // not used
1179
                    end
1180
                  `ETH_IPGT:
1181
                    begin
1182
                      bit_start_1 = 0;
1183
                      bit_end_1   = 6;
1184
                      bit_start_2 = 32; // not used
1185
                      bit_end_2   = 32; // not used
1186
                    end
1187
                  `ETH_IPGR1:
1188
                    begin
1189
                      bit_start_1 = 0;
1190
                      bit_end_1   = 6;
1191
                      bit_start_2 = 32; // not used
1192
                      bit_end_2   = 32; // not used
1193
                    end
1194
                  `ETH_IPGR2:
1195
                    begin
1196
                      bit_start_1 = 0;
1197
                      bit_end_1   = 6;
1198
                      bit_start_2 = 32; // not used
1199
                      bit_end_2   = 32; // not used
1200
                    end
1201
                  `ETH_PACKETLEN:
1202
                    begin
1203
                      bit_start_1 = 0;
1204
                      bit_end_1   = 31;
1205
                      bit_start_2 = 32; // not used
1206
                      bit_end_2   = 32; // not used
1207
                    end
1208
                  `ETH_COLLCONF:
1209
                    begin
1210
                      bit_start_1 = 0;
1211
                      bit_end_1   = 5;
1212
                      bit_start_2 = 16;
1213
                      bit_end_2   = 19;
1214
                    end
1215
                  `ETH_TX_BD_NUM:
1216
                    begin
1217
                      bit_start_1 = 0;
1218
                      bit_end_1   = 7;
1219
                      bit_start_2 = 32; // not used
1220
                      bit_end_2   = 32; // not used
1221
                    end
1222
                  `ETH_CTRLMODER:
1223
                    begin
1224
                      bit_start_1 = 0;
1225
                      bit_end_1   = 2;
1226
                      bit_start_2 = 32; // not used
1227
                      bit_end_2   = 32; // not used
1228
                    end
1229
                  `ETH_MIIMODER:
1230
                    begin
1231
                      bit_start_1 = 0;
1232
                      bit_end_1   = 9;
1233
                      bit_start_2 = 32; // not used
1234
                      bit_end_2   = 32; // not used
1235
                    end
1236
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1237
                    begin
1238
                      bit_start_1 = 32; // not used
1239
                      bit_end_1   = 32; // not used
1240
                      bit_start_2 = 32; // not used
1241
                      bit_end_2   = 32; // not used
1242
                    end
1243
                  `ETH_MIIADDRESS:
1244
                    begin
1245
                      bit_start_1 = 0;
1246
                      bit_end_1   = 4;
1247
                      bit_start_2 = 8;
1248
                      bit_end_2   = 12;
1249
                    end
1250
                  `ETH_MIITX_DATA:
1251
                    begin
1252
                      bit_start_1 = 0;
1253
                      bit_end_1   = 15;
1254
                      bit_start_2 = 32; // not used
1255
                      bit_end_2   = 32; // not used
1256
                    end
1257
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1258
                    begin
1259
                      bit_start_1 = 32; // not used
1260
                      bit_end_1   = 32; // not used
1261
                      bit_start_2 = 32; // not used
1262
                      bit_end_2   = 32; // not used
1263
                    end
1264
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1265
                    begin
1266
                      bit_start_1 = 32; // not used
1267
                      bit_end_1   = 32; // not used
1268
                      bit_start_2 = 32; // not used
1269
                      bit_end_2   = 32; // not used
1270
                    end
1271
                  `ETH_MAC_ADDR0:
1272
                    begin
1273
                      bit_start_1 = 0;
1274
                      bit_end_1   = 31;
1275
                      bit_start_2 = 32; // not used
1276
                      bit_end_2   = 32; // not used
1277
                    end
1278
                  `ETH_MAC_ADDR1:
1279
                    begin
1280
                      bit_start_1 = 0;
1281
                      bit_end_1   = 15;
1282
                      bit_start_2 = 32; // not used
1283
                      bit_end_2   = 32; // not used
1284
                    end
1285
                  `ETH_HASH_ADDR0:
1286
                    begin
1287
                      bit_start_1 = 0;
1288
                      bit_end_1   = 31;
1289
                      bit_start_2 = 32; // not used
1290
                      bit_end_2   = 32; // not used
1291
                    end
1292
                  default: // `ETH_HASH_ADDR1:
1293
                    begin
1294
                      bit_start_1 = 0;
1295
                      bit_end_1   = 31;
1296
                      bit_start_2 = 32; // not used
1297
                      bit_end_2   = 32; // not used
1298
                    end
1299
                  endcase
1300
                  #1;
1301
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1302
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1303
                  begin
1304
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1305
                    begin
1306
                      fail = fail + 1;
1307
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1308
                      `TIME;
1309
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1310
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1311
                    end
1312
                  end
1313
                  else
1314
                  begin
1315
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1316
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1317
                    begin
1318
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1319
                      begin
1320
                        fail = fail + 1;
1321
                        test_fail("RW bit of the MAC register was not written or not read");
1322
                        `TIME;
1323
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1324
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1325
                      end
1326
                    end
1327
                    else // data should not be equal to tmp_data
1328
                    begin
1329
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1330
                      begin
1331
                        fail = fail + 1;
1332
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1333
                        `TIME;
1334
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1335
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1336
                      end
1337
                    end
1338
                  end
1339
                  burst_tmp_data = burst_tmp_data >> 32;
1340
                  burst_data = burst_data >> 32;
1341
                end
1342
              end
1343
            end
1344
          end
1345
          if(fail == 0)
1346
            test_ok;
1347
          else
1348
            fail = 0;*/
1349
  end
1350 116 mohor
 
1351 169 mohor
end
1352 156 mohor
 
1353 169 mohor
end
1354
endtask // test_access_to_mac_reg
1355 156 mohor
 
1356
 
1357 169 mohor
task test_mii;
1358
  input  [31:0]  start_task;
1359
  input  [31:0]  end_task;
1360
  integer        i;
1361
  integer        i1;
1362
  integer        i2;
1363
  integer        i3;
1364
  integer        cnt;
1365
  integer        fail;
1366 181 mohor
  integer        test_num;
1367 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1368
  reg     [4:0]  phy_addr;
1369
  reg     [4:0]  reg_addr;
1370
  reg     [15:0] phy_data;
1371
  reg     [15:0] tmp_data;
1372
begin
1373
// MIIM MODULE TEST
1374
test_heading("MIIM MODULE TEST");
1375
$display(" ");
1376
$display("MIIM MODULE TEST");
1377
fail = 0;
1378 156 mohor
 
1379 192 tadej
// reset MAC registers
1380
hard_reset;
1381
// reset MAC and MII LOGIC with soft reset
1382
reset_mac;
1383 169 mohor
reset_mii;
1384 116 mohor
 
1385 194 tadej
 
1386 181 mohor
//////////////////////////////////////////////////////////////////////
1387
////                                                              ////
1388
////  test_mii:                                                   ////
1389
////                                                              ////
1390
////  0:  Test clock divider of mii management module with all    ////
1391
////      possible frequences.                                    ////
1392
////  1:  Test various readings from 'real' phy registers.        ////
1393
////  2:  Test various writings to 'real' phy registers (control  ////
1394
////      and non writable registers)                             ////
1395
////  3:  Test reset phy through mii management module            ////
1396
////  4:  Test 'walking one' across phy address (with and without ////
1397
////      preamble)                                               ////
1398
////  5:  Test 'walking one' across phy's register address (with  ////
1399
////      and without preamble)                                   ////
1400
////  6:  Test 'walking one' across phy's data (with and without  ////
1401
////      preamble)                                               ////
1402
////  7:  Test reading from phy with wrong phy address (host      ////
1403
////      reading high 'z' data)                                  ////
1404
////  8:  Test writing to phy with wrong phy address and reading  ////
1405
////      from correct one                                        ////
1406
////  9:  Test sliding stop scan command immediately after read   ////
1407
////      request (with and without preamble)                     ////
1408
//// 10:  Test sliding stop scan command immediately after write  ////
1409
////      request (with and without preamble)                     ////
1410
//// 11:  Test busy and nvalid status durations during write      ////
1411
////      (with and without preamble)                             ////
1412
//// 12:  Test busy and nvalid status durations during write      ////
1413
////      (with and without preamble)                             ////
1414
//// 13:  Test busy and nvalid status durations during scan (with ////
1415
////      and without preamble)                                   ////
1416
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1417
////      (with and without preamble)                             ////
1418
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1419
////      (with and without preamble)                             ////
1420
//// 16:  Test sliding stop scan command immediately after scan   ////
1421
////      request (with and without preamble)                     ////
1422
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1423
////      without preamble)                                       ////
1424
////                                                              ////
1425
//////////////////////////////////////////////////////////////////////
1426 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1427 169 mohor
begin
1428 194 tadej
 
1429 181 mohor
  ////////////////////////////////////////////////////////////////////
1430
  ////                                                            ////
1431
  ////  Test clock divider of mii management module with all      ////
1432
  ////  possible frequences.                                      ////
1433
  ////                                                            ////
1434
  ////////////////////////////////////////////////////////////////////
1435
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1436 169 mohor
  begin
1437 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1438
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1439
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1440 181 mohor
 
1441
    wait(Mdc_O); // wait for MII clock to be 1
1442
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1443
    begin
1444
      i1 = 0;
1445
      i2 = 0;
1446
      #Tp mii_set_clk_div(clk_div[7:0]);
1447
      @(posedge Mdc_O);
1448
      #Tp;
1449
      fork
1450 169 mohor
        begin
1451 181 mohor
          @(posedge Mdc_O);
1452 169 mohor
          #Tp;
1453 181 mohor
          disable count_i1;
1454
          disable count_i2;
1455 169 mohor
        end
1456 181 mohor
        begin: count_i1
1457
          forever
1458
          begin
1459
            @(posedge wb_clk);
1460
            i1 = i1 + 1;
1461
            #Tp;
1462
          end
1463
        end
1464
        begin: count_i2
1465
          forever
1466
          begin
1467
            @(negedge wb_clk);
1468
            i2 = i2 + 1;
1469
            #Tp;
1470
          end
1471
        end
1472
      join
1473
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1474
      begin
1475
        if((i1 == i2) && (i1 == 2))
1476 169 mohor
        begin
1477
        end
1478 181 mohor
        else
1479
        begin
1480
          fail = fail + 1;
1481 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1482 181 mohor
        end
1483 169 mohor
      end
1484
      else
1485
      begin
1486 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1487
        begin
1488
        end
1489
        else
1490
        begin
1491
          fail = fail + 1;
1492
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1493
        end
1494 169 mohor
      end
1495
    end
1496 181 mohor
    if(fail == 0)
1497
      test_ok;
1498 169 mohor
    else
1499 181 mohor
      fail = 0;
1500
  end
1501
 
1502
 
1503
  ////////////////////////////////////////////////////////////////////
1504
  ////                                                            ////
1505
  ////  Test various readings from 'real' phy registers.          ////
1506
  ////                                                            ////
1507
  ////////////////////////////////////////////////////////////////////
1508
  if (test_num == 1) // Test various readings from 'real' phy registers.
1509
  begin
1510 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1511
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1512
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1513 181 mohor
 
1514
    // set the fastest possible MII
1515
    clk_div = 0;
1516
    mii_set_clk_div(clk_div[7:0]);
1517
    // set address
1518
    reg_addr = 5'h1F;
1519
    phy_addr = 5'h1;
1520
    while(reg_addr >= 5'h4)
1521 169 mohor
    begin
1522 181 mohor
      // read request
1523
      #Tp mii_read_req(phy_addr, reg_addr);
1524
      check_mii_busy; // wait for read to finish
1525
      // read data
1526
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1527
      if (phy_data !== 16'hDEAD)
1528 169 mohor
      begin
1529 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1530
        fail = fail + 1;
1531 169 mohor
      end
1532 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1533
        reg_addr = 5'h3;
1534 169 mohor
      else
1535 181 mohor
        reg_addr = reg_addr - 5'h9;
1536 169 mohor
    end
1537 181 mohor
 
1538
    // set address
1539
    reg_addr = 5'h3;
1540
    // read request
1541
    #Tp mii_read_req(phy_addr, reg_addr);
1542
    check_mii_busy; // wait for read to finish
1543
    // read data
1544
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1545
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1546
    begin
1547
      test_fail("Wrong data was read from PHY from ID register 2");
1548
      fail = fail + 1;
1549
    end
1550
    if(fail == 0)
1551
      test_ok;
1552
    else
1553
      fail = 0;
1554 169 mohor
  end
1555 116 mohor
 
1556
 
1557 181 mohor
  ////////////////////////////////////////////////////////////////////
1558
  ////                                                            ////
1559
  ////  Test various writings to 'real' phy registers (control    ////
1560
  ////  and non writable registers)                               ////
1561
  ////                                                            ////
1562
  ////////////////////////////////////////////////////////////////////
1563
  if (test_num == 2) // 
1564 169 mohor
  begin
1565 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1566
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1567
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1568 181 mohor
 
1569
    // negate data and try to write into unwritable register
1570
    tmp_data = ~phy_data;
1571
    // write request
1572
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1573
    check_mii_busy; // wait for write to finish
1574 169 mohor
    // read request
1575
    #Tp mii_read_req(phy_addr, reg_addr);
1576
    check_mii_busy; // wait for read to finish
1577
    // read data
1578 181 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1579
    if (tmp_data !== phy_data)
1580
    begin
1581
      test_fail("Data was written into unwritable PHY register - ID register 2");
1582
      fail = fail + 1;
1583
    end
1584
 
1585
    // set address
1586
    reg_addr = 5'h0; // control register
1587
    // read request
1588
    #Tp mii_read_req(phy_addr, reg_addr);
1589
    check_mii_busy; // wait for read to finish
1590
    // read data
1591
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1592
    // write request
1593
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1594
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1595
    check_mii_busy; // wait for write to finish
1596
    // read request
1597
    #Tp mii_read_req(phy_addr, reg_addr);
1598
    check_mii_busy; // wait for read to finish
1599
    // read data
1600 169 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1601 181 mohor
    if (phy_data !== 16'h7DFF)
1602 169 mohor
    begin
1603 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1604 169 mohor
      fail = fail + 1;
1605
    end
1606 181 mohor
    // write request
1607
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1608
    check_mii_busy; // wait for write to finish
1609
    // read request
1610
    #Tp mii_read_req(phy_addr, reg_addr);
1611
    check_mii_busy; // wait for read to finish
1612
    // read data
1613
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1614
    if (phy_data !== tmp_data)
1615
    begin
1616
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1617
      fail = fail + 1;
1618
    end
1619
    if(fail == 0)
1620
      test_ok;
1621 116 mohor
    else
1622 181 mohor
      fail = 0;
1623 169 mohor
  end
1624 116 mohor
 
1625
 
1626 181 mohor
  ////////////////////////////////////////////////////////////////////
1627
  ////                                                            ////
1628
  ////  Test reset phy through mii management module              ////
1629
  ////                                                            ////
1630
  ////////////////////////////////////////////////////////////////////
1631
  if (test_num == 3) // 
1632 169 mohor
  begin
1633 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1634
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1635
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1636 181 mohor
 
1637
    // set address
1638
    reg_addr = 5'h0; // control register
1639
    // write request
1640
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1641
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1642
    check_mii_busy; // wait for write to finish
1643
    // read request
1644
    #Tp mii_read_req(phy_addr, reg_addr);
1645
    check_mii_busy; // wait for read to finish
1646
    // read data
1647
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1648
    if (phy_data !== tmp_data)
1649
    begin
1650
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1651
      fail = fail + 1;
1652
    end
1653
    // set reset bit - selfclearing bit in PHY
1654
    phy_data = phy_data | 16'h8000;
1655
    // write request
1656
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1657
    check_mii_busy; // wait for write to finish
1658
    // read request
1659
    #Tp mii_read_req(phy_addr, reg_addr);
1660
    check_mii_busy; // wait for read to finish
1661
    // read data
1662
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1663
    // check self clearing of reset bit
1664
    if (tmp_data[15] !== 1'b0)
1665
    begin
1666
      test_fail("Reset bit should be self cleared - control register");
1667
      fail = fail + 1;
1668
    end
1669
    // check reset value of control register
1670
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1671
    begin
1672
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1673
      fail = fail + 1;
1674
    end
1675
    if(fail == 0)
1676
      test_ok;
1677
    else
1678
      fail = 0;
1679 169 mohor
  end
1680
 
1681
 
1682 181 mohor
  ////////////////////////////////////////////////////////////////////
1683
  ////                                                            ////
1684
  ////  Test 'walking one' across phy address (with and without   ////
1685
  ////  preamble)                                                 ////
1686
  ////                                                            ////
1687
  ////////////////////////////////////////////////////////////////////
1688
  if (test_num == 4) // 
1689 169 mohor
  begin
1690 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1691
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1692
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1693 181 mohor
 
1694
    // set PHY to test mode
1695
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1696
    for (i = 0; i <= 1; i = i + 1)
1697 169 mohor
    begin
1698 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1699
      #Tp eth_phy.clear_test_regs;
1700
      // MII mode register
1701
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1702
                wbm_subseq_waits);
1703
      // walk one across phy address
1704
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1705 169 mohor
      begin
1706 181 mohor
        reg_addr = $random;
1707
        tmp_data = $random;
1708
        // write request
1709
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1710
        check_mii_busy; // wait for write to finish
1711
        // read request
1712
        #Tp mii_read_req(phy_addr, reg_addr);
1713
        check_mii_busy; // wait for read to finish
1714
        // read data
1715
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1716
        #Tp;
1717
        if (phy_data !== tmp_data)
1718
        begin
1719
          if (i)
1720
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1721
          else
1722
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1723
          fail = fail + 1;
1724
        end
1725
        @(posedge wb_clk);
1726
        #Tp;
1727 169 mohor
      end
1728
    end
1729 181 mohor
    // set PHY to normal mode
1730
    #Tp eth_phy.test_regs(0);
1731
    #Tp eth_phy.preamble_suppresed(0);
1732
    // MII mode register
1733
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1734
    if(fail == 0)
1735
      test_ok;
1736
    else
1737
      fail = 0;
1738 169 mohor
  end
1739
 
1740
 
1741 181 mohor
  ////////////////////////////////////////////////////////////////////
1742
  ////                                                            ////
1743
  ////  Test 'walking one' across phy's register address (with    ////
1744
  ////  and without preamble)                                     ////
1745
  ////                                                            ////
1746
  ////////////////////////////////////////////////////////////////////
1747
  if (test_num == 5) // 
1748 169 mohor
  begin
1749 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1750
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1751
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1752 181 mohor
 
1753
    // set PHY to test mode
1754
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1755
    for (i = 0; i <= 1; i = i + 1)
1756 169 mohor
    begin
1757 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1758
      #Tp eth_phy.clear_test_regs;
1759
      // MII mode register
1760
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1761
                wbm_subseq_waits);
1762
      // walk one across reg address
1763
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1764 169 mohor
      begin
1765 181 mohor
        phy_addr = $random;
1766
        tmp_data = $random;
1767
        // write request
1768
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1769
        check_mii_busy; // wait for write to finish
1770
        // read request
1771
        #Tp mii_read_req(phy_addr, reg_addr);
1772
        check_mii_busy; // wait for read to finish
1773
        // read data
1774
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1775
        #Tp;
1776
        if (phy_data !== tmp_data)
1777
        begin
1778
          if (i)
1779
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1780
          else
1781
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1782
          fail = fail + 1;
1783
        end
1784
        @(posedge wb_clk);
1785
        #Tp;
1786 169 mohor
      end
1787
    end
1788 181 mohor
    // set PHY to normal mode
1789
    #Tp eth_phy.test_regs(0);
1790
    #Tp eth_phy.preamble_suppresed(0);
1791
    // MII mode register
1792
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1793
    if(fail == 0)
1794
      test_ok;
1795
    else
1796
      fail = 0;
1797 169 mohor
  end
1798
 
1799
 
1800 181 mohor
  ////////////////////////////////////////////////////////////////////
1801
  ////                                                            ////
1802
  ////  Test 'walking one' across phy's data (with and without    ////
1803
  ////  preamble)                                                 ////
1804
  ////                                                            ////
1805
  ////////////////////////////////////////////////////////////////////
1806
  if (test_num == 6) // 
1807 169 mohor
  begin
1808 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
1809
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
1810
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
1811 181 mohor
 
1812
    // set PHY to test mode
1813
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1814
    for (i = 0; i <= 1; i = i + 1)
1815 169 mohor
    begin
1816 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1817
      #Tp eth_phy.clear_test_regs;
1818
      // MII mode register
1819
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1820
                wbm_subseq_waits);
1821
      // walk one across data
1822
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
1823 169 mohor
      begin
1824 181 mohor
        phy_addr = $random;
1825
        reg_addr = $random;
1826
        // write request
1827
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1828
        check_mii_busy; // wait for write to finish
1829
        // read request
1830
        #Tp mii_read_req(phy_addr, reg_addr);
1831
        check_mii_busy; // wait for read to finish
1832
        // read data
1833
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1834
        #Tp;
1835
        if (phy_data !== tmp_data)
1836
        begin
1837
          if (i)
1838
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1839
          else
1840
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1841
          fail = fail + 1;
1842
        end
1843
        @(posedge wb_clk);
1844
        #Tp;
1845 169 mohor
      end
1846
    end
1847 181 mohor
    // set PHY to normal mode
1848
    #Tp eth_phy.test_regs(0);
1849
    #Tp eth_phy.preamble_suppresed(0);
1850
    // MII mode register
1851
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1852
    if(fail == 0)
1853
      test_ok;
1854
    else
1855
      fail = 0;
1856 169 mohor
  end
1857
 
1858
 
1859 181 mohor
  ////////////////////////////////////////////////////////////////////
1860
  ////                                                            ////
1861
  ////  Test reading from phy with wrong phy address (host        ////
1862
  ////  reading high 'z' data)                                    ////
1863
  ////                                                            ////
1864
  ////////////////////////////////////////////////////////////////////
1865
  if (test_num == 7) // 
1866 169 mohor
  begin
1867 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
1868
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
1869
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
1870 181 mohor
 
1871
    phy_addr = 5'h2; // wrong PHY address
1872
    // read request
1873
    #Tp mii_read_req(phy_addr, reg_addr);
1874
    check_mii_busy; // wait for read to finish
1875
    // read data
1876
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
1877
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1878
    if (tmp_data !== 16'hzzzz)
1879
    begin
1880
      test_fail("Data was read from PHY register with wrong PHY address - control register");
1881
      fail = fail + 1;
1882
    end
1883
    if(fail == 0)
1884
      test_ok;
1885
    else
1886
      fail = 0;
1887 169 mohor
  end
1888
 
1889
 
1890 181 mohor
  ////////////////////////////////////////////////////////////////////
1891
  ////                                                            ////
1892
  ////  Test writing to phy with wrong phy address and reading    ////
1893
  ////  from correct one                                          ////
1894
  ////                                                            ////
1895
  ////////////////////////////////////////////////////////////////////
1896
  if (test_num == 8) // 
1897 169 mohor
  begin
1898 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
1899
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
1900
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
1901 181 mohor
 
1902
    // set address
1903
    reg_addr = 5'h0; // control register
1904
    phy_addr = 5'h2; // wrong PHY address
1905
    // write request
1906
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1907
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1908
    check_mii_busy; // wait for write to finish
1909
 
1910
    phy_addr = 5'h1; // correct PHY address
1911
    // read request
1912
    #Tp mii_read_req(phy_addr, reg_addr);
1913
    check_mii_busy; // wait for read to finish
1914
    // read data
1915
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1916
    if (phy_data === tmp_data)
1917
    begin
1918
      test_fail("Data was written into PHY register with wrong PHY address - control register");
1919
      fail = fail + 1;
1920
    end
1921
    if(fail == 0)
1922
      test_ok;
1923
    else
1924
      fail = 0;
1925 169 mohor
  end
1926
 
1927
 
1928 181 mohor
  ////////////////////////////////////////////////////////////////////
1929
  ////                                                            ////
1930
  ////  Test sliding stop scan command immediately after read     ////
1931
  ////  request (with and without preamble)                       ////
1932
  ////                                                            ////
1933
  ////////////////////////////////////////////////////////////////////
1934
  if (test_num == 9) // 
1935 169 mohor
  begin
1936 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
1937
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
1938 181 mohor
    `TIME;
1939 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
1940 181 mohor
 
1941
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
1942 169 mohor
    begin
1943 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
1944
      // MII mode register
1945
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
1946
               wbm_subseq_waits);
1947
      i = 0;
1948
      cnt = 0;
1949
      while (i < 80) // delay for sliding of writing a STOP SCAN command
1950 169 mohor
      begin
1951 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
1952
        begin
1953
          // set address
1954
          reg_addr = 5'h0; // control register
1955
          phy_addr = 5'h1; // correct PHY address
1956
          cnt = 0;
1957
          // read request
1958
          #Tp mii_read_req(phy_addr, reg_addr);
1959
          fork
1960
            begin
1961
              repeat(i) @(posedge Mdc_O);
1962
              // write command 0x0 into MII command register
1963
              // MII command written while read in progress
1964
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1965
              @(posedge wb_clk);
1966
              #Tp check_mii_busy; // wait for read to finish
1967
            end
1968
            begin
1969
              // wait for serial bus to become active
1970
              wait(Mdio_IO !== 1'bz);
1971
              // count transfer length
1972
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
1973
              begin
1974
                @(posedge Mdc_O);
1975
                #Tp cnt = cnt + 1;
1976
              end
1977
            end
1978
          join
1979
          // check transfer length
1980
          if (i2) // without preamble
1981 169 mohor
          begin
1982 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
1983
            begin
1984
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
1985
              fail = fail + 1;
1986
            end
1987 169 mohor
          end
1988 181 mohor
          else // with preamble
1989 169 mohor
          begin
1990 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
1991
            begin
1992
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
1993
              fail = fail + 1;
1994
            end
1995
          end
1996
          // check the BUSY signal to see if the bus is still IDLE
1997
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
1998
            check_mii_busy; // wait for bus to become idle
1999
 
2000
          // try normal write or read after read was finished
2001
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2002
          #Tp cnt = 0;
2003
          if (i3 == 0) // write after read
2004
          begin
2005
            // write request
2006
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2007 169 mohor
            // wait for serial bus to become active
2008
            wait(Mdio_IO !== 1'bz);
2009
            // count transfer length
2010 181 mohor
            while(Mdio_IO !== 1'bz)
2011 169 mohor
            begin
2012
              @(posedge Mdc_O);
2013
              #Tp cnt = cnt + 1;
2014
            end
2015 181 mohor
            @(posedge Mdc_O);
2016
            // read request
2017
            #Tp mii_read_req(phy_addr, reg_addr);
2018
            check_mii_busy; // wait for read to finish
2019
            // read and check data
2020
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2021
            if (phy_data !== tmp_data)
2022
            begin
2023
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2024
              fail = fail + 1;
2025
            end
2026 169 mohor
          end
2027 181 mohor
          else // read after read
2028 169 mohor
          begin
2029 181 mohor
            // read request
2030
            #Tp mii_read_req(phy_addr, reg_addr);
2031
            // wait for serial bus to become active
2032
            wait(Mdio_IO !== 1'bz);
2033
            // count transfer length
2034
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2035
            begin
2036
              @(posedge Mdc_O);
2037
              #Tp cnt = cnt + 1;
2038
            end
2039 169 mohor
            @(posedge Mdc_O);
2040 181 mohor
            check_mii_busy; // wait for read to finish
2041
            // read and check data
2042
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2043
            if (phy_data !== tmp_data)
2044
            begin
2045
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2046
              fail = fail + 1;
2047
            end
2048 169 mohor
          end
2049 181 mohor
          // check if transfer was a proper length
2050
          if (i2) // without preamble
2051 169 mohor
          begin
2052 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2053
            begin
2054
              test_fail("New request did not proceed correctly, after read request");
2055
              fail = fail + 1;
2056
            end
2057 169 mohor
          end
2058 181 mohor
          else // with preamble
2059 169 mohor
          begin
2060 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2061
            begin
2062
              test_fail("New request did not proceed correctly, after read request");
2063
              fail = fail + 1;
2064
            end
2065 169 mohor
          end
2066
        end
2067 181 mohor
        #Tp;
2068
        // set delay of writing the command
2069 169 mohor
        if (i2) // without preamble
2070
        begin
2071 181 mohor
          case(i)
2072
            0, 1:               i = i + 1;
2073
            18, 19, 20, 21, 22,
2074
            23, 24, 25, 26, 27,
2075
            28, 29, 30, 31, 32,
2076
            33, 34, 35:         i = i + 1;
2077
            36:                 i = 80;
2078
            default:            i = 18;
2079
          endcase
2080 169 mohor
        end
2081
        else // with preamble
2082
        begin
2083 181 mohor
          case(i)
2084
            0, 1:               i = i + 1;
2085
            50, 51, 52, 53, 54,
2086
            55, 56, 57, 58, 59,
2087
            60, 61, 62, 63, 64,
2088
            65, 66, 67:         i = i + 1;
2089
            68:                 i = 80;
2090
            default:            i = 50;
2091
          endcase
2092 169 mohor
        end
2093 181 mohor
        @(posedge wb_clk);
2094 169 mohor
      end
2095
    end
2096 181 mohor
    // set PHY to normal mode
2097
    #Tp eth_phy.preamble_suppresed(0);
2098
    // MII mode register
2099
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2100
    if(fail == 0)
2101
      test_ok;
2102
    else
2103
      fail = 0;
2104 169 mohor
  end
2105
 
2106
 
2107 181 mohor
  ////////////////////////////////////////////////////////////////////
2108
  ////                                                            ////
2109
  ////  Test sliding stop scan command immediately after write    ////
2110
  ////  request (with and without preamble)                       ////
2111
  ////                                                            ////
2112
  ////////////////////////////////////////////////////////////////////
2113
  if (test_num == 10) // 
2114 169 mohor
  begin
2115 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2116
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2117 181 mohor
    `TIME;
2118 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2119 181 mohor
 
2120
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2121 169 mohor
    begin
2122 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2123
      // MII mode register
2124
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2125
                wbm_subseq_waits);
2126
      i = 0;
2127
      cnt = 0;
2128
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2129 169 mohor
      begin
2130 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2131
        begin
2132
          // set address
2133
          reg_addr = 5'h0; // control register
2134
          phy_addr = 5'h1; // correct PHY address
2135
          cnt = 0;
2136
          // write request
2137
          phy_data = {8'h75, (i[7:0] + 1)};
2138
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2139
          fork
2140
            begin
2141
              repeat(i) @(posedge Mdc_O);
2142
              // write command 0x0 into MII command register
2143
              // MII command written while read in progress
2144
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2145
              @(posedge wb_clk);
2146
              #Tp check_mii_busy; // wait for write to finish
2147
            end
2148
            begin
2149
              // wait for serial bus to become active
2150
              wait(Mdio_IO !== 1'bz);
2151
              // count transfer length
2152
              while(Mdio_IO !== 1'bz)
2153
              begin
2154
                @(posedge Mdc_O);
2155
                #Tp cnt = cnt + 1;
2156
              end
2157
            end
2158
          join
2159
          // check transfer length
2160
          if (i2) // without preamble
2161 169 mohor
          begin
2162 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2163
            begin
2164
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2165
              fail = fail + 1;
2166
            end
2167 169 mohor
          end
2168 181 mohor
          else // with preamble
2169 169 mohor
          begin
2170 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2171
            begin
2172
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2173
              fail = fail + 1;
2174
            end
2175
          end
2176
          // check the BUSY signal to see if the bus is still IDLE
2177
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2178
            check_mii_busy; // wait for bus to become idle
2179
 
2180
          // try normal write or read after write was finished
2181
          #Tp cnt = 0;
2182
          if (i3 == 0) // write after write
2183
          begin
2184
            phy_data = {8'h7A, (i[7:0] + 1)};
2185
            // write request
2186
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2187 169 mohor
            // wait for serial bus to become active
2188
            wait(Mdio_IO !== 1'bz);
2189
            // count transfer length
2190
            while(Mdio_IO !== 1'bz)
2191
            begin
2192
              @(posedge Mdc_O);
2193
              #Tp cnt = cnt + 1;
2194
            end
2195 181 mohor
            @(posedge Mdc_O);
2196
            // read request
2197
            #Tp mii_read_req(phy_addr, reg_addr);
2198
            check_mii_busy; // wait for read to finish
2199
            // read and check data
2200
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2201
            if (phy_data !== tmp_data)
2202
            begin
2203
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2204
              fail = fail + 1;
2205
            end
2206 169 mohor
          end
2207 181 mohor
          else // read after write
2208 169 mohor
          begin
2209 181 mohor
            // read request
2210
            #Tp mii_read_req(phy_addr, reg_addr);
2211
            // wait for serial bus to become active
2212
            wait(Mdio_IO !== 1'bz);
2213
            // count transfer length
2214
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2215
            begin
2216
              @(posedge Mdc_O);
2217
              #Tp cnt = cnt + 1;
2218
            end
2219 169 mohor
            @(posedge Mdc_O);
2220 181 mohor
            check_mii_busy; // wait for read to finish
2221
            // read and check data
2222
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2223
            if (phy_data !== tmp_data)
2224
            begin
2225
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2226
              fail = fail + 1;
2227
            end
2228 169 mohor
          end
2229 181 mohor
          // check if transfer was a proper length
2230
          if (i2) // without preamble
2231 169 mohor
          begin
2232 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2233
            begin
2234
              test_fail("New request did not proceed correctly, after write request");
2235
              fail = fail + 1;
2236
            end
2237 169 mohor
          end
2238 181 mohor
          else // with preamble
2239 169 mohor
          begin
2240 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2241
            begin
2242
              test_fail("New request did not proceed correctly, after write request");
2243
              fail = fail + 1;
2244
            end
2245 169 mohor
          end
2246
        end
2247 181 mohor
        #Tp;
2248
        // set delay of writing the command
2249 169 mohor
        if (i2) // without preamble
2250
        begin
2251 181 mohor
          case(i)
2252
            0, 1:               i = i + 1;
2253
            18, 19, 20, 21, 22,
2254
            23, 24, 25, 26, 27,
2255
            28, 29, 30, 31, 32,
2256
            33, 34, 35:         i = i + 1;
2257
            36:                 i = 80;
2258
            default:            i = 18;
2259
          endcase
2260 169 mohor
        end
2261
        else // with preamble
2262
        begin
2263 181 mohor
          case(i)
2264
            0, 1:               i = i + 1;
2265
            50, 51, 52, 53, 54,
2266
            55, 56, 57, 58, 59,
2267
            60, 61, 62, 63, 64,
2268
            65, 66, 67:         i = i + 1;
2269
            68:                 i = 80;
2270
            default:            i = 50;
2271
          endcase
2272 169 mohor
        end
2273 181 mohor
        @(posedge wb_clk);
2274 169 mohor
      end
2275
    end
2276 181 mohor
    // set PHY to normal mode
2277
    #Tp eth_phy.preamble_suppresed(0);
2278
    // MII mode register
2279
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2280
    if(fail == 0)
2281
      test_ok;
2282
    else
2283
      fail = 0;
2284 169 mohor
  end
2285
 
2286
 
2287 181 mohor
  ////////////////////////////////////////////////////////////////////
2288
  ////                                                            ////
2289
  ////  Test busy and nvalid status durations during write (with  ////
2290
  ////  and without preamble)                                     ////
2291
  ////                                                            ////
2292
  ////////////////////////////////////////////////////////////////////
2293
  if (test_num == 11) // 
2294 169 mohor
  begin
2295 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2296
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2297
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2298 181 mohor
 
2299
    reset_mii; // reset MII
2300
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2301
    #Tp eth_phy.link_up_down(1);
2302
    // set the MII
2303
    clk_div = 64;
2304
    mii_set_clk_div(clk_div[7:0]);
2305
    // set address
2306
    reg_addr = 5'h1; // status register
2307
    phy_addr = 5'h1; // correct PHY address
2308
 
2309
    for (i = 0; i <= 1; i = i + 1)
2310 169 mohor
    begin
2311 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2312
      // MII mode register
2313
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2314
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2315
      @(posedge Mdc_O);
2316
      // write request
2317
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2318
      // read data from MII status register - Busy and Nvalid bits
2319
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2320
 
2321
      // check MII IO signal and Busy and Nvalid bits
2322
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2323 169 mohor
      begin
2324 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2325
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2326
        begin
2327
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2328
          fail = fail + 1;
2329
        end
2330
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2331
        begin
2332
          test_fail("Nvalid signal was set during write");
2333
          fail = fail + 1;
2334
        end
2335 169 mohor
      end
2336 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2337 169 mohor
      begin
2338 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2339
        begin
2340
          test_fail("Busy signal should be set after write, due to reads from MII status register");
2341
          fail = fail + 1;
2342
        end
2343
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2344
        begin
2345
          test_fail("Nvalid signal was set during write");
2346
          fail = fail + 1;
2347
        end
2348 169 mohor
      end
2349 181 mohor
 
2350
      // wait for serial bus to become active
2351
      wait(Mdio_IO !== 1'bz);
2352
      // count transfer bits
2353
      if (i)
2354 169 mohor
      begin
2355 181 mohor
        repeat(32) @(posedge Mdc_O);
2356 169 mohor
      end
2357 181 mohor
      else
2358 169 mohor
      begin
2359 181 mohor
        repeat(64) @(posedge Mdc_O);
2360 169 mohor
      end
2361 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2362
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2363
 
2364
      // check MII IO signal and Busy and Nvalid bits
2365
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2366 169 mohor
      begin
2367 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2368
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2369
        begin
2370
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2371
          fail = fail + 1;
2372
        end
2373
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2374
        begin
2375
          test_fail("Nvalid signal was set during write");
2376
          fail = fail + 1;
2377
        end
2378 169 mohor
      end
2379 181 mohor
      else // Busy bit should still be set to '1'
2380 169 mohor
      begin
2381 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2382
        begin
2383
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2384
          fail = fail + 1;
2385
        end
2386
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2387
        begin
2388
          test_fail("Nvalid signal was set during write");
2389
          fail = fail + 1;
2390
        end
2391 169 mohor
      end
2392 181 mohor
 
2393
      // wait for next negative clock edge
2394
      @(negedge Mdc_O);
2395 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2396
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2397 181 mohor
 
2398 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2399
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2400
      begin
2401
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2402
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2403
        begin
2404
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2405
          fail = fail + 1;
2406
        end
2407
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2408
        begin
2409
          test_fail("Nvalid signal was set during write");
2410
          fail = fail + 1;
2411
        end
2412
      end
2413 181 mohor
      else // Busy bit should still be set to '1'
2414 169 mohor
      begin
2415
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2416
        begin
2417 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2418
          fail = fail + 1;
2419 169 mohor
        end
2420 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2421 169 mohor
        begin
2422 181 mohor
          test_fail("Nvalid signal was set during write");
2423
          fail = fail + 1;
2424
        end
2425
      end
2426
 
2427
      // wait for Busy to become inactive
2428
      i1 = 0;
2429
      while (i1 <= 2)
2430
      begin
2431
        // wait for next positive clock edge
2432
        @(posedge Mdc_O);
2433
        // read data from MII status register - Busy and Nvalid bits
2434
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2435
 
2436
        // check MII IO signal and Busy and Nvalid bits
2437
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2438
        begin
2439
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2440
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2441 169 mohor
          begin
2442 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2443 169 mohor
            fail = fail + 1;
2444
          end
2445 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2446
          begin
2447
            test_fail("Nvalid signal was set during write");
2448
            fail = fail + 1;
2449
          end
2450 169 mohor
        end
2451 181 mohor
        else // wait for Busy bit to be set to '0'
2452 169 mohor
        begin
2453 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2454
          begin
2455
            i1 = 3; // end of Busy checking
2456
          end
2457
          else
2458
          begin
2459
            if (i1 == 2)
2460
            begin
2461
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2462
              fail = fail + 1;
2463
            end
2464
            #Tp i1 = i1 + 1;
2465
          end
2466
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2467
          begin
2468
            test_fail("Nvalid signal was set after write");
2469
            fail = fail + 1;
2470
          end
2471 169 mohor
        end
2472
      end
2473
    end
2474 181 mohor
    // set PHY to normal mode
2475
    #Tp eth_phy.preamble_suppresed(0);
2476
    // MII mode register
2477
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2478
    if(fail == 0)
2479
      test_ok;
2480
    else
2481
      fail = 0;
2482 116 mohor
  end
2483
 
2484
 
2485 181 mohor
  ////////////////////////////////////////////////////////////////////
2486
  ////                                                            ////
2487
  ////  Test busy and nvalid status durations during write (with  ////
2488
  ////  and without preamble)                                     ////
2489
  ////                                                            ////
2490
  ////////////////////////////////////////////////////////////////////
2491
  if (test_num == 12) // 
2492 169 mohor
  begin
2493 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2494
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2495
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2496 181 mohor
 
2497
    reset_mii; // reset MII
2498
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2499
    #Tp eth_phy.link_up_down(1);
2500
    // set the MII
2501
    clk_div = 64;
2502
    mii_set_clk_div(clk_div[7:0]);
2503
    // set address
2504
    reg_addr = 5'h1; // status register
2505
    phy_addr = 5'h1; // correct PHY address
2506
 
2507
    for (i = 0; i <= 1; i = i + 1)
2508 169 mohor
    begin
2509 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2510
      // MII mode register
2511
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2512
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2513 169 mohor
      @(posedge Mdc_O);
2514 181 mohor
      // read request
2515
      #Tp mii_read_req(phy_addr, reg_addr);
2516 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2517
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2518 181 mohor
 
2519 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2520
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2521
      begin
2522 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2523 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2524
        begin
2525 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2526 169 mohor
          fail = fail + 1;
2527
        end
2528
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2529
        begin
2530
          test_fail("Nvalid signal was set during read");
2531
          fail = fail + 1;
2532
        end
2533
      end
2534 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2535 169 mohor
      begin
2536
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2537
        begin
2538 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2539
          fail = fail + 1;
2540 169 mohor
        end
2541
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2542
        begin
2543 181 mohor
          test_fail("Nvalid signal was set during read");
2544 169 mohor
          fail = fail + 1;
2545
        end
2546
      end
2547 181 mohor
 
2548
      // wait for serial bus to become active
2549
      wait(Mdio_IO !== 1'bz);
2550
      // count transfer bits
2551
      if (i)
2552 169 mohor
      begin
2553 181 mohor
        repeat(31) @(posedge Mdc_O);
2554 169 mohor
      end
2555 181 mohor
      else
2556 169 mohor
      begin
2557 181 mohor
        repeat(63) @(posedge Mdc_O);
2558 169 mohor
      end
2559 181 mohor
      // wait for next negative clock edge
2560
      @(negedge Mdc_O);
2561
      // read data from MII status register - Busy and Nvalid bits
2562
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2563
 
2564
      // check MII IO signal and Busy and Nvalid bits
2565
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2566 169 mohor
      begin
2567 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2568
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2569
        begin
2570
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2571
          fail = fail + 1;
2572
        end
2573
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2574
        begin
2575
          test_fail("Nvalid signal was set during read");
2576
          fail = fail + 1;
2577
        end
2578 169 mohor
      end
2579 181 mohor
      else // Busy bit should still be set to '1'
2580 169 mohor
      begin
2581 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2582
        begin
2583
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2584
          fail = fail + 1;
2585
        end
2586
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2587
        begin
2588
          test_fail("Nvalid signal was set during read");
2589
          fail = fail + 1;
2590
        end
2591 169 mohor
      end
2592 181 mohor
 
2593 169 mohor
      // wait for next positive clock edge
2594
      @(posedge Mdc_O);
2595
      // read data from MII status register - Busy and Nvalid bits
2596
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2597 181 mohor
 
2598 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2599
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2600
      begin
2601
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2602 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2603 169 mohor
        begin
2604 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2605
          fail = fail + 1;
2606
        end
2607
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2608
        begin
2609
          test_fail("Nvalid signal was set during read");
2610
          fail = fail + 1;
2611
        end
2612
      end
2613
      else // Busy bit should still be set to '1'
2614
      begin
2615
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2616
        begin
2617
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2618
          fail = fail + 1;
2619
        end
2620
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2621
        begin
2622
          test_fail("Nvalid signal was set during read");
2623
          fail = fail + 1;
2624
        end
2625
      end
2626
 
2627
      // wait for Busy to become inactive
2628
      i1 = 0;
2629
      while (i1 <= 2)
2630
      begin
2631
        // wait for next positive clock edge
2632
        @(posedge Mdc_O);
2633
        // read data from MII status register - Busy and Nvalid bits
2634
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2635
 
2636
        // check MII IO signal and Busy and Nvalid bits
2637
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2638
        begin
2639
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2640 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2641
          begin
2642
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2643
            fail = fail + 1;
2644
          end
2645 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2646 169 mohor
          begin
2647 181 mohor
            test_fail("Nvalid signal was set during read");
2648 169 mohor
            fail = fail + 1;
2649
          end
2650
        end
2651 181 mohor
        else // wait for Busy bit to be set to '0'
2652 169 mohor
        begin
2653
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2654
          begin
2655
            i1 = 3; // end of Busy checking
2656
          end
2657
          else
2658
          begin
2659
            if (i1 == 2)
2660
            begin
2661
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2662
              fail = fail + 1;
2663
            end
2664
            #Tp i1 = i1 + 1;
2665
          end
2666 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2667 169 mohor
          begin
2668 181 mohor
            test_fail("Nvalid signal was set after read");
2669 169 mohor
            fail = fail + 1;
2670
          end
2671
        end
2672
      end
2673
    end
2674 181 mohor
    // set PHY to normal mode
2675
    #Tp eth_phy.preamble_suppresed(0);
2676
    // MII mode register
2677
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2678
    if(fail == 0)
2679
      test_ok;
2680
    else
2681
      fail = 0;
2682 169 mohor
  end
2683
 
2684
 
2685 181 mohor
  ////////////////////////////////////////////////////////////////////
2686
  ////                                                            ////
2687
  ////  Test busy and nvalid status durations during scan (with   ////
2688
  ////  and without preamble)                                     ////
2689
  ////                                                            ////
2690
  ////////////////////////////////////////////////////////////////////
2691
  if (test_num == 13) // 
2692 169 mohor
  begin
2693 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2694
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2695
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2696 181 mohor
 
2697
    reset_mii; // reset MII
2698
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2699
    #Tp eth_phy.link_up_down(1);
2700
    // set the MII
2701
    clk_div = 64;
2702
    mii_set_clk_div(clk_div[7:0]);
2703
    // set address
2704
    reg_addr = 5'h1; // status register
2705
    phy_addr = 5'h1; // correct PHY address
2706
 
2707
    for (i = 0; i <= 1; i = i + 1)
2708 169 mohor
    begin
2709 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2710
      // MII mode register
2711
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2712
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2713
      @(posedge Mdc_O);
2714
      // scan request
2715
      #Tp mii_scan_req(phy_addr, reg_addr);
2716
      // read data from MII status register - Busy and Nvalid bits
2717
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2718
 
2719
      // check MII IO signal and Busy and Nvalid bits
2720
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2721 169 mohor
      begin
2722 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2723
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2724
        begin
2725
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2726
          fail = fail + 1;
2727
        end
2728
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2729
        begin
2730
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2731
          fail = fail + 1;
2732
        end
2733 169 mohor
      end
2734 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2735 169 mohor
      begin
2736 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2737
        begin
2738
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2739
          fail = fail + 1;
2740
        end
2741
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2742
        begin
2743
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2744
          fail = fail + 1;
2745
        end
2746 169 mohor
      end
2747 181 mohor
 
2748
      // wait for serial bus to become active
2749 169 mohor
      wait(Mdio_IO !== 1'bz);
2750 181 mohor
      // count transfer bits
2751
      if (i)
2752 169 mohor
      begin
2753 181 mohor
        repeat(21) @(posedge Mdc_O);
2754 169 mohor
      end
2755 181 mohor
      else
2756 169 mohor
      begin
2757 181 mohor
        repeat(53) @(posedge Mdc_O);
2758 169 mohor
      end
2759 181 mohor
      // stop scan
2760
      #Tp mii_scan_finish; // finish scan operation
2761
 
2762
      // wait for next positive clock edge
2763
      repeat(10) @(posedge Mdc_O);
2764
      // read data from MII status register - Busy and Nvalid bits
2765
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2766
 
2767
      // check MII IO signal and Busy and Nvalid bits
2768
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2769 169 mohor
      begin
2770 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2771
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2772 169 mohor
        begin
2773 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2774 169 mohor
          fail = fail + 1;
2775
        end
2776 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2777 169 mohor
      end
2778 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2779 169 mohor
      begin
2780 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2781 169 mohor
        begin
2782 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2783 169 mohor
          fail = fail + 1;
2784
        end
2785 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2786 169 mohor
        begin
2787 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2788 169 mohor
          fail = fail + 1;
2789
        end
2790 181 mohor
      end
2791
 
2792
      // wait for next negative clock edge
2793
      @(negedge Mdc_O);
2794
      // read data from MII status register - Busy and Nvalid bits
2795
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2796
 
2797
      // check MII IO signal and Busy and Nvalid bits
2798
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2799
      begin
2800
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2801
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2802 169 mohor
        begin
2803 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2804
          fail = fail + 1;
2805 169 mohor
        end
2806 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2807 169 mohor
      end
2808 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2809 169 mohor
      begin
2810 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2811 169 mohor
        begin
2812 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2813
          fail = fail + 1;
2814 169 mohor
        end
2815 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2816 169 mohor
        begin
2817 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2818
          fail = fail + 1;
2819 169 mohor
        end
2820
      end
2821 181 mohor
 
2822
      // wait for next negative clock edge
2823
      @(posedge Mdc_O);
2824
      // read data from MII status register - Busy and Nvalid bits
2825 169 mohor
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2826 181 mohor
 
2827
      // check MII IO signal and Busy and Nvalid bits
2828
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2829 169 mohor
      begin
2830 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2831
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2832 169 mohor
        begin
2833 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2834 169 mohor
          fail = fail + 1;
2835
        end
2836 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2837 169 mohor
        begin
2838 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2839 169 mohor
          fail = fail + 1;
2840
        end
2841
      end
2842 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
2843 169 mohor
      begin
2844 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2845 169 mohor
        begin
2846 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2847
          fail = fail + 1;
2848 169 mohor
        end
2849 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2850 169 mohor
        begin
2851 181 mohor
          i2 = 1; // check finished
2852 169 mohor
        end
2853 181 mohor
        else
2854 169 mohor
        begin
2855 181 mohor
          i2 = 0; // check must continue
2856 169 mohor
        end
2857
      end
2858 181 mohor
 
2859
      // wait for Busy to become inactive
2860
      i1 = 0;
2861
      while ((i1 <= 2) || (i2 == 0))
2862
      begin
2863
        // wait for next positive clock edge
2864
        @(posedge Mdc_O);
2865
        // read data from MII status register - Busy and Nvalid bits
2866
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2867
 
2868
        // check MII IO signal and Busy and Nvalid bits
2869
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2870 169 mohor
        begin
2871 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2872
          if (i1 <= 2)
2873 169 mohor
          begin
2874 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2875 169 mohor
            begin
2876 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2877 169 mohor
              fail = fail + 1;
2878
            end
2879
          end
2880 181 mohor
          if (i2 == 0)
2881 169 mohor
          begin
2882 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2883 169 mohor
            begin
2884 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2885 169 mohor
              fail = fail + 1;
2886
            end
2887
          end
2888
        end
2889 181 mohor
        else // wait for Busy bit to be set to '0'
2890 169 mohor
        begin
2891 181 mohor
          if (i1 <= 2)
2892 169 mohor
          begin
2893 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2894 169 mohor
            begin
2895 181 mohor
              i1 = 3; // end of Busy checking
2896 169 mohor
            end
2897 181 mohor
            else
2898 169 mohor
            begin
2899 181 mohor
              if (i1 == 2)
2900 169 mohor
              begin
2901 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2902 169 mohor
                fail = fail + 1;
2903
              end
2904 181 mohor
              #Tp i1 = i1 + 1;
2905 169 mohor
            end
2906 181 mohor
          end
2907
          if (i2 == 0)
2908
          begin
2909
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2910 169 mohor
            begin
2911 181 mohor
              i2 = 1;
2912 169 mohor
            end
2913 181 mohor
            else
2914
            begin
2915
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
2916
              fail = fail + 1;
2917
            end
2918 169 mohor
          end
2919
        end
2920 181 mohor
      end
2921
    end
2922
    // set PHY to normal mode
2923
    #Tp eth_phy.preamble_suppresed(0);
2924
    // MII mode register
2925
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2926
    if(fail == 0)
2927
      test_ok;
2928
    else
2929
      fail = 0;
2930
  end
2931
 
2932
 
2933
  ////////////////////////////////////////////////////////////////////
2934
  ////                                                            ////
2935
  ////  Test scan status from phy with detecting link-fail bit    ////
2936
  ////  (with and without preamble)                               ////
2937
  ////                                                            ////
2938
  ////////////////////////////////////////////////////////////////////
2939
  if (test_num == 14) // 
2940
  begin
2941 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
2942
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
2943
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
2944 181 mohor
 
2945
    reset_mii; // reset MII
2946
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2947
    #Tp eth_phy.link_up_down(1);
2948
    // set MII speed
2949
    clk_div = 6;
2950
    mii_set_clk_div(clk_div[7:0]);
2951
    // set address
2952
    reg_addr = 5'h1; // status register
2953
    phy_addr = 5'h1; // correct PHY address
2954
 
2955
    // read request
2956
    #Tp mii_read_req(phy_addr, reg_addr);
2957
    check_mii_busy; // wait for read to finish
2958
    // read data from PHY status register - remember LINK-UP status
2959
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2960
 
2961
    for (i = 0; i <= 1; i = i + 1)
2962
    begin
2963
      #Tp eth_phy.preamble_suppresed(i);
2964
      // MII mode register
2965
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2966
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2967
      if (i)
2968
      begin
2969
        // change saved data when preamble is suppressed
2970
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
2971
      end
2972
 
2973
      // scan request
2974
      #Tp mii_scan_req(phy_addr, reg_addr);
2975
      check_mii_scan_valid; // wait for scan to make first data valid
2976
 
2977 169 mohor
      fork
2978 181 mohor
      begin
2979 169 mohor
        repeat(2) @(posedge Mdc_O);
2980
        // read data from PHY status register
2981
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2982 181 mohor
        if (phy_data !== tmp_data)
2983 169 mohor
        begin
2984 181 mohor
          test_fail("Data was not correctly scaned from status register");
2985 169 mohor
          fail = fail + 1;
2986
        end
2987
        // read data from MII status register
2988
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2989 181 mohor
        if (phy_data[0] !== 1'b0)
2990 169 mohor
        begin
2991 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
2992 169 mohor
          fail = fail + 1;
2993
        end
2994
      end
2995
      begin
2996 181 mohor
      // Completely check second scan
2997 169 mohor
        #Tp cnt = 0;
2998
        // wait for serial bus to become active - second scan
2999
        wait(Mdio_IO !== 1'bz);
3000
        // count transfer length
3001 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3002 169 mohor
        begin
3003
          @(posedge Mdc_O);
3004
          #Tp cnt = cnt + 1;
3005
        end
3006
        // check transfer length
3007 181 mohor
        if (i) // without preamble
3008 169 mohor
        begin
3009
          if (cnt != 33) // at this value Mdio_IO is HIGH Z
3010
          begin
3011 181 mohor
            test_fail("Second scan request did not proceed correctly");
3012 169 mohor
            fail = fail + 1;
3013
          end
3014
        end
3015
        else // with preamble
3016
        begin
3017
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3018
          begin
3019 181 mohor
            test_fail("Second scan request did not proceed correctly");
3020 169 mohor
            fail = fail + 1;
3021
          end
3022
        end
3023
      end
3024
      join
3025 181 mohor
      // check third to fifth scans
3026
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3027
      begin
3028
        fork
3029 169 mohor
        begin
3030
          repeat(2) @(posedge Mdc_O);
3031
          // read data from PHY status register
3032
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3033 181 mohor
          if (phy_data !== tmp_data)
3034 169 mohor
          begin
3035 181 mohor
            test_fail("Data was not correctly scaned from status register");
3036
            fail = fail + 1;
3037 169 mohor
          end
3038
          // read data from MII status register
3039
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3040 181 mohor
          if (phy_data[0] !== 1'b0)
3041 169 mohor
          begin
3042 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3043
            fail = fail + 1;
3044 169 mohor
          end
3045 181 mohor
          if (i3 == 2) // after fourth scan read
3046 169 mohor
          begin
3047 181 mohor
            @(posedge Mdc_O);
3048
            // change saved data
3049
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3050
            // set link down
3051
            #Tp eth_phy.link_up_down(0);
3052 169 mohor
          end
3053
        end
3054
        begin
3055 181 mohor
        // Completely check scans
3056
          #Tp cnt = 0;
3057
          // wait for serial bus to become active - second scan
3058
          wait(Mdio_IO !== 1'bz);
3059
          // count transfer length
3060
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3061 169 mohor
          begin
3062 181 mohor
            @(posedge Mdc_O);
3063
            #Tp cnt = cnt + 1;
3064
          end
3065
          // check transfer length
3066
          if (i) // without preamble
3067
          begin
3068
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3069 169 mohor
            begin
3070 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3071
              fail = fail + 1;
3072 169 mohor
            end
3073 181 mohor
          end
3074
          else // with preamble
3075
          begin
3076
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3077 169 mohor
            begin
3078 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3079
              fail = fail + 1;
3080 169 mohor
            end
3081
          end
3082
        end
3083 181 mohor
        join
3084
      end
3085
 
3086
      fork
3087
      begin
3088
        repeat(2) @(posedge Mdc_O);
3089
        // read data from PHY status register
3090
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3091
        if (phy_data !== tmp_data)
3092
        begin
3093
          test_fail("Data was not correctly scaned from status register");
3094
          fail = fail + 1;
3095
        end
3096
        // read data from MII status register
3097
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3098
        if (phy_data[0] === 1'b0)
3099
        begin
3100
          test_fail("Link FAIL bit was not set in the MII status register");
3101
          fail = fail + 1;
3102
        end
3103
        // wait to see if data stayed latched
3104
        repeat(4) @(posedge Mdc_O);
3105
        // read data from PHY status register
3106
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3107
        if (phy_data !== tmp_data)
3108
        begin
3109
          test_fail("Data was not latched correctly in status register");
3110
          fail = fail + 1;
3111
        end
3112
        // read data from MII status register
3113
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3114
        if (phy_data[0] === 1'b0)
3115
        begin
3116
          test_fail("Link FAIL bit was not set in the MII status register");
3117
          fail = fail + 1;
3118
        end
3119
        // change saved data
3120
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3121
        // set link up
3122
        #Tp eth_phy.link_up_down(1);
3123
      end
3124
      begin
3125
      // Wait for sixth scan
3126
        // wait for serial bus to become active - sixth scan
3127
        wait(Mdio_IO !== 1'bz);
3128
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3129
        wait(Mdio_IO === 1'bz);
3130
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3131
        wait(Mdio_IO !== 1'bz);
3132
        // wait for serial bus to become inactive - end of sixth scan
3133
        wait(Mdio_IO === 1'bz);
3134
      end
3135 169 mohor
      join
3136 181 mohor
 
3137
      @(posedge Mdc_O);
3138 169 mohor
      // read data from PHY status register
3139
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3140
      if (phy_data !== tmp_data)
3141
      begin
3142 181 mohor
        test_fail("Data was not correctly scaned from status register");
3143 169 mohor
        fail = fail + 1;
3144
      end
3145
      // read data from MII status register
3146
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3147
      if (phy_data[0] !== 1'b0)
3148
      begin
3149
        test_fail("Link FAIL bit was set in the MII status register");
3150
        fail = fail + 1;
3151
      end
3152 181 mohor
      // wait to see if data stayed latched
3153
      repeat(4) @(posedge Mdc_O);
3154
      // read data from PHY status register
3155
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3156
      if (phy_data !== tmp_data)
3157 169 mohor
      begin
3158 181 mohor
        test_fail("Data was not correctly scaned from status register");
3159
        fail = fail + 1;
3160 169 mohor
      end
3161 181 mohor
      // read data from MII status register
3162
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3163
      if (phy_data[0] !== 1'b0)
3164 169 mohor
      begin
3165 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3166
        fail = fail + 1;
3167 169 mohor
      end
3168 181 mohor
 
3169
      // STOP SCAN
3170
      #Tp mii_scan_finish; // finish scan operation
3171
      #Tp check_mii_busy; // wait for scan to finish
3172 169 mohor
    end
3173 181 mohor
    // set PHY to normal mode
3174
    #Tp eth_phy.preamble_suppresed(0);
3175
    // MII mode register
3176
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3177
    if(fail == 0)
3178
      test_ok;
3179
    else
3180
      fail = 0;
3181 169 mohor
  end
3182
 
3183
 
3184 181 mohor
  ////////////////////////////////////////////////////////////////////
3185
  ////                                                            ////
3186
  ////  Test scan status from phy with sliding link-fail bit      ////
3187
  ////  (with and without preamble)                               ////
3188
  ////                                                            ////
3189
  ////////////////////////////////////////////////////////////////////
3190
  if (test_num == 15) // 
3191 169 mohor
  begin
3192 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3193
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3194
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3195 181 mohor
 
3196
    // set address
3197
    reg_addr = 5'h1; // status register
3198
    phy_addr = 5'h1; // correct PHY address
3199
 
3200
    // read request
3201
    #Tp mii_read_req(phy_addr, reg_addr);
3202
    check_mii_busy; // wait for read to finish
3203
    // read data from PHY status register - remember LINK-UP status
3204
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3205
 
3206
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3207 169 mohor
    begin
3208 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3209
      // MII mode register
3210
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3211
                    wbm_subseq_waits);
3212
      if (i2)
3213 169 mohor
      begin
3214 181 mohor
        // change saved data when preamble is suppressed
3215
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3216
      end
3217
 
3218
      i = 0;
3219
      while (i < 80) // delay for sliding of LinkFail bit
3220
      begin
3221
        // first there are two scans
3222
        #Tp cnt = 0;
3223 169 mohor
        // scan request
3224
        #Tp mii_scan_req(phy_addr, reg_addr);
3225 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3226
 
3227
        // check second scan
3228 169 mohor
        fork
3229 181 mohor
        begin
3230
          repeat(4) @(posedge Mdc_O);
3231
          // read data from PHY status register
3232
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3233
          if (phy_data !== tmp_data)
3234 169 mohor
          begin
3235 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3236
            fail = fail + 1;
3237 169 mohor
          end
3238 181 mohor
          // read data from MII status register
3239
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3240
          if (phy_data[0] !== 1'b0)
3241
          begin
3242
            test_fail("Link FAIL bit was set in the MII status register");
3243
            fail = fail + 1;
3244
          end
3245
        end
3246
        begin
3247
        // Completely check scan
3248
          #Tp cnt = 0;
3249
          // wait for serial bus to become active - second scan
3250
          wait(Mdio_IO !== 1'bz);
3251
          // count transfer length
3252
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3253
          begin
3254
            @(posedge Mdc_O);
3255
            #Tp cnt = cnt + 1;
3256
          end
3257
          // check transfer length
3258
          if (i2) // without preamble
3259
          begin
3260
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3261 169 mohor
            begin
3262 181 mohor
              test_fail("Second scan request did not proceed correctly");
3263
              fail = fail + 1;
3264 169 mohor
            end
3265 181 mohor
          end
3266
          else // with preamble
3267
          begin
3268
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3269
            begin
3270
              test_fail("Second scan request did not proceed correctly");
3271
              fail = fail + 1;
3272
            end
3273
          end
3274
        end
3275
        join
3276
        // reset counter 
3277
        #Tp cnt = 0;
3278
        // SLIDING LINK DOWN and CHECK
3279
        fork
3280
          begin
3281
          // set link down
3282
            repeat(i) @(posedge Mdc_O);
3283
            // set link down
3284
            #Tp eth_phy.link_up_down(0);
3285
          end
3286
          begin
3287
          // check data in MII registers after each scan in this fork statement
3288 169 mohor
            if (i2) // without preamble
3289 181 mohor
              wait (cnt == 32);
3290
            else // with preamble
3291
              wait (cnt == 64);
3292
            repeat(3) @(posedge Mdc_O);
3293
            // read data from PHY status register
3294
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3295
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3296 169 mohor
            begin
3297 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3298 169 mohor
              begin
3299 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3300 169 mohor
                fail = fail + 1;
3301
              end
3302
            end
3303 181 mohor
            else
3304 169 mohor
            begin
3305 181 mohor
              if (phy_data !== tmp_data)
3306 169 mohor
              begin
3307 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3308 169 mohor
                fail = fail + 1;
3309
              end
3310
            end
3311 181 mohor
            // read data from MII status register
3312
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3313
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3314 169 mohor
            begin
3315 181 mohor
              if (phy_data[0] === 1'b0)
3316
              begin
3317
                test_fail("Link FAIL bit was not set in the MII status register");
3318
                fail = fail + 1;
3319
              end
3320 169 mohor
            end
3321 181 mohor
            else
3322 169 mohor
            begin
3323 181 mohor
              if (phy_data[0] !== 1'b0)
3324 169 mohor
              begin
3325 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3326 169 mohor
                fail = fail + 1;
3327
              end
3328
            end
3329 181 mohor
          end
3330
          begin
3331
          // check length
3332
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3333 169 mohor
            begin
3334 181 mohor
              #Tp cnt = 0;
3335
              // wait for serial bus to become active if there is more than one scan
3336
              wait(Mdio_IO !== 1'bz);
3337
              // count transfer length
3338
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3339 169 mohor
              begin
3340 181 mohor
                @(posedge Mdc_O);
3341
                #Tp cnt = cnt + 1;
3342 169 mohor
              end
3343 181 mohor
              // check transfer length
3344
              if (i2) // without preamble
3345
              begin
3346
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3347
                begin
3348
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3349
                  fail = fail + 1;
3350
                end
3351
              end
3352
              else // with preamble
3353
              begin
3354
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3355
                begin
3356
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3357
                  fail = fail + 1;
3358
                end
3359
              end
3360 169 mohor
            end
3361
          end
3362
        join
3363 181 mohor
        // reset counter
3364
        #Tp cnt = 0;
3365
        // check fifth scan and data from fourth scan
3366
        fork
3367 169 mohor
        begin
3368 181 mohor
          repeat(2) @(posedge Mdc_O);
3369
          // read data from PHY status register
3370
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3371
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3372 169 mohor
          begin
3373 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3374
            fail = fail + 1;
3375 169 mohor
          end
3376 181 mohor
          // read data from MII status register
3377
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3378
          if (phy_data[0] === 1'b0)
3379 169 mohor
          begin
3380 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3381 169 mohor
            fail = fail + 1;
3382
          end
3383
        end
3384
        begin
3385 181 mohor
        // Completely check intermediate scan
3386
          #Tp cnt = 0;
3387
          // wait for serial bus to become active - second scan
3388 169 mohor
          wait(Mdio_IO !== 1'bz);
3389
          // count transfer length
3390
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3391
          begin
3392
            @(posedge Mdc_O);
3393
            #Tp cnt = cnt + 1;
3394
          end
3395 181 mohor
          // check transfer length
3396
          if (i2) // without preamble
3397 169 mohor
          begin
3398 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3399
            begin
3400
              test_fail("Fifth scan request did not proceed correctly");
3401
              fail = fail + 1;
3402
            end
3403 169 mohor
          end
3404 181 mohor
          else // with preamble
3405
          begin
3406
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3407
            begin
3408
              test_fail("Fifth scan request did not proceed correctly");
3409
              fail = fail + 1;
3410
            end
3411
          end
3412 169 mohor
        end
3413 181 mohor
        join
3414
        // reset counter 
3415
        #Tp cnt = 0;
3416
        // SLIDING LINK UP and CHECK
3417
        fork
3418 169 mohor
          begin
3419 181 mohor
          // set link up
3420
            repeat(i) @(posedge Mdc_O);
3421
            // set link up
3422
            #Tp eth_phy.link_up_down(1);
3423 169 mohor
          end
3424 181 mohor
          begin
3425
          // check data in MII registers after each scan in this fork statement
3426
            repeat(2) @(posedge Mdc_O);
3427
            if (i2) // without preamble
3428
              wait (cnt == 32);
3429
            else // with preamble
3430
              wait (cnt == 64);
3431
            repeat(3) @(posedge Mdc_O);
3432
            // read data from PHY status register
3433
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3434
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3435
            begin
3436
              if (phy_data !== tmp_data)
3437
              begin
3438
                test_fail("6. data was not correctly scaned from status register");
3439
                fail = fail + 1;
3440
              end
3441
            end
3442
            else
3443
            begin
3444
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3445
              begin
3446
                test_fail("6. data was not correctly scaned from status register");
3447
                fail = fail + 1;
3448
              end
3449
            end
3450
            // read data from MII status register
3451
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3452
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3453
            begin
3454
              if (phy_data[0] !== 1'b0)
3455
              begin
3456
                test_fail("Link FAIL bit was set in the MII status register");
3457
                fail = fail + 1;
3458
              end
3459
            end
3460
            else
3461
            begin
3462
              if (phy_data[0] === 1'b0)
3463
              begin
3464
                test_fail("Link FAIL bit was not set in the MII status register");
3465
                fail = fail + 1;
3466
              end
3467
            end
3468
          end
3469
          begin
3470
          // check length
3471
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3472
            begin
3473
              #Tp cnt = 0;
3474
              // wait for serial bus to become active if there is more than one scan
3475
              wait(Mdio_IO !== 1'bz);
3476
              // count transfer length
3477
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3478
              begin
3479
                @(posedge Mdc_O);
3480
                #Tp cnt = cnt + 1;
3481
              end
3482
              // check transfer length
3483
              if (i2) // without preamble
3484
              begin
3485
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3486
                begin
3487
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3488
                  fail = fail + 1;
3489
                end
3490
              end
3491
              else // with preamble
3492
              begin
3493
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3494
                begin
3495
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3496
                  fail = fail + 1;
3497
                end
3498
              end
3499
            end
3500
          end
3501
        join
3502
        // check last scan 
3503
        repeat(4) @(posedge Mdc_O);
3504
        // read data from PHY status register
3505
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3506
        if (phy_data !== tmp_data)
3507
        begin
3508
          test_fail("7. data was not correctly scaned from status register");
3509
          fail = fail + 1;
3510 169 mohor
        end
3511 181 mohor
        // read data from MII status register
3512
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3513
        if (phy_data[0] !== 1'b0)
3514
        begin
3515
          test_fail("Link FAIL bit was set in the MII status register");
3516
          fail = fail + 1;
3517
        end
3518
 
3519
        #Tp mii_scan_finish; // finish scan operation
3520
        #Tp check_mii_busy; // wait for scan to finish
3521
        #Tp;
3522
        // set delay of writing the command
3523
        if (i2) // without preamble
3524
        begin
3525
          case(i)
3526
            0,  1,  2,  3,  4:  i = i + 1;
3527
            13, 14, 15, 16, 17,
3528
            18, 19, 20, 21, 22,
3529
            23, 24, 25, 26, 27,
3530
            28, 29, 30, 31, 32,
3531
            33, 34, 35:         i = i + 1;
3532
            36:                 i = 80;
3533
            default:            i = 13;
3534
          endcase
3535
        end
3536 169 mohor
        else // with preamble
3537
        begin
3538 181 mohor
          case(i)
3539
            0,  1,  2,  3,  4:  i = i + 1;
3540
            45, 46, 47, 48, 49,
3541
            50, 51, 52, 53, 54,
3542
            55, 56, 57, 58, 59,
3543
            60, 61, 62, 63, 64,
3544
            65, 66, 67:         i = i + 1;
3545
            68:                 i = 80;
3546
            default:            i = 45;
3547
          endcase
3548 169 mohor
        end
3549 181 mohor
        @(posedge wb_clk);
3550
        #Tp;
3551 169 mohor
      end
3552
    end
3553 181 mohor
    // set PHY to normal mode
3554
    #Tp eth_phy.preamble_suppresed(0);
3555
    // MII mode register
3556
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3557
    if(fail == 0)
3558
      test_ok;
3559
    else
3560
      fail = 0;
3561 169 mohor
  end
3562
 
3563
 
3564 181 mohor
  ////////////////////////////////////////////////////////////////////
3565
  ////                                                            ////
3566
  ////  Test sliding stop scan command immediately after scan     ////
3567
  ////  request (with and without preamble)                       ////
3568
  ////                                                            ////
3569
  ////////////////////////////////////////////////////////////////////
3570
  if (test_num == 16) // 
3571 116 mohor
  begin
3572 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3573
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3574 181 mohor
    `TIME;
3575 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3576 181 mohor
 
3577
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3578 169 mohor
    begin
3579 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3580
      // MII mode register
3581
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3582
                wbm_subseq_waits);
3583
      i = 0;
3584
      cnt = 0;
3585
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3586 169 mohor
      begin
3587 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3588 169 mohor
        begin
3589 181 mohor
          // set address
3590
          reg_addr = 5'h0; // control register
3591
          phy_addr = 5'h1; // correct PHY address
3592
          cnt = 0;
3593
          // scan request
3594
          #Tp mii_scan_req(phy_addr, reg_addr);
3595
          fork
3596
            begin
3597
              repeat(i) @(posedge Mdc_O);
3598
              // write command 0x0 into MII command register
3599
              // MII command written while scan in progress
3600
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3601
              @(posedge wb_clk);
3602
              #Tp check_mii_busy; // wait for scan to finish
3603
              @(posedge wb_clk);
3604
              disable check;
3605
            end
3606
            begin: check
3607
              // wait for serial bus to become active
3608
              wait(Mdio_IO !== 1'bz);
3609
              // count transfer length
3610
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3611
              begin
3612
                @(posedge Mdc_O);
3613
                #Tp cnt = cnt + 1;
3614
              end
3615
              // check transfer length
3616
              if (i2) // without preamble
3617
              begin
3618
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3619
                begin
3620
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3621
                  fail = fail + 1;
3622
                end
3623
              end
3624
              else // with preamble
3625
              begin
3626
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3627
                begin
3628
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3629
                  fail = fail + 1;
3630
                end
3631
              end
3632
              cnt = 0;
3633
              // wait for serial bus to become active if there is more than one scan
3634
              wait(Mdio_IO !== 1'bz);
3635
              // count transfer length
3636
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3637
              begin
3638
                @(posedge Mdc_O);
3639
                #Tp cnt = cnt + 1;
3640
              end
3641
              // check transfer length
3642
              if (i2) // without preamble
3643
              begin
3644
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3645
                begin
3646
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3647
                  fail = fail + 1;
3648
                end
3649
              end
3650
              else // with preamble
3651
              begin
3652
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3653
                begin
3654
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3655
                  fail = fail + 1;
3656
                end
3657
              end
3658
            end
3659
          join
3660
          // check the BUSY signal to see if the bus is still IDLE
3661
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3662
            check_mii_busy; // wait for bus to become idle
3663
 
3664
          // try normal write or read after scan was finished
3665
          phy_data = {8'h7D, (i[7:0] + 1)};
3666
          cnt = 0;
3667
          if (i3 == 0) // write after scan
3668 169 mohor
          begin
3669 181 mohor
            // write request
3670
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3671
            // wait for serial bus to become active
3672
            wait(Mdio_IO !== 1'bz);
3673
            // count transfer length
3674
            while(Mdio_IO !== 1'bz)
3675
            begin
3676
              @(posedge Mdc_O);
3677
              #Tp cnt = cnt + 1;
3678
            end
3679 169 mohor
            @(posedge Mdc_O);
3680 181 mohor
            // read request
3681
            #Tp mii_read_req(phy_addr, reg_addr);
3682
            check_mii_busy; // wait for read to finish
3683
            // read and check data
3684
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3685
            if (phy_data !== tmp_data)
3686 169 mohor
            begin
3687 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3688 169 mohor
              fail = fail + 1;
3689
            end
3690
          end
3691 181 mohor
          else // read after scan
3692 169 mohor
          begin
3693 181 mohor
            // read request
3694
            #Tp mii_read_req(phy_addr, reg_addr);
3695
            // wait for serial bus to become active
3696
            wait(Mdio_IO !== 1'bz);
3697
            // count transfer length
3698
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3699 169 mohor
            begin
3700 181 mohor
              @(posedge Mdc_O);
3701
              #Tp cnt = cnt + 1;
3702
            end
3703
            @(posedge Mdc_O);
3704
            check_mii_busy; // wait for read to finish
3705
            // read and check data
3706
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3707
            if (phy_data !== tmp_data)
3708
            begin
3709
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3710 169 mohor
              fail = fail + 1;
3711
            end
3712
          end
3713 181 mohor
          // check if transfer was a proper length
3714 169 mohor
          if (i2) // without preamble
3715
          begin
3716
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3717
            begin
3718 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3719 169 mohor
              fail = fail + 1;
3720
            end
3721
          end
3722
          else // with preamble
3723
          begin
3724
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3725
            begin
3726 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3727 169 mohor
              fail = fail + 1;
3728
            end
3729
          end
3730
        end
3731 181 mohor
        #Tp;
3732
        // set delay of writing the command
3733
        if (i2) // without preamble
3734
        begin
3735
          case(i)
3736
            0, 1:               i = i + 1;
3737
            18, 19, 20, 21, 22,
3738
            23, 24, 25, 26, 27,
3739
            28, 29, 30, 31, 32,
3740
            33, 34, 35:         i = i + 1;
3741
            36:                 i = 80;
3742
            default:            i = 18;
3743
          endcase
3744
        end
3745
        else // with preamble
3746
        begin
3747
          case(i)
3748
            0, 1:               i = i + 1;
3749
            50, 51, 52, 53, 54,
3750
            55, 56, 57, 58, 59,
3751
            60, 61, 62, 63, 64,
3752
            65, 66, 67:         i = i + 1;
3753
            68:                 i = 80;
3754
            default:            i = 50;
3755
          endcase
3756
        end
3757
        @(posedge wb_clk);
3758
      end
3759
    end
3760
    // set PHY to normal mode
3761
    #Tp eth_phy.preamble_suppresed(0);
3762
    // MII mode register
3763
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3764
    if(fail == 0)
3765
      test_ok;
3766
    else
3767
      fail = 0;
3768
  end
3769 169 mohor
 
3770 181 mohor
 
3771
  ////////////////////////////////////////////////////////////////////
3772
  ////                                                            ////
3773
  ////  Test sliding stop scan command after 2. scan (with and    ////
3774
  ////  without preamble)                                         ////
3775
  ////                                                            ////
3776
  ////////////////////////////////////////////////////////////////////
3777
  if (test_num == 17) // 
3778
  begin
3779 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3780
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3781
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3782 181 mohor
 
3783
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3784
    begin
3785
      #Tp eth_phy.preamble_suppresed(i2);
3786
      // MII mode register
3787
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3788
                wbm_subseq_waits);
3789
 
3790
      i = 0;
3791
      cnt = 0;
3792
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3793
      begin
3794
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3795
        begin
3796
          // first there are two scans
3797
          // set address
3798
          reg_addr = 5'h0; // control register
3799
          phy_addr = 5'h1; // correct PHY address
3800
          cnt = 0;
3801
          // scan request
3802
          #Tp mii_scan_req(phy_addr, reg_addr);
3803
          // wait and check first 2 scans
3804 169 mohor
          begin
3805
            // wait for serial bus to become active
3806
            wait(Mdio_IO !== 1'bz);
3807
            // count transfer length
3808
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3809
            begin
3810
              @(posedge Mdc_O);
3811
              #Tp cnt = cnt + 1;
3812
            end
3813
            // check transfer length
3814
            if (i2) // without preamble
3815
            begin
3816
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3817
              begin
3818
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3819
                fail = fail + 1;
3820
              end
3821
            end
3822
            else // with preamble
3823
            begin
3824
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3825
              begin
3826
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3827
                fail = fail + 1;
3828
              end
3829
            end
3830
            cnt = 0;
3831
            // wait for serial bus to become active if there is more than one scan
3832
            wait(Mdio_IO !== 1'bz);
3833
            // count transfer length
3834
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3835
            begin
3836
              @(posedge Mdc_O);
3837
              #Tp cnt = cnt + 1;
3838
            end
3839
            // check transfer length
3840
            if (i2) // without preamble
3841
            begin
3842
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3843
              begin
3844
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3845
                fail = fail + 1;
3846
              end
3847
            end
3848
            else // with preamble
3849
            begin
3850
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3851
              begin
3852
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3853
                fail = fail + 1;
3854
              end
3855
            end
3856
          end
3857
 
3858 181 mohor
          // reset counter 
3859
          cnt = 0;
3860
          fork
3861
            begin
3862
              repeat(i) @(posedge Mdc_O);
3863
              // write command 0x0 into MII command register
3864
              // MII command written while scan in progress
3865
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3866
              @(posedge wb_clk);
3867
              #Tp check_mii_busy; // wait for scan to finish
3868
              @(posedge wb_clk);
3869
              disable check_3;
3870
            end
3871
            begin: check_3
3872
              // wait for serial bus to become active
3873
              wait(Mdio_IO !== 1'bz);
3874
              // count transfer length
3875
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3876
              begin
3877
                @(posedge Mdc_O);
3878
                #Tp cnt = cnt + 1;
3879
              end
3880
              // check transfer length
3881
              if (i2) // without preamble
3882
              begin
3883
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3884
                begin
3885
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3886
                  fail = fail + 1;
3887
                end
3888
              end
3889
              else // with preamble
3890
              begin
3891
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3892
                begin
3893
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3894
                  fail = fail + 1;
3895
                end
3896
              end
3897
              cnt = 0;
3898
              // wait for serial bus to become active if there is more than one scan
3899
              wait(Mdio_IO !== 1'bz);
3900
              // count transfer length
3901
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3902
              begin
3903
                @(posedge Mdc_O);
3904
                #Tp cnt = cnt + 1;
3905
              end
3906
              // check transfer length
3907
              if (i2) // without preamble
3908
              begin
3909
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3910
                begin
3911
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3912
                  fail = fail + 1;
3913
                end
3914
              end
3915
              else // with preamble
3916
              begin
3917
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3918
                begin
3919
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3920
                  fail = fail + 1;
3921
                end
3922
              end
3923
            end
3924
          join
3925
          // check the BUSY signal to see if the bus is still IDLE
3926
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3927
            check_mii_busy; // wait for bus to become idle
3928
 
3929
          // try normal write or read after scan was finished
3930
          phy_data = {8'h7D, (i[7:0] + 1)};
3931
          cnt = 0;
3932
          if (i3 == 0) // write after scan
3933 169 mohor
          begin
3934 181 mohor
            // write request
3935
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3936
            // wait for serial bus to become active
3937
            wait(Mdio_IO !== 1'bz);
3938
            // count transfer length
3939
            while(Mdio_IO !== 1'bz)
3940
            begin
3941
              @(posedge Mdc_O);
3942
              #Tp cnt = cnt + 1;
3943
            end
3944 169 mohor
            @(posedge Mdc_O);
3945 181 mohor
            // read request
3946
            #Tp mii_read_req(phy_addr, reg_addr);
3947
            check_mii_busy; // wait for read to finish
3948
            // read and check data
3949
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3950
            if (phy_data !== tmp_data)
3951
            begin
3952
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3953
              fail = fail + 1;
3954
            end
3955 169 mohor
          end
3956 181 mohor
          else // read after scan
3957 169 mohor
          begin
3958 181 mohor
            // read request
3959
            #Tp mii_read_req(phy_addr, reg_addr);
3960
            // wait for serial bus to become active
3961
            wait(Mdio_IO !== 1'bz);
3962
            // count transfer length
3963
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3964
            begin
3965
              @(posedge Mdc_O);
3966
              #Tp cnt = cnt + 1;
3967
            end
3968
            @(posedge Mdc_O);
3969
            check_mii_busy; // wait for read to finish
3970
            // read and check data
3971
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3972
            if (phy_data !== tmp_data)
3973
            begin
3974
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3975
              fail = fail + 1;
3976
            end
3977 169 mohor
          end
3978 181 mohor
          // check if transfer was a proper length
3979
          if (i2) // without preamble
3980 169 mohor
          begin
3981 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3982
            begin
3983
              test_fail("New request did not proceed correctly, after scan request");
3984
              fail = fail + 1;
3985
            end
3986 169 mohor
          end
3987 181 mohor
          else // with preamble
3988 169 mohor
          begin
3989 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3990
            begin
3991
              test_fail("New request did not proceed correctly, after scan request");
3992
              fail = fail + 1;
3993
            end
3994 169 mohor
          end
3995
        end
3996 181 mohor
        #Tp;
3997
        // set delay of writing the command
3998 169 mohor
        if (i2) // without preamble
3999
        begin
4000 181 mohor
          case(i)
4001
            0, 1:               i = i + 1;
4002
            18, 19, 20, 21, 22,
4003
            23, 24, 25, 26, 27,
4004
            28, 29, 30, 31, 32,
4005
            33, 34, 35:         i = i + 1;
4006
            36:                 i = 80;
4007
            default:            i = 18;
4008
          endcase
4009 169 mohor
        end
4010
        else // with preamble
4011
        begin
4012 181 mohor
          case(i)
4013
            0, 1:               i = i + 1;
4014
            50, 51, 52, 53, 54,
4015
            55, 56, 57, 58, 59,
4016
            60, 61, 62, 63, 64,
4017
            65, 66, 67:         i = i + 1;
4018
            68:                 i = 80;
4019
            default:            i = 50;
4020
          endcase
4021 169 mohor
        end
4022 181 mohor
        @(posedge wb_clk);
4023 116 mohor
      end
4024
    end
4025 181 mohor
    // set PHY to normal mode
4026
    #Tp eth_phy.preamble_suppresed(0);
4027
    // MII mode register
4028
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4029
    if(fail == 0)
4030
      test_ok;
4031
    else
4032
      fail = 0;
4033 169 mohor
  end
4034 116 mohor
 
4035 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4036
 
4037 169 mohor
end
4038
endtask // test_mii
4039
 
4040
 
4041
task test_mac_full_duplex_transmit;
4042
  input  [31:0]  start_task;
4043
  input  [31:0]  end_task;
4044
  integer        bit_start_1;
4045
  integer        bit_end_1;
4046
  integer        bit_start_2;
4047
  integer        bit_end_2;
4048
  integer        num_of_reg;
4049 209 tadejm
  integer        num_of_frames;
4050
  integer        num_of_bd;
4051 169 mohor
  integer        i_addr;
4052
  integer        i_data;
4053
  integer        i_length;
4054 209 tadejm
  integer        tmp_len;
4055
  integer        tmp_bd;
4056
  integer        tmp_bd_num;
4057 169 mohor
  integer        tmp_data;
4058 209 tadejm
  integer        tmp_ipgt;
4059 194 tadej
  integer        test_num;
4060 169 mohor
  reg    [31:0]  tx_bd_num;
4061
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4062
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4063
  integer        i;
4064
  integer        i1;
4065
  integer        i2;
4066
  integer        i3;
4067
  integer        fail;
4068
  integer        speed;
4069 209 tadejm
  reg            frame_started;
4070
  reg            frame_ended;
4071
  reg            wait_for_frame;
4072 169 mohor
  reg    [31:0]  addr;
4073
  reg    [31:0]  data;
4074
  reg    [31:0]  tmp;
4075
  reg    [ 7:0]  st_data;
4076
  reg    [15:0]  max_tmp;
4077
  reg    [15:0]  min_tmp;
4078
begin
4079
// MAC FULL DUPLEX TRANSMIT TEST
4080
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4081
$display(" ");
4082
$display("MAC FULL DUPLEX TRANSMIT TEST");
4083
fail = 0;
4084
 
4085
// reset MAC registers
4086
hard_reset;
4087
// reset MAC and MII LOGIC with soft reset
4088
reset_mac;
4089
reset_mii;
4090
// set wb slave response
4091
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4092
 
4093
  /*
4094
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4095
  -------------------------------------------------------------------------------------
4096
  set_tx_bd
4097
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4098
  set_tx_bd_wrap
4099
    (tx_bd_num_end[6:0]);
4100
  set_tx_bd_ready
4101
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4102
  check_tx_bd
4103
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4104
  clear_tx_bd
4105
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4106
 
4107
  TASKS for set and control RX buffer descriptors:
4108
  ------------------------------------------------
4109
  set_rx_bd
4110
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4111
  set_rx_bd_wrap
4112
    (rx_bd_num_end[6:0]);
4113
  set_rx_bd_empty
4114
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4115
  check_rx_bd
4116
    (rx_bd_num_end[6:0], rx_bd_status);
4117
  clear_rx_bd
4118
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4119
 
4120
  TASKS for set and check TX packets:
4121
  -----------------------------------
4122
  set_tx_packet
4123
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4124
  check_tx_packet
4125
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4126
 
4127
  TASKS for set and check RX packets:
4128
  -----------------------------------
4129
  set_rx_packet
4130
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4131
  check_rx_packet
4132
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4133
 
4134
  TASKS for append and check CRC to/of TX packet:
4135
  -----------------------------------------------
4136
  append_tx_crc
4137
    (txpnt_wb[31:0], len[15:0], negated_crc);
4138
  check_tx_crc
4139
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4140
 
4141
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4142
  --------------------------------------------------------------------------------
4143
  append_rx_crc
4144
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4145
  */
4146
 
4147 194 tadej
//////////////////////////////////////////////////////////////////////
4148
////                                                              ////
4149
////  test_mac_full_duplex_transmit:                              ////
4150
////                                                              ////
4151
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4152
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4153
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4154
////     one TX buffer decriptor ( 10Mbps ).                      ////
4155
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4156
////     one TX buffer decriptor ( 100Mbps ).                     ////
4157
////                                                              ////
4158
//////////////////////////////////////////////////////////////////////
4159
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4160 169 mohor
begin
4161
 
4162 194 tadej
  ////////////////////////////////////////////////////////////////////
4163
  ////                                                            ////
4164
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4165
  ////                                                            ////
4166
  ////////////////////////////////////////////////////////////////////
4167
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4168 169 mohor
  begin
4169 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4170
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4171
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4172
 
4173
    // unmask interrupts
4174 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4175 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4176
    // set all buffer descriptors to RX - must be set before TX enable
4177
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4178
    // enable TX, set full-duplex mode, padding and CRC appending
4179
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4180
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4181
 
4182
    // write to phy's control register for 10Mbps
4183
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4184
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4185
    speed = 10;
4186
 
4187
    i = 0;
4188
    while (i < 128)
4189 169 mohor
    begin
4190 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4191 169 mohor
      begin
4192 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4193
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4194 169 mohor
      end
4195 194 tadej
      set_tx_bd_wrap(i);
4196
      fork
4197
        begin
4198
          set_tx_bd_ready(0, i);
4199
          repeat(20) @(negedge mtx_clk);
4200
          #1 disable check_tx_en10;
4201
        end
4202
        begin: check_tx_en10
4203
          wait (MTxEn === 1'b1);
4204
          test_fail("Tramsmit should not start at all");
4205
          fail = fail + 1;
4206
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4207
        end
4208
      join
4209
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4210 169 mohor
      begin
4211 194 tadej
        check_tx_bd(0, tmp);
4212
        #1;
4213
        if (tmp[15] === 1'b0)
4214
        begin
4215
          test_fail("Tramsmit should not start at all");
4216
          fail = fail + 1;
4217
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4218
        end
4219
        if (tmp[8:0] !== 0)
4220
        begin
4221
          test_fail("Tramsmit should not be finished since it should not start at all");
4222
          fail = fail + 1;
4223
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4224
        end
4225
        @(posedge wb_clk);
4226 169 mohor
      end
4227 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4228
      if (tmp[6:0] !== 0)
4229 169 mohor
      begin
4230 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4231 169 mohor
        fail = fail + 1;
4232 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4233 169 mohor
      end
4234 194 tadej
      clear_tx_bd(0, i);
4235
      if ((i < 5) || (i > 124))
4236
        i = i + 1;
4237
      else
4238
        i = i + 120;
4239 116 mohor
    end
4240 194 tadej
    // disable TX
4241
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4242
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4243
    if(fail == 0)
4244
      test_ok;
4245 116 mohor
    else
4246 194 tadej
      fail = 0;
4247 169 mohor
  end
4248 116 mohor
 
4249
 
4250 194 tadej
  ////////////////////////////////////////////////////////////////////
4251
  ////                                                            ////
4252
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4253
  ////                                                            ////
4254
  ////////////////////////////////////////////////////////////////////
4255
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4256 169 mohor
  begin
4257 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4258
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4259
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4260
 
4261
    // unmask interrupts
4262 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4263 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4264
    // set all buffer descriptors to RX - must be set before TX enable
4265
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4266
    // enable TX, set full-duplex mode, padding and CRC appending
4267
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4268
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4269
 
4270
    // write to phy's control register for 100Mbps
4271
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4272
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4273
    speed = 100;
4274
 
4275
    i = 0;
4276
    while (i < 128)
4277 169 mohor
    begin
4278 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4279 169 mohor
      begin
4280 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4281
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4282 169 mohor
      end
4283 194 tadej
      set_tx_bd_wrap(i);
4284
      fork
4285
        begin
4286
          set_tx_bd_ready(0, i);
4287
          repeat(20) @(negedge mtx_clk);
4288
          #1 disable check_tx_en100;
4289
        end
4290
        begin: check_tx_en100
4291
          wait (MTxEn === 1'b1);
4292
          test_fail("Tramsmit should not start at all");
4293
          fail = fail + 1;
4294
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4295
        end
4296
      join
4297
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4298 169 mohor
      begin
4299 194 tadej
        check_tx_bd(0, tmp);
4300
        #1;
4301
        if (tmp[15] === 1'b0)
4302
        begin
4303
          test_fail("Tramsmit should not start at all");
4304
          fail = fail + 1;
4305
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4306
        end
4307
        if (tmp[8:0] !== 0)
4308
        begin
4309
          test_fail("Tramsmit should not be finished since it should not start at all");
4310
          fail = fail + 1;
4311
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4312
        end
4313
        @(posedge wb_clk);
4314 169 mohor
      end
4315 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4316
      if (tmp[6:0] !== 0)
4317 169 mohor
      begin
4318 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4319 169 mohor
        fail = fail + 1;
4320 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4321 169 mohor
      end
4322 194 tadej
      clear_tx_bd(0, i);
4323
      if ((i < 5) || (i > 124))
4324
        i = i + 1;
4325
      else
4326
        i = i + 120;
4327 169 mohor
    end
4328 194 tadej
    // disable TX
4329
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4330
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4331
    if(fail == 0)
4332
      test_ok;
4333 169 mohor
    else
4334 194 tadej
      fail = 0;
4335 169 mohor
  end
4336
 
4337
 
4338 194 tadej
  ////////////////////////////////////////////////////////////////////
4339
  ////                                                            ////
4340
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4341
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4342
  ////                                                            ////
4343
  ////////////////////////////////////////////////////////////////////
4344 209 tadejm
  if (test_num == 2) // without and with padding
4345 169 mohor
  begin
4346 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4347
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4348
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4349
 
4350
    max_tmp = 0;
4351
    min_tmp = 0;
4352
    // set one TX buffer descriptor - must be set before TX enable
4353
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4354 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4355
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4356 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4357
    // prepare two packets of MAXFL length
4358
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4359
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4360
    min_tmp = tmp[31:16];
4361 209 tadejm
    st_data = 8'h01;
4362
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4363 194 tadej
    st_data = 8'h10;
4364 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4365 194 tadej
    // check WB INT signal
4366
    if (wb_int !== 1'b0)
4367 169 mohor
    begin
4368 194 tadej
      test_fail("WB INT signal should not be set");
4369
      fail = fail + 1;
4370 169 mohor
    end
4371 194 tadej
 
4372
    // write to phy's control register for 10Mbps
4373
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4374
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4375
    speed = 10;
4376
 
4377
    i_length = (min_tmp - 4);
4378
    while (i_length <= (max_tmp - 4))
4379 169 mohor
    begin
4380 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4381
      case (i_length[1:0])
4382
      2'h0: // Interrupt is generated
4383 169 mohor
      begin
4384 194 tadej
        // enable interrupt generation
4385 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4386 194 tadej
        // unmask interrupts
4387 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4388 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4389
        // not detect carrier sense in FD and no collision
4390
        eth_phy.carrier_sense_tx_fd_detect(0);
4391
        eth_phy.collision(0);
4392 169 mohor
      end
4393 194 tadej
      2'h1: // Interrupt is not generated
4394 169 mohor
      begin
4395 194 tadej
        // enable interrupt generation
4396 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4397 194 tadej
        // mask interrupts
4398
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4399
        // detect carrier sense in FD and no collision
4400
        eth_phy.carrier_sense_tx_fd_detect(1);
4401
        eth_phy.collision(0);
4402 169 mohor
      end
4403 194 tadej
      2'h2: // Interrupt is not generated
4404
      begin
4405
        // disable interrupt generation
4406 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4407 194 tadej
        // unmask interrupts
4408 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4409 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4410
        // not detect carrier sense in FD and set collision
4411
        eth_phy.carrier_sense_tx_fd_detect(0);
4412
        eth_phy.collision(1);
4413
      end
4414
      default: // 2'h3: // Interrupt is not generated
4415
      begin
4416
        // disable interrupt generation
4417 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4418 194 tadej
        // mask interrupts
4419
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4420
        // detect carrier sense in FD and set collision
4421
        eth_phy.carrier_sense_tx_fd_detect(1);
4422
        eth_phy.collision(1);
4423
      end
4424
      endcase
4425
      eth_phy.set_tx_mem_addr(max_tmp);
4426
      // set wrap bit
4427
      set_tx_bd_wrap(0);
4428
      set_tx_bd_ready(0, 0);
4429 169 mohor
      #1 check_tx_bd(0, data);
4430 194 tadej
      if (i_length < min_tmp) // just first four
4431 169 mohor
      begin
4432 194 tadej
        while (data[15] === 1)
4433
        begin
4434
          #1 check_tx_bd(0, data);
4435
          @(posedge wb_clk);
4436
        end
4437 209 tadejm
        repeat (1) @(posedge wb_clk);
4438 169 mohor
      end
4439 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4440 192 tadej
      begin
4441 194 tadej
        tmp = 0;
4442
        wait (MTxEn === 1'b1); // start transmit
4443
        while (tmp < (i_length - 20))
4444
        begin
4445
          #1 tmp = tmp + 1;
4446
          @(posedge wb_clk);
4447
        end
4448
        #1 check_tx_bd(0, data);
4449
        while (data[15] === 1)
4450
        begin
4451
          #1 check_tx_bd(0, data);
4452
          @(posedge wb_clk);
4453
        end
4454 209 tadejm
        repeat (1) @(posedge wb_clk);
4455 192 tadej
      end
4456
      else
4457
      begin
4458 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4459
        #1 check_tx_bd(0, data);
4460
        if (data[15] !== 1)
4461
        begin
4462
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4463
          fail = fail + 1;
4464
        end
4465
        wait (MTxEn === 1'b0); // end transmit
4466
        while (data[15] === 1)
4467
        begin
4468
          #1 check_tx_bd(0, data);
4469
          @(posedge wb_clk);
4470
        end
4471
        repeat (1) @(posedge wb_clk);
4472 192 tadej
      end
4473 194 tadej
      // check length of a PACKET
4474
      if (eth_phy.tx_len != (i_length + 4))
4475 192 tadej
      begin
4476 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4477 192 tadej
        fail = fail + 1;
4478
      end
4479 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4480
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4481 192 tadej
      begin
4482 194 tadej
        // check transmitted TX packet data
4483
        if (i_length[0] == 0)
4484
        begin
4485 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4486 194 tadej
        end
4487
        else
4488
        begin
4489 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4490 194 tadej
        end
4491
        if (tmp > 0)
4492
        begin
4493
          test_fail("Wrong data of the transmitted packet");
4494
          fail = fail + 1;
4495
        end
4496
        // check transmited TX packet CRC
4497
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4498
        if (tmp > 0)
4499
        begin
4500
          test_fail("Wrong CRC of the transmitted packet");
4501
          fail = fail + 1;
4502
        end
4503 192 tadej
      end
4504 194 tadej
      // check WB INT signal
4505
      if (i_length[1:0] == 2'h0)
4506 192 tadej
      begin
4507 194 tadej
        if (wb_int !== 1'b1)
4508
        begin
4509
          `TIME; $display("*E WB INT signal should be set");
4510
          test_fail("WB INT signal should be set");
4511
          fail = fail + 1;
4512
        end
4513 192 tadej
      end
4514 194 tadej
      else
4515 192 tadej
      begin
4516 194 tadej
        if (wb_int !== 1'b0)
4517
        begin
4518
          `TIME; $display("*E WB INT signal should not be set");
4519
          test_fail("WB INT signal should not be set");
4520
          fail = fail + 1;
4521
        end
4522 192 tadej
      end
4523 194 tadej
      // check TX buffer descriptor of a packet
4524
      check_tx_bd(0, data);
4525
      if (i_length[1] == 1'b0) // interrupt enabled
4526 192 tadej
      begin
4527 194 tadej
        if (data[15:0] !== 16'h7800)
4528
        begin
4529
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4530
          test_fail("TX buffer descriptor status is not correct");
4531
          fail = fail + 1;
4532
        end
4533 192 tadej
      end
4534 194 tadej
      else // interrupt not enabled
4535 192 tadej
      begin
4536 194 tadej
        if (data[15:0] !== 16'h3800)
4537
        begin
4538
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4539
          test_fail("TX buffer descriptor status is not correct");
4540
          fail = fail + 1;
4541
        end
4542 192 tadej
      end
4543 194 tadej
      // clear TX buffer descriptor
4544
      clear_tx_bd(0, 0);
4545
      // check interrupts
4546
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4547
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4548 192 tadej
      begin
4549 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4550
        begin
4551
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4552
          test_fail("Interrupt Transmit Buffer was not set");
4553
          fail = fail + 1;
4554
        end
4555
        if ((data & (~`ETH_INT_TXB)) !== 0)
4556
        begin
4557
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4558
          test_fail("Other interrupts (except Transmit Buffer) were set");
4559
          fail = fail + 1;
4560
        end
4561 192 tadej
      end
4562 194 tadej
      else
4563 192 tadej
      begin
4564 194 tadej
        if (data !== 0)
4565
        begin
4566
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4567
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4568
          fail = fail + 1;
4569
        end
4570 192 tadej
      end
4571 194 tadej
      // clear interrupts
4572
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4573
      // check WB INT signal
4574
      if (wb_int !== 1'b0)
4575 192 tadej
      begin
4576 194 tadej
        test_fail("WB INT signal should not be set");
4577 192 tadej
        fail = fail + 1;
4578
      end
4579 194 tadej
      // INTERMEDIATE DISPLAYS
4580
      if ((i_length + 4) == (min_tmp + 64))
4581 209 tadejm
      begin
4582 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4583 209 tadejm
        $display("    pads appending to packets is NOT selected");
4584
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4585 194 tadej
                 min_tmp, (min_tmp + 64));
4586 209 tadejm
        // set padding, remain the rest
4587
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4588
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4589
      end
4590 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4591 209 tadejm
      begin
4592 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4593 209 tadejm
        $display("    pads appending to packets is selected");
4594
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4595 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4596 209 tadejm
        // reset padding, remain the rest
4597
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4598
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4599
      end
4600 194 tadej
      else if ((i_length + 4) == max_tmp)
4601 209 tadejm
      begin
4602
        $display("    pads appending to packets is NOT selected");
4603
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4604 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4605 209 tadejm
      end
4606 194 tadej
      // set length (loop variable)
4607
      if ((i_length + 4) < (min_tmp + 64))
4608
        i_length = i_length + 1;
4609
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4610
      begin
4611
        i_length = i_length + 128;
4612
        tmp_data = i_length + 4; // last tmp_data is ending length
4613
      end
4614
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4615
        i_length = max_tmp - (4 + 16);
4616
      else if ((i_length + 4) >= (max_tmp - 16))
4617
        i_length = i_length + 1;
4618
      else
4619
      begin
4620
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4621
        #10 $stop;
4622
      end
4623 192 tadej
    end
4624 194 tadej
    // disable TX
4625
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4626
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4627
    if(fail == 0)
4628
      test_ok;
4629
    else
4630
      fail = 0;
4631
  end
4632
 
4633
 
4634
  ////////////////////////////////////////////////////////////////////
4635
  ////                                                            ////
4636
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4637
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4638
  ////                                                            ////
4639
  ////////////////////////////////////////////////////////////////////
4640 209 tadejm
  if (test_num == 3) // with and without padding
4641 194 tadej
  begin
4642
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4643
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4644
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4645
 
4646
    max_tmp = 0;
4647
    min_tmp = 0;
4648
    // set one TX buffer descriptor - must be set before TX enable
4649
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4650 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4651
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4652 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4653
    // prepare two packets of MAXFL length
4654
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4655
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4656
    min_tmp = tmp[31:16];
4657
    st_data = 8'h5A;
4658 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4659 194 tadej
    st_data = 8'h10;
4660 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4661 169 mohor
    // check WB INT signal
4662 192 tadej
    if (wb_int !== 1'b0)
4663 169 mohor
    begin
4664
      test_fail("WB INT signal should not be set");
4665
      fail = fail + 1;
4666
    end
4667 194 tadej
 
4668
    // write to phy's control register for 100Mbps
4669
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4670
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4671
    speed = 100;
4672 192 tadej
 
4673 194 tadej
    i_length = (min_tmp - 4);
4674
    while (i_length <= (max_tmp - 4))
4675 192 tadej
    begin
4676 194 tadej
      // choose generating carrier sense and collision
4677
      case (i_length[1:0])
4678
      2'h0: // Interrupt is generated
4679 192 tadej
      begin
4680 194 tadej
        // enable interrupt generation
4681 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4682 194 tadej
        // unmask interrupts
4683 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4684 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4685
        // not detect carrier sense in FD and no collision
4686
        eth_phy.carrier_sense_tx_fd_detect(0);
4687
        eth_phy.collision(0);
4688 192 tadej
      end
4689 194 tadej
      2'h1: // Interrupt is not generated
4690 192 tadej
      begin
4691 194 tadej
        // enable interrupt generation
4692 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4693 194 tadej
        // mask interrupts
4694
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4695
        // detect carrier sense in FD and no collision
4696
        eth_phy.carrier_sense_tx_fd_detect(1);
4697
        eth_phy.collision(0);
4698 192 tadej
      end
4699 194 tadej
      2'h2: // Interrupt is not generated
4700
      begin
4701
        // disable interrupt generation
4702 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4703 194 tadej
        // unmask interrupts
4704 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4705 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4706
        // not detect carrier sense in FD and set collision
4707
        eth_phy.carrier_sense_tx_fd_detect(0);
4708
        eth_phy.collision(1);
4709
      end
4710
      default: // 2'h3: // Interrupt is not generated
4711
      begin
4712
        // disable interrupt generation
4713 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4714 194 tadej
        // mask interrupts
4715
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4716
        // detect carrier sense in FD and set collision
4717
        eth_phy.carrier_sense_tx_fd_detect(1);
4718
        eth_phy.collision(1);
4719
      end
4720
      endcase
4721
      eth_phy.set_tx_mem_addr(max_tmp);
4722
      // set wrap bit
4723
      set_tx_bd_wrap(0);
4724
      set_tx_bd_ready(0, 0);
4725 192 tadej
      #1 check_tx_bd(0, data);
4726 194 tadej
      if (i_length < min_tmp) // just first four
4727 192 tadej
      begin
4728 194 tadej
        while (data[15] === 1)
4729
        begin
4730
          #1 check_tx_bd(0, data);
4731
          @(posedge wb_clk);
4732
        end
4733 209 tadejm
        repeat (1) @(posedge wb_clk);
4734 194 tadej
      end
4735
      else if (i_length > (max_tmp - 8)) // just last four
4736
      begin
4737
        tmp = 0;
4738
        wait (MTxEn === 1'b1); // start transmit
4739
        while (tmp < (i_length - 20))
4740
        begin
4741
          #1 tmp = tmp + 1;
4742
          @(posedge wb_clk);
4743
        end
4744 192 tadej
        #1 check_tx_bd(0, data);
4745 194 tadej
        while (data[15] === 1)
4746
        begin
4747
          #1 check_tx_bd(0, data);
4748
          @(posedge wb_clk);
4749
        end
4750 209 tadejm
        repeat (1) @(posedge wb_clk);
4751 192 tadej
      end
4752 194 tadej
      else
4753
      begin
4754
        wait (MTxEn === 1'b1); // start transmit
4755
        #1 check_tx_bd(0, data);
4756
        if (data[15] !== 1)
4757
        begin
4758
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4759
          fail = fail + 1;
4760
        end
4761
        wait (MTxEn === 1'b0); // end transmit
4762
        while (data[15] === 1)
4763
        begin
4764
          #1 check_tx_bd(0, data);
4765
          @(posedge wb_clk);
4766
        end
4767
        repeat (1) @(posedge wb_clk);
4768
      end
4769
      // check length of a PACKET
4770
      if (eth_phy.tx_len != (i_length + 4))
4771
      begin
4772
        test_fail("Wrong length of the packet out from MAC");
4773
        fail = fail + 1;
4774
      end
4775 192 tadej
      // check transmitted TX packet data
4776
      if (i_length[0] == 0)
4777
      begin
4778 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4779 192 tadej
      end
4780
      else
4781
      begin
4782 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4783 192 tadej
      end
4784
      if (tmp > 0)
4785
      begin
4786
        test_fail("Wrong data of the transmitted packet");
4787
        fail = fail + 1;
4788
      end
4789
      // check transmited TX packet CRC
4790
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4791
      if (tmp > 0)
4792
      begin
4793
        test_fail("Wrong CRC of the transmitted packet");
4794
        fail = fail + 1;
4795
      end
4796 194 tadej
      // check WB INT signal
4797
      if (i_length[1:0] == 2'h0)
4798 192 tadej
      begin
4799 194 tadej
        if (wb_int !== 1'b1)
4800
        begin
4801
          `TIME; $display("*E WB INT signal should be set");
4802
          test_fail("WB INT signal should be set");
4803
          fail = fail + 1;
4804
        end
4805 192 tadej
      end
4806 194 tadej
      else
4807 192 tadej
      begin
4808 194 tadej
        if (wb_int !== 1'b0)
4809
        begin
4810
          `TIME; $display("*E WB INT signal should not be set");
4811
          test_fail("WB INT signal should not be set");
4812
          fail = fail + 1;
4813
        end
4814 192 tadej
      end
4815 194 tadej
      // check TX buffer descriptor of a packet
4816
      check_tx_bd(0, data);
4817
      if (i_length[1] == 1'b0) // interrupt enabled
4818 192 tadej
      begin
4819 194 tadej
        if (data[15:0] !== 16'h7800)
4820
        begin
4821
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4822
          test_fail("TX buffer descriptor status is not correct");
4823
          fail = fail + 1;
4824
        end
4825 192 tadej
      end
4826 194 tadej
      else // interrupt not enabled
4827 192 tadej
      begin
4828 194 tadej
        if (data[15:0] !== 16'h3800)
4829
        begin
4830
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4831
          test_fail("TX buffer descriptor status is not correct");
4832
          fail = fail + 1;
4833
        end
4834 192 tadej
      end
4835 194 tadej
      // clear TX buffer descriptor
4836
      clear_tx_bd(0, 0);
4837
      // check interrupts
4838
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4839
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4840 192 tadej
      begin
4841 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4842
        begin
4843
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4844
          test_fail("Interrupt Transmit Buffer was not set");
4845
          fail = fail + 1;
4846
        end
4847
        if ((data & (~`ETH_INT_TXB)) !== 0)
4848
        begin
4849
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4850
          test_fail("Other interrupts (except Transmit Buffer) were set");
4851
          fail = fail + 1;
4852
        end
4853 192 tadej
      end
4854 194 tadej
      else
4855 192 tadej
      begin
4856 194 tadej
        if (data !== 0)
4857
        begin
4858
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
4859
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4860
          fail = fail + 1;
4861
        end
4862 192 tadej
      end
4863 194 tadej
      // clear interrupts
4864
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4865
      // check WB INT signal
4866
      if (wb_int !== 1'b0)
4867 192 tadej
      begin
4868 194 tadej
        test_fail("WB INT signal should not be set");
4869 192 tadej
        fail = fail + 1;
4870
      end
4871 194 tadej
      // INTERMEDIATE DISPLAYS
4872
      if ((i_length + 4) == (min_tmp + 64))
4873 209 tadejm
      begin
4874 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4875 209 tadejm
        $display("    pads appending to packets is NOT selected");
4876
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4877 194 tadej
                 min_tmp, (min_tmp + 64));
4878 209 tadejm
        // set padding, remain the rest
4879
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4880
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4881
      end
4882 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4883 209 tadejm
      begin
4884 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4885 209 tadejm
        $display("    pads appending to packets is selected");
4886
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4887 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4888 209 tadejm
        // reset padding, remain the rest
4889
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4890
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4891
      end
4892 194 tadej
      else if ((i_length + 4) == max_tmp)
4893 209 tadejm
      begin
4894
        $display("    pads appending to packets is NOT selected");
4895
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4896 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4897 209 tadejm
      end
4898 194 tadej
      // set length (loop variable)
4899
      if ((i_length + 4) < (min_tmp + 64))
4900
        i_length = i_length + 1;
4901
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4902
      begin
4903
        i_length = i_length + 128;
4904
        tmp_data = i_length + 4; // last tmp_data is ending length
4905
      end
4906
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4907
        i_length = max_tmp - (4 + 16);
4908
      else if ((i_length + 4) >= (max_tmp - 16))
4909
        i_length = i_length + 1;
4910 192 tadej
      else
4911 194 tadej
      begin
4912
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4913
        #10 $stop;
4914
      end
4915 179 mohor
    end
4916 194 tadej
    // disable TX
4917
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4918
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4919
    if(fail == 0)
4920
      test_ok;
4921
    else
4922
      fail = 0;
4923 169 mohor
  end
4924
 
4925
 
4926 209 tadejm
  ////////////////////////////////////////////////////////////////////
4927
  ////                                                            ////
4928
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4929
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
4930
  ////                                                            ////
4931
  ////////////////////////////////////////////////////////////////////
4932
  if (test_num == 4) // without and with padding
4933
  begin
4934
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
4935
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
4936
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
4937
 
4938
    // reset MAC registers
4939
    hard_reset;
4940
    // reset MAC and MII LOGIC with soft reset
4941
    reset_mac;
4942
    reset_mii;
4943
    // set wb slave response
4944
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4945 192 tadej
 
4946 209 tadejm
    max_tmp = 0;
4947
    min_tmp = 0;
4948
    num_of_frames = 0;
4949
    num_of_bd = 0;
4950
    // set maximum TX buffer descriptors (128) - must be set before TX enable
4951
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4952
    // enable TX, set full-duplex mode, NO padding and CRC appending
4953
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4954
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4955
    // prepare two packets of MAXFL length
4956
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4957
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4958
    min_tmp = tmp[31:16];
4959
    st_data = 8'hA3;
4960
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4961
    st_data = 8'h81;
4962
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4963
    // check WB INT signal
4964
    if (wb_int !== 1'b0)
4965
    begin
4966
      test_fail("WB INT signal should not be set");
4967
      fail = fail + 1;
4968
    end
4969
 
4970
    // write to phy's control register for 10Mbps
4971
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4972
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4973
    speed = 10;
4974
 
4975
    i_length = (min_tmp - 4);
4976
    while (i_length <= (max_tmp - 4))
4977
    begin
4978
      // choose generating carrier sense and collision
4979
      case (i_length[1:0])
4980
      2'h0: // Interrupt is generated
4981
      begin
4982
        // Reset_tx_bd nable interrupt generation
4983
        // unmask interrupts
4984
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4985
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4986
        // not detect carrier sense in FD and no collision
4987
        eth_phy.carrier_sense_tx_fd_detect(0);
4988
        eth_phy.collision(0);
4989
      end
4990
      2'h1: // Interrupt is not generated
4991
      begin
4992
        // set_tx_bd enable interrupt generation
4993
        // mask interrupts
4994
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4995
        // detect carrier sense in FD and no collision
4996
        eth_phy.carrier_sense_tx_fd_detect(1);
4997
        eth_phy.collision(0);
4998
      end
4999
      2'h2: // Interrupt is not generated
5000
      begin
5001
        // set_tx_bd disable the interrupt generation
5002
        // unmask interrupts
5003
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5004
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5005
        // not detect carrier sense in FD and set collision
5006
        eth_phy.carrier_sense_tx_fd_detect(0);
5007
        eth_phy.collision(1);
5008
      end
5009
      default: // 2'h3: // Interrupt is not generated
5010
      begin
5011
        // set_tx_bd disable the interrupt generation
5012
        // mask interrupts
5013
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5014
        // detect carrier sense in FD and set collision
5015
        eth_phy.carrier_sense_tx_fd_detect(1);
5016
        eth_phy.collision(1);
5017
      end
5018
      endcase
5019
      // first destination address on ethernet PHY
5020
      if (i_length[0] == 0)
5021
        eth_phy.set_tx_mem_addr(0);
5022
      else
5023
        eth_phy.set_tx_mem_addr(max_tmp);
5024
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5025
      // number of all frames is 154 (146 without first 8)
5026
      if (num_of_frames < 8)
5027
      begin
5028
        case (i_length[1:0])
5029
        2'h0: // Interrupt is generated
5030
        begin
5031
          // enable interrupt generation
5032
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5033
          // interrupts are unmasked
5034
        end
5035
        2'h1: // Interrupt is not generated
5036
        begin
5037
          // enable interrupt generation
5038
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5039
          // interrupts are masked
5040
        end
5041
        2'h2: // Interrupt is not generated
5042
        begin
5043
          // disable interrupt generation
5044
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5045
          // interrupts are unmasked
5046
        end
5047
        default: // 2'h3: // Interrupt is not generated
5048
        begin
5049
          // disable interrupt generation
5050
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5051
          // interrupts are masked
5052
        end
5053
        endcase
5054
        // set wrap bit
5055
        set_tx_bd_wrap(0);
5056
      end
5057
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5058
      else if ((num_of_frames - 8) == 0)
5059
      begin
5060
        tmp_len = i_length; // length of frame
5061
        tmp_bd_num = 0; // TX BD number
5062
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5063
        begin
5064
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5065
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5066
          if (tmp_len[0] == 0)
5067
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5068
          else
5069
            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));
5070
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5071
          if ((tmp_len + 4) < (min_tmp + 128))
5072
            tmp_len = tmp_len + 1;
5073
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5074
            tmp_len = 256;
5075
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5076
            tmp_len = tmp_len + 128;
5077
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5078
            tmp_len = max_tmp - (4 + 16);
5079
          else if ((tmp_len + 4) >= (max_tmp - 16))
5080
            tmp_len = tmp_len + 1;
5081
          // set TX BD number
5082
          tmp_bd_num = tmp_bd_num + 1;
5083
        end
5084
        // set wrap bit
5085
        set_tx_bd_wrap(127);
5086
      end
5087
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5088
      else if ((num_of_frames - 8) == 20) // 128
5089
      begin
5090
        tmp_len = tmp_len; // length of frame remaines from previous settings
5091
        tmp_bd_num = 0; // TX BD number
5092
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5093
        begin
5094
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5095
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5096
          if (tmp_len[0] == 0)
5097
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5098
          else
5099
            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));
5100
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5101
          if ((tmp_len + 4) < (min_tmp + 128))
5102
            tmp_len = tmp_len + 1;
5103
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5104
            tmp_len = 256;
5105
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5106
            tmp_len = tmp_len + 128;
5107
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5108
            tmp_len = max_tmp - (4 + 16);
5109
          else if ((tmp_len + 4) >= (max_tmp - 16))
5110
            tmp_len = tmp_len + 1;
5111
          // set TX BD number
5112
          tmp_bd_num = tmp_bd_num + 1;
5113
        end
5114
      end
5115
      // set ready bit
5116
      if (num_of_frames < 8)
5117
        set_tx_bd_ready(0, 0);
5118
      else if ((num_of_frames - 8) < 128)
5119
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5120
      else if ((num_of_frames - 136) < 19)
5121
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5122
      // CHECK END OF TRANSMITION
5123
      #1 check_tx_bd(num_of_bd, data);
5124
      if (i_length < min_tmp) // just first four
5125
      begin
5126
        while (data[15] === 1)
5127
        begin
5128
          #1 check_tx_bd(num_of_bd, data);
5129
          @(posedge wb_clk);
5130
        end
5131
        repeat (1) @(posedge wb_clk);
5132
      end
5133
      else if (i_length > (max_tmp - 8)) // just last four
5134
      begin
5135
        tmp = 0;
5136
        wait (MTxEn === 1'b1); // start transmit
5137
        while (tmp < (i_length - 20))
5138
        begin
5139
          #1 tmp = tmp + 1;
5140
          @(posedge wb_clk);
5141
        end
5142
        #1 check_tx_bd(num_of_bd, data);
5143
        while (data[15] === 1)
5144
        begin
5145
          #1 check_tx_bd(num_of_bd, data);
5146
          @(posedge wb_clk);
5147
        end
5148
        repeat (1) @(posedge wb_clk);
5149
      end
5150
      else
5151
      begin
5152
        wait (MTxEn === 1'b1); // start transmit
5153
        #1 check_tx_bd(num_of_bd, data);
5154
        if (data[15] !== 1)
5155
        begin
5156
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5157
          fail = fail + 1;
5158
        end
5159
        wait (MTxEn === 1'b0); // end transmit
5160
        while (data[15] === 1)
5161
        begin
5162
          #1 check_tx_bd(num_of_bd, data);
5163
          @(posedge wb_clk);
5164
        end
5165
        repeat (1) @(posedge wb_clk);
5166
      end
5167
      // check length of a PACKET
5168
      if (eth_phy.tx_len != (i_length + 4))
5169
      begin
5170
        test_fail("Wrong length of the packet out from MAC");
5171
        fail = fail + 1;
5172
      end
5173
        // check transmitted TX packet data
5174
        if (i_length[0] == 0)
5175
        begin
5176
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5177
        end
5178
        else
5179
        begin
5180
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5181
        end
5182
        if (tmp > 0)
5183
        begin
5184
          test_fail("Wrong data of the transmitted packet");
5185
          fail = fail + 1;
5186
        end
5187
        // check transmited TX packet CRC
5188
        if (i_length[0] == 0)
5189
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5190
        else
5191
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5192
        if (tmp > 0)
5193
        begin
5194
          test_fail("Wrong CRC of the transmitted packet");
5195
          fail = fail + 1;
5196
        end
5197
      // check WB INT signal
5198
      if (i_length[1:0] == 2'h0)
5199
      begin
5200
        if (wb_int !== 1'b1)
5201
        begin
5202
          `TIME; $display("*E WB INT signal should be set");
5203
          test_fail("WB INT signal should be set");
5204
          fail = fail + 1;
5205
        end
5206
      end
5207
      else
5208
      begin
5209
        if (wb_int !== 1'b0)
5210
        begin
5211
          `TIME; $display("*E WB INT signal should not be set");
5212
          test_fail("WB INT signal should not be set");
5213
          fail = fail + 1;
5214
        end
5215
      end
5216
      // check TX buffer descriptor of a packet
5217
      check_tx_bd(num_of_bd, data);
5218
      if (i_length[1] == 1'b0) // interrupt enabled
5219
      begin
5220
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5221
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5222
        begin
5223
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5224
          test_fail("TX buffer descriptor status is not correct");
5225
          fail = fail + 1;
5226
        end
5227
      end
5228
      else // interrupt not enabled
5229
      begin
5230
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5231
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5232
        begin
5233
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5234
          test_fail("TX buffer descriptor status is not correct");
5235
          fail = fail + 1;
5236
        end
5237
      end
5238
      // clear first half of 8 frames from TX buffer descriptor 0
5239
      if (num_of_frames < 4)
5240
        clear_tx_bd(num_of_bd, num_of_bd);
5241
      // clear BD with wrap bit
5242
      if (num_of_frames == 140)
5243
        clear_tx_bd(127, 127);
5244
      // check interrupts
5245
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5246
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5247
      begin
5248
        if ((data & `ETH_INT_TXB) !== 1'b1)
5249
        begin
5250
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5251
          test_fail("Interrupt Transmit Buffer was not set");
5252
          fail = fail + 1;
5253
        end
5254
        if ((data & (~`ETH_INT_TXB)) !== 0)
5255
        begin
5256
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5257
          test_fail("Other interrupts (except Transmit Buffer) were set");
5258
          fail = fail + 1;
5259
        end
5260
      end
5261
      else
5262
      begin
5263
        if (data !== 0)
5264
        begin
5265
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5266
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5267
          fail = fail + 1;
5268
        end
5269
      end
5270
      // clear interrupts
5271
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5272
      // check WB INT signal
5273
      if (wb_int !== 1'b0)
5274
      begin
5275
        test_fail("WB INT signal should not be set");
5276
        fail = fail + 1;
5277
      end
5278
      // INTERMEDIATE DISPLAYS
5279
      if ((i_length + 4) == (min_tmp + 7))
5280
      begin
5281
        // starting length is min_tmp, ending length is (min_tmp + 128)
5282
        $display("    pads appending to packets is NOT selected");
5283
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5284
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5285
                 min_tmp, (min_tmp + 7));
5286
        $display("    ->all packets were send from TX BD 0");
5287
        // set padding, remain the rest
5288
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5289
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5290
      end
5291
      else if ((i_length + 4) == (min_tmp + 128))
5292
      begin
5293
        // starting length is min_tmp, ending length is (min_tmp + 128)
5294
        $display("    pads appending to packets is NOT selected");
5295
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5296
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5297
                 (min_tmp + 8), (min_tmp + 128));
5298
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5299
                 1'b0, num_of_bd);
5300
        tmp_bd = num_of_bd + 1;
5301
        // set padding, remain the rest
5302
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5303
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5304
      end
5305
      else if ((i_length + 4) == (max_tmp - 16))
5306
      begin
5307
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5308
        $display("    pads appending to packets is selected");
5309
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5310
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5311
                 (min_tmp + 64 + 128), tmp_data);
5312
        if (tmp_bd > num_of_bd)
5313
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5314
                   tmp_bd, num_of_bd);
5315
        else
5316
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5317
                   tmp_bd, num_of_bd);
5318
        tmp_bd = num_of_bd + 1;
5319
        // reset padding, remain the rest
5320
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5321
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5322
      end
5323
      else if ((i_length + 4) == max_tmp)
5324
      begin
5325
        $display("    pads appending to packets is NOT selected");
5326
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5327
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5328
                 (max_tmp - (4 + 16)), max_tmp);
5329
        if (tmp_bd > num_of_bd)
5330
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5331
                   tmp_bd, num_of_bd);
5332
        else
5333
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5334
                   tmp_bd, num_of_bd);
5335
      end
5336
      // set length (loop variable)
5337
      if ((i_length + 4) < (min_tmp + 128))
5338
        i_length = i_length + 1;
5339
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5340
        i_length = 256;
5341
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5342
      begin
5343
        i_length = i_length + 128;
5344
        tmp_data = i_length + 4; // last tmp_data is ending length
5345
      end
5346
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5347
        i_length = max_tmp - (4 + 16);
5348
      else if ((i_length + 4) >= (max_tmp - 16))
5349
        i_length = i_length + 1;
5350
      else
5351
      begin
5352
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5353
        #10 $stop;
5354
      end
5355
      // the number of frame transmitted
5356
      num_of_frames = num_of_frames + 1;
5357
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5358
        num_of_bd = 0;
5359
      else
5360
        num_of_bd = num_of_bd + 1;
5361
    end
5362
    // disable TX
5363
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5364
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5365
    @(posedge wb_clk);
5366
    if(fail == 0)
5367
      test_ok;
5368
    else
5369
      fail = 0;
5370
  end
5371
 
5372
 
5373
  ////////////////////////////////////////////////////////////////////
5374
  ////                                                            ////
5375
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5376
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5377
  ////                                                            ////
5378
  ////////////////////////////////////////////////////////////////////
5379
  if (test_num == 5) // with and without padding
5380
  begin
5381
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5382
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5383
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5384
 
5385
    // reset MAC registers
5386
    hard_reset;
5387
    // reset MAC and MII LOGIC with soft reset
5388
    reset_mac;
5389
    reset_mii;
5390
    // set wb slave response
5391
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5392
 
5393
    max_tmp = 0;
5394
    min_tmp = 0;
5395
    num_of_frames = 0;
5396
    num_of_bd = 0;
5397
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5398
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5399
    // enable TX, set full-duplex mode, NO padding and CRC appending
5400
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5401
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5402
    // prepare two packets of MAXFL length
5403
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5404
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5405
    min_tmp = tmp[31:16];
5406
    st_data = 8'hA5;
5407
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5408
    st_data = 8'h71;
5409
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5410
    // check WB INT signal
5411
    if (wb_int !== 1'b0)
5412
    begin
5413
      test_fail("WB INT signal should not be set");
5414
      fail = fail + 1;
5415
    end
5416
 
5417
    // write to phy's control register for 100Mbps
5418
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5419
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5420
    speed = 100;
5421
 
5422
    i_length = (min_tmp - 4);
5423
    while (i_length <= (max_tmp - 4))
5424
    begin
5425
      // choose generating carrier sense and collision
5426
      case (i_length[1:0])
5427
      2'h0: // Interrupt is generated
5428
      begin
5429
        // Reset_tx_bd nable interrupt generation
5430
        // unmask interrupts
5431
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5432
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5433
        // not detect carrier sense in FD and no collision
5434
        eth_phy.carrier_sense_tx_fd_detect(0);
5435
        eth_phy.collision(0);
5436
      end
5437
      2'h1: // Interrupt is not generated
5438
      begin
5439
        // set_tx_bd enable interrupt generation
5440
        // mask interrupts
5441
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5442
        // detect carrier sense in FD and no collision
5443
        eth_phy.carrier_sense_tx_fd_detect(1);
5444
        eth_phy.collision(0);
5445
      end
5446
      2'h2: // Interrupt is not generated
5447
      begin
5448
        // set_tx_bd disable the interrupt generation
5449
        // unmask interrupts
5450
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5451
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5452
        // not detect carrier sense in FD and set collision
5453
        eth_phy.carrier_sense_tx_fd_detect(0);
5454
        eth_phy.collision(1);
5455
      end
5456
      default: // 2'h3: // Interrupt is not generated
5457
      begin
5458
        // set_tx_bd disable the interrupt generation
5459
        // mask interrupts
5460
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5461
        // detect carrier sense in FD and set collision
5462
        eth_phy.carrier_sense_tx_fd_detect(1);
5463
        eth_phy.collision(1);
5464
      end
5465
      endcase
5466
      // first destination address on ethernet PHY
5467
      if (i_length[0] == 0)
5468
        eth_phy.set_tx_mem_addr(0);
5469
      else
5470
        eth_phy.set_tx_mem_addr(max_tmp);
5471
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5472
      // number of all frames is 154 (146 without first 8)
5473
      if (num_of_frames < 8)
5474
      begin
5475
        case (i_length[1:0])
5476
        2'h0: // Interrupt is generated
5477
        begin
5478
          // enable interrupt generation
5479
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5480
          // interrupts are unmasked
5481
        end
5482
        2'h1: // Interrupt is not generated
5483
        begin
5484
          // enable interrupt generation
5485
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5486
          // interrupts are masked
5487
        end
5488
        2'h2: // Interrupt is not generated
5489
        begin
5490
          // disable interrupt generation
5491
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5492
          // interrupts are unmasked
5493
        end
5494
        default: // 2'h3: // Interrupt is not generated
5495
        begin
5496
          // disable interrupt generation
5497
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5498
          // interrupts are masked
5499
        end
5500
        endcase
5501
        // set wrap bit
5502
        set_tx_bd_wrap(0);
5503
      end
5504
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5505
      else if ((num_of_frames - 8) == 0)
5506
      begin
5507
        tmp_len = i_length; // length of frame
5508
        tmp_bd_num = 0; // TX BD number
5509
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5510
        begin
5511
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5512
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5513
          if (tmp_len[0] == 0)
5514
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5515
          else
5516
            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));
5517
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5518
          if ((tmp_len + 4) < (min_tmp + 128))
5519
            tmp_len = tmp_len + 1;
5520
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5521
            tmp_len = 256;
5522
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5523
            tmp_len = tmp_len + 128;
5524
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5525
            tmp_len = max_tmp - (4 + 16);
5526
          else if ((tmp_len + 4) >= (max_tmp - 16))
5527
            tmp_len = tmp_len + 1;
5528
          // set TX BD number
5529
          tmp_bd_num = tmp_bd_num + 1;
5530
        end
5531
        // set wrap bit
5532
        set_tx_bd_wrap(127);
5533
      end
5534
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5535
      else if ((num_of_frames - 8) == 20) // 128
5536
      begin
5537
        tmp_len = tmp_len; // length of frame remaines from previous settings
5538
        tmp_bd_num = 0; // TX BD number
5539
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5540
        begin
5541
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5542
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5543
          if (tmp_len[0] == 0)
5544
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5545
          else
5546
            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));
5547
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5548
          if ((tmp_len + 4) < (min_tmp + 128))
5549
            tmp_len = tmp_len + 1;
5550
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5551
            tmp_len = 256;
5552
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5553
            tmp_len = tmp_len + 128;
5554
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5555
            tmp_len = max_tmp - (4 + 16);
5556
          else if ((tmp_len + 4) >= (max_tmp - 16))
5557
            tmp_len = tmp_len + 1;
5558
          // set TX BD number
5559
          tmp_bd_num = tmp_bd_num + 1;
5560
        end
5561
      end
5562
      // set ready bit
5563
      if (num_of_frames < 8)
5564
        set_tx_bd_ready(0, 0);
5565
      else if ((num_of_frames - 8) < 128)
5566
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5567
      else if ((num_of_frames - 136) < 19)
5568
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5569
      // CHECK END OF TRANSMITION
5570
      #1 check_tx_bd(num_of_bd, data);
5571
      if (i_length < min_tmp) // just first four
5572
      begin
5573
        while (data[15] === 1)
5574
        begin
5575
          #1 check_tx_bd(num_of_bd, data);
5576
          @(posedge wb_clk);
5577
        end
5578
        repeat (1) @(posedge wb_clk);
5579
      end
5580
      else if (i_length > (max_tmp - 8)) // just last four
5581
      begin
5582
        tmp = 0;
5583
        wait (MTxEn === 1'b1); // start transmit
5584
        while (tmp < (i_length - 20))
5585
        begin
5586
          #1 tmp = tmp + 1;
5587
          @(posedge wb_clk);
5588
        end
5589
        #1 check_tx_bd(num_of_bd, data);
5590
        while (data[15] === 1)
5591
        begin
5592
          #1 check_tx_bd(num_of_bd, data);
5593
          @(posedge wb_clk);
5594
        end
5595
        repeat (1) @(posedge wb_clk);
5596
      end
5597
      else
5598
      begin
5599
        wait (MTxEn === 1'b1); // start transmit
5600
        #1 check_tx_bd(num_of_bd, data);
5601
        if (data[15] !== 1)
5602
        begin
5603
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5604
          fail = fail + 1;
5605
        end
5606
        wait (MTxEn === 1'b0); // end transmit
5607
        while (data[15] === 1)
5608
        begin
5609
          #1 check_tx_bd(num_of_bd, data);
5610
          @(posedge wb_clk);
5611
        end
5612
        repeat (1) @(posedge wb_clk);
5613
      end
5614
      // check length of a PACKET
5615
      if (eth_phy.tx_len != (i_length + 4))
5616
      begin
5617
        test_fail("Wrong length of the packet out from MAC");
5618
        fail = fail + 1;
5619
      end
5620
      // checking in the following if statement is performed only for first and last 64 lengths
5621
        // check transmitted TX packet data
5622
        if (i_length[0] == 0)
5623
        begin
5624
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5625
        end
5626
        else
5627
        begin
5628
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5629
        end
5630
        if (tmp > 0)
5631
        begin
5632
          test_fail("Wrong data of the transmitted packet");
5633
          fail = fail + 1;
5634
        end
5635
        // check transmited TX packet CRC
5636
        if (i_length[0] == 0)
5637
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5638
        else
5639
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5640
        if (tmp > 0)
5641
        begin
5642
          test_fail("Wrong CRC of the transmitted packet");
5643
          fail = fail + 1;
5644
        end
5645
      // check WB INT signal
5646
      if (i_length[1:0] == 2'h0)
5647
      begin
5648
        if (wb_int !== 1'b1)
5649
        begin
5650
          `TIME; $display("*E WB INT signal should be set");
5651
          test_fail("WB INT signal should be set");
5652
          fail = fail + 1;
5653
        end
5654
      end
5655
      else
5656
      begin
5657
        if (wb_int !== 1'b0)
5658
        begin
5659
          `TIME; $display("*E WB INT signal should not be set");
5660
          test_fail("WB INT signal should not be set");
5661
          fail = fail + 1;
5662
        end
5663
      end
5664
      // check TX buffer descriptor of a packet
5665
      check_tx_bd(num_of_bd, data);
5666
      if (i_length[1] == 1'b0) // interrupt enabled
5667
      begin
5668
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5669
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5670
        begin
5671
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5672
          test_fail("TX buffer descriptor status is not correct");
5673
          fail = fail + 1;
5674
        end
5675
      end
5676
      else // interrupt not enabled
5677
      begin
5678
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5679
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5680
        begin
5681
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5682
          test_fail("TX buffer descriptor status is not correct");
5683
          fail = fail + 1;
5684
        end
5685
      end
5686
      // clear first half of 8 frames from TX buffer descriptor 0
5687
      if (num_of_frames < 4)
5688
        clear_tx_bd(num_of_bd, num_of_bd);
5689
      // clear BD with wrap bit
5690
      if (num_of_frames == 140)
5691
        clear_tx_bd(127, 127);
5692
      // check interrupts
5693
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5694
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5695
      begin
5696
        if ((data & `ETH_INT_TXB) !== 1'b1)
5697
        begin
5698
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5699
          test_fail("Interrupt Transmit Buffer was not set");
5700
          fail = fail + 1;
5701
        end
5702
        if ((data & (~`ETH_INT_TXB)) !== 0)
5703
        begin
5704
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5705
          test_fail("Other interrupts (except Transmit Buffer) were set");
5706
          fail = fail + 1;
5707
        end
5708
      end
5709
      else
5710
      begin
5711
        if (data !== 0)
5712
        begin
5713
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5714
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5715
          fail = fail + 1;
5716
        end
5717
      end
5718
      // clear interrupts
5719
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5720
      // check WB INT signal
5721
      if (wb_int !== 1'b0)
5722
      begin
5723
        test_fail("WB INT signal should not be set");
5724
        fail = fail + 1;
5725
      end
5726
      // INTERMEDIATE DISPLAYS
5727
      if ((i_length + 4) == (min_tmp + 7))
5728
      begin
5729
        // starting length is min_tmp, ending length is (min_tmp + 128)
5730
        $display("    pads appending to packets is NOT selected");
5731
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5732
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5733
                 min_tmp, (min_tmp + 7));
5734
        $display("    ->all packets were send from TX BD 0");
5735
        // set padding, remain the rest
5736
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5737
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5738
      end
5739
      else if ((i_length + 4) == (min_tmp + 128))
5740
      begin
5741
        // starting length is min_tmp, ending length is (min_tmp + 128)
5742
        $display("    pads appending to packets is NOT selected");
5743
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5744
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5745
                 (min_tmp + 8), (min_tmp + 128));
5746
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5747
                 1'b0, num_of_bd);
5748
        tmp_bd = num_of_bd + 1;
5749
        // set padding, remain the rest
5750
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5751
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5752
      end
5753
      else if ((i_length + 4) == (max_tmp - 16))
5754
      begin
5755
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5756
        $display("    pads appending to packets is selected");
5757
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5758
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5759
                 (min_tmp + 64 + 128), tmp_data);
5760
        if (tmp_bd > num_of_bd)
5761
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5762
                   tmp_bd, num_of_bd);
5763
        else
5764
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5765
                   tmp_bd, num_of_bd);
5766
        tmp_bd = num_of_bd + 1;
5767
        // reset padding, remain the rest
5768
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5769
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5770
      end
5771
      else if ((i_length + 4) == max_tmp)
5772
      begin
5773
        $display("    pads appending to packets is NOT selected");
5774
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5775
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5776
                 (max_tmp - (4 + 16)), max_tmp);
5777
        if (tmp_bd > num_of_bd)
5778
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5779
                   tmp_bd, num_of_bd);
5780
        else
5781
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5782
                   tmp_bd, num_of_bd);
5783
      end
5784
      // set length (loop variable)
5785
      if ((i_length + 4) < (min_tmp + 128))
5786
        i_length = i_length + 1;
5787
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5788
        i_length = 256;
5789
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5790
      begin
5791
        i_length = i_length + 128;
5792
        tmp_data = i_length + 4; // last tmp_data is ending length
5793
      end
5794
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5795
        i_length = max_tmp - (4 + 16);
5796
      else if ((i_length + 4) >= (max_tmp - 16))
5797
        i_length = i_length + 1;
5798
      else
5799
      begin
5800
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5801
        #10 $stop;
5802
      end
5803
      // the number of frame transmitted
5804
      num_of_frames = num_of_frames + 1;
5805
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5806
        num_of_bd = 0;
5807
      else
5808
        num_of_bd = num_of_bd + 1;
5809
    end
5810
    // disable TX
5811
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5812
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5813
    @(posedge wb_clk);
5814
    if(fail == 0)
5815
      test_ok;
5816
    else
5817
      fail = 0;
5818
  end
5819
 
5820
 
5821
  ////////////////////////////////////////////////////////////////////
5822
  ////                                                            ////
5823
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
5824
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
5825
  ////                                                            ////
5826
  ////////////////////////////////////////////////////////////////////
5827
  if (test_num == 6) // 
5828
  begin
5829
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
5830
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
5831
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
5832
 
5833
    // reset MAC registers
5834
    hard_reset;
5835
    // reset MAC and MII LOGIC with soft reset
5836
    reset_mac;
5837
    reset_mii;
5838
    // set wb slave response
5839
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5840
 
5841
    max_tmp = 0;
5842
    min_tmp = 0;
5843
    // set 8 TX buffer descriptors - must be set before TX enable
5844
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5845
    // enable TX, set full-duplex mode, padding and CRC appending
5846
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5847
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5848
    // prepare two packets of MAXFL length
5849
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5850
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5851
    min_tmp = tmp[31:16];
5852
    st_data = 8'h12;
5853
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
5854
    st_data = 8'h34;
5855
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
5856
    // check WB INT signal
5857
    if (wb_int !== 1'b0)
5858
    begin
5859
      test_fail("WB INT signal should not be set");
5860
      fail = fail + 1;
5861
    end
5862
 
5863
    // write to phy's control register for 10Mbps
5864
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5865
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5866
    speed = 10;
5867
 
5868
    frame_started = 0;
5869
    num_of_frames = 0;
5870
    num_of_bd = 0;
5871
    i_length = 0; // 0;
5872
    while (i_length < 70) // (min_tmp - 4))
5873
    begin
5874
      #1;
5875
      // choose generating carrier sense and collision
5876
      case (i_length[1:0])
5877
      2'h0: // Interrupt is generated
5878
      begin
5879
        // Reset_tx_bd nable interrupt generation
5880
        // unmask interrupts
5881
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5882
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5883
        // not detect carrier sense in FD and no collision
5884
        eth_phy.carrier_sense_tx_fd_detect(0);
5885
        eth_phy.collision(0);
5886
      end
5887
      2'h1: // Interrupt is not generated
5888
      begin
5889
        // set_tx_bd enable interrupt generation
5890
        // mask interrupts
5891
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5892
        // detect carrier sense in FD and no collision
5893
        eth_phy.carrier_sense_tx_fd_detect(1);
5894
        eth_phy.collision(0);
5895
      end
5896
      2'h2: // Interrupt is not generated
5897
      begin
5898
        // set_tx_bd disable the interrupt generation
5899
        // unmask interrupts
5900
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5901
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5902
        // not detect carrier sense in FD and set collision
5903
        eth_phy.carrier_sense_tx_fd_detect(0);
5904
        eth_phy.collision(1);
5905
      end
5906
      default: // 2'h3: // Interrupt is not generated
5907
      begin
5908
        // set_tx_bd disable the interrupt generation
5909
        // mask interrupts
5910
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5911
        // detect carrier sense in FD and set collision
5912
        eth_phy.carrier_sense_tx_fd_detect(1);
5913
        eth_phy.collision(1);
5914
      end
5915
      endcase
5916
      #1;
5917
      // first destination address on ethernet PHY
5918
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
5919
      // SET packets and wrap bit
5920
      // num_of_frames <= 9 => wrap set to TX BD 0
5921
      if (num_of_frames <= 9)
5922
      begin
5923
        tmp_len = i_length; // length of frame
5924
        tmp_bd_num = 0; // TX BD number
5925
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5926
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5927
        if (tmp_len[0] == 0)
5928
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5929
        else
5930
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5931
        // set wrap bit
5932
        set_tx_bd_wrap(0);
5933
      end
5934
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
5935
      else if ((num_of_frames == 10) || (num_of_frames == 14))
5936
      begin
5937
        tmp_len = i_length; // length of frame
5938
        tmp_bd_num = 0; // TX BD number
5939
        while (tmp_bd_num < 4) //
5940
        begin
5941
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5942
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5943
          if (tmp_len[0] == 0)
5944
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5945
          else
5946
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5947
          tmp_len = tmp_len + 1;
5948
          // set TX BD number
5949
          tmp_bd_num = tmp_bd_num + 1;
5950
        end
5951
        // set wrap bit
5952
        set_tx_bd_wrap(3);
5953
      end
5954
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
5955
      else if ((num_of_frames == 18) || (num_of_frames == 23))
5956
      begin
5957
        tmp_len = i_length; // length of frame
5958
        tmp_bd_num = 0; // TX BD number
5959
        while (tmp_bd_num < 5) //
5960
        begin
5961
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5962
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5963
          if (tmp_len[0] == 0)
5964
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5965
          else
5966
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5967
          tmp_len = tmp_len + 1;
5968
          // set TX BD number
5969
          tmp_bd_num = tmp_bd_num + 1;
5970
        end
5971
        // set wrap bit
5972
        set_tx_bd_wrap(4);
5973
      end
5974
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
5975
      else if ((num_of_frames == 28) || (num_of_frames == 34))
5976
      begin
5977
        tmp_len = i_length; // length of frame
5978
        tmp_bd_num = 0; // TX BD number
5979
        while (tmp_bd_num < 6) //
5980
        begin
5981
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5982
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5983
          if (tmp_len[0] == 0)
5984
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5985
          else
5986
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5987
          tmp_len = tmp_len + 1;
5988
          // set TX BD number
5989
          tmp_bd_num = tmp_bd_num + 1;
5990
        end
5991
        // set wrap bit
5992
        set_tx_bd_wrap(5);
5993
      end
5994
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
5995
      else if ((num_of_frames == 40) || (num_of_frames == 47))
5996
      begin
5997
        tmp_len = i_length; // length of frame
5998
        tmp_bd_num = 0; // TX BD number
5999
        while (tmp_bd_num < 7) //
6000
        begin
6001
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6002
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6003
          if (tmp_len[0] == 0)
6004
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6005
          else
6006
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6007
          tmp_len = tmp_len + 1;
6008
          // set TX BD number
6009
          tmp_bd_num = tmp_bd_num + 1;
6010
        end
6011
        // set wrap bit
6012
        set_tx_bd_wrap(6);
6013
      end
6014
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6015
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6016
      begin
6017
        tmp_len = i_length; // length of frame
6018
        tmp_bd_num = 0; // TX BD number
6019
        while (tmp_bd_num < 8) //
6020
        begin
6021
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6022
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6023
          if (tmp_len[0] == 0)
6024
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6025
          else
6026
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6027
          tmp_len = tmp_len + 1;
6028
          // set TX BD number
6029
          tmp_bd_num = tmp_bd_num + 1;
6030
        end
6031
        // set wrap bit
6032
        set_tx_bd_wrap(7);
6033
      end
6034
      #1;
6035
      // SET ready bit
6036
      if (num_of_frames < 10)
6037
        set_tx_bd_ready(0, 0);
6038
      else if (num_of_frames < 14)
6039
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6040
      else if (num_of_frames < 18)
6041
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6042
      else if (num_of_frames < 23)
6043
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6044
      else if (num_of_frames < 28)
6045
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6046
      else if (num_of_frames < 34)
6047
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6048
      else if (num_of_frames < 40)
6049
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6050
      else if (num_of_frames < 47)
6051
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6052
      else if (num_of_frames < 54)
6053
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6054
      else if (num_of_frames < 62)
6055
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6056
      else if (num_of_frames < 70)
6057
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6058
      // CHECK END OF TRANSMITION
6059
      frame_started = 0;
6060
      if (num_of_frames >= 5)
6061
        #1 check_tx_bd(num_of_bd, data);
6062
      fork
6063
      begin: fr_st
6064
        wait (MTxEn === 1'b1); // start transmit
6065
        frame_started = 1;
6066
      end
6067
      begin
6068
        repeat (30) @(posedge mtx_clk);
6069
        if (num_of_frames < 5)
6070
        begin
6071
          if (frame_started == 1)
6072
          begin
6073
            `TIME; $display("*E Frame should NOT start!");
6074
          end
6075
          disable fr_st;
6076
        end
6077
        else
6078
        begin
6079
          if (frame_started == 0)
6080
          begin
6081
            `TIME; $display("*W Frame should start!");
6082
            disable fr_st;
6083
          end
6084
        end
6085
      end
6086
      join
6087
      // check packets larger than 4 bytes
6088
      if (num_of_frames >= 5)
6089
      begin
6090
        wait (MTxEn === 1'b0); // end transmit
6091
        while (data[15] === 1)
6092
        begin
6093
          #1 check_tx_bd(num_of_bd, data);
6094
          @(posedge wb_clk);
6095
        end
6096
        repeat (1) @(posedge wb_clk);
6097
        // check length of a PACKET
6098
        if (i_length <= (min_tmp - 4))
6099
        begin
6100
          if (eth_phy.tx_len != min_tmp)
6101
          begin
6102
            test_fail("Wrong length of the packet out from MAC");
6103
            fail = fail + 1;
6104
          end
6105
        end
6106
        else
6107
        begin
6108
          if (eth_phy.tx_len != (i_length + 4))
6109
          begin
6110
            test_fail("Wrong length of the packet out from MAC");
6111
            fail = fail + 1;
6112
          end
6113
        end
6114
        // check transmitted TX packet data
6115
        if (i_length[0] == 0)
6116
        begin
6117
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6118
        end
6119
        else
6120
        begin
6121
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6122
        end
6123
        if (tmp > 0)
6124
        begin
6125
          test_fail("Wrong data of the transmitted packet");
6126
          fail = fail + 1;
6127
        end
6128
        // check transmited TX packet CRC
6129
        if (num_of_frames < (min_tmp - 4))
6130
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6131
        else
6132
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6133
        if (tmp > 0)
6134
        begin
6135
          test_fail("Wrong CRC of the transmitted packet");
6136
          fail = fail + 1;
6137
        end
6138
      end
6139
      // check WB INT signal
6140
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6141
      begin
6142
        if (wb_int !== 1'b1)
6143
        begin
6144
          `TIME; $display("*E WB INT signal should be set");
6145
          test_fail("WB INT signal should be set");
6146
          fail = fail + 1;
6147
        end
6148
      end
6149
      else
6150
      begin
6151
        if (wb_int !== 1'b0)
6152
        begin
6153
          `TIME; $display("*E WB INT signal should not be set");
6154
          test_fail("WB INT signal should not be set");
6155
          fail = fail + 1;
6156
        end
6157
      end
6158
      // check TX buffer descriptor of a packet
6159
      check_tx_bd(num_of_bd, data);
6160
      if (num_of_frames >= 5)
6161
      begin
6162
        if (i_length[1] == 1'b0) // interrupt enabled
6163
        begin
6164
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6165
               (data[15:0] !== 16'h5800) ) // without wrap bit
6166
          begin
6167
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6168
            test_fail("TX buffer descriptor status is not correct");
6169
            fail = fail + 1;
6170
          end
6171
        end
6172
        else // interrupt not enabled
6173
        begin
6174
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6175
               (data[15:0] !== 16'h1800) ) // without wrap bit
6176
          begin
6177
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6178
            test_fail("TX buffer descriptor status is not correct");
6179
            fail = fail + 1;
6180
          end
6181
        end
6182
      end
6183
      else
6184
      begin
6185
        if (data[15] !== 1'b1)
6186
        begin
6187
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6188
          test_fail("TX buffer descriptor status is not correct");
6189
          fail = fail + 1;
6190
        end
6191
      end
6192
      // clear TX BD with wrap bit
6193
      if (num_of_frames == 63)
6194
        clear_tx_bd(16, 16);
6195
      // check interrupts
6196
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6197
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6198
      begin
6199
        if ((data & `ETH_INT_TXB) !== 1'b1)
6200
        begin
6201
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6202
          test_fail("Interrupt Transmit Buffer was not set");
6203
          fail = fail + 1;
6204
        end
6205
        if ((data & (~`ETH_INT_TXB)) !== 0)
6206
        begin
6207
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6208
          test_fail("Other interrupts (except Transmit Buffer) were set");
6209
          fail = fail + 1;
6210
        end
6211
      end
6212
      else
6213
      begin
6214
        if (data !== 0)
6215
        begin
6216
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6217
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6218
          fail = fail + 1;
6219
        end
6220
      end
6221
      // clear interrupts
6222
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6223
      // check WB INT signal
6224
      if (wb_int !== 1'b0)
6225
      begin
6226
        test_fail("WB INT signal should not be set");
6227
        fail = fail + 1;
6228
      end
6229
      // INTERMEDIATE DISPLAYS
6230
      if (i_length == 3)
6231
      begin
6232
        $display("    pads appending to packets is selected");
6233
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6234
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6235
                 0, 3);
6236
      end
6237
      else if (i_length == 9)
6238
      begin
6239
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6240
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6241
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6242
                 5, 9);
6243
      end
6244
      else if (i_length == 17)
6245
      begin
6246
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6247
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6248
                 10, 17);
6249
      end
6250
      else if (i_length == 27)
6251
      begin
6252
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6253
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6254
                 18, 27);
6255
      end
6256
      else if (i_length == 40)
6257
      begin
6258
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6259
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6260
                 28, 40);
6261
      end
6262
      else if (i_length == 54)
6263
      begin
6264
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6265
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6266
                 41, 54);
6267
      end
6268
      else if (i_length == 69)
6269
      begin
6270
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6271
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6272
                 55, 69);
6273
      end
6274
      // set length (loop variable)
6275
      i_length = i_length + 1;
6276
      // the number of frame transmitted
6277
      num_of_frames = num_of_frames + 1;
6278
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6279
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6280
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6281
          (num_of_frames == 54) || (num_of_frames == 62))
6282
        num_of_bd = 0;
6283
      else
6284
        num_of_bd = num_of_bd + 1;
6285
    end
6286
    // disable TX
6287
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6288
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6289
    @(posedge wb_clk);
6290
    if(fail == 0)
6291
      test_ok;
6292
    else
6293
      fail = 0;
6294
  end
6295
 
6296
 
6297
  ////////////////////////////////////////////////////////////////////
6298
  ////                                                            ////
6299
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6300
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6301
  ////                                                            ////
6302
  ////////////////////////////////////////////////////////////////////
6303
  if (test_num == 7) // 
6304
  begin
6305
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6306
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6307
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6308
 
6309
    // reset MAC registers
6310
    hard_reset;
6311
    // reset MAC and MII LOGIC with soft reset
6312
    reset_mac;
6313
    reset_mii;
6314
    // set wb slave response
6315
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6316
 
6317
    max_tmp = 0;
6318
    min_tmp = 0;
6319
    // set 8 TX buffer descriptors - must be set before TX enable
6320
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6321
    // enable TX, set full-duplex mode, padding and CRC appending
6322
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6323
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6324
    // prepare two packets of MAXFL length
6325
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6326
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6327
    min_tmp = tmp[31:16];
6328
    st_data = 8'h12;
6329
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6330
    st_data = 8'h34;
6331
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6332
    // check WB INT signal
6333
    if (wb_int !== 1'b0)
6334
    begin
6335
      test_fail("WB INT signal should not be set");
6336
      fail = fail + 1;
6337
    end
6338
 
6339
    // write to phy's control register for 100Mbps
6340
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6341
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6342
    speed = 100;
6343
 
6344
    frame_started = 0;
6345
    num_of_frames = 0;
6346
    num_of_bd = 0;
6347
    i_length = 0; // 0;
6348
    while (i_length < 70) // (min_tmp - 4))
6349
    begin
6350
      #1;
6351
      // choose generating carrier sense and collision
6352
      case (i_length[1:0])
6353
      2'h0: // Interrupt is generated
6354
      begin
6355
        // Reset_tx_bd nable interrupt generation
6356
        // unmask interrupts
6357
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6358
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6359
        // not detect carrier sense in FD and no collision
6360
        eth_phy.carrier_sense_tx_fd_detect(0);
6361
        eth_phy.collision(0);
6362
      end
6363
      2'h1: // Interrupt is not generated
6364
      begin
6365
        // set_tx_bd enable interrupt generation
6366
        // mask interrupts
6367
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6368
        // detect carrier sense in FD and no collision
6369
        eth_phy.carrier_sense_tx_fd_detect(1);
6370
        eth_phy.collision(0);
6371
      end
6372
      2'h2: // Interrupt is not generated
6373
      begin
6374
        // set_tx_bd disable the interrupt generation
6375
        // unmask interrupts
6376
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6377
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6378
        // not detect carrier sense in FD and set collision
6379
        eth_phy.carrier_sense_tx_fd_detect(0);
6380
        eth_phy.collision(1);
6381
      end
6382
      default: // 2'h3: // Interrupt is not generated
6383
      begin
6384
        // set_tx_bd disable the interrupt generation
6385
        // mask interrupts
6386
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6387
        // detect carrier sense in FD and set collision
6388
        eth_phy.carrier_sense_tx_fd_detect(1);
6389
        eth_phy.collision(1);
6390
      end
6391
      endcase
6392
      #1;
6393
      // first destination address on ethernet PHY
6394
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6395
      // SET packets and wrap bit
6396
      // num_of_frames <= 9 => wrap set to TX BD 0
6397
      if (num_of_frames <= 9)
6398
      begin
6399
        tmp_len = i_length; // length of frame
6400
        tmp_bd_num = 0; // TX BD number
6401
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6402
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6403
        if (tmp_len[0] == 0)
6404
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6405
        else
6406
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6407
        // set wrap bit
6408
        set_tx_bd_wrap(0);
6409
      end
6410
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6411
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6412
      begin
6413
        tmp_len = i_length; // length of frame
6414
        tmp_bd_num = 0; // TX BD number
6415
        while (tmp_bd_num < 4) //
6416
        begin
6417
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6418
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6419
          if (tmp_len[0] == 0)
6420
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6421
          else
6422
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6423
          tmp_len = tmp_len + 1;
6424
          // set TX BD number
6425
          tmp_bd_num = tmp_bd_num + 1;
6426
        end
6427
        // set wrap bit
6428
        set_tx_bd_wrap(3);
6429
      end
6430
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6431
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6432
      begin
6433
        tmp_len = i_length; // length of frame
6434
        tmp_bd_num = 0; // TX BD number
6435
        while (tmp_bd_num < 5) //
6436
        begin
6437
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6438
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6439
          if (tmp_len[0] == 0)
6440
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6441
          else
6442
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6443
          tmp_len = tmp_len + 1;
6444
          // set TX BD number
6445
          tmp_bd_num = tmp_bd_num + 1;
6446
        end
6447
        // set wrap bit
6448
        set_tx_bd_wrap(4);
6449
      end
6450
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6451
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6452
      begin
6453
        tmp_len = i_length; // length of frame
6454
        tmp_bd_num = 0; // TX BD number
6455
        while (tmp_bd_num < 6) //
6456
        begin
6457
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6458
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6459
          if (tmp_len[0] == 0)
6460
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6461
          else
6462
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6463
          tmp_len = tmp_len + 1;
6464
          // set TX BD number
6465
          tmp_bd_num = tmp_bd_num + 1;
6466
        end
6467
        // set wrap bit
6468
        set_tx_bd_wrap(5);
6469
      end
6470
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6471
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6472
      begin
6473
        tmp_len = i_length; // length of frame
6474
        tmp_bd_num = 0; // TX BD number
6475
        while (tmp_bd_num < 7) //
6476
        begin
6477
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6478
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6479
          if (tmp_len[0] == 0)
6480
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6481
          else
6482
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6483
          tmp_len = tmp_len + 1;
6484
          // set TX BD number
6485
          tmp_bd_num = tmp_bd_num + 1;
6486
        end
6487
        // set wrap bit
6488
        set_tx_bd_wrap(6);
6489
      end
6490
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6491
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6492
      begin
6493
        tmp_len = i_length; // length of frame
6494
        tmp_bd_num = 0; // TX BD number
6495
        while (tmp_bd_num < 8) //
6496
        begin
6497
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6498
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6499
          if (tmp_len[0] == 0)
6500
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6501
          else
6502
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6503
          tmp_len = tmp_len + 1;
6504
          // set TX BD number
6505
          tmp_bd_num = tmp_bd_num + 1;
6506
        end
6507
        // set wrap bit
6508
        set_tx_bd_wrap(7);
6509
      end
6510
      #1;
6511
      // SET ready bit
6512
      if (num_of_frames < 10)
6513
        set_tx_bd_ready(0, 0);
6514
      else if (num_of_frames < 14)
6515
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6516
      else if (num_of_frames < 18)
6517
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6518
      else if (num_of_frames < 23)
6519
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6520
      else if (num_of_frames < 28)
6521
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6522
      else if (num_of_frames < 34)
6523
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6524
      else if (num_of_frames < 40)
6525
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6526
      else if (num_of_frames < 47)
6527
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6528
      else if (num_of_frames < 54)
6529
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6530
      else if (num_of_frames < 62)
6531
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6532
      else if (num_of_frames < 70)
6533
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6534
      // CHECK END OF TRANSMITION
6535
      frame_started = 0;
6536
      if (num_of_frames >= 5)
6537
        #1 check_tx_bd(num_of_bd, data);
6538
      fork
6539
      begin: fr_st1
6540
        wait (MTxEn === 1'b1); // start transmit
6541
        frame_started = 1;
6542
      end
6543
      begin
6544
        repeat (30) @(posedge mtx_clk);
6545
        if (num_of_frames < 5)
6546
        begin
6547
          if (frame_started == 1)
6548
          begin
6549
            `TIME; $display("*E Frame should NOT start!");
6550
          end
6551
          disable fr_st1;
6552
        end
6553
        else
6554
        begin
6555
          if (frame_started == 0)
6556
          begin
6557
            `TIME; $display("*W Frame should start!");
6558
            disable fr_st1;
6559
          end
6560
        end
6561
      end
6562
      join
6563
      // check packets larger than 4 bytes
6564
      if (num_of_frames >= 5)
6565
      begin
6566
        wait (MTxEn === 1'b0); // end transmit
6567
        while (data[15] === 1)
6568
        begin
6569
          #1 check_tx_bd(num_of_bd, data);
6570
          @(posedge wb_clk);
6571
        end
6572
        repeat (1) @(posedge wb_clk);
6573
        // check length of a PACKET
6574
        if (i_length <= (min_tmp - 4))
6575
        begin
6576
          if (eth_phy.tx_len != min_tmp)
6577
          begin
6578
            test_fail("Wrong length of the packet out from MAC");
6579
            fail = fail + 1;
6580
          end
6581
        end
6582
        else
6583
        begin
6584
          if (eth_phy.tx_len != (i_length + 4))
6585
          begin
6586
            test_fail("Wrong length of the packet out from MAC");
6587
            fail = fail + 1;
6588
          end
6589
        end
6590
        // check transmitted TX packet data
6591
        if (i_length[0] == 0)
6592
        begin
6593
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6594
        end
6595
        else
6596
        begin
6597
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6598
        end
6599
        if (tmp > 0)
6600
        begin
6601
          test_fail("Wrong data of the transmitted packet");
6602
          fail = fail + 1;
6603
        end
6604
        // check transmited TX packet CRC
6605
        if (num_of_frames < (min_tmp - 4))
6606
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6607
        else
6608
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6609
        if (tmp > 0)
6610
        begin
6611
          test_fail("Wrong CRC of the transmitted packet");
6612
          fail = fail + 1;
6613
        end
6614
      end
6615
      // check WB INT signal
6616
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6617
      begin
6618
        if (wb_int !== 1'b1)
6619
        begin
6620
          `TIME; $display("*E WB INT signal should be set");
6621
          test_fail("WB INT signal should be set");
6622
          fail = fail + 1;
6623
        end
6624
      end
6625
      else
6626
      begin
6627
        if (wb_int !== 1'b0)
6628
        begin
6629
          `TIME; $display("*E WB INT signal should not be set");
6630
          test_fail("WB INT signal should not be set");
6631
          fail = fail + 1;
6632
        end
6633
      end
6634
      // check TX buffer descriptor of a packet
6635
      check_tx_bd(num_of_bd, data);
6636
      if (num_of_frames >= 5)
6637
      begin
6638
        if (i_length[1] == 1'b0) // interrupt enabled
6639
        begin
6640
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6641
               (data[15:0] !== 16'h5800) ) // without wrap bit
6642
          begin
6643
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6644
            test_fail("TX buffer descriptor status is not correct");
6645
            fail = fail + 1;
6646
          end
6647
        end
6648
        else // interrupt not enabled
6649
        begin
6650
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6651
               (data[15:0] !== 16'h1800) ) // without wrap bit
6652
          begin
6653
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6654
            test_fail("TX buffer descriptor status is not correct");
6655
            fail = fail + 1;
6656
          end
6657
        end
6658
      end
6659
      else
6660
      begin
6661
        if (data[15] !== 1'b1)
6662
        begin
6663
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6664
          test_fail("TX buffer descriptor status is not correct");
6665
          fail = fail + 1;
6666
        end
6667
      end
6668
      // clear TX BD with wrap bit
6669
      if (num_of_frames == 63)
6670
        clear_tx_bd(16, 16);
6671
      // check interrupts
6672
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6673
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6674
      begin
6675
        if ((data & `ETH_INT_TXB) !== 1'b1)
6676
        begin
6677
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6678
          test_fail("Interrupt Transmit Buffer was not set");
6679
          fail = fail + 1;
6680
        end
6681
        if ((data & (~`ETH_INT_TXB)) !== 0)
6682
        begin
6683
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6684
          test_fail("Other interrupts (except Transmit Buffer) were set");
6685
          fail = fail + 1;
6686
        end
6687
      end
6688
      else
6689
      begin
6690
        if (data !== 0)
6691
        begin
6692
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6693
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6694
          fail = fail + 1;
6695
        end
6696
      end
6697
      // clear interrupts
6698
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6699
      // check WB INT signal
6700
      if (wb_int !== 1'b0)
6701
      begin
6702
        test_fail("WB INT signal should not be set");
6703
        fail = fail + 1;
6704
      end
6705
      // INTERMEDIATE DISPLAYS
6706
      if (i_length == 3)
6707
      begin
6708
        $display("    pads appending to packets is selected");
6709
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6710
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6711
                 0, 3);
6712
      end
6713
      else if (i_length == 9)
6714
      begin
6715
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6716
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6717
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6718
                 5, 9);
6719
      end
6720
      else if (i_length == 17)
6721
      begin
6722
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6723
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6724
                 10, 17);
6725
      end
6726
      else if (i_length == 27)
6727
      begin
6728
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6729
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6730
                 18, 27);
6731
      end
6732
      else if (i_length == 40)
6733
      begin
6734
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6735
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6736
                 28, 40);
6737
      end
6738
      else if (i_length == 54)
6739
      begin
6740
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6741
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6742
                 41, 54);
6743
      end
6744
      else if (i_length == 69)
6745
      begin
6746
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6747
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6748
                 55, 69);
6749
      end
6750
      // set length (loop variable)
6751
      i_length = i_length + 1;
6752
      // the number of frame transmitted
6753
      num_of_frames = num_of_frames + 1;
6754
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6755
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6756
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6757
          (num_of_frames == 54) || (num_of_frames == 62))
6758
        num_of_bd = 0;
6759
      else
6760
        num_of_bd = num_of_bd + 1;
6761
    end
6762
    // disable TX
6763
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6764
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6765
    @(posedge wb_clk);
6766
    if(fail == 0)
6767
      test_ok;
6768
    else
6769
      fail = 0;
6770
  end
6771
 
6772
 
6773
  ////////////////////////////////////////////////////////////////////
6774
  ////                                                            ////
6775
  ////  Test no transmit packets (no pads) form 0 to (MINFL - 1)  ////
6776
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
6777
  ////                                                            ////
6778
  ////////////////////////////////////////////////////////////////////
6779
  if (test_num == 8) // 
6780
  begin
6781
    // TEST 8: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6782
    test_name = "TEST 8: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6783
    `TIME; $display("  TEST 8: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6784
 
6785
    // reset MAC registers
6786
    hard_reset;
6787
    // reset MAC and MII LOGIC with soft reset
6788
    reset_mac;
6789
    reset_mii;
6790
    // set wb slave response
6791
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6792
 
6793
    max_tmp = 0;
6794
    min_tmp = 0;
6795
    // set 8 TX buffer descriptors - must be set before TX enable
6796
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6797
    // enable TX, set full-duplex mode, padding and CRC appending
6798
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6799
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6800
    // prepare two packets of MAXFL length
6801
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6802
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6803
    min_tmp = tmp[31:16];
6804
    st_data = 8'h12;
6805
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6806
    st_data = 8'h34;
6807
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6808
    // check WB INT signal
6809
    if (wb_int !== 1'b0)
6810
    begin
6811
      test_fail("WB INT signal should not be set");
6812
      fail = fail + 1;
6813
    end
6814
 
6815
    // write to phy's control register for 10Mbps
6816
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6817
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6818
    speed = 10;
6819
 
6820
    frame_started = 0;
6821
    num_of_frames = 0;
6822
    num_of_bd = 0;
6823
    i_length = 0; // 0;
6824
    while (i_length < 70) // (min_tmp - 4))
6825
    begin
6826
      #1;
6827
      // choose generating carrier sense and collision
6828
      case (i_length[1:0])
6829
      2'h0: // Interrupt is generated
6830
      begin
6831
        // Reset_tx_bd nable interrupt generation
6832
        // unmask interrupts
6833
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6834
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6835
        // not detect carrier sense in FD and no collision
6836
        eth_phy.carrier_sense_tx_fd_detect(0);
6837
        eth_phy.collision(0);
6838
      end
6839
      2'h1: // Interrupt is not generated
6840
      begin
6841
        // set_tx_bd enable interrupt generation
6842
        // mask interrupts
6843
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6844
        // detect carrier sense in FD and no collision
6845
        eth_phy.carrier_sense_tx_fd_detect(1);
6846
        eth_phy.collision(0);
6847
      end
6848
      2'h2: // Interrupt is not generated
6849
      begin
6850
        // set_tx_bd disable the interrupt generation
6851
        // unmask interrupts
6852
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6853
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6854
        // not detect carrier sense in FD and set collision
6855
        eth_phy.carrier_sense_tx_fd_detect(0);
6856
        eth_phy.collision(1);
6857
      end
6858
      default: // 2'h3: // Interrupt is not generated
6859
      begin
6860
        // set_tx_bd disable the interrupt generation
6861
        // mask interrupts
6862
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6863
        // detect carrier sense in FD and set collision
6864
        eth_phy.carrier_sense_tx_fd_detect(1);
6865
        eth_phy.collision(1);
6866
      end
6867
      endcase
6868
      #1;
6869
      // first destination address on ethernet PHY
6870
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6871
      // SET packets and wrap bit
6872
      // num_of_frames <= 9 => wrap set to TX BD 0
6873
      if (num_of_frames <= 9)
6874
      begin
6875
        tmp_len = i_length; // length of frame
6876
        tmp_bd_num = 0; // TX BD number
6877
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6878
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6879
        if (tmp_len[0] == 0)
6880
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6881
        else
6882
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6883
        // set wrap bit
6884
        set_tx_bd_wrap(0);
6885
      end
6886
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6887
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6888
      begin
6889
        tmp_len = i_length; // length of frame
6890
        tmp_bd_num = 0; // TX BD number
6891
        while (tmp_bd_num < 4) //
6892
        begin
6893
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6894
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6895
          if (tmp_len[0] == 0)
6896
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6897
          else
6898
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6899
          tmp_len = tmp_len + 1;
6900
          // set TX BD number
6901
          tmp_bd_num = tmp_bd_num + 1;
6902
        end
6903
        // set wrap bit
6904
        set_tx_bd_wrap(3);
6905
      end
6906
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6907
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6908
      begin
6909
        tmp_len = i_length; // length of frame
6910
        tmp_bd_num = 0; // TX BD number
6911
        while (tmp_bd_num < 5) //
6912
        begin
6913
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6914
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6915
          if (tmp_len[0] == 0)
6916
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6917
          else
6918
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6919
          tmp_len = tmp_len + 1;
6920
          // set TX BD number
6921
          tmp_bd_num = tmp_bd_num + 1;
6922
        end
6923
        // set wrap bit
6924
        set_tx_bd_wrap(4);
6925
      end
6926
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6927
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6928
      begin
6929
        tmp_len = i_length; // length of frame
6930
        tmp_bd_num = 0; // TX BD number
6931
        while (tmp_bd_num < 6) //
6932
        begin
6933
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6934
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6935
          if (tmp_len[0] == 0)
6936
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6937
          else
6938
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6939
          tmp_len = tmp_len + 1;
6940
          // set TX BD number
6941
          tmp_bd_num = tmp_bd_num + 1;
6942
        end
6943
        // set wrap bit
6944
        set_tx_bd_wrap(5);
6945
      end
6946
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6947
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6948
      begin
6949
        tmp_len = i_length; // length of frame
6950
        tmp_bd_num = 0; // TX BD number
6951
        while (tmp_bd_num < 7) //
6952
        begin
6953
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6954
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6955
          if (tmp_len[0] == 0)
6956
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6957
          else
6958
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6959
          tmp_len = tmp_len + 1;
6960
          // set TX BD number
6961
          tmp_bd_num = tmp_bd_num + 1;
6962
        end
6963
        // set wrap bit
6964
        set_tx_bd_wrap(6);
6965
      end
6966
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6967
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6968
      begin
6969
        tmp_len = i_length; // length of frame
6970
        tmp_bd_num = 0; // TX BD number
6971
        while (tmp_bd_num < 8) //
6972
        begin
6973
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6974
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6975
          if (tmp_len[0] == 0)
6976
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6977
          else
6978
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6979
          tmp_len = tmp_len + 1;
6980
          // set TX BD number
6981
          tmp_bd_num = tmp_bd_num + 1;
6982
        end
6983
        // set wrap bit
6984
        set_tx_bd_wrap(7);
6985
      end
6986
      #1;
6987
      // SET ready bit
6988
      if (num_of_frames < 10)
6989
        set_tx_bd_ready(0, 0);
6990
      else if (num_of_frames < 14)
6991
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6992
      else if (num_of_frames < 18)
6993
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6994
      else if (num_of_frames < 23)
6995
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6996
      else if (num_of_frames < 28)
6997
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6998
      else if (num_of_frames < 34)
6999
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7000
      else if (num_of_frames < 40)
7001
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7002
      else if (num_of_frames < 47)
7003
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7004
      else if (num_of_frames < 54)
7005
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7006
      else if (num_of_frames < 62)
7007
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7008
      else if (num_of_frames < 70)
7009
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7010
      // CHECK END OF TRANSMITION
7011
      frame_started = 0;
7012
      if (num_of_frames >= 5)
7013
        #1 check_tx_bd(num_of_bd, data);
7014
      fork
7015
      begin: fr_st2
7016
        wait (MTxEn === 1'b1); // start transmit
7017
        frame_started = 1;
7018
      end
7019
      begin
7020
        repeat (30) @(posedge mtx_clk);
7021
        if (num_of_frames < 5)
7022
        begin
7023
          if (frame_started == 1)
7024
          begin
7025
            `TIME; $display("*E Frame should NOT start!");
7026
          end
7027
          disable fr_st2;
7028
        end
7029
        else
7030
        begin
7031
          if (frame_started == 0)
7032
          begin
7033
            `TIME; $display("*W Frame should start!");
7034
            disable fr_st2;
7035
          end
7036
        end
7037
      end
7038
      join
7039
      // check packets larger than 4 bytes
7040
      if (num_of_frames >= 5)
7041
      begin
7042
        wait (MTxEn === 1'b0); // end transmit
7043
        while (data[15] === 1)
7044
        begin
7045
          #1 check_tx_bd(num_of_bd, data);
7046
          @(posedge wb_clk);
7047
        end
7048
        repeat (1) @(posedge wb_clk);
7049
        // check length of a PACKET
7050
        if (eth_phy.tx_len != (i_length + 4))
7051
        begin
7052
          `TIME; $display("*E Wrong length of the packet out from MAC");
7053
          test_fail("Wrong length of the packet out from MAC");
7054
          fail = fail + 1;
7055
        end
7056
        // check transmitted TX packet data
7057
        if (i_length[0] == 0)
7058
        begin
7059
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7060
        end
7061
        else
7062
        begin
7063
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7064
        end
7065
        if (tmp > 0)
7066
        begin
7067
          test_fail("Wrong data of the transmitted packet");
7068
          fail = fail + 1;
7069
        end
7070
        // check transmited TX packet CRC
7071
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7072
        if (tmp > 0)
7073
        begin
7074
          test_fail("Wrong CRC of the transmitted packet");
7075
          fail = fail + 1;
7076
        end
7077
      end
7078
      // check WB INT signal
7079
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7080
      begin
7081
        if (wb_int !== 1'b1)
7082
        begin
7083
          `TIME; $display("*E WB INT signal should be set");
7084
          test_fail("WB INT signal should be set");
7085
          fail = fail + 1;
7086
        end
7087
      end
7088
      else
7089
      begin
7090
        if (wb_int !== 1'b0)
7091
        begin
7092
          `TIME; $display("*E WB INT signal should not be set");
7093
          test_fail("WB INT signal should not be set");
7094
          fail = fail + 1;
7095
        end
7096
      end
7097
      // check TX buffer descriptor of a packet
7098
      check_tx_bd(num_of_bd, data);
7099
      if (num_of_frames >= 5)
7100
      begin
7101
        if (i_length[1] == 1'b0) // interrupt enabled
7102
        begin
7103
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7104
               (data[15:0] !== 16'h5800) ) // without wrap bit
7105
          begin
7106
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7107
            test_fail("TX buffer descriptor status is not correct");
7108
            fail = fail + 1;
7109
          end
7110
        end
7111
        else // interrupt not enabled
7112
        begin
7113
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7114
               (data[15:0] !== 16'h1800) ) // without wrap bit
7115
          begin
7116
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7117
            test_fail("TX buffer descriptor status is not correct");
7118
            fail = fail + 1;
7119
          end
7120
        end
7121
      end
7122
      else
7123
      begin
7124
        if (data[15] !== 1'b1)
7125
        begin
7126
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7127
          test_fail("TX buffer descriptor status is not correct");
7128
          fail = fail + 1;
7129
        end
7130
      end
7131
      // clear TX BD with wrap bit
7132
      if (num_of_frames == 63)
7133
        clear_tx_bd(16, 16);
7134
      // check interrupts
7135
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7136
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7137
      begin
7138
        if ((data & `ETH_INT_TXB) !== 1'b1)
7139
        begin
7140
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7141
          test_fail("Interrupt Transmit Buffer was not set");
7142
          fail = fail + 1;
7143
        end
7144
        if ((data & (~`ETH_INT_TXB)) !== 0)
7145
        begin
7146
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7147
          test_fail("Other interrupts (except Transmit Buffer) were set");
7148
          fail = fail + 1;
7149
        end
7150
      end
7151
      else
7152
      begin
7153
        if (data !== 0)
7154
        begin
7155
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7156
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7157
          fail = fail + 1;
7158
        end
7159
      end
7160
      // clear interrupts
7161
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7162
      // check WB INT signal
7163
      if (wb_int !== 1'b0)
7164
      begin
7165
        test_fail("WB INT signal should not be set");
7166
        fail = fail + 1;
7167
      end
7168
      // INTERMEDIATE DISPLAYS
7169
      if (i_length == 3)
7170
      begin
7171
        $display("    pads appending to packets is selected");
7172
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7173
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7174
                 0, 3);
7175
      end
7176
      else if (i_length == 9)
7177
      begin
7178
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7179
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7180
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7181
                 5, 9);
7182
      end
7183
      else if (i_length == 17)
7184
      begin
7185
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7186
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7187
                 10, 17);
7188
      end
7189
      else if (i_length == 27)
7190
      begin
7191
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7192
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7193
                 18, 27);
7194
      end
7195
      else if (i_length == 40)
7196
      begin
7197
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7198
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7199
                 28, 40);
7200
      end
7201
      else if (i_length == 54)
7202
      begin
7203
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7204
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7205
                 41, 54);
7206
      end
7207
      else if (i_length == 69)
7208
      begin
7209
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7210
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7211
                 55, 69);
7212
      end
7213
      // set length (loop variable)
7214
      i_length = i_length + 1;
7215
      // the number of frame transmitted
7216
      num_of_frames = num_of_frames + 1;
7217
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7218
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7219
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7220
          (num_of_frames == 54) || (num_of_frames == 62))
7221
        num_of_bd = 0;
7222
      else
7223
        num_of_bd = num_of_bd + 1;
7224
    end
7225
    // disable TX
7226
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7227
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7228
    @(posedge wb_clk);
7229
    if(fail == 0)
7230
      test_ok;
7231
    else
7232
      fail = 0;
7233
  end
7234
 
7235
 
7236
  ////////////////////////////////////////////////////////////////////
7237
  ////                                                            ////
7238
  ////  Test no transmit packets (no pads) form 0 to (MINFL - 1)  ////
7239
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7240
  ////                                                            ////
7241
  ////////////////////////////////////////////////////////////////////
7242
  if (test_num == 9) // 
7243
  begin
7244
    // TEST 9: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7245
    test_name = "TEST 9: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7246
    `TIME; $display("  TEST 9: NO TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7247
 
7248
    // reset MAC registers
7249
    hard_reset;
7250
    // reset MAC and MII LOGIC with soft reset
7251
    reset_mac;
7252
    reset_mii;
7253
    // set wb slave response
7254
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7255
 
7256
    max_tmp = 0;
7257
    min_tmp = 0;
7258
    // set 8 TX buffer descriptors - must be set before TX enable
7259
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7260
    // enable TX, set full-duplex mode, padding and CRC appending
7261
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7262
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7263
    // prepare two packets of MAXFL length
7264
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7265
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7266
    min_tmp = tmp[31:16];
7267
    st_data = 8'h12;
7268
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7269
    st_data = 8'h34;
7270
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7271
    // check WB INT signal
7272
    if (wb_int !== 1'b0)
7273
    begin
7274
      test_fail("WB INT signal should not be set");
7275
      fail = fail + 1;
7276
    end
7277
 
7278
    // write to phy's control register for 100Mbps
7279
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7280
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7281
    speed = 100;
7282
 
7283
    frame_started = 0;
7284
    num_of_frames = 0;
7285
    num_of_bd = 0;
7286
    i_length = 0; // 0;
7287
    while (i_length < 70) // (min_tmp - 4))
7288
    begin
7289
      #1;
7290
      // choose generating carrier sense and collision
7291
      case (i_length[1:0])
7292
      2'h0: // Interrupt is generated
7293
      begin
7294
        // Reset_tx_bd nable interrupt generation
7295
        // unmask interrupts
7296
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7297
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7298
        // not detect carrier sense in FD and no collision
7299
        eth_phy.carrier_sense_tx_fd_detect(0);
7300
        eth_phy.collision(0);
7301
      end
7302
      2'h1: // Interrupt is not generated
7303
      begin
7304
        // set_tx_bd enable interrupt generation
7305
        // mask interrupts
7306
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7307
        // detect carrier sense in FD and no collision
7308
        eth_phy.carrier_sense_tx_fd_detect(1);
7309
        eth_phy.collision(0);
7310
      end
7311
      2'h2: // Interrupt is not generated
7312
      begin
7313
        // set_tx_bd disable the interrupt generation
7314
        // unmask interrupts
7315
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7316
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7317
        // not detect carrier sense in FD and set collision
7318
        eth_phy.carrier_sense_tx_fd_detect(0);
7319
        eth_phy.collision(1);
7320
      end
7321
      default: // 2'h3: // Interrupt is not generated
7322
      begin
7323
        // set_tx_bd disable the interrupt generation
7324
        // mask interrupts
7325
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7326
        // detect carrier sense in FD and set collision
7327
        eth_phy.carrier_sense_tx_fd_detect(1);
7328
        eth_phy.collision(1);
7329
      end
7330
      endcase
7331
      #1;
7332
      // first destination address on ethernet PHY
7333
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7334
      // SET packets and wrap bit
7335
      // num_of_frames <= 9 => wrap set to TX BD 0
7336
      if (num_of_frames <= 9)
7337
      begin
7338
        tmp_len = i_length; // length of frame
7339
        tmp_bd_num = 0; // TX BD number
7340
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7341
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7342
        if (tmp_len[0] == 0)
7343
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7344
        else
7345
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7346
        // set wrap bit
7347
        set_tx_bd_wrap(0);
7348
      end
7349
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7350
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7351
      begin
7352
        tmp_len = i_length; // length of frame
7353
        tmp_bd_num = 0; // TX BD number
7354
        while (tmp_bd_num < 4) //
7355
        begin
7356
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7357
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7358
          if (tmp_len[0] == 0)
7359
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7360
          else
7361
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7362
          tmp_len = tmp_len + 1;
7363
          // set TX BD number
7364
          tmp_bd_num = tmp_bd_num + 1;
7365
        end
7366
        // set wrap bit
7367
        set_tx_bd_wrap(3);
7368
      end
7369
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7370
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7371
      begin
7372
        tmp_len = i_length; // length of frame
7373
        tmp_bd_num = 0; // TX BD number
7374
        while (tmp_bd_num < 5) //
7375
        begin
7376
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7377
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7378
          if (tmp_len[0] == 0)
7379
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7380
          else
7381
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7382
          tmp_len = tmp_len + 1;
7383
          // set TX BD number
7384
          tmp_bd_num = tmp_bd_num + 1;
7385
        end
7386
        // set wrap bit
7387
        set_tx_bd_wrap(4);
7388
      end
7389
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7390
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7391
      begin
7392
        tmp_len = i_length; // length of frame
7393
        tmp_bd_num = 0; // TX BD number
7394
        while (tmp_bd_num < 6) //
7395
        begin
7396
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7397
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7398
          if (tmp_len[0] == 0)
7399
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7400
          else
7401
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7402
          tmp_len = tmp_len + 1;
7403
          // set TX BD number
7404
          tmp_bd_num = tmp_bd_num + 1;
7405
        end
7406
        // set wrap bit
7407
        set_tx_bd_wrap(5);
7408
      end
7409
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7410
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7411
      begin
7412
        tmp_len = i_length; // length of frame
7413
        tmp_bd_num = 0; // TX BD number
7414
        while (tmp_bd_num < 7) //
7415
        begin
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
          tmp_len = tmp_len + 1;
7423
          // set TX BD number
7424
          tmp_bd_num = tmp_bd_num + 1;
7425
        end
7426
        // set wrap bit
7427
        set_tx_bd_wrap(6);
7428
      end
7429
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7430
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7431
      begin
7432
        tmp_len = i_length; // length of frame
7433
        tmp_bd_num = 0; // TX BD number
7434
        while (tmp_bd_num < 8) //
7435
        begin
7436
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7437
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7438
          if (tmp_len[0] == 0)
7439
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7440
          else
7441
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7442
          tmp_len = tmp_len + 1;
7443
          // set TX BD number
7444
          tmp_bd_num = tmp_bd_num + 1;
7445
        end
7446
        // set wrap bit
7447
        set_tx_bd_wrap(7);
7448
      end
7449
      #1;
7450
      // SET ready bit
7451
      if (num_of_frames < 10)
7452
        set_tx_bd_ready(0, 0);
7453
      else if (num_of_frames < 14)
7454
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7455
      else if (num_of_frames < 18)
7456
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7457
      else if (num_of_frames < 23)
7458
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7459
      else if (num_of_frames < 28)
7460
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7461
      else if (num_of_frames < 34)
7462
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7463
      else if (num_of_frames < 40)
7464
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7465
      else if (num_of_frames < 47)
7466
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7467
      else if (num_of_frames < 54)
7468
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7469
      else if (num_of_frames < 62)
7470
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7471
      else if (num_of_frames < 70)
7472
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7473
      // CHECK END OF TRANSMITION
7474
      frame_started = 0;
7475
      if (num_of_frames >= 5)
7476
        #1 check_tx_bd(num_of_bd, data);
7477
      fork
7478
      begin: fr_st3
7479
        wait (MTxEn === 1'b1); // start transmit
7480
        frame_started = 1;
7481
      end
7482
      begin
7483
        repeat (30) @(posedge mtx_clk);
7484
        if (num_of_frames < 5)
7485
        begin
7486
          if (frame_started == 1)
7487
          begin
7488
            `TIME; $display("*E Frame should NOT start!");
7489
          end
7490
          disable fr_st3;
7491
        end
7492
        else
7493
        begin
7494
          if (frame_started == 0)
7495
          begin
7496
            `TIME; $display("*W Frame should start!");
7497
            disable fr_st3;
7498
          end
7499
        end
7500
      end
7501
      join
7502
      // check packets larger than 4 bytes
7503
      if (num_of_frames >= 5)
7504
      begin
7505
        wait (MTxEn === 1'b0); // end transmit
7506
        while (data[15] === 1)
7507
        begin
7508
          #1 check_tx_bd(num_of_bd, data);
7509
          @(posedge wb_clk);
7510
        end
7511
        repeat (1) @(posedge wb_clk);
7512
        // check length of a PACKET
7513
        if (eth_phy.tx_len != (i_length + 4))
7514
        begin
7515
          `TIME; $display("*E Wrong length of the packet out from MAC");
7516
          test_fail("Wrong length of the packet out from MAC");
7517
          fail = fail + 1;
7518
        end
7519
        // check transmitted TX packet data
7520
        if (i_length[0] == 0)
7521
        begin
7522
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7523
        end
7524
        else
7525
        begin
7526
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7527
        end
7528
        if (tmp > 0)
7529
        begin
7530
          test_fail("Wrong data of the transmitted packet");
7531
          fail = fail + 1;
7532
        end
7533
        // check transmited TX packet CRC
7534
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7535
        if (tmp > 0)
7536
        begin
7537
          test_fail("Wrong CRC of the transmitted packet");
7538
          fail = fail + 1;
7539
        end
7540
      end
7541
      // check WB INT signal
7542
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7543
      begin
7544
        if (wb_int !== 1'b1)
7545
        begin
7546
          `TIME; $display("*E WB INT signal should be set");
7547
          test_fail("WB INT signal should be set");
7548
          fail = fail + 1;
7549
        end
7550
      end
7551
      else
7552
      begin
7553
        if (wb_int !== 1'b0)
7554
        begin
7555
          `TIME; $display("*E WB INT signal should not be set");
7556
          test_fail("WB INT signal should not be set");
7557
          fail = fail + 1;
7558
        end
7559
      end
7560
      // check TX buffer descriptor of a packet
7561
      check_tx_bd(num_of_bd, data);
7562
      if (num_of_frames >= 5)
7563
      begin
7564
        if (i_length[1] == 1'b0) // interrupt enabled
7565
        begin
7566
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7567
               (data[15:0] !== 16'h5800) ) // without wrap bit
7568
          begin
7569
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7570
            test_fail("TX buffer descriptor status is not correct");
7571
            fail = fail + 1;
7572
          end
7573
        end
7574
        else // interrupt not enabled
7575
        begin
7576
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7577
               (data[15:0] !== 16'h1800) ) // without wrap bit
7578
          begin
7579
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7580
            test_fail("TX buffer descriptor status is not correct");
7581
            fail = fail + 1;
7582
          end
7583
        end
7584
      end
7585
      else
7586
      begin
7587
        if (data[15] !== 1'b1)
7588
        begin
7589
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7590
          test_fail("TX buffer descriptor status is not correct");
7591
          fail = fail + 1;
7592
        end
7593
      end
7594
      // clear TX BD with wrap bit
7595
      if (num_of_frames == 63)
7596
        clear_tx_bd(16, 16);
7597
      // check interrupts
7598
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7599
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7600
      begin
7601
        if ((data & `ETH_INT_TXB) !== 1'b1)
7602
        begin
7603
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7604
          test_fail("Interrupt Transmit Buffer was not set");
7605
          fail = fail + 1;
7606
        end
7607
        if ((data & (~`ETH_INT_TXB)) !== 0)
7608
        begin
7609
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7610
          test_fail("Other interrupts (except Transmit Buffer) were set");
7611
          fail = fail + 1;
7612
        end
7613
      end
7614
      else
7615
      begin
7616
        if (data !== 0)
7617
        begin
7618
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7619
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7620
          fail = fail + 1;
7621
        end
7622
      end
7623
      // clear interrupts
7624
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7625
      // check WB INT signal
7626
      if (wb_int !== 1'b0)
7627
      begin
7628
        test_fail("WB INT signal should not be set");
7629
        fail = fail + 1;
7630
      end
7631
      // INTERMEDIATE DISPLAYS
7632
      if (i_length == 3)
7633
      begin
7634
        $display("    pads appending to packets is selected");
7635
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7636
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7637
                 0, 3);
7638
      end
7639
      else if (i_length == 9)
7640
      begin
7641
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7642
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7643
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7644
                 5, 9);
7645
      end
7646
      else if (i_length == 17)
7647
      begin
7648
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7649
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7650
                 10, 17);
7651
      end
7652
      else if (i_length == 27)
7653
      begin
7654
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7655
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7656
                 18, 27);
7657
      end
7658
      else if (i_length == 40)
7659
      begin
7660
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7661
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7662
                 28, 40);
7663
      end
7664
      else if (i_length == 54)
7665
      begin
7666
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7667
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7668
                 41, 54);
7669
      end
7670
      else if (i_length == 69)
7671
      begin
7672
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7673
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7674
                 55, 69);
7675
      end
7676
      // set length (loop variable)
7677
      i_length = i_length + 1;
7678
      // the number of frame transmitted
7679
      num_of_frames = num_of_frames + 1;
7680
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7681
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7682
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7683
          (num_of_frames == 54) || (num_of_frames == 62))
7684
        num_of_bd = 0;
7685
      else
7686
        num_of_bd = num_of_bd + 1;
7687
    end
7688
    // disable TX
7689
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7690
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7691
    @(posedge wb_clk);
7692
    if(fail == 0)
7693
      test_ok;
7694
    else
7695
      fail = 0;
7696
  end
7697
 
7698
 
7699
  ////////////////////////////////////////////////////////////////////
7700
  ////                                                            ////
7701
  ////  Test transmit packets across MAXFL value at               ////
7702
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
7703
  ////                                                            ////
7704
  ////////////////////////////////////////////////////////////////////
7705
  if (test_num == 10) // without and with padding
7706
  begin
7707
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
7708
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
7709
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
7710
 
7711
    // reset MAC registers
7712
    hard_reset;
7713
    // reset MAC and MII LOGIC with soft reset
7714
    reset_mac;
7715
    reset_mii;
7716
    // set wb slave response
7717
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7718
 
7719
    max_tmp = 0;
7720
    min_tmp = 0;
7721
    num_of_frames = 0;
7722
    num_of_bd = 0;
7723
    // set 13 TX buffer descriptors - must be set before TX enable
7724
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7725
    // enable TX, set full-duplex mode, NO padding and CRC appending
7726
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7727
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7728
    // prepare a packet of MAXFL + 10 length
7729
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7730
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7731
    min_tmp = tmp[31:16];
7732
    st_data = 8'hA3;
7733
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
7734
    // check WB INT signal
7735
    if (wb_int !== 1'b0)
7736
    begin
7737
      test_fail("WB INT signal should not be set");
7738
      fail = fail + 1;
7739
    end
7740
 
7741
    // write to phy's control register for 10Mbps
7742
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
7743
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
7744
    speed = 10;
7745
 
7746
    i_length = (max_tmp - 5);
7747
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
7748
    begin
7749
$display("   i_length = %0d", i_length);
7750
      // choose generating carrier sense and collision
7751
//      case (i_length[1:0])
7752
//      2'h0: // Interrupt is generated
7753
//      begin
7754
        // Reset_tx_bd nable interrupt generation
7755
        // unmask interrupts
7756
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7757
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7758
        // not detect carrier sense in FD and no collision
7759
        eth_phy.carrier_sense_tx_fd_detect(0);
7760
        eth_phy.collision(0);
7761
//      end
7762
//      2'h1: // Interrupt is not generated
7763
//      begin
7764
        // set_tx_bd enable interrupt generation
7765
        // mask interrupts
7766
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7767
        // detect carrier sense in FD and no collision
7768
//        eth_phy.carrier_sense_tx_fd_detect(1);
7769
//        eth_phy.collision(0);
7770
//      end
7771
//      2'h2: // Interrupt is not generated
7772
//      begin
7773
        // set_tx_bd disable the interrupt generation
7774
        // unmask interrupts
7775
//        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7776
//                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7777
        // not detect carrier sense in FD and set collision
7778
//        eth_phy.carrier_sense_tx_fd_detect(0);
7779
//        eth_phy.collision(1);
7780
//      end
7781
//      default: // 2'h3: // Interrupt is not generated
7782
//      begin
7783
        // set_tx_bd disable the interrupt generation
7784
        // mask interrupts
7785
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7786
        // detect carrier sense in FD and set collision
7787
//        eth_phy.carrier_sense_tx_fd_detect(1);
7788
//        eth_phy.collision(1);
7789
//      end
7790
//      endcase
7791
      // first destination address on ethernet PHY
7792
      eth_phy.set_tx_mem_addr(0);
7793
      // 
7794
if (num_of_bd == 0)
7795
begin
7796
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7797
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7798
set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7799
set_tx_bd_wrap(2);
7800
set_tx_bd_ready(0, 0);
7801
end
7802
else if (num_of_bd == 1)
7803
set_tx_bd_ready(1, 1);
7804
else if (num_of_bd == 2)
7805
set_tx_bd_ready(2, 2);
7806
 
7807
 
7808
//        tmp_len = i_length; // length of frame
7809
//        tmp_bd_num = 0; // TX BD number
7810
//        while (tmp_bd_num < 8) // 
7811
//        begin
7812
//          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7813
//          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7814
//          if (tmp_len[0] == 0)
7815
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7816
//          else
7817
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + 2*max_tmp));
7818
//          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
7819
//          tmp_len = tmp_len + 1;
7820
//          // set TX BD number
7821
//          tmp_bd_num = tmp_bd_num + 1;
7822
//        end
7823
//        // set wrap bit
7824
//        set_tx_bd_wrap(7);
7825
//      // set ready bit
7826
//      set_tx_bd_ready((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
7827
      // CHECK END OF TRANSMITION
7828
check_tx_bd(num_of_bd, data);
7829
//      #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7830
        wait (MTxEn === 1'b1); // start transmit
7831
check_tx_bd(num_of_bd, data);
7832
//        #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7833
        if (data[15] !== 1)
7834
        begin
7835
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
7836
          fail = fail + 1;
7837
        end
7838
        wait (MTxEn === 1'b0); // end transmit
7839
        while (data[15] === 1)
7840
        begin
7841
check_tx_bd(num_of_bd, data);
7842
//          #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7843
          @(posedge wb_clk);
7844
        end
7845
        repeat (1) @(posedge wb_clk);
7846
      // check length of a PACKET
7847
$display("   eth_phy length = %0d", eth_phy.tx_len);
7848
tmp_len = eth_phy.tx_len;
7849
#1;
7850
if (tmp_len != (i_length + 4))
7851
//      if (eth_phy.tx_len != (i_length + 4))
7852
      begin
7853
        test_fail("Wrong length of the packet out from MAC");
7854
        fail = fail + 1;
7855
      end
7856
      // checking in the following if statement is performed only for first and last 64 lengths
7857
//      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
7858
//      begin
7859
        // check transmitted TX packet data
7860
//        if (i_length[0] == 0)
7861
//        begin
7862
          check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
7863
//        end
7864
//        else
7865
//        begin
7866
//          check_tx_packet((`MEMORY_BASE + 2*max_tmp), 0, i_length, tmp);
7867
//        end
7868
        if (tmp > 0)
7869
        begin
7870
          test_fail("Wrong data of the transmitted packet");
7871
          fail = fail + 1;
7872
        end
7873
        // check transmited TX packet CRC
7874
//        if (i_length[0] == 0)
7875
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7876
//        else
7877
//          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7878
        if (tmp > 0)
7879
        begin
7880
          test_fail("Wrong CRC of the transmitted packet");
7881
          fail = fail + 1;
7882
        end
7883
//      end
7884
      // check WB INT signal
7885
//      if (i_length[1:0] == 2'h0)
7886
//      begin
7887
        if (wb_int !== 1'b1)
7888
        begin
7889
          `TIME; $display("*E WB INT signal should be set");
7890
          test_fail("WB INT signal should be set");
7891
          fail = fail + 1;
7892
        end
7893
//      end
7894
//      else
7895
//      begin
7896
//        if (wb_int !== 1'b0)
7897
//        begin
7898
//          `TIME; $display("*E WB INT signal should not be set");
7899
//          test_fail("WB INT signal should not be set");
7900
//          fail = fail + 1;
7901
//        end
7902
//      end
7903
//      // check TX buffer descriptor of a packet
7904
//      check_tx_bd((i_length - (max_tmp - 8)), data);
7905
check_tx_bd(num_of_bd, data);
7906
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
7907
     ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
7908
//      if (i_length[1] == 1'b0) // interrupt enabled
7909
//      begin
7910
//        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
7911
//             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
7912
        begin
7913
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7914
          test_fail("TX buffer descriptor status is not correct");
7915
          fail = fail + 1;
7916
        end
7917
//      end
7918
//      else // interrupt not enabled
7919
//      begin
7920
//        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
7921
//             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
7922
//        begin
7923
//          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7924
//          test_fail("TX buffer descriptor status is not correct");
7925
//          fail = fail + 1;
7926
//        end
7927
//      end
7928
//      // clear first half of 8 frames from TX buffer descriptor 0
7929
//      if (num_of_frames < 4)
7930
//        clear_tx_bd((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
7931
      // check interrupts
7932
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7933
//      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
7934
//      begin
7935
        if ((data & `ETH_INT_TXB) !== 1'b1)
7936
        begin
7937
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7938
          test_fail("Interrupt Transmit Buffer was not set");
7939
          fail = fail + 1;
7940
        end
7941
        if ((data & (~`ETH_INT_TXB)) !== 0)
7942
        begin
7943
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7944
          test_fail("Other interrupts (except Transmit Buffer) were set");
7945
          fail = fail + 1;
7946
        end
7947
//      end
7948
//      else
7949
//      begin
7950
//        if (data !== 0)
7951
//        begin
7952
//          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7953
//          test_fail("Any of interrupts (except Transmit Buffer) was set");
7954
//          fail = fail + 1;
7955
//        end
7956
//      end
7957
      // clear interrupts
7958
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7959
      // check WB INT signal
7960
      if (wb_int !== 1'b0)
7961
      begin
7962
        test_fail("WB INT signal should not be set");
7963
        fail = fail + 1;
7964
      end
7965
      // INTERMEDIATE DISPLAYS
7966
if (num_of_bd == 0)
7967
  $display("    ->packet with length %0d sent", (i_length + 4));
7968
else if (num_of_bd == 1)
7969
  $display("    ->packet with length %0d sent", (i_length + 4));
7970
else if (num_of_bd == 2)
7971
  $display("    ->packet with length %0d sent", (i_length + 4));
7972
      // set length (loop variable)
7973
      i_length = i_length + 1;
7974
      // the number of frame transmitted
7975
      num_of_frames = num_of_frames + 1;
7976
      num_of_bd = num_of_bd + 1;
7977
      @(posedge wb_clk);
7978
    end
7979
    // disable TX
7980
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7981
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7982
    @(posedge wb_clk);
7983
    if(fail == 0)
7984
      test_ok;
7985
    else
7986
      fail = 0;
7987
  end
7988
 
7989
 
7990
  ////////////////////////////////////////////////////////////////////
7991
  ////                                                            ////
7992
  ////  Test transmit packets across MAXFL value at               ////
7993
  ////  13 TX buffer decriptors ( 100Mbps ).                      ////
7994
  ////                                                            ////
7995
  ////////////////////////////////////////////////////////////////////
7996
  if (test_num == 11) // without and with padding
7997
  begin
7998
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
7999
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8000
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8001
 
8002
    // reset MAC registers
8003
    hard_reset;
8004
    // reset MAC and MII LOGIC with soft reset
8005
    reset_mac;
8006
    reset_mii;
8007
    // set wb slave response
8008
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8009
 
8010
    max_tmp = 0;
8011
    min_tmp = 0;
8012
    num_of_frames = 0;
8013
    num_of_bd = 0;
8014
    // set 13 TX buffer descriptors - must be set before TX enable
8015
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8016
    // enable TX, set full-duplex mode, NO padding and CRC appending
8017
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8018
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8019
    // prepare a packet of MAXFL + 10 length
8020
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8021
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8022
    min_tmp = tmp[31:16];
8023
    st_data = 8'hA3;
8024
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8025
    // check WB INT signal
8026
    if (wb_int !== 1'b0)
8027
    begin
8028
      test_fail("WB INT signal should not be set");
8029
      fail = fail + 1;
8030
    end
8031
 
8032
    // write to phy's control register for 100Mbps
8033
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8034
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8035
    speed = 100;
8036
 
8037
    i_length = (max_tmp - 5);
8038
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
8039
    begin
8040
      $display("   i_length = %0d", i_length);
8041
      // Reset_tx_bd nable interrupt generation
8042
      // unmask interrupts
8043
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8044
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8045
      // not detect carrier sense in FD and no collision
8046
      eth_phy.carrier_sense_tx_fd_detect(0);
8047
      eth_phy.collision(0);
8048
      // first destination address on ethernet PHY
8049
      eth_phy.set_tx_mem_addr(0);
8050
      // prepare BDs
8051
      if (num_of_bd == 0)
8052
      begin
8053
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8054
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8055
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8056
        set_tx_bd_wrap(2);
8057
        set_tx_bd_ready(0, 0);
8058
      end
8059
      else if (num_of_bd == 1)
8060
        set_tx_bd_ready(1, 1);
8061
      else if (num_of_bd == 2)
8062
        set_tx_bd_ready(2, 2);
8063
      // CHECK END OF TRANSMITION
8064
      check_tx_bd(num_of_bd, data);
8065
        wait (MTxEn === 1'b1); // start transmit
8066
      check_tx_bd(num_of_bd, data);
8067
        if (data[15] !== 1)
8068
        begin
8069
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8070
          fail = fail + 1;
8071
        end
8072
        wait (MTxEn === 1'b0); // end transmit
8073
        while (data[15] === 1)
8074
        begin
8075
      check_tx_bd(num_of_bd, data);
8076
          @(posedge wb_clk);
8077
        end
8078
        repeat (1) @(posedge wb_clk);
8079
      // check length of a PACKET
8080
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8081
      tmp_len = eth_phy.tx_len;
8082
      #1;
8083
      if (tmp_len != (i_length + 4))
8084
      begin
8085
        test_fail("Wrong length of the packet out from MAC");
8086
        fail = fail + 1;
8087
      end
8088
      // checking packet
8089
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8090
      if (tmp > 0)
8091
      begin
8092
        test_fail("Wrong data of the transmitted packet");
8093
        fail = fail + 1;
8094
      end
8095
      // check transmited TX packet CRC
8096
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8097
      if (tmp > 0)
8098
      begin
8099
        test_fail("Wrong CRC of the transmitted packet");
8100
        fail = fail + 1;
8101
      end
8102
      // check WB INT signal
8103
      if (wb_int !== 1'b1)
8104
      begin
8105
        `TIME; $display("*E WB INT signal should be set");
8106
        test_fail("WB INT signal should be set");
8107
        fail = fail + 1;
8108
      end
8109
      // check TX buffer descriptor of a packet
8110
      check_tx_bd(num_of_bd, data);
8111
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8112
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8113
      begin
8114
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8115
        test_fail("TX buffer descriptor status is not correct");
8116
        fail = fail + 1;
8117
      end
8118
      // check interrupts
8119
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8120
      if ((data & `ETH_INT_TXB) !== 1'b1)
8121
      begin
8122
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8123
        test_fail("Interrupt Transmit Buffer was not set");
8124
        fail = fail + 1;
8125
      end
8126
      if ((data & (~`ETH_INT_TXB)) !== 0)
8127
      begin
8128
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8129
        test_fail("Other interrupts (except Transmit Buffer) were set");
8130
        fail = fail + 1;
8131
      end
8132
      // clear interrupts
8133
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8134
      // check WB INT signal
8135
      if (wb_int !== 1'b0)
8136
      begin
8137
        test_fail("WB INT signal should not be set");
8138
        fail = fail + 1;
8139
      end
8140
      // INTERMEDIATE DISPLAYS
8141
      if (num_of_bd == 0)
8142
        $display("    ->packet with length %0d sent", (i_length + 4));
8143
      else if (num_of_bd == 1)
8144
        $display("    ->packet with length %0d sent", (i_length + 4));
8145
      else if (num_of_bd == 2)
8146
        $display("    ->packet with length %0d sent", (i_length + 4));
8147
      // set length (loop variable)
8148
      i_length = i_length + 1;
8149
      // the number of frame transmitted
8150
      num_of_frames = num_of_frames + 1;
8151
      num_of_bd = num_of_bd + 1;
8152
      @(posedge wb_clk);
8153
    end
8154
    // disable TX
8155
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8156
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8157
    @(posedge wb_clk);
8158
    if(fail == 0)
8159
      test_ok;
8160
    else
8161
      fail = 0;
8162
  end
8163
 
8164
 
8165
  ////////////////////////////////////////////////////////////////////
8166
  ////                                                            ////
8167
  ////  Test transmit packets across changed MAXFL value at       ////
8168
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8169
  ////                                                            ////
8170
  ////////////////////////////////////////////////////////////////////
8171
  if (test_num == 12) // without and with padding
8172
  begin
8173
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8174
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8175
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8176
 
8177
    // reset MAC registers
8178
    hard_reset;
8179
    // reset MAC and MII LOGIC with soft reset
8180
    reset_mac;
8181
    reset_mii;
8182
    // set wb slave response
8183
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8184
 
8185
    max_tmp = 0;
8186
    min_tmp = 0;
8187
    num_of_frames = 0;
8188
    num_of_bd = 0;
8189
    // set 47 TX buffer descriptors - must be set before TX enable
8190
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8191
    // prepare a packet of MAXFL + 10 length
8192
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8193
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8194
    min_tmp = tmp[31:16];
8195
    // change MAXFL value
8196
    max_tmp = min_tmp + 53;
8197
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8198
    st_data = 8'h62;
8199
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8200
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8201
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8202
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8203
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8204
    // check WB INT signal
8205
    if (wb_int !== 1'b0)
8206
    begin
8207
      test_fail("WB INT signal should not be set");
8208
      fail = fail + 1;
8209
    end
8210
 
8211
    // write to phy's control register for 10Mbps
8212
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8213
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8214
    speed = 10;
8215
 
8216
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8217
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8218
    begin
8219
      $display("   i_length = %0d", i_length);
8220
      // prepare packet's CRC
8221
      if (num_of_bd == 1)
8222
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8223
      // Reset_tx_bd nable interrupt generation
8224
      // unmask interrupts
8225
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8226
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8227
      // not detect carrier sense in FD and no collision
8228
      eth_phy.carrier_sense_tx_fd_detect(0);
8229
      eth_phy.collision(0);
8230
      // first destination address on ethernet PHY
8231
      eth_phy.set_tx_mem_addr(0);
8232
      // prepare BDs
8233
      if (num_of_bd == 0)
8234
      begin
8235
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8236
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8237
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8238
        set_tx_bd_wrap(2);
8239
        set_tx_bd_ready(0, 0);
8240
      end
8241
      else if (num_of_bd == 1)
8242
        set_tx_bd_ready(1, 1);
8243
      else if (num_of_bd == 2)
8244
        set_tx_bd_ready(2, 2);
8245
      // CHECK END OF TRANSMITION
8246
      check_tx_bd(num_of_bd, data);
8247
        wait (MTxEn === 1'b1); // start transmit
8248
      check_tx_bd(num_of_bd, data);
8249
        if (data[15] !== 1)
8250
        begin
8251
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8252
          fail = fail + 1;
8253
        end
8254
        wait (MTxEn === 1'b0); // end transmit
8255
        while (data[15] === 1)
8256
        begin
8257
      check_tx_bd(num_of_bd, data);
8258
          @(posedge wb_clk);
8259
        end
8260
        repeat (1) @(posedge wb_clk);
8261
      // check length of a PACKET
8262
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8263
      tmp_len = eth_phy.tx_len;
8264
      #1;
8265
      if (tmp_len != (i_length + 4))
8266
      begin
8267
        test_fail("Wrong length of the packet out from MAC");
8268
        fail = fail + 1;
8269
      end
8270
      // checking packet
8271
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8272
      if (tmp > 0)
8273
      begin
8274
        test_fail("Wrong data of the transmitted packet");
8275
        fail = fail + 1;
8276
      end
8277
      // check transmited TX packet CRC
8278
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8279
      if (tmp > 0)
8280
      begin
8281
        test_fail("Wrong CRC of the transmitted packet");
8282
        fail = fail + 1;
8283
      end
8284
      // check WB INT signal
8285
      if (wb_int !== 1'b1)
8286
      begin
8287
        `TIME; $display("*E WB INT signal should be set");
8288
        test_fail("WB INT signal should be set");
8289
        fail = fail + 1;
8290
      end
8291
      // check TX buffer descriptor of a packet
8292
      check_tx_bd(num_of_bd, data);
8293
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8294
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8295
      begin
8296
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8297
        test_fail("TX buffer descriptor status is not correct");
8298
        fail = fail + 1;
8299
      end
8300
      // check interrupts
8301
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8302
      if ((data & `ETH_INT_TXB) !== 1'b1)
8303
      begin
8304
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8305
        test_fail("Interrupt Transmit Buffer was not set");
8306
        fail = fail + 1;
8307
      end
8308
      if ((data & (~`ETH_INT_TXB)) !== 0)
8309
      begin
8310
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8311
        test_fail("Other interrupts (except Transmit Buffer) were set");
8312
        fail = fail + 1;
8313
      end
8314
      // clear interrupts
8315
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8316
      // check WB INT signal
8317
      if (wb_int !== 1'b0)
8318
      begin
8319
        test_fail("WB INT signal should not be set");
8320
        fail = fail + 1;
8321
      end
8322
      // INTERMEDIATE DISPLAYS
8323
      if (num_of_bd == 0)
8324
        $display("    ->packet with length %0d sent", (i_length + 4));
8325
      else if (num_of_bd == 1)
8326
        $display("    ->packet with length %0d sent", (i_length + 4));
8327
      else if (num_of_bd == 2)
8328
        $display("    ->packet with length %0d sent", (i_length + 4));
8329
      // set length (loop variable)
8330
      i_length = i_length + 1;
8331
      // the number of frame transmitted
8332
      num_of_frames = num_of_frames + 1;
8333
      num_of_bd = num_of_bd + 1;
8334
      @(posedge wb_clk);
8335
    end
8336
    // disable TX
8337
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8338
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8339
    @(posedge wb_clk);
8340
    if(fail == 0)
8341
      test_ok;
8342
    else
8343
      fail = 0;
8344
  end
8345
 
8346
 
8347
  ////////////////////////////////////////////////////////////////////
8348
  ////                                                            ////
8349
  ////  Test transmit packets across changed MAXFL value at       ////
8350
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8351
  ////                                                            ////
8352
  ////////////////////////////////////////////////////////////////////
8353
  if (test_num == 13) // without and with padding
8354
  begin
8355
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8356
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8357
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8358
 
8359
    // reset MAC registers
8360
    hard_reset;
8361
    // reset MAC and MII LOGIC with soft reset
8362
    reset_mac;
8363
    reset_mii;
8364
    // set wb slave response
8365
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8366
 
8367
    max_tmp = 0;
8368
    min_tmp = 0;
8369
    num_of_frames = 0;
8370
    num_of_bd = 0;
8371
    // set 47 TX buffer descriptors - must be set before TX enable
8372
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8373
    // prepare a packet of MAXFL + 10 length
8374
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8375
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8376
    min_tmp = tmp[31:16];
8377
    // change MAXFL value
8378
    max_tmp = min_tmp + 53;
8379
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8380
    st_data = 8'h62;
8381
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8382
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8383
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8384
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8385
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8386
    // check WB INT signal
8387
    if (wb_int !== 1'b0)
8388
    begin
8389
      test_fail("WB INT signal should not be set");
8390
      fail = fail + 1;
8391
    end
8392
 
8393
    // write to phy's control register for 100Mbps
8394
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8395
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8396
    speed = 100;
8397
 
8398
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8399
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8400
    begin
8401
      $display("   i_length = %0d", i_length);
8402
      // prepare packet's CRC
8403
      if (num_of_bd == 1)
8404
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8405
      // Reset_tx_bd nable interrupt generation
8406
      // unmask interrupts
8407
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8408
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8409
      // not detect carrier sense in FD and no collision
8410
      eth_phy.carrier_sense_tx_fd_detect(0);
8411
      eth_phy.collision(0);
8412
      // first destination address on ethernet PHY
8413
      eth_phy.set_tx_mem_addr(0);
8414
      // prepare BDs
8415
      if (num_of_bd == 0)
8416
      begin
8417
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8418
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8419
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8420
        set_tx_bd_wrap(2);
8421
        set_tx_bd_ready(0, 0);
8422
      end
8423
      else if (num_of_bd == 1)
8424
        set_tx_bd_ready(1, 1);
8425
      else if (num_of_bd == 2)
8426
        set_tx_bd_ready(2, 2);
8427
      // CHECK END OF TRANSMITION
8428
      check_tx_bd(num_of_bd, data);
8429
        wait (MTxEn === 1'b1); // start transmit
8430
      check_tx_bd(num_of_bd, data);
8431
        if (data[15] !== 1)
8432
        begin
8433
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8434
          fail = fail + 1;
8435
        end
8436
        wait (MTxEn === 1'b0); // end transmit
8437
        while (data[15] === 1)
8438
        begin
8439
      check_tx_bd(num_of_bd, data);
8440
          @(posedge wb_clk);
8441
        end
8442
        repeat (1) @(posedge wb_clk);
8443
      // check length of a PACKET
8444
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8445
      tmp_len = eth_phy.tx_len;
8446
      #1;
8447
      if (tmp_len != (i_length + 4))
8448
      begin
8449
        test_fail("Wrong length of the packet out from MAC");
8450
        fail = fail + 1;
8451
      end
8452
      // checking packet
8453
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8454
      if (tmp > 0)
8455
      begin
8456
        test_fail("Wrong data of the transmitted packet");
8457
        fail = fail + 1;
8458
      end
8459
      // check transmited TX packet CRC
8460
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8461
      if (tmp > 0)
8462
      begin
8463
        test_fail("Wrong CRC of the transmitted packet");
8464
        fail = fail + 1;
8465
      end
8466
      // check WB INT signal
8467
      if (wb_int !== 1'b1)
8468
      begin
8469
        `TIME; $display("*E WB INT signal should be set");
8470
        test_fail("WB INT signal should be set");
8471
        fail = fail + 1;
8472
      end
8473
      // check TX buffer descriptor of a packet
8474
      check_tx_bd(num_of_bd, data);
8475
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8476
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8477
      begin
8478
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8479
        test_fail("TX buffer descriptor status is not correct");
8480
        fail = fail + 1;
8481
      end
8482
      // check interrupts
8483
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8484
      if ((data & `ETH_INT_TXB) !== 1'b1)
8485
      begin
8486
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8487
        test_fail("Interrupt Transmit Buffer was not set");
8488
        fail = fail + 1;
8489
      end
8490
      if ((data & (~`ETH_INT_TXB)) !== 0)
8491
      begin
8492
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8493
        test_fail("Other interrupts (except Transmit Buffer) were set");
8494
        fail = fail + 1;
8495
      end
8496
      // clear interrupts
8497
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8498
      // check WB INT signal
8499
      if (wb_int !== 1'b0)
8500
      begin
8501
        test_fail("WB INT signal should not be set");
8502
        fail = fail + 1;
8503
      end
8504
      // INTERMEDIATE DISPLAYS
8505
      if (num_of_bd == 0)
8506
        $display("    ->packet with length %0d sent", (i_length + 4));
8507
      else if (num_of_bd == 1)
8508
        $display("    ->packet with length %0d sent", (i_length + 4));
8509
      else if (num_of_bd == 2)
8510
        $display("    ->packet with length %0d sent", (i_length + 4));
8511
      // set length (loop variable)
8512
      i_length = i_length + 1;
8513
      // the number of frame transmitted
8514
      num_of_frames = num_of_frames + 1;
8515
      num_of_bd = num_of_bd + 1;
8516
      @(posedge wb_clk);
8517
    end
8518
    // disable TX
8519
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8520
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8521
    @(posedge wb_clk);
8522
    if(fail == 0)
8523
      test_ok;
8524
    else
8525
      fail = 0;
8526
  end
8527
 
8528
 
8529
  ////////////////////////////////////////////////////////////////////
8530
  ////                                                            ////
8531
  ////  Test transmit packets across changed MINFL value at       ////
8532
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8533
  ////                                                            ////
8534
  ////////////////////////////////////////////////////////////////////
8535
  if (test_num == 14) // without and with padding
8536
  begin
8537
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8538
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8539
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8540
 
8541
    // reset MAC registers
8542
    hard_reset;
8543
    // reset MAC and MII LOGIC with soft reset
8544
    reset_mac;
8545
    reset_mii;
8546
    // set wb slave response
8547
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8548
 
8549
    max_tmp = 0;
8550
    min_tmp = 0;
8551
    num_of_frames = 0;
8552
    num_of_bd = 0;
8553
    // set 7 TX buffer descriptors - must be set before TX enable
8554
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8555
    // prepare a packet of MAXFL + 10 length
8556
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8557
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8558
    min_tmp = tmp[31:16];
8559
    // change MINFL value
8560
    min_tmp = max_tmp - 177;
8561
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8562
    st_data = 8'h62;
8563
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8564
    // enable TX, set full-duplex mode, padding and CRC appending
8565
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8566
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8567
    // check WB INT signal
8568
    if (wb_int !== 1'b0)
8569
    begin
8570
      test_fail("WB INT signal should not be set");
8571
      fail = fail + 1;
8572
    end
8573
 
8574
    // write to phy's control register for 10Mbps
8575
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8576
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8577
    speed = 10;
8578
 
8579
    i_length = (min_tmp - 5);
8580
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8581
    begin
8582
      $display("   i_length = %0d", i_length);
8583
      // Reset_tx_bd nable interrupt generation
8584
      // unmask interrupts
8585
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8586
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8587
      // not detect carrier sense in FD and no collision
8588
      eth_phy.carrier_sense_tx_fd_detect(0);
8589
      eth_phy.collision(0);
8590
      // first destination address on ethernet PHY
8591
      eth_phy.set_tx_mem_addr(0);
8592
      // prepare BDs
8593
      if (num_of_bd == 0)
8594
      begin
8595
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8596
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8597
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8598
        set_tx_bd_wrap(2);
8599
        set_tx_bd_ready(0, 0);
8600
      end
8601
      else if (num_of_bd == 1)
8602
        set_tx_bd_ready(1, 1);
8603
      else if (num_of_bd == 2)
8604
        set_tx_bd_ready(2, 2);
8605
      // CHECK END OF TRANSMITION
8606
      check_tx_bd(num_of_bd, data);
8607
        wait (MTxEn === 1'b1); // start transmit
8608
      check_tx_bd(num_of_bd, data);
8609
        if (data[15] !== 1)
8610
        begin
8611
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8612
          fail = fail + 1;
8613
        end
8614
        wait (MTxEn === 1'b0); // end transmit
8615
        while (data[15] === 1)
8616
        begin
8617
      check_tx_bd(num_of_bd, data);
8618
          @(posedge wb_clk);
8619
        end
8620
        repeat (1) @(posedge wb_clk);
8621
      // check length of a PACKET
8622
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8623
      tmp_len = eth_phy.tx_len;
8624
      #1;
8625
      if (tmp_len != (i_length + 4))
8626
      begin
8627
        test_fail("Wrong length of the packet out from MAC");
8628
        fail = fail + 1;
8629
      end
8630
      // checking packet
8631
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8632
      if (tmp > 0)
8633
      begin
8634
        test_fail("Wrong data of the transmitted packet");
8635
        fail = fail + 1;
8636
      end
8637
      // check transmited TX packet CRC
8638
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8639
      if (tmp > 0)
8640
      begin
8641
        test_fail("Wrong CRC of the transmitted packet");
8642
        fail = fail + 1;
8643
      end
8644
      // check WB INT signal
8645
      if (wb_int !== 1'b1)
8646
      begin
8647
        `TIME; $display("*E WB INT signal should be set");
8648
        test_fail("WB INT signal should be set");
8649
        fail = fail + 1;
8650
      end
8651
      // check TX buffer descriptor of a packet
8652
      check_tx_bd(num_of_bd, data);
8653
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8654
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8655
      begin
8656
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8657
        test_fail("TX buffer descriptor status is not correct");
8658
        fail = fail + 1;
8659
      end
8660
      // check interrupts
8661
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8662
      if ((data & `ETH_INT_TXB) !== 1'b1)
8663
      begin
8664
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8665
        test_fail("Interrupt Transmit Buffer was not set");
8666
        fail = fail + 1;
8667
      end
8668
      if ((data & (~`ETH_INT_TXB)) !== 0)
8669
      begin
8670
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8671
        test_fail("Other interrupts (except Transmit Buffer) were set");
8672
        fail = fail + 1;
8673
      end
8674
      // clear interrupts
8675
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8676
      // check WB INT signal
8677
      if (wb_int !== 1'b0)
8678
      begin
8679
        test_fail("WB INT signal should not be set");
8680
        fail = fail + 1;
8681
      end
8682
      // INTERMEDIATE DISPLAYS
8683
      if (num_of_bd == 0)
8684
        $display("    ->packet with length %0d sent", (i_length + 4));
8685
      else if (num_of_bd == 1)
8686
        $display("    ->packet with length %0d sent", (i_length + 4));
8687
      else if (num_of_bd == 2)
8688
        $display("    ->packet with length %0d sent", (i_length + 4));
8689
      // set length (loop variable)
8690
      i_length = i_length + 1;
8691
      // the number of frame transmitted
8692
      num_of_frames = num_of_frames + 1;
8693
      num_of_bd = num_of_bd + 1;
8694
      @(posedge wb_clk);
8695
    end
8696
    // disable TX
8697
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8698
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8699
    @(posedge wb_clk);
8700
    if(fail == 0)
8701
      test_ok;
8702
    else
8703
      fail = 0;
8704
  end
8705
 
8706
 
8707
  ////////////////////////////////////////////////////////////////////
8708
  ////                                                            ////
8709
  ////  Test transmit packets across changed MINFL value at       ////
8710
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
8711
  ////                                                            ////
8712
  ////////////////////////////////////////////////////////////////////
8713
  if (test_num == 15) // without and with padding
8714
  begin
8715
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
8716
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
8717
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
8718
 
8719
    // reset MAC registers
8720
    hard_reset;
8721
    // reset MAC and MII LOGIC with soft reset
8722
    reset_mac;
8723
    reset_mii;
8724
    // set wb slave response
8725
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8726
 
8727
    max_tmp = 0;
8728
    min_tmp = 0;
8729
    num_of_frames = 0;
8730
    num_of_bd = 0;
8731
    // set 7 TX buffer descriptors - must be set before TX enable
8732
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8733
    // prepare a packet of MAXFL + 10 length
8734
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8735
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8736
    min_tmp = tmp[31:16];
8737
    // change MINFL value
8738
    min_tmp = max_tmp - 177;
8739
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8740
    st_data = 8'h62;
8741
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8742
    // enable TX, set full-duplex mode, padding and CRC appending
8743
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8744
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8745
    // check WB INT signal
8746
    if (wb_int !== 1'b0)
8747
    begin
8748
      test_fail("WB INT signal should not be set");
8749
      fail = fail + 1;
8750
    end
8751
 
8752
    // write to phy's control register for 100Mbps
8753
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8754
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8755
    speed = 100;
8756
 
8757
    i_length = (min_tmp - 5);
8758
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8759
    begin
8760
      $display("   i_length = %0d", i_length);
8761
      // Reset_tx_bd nable interrupt generation
8762
      // unmask interrupts
8763
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8764
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8765
      // not detect carrier sense in FD and no collision
8766
      eth_phy.carrier_sense_tx_fd_detect(0);
8767
      eth_phy.collision(0);
8768
      // first destination address on ethernet PHY
8769
      eth_phy.set_tx_mem_addr(0);
8770
      // prepare BDs
8771
      if (num_of_bd == 0)
8772
      begin
8773
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8774
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8775
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8776
        set_tx_bd_wrap(2);
8777
        set_tx_bd_ready(0, 0);
8778
      end
8779
      else if (num_of_bd == 1)
8780
        set_tx_bd_ready(1, 1);
8781
      else if (num_of_bd == 2)
8782
        set_tx_bd_ready(2, 2);
8783
      // CHECK END OF TRANSMITION
8784
      check_tx_bd(num_of_bd, data);
8785
        wait (MTxEn === 1'b1); // start transmit
8786
      check_tx_bd(num_of_bd, data);
8787
        if (data[15] !== 1)
8788
        begin
8789
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8790
          fail = fail + 1;
8791
        end
8792
        wait (MTxEn === 1'b0); // end transmit
8793
        while (data[15] === 1)
8794
        begin
8795
      check_tx_bd(num_of_bd, data);
8796
          @(posedge wb_clk);
8797
        end
8798
        repeat (1) @(posedge wb_clk);
8799
      // check length of a PACKET
8800
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8801
      tmp_len = eth_phy.tx_len;
8802
      #1;
8803
      if (tmp_len != (i_length + 4))
8804
      begin
8805
        test_fail("Wrong length of the packet out from MAC");
8806
        fail = fail + 1;
8807
      end
8808
      // checking packet
8809
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8810
      if (tmp > 0)
8811
      begin
8812
        test_fail("Wrong data of the transmitted packet");
8813
        fail = fail + 1;
8814
      end
8815
      // check transmited TX packet CRC
8816
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8817
      if (tmp > 0)
8818
      begin
8819
        test_fail("Wrong CRC of the transmitted packet");
8820
        fail = fail + 1;
8821
      end
8822
      // check WB INT signal
8823
      if (wb_int !== 1'b1)
8824
      begin
8825
        `TIME; $display("*E WB INT signal should be set");
8826
        test_fail("WB INT signal should be set");
8827
        fail = fail + 1;
8828
      end
8829
      // check TX buffer descriptor of a packet
8830
      check_tx_bd(num_of_bd, data);
8831
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8832
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8833
      begin
8834
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8835
        test_fail("TX buffer descriptor status is not correct");
8836
        fail = fail + 1;
8837
      end
8838
      // check interrupts
8839
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8840
      if ((data & `ETH_INT_TXB) !== 1'b1)
8841
      begin
8842
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8843
        test_fail("Interrupt Transmit Buffer was not set");
8844
        fail = fail + 1;
8845
      end
8846
      if ((data & (~`ETH_INT_TXB)) !== 0)
8847
      begin
8848
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8849
        test_fail("Other interrupts (except Transmit Buffer) were set");
8850
        fail = fail + 1;
8851
      end
8852
      // clear interrupts
8853
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8854
      // check WB INT signal
8855
      if (wb_int !== 1'b0)
8856
      begin
8857
        test_fail("WB INT signal should not be set");
8858
        fail = fail + 1;
8859
      end
8860
      // INTERMEDIATE DISPLAYS
8861
      if (num_of_bd == 0)
8862
        $display("    ->packet with length %0d sent", (i_length + 4));
8863
      else if (num_of_bd == 1)
8864
        $display("    ->packet with length %0d sent", (i_length + 4));
8865
      else if (num_of_bd == 2)
8866
        $display("    ->packet with length %0d sent", (i_length + 4));
8867
      // set length (loop variable)
8868
      i_length = i_length + 1;
8869
      // the number of frame transmitted
8870
      num_of_frames = num_of_frames + 1;
8871
      num_of_bd = num_of_bd + 1;
8872
      @(posedge wb_clk);
8873
    end
8874
    // disable TX
8875
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8876
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8877
    @(posedge wb_clk);
8878
    if(fail == 0)
8879
      test_ok;
8880
    else
8881
      fail = 0;
8882
  end
8883
 
8884
 
8885
  ////////////////////////////////////////////////////////////////////
8886
  ////                                                            ////
8887
  ////  Test transmit packets across MAXFL with HUGEN at          ////
8888
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
8889
  ////                                                            ////
8890
  ////////////////////////////////////////////////////////////////////
8891
  if (test_num == 16) // without and with padding
8892
  begin
8893
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
8894
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
8895
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
8896
 
8897
    // reset MAC registers
8898
    hard_reset;
8899
    // reset MAC and MII LOGIC with soft reset
8900
    reset_mac;
8901
    reset_mii;
8902
    // set wb slave response
8903
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8904
 
8905
    max_tmp = 0;
8906
    min_tmp = 0;
8907
    num_of_frames = 0;
8908
    num_of_bd = 0;
8909
    // set 19 TX buffer descriptors - must be set before TX enable
8910
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8911
    // prepare a packet of 64k - 1 length (16'hFFFF)
8912
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8913
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8914
    min_tmp = tmp[31:16];
8915
    st_data = 8'h8D;
8916
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
8917
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
8918
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
8919
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8920
    // check WB INT signal
8921
    if (wb_int !== 1'b0)
8922
    begin
8923
      test_fail("WB INT signal should not be set");
8924
      fail = fail + 1;
8925
    end
8926
 
8927
    // write to phy's control register for 10Mbps
8928
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8929
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8930
    speed = 10;
8931
 
8932
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
8933
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
8934
    begin
8935
      $display("   i_length = %0d", i_length);
8936
      // Reset_tx_bd nable interrupt generation
8937
      // unmask interrupts
8938
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8939
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8940
      // not detect carrier sense in FD and no collision
8941
      eth_phy.carrier_sense_tx_fd_detect(0);
8942
      eth_phy.collision(0);
8943
      // first destination address on ethernet PHY
8944
      eth_phy.set_tx_mem_addr(0);
8945
      // prepare BDs
8946
      if (num_of_bd == 0)
8947
      begin
8948
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8949
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8950
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8951
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8952
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8953
        set_tx_bd_wrap(4);
8954
        set_tx_bd_ready(0, 0);
8955
      end
8956
      else if (num_of_bd == 1)
8957
        set_tx_bd_ready(1, 1);
8958
      else if (num_of_bd == 2)
8959
        set_tx_bd_ready(2, 2);
8960
      else if (num_of_bd == 3)
8961
        set_tx_bd_ready(3, 3);
8962
      else if (num_of_bd == 4)
8963
        set_tx_bd_ready(4, 4);
8964
      // CHECK END OF TRANSMITION
8965
      check_tx_bd(num_of_bd, data);
8966
        wait (MTxEn === 1'b1); // start transmit
8967
      check_tx_bd(num_of_bd, data);
8968
        if (data[15] !== 1)
8969
        begin
8970
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8971
          fail = fail + 1;
8972
        end
8973
        wait (MTxEn === 1'b0); // end transmit
8974
        while (data[15] === 1)
8975
        begin
8976
      check_tx_bd(num_of_bd, data);
8977
          @(posedge wb_clk);
8978
        end
8979
        repeat (1) @(posedge wb_clk);
8980
      // check length of a PACKET
8981
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8982
      tmp_len = eth_phy.tx_len;
8983
      #1;
8984
      if (tmp_len != (i_length + 4))
8985
      begin
8986
        test_fail("Wrong length of the packet out from MAC");
8987
        fail = fail + 1;
8988
      end
8989
      // checking packet
8990
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8991
      if (tmp > 0)
8992
      begin
8993
        test_fail("Wrong data of the transmitted packet");
8994
        fail = fail + 1;
8995
      end
8996
      // check transmited TX packet CRC
8997
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8998
      if (tmp > 0)
8999
      begin
9000
        test_fail("Wrong CRC of the transmitted packet");
9001
        fail = fail + 1;
9002
      end
9003
      // check WB INT signal
9004
      if (wb_int !== 1'b1)
9005
      begin
9006
        `TIME; $display("*E WB INT signal should be set");
9007
        test_fail("WB INT signal should be set");
9008
        fail = fail + 1;
9009
      end
9010
      // check TX buffer descriptor of a packet
9011
      check_tx_bd(num_of_bd, data);
9012
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9013
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9014
      begin
9015
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9016
        test_fail("TX buffer descriptor status is not correct");
9017
        fail = fail + 1;
9018
      end
9019
      // check interrupts
9020
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9021
      if ((data & `ETH_INT_TXB) !== 1'b1)
9022
      begin
9023
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9024
        test_fail("Interrupt Transmit Buffer was not set");
9025
        fail = fail + 1;
9026
      end
9027
      if ((data & (~`ETH_INT_TXB)) !== 0)
9028
      begin
9029
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9030
        test_fail("Other interrupts (except Transmit Buffer) were set");
9031
        fail = fail + 1;
9032
      end
9033
      // clear interrupts
9034
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9035
      // check WB INT signal
9036
      if (wb_int !== 1'b0)
9037
      begin
9038
        test_fail("WB INT signal should not be set");
9039
        fail = fail + 1;
9040
      end
9041
      // INTERMEDIATE DISPLAYS
9042
      $display("    ->packet with length %0d sent", (i_length + 4));
9043
      // set length (loop variable)
9044
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9045
        i_length = i_length + 1;
9046
      else if (num_of_bd == 2)
9047
        i_length = (16'hFFFF - 5);
9048
      // the number of frame transmitted
9049
      num_of_frames = num_of_frames + 1;
9050
      num_of_bd = num_of_bd + 1;
9051
      @(posedge wb_clk);
9052
    end
9053
    // disable TX
9054
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9055
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9056
    @(posedge wb_clk);
9057
    if(fail == 0)
9058
      test_ok;
9059
    else
9060
      fail = 0;
9061
  end
9062
 
9063
 
9064
  ////////////////////////////////////////////////////////////////////
9065
  ////                                                            ////
9066
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9067
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9068
  ////                                                            ////
9069
  ////////////////////////////////////////////////////////////////////
9070
  if (test_num == 17) // without and with padding
9071
  begin
9072
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9073
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9074
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9075
 
9076
    // reset MAC registers
9077
    hard_reset;
9078
    // reset MAC and MII LOGIC with soft reset
9079
    reset_mac;
9080
    reset_mii;
9081
    // set wb slave response
9082
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9083
 
9084
    max_tmp = 0;
9085
    min_tmp = 0;
9086
    num_of_frames = 0;
9087
    num_of_bd = 0;
9088
    // set 19 TX buffer descriptors - must be set before TX enable
9089
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9090
    // prepare a packet of 64k - 1 length (16'hFFFF)
9091
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9092
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9093
    min_tmp = tmp[31:16];
9094
    st_data = 8'h8D;
9095
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9096
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9097
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9098
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9099
    // check WB INT signal
9100
    if (wb_int !== 1'b0)
9101
    begin
9102
      test_fail("WB INT signal should not be set");
9103
      fail = fail + 1;
9104
    end
9105
 
9106
    // write to phy's control register for 100Mbps
9107
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9108
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9109
    speed = 100;
9110
 
9111
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9112
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9113
    begin
9114
      $display("   i_length = %0d", i_length);
9115
      // Reset_tx_bd nable interrupt generation
9116
      // unmask interrupts
9117
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9118
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9119
      // not detect carrier sense in FD and no collision
9120
      eth_phy.carrier_sense_tx_fd_detect(0);
9121
      eth_phy.collision(0);
9122
      // first destination address on ethernet PHY
9123
      eth_phy.set_tx_mem_addr(0);
9124
      // prepare BDs
9125
      if (num_of_bd == 0)
9126
      begin
9127
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9128
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9129
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9130
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9131
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9132
        set_tx_bd_wrap(4);
9133
        set_tx_bd_ready(0, 0);
9134
      end
9135
      else if (num_of_bd == 1)
9136
        set_tx_bd_ready(1, 1);
9137
      else if (num_of_bd == 2)
9138
        set_tx_bd_ready(2, 2);
9139
      else if (num_of_bd == 3)
9140
        set_tx_bd_ready(3, 3);
9141
      else if (num_of_bd == 4)
9142
        set_tx_bd_ready(4, 4);
9143
      // CHECK END OF TRANSMITION
9144
      check_tx_bd(num_of_bd, data);
9145
        wait (MTxEn === 1'b1); // start transmit
9146
      check_tx_bd(num_of_bd, data);
9147
        if (data[15] !== 1)
9148
        begin
9149
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9150
          fail = fail + 1;
9151
        end
9152
        wait (MTxEn === 1'b0); // end transmit
9153
        while (data[15] === 1)
9154
        begin
9155
      check_tx_bd(num_of_bd, data);
9156
          @(posedge wb_clk);
9157
        end
9158
        repeat (1) @(posedge wb_clk);
9159
      // check length of a PACKET
9160
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9161
      tmp_len = eth_phy.tx_len;
9162
      #1;
9163
      if (tmp_len != (i_length + 4))
9164
      begin
9165
        test_fail("Wrong length of the packet out from MAC");
9166
        fail = fail + 1;
9167
      end
9168
      // checking packet
9169
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9170
      if (tmp > 0)
9171
      begin
9172
        test_fail("Wrong data of the transmitted packet");
9173
        fail = fail + 1;
9174
      end
9175
      // check transmited TX packet CRC
9176
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9177
      if (tmp > 0)
9178
      begin
9179
        test_fail("Wrong CRC of the transmitted packet");
9180
        fail = fail + 1;
9181
      end
9182
      // check WB INT signal
9183
      if (wb_int !== 1'b1)
9184
      begin
9185
        `TIME; $display("*E WB INT signal should be set");
9186
        test_fail("WB INT signal should be set");
9187
        fail = fail + 1;
9188
      end
9189
      // check TX buffer descriptor of a packet
9190
      check_tx_bd(num_of_bd, data);
9191
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9192
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9193
      begin
9194
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9195
        test_fail("TX buffer descriptor status is not correct");
9196
        fail = fail + 1;
9197
      end
9198
      // check interrupts
9199
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9200
      if ((data & `ETH_INT_TXB) !== 1'b1)
9201
      begin
9202
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9203
        test_fail("Interrupt Transmit Buffer was not set");
9204
        fail = fail + 1;
9205
      end
9206
      if ((data & (~`ETH_INT_TXB)) !== 0)
9207
      begin
9208
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9209
        test_fail("Other interrupts (except Transmit Buffer) were set");
9210
        fail = fail + 1;
9211
      end
9212
      // clear interrupts
9213
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9214
      // check WB INT signal
9215
      if (wb_int !== 1'b0)
9216
      begin
9217
        test_fail("WB INT signal should not be set");
9218
        fail = fail + 1;
9219
      end
9220
      // INTERMEDIATE DISPLAYS
9221
      $display("    ->packet with length %0d sent", (i_length + 4));
9222
      // set length (loop variable)
9223
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9224
        i_length = i_length + 1;
9225
      else if (num_of_bd == 2)
9226
        i_length = (16'hFFFF - 5);
9227
      // the number of frame transmitted
9228
      num_of_frames = num_of_frames + 1;
9229
      num_of_bd = num_of_bd + 1;
9230
      @(posedge wb_clk);
9231
    end
9232
    // disable TX
9233
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9234
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9235
    @(posedge wb_clk);
9236
    if(fail == 0)
9237
      test_ok;
9238
    else
9239
      fail = 0;
9240
  end
9241
 
9242
 
9243
  ////////////////////////////////////////////////////////////////////
9244
  ////                                                            ////
9245
  ////  Test IPG during Back-to-Back transmit at                  ////
9246
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9247
  ////                                                            ////
9248
  ////////////////////////////////////////////////////////////////////
9249
  if (test_num == 18) // without and with padding
9250
  begin
9251
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9252
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9253
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9254
 
9255
    // reset MAC registers
9256
    hard_reset;
9257
    // reset MAC and MII LOGIC with soft reset
9258
    reset_mac;
9259
    reset_mii;
9260
    // set wb slave response
9261
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9262
 
9263
    max_tmp = 0;
9264
    min_tmp = 0;
9265
    num_of_frames = 0;
9266
    num_of_bd = 0;
9267
    tmp_ipgt = 0;
9268
    // set 88 TX buffer descriptors - must be set before TX enable
9269
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9270
    // enable TX, set full-duplex mode, NO padding and CRC appending
9271
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9272
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9273
    // prepare two packets of MAXFL length
9274
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9275
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9276
    min_tmp = tmp[31:16];
9277
    st_data = 8'h29;
9278
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9279
    // check WB INT signal
9280
    if (wb_int !== 1'b0)
9281
    begin
9282
      test_fail("WB INT signal should not be set");
9283
      fail = fail + 1;
9284
    end
9285
 
9286
    // write to phy's control register for 10Mbps
9287
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9288
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9289
    speed = 10;
9290
 
9291
    i_length = (min_tmp - 4);
9292
    while (i_length < (max_tmp - 4))
9293
    begin
9294
      // disable TX, set full-duplex mode, NO padding and CRC appending
9295
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9296
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9297
      // set IPGT register
9298
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9299
      // enable TX, set full-duplex mode, NO padding and CRC appending
9300
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9301
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9302
      // Reset_tx_bd enable interrupt generation
9303
      // unmask interrupts
9304
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9305
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9306
      // not detect carrier sense in FD and no collision
9307
      eth_phy.carrier_sense_tx_fd_detect(0);
9308
      eth_phy.collision(0);
9309
      // first destination address on ethernet PHY
9310
      eth_phy.set_tx_mem_addr(0);
9311
      // prepare BDs
9312
      if (num_of_bd == 0)
9313
      begin
9314
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9315
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9316
        set_tx_bd_wrap(1);
9317
        set_tx_bd_ready(0, 0);
9318
        set_tx_bd_ready(1, 1);
9319
      end
9320
      // CHECK END OF TWO TRANSMITIONs
9321
      // wait for first transmit to end
9322
      check_tx_bd(num_of_bd, data);
9323
      wait (MTxEn === 1'b1); // start transmit
9324
      if (data[15] !== 1)
9325
      begin
9326
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9327
        fail = fail + 1;
9328
      end
9329
      wait (MTxEn === 1'b0); // end transmit
9330
      num_of_frames = num_of_frames + 1;
9331
      num_of_bd = num_of_bd + 1;
9332
      #Tp;
9333
      // destination address on ethernet PHY
9334
      eth_phy.set_tx_mem_addr(0);
9335
      i1 = 0;
9336
      i2 = 0;
9337
      // count IPG clock periods
9338
      fork
9339
        begin
9340
          wait (MTxEn === 1'b1); // start second transmit
9341
          #Tp;
9342
          disable count_rising;
9343
          disable count_falling;
9344
        end
9345
        begin: count_rising
9346
          forever
9347
          begin
9348
            @(posedge mtx_clk);
9349
            i1 = i1 + 1;
9350
            #Tp;
9351
          end
9352
        end
9353
        begin: count_falling
9354
          forever
9355
          begin
9356
            @(negedge mtx_clk);
9357
            i2 = i2 + 1;
9358
            #Tp;
9359
          end
9360
        end
9361
      join
9362
      // check IPG length - INTERMEDIATE DISPLAYS
9363
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9364
      begin
9365
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9366
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9367
      end
9368
      else
9369
      begin
9370
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9371
        fail = fail + 1;
9372
        test_fail("IPG is not correct");
9373
      end
9374
      // wait for second transmit to end
9375
      wait (MTxEn === 1'b0); // end second transmit
9376
      while (data[15] === 1)
9377
      begin
9378
        check_tx_bd(num_of_bd, data);
9379
        @(posedge wb_clk);
9380
      end
9381
      repeat (1) @(posedge wb_clk);
9382
      // check length of a second PACKET
9383
      tmp_len = eth_phy.tx_len;
9384
      #1;
9385
      if (tmp_len != (i_length + 4 + 1))
9386
      begin
9387
        test_fail("Wrong length of second packet out from MAC");
9388
        fail = fail + 1;
9389
      end
9390
      // checking second packet
9391
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9392
      if (tmp > 0)
9393
      begin
9394
        test_fail("Wrong data of second transmitted packet");
9395
        fail = fail + 1;
9396
      end
9397
      // check second transmited TX packet CRC
9398
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9399
      if (tmp > 0)
9400
      begin
9401
        test_fail("Wrong CRC of second transmitted packet");
9402
        fail = fail + 1;
9403
      end
9404
      // check WB INT signal
9405
      if (wb_int !== 1'b1)
9406
      begin
9407
        `TIME; $display("*E WB INT signal should be set");
9408
        test_fail("WB INT signal should be set");
9409
        fail = fail + 1;
9410
      end
9411
      // check TX buffer descriptor of a packet
9412
      check_tx_bd(num_of_bd, data);
9413
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9414
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9415
      begin
9416
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9417
        test_fail("TX buffer descriptor status is not correct");
9418
        fail = fail + 1;
9419
      end
9420
      // check interrupts
9421
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9422
      if ((data & `ETH_INT_TXB) !== 1'b1)
9423
      begin
9424
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9425
        test_fail("Interrupt Transmit Buffer was not set");
9426
        fail = fail + 1;
9427
      end
9428
      if ((data & (~`ETH_INT_TXB)) !== 0)
9429
      begin
9430
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9431
        test_fail("Other interrupts (except Transmit Buffer) were set");
9432
        fail = fail + 1;
9433
      end
9434
      // clear interrupts
9435
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9436
      // check WB INT signal
9437
      if (wb_int !== 1'b0)
9438
      begin
9439
        test_fail("WB INT signal should not be set");
9440
        fail = fail + 1;
9441
      end
9442
      // set length (LOOP variable)
9443
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9444
        i_length = i_length + 2;
9445
      else
9446
        i_length = (max_tmp - 4);
9447
      // set IPGT
9448
      if ((tmp_ipgt + 3) < 10)
9449
        tmp_ipgt = tmp_ipgt + 1;
9450
      else if ((tmp_ipgt + 3) < 24)
9451
        tmp_ipgt = tmp_ipgt + 7;
9452
      else if ((tmp_ipgt + 3) == 24)
9453
        tmp_ipgt = 38 - 3;
9454
      else if ((tmp_ipgt + 3) == 38)
9455
        tmp_ipgt = 72 - 3;
9456
      else if ((tmp_ipgt + 3) == 72)
9457
        tmp_ipgt = 130 - 3; // 124 - 3
9458
      // the number of frame transmitted
9459
      num_of_frames = num_of_frames + 1;
9460
      num_of_bd = 0;
9461
      @(posedge wb_clk);
9462
    end
9463
    // disable TX
9464
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9465
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9466
    @(posedge wb_clk);
9467
    if(fail == 0)
9468
      test_ok;
9469
    else
9470
      fail = 0;
9471
  end
9472
 
9473
 
9474
  ////////////////////////////////////////////////////////////////////
9475
  ////                                                            ////
9476
  ////  Test IPG during Back-to-Back transmit at                  ////
9477
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9478
  ////                                                            ////
9479
  ////////////////////////////////////////////////////////////////////
9480
  if (test_num == 19) // without and with padding
9481
  begin
9482
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9483
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9484
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9485
 
9486
    // reset MAC registers
9487
    hard_reset;
9488
    // reset MAC and MII LOGIC with soft reset
9489
    reset_mac;
9490
    reset_mii;
9491
    // set wb slave response
9492
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9493
 
9494
    max_tmp = 0;
9495
    min_tmp = 0;
9496
    num_of_frames = 0;
9497
    num_of_bd = 0;
9498
    tmp_ipgt = 0;
9499
    // set 88 TX buffer descriptors - must be set before TX enable
9500
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9501
    // enable TX, set full-duplex mode, NO padding and CRC appending
9502
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9503
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9504
    // prepare two packets of MAXFL length
9505
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9506
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9507
    min_tmp = tmp[31:16];
9508
    st_data = 8'h29;
9509
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9510
    // check WB INT signal
9511
    if (wb_int !== 1'b0)
9512
    begin
9513
      test_fail("WB INT signal should not be set");
9514
      fail = fail + 1;
9515
    end
9516
 
9517
    // write to phy's control register for 100Mbps
9518
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9519
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9520
    speed = 100;
9521
 
9522
    i_length = (min_tmp - 4);
9523
    while (i_length < (max_tmp - 4))
9524
    begin
9525
      // disable TX, set full-duplex mode, NO padding and CRC appending
9526
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9527
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9528
      // set IPGT register
9529
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9530
      // enable TX, set full-duplex mode, NO padding and CRC appending
9531
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9532
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9533
      // Reset_tx_bd enable interrupt generation
9534
      // unmask interrupts
9535
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9536
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9537
      // not detect carrier sense in FD and no collision
9538
      eth_phy.carrier_sense_tx_fd_detect(0);
9539
      eth_phy.collision(0);
9540
      // first destination address on ethernet PHY
9541
      eth_phy.set_tx_mem_addr(0);
9542
      // prepare BDs
9543
      if (num_of_bd == 0)
9544
      begin
9545
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9546
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9547
        set_tx_bd_wrap(1);
9548
        set_tx_bd_ready(0, 0);
9549
        set_tx_bd_ready(1, 1);
9550
      end
9551
      // CHECK END OF TWO TRANSMITIONs
9552
      // wait for first transmit to end
9553
      check_tx_bd(num_of_bd, data);
9554
      wait (MTxEn === 1'b1); // start transmit
9555
      if (data[15] !== 1)
9556
      begin
9557
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9558
        fail = fail + 1;
9559
      end
9560
      wait (MTxEn === 1'b0); // end transmit
9561
      num_of_frames = num_of_frames + 1;
9562
      num_of_bd = num_of_bd + 1;
9563
      #Tp;
9564
      // destination address on ethernet PHY
9565
      eth_phy.set_tx_mem_addr(0);
9566
      i1 = 0;
9567
      i2 = 0;
9568
      // count IPG clock periods
9569
      fork
9570
        begin
9571
          wait (MTxEn === 1'b1); // start second transmit
9572
          #Tp;
9573
          disable count_rising1;
9574
          disable count_falling1;
9575
        end
9576
        begin: count_rising1
9577
          forever
9578
          begin
9579
            @(posedge mtx_clk);
9580
            i1 = i1 + 1;
9581
            #Tp;
9582
          end
9583
        end
9584
        begin: count_falling1
9585
          forever
9586
          begin
9587
            @(negedge mtx_clk);
9588
            i2 = i2 + 1;
9589
            #Tp;
9590
          end
9591
        end
9592
      join
9593
      // check IPG length - INTERMEDIATE DISPLAYS
9594
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9595
      begin
9596
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9597
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9598
      end
9599
      else
9600
      begin
9601
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9602
        fail = fail + 1;
9603
        test_fail("IPG is not correct");
9604
      end
9605
      // wait for second transmit to end
9606
      wait (MTxEn === 1'b0); // end second transmit
9607
      while (data[15] === 1)
9608
      begin
9609
        check_tx_bd(num_of_bd, data);
9610
        @(posedge wb_clk);
9611
      end
9612
      repeat (1) @(posedge wb_clk);
9613
      // check length of a second PACKET
9614
      tmp_len = eth_phy.tx_len;
9615
      #1;
9616
      if (tmp_len != (i_length + 4 + 1))
9617
      begin
9618
        test_fail("Wrong length of second packet out from MAC");
9619
        fail = fail + 1;
9620
      end
9621
      // checking second packet
9622
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9623
      if (tmp > 0)
9624
      begin
9625
        test_fail("Wrong data of second transmitted packet");
9626
        fail = fail + 1;
9627
      end
9628
      // check second transmited TX packet CRC
9629
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9630
      if (tmp > 0)
9631
      begin
9632
        test_fail("Wrong CRC of second transmitted packet");
9633
        fail = fail + 1;
9634
      end
9635
      // check WB INT signal
9636
      if (wb_int !== 1'b1)
9637
      begin
9638
        `TIME; $display("*E WB INT signal should be set");
9639
        test_fail("WB INT signal should be set");
9640
        fail = fail + 1;
9641
      end
9642
      // check TX buffer descriptor of a packet
9643
      check_tx_bd(num_of_bd, data);
9644
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9645
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9646
      begin
9647
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9648
        test_fail("TX buffer descriptor status is not correct");
9649
        fail = fail + 1;
9650
      end
9651
      // check interrupts
9652
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9653
      if ((data & `ETH_INT_TXB) !== 1'b1)
9654
      begin
9655
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9656
        test_fail("Interrupt Transmit Buffer was not set");
9657
        fail = fail + 1;
9658
      end
9659
      if ((data & (~`ETH_INT_TXB)) !== 0)
9660
      begin
9661
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9662
        test_fail("Other interrupts (except Transmit Buffer) were set");
9663
        fail = fail + 1;
9664
      end
9665
      // clear interrupts
9666
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9667
      // check WB INT signal
9668
      if (wb_int !== 1'b0)
9669
      begin
9670
        test_fail("WB INT signal should not be set");
9671
        fail = fail + 1;
9672
      end
9673
      // set length (LOOP variable)
9674
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9675
        i_length = i_length + 2;
9676
      else
9677
        i_length = (max_tmp - 4);
9678
      // set IPGT
9679
      if ((tmp_ipgt + 3) < 10)
9680
        tmp_ipgt = tmp_ipgt + 1;
9681
      else if ((tmp_ipgt + 3) < 24)
9682
        tmp_ipgt = tmp_ipgt + 7;
9683
      else if ((tmp_ipgt + 3) == 24)
9684
        tmp_ipgt = 38 - 3;
9685
      else if ((tmp_ipgt + 3) == 38)
9686
        tmp_ipgt = 72 - 3;
9687
      else if ((tmp_ipgt + 3) == 72)
9688
        tmp_ipgt = 130 - 3; // 124 - 3
9689
      // the number of frame transmitted
9690
      num_of_frames = num_of_frames + 1;
9691
      num_of_bd = 0;
9692
      @(posedge wb_clk);
9693
    end
9694
    // disable TX
9695
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9696
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9697
    @(posedge wb_clk);
9698
    if(fail == 0)
9699
      test_ok;
9700
    else
9701
      fail = 0;
9702
  end
9703
 
9704
 
9705
  ////////////////////////////////////////////////////////////////////
9706
  ////                                                            ////
9707
  ////  Test transmit packets after TX under-run on each packet's ////
9708
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
9709
  ////                                                            ////
9710
  ////////////////////////////////////////////////////////////////////
9711
  if (test_num == 20) // without padding
9712
  begin
9713
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
9714
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
9715
    `TIME;
9716
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
9717
 
9718
    // reset MAC registers
9719
    hard_reset;
9720
    // reset MAC and MII LOGIC with soft reset
9721
    reset_mac;
9722
    reset_mii;
9723
    // set wb slave response
9724
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9725
 
9726
    max_tmp = 0;
9727
    min_tmp = 0;
9728
    // set 2 TX buffer descriptors - must be set before TX enable
9729
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9730
    // enable TX, set full-duplex mode, NO padding and CRC appending
9731
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9732
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9733
    // prepare a packet of MAXFL length
9734
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9735
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9736
    min_tmp = tmp[31:16];
9737
    st_data = 8'h99;
9738
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9739
    // read IPG value
9740
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9741
    // check WB INT signal
9742
    if (wb_int !== 1'b0)
9743
    begin
9744
      test_fail("WB INT signal should not be set");
9745
      fail = fail + 1;
9746
    end
9747
 
9748
    // write to phy's control register for 10Mbps
9749
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9750
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9751
    speed = 10;
9752
 
9753 223 tadejm
    num_of_frames = 40; // (0..3) => start under-run on first word
9754 209 tadejm
    num_of_bd = 0;
9755
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
9756
    i_length = (min_tmp + 4);
9757
    while (i_length < (max_tmp - 4))
9758
    begin
9759
      // Reset_tx_bd enable interrupt generation
9760
      // unmask interrupts
9761
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9762
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9763
      // not detect carrier sense in FD and no collision
9764
      eth_phy.carrier_sense_tx_fd_detect(0);
9765
      eth_phy.collision(0);
9766
      // first destination address on ethernet PHY
9767
      eth_phy.set_tx_mem_addr(0);
9768
      // prepare BDs
9769
      if (num_of_bd == 0)
9770
      begin
9771
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
9772
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9773
        set_tx_bd_wrap(1);
9774
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9775
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9776 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9777 209 tadejm
        set_tx_bd_ready(1, 1);
9778
        set_tx_bd_ready(0, 0);
9779
      end
9780
      // frame under-run checking
9781
      frame_started = 0;
9782
      frame_ended = 0;
9783
      wait_for_frame = 0;
9784
      fork
9785
        begin
9786
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
9787
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
9788
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
9789
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
9790
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9791
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9792 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
9793 209 tadejm
          // wait for synchronization and some additional clocks
9794
          wait_for_frame = 1;
9795
          // wait for frame
9796
          wait ((wait_for_frame == 0) || (frame_started == 1))
9797
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
9798
          begin
9799
            disable check_fr;
9800
          end
9801
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
9802
          begin
9803
            disable wait_fr;
9804
            wait (frame_ended == 1);
9805
          end
9806
          repeat (2) @(posedge wb_clk);
9807
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9808
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9809 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9810 209 tadejm
        end
9811
        begin: wait_fr
9812
          wait (wait_for_frame == 1)
9813
          begin
9814
            // wait for synchronization and some additional clocks
9815
            repeat (3) @(posedge wb_clk);
9816
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
9817
            repeat (2) @(posedge wb_clk);
9818
            repeat (2) @(posedge mtx_clk);
9819
            wait_for_frame = 0;
9820
          end
9821
        end
9822
        begin: check_fr
9823
          // wait for frame to start
9824
          @(posedge MTxEn);
9825
          frame_started = 1;
9826 223 tadejm
`TIME; $display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
9827 209 tadejm
          // wait for frame to end due to under-run
9828
          @(negedge MTxEn);
9829
          frame_ended = 1;
9830 223 tadejm
`TIME; $display("  Under-run frame ended");
9831 209 tadejm
        end
9832
      join
9833
      // wait for first transmit to end, if under-run didn't happen
9834
      if (frame_ended == 0)
9835
      begin
9836
        // WAIT FOR FIRST TRANSMIT
9837
        check_tx_bd(num_of_bd, data);
9838
        wait (MTxEn === 1'b1); // start first transmit
9839
        if (data[15] !== 1)
9840
        begin
9841
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9842
          fail = fail + 1;
9843
        end
9844
        wait (MTxEn === 1'b0); // end first transmit
9845
        while (data[15] === 1)
9846
        begin
9847
          check_tx_bd(num_of_bd, data);
9848
          @(posedge wb_clk);
9849
        end
9850
        repeat (1) @(posedge wb_clk);
9851
        // CHECK FIRST FRAME
9852
        // check length of a first PACKET
9853
        tmp_len = eth_phy.tx_len;
9854
        #1;
9855
        if (tmp_len != (i_length + 4))
9856
        begin
9857 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
9858
          test_fail("Wrong length of first packet out from MAC");
9859 209 tadejm
          fail = fail + 1;
9860
        end
9861
        // checking first packet
9862
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
9863
        if (tmp > 0)
9864
        begin
9865 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
9866
          test_fail("Wrong data of first transmitted packet");
9867 209 tadejm
          fail = fail + 1;
9868
        end
9869
        // check first transmited TX packet CRC
9870
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
9871
        if (tmp > 0)
9872
        begin
9873 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
9874
          test_fail("Wrong CRC of first transmitted packet");
9875 209 tadejm
          fail = fail + 1;
9876
        end
9877
        // check WB INT signal
9878
        if (wb_int !== 1'b1)
9879
        begin
9880
          `TIME; $display("*E WB INT signal should be set");
9881
          test_fail("WB INT signal should be set");
9882
          fail = fail + 1;
9883
        end
9884
        // check TX buffer descriptor of a packet
9885
        check_tx_bd(num_of_bd, data);
9886
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9887
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9888
        begin
9889
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9890
          test_fail("TX buffer descriptor status is not correct");
9891
          fail = fail + 1;
9892
        end
9893
        // check interrupts
9894
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9895
        if ((data & `ETH_INT_TXB) !== 1'b1)
9896
        begin
9897
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9898
          test_fail("Interrupt Transmit Buffer was not set");
9899
          fail = fail + 1;
9900
        end
9901
        if ((data & (~`ETH_INT_TXB)) !== 0)
9902
        begin
9903
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9904
          test_fail("Other interrupts (except Transmit Buffer) were set");
9905
          fail = fail + 1;
9906
        end
9907
        // clear interrupts
9908
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9909
        // check WB INT signal
9910
        if (wb_int !== 1'b0)
9911
        begin
9912
          test_fail("WB INT signal should not be set");
9913
          fail = fail + 1;
9914
        end
9915
      end
9916 223 tadejm
      else
9917
      begin
9918
        // CHECK FIRST FRAME
9919
        // check length of a first PACKET
9920
        tmp_len = eth_phy.tx_len_err;
9921
        #1;
9922
        if (tmp_len != (num_of_frames + (4 - i_data)))
9923
        begin
9924
          `TIME; $display("*E Wrong length of first packet out from MAC");
9925
          test_fail("Wrong length of first packet out from MAC");
9926
          fail = fail + 1;
9927
        end
9928
        // checking first packet
9929
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
9930
        if (tmp > 0)
9931
        begin
9932
          `TIME; $display("*E Wrong data of first transmitted packet");
9933
          test_fail("Wrong data of first transmitted packet");
9934
          fail = fail + 1;
9935
        end
9936
        // check WB INT signal
9937
        if (wb_int !== 1'b1)
9938
        begin
9939
          `TIME; $display("*E WB INT signal should be set");
9940
          test_fail("WB INT signal should be set");
9941
          fail = fail + 1;
9942
        end
9943
        // check TX buffer descriptor of a packet
9944
        check_tx_bd(num_of_bd, data);
9945
        if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
9946
             ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
9947
        begin
9948
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9949
          test_fail("TX buffer descriptor status is not correct");
9950
          fail = fail + 1;
9951
        end
9952
        // check interrupts
9953
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9954
        if ((data & `ETH_INT_TXE) !== 2'b10)
9955
        begin
9956
          `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
9957
          test_fail("Interrupt Transmit Buffer was not set");
9958
          fail = fail + 1;
9959
        end
9960
        if ((data & (~`ETH_INT_TXE)) !== 0)
9961
        begin
9962
          `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
9963
          test_fail("Other interrupts (except Transmit Buffer) were set");
9964
          fail = fail + 1;
9965
        end
9966
        // clear interrupts
9967
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9968
        // check WB INT signal
9969
        if (wb_int !== 1'b0)
9970
        begin
9971
          test_fail("WB INT signal should not be set");
9972
          fail = fail + 1;
9973
        end
9974
      end
9975 209 tadejm
      num_of_bd = num_of_bd + 1;
9976
      // destination address on ethernet PHY
9977
      eth_phy.set_tx_mem_addr(0);
9978 223 tadejm
      // WAIT FOR SECOND TRANSMIT
9979 209 tadejm
      check_tx_bd(num_of_bd, data);
9980
      wait (MTxEn === 1'b1); // start first transmit
9981
      if (data[15] !== 1)
9982
      begin
9983
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9984
        fail = fail + 1;
9985
      end
9986
      wait (MTxEn === 1'b0); // end first transmit
9987
      while (data[15] === 1)
9988
      begin
9989
        check_tx_bd(num_of_bd, data);
9990
        @(posedge wb_clk);
9991
      end
9992
      repeat (1) @(posedge wb_clk);
9993
      // CHECK SECOND FRAME
9994
      // check length of a second PACKET
9995 223 tadejm
if (frame_ended == 1'b1)
9996
begin
9997
`TIME; $display("  Second frame after under-run ended");
9998
end
9999 209 tadejm
      tmp_len = eth_phy.tx_len;
10000
      #1;
10001
      if (tmp_len != (i_length + 4))
10002
      begin
10003 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10004 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10005
        fail = fail + 1;
10006
      end
10007
      // checking second packet
10008
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10009
      if (tmp > 0)
10010
      begin
10011 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10012 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10013
        fail = fail + 1;
10014
      end
10015
      // check second transmited TX packet CRC
10016
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10017
      if (tmp > 0)
10018
      begin
10019 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10020 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10021
        fail = fail + 1;
10022
      end
10023
      // check WB INT signal
10024
      if (wb_int !== 1'b1)
10025
      begin
10026
        `TIME; $display("*E WB INT signal should be set");
10027
        test_fail("WB INT signal should be set");
10028
        fail = fail + 1;
10029
      end
10030
      // check TX buffer descriptor of a packet
10031
      check_tx_bd(num_of_bd, data);
10032
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10033
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10034
      begin
10035
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10036
        test_fail("TX buffer descriptor status is not correct");
10037
        fail = fail + 1;
10038
      end
10039
      // check interrupts
10040
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10041
      if ((data & `ETH_INT_TXB) !== 1'b1)
10042
      begin
10043
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10044
        test_fail("Interrupt Transmit Buffer was not set");
10045
        fail = fail + 1;
10046
      end
10047
      if ((data & (~`ETH_INT_TXB)) !== 0)
10048
      begin
10049
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10050
        test_fail("Other interrupts (except Transmit Buffer) were set");
10051
        fail = fail + 1;
10052
      end
10053
      // clear interrupts
10054
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10055
      // check WB INT signal
10056
      if (wb_int !== 1'b0)
10057
      begin
10058
        test_fail("WB INT signal should not be set");
10059
        fail = fail + 1;
10060
      end
10061
      // set initial value
10062
      i_data = i_data - 1;
10063
      // the number of frame transmitted
10064
      num_of_frames = num_of_frames + 1;
10065
      num_of_bd = 0;
10066
      // set length (LOOP variable)
10067 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10068 209 tadejm
        i_length = (max_tmp - 4);
10069
      @(posedge wb_clk);
10070
    end
10071
    // disable TX
10072
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10073
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10074
    @(posedge wb_clk);
10075
    if(fail == 0)
10076
      test_ok;
10077
    else
10078
      fail = 0;
10079
  end
10080
 
10081
 
10082
  ////////////////////////////////////////////////////////////////////
10083
  ////                                                            ////
10084
  ////  Test transmit packets after TX under-run on each packet's ////
10085
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10086
  ////                                                            ////
10087
  ////////////////////////////////////////////////////////////////////
10088
  if (test_num == 21) // without padding
10089
  begin
10090
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10091
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10092
    `TIME;
10093
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10094
 
10095
    // reset MAC registers
10096
    hard_reset;
10097
    // reset MAC and MII LOGIC with soft reset
10098
    reset_mac;
10099
    reset_mii;
10100
    // set wb slave response
10101
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10102
 
10103
    max_tmp = 0;
10104
    min_tmp = 0;
10105
    // set 2 TX buffer descriptors - must be set before TX enable
10106
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10107
    // enable TX, set full-duplex mode, NO padding and CRC appending
10108
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10109
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10110
    // prepare a packet of MAXFL length
10111
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10112
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10113
    min_tmp = tmp[31:16];
10114
    st_data = 8'h99;
10115
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10116
    // read IPG value
10117
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10118
    // check WB INT signal
10119
    if (wb_int !== 1'b0)
10120
    begin
10121
      test_fail("WB INT signal should not be set");
10122
      fail = fail + 1;
10123
    end
10124
 
10125
    // write to phy's control register for 100Mbps
10126
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10127
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10128
    speed = 100;
10129
 
10130
    num_of_frames = 0; // (0..3) => start under-run on first word
10131
    num_of_bd = 0;
10132
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10133
    i_length = (min_tmp + 4);
10134
    while (i_length < (max_tmp - 4))
10135
    begin
10136
      // Reset_tx_bd enable interrupt generation
10137
      // unmask interrupts
10138
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10139
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10140
      // not detect carrier sense in FD and no collision
10141
      eth_phy.carrier_sense_tx_fd_detect(0);
10142
      eth_phy.collision(0);
10143
      // first destination address on ethernet PHY
10144
      eth_phy.set_tx_mem_addr(0);
10145
      // prepare BDs
10146
      if (num_of_bd == 0)
10147
      begin
10148
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10149
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10150
        set_tx_bd_wrap(1);
10151
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10152
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10153
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10154
        set_tx_bd_ready(1, 1);
10155
        set_tx_bd_ready(0, 0);
10156
      end
10157
      // frame under-run checking
10158
      frame_started = 0;
10159
      frame_ended = 0;
10160
      wait_for_frame = 0;
10161
      fork
10162
        begin
10163
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10164
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10165
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
10166
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
10167
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10168
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10169
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h7, 8'hFF);
10170
          // wait for synchronization and some additional clocks
10171
          wait_for_frame = 1;
10172
          // wait for frame
10173
          wait ((wait_for_frame == 0) || (frame_started == 1))
10174
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10175
          begin
10176
            disable check_fr1;
10177
          end
10178
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10179
          begin
10180
            disable wait_fr1;
10181
            wait (frame_ended == 1);
10182
          end
10183
          repeat (2) @(posedge wb_clk);
10184
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10185
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10186
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10187
        end
10188
        begin: wait_fr1
10189
          wait (wait_for_frame == 1)
10190
          begin
10191
            // wait for synchronization and some additional clocks
10192
            repeat (3) @(posedge wb_clk);
10193
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10194
            repeat (2) @(posedge wb_clk);
10195
            repeat (2) @(posedge mtx_clk);
10196
            wait_for_frame = 0;
10197
          end
10198
        end
10199
        begin: check_fr1
10200
          // wait for frame to start
10201
          @(posedge MTxEn);
10202
          frame_started = 1;
10203
$display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
10204
          // wait for frame to end due to under-run
10205
          @(negedge MTxEn);
10206
          frame_ended = 1;
10207
$display("  Under-run frame ended");
10208
        end
10209
      join
10210
      // wait for first transmit to end, if under-run didn't happen
10211
      if (frame_ended == 0)
10212
      begin
10213
        // WAIT FOR FIRST TRANSMIT
10214
        check_tx_bd(num_of_bd, data);
10215
        wait (MTxEn === 1'b1); // start first transmit
10216
        if (data[15] !== 1)
10217
        begin
10218
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10219
          fail = fail + 1;
10220
        end
10221
        wait (MTxEn === 1'b0); // end first transmit
10222
        while (data[15] === 1)
10223
        begin
10224
          check_tx_bd(num_of_bd, data);
10225
          @(posedge wb_clk);
10226
        end
10227
        repeat (1) @(posedge wb_clk);
10228
        // CHECK FIRST FRAME
10229
        // check length of a first PACKET
10230
        tmp_len = eth_phy.tx_len;
10231
        #1;
10232
        if (tmp_len != (i_length + 4))
10233
        begin
10234
          test_fail("Wrong length of second packet out from MAC");
10235
          fail = fail + 1;
10236
        end
10237
        // checking first packet
10238
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10239
        if (tmp > 0)
10240
        begin
10241
          test_fail("Wrong data of second transmitted packet");
10242
          fail = fail + 1;
10243
        end
10244
        // check first transmited TX packet CRC
10245
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10246
        if (tmp > 0)
10247
        begin
10248
          test_fail("Wrong CRC of second transmitted packet");
10249
          fail = fail + 1;
10250
        end
10251
        // check WB INT signal
10252
        if (wb_int !== 1'b1)
10253
        begin
10254
          `TIME; $display("*E WB INT signal should be set");
10255
          test_fail("WB INT signal should be set");
10256
          fail = fail + 1;
10257
        end
10258
        // check TX buffer descriptor of a packet
10259
        check_tx_bd(num_of_bd, data);
10260
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10261
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10262
        begin
10263
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10264
          test_fail("TX buffer descriptor status is not correct");
10265
          fail = fail + 1;
10266
        end
10267
        // check interrupts
10268
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10269
        if ((data & `ETH_INT_TXB) !== 1'b1)
10270
        begin
10271
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10272
          test_fail("Interrupt Transmit Buffer was not set");
10273
          fail = fail + 1;
10274
        end
10275
        if ((data & (~`ETH_INT_TXB)) !== 0)
10276
        begin
10277
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10278
          test_fail("Other interrupts (except Transmit Buffer) were set");
10279
          fail = fail + 1;
10280
        end
10281
        // clear interrupts
10282
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10283
        // check WB INT signal
10284
        if (wb_int !== 1'b0)
10285
        begin
10286
          test_fail("WB INT signal should not be set");
10287
          fail = fail + 1;
10288
        end
10289
      end
10290
      num_of_bd = num_of_bd + 1;
10291
      // destination address on ethernet PHY
10292
      eth_phy.set_tx_mem_addr(0);
10293
      // WAIT FOR FIRST TRANSMIT
10294
      check_tx_bd(num_of_bd, data);
10295
      wait (MTxEn === 1'b1); // start first transmit
10296
      if (data[15] !== 1)
10297
      begin
10298
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10299
        fail = fail + 1;
10300
      end
10301
      wait (MTxEn === 1'b0); // end first transmit
10302
      while (data[15] === 1)
10303
      begin
10304
        check_tx_bd(num_of_bd, data);
10305
        @(posedge wb_clk);
10306
      end
10307
      repeat (1) @(posedge wb_clk);
10308
      // CHECK SECOND FRAME
10309
      // check length of a second PACKET
10310
      tmp_len = eth_phy.tx_len;
10311
      #1;
10312
      if (tmp_len != (i_length + 4))
10313
      begin
10314
        test_fail("Wrong length of second packet out from MAC");
10315
        fail = fail + 1;
10316
      end
10317
      // checking second packet
10318
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10319
      if (tmp > 0)
10320
      begin
10321
        test_fail("Wrong data of second transmitted packet");
10322
        fail = fail + 1;
10323
      end
10324
      // check second transmited TX packet CRC
10325
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10326
      if (tmp > 0)
10327
      begin
10328
        test_fail("Wrong CRC of second transmitted packet");
10329
        fail = fail + 1;
10330
      end
10331
      // check WB INT signal
10332
      if (wb_int !== 1'b1)
10333
      begin
10334
        `TIME; $display("*E WB INT signal should be set");
10335
        test_fail("WB INT signal should be set");
10336
        fail = fail + 1;
10337
      end
10338
      // check TX buffer descriptor of a packet
10339
      check_tx_bd(num_of_bd, data);
10340
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10341
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10342
      begin
10343
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10344
        test_fail("TX buffer descriptor status is not correct");
10345
        fail = fail + 1;
10346
      end
10347
      // check interrupts
10348
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10349
      if ((data & `ETH_INT_TXB) !== 1'b1)
10350
      begin
10351
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10352
        test_fail("Interrupt Transmit Buffer was not set");
10353
        fail = fail + 1;
10354
      end
10355
      if ((data & (~`ETH_INT_TXB)) !== 0)
10356
      begin
10357
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10358
        test_fail("Other interrupts (except Transmit Buffer) were set");
10359
        fail = fail + 1;
10360
      end
10361
      // clear interrupts
10362
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10363
      // check WB INT signal
10364
      if (wb_int !== 1'b0)
10365
      begin
10366
        test_fail("WB INT signal should not be set");
10367
        fail = fail + 1;
10368
      end
10369
      // set initial value
10370
      i_data = i_data - 1;
10371
      // the number of frame transmitted
10372
      num_of_frames = num_of_frames + 1;
10373
      num_of_bd = 0;
10374
      // set length (LOOP variable)
10375
      if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
10376
        i_length = (max_tmp - 4);
10377
      @(posedge wb_clk);
10378
    end
10379
    // disable TX
10380
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10381
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10382
    @(posedge wb_clk);
10383
    if(fail == 0)
10384
      test_ok;
10385
    else
10386
      fail = 0;
10387
  end
10388
 
10389 169 mohor
/*
10390
          wbm_write(`ETH_MODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10391
          wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10392 116 mohor
 
10393 169 mohor
          wbm_write(32'hd0000000, `ETH_MODER_RXEN  | `ETH_MODER_TXEN | `ETH_MODER_PRO | `ETH_MODER_CRCEN |
10394
                    `ETH_MODER_PAD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10395
          wbm_read(32'hd0000000, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10396
 
10397
 
10398
 
10399 116 mohor
 
10400 169 mohor
          set_tx_bd(3);
10401
          set_rx_bd(6);
10402
 
10403
          set_tx_packet(16'h34, 8'h1);
10404
          set_tx_packet(16'h34, 8'h11);
10405
          send_tx_packet;
10406
          set_tx_packet(16'h34, 8'h21);
10407
          set_tx_packet(16'h34, 8'h31);
10408
          send_tx_packet;
10409 116 mohor
 
10410
 
10411 169 mohor
          eth_phy.GetDataOnMRxD(100, `BROADCAST_XFR); // LengthRx bytes is comming on MRxD[3:0] signals
10412
          repeat (100) @(posedge mrx_clk);   // Waiting for TxEthMac to finish transmit
10413
 
10414
          eth_phy.GetDataOnMRxD(70, `BROADCAST_XFR); // LengthRx bytes is comming on MRxD[3:0] signals
10415
          repeat (10000) @(posedge wb_clk);   // Waiting for TxEthMac to finish transmit
10416
 
10417
          eth_phy.GetDataOnMRxD(70, `MULTICAST_XFR); // LengthRx bytes is comming on MRxD[3:0] signals
10418
          repeat (10000) @(posedge wb_clk);   // Waiting for TxEthMac to finish transmit
10419
*/
10420
 
10421 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
10422 169 mohor
 
10423
end
10424
endtask // test_mac_full_duplex_transmit
10425
 
10426
 
10427 209 tadejm
task test_mac_full_duplex_receive;
10428
  input  [31:0]  start_task;
10429
  input  [31:0]  end_task;
10430
  integer        bit_start_1;
10431
  integer        bit_end_1;
10432
  integer        bit_start_2;
10433
  integer        bit_end_2;
10434
  integer        num_of_reg;
10435
  integer        num_of_frames;
10436
  integer        num_of_bd;
10437
  integer        i_addr;
10438
  integer        i_data;
10439
  integer        i_length;
10440
  integer        tmp_len;
10441
  integer        tmp_bd;
10442
  integer        tmp_bd_num;
10443
  integer        tmp_data;
10444
  integer        tmp_ipgt;
10445
  integer        test_num;
10446
  reg    [31:0]  tx_bd_num;
10447
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
10448
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
10449
  integer        i;
10450
  integer        i1;
10451
  integer        i2;
10452
  integer        i3;
10453
  integer        fail;
10454
  integer        speed;
10455
  reg            frame_started;
10456
  reg            frame_ended;
10457
  reg            wait_for_frame;
10458
  reg    [31:0]  addr;
10459
  reg    [31:0]  data;
10460
  reg    [31:0]  tmp;
10461
  reg    [ 7:0]  st_data;
10462
  reg    [15:0]  max_tmp;
10463
  reg    [15:0]  min_tmp;
10464
begin
10465
// MAC FULL DUPLEX RECEIVE TEST
10466
test_heading("MAC FULL DUPLEX RECEIVE TEST");
10467
$display(" ");
10468
$display("MAC FULL DUPLEX RECEIVE TEST");
10469
fail = 0;
10470
 
10471
// reset MAC registers
10472
hard_reset;
10473
// reset MAC and MII LOGIC with soft reset
10474
reset_mac;
10475
reset_mii;
10476
// set wb slave response
10477
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10478
 
10479
  /*
10480
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
10481
  -------------------------------------------------------------------------------------
10482
  set_tx_bd
10483
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
10484
  set_tx_bd_wrap
10485
    (tx_bd_num_end[6:0]);
10486
  set_tx_bd_ready
10487
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10488
  check_tx_bd
10489
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
10490
  clear_tx_bd
10491
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10492
 
10493
  TASKS for set and control RX buffer descriptors:
10494
  ------------------------------------------------
10495
  set_rx_bd
10496
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
10497
  set_rx_bd_wrap
10498
    (rx_bd_num_end[6:0]);
10499
  set_rx_bd_empty
10500
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10501
  check_rx_bd
10502
    (rx_bd_num_end[6:0], rx_bd_status);
10503
  clear_rx_bd
10504
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10505
 
10506
  TASKS for set and check TX packets:
10507
  -----------------------------------
10508
  set_tx_packet
10509
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
10510
  check_tx_packet
10511
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
10512
 
10513
  TASKS for set and check RX packets:
10514
  -----------------------------------
10515
  set_rx_packet
10516
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
10517
  check_rx_packet
10518
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
10519
 
10520
  TASKS for append and check CRC to/of TX packet:
10521
  -----------------------------------------------
10522
  append_tx_crc
10523
    (txpnt_wb[31:0], len[15:0], negated_crc);
10524
  check_tx_crc
10525
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
10526
 
10527
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
10528
  --------------------------------------------------------------------------------
10529
  append_rx_crc
10530
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
10531
  */
10532
 
10533
//////////////////////////////////////////////////////////////////////
10534
////                                                              ////
10535
////  test_mac_full_duplex_receive:                               ////
10536
////                                                              ////
10537
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
10538
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
10539
////  2: Test receive packets form MINFL to MAXFL sizes at        ////
10540
////     one RX buffer decriptor ( 10Mbps ).                      ////
10541
////  3: Test receive packets form MINFL to MAXFL sizes at        ////
10542
////     one RX buffer decriptor ( 100Mbps ).                     ////
10543
////                                                              ////
10544
//////////////////////////////////////////////////////////////////////
10545
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
10546
begin
10547
 
10548
  ////////////////////////////////////////////////////////////////////
10549
  ////                                                            ////
10550
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
10551
  ////                                                            ////
10552
  ////////////////////////////////////////////////////////////////////
10553
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
10554
  begin
10555
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
10556
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
10557
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
10558
 
10559
    // unmask interrupts
10560
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10561
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10562
    // set all buffer descriptors to TX - must be set before RX enable
10563
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10564 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10565 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10566
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10567
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10568
 
10569
    // write to phy's control register for 10Mbps
10570
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10571
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10572
    speed = 10;
10573
 
10574
    i = 0;
10575
    while (i < 128)
10576
    begin
10577
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10578
      begin
10579
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10580
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10581
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10582
      end
10583
      set_rx_bd_wrap(i);
10584
      set_rx_bd_empty(0, i);
10585
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10586
      begin
10587
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10588
        repeat(10) @(posedge mrx_clk);
10589
      end
10590
      @(posedge mrx_clk);
10591
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10592
      begin
10593
        check_rx_bd(0, tmp);
10594
        #1;
10595
        if (tmp[15] === 1'b0)
10596
        begin
10597
          test_fail("Receive should not start at all");
10598
          fail = fail + 1;
10599
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10600
        end
10601
        if (tmp[7:0] !== 0)
10602
        begin
10603
          test_fail("Receive should not be finished since it should not start at all");
10604
          fail = fail + 1;
10605
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10606
        end
10607
        @(posedge wb_clk);
10608
      end
10609
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10610
      if (tmp[6:0] !== 0)
10611
      begin
10612
        test_fail("Receive should not get INT since it should not start at all");
10613
        fail = fail + 1;
10614
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10615
      end
10616
      clear_rx_bd(0, i);
10617
      if ((i < 5) || (i > 124))
10618
        i = i + 1;
10619
      else
10620
        i = i + 120;
10621
    end
10622
    // disable RX
10623
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10624
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10625
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10626
    if(fail == 0)
10627
      test_ok;
10628
    else
10629
      fail = 0;
10630
  end
10631
 
10632
 
10633
  ////////////////////////////////////////////////////////////////////
10634
  ////                                                            ////
10635
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
10636
  ////                                                            ////
10637
  ////////////////////////////////////////////////////////////////////
10638
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
10639
  begin
10640
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
10641
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
10642
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
10643
 
10644
    // unmask interrupts
10645
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10646
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10647
    // set all buffer descriptors to TX - must be set before RX enable
10648
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10649 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10650 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10651
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10652
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10653
 
10654
    // write to phy's control register for 100Mbps
10655
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10656
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10657
    speed = 100;
10658
 
10659
    i = 0;
10660
    while (i < 128)
10661
    begin
10662
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10663
      begin
10664
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10665
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10666
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10667
      end
10668
      set_rx_bd_wrap(i);
10669
      set_rx_bd_empty(0, i);
10670
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10671
      begin
10672
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10673
        repeat(10) @(posedge mrx_clk);
10674
      end
10675
      @(posedge mrx_clk);
10676
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10677
      begin
10678
        check_rx_bd(0, tmp);
10679
        #1;
10680
        if (tmp[15] === 1'b0)
10681
        begin
10682
          test_fail("Receive should not start at all");
10683
          fail = fail + 1;
10684
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10685
        end
10686
        if (tmp[7:0] !== 0)
10687
        begin
10688
          test_fail("Receive should not be finished since it should not start at all");
10689
          fail = fail + 1;
10690
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10691
        end
10692
        @(posedge wb_clk);
10693
      end
10694
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10695
      if (tmp[6:0] !== 0)
10696
      begin
10697
        test_fail("Receive should not get INT since it should not start at all");
10698
        fail = fail + 1;
10699
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10700
      end
10701
      clear_rx_bd(0, i);
10702
      if ((i < 5) || (i > 124))
10703
        i = i + 1;
10704
      else
10705
        i = i + 120;
10706
    end
10707
    // disable RX
10708
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10709
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10710
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10711
    if(fail == 0)
10712
      test_ok;
10713
    else
10714
      fail = 0;
10715
  end
10716
 
10717
 
10718
  ////////////////////////////////////////////////////////////////////
10719
  ////                                                            ////
10720
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
10721
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
10722
  ////                                                            ////
10723
  ////////////////////////////////////////////////////////////////////
10724
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
10725
  begin
10726
    // TEST 2: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
10727
    test_name   = "TEST 2: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
10728
    `TIME; $display("  TEST 2: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
10729
 
10730
    // unmask interrupts
10731
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10732
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10733
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
10734
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10735
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
10736
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
10737
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10738
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10739
    // prepare two packets of MAXFL length
10740
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10741
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10742
    min_tmp = tmp[31:16];
10743
    st_data = 8'h0F;
10744
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
10745
    st_data = 8'h1A;
10746
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
10747
    // check WB INT signal
10748
    if (wb_int !== 1'b0)
10749
    begin
10750
      test_fail("WB INT signal should not be set");
10751
      fail = fail + 1;
10752
    end
10753
 
10754
    // write to phy's control register for 10Mbps
10755
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10756
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10757
    speed = 10;
10758
 
10759
    i_length = (min_tmp - 4);
10760
    while (i_length <= (max_tmp - 4))
10761
    begin
10762
      // choose generating carrier sense and collision for first and last 64 lengths of frames
10763
      case (i_length[1:0])
10764
      2'h0: // Interrupt is generated
10765
      begin
10766
        // enable interrupt generation
10767
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
10768
        // unmask interrupts
10769
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10770
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10771
        // not detect carrier sense in FD and no collision
10772
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10773
        eth_phy.collision(0);
10774
      end
10775
      2'h1: // Interrupt is not generated
10776
      begin
10777
        // enable interrupt generation
10778
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
10779
        // mask interrupts
10780
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10781
        // detect carrier sense in FD and no collision
10782
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10783
        eth_phy.collision(0);
10784
      end
10785
      2'h2: // Interrupt is not generated
10786
      begin
10787
        // disable interrupt generation
10788
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
10789
        // unmask interrupts
10790
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10791
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10792
        // not detect carrier sense in FD and set collision
10793
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10794
        eth_phy.collision(1);
10795
      end
10796
      default: // 2'h3: // Interrupt is not generated
10797
      begin
10798
        // disable interrupt generation
10799
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
10800
        // mask interrupts
10801
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10802
        // detect carrier sense in FD and set collision
10803
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10804
        eth_phy.collision(1);
10805
      end
10806
      endcase
10807
      if (i_length[0] == 1'b0)
10808
        append_rx_crc (0, i_length, 1'b0, 1'b0);
10809
      else
10810
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
10811
      // set wrap bit
10812
      set_rx_bd_wrap(127);
10813
      set_rx_bd_empty(127, 127);
10814
      fork
10815
        begin
10816
          if (i_length[0] == 1'b0)
10817
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
10818
          else
10819
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
10820
          repeat(10) @(posedge mrx_clk);
10821
        end
10822
        begin
10823
          #1 check_rx_bd(127, data);
10824
          if (i_length < min_tmp) // just first four
10825
          begin
10826
            while (data[15] === 1)
10827
            begin
10828
              #1 check_rx_bd(127, data);
10829
              @(posedge wb_clk);
10830
            end
10831
            repeat (1) @(posedge wb_clk);
10832
          end
10833
          else
10834
          begin
10835
            wait (MRxDV === 1'b1); // start transmit
10836
            #1 check_rx_bd(127, data);
10837
            if (data[15] !== 1)
10838
            begin
10839
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10840
              fail = fail + 1;
10841
            end
10842
            wait (MRxDV === 1'b0); // end transmit
10843
            while (data[15] === 1)
10844
            begin
10845
              #1 check_rx_bd(127, data);
10846
              @(posedge wb_clk);
10847
            end
10848
            repeat (1) @(posedge wb_clk);
10849
          end
10850
        end
10851
      join
10852
      // check length of a PACKET
10853
      if (data[31:16] != (i_length + 4))
10854
      begin
10855
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
10856
                        data[31:16], (i_length + 4));
10857
        test_fail("Wrong length of the packet out from PHY");
10858
        fail = fail + 1;
10859
      end
10860
      // checking in the following if statement is performed only for first and last 64 lengths
10861
      // check received RX packet data and CRC
10862
      if (i_length[0] == 1'b0)
10863
      begin
10864
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
10865
      end
10866
      else
10867
      begin
10868
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
10869
      end
10870
      if (tmp > 0)
10871
      begin
10872
        `TIME; $display("*E Wrong data of the received packet");
10873
        test_fail("Wrong data of the received packet");
10874
        fail = fail + 1;
10875
      end
10876
      // check WB INT signal
10877
      if (i_length[1:0] == 2'h0)
10878
      begin
10879
        if (wb_int !== 1'b1)
10880
        begin
10881
          `TIME; $display("*E WB INT signal should be set");
10882
          test_fail("WB INT signal should be set");
10883
          fail = fail + 1;
10884
        end
10885
      end
10886
      else
10887
      begin
10888
        if (wb_int !== 1'b0)
10889
        begin
10890
          `TIME; $display("*E WB INT signal should not be set");
10891
          test_fail("WB INT signal should not be set");
10892
          fail = fail + 1;
10893
        end
10894
      end
10895
      // check RX buffer descriptor of a packet
10896
      check_rx_bd(127, data);
10897
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
10898
      begin
10899
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
10900
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
10901
        begin
10902
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
10903
          test_fail("RX buffer descriptor status is not correct");
10904
          fail = fail + 1;
10905
        end
10906
      end
10907
      else // interrupt not enabled
10908
      begin
10909
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
10910
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
10911
        begin
10912
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
10913
          test_fail("RX buffer descriptor status is not correct");
10914
          fail = fail + 1;
10915
        end
10916
      end
10917
      // clear RX buffer descriptor for first 4 frames
10918
      if (i_length < min_tmp)
10919
        clear_rx_bd(127, 127);
10920
      // check interrupts
10921
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10922
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
10923
      begin
10924
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
10925
        begin
10926
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
10927
          test_fail("Interrupt Receive Buffer was not set");
10928
          fail = fail + 1;
10929
        end
10930
        if ((data & (~`ETH_INT_RXB)) !== 0)
10931
        begin
10932
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
10933
          test_fail("Other interrupts (except Receive Buffer) were set");
10934
          fail = fail + 1;
10935
        end
10936
      end
10937
      else
10938
      begin
10939
        if (data !== 0)
10940
        begin
10941
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
10942
          test_fail("Any of interrupts (except Receive Buffer) was set");
10943
          fail = fail + 1;
10944
        end
10945
      end
10946
      // clear interrupts
10947
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10948
      // check WB INT signal
10949
      if (wb_int !== 1'b0)
10950
      begin
10951
        test_fail("WB INT signal should not be set");
10952
        fail = fail + 1;
10953
      end
10954
      // INTERMEDIATE DISPLAYS
10955
      if ((i_length + 4) == (min_tmp + 64))
10956
      begin
10957
        // starting length is min_tmp, ending length is (min_tmp + 64)
10958
        $display("    receive small packets is NOT selected");
10959
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
10960
                 min_tmp, (min_tmp + 64));
10961
        // set receive small, remain the rest
10962
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10963
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
10964
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10965
      end
10966
      else if ((i_length + 4) == (max_tmp - 16))
10967
      begin
10968
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
10969
        $display("    receive small packets is selected");
10970
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
10971
                 (min_tmp + 64 + 128), tmp_data);
10972
        // reset receive small, remain the rest
10973
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
10974
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
10975
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10976
      end
10977
      else if ((i_length + 4) == max_tmp)
10978
      begin
10979
        $display("    receive small packets is NOT selected");
10980
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
10981
                 (max_tmp - (4 + 16)), max_tmp);
10982
      end
10983
      // set length (loop variable)
10984
      if ((i_length + 4) < (min_tmp + 64))
10985
        i_length = i_length + 1;
10986
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
10987
      begin
10988
        i_length = i_length + 128;
10989
        tmp_data = i_length + 4; // last tmp_data is ending length
10990
      end
10991
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
10992
        i_length = max_tmp - (4 + 16);
10993
      else if ((i_length + 4) >= (max_tmp - 16))
10994
        i_length = i_length + 1;
10995
      else
10996
      begin
10997
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
10998
        #10 $stop;
10999
      end
11000
    end
11001
    // disable RX
11002
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11003
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11004
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11005
    if(fail == 0)
11006
      test_ok;
11007
    else
11008
      fail = 0;
11009
  end
11010
 
11011
 
11012
  ////////////////////////////////////////////////////////////////////
11013
  ////                                                            ////
11014
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11015
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
11016
  ////                                                            ////
11017
  ////////////////////////////////////////////////////////////////////
11018
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11019
  begin
11020
    // TEST 3: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
11021
    test_name   = "TEST 3: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
11022
    `TIME; $display("  TEST 3: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
11023
 
11024
    // unmask interrupts
11025
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11026
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11027
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11028
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11029
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11030
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11031
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11032
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11033
    // prepare two packets of MAXFL length
11034
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11035
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11036
    min_tmp = tmp[31:16];
11037
    st_data = 8'h0F;
11038
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11039
    st_data = 8'h1A;
11040
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11041
    // check WB INT signal
11042
    if (wb_int !== 1'b0)
11043
    begin
11044
      test_fail("WB INT signal should not be set");
11045
      fail = fail + 1;
11046
    end
11047
 
11048
    // write to phy's control register for 100Mbps
11049
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11050
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11051
    speed = 100;
11052
 
11053
    i_length = (min_tmp - 4);
11054
    while (i_length <= (max_tmp - 4))
11055
    begin
11056
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11057
      case (i_length[1:0])
11058
      2'h0: // Interrupt is generated
11059
      begin
11060
        // enable interrupt generation
11061
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11062
        // unmask interrupts
11063
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11064
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11065
        // not detect carrier sense in FD and no collision
11066
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11067
        eth_phy.collision(0);
11068
      end
11069
      2'h1: // Interrupt is not generated
11070
      begin
11071
        // enable interrupt generation
11072
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11073
        // mask interrupts
11074
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11075
        // detect carrier sense in FD and no collision
11076
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11077
        eth_phy.collision(0);
11078
      end
11079
      2'h2: // Interrupt is not generated
11080
      begin
11081
        // disable interrupt generation
11082
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11083
        // unmask interrupts
11084
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11085
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11086
        // not detect carrier sense in FD and set collision
11087
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11088
        eth_phy.collision(1);
11089
      end
11090
      default: // 2'h3: // Interrupt is not generated
11091
      begin
11092
        // disable interrupt generation
11093
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11094
        // mask interrupts
11095
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11096
        // detect carrier sense in FD and set collision
11097
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11098
        eth_phy.collision(1);
11099
      end
11100
      endcase
11101
      if (i_length[0] == 1'b0)
11102
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11103
      else
11104
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11105
      // set wrap bit
11106
      set_rx_bd_wrap(127);
11107
      set_rx_bd_empty(127, 127);
11108
      fork
11109
        begin
11110
          if (i_length[0] == 1'b0)
11111
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11112
          else
11113
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11114
          repeat(10) @(posedge mrx_clk);
11115
        end
11116
        begin
11117
          #1 check_rx_bd(127, data);
11118
          if (i_length < min_tmp) // just first four
11119
          begin
11120
            while (data[15] === 1)
11121
            begin
11122
              #1 check_rx_bd(127, data);
11123
              @(posedge wb_clk);
11124
            end
11125
            repeat (1) @(posedge wb_clk);
11126
          end
11127
          else
11128
          begin
11129
            wait (MRxDV === 1'b1); // start transmit
11130
            #1 check_rx_bd(127, data);
11131
            if (data[15] !== 1)
11132
            begin
11133
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11134
              fail = fail + 1;
11135
            end
11136
            wait (MRxDV === 1'b0); // end transmit
11137
            while (data[15] === 1)
11138
            begin
11139
              #1 check_rx_bd(127, data);
11140
              @(posedge wb_clk);
11141
            end
11142
            repeat (1) @(posedge wb_clk);
11143
          end
11144
        end
11145
      join
11146
      // check length of a PACKET
11147
      if (data[31:16] != (i_length + 4))
11148
      begin
11149
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11150
                        data[31:16], (i_length + 4));
11151
        test_fail("Wrong length of the packet out from PHY");
11152
        fail = fail + 1;
11153
      end
11154
      // checking in the following if statement is performed only for first and last 64 lengths
11155
      // check received RX packet data and CRC
11156
      if (i_length[0] == 1'b0)
11157
      begin
11158
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11159
      end
11160
      else
11161
      begin
11162
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11163
      end
11164
      if (tmp > 0)
11165
      begin
11166
        `TIME; $display("*E Wrong data of the received packet");
11167
        test_fail("Wrong data of the received packet");
11168
        fail = fail + 1;
11169
      end
11170
      // check WB INT signal
11171
      if (i_length[1:0] == 2'h0)
11172
      begin
11173
        if (wb_int !== 1'b1)
11174
        begin
11175
          `TIME; $display("*E WB INT signal should be set");
11176
          test_fail("WB INT signal should be set");
11177
          fail = fail + 1;
11178
        end
11179
      end
11180
      else
11181
      begin
11182
        if (wb_int !== 1'b0)
11183
        begin
11184
          `TIME; $display("*E WB INT signal should not be set");
11185
          test_fail("WB INT signal should not be set");
11186
          fail = fail + 1;
11187
        end
11188
      end
11189
      // check RX buffer descriptor of a packet
11190
      check_rx_bd(127, data);
11191
      if (i_length[1] == 1'b0) // interrupt enabled 
11192
      begin
11193
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
11194
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
11195
        begin
11196
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11197
          test_fail("RX buffer descriptor status is not correct");
11198
          fail = fail + 1;
11199
        end
11200
      end
11201
      else // interrupt not enabled
11202
      begin
11203
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
11204
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
11205
        begin
11206
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11207
          test_fail("RX buffer descriptor status is not correct");
11208
          fail = fail + 1;
11209
        end
11210
      end
11211
      // clear RX buffer descriptor for first 4 frames
11212
      if (i_length < min_tmp)
11213
        clear_rx_bd(127, 127);
11214
      // check interrupts
11215
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11216
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11217
      begin
11218
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11219
        begin
11220
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11221
          test_fail("Interrupt Receive Buffer was not set");
11222
          fail = fail + 1;
11223
        end
11224
        if ((data & (~`ETH_INT_RXB)) !== 0)
11225
        begin
11226
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11227
          test_fail("Other interrupts (except Receive Buffer) were set");
11228
          fail = fail + 1;
11229
        end
11230
      end
11231
      else
11232
      begin
11233
        if (data !== 0)
11234
        begin
11235
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
11236
          test_fail("Any of interrupts (except Receive Buffer) was set");
11237
          fail = fail + 1;
11238
        end
11239
      end
11240
      // clear interrupts
11241
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11242
      // check WB INT signal
11243
      if (wb_int !== 1'b0)
11244
      begin
11245
        test_fail("WB INT signal should not be set");
11246
        fail = fail + 1;
11247
      end
11248
      // INTERMEDIATE DISPLAYS
11249
      if ((i_length + 4) == (min_tmp + 64))
11250
      begin
11251
        // starting length is min_tmp, ending length is (min_tmp + 64)
11252
        $display("    receive small packets is NOT selected");
11253
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
11254
                 min_tmp, (min_tmp + 64));
11255
        // set receive small, remain the rest
11256
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11257
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11258
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11259
      end
11260
      else if ((i_length + 4) == (max_tmp - 16))
11261
      begin
11262
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
11263
        $display("    receive small packets is selected");
11264
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
11265
                 (min_tmp + 64 + 128), tmp_data);
11266
        // reset receive small, remain the rest
11267
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11268
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11269
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11270
      end
11271
      else if ((i_length + 4) == max_tmp)
11272
      begin
11273
        $display("    receive small packets is NOT selected");
11274
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
11275
                 (max_tmp - (4 + 16)), max_tmp);
11276
      end
11277
      // set length (loop variable)
11278
      if ((i_length + 4) < (min_tmp + 64))
11279
        i_length = i_length + 1;
11280
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
11281
      begin
11282
        i_length = i_length + 128;
11283
        tmp_data = i_length + 4; // last tmp_data is ending length
11284
      end
11285
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
11286
        i_length = max_tmp - (4 + 16);
11287
      else if ((i_length + 4) >= (max_tmp - 16))
11288
        i_length = i_length + 1;
11289
      else
11290
      begin
11291
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
11292
        #10 $stop;
11293
      end
11294
    end
11295
    // disable RX
11296
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11297
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11298
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11299
    if(fail == 0)
11300
      test_ok;
11301
    else
11302
      fail = 0;
11303
  end
11304
 
11305
 
11306
  ////////////////////////////////////////////////////////////////////
11307
  ////                                                            ////
11308
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11309
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
11310
  ////                                                            ////
11311
  ////////////////////////////////////////////////////////////////////
11312
  if (test_num == 4) // 
11313
  begin
11314
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
11315
    test_name = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
11316
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
11317
 
11318
    // reset MAC registers
11319
    hard_reset;
11320
    // reset MAC and MII LOGIC with soft reset
11321
    reset_mac;
11322
    reset_mii;
11323
    // set wb slave response
11324
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
11325
 
11326
    max_tmp = 0;
11327
    min_tmp = 0;
11328
    num_of_frames = 0;
11329
    num_of_bd = 0;
11330
    // set maximum RX buffer descriptors (128) - must be set before RX enable
11331
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11332
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11333
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11334
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11335
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11336
    // prepare two packets of MAXFL length
11337
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11338
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11339
    min_tmp = tmp[31:16];
11340
    st_data = 8'hAC;
11341
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11342
    st_data = 8'h35;
11343
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11344
    // check WB INT signal
11345
    if (wb_int !== 1'b0)
11346
    begin
11347
      test_fail("WB INT signal should not be set");
11348
      fail = fail + 1;
11349
    end
11350
 
11351
    // write to phy's control register for 10Mbps
11352
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11353
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11354
    speed = 10;
11355
 
11356
    i_length = (min_tmp - 4);
11357
    while (i_length <= (max_tmp - 4))
11358
    begin
11359
      // append CRC to packet
11360
      if (i_length[0] == 1'b0)
11361
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11362
      else
11363
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11364
      // choose generating carrier sense and collision
11365
      case (i_length[1:0])
11366
      2'h0: // Interrupt is generated
11367
      begin
11368
        // Reset_tx_bd nable interrupt generation
11369
        // unmask interrupts
11370
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11371
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11372
        // not detect carrier sense in FD and no collision
11373
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11374
        eth_phy.collision(0);
11375
      end
11376
      2'h1: // Interrupt is not generated
11377
      begin
11378
        // set_tx_bd enable interrupt generation
11379
        // mask interrupts
11380
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11381
        // detect carrier sense in FD and no collision
11382
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11383
        eth_phy.collision(0);
11384
      end
11385
      2'h2: // Interrupt is not generated
11386
      begin
11387
        // set_tx_bd disable the interrupt generation
11388
        // unmask interrupts
11389
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11390
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11391
        // not detect carrier sense in FD and set collision
11392
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11393
        eth_phy.collision(1);
11394
      end
11395
      default: // 2'h3: // Interrupt is not generated
11396
      begin
11397
        // set_tx_bd disable the interrupt generation
11398
        // mask interrupts
11399
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11400
        // detect carrier sense in FD and set collision
11401
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11402
        eth_phy.collision(1);
11403
      end
11404
      endcase
11405
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
11406
      // number of all frames is 154 (146 without first 8)
11407
      if (num_of_frames < 8)
11408
      begin
11409
        case (i_length[1:0])
11410
        2'h0: // Interrupt is generated
11411
        begin
11412
          // enable interrupt generation
11413
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11414
          // interrupts are unmasked
11415
        end
11416
        2'h1: // Interrupt is not generated
11417
        begin
11418
          // enable interrupt generation
11419
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11420
          // interrupts are masked
11421
        end
11422
        2'h2: // Interrupt is not generated
11423
        begin
11424
          // disable interrupt generation
11425
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11426
          // interrupts are unmasked
11427
        end
11428
        default: // 2'h3: // Interrupt is not generated
11429
        begin
11430
          // disable interrupt generation
11431
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11432
          // interrupts are masked
11433
        end
11434
        endcase
11435
        // set wrap bit
11436
        set_rx_bd_wrap(0);
11437
      end
11438
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
11439
      else if ((num_of_frames - 8) == 0)
11440
      begin
11441
        tmp_len = i_length; // length of frame
11442
        tmp_bd_num = 0; // RX BD number
11443
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
11444
        begin
11445
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
11446
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
11447
          if (tmp_len[0] == 0)
11448
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
11449
          else
11450
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
11451
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
11452
          if ((tmp_len + 4) < (min_tmp + 128))
11453
            tmp_len = tmp_len + 1;
11454
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11455
            tmp_len = 256;
11456
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11457
            tmp_len = tmp_len + 128;
11458
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
11459
            tmp_len = max_tmp - (4 + 16);
11460
          else if ((tmp_len + 4) >= (max_tmp - 16))
11461
            tmp_len = tmp_len + 1;
11462
          // set RX BD number
11463
          tmp_bd_num = tmp_bd_num + 1;
11464
        end
11465
        // set wrap bit
11466
        set_rx_bd_wrap(127);
11467
      end
11468
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
11469
      else if ((num_of_frames - 8) == 20) // 128
11470
      begin
11471
        tmp_len = tmp_len; // length of frame remaines from previous settings
11472
        tmp_bd_num = 0; // TX BD number
11473
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
11474
        begin
11475
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
11476
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
11477
          if (tmp_len[0] == 0)
11478
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
11479
          else
11480
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
11481
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
11482
          if ((tmp_len + 4) < (min_tmp + 128))
11483
            tmp_len = tmp_len + 1;
11484
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11485
            tmp_len = 256;
11486
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11487
            tmp_len = tmp_len + 128;
11488
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
11489
            tmp_len = max_tmp - (4 + 16);
11490
          else if ((tmp_len + 4) >= (max_tmp - 16))
11491
            tmp_len = tmp_len + 1;
11492
          // set TX BD number
11493
          tmp_bd_num = tmp_bd_num + 1;
11494
        end
11495
      end
11496
      // set empty bit
11497
      if (num_of_frames < 8)
11498
        set_rx_bd_empty(0, 0);
11499
      else if ((num_of_frames - 8) < 128)
11500
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
11501
      else if ((num_of_frames - 136) < 19)
11502
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
11503
      // CHECK END OF RECEIVE
11504
      fork
11505
        begin
11506
          if (i_length[0] == 1'b0)
11507
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11508
          else
11509
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11510
          repeat(10) @(posedge mrx_clk);
11511
        end
11512
        begin
11513
          #1 check_rx_bd(num_of_bd, data);
11514
          if (i_length < min_tmp) // just first four
11515
          begin
11516
            while (data[15] === 1)
11517
            begin
11518
              #1 check_rx_bd(num_of_bd, data);
11519
              @(posedge wb_clk);
11520
            end
11521
            repeat (1) @(posedge wb_clk);
11522
          end
11523
          else
11524
          begin
11525
            wait (MRxDV === 1'b1); // start transmit
11526
            #1 check_rx_bd(num_of_bd, data);
11527
            if (data[15] !== 1)
11528
            begin
11529
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11530
              fail = fail + 1;
11531
            end
11532
            wait (MRxDV === 1'b0); // end transmit
11533
            while (data[15] === 1)
11534
            begin
11535
              #1 check_rx_bd(num_of_bd, data);
11536
              @(posedge wb_clk);
11537
            end
11538
            repeat (1) @(posedge wb_clk);
11539
          end
11540
        end
11541
      join
11542
      // check length of a PACKET
11543
      if (data[31:16] != (i_length + 4))
11544
      begin
11545
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11546
                        data[31:16], (i_length + 4));
11547
        test_fail("Wrong length of the packet out from PHY");
11548
        fail = fail + 1;
11549
      end
11550
      // checking in the following if statement is performed only for first and last 64 lengths
11551
      // check received RX packet data and CRC
11552
      if (i_length[0] == 1'b0)
11553
      begin
11554
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11555
      end
11556
      else
11557
      begin
11558
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11559
      end
11560
      if (tmp > 0)
11561
      begin
11562
        `TIME; $display("*E Wrong data of the received packet");
11563
        test_fail("Wrong data of the received packet");
11564
        fail = fail + 1;
11565
      end
11566
      // check WB INT signal
11567
      if (i_length[1:0] == 2'h0)
11568
      begin
11569
        if (wb_int !== 1'b1)
11570
        begin
11571
          `TIME; $display("*E WB INT signal should be set");
11572
          test_fail("WB INT signal should be set");
11573
          fail = fail + 1;
11574
        end
11575
      end
11576
      else
11577
      begin
11578
        if (wb_int !== 1'b0)
11579
        begin
11580
          `TIME; $display("*E WB INT signal should not be set");
11581
          test_fail("WB INT signal should not be set");
11582
          fail = fail + 1;
11583
        end
11584
      end
11585
      // check RX buffer descriptor of a packet
11586
      check_rx_bd(num_of_bd, data);
11587
      if (i_length[1] == 1'b0) // interrupt enabled
11588
      begin
11589
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
11590
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
11591
        begin
11592
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11593
          test_fail("RX buffer descriptor status is not correct");
11594
          fail = fail + 1;
11595
        end
11596
      end
11597
      else // interrupt not enabled
11598
      begin
11599
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
11600
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
11601
        begin
11602
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11603
          test_fail("RX buffer descriptor status is not correct");
11604
          fail = fail + 1;
11605
        end
11606
      end
11607
      // clear first half of 8 frames from RX buffer descriptor 0
11608
      if (num_of_frames < 4)
11609
        clear_rx_bd(num_of_bd, num_of_bd);
11610
      // clear BD with wrap bit
11611
      if (num_of_frames == 140)
11612
        clear_rx_bd(127, 127);
11613
      // check interrupts
11614
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11615
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11616
      begin
11617
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11618
        begin
11619
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11620
          test_fail("Interrupt Receive Buffer was not set");
11621
          fail = fail + 1;
11622
        end
11623
        if ((data & (~`ETH_INT_RXB)) !== 0)
11624
        begin
11625
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11626
          test_fail("Other interrupts (except Receive Buffer) were set");
11627
          fail = fail + 1;
11628
        end
11629
      end
11630
      else
11631
      begin
11632
        if (data !== 0)
11633
        begin
11634
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
11635
          test_fail("Any of interrupts (except Receive Buffer) was set");
11636
          fail = fail + 1;
11637
        end
11638
      end
11639
      // clear interrupts
11640
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11641
      // check WB INT signal
11642
      if (wb_int !== 1'b0)
11643
      begin
11644
        test_fail("WB INT signal should not be set");
11645
        fail = fail + 1;
11646
      end
11647
      // INTERMEDIATE DISPLAYS
11648
      if ((i_length + 4) == (min_tmp + 7))
11649
      begin
11650
        // starting length is min_tmp, ending length is (min_tmp + 128)
11651
        $display("    receive small packets is NOT selected");
11652
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
11653
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
11654
                 min_tmp, (min_tmp + 7));
11655
        $display("    ->all packets were received on RX BD 0");
11656
        // reset receive small, remain the rest
11657
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11658
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11659
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11660
      end
11661
      else if ((i_length + 4) == (min_tmp + 128))
11662
      begin
11663
        // starting length is min_tmp, ending length is (min_tmp + 128)
11664
        $display("    receive small packets is NOT selected");
11665
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
11666
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
11667
                 (min_tmp + 8), (min_tmp + 128));
11668
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
11669
                 1'b0, num_of_bd);
11670
        tmp_bd = num_of_bd + 1;
11671
        // set receive small, remain the rest
11672
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11673
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11674
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11675
      end
11676
      else if ((i_length + 4) == (max_tmp - 16))
11677
      begin
11678
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
11679
        $display("    receive small packets is selected");
11680
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
11681
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
11682
                 (min_tmp + 64 + 128), tmp_data);
11683
        if (tmp_bd > num_of_bd)
11684
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
11685
                   tmp_bd, num_of_bd);
11686
        else
11687
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
11688
                   tmp_bd, num_of_bd);
11689
        tmp_bd = num_of_bd + 1;
11690
        // reset receive small, remain the rest
11691
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11692
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11693
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11694
      end
11695
      else if ((i_length + 4) == max_tmp)
11696
      begin
11697
        $display("    receive small packets is NOT selected");
11698
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
11699
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
11700
                 (max_tmp - (4 + 16)), max_tmp);
11701
        if (tmp_bd > num_of_bd)
11702
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
11703
                   tmp_bd, num_of_bd);
11704
        else
11705
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
11706
                   tmp_bd, num_of_bd);
11707
      end
11708
      // set length (loop variable)
11709
      if ((i_length + 4) < (min_tmp + 128))
11710
        i_length = i_length + 1;
11711
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
11712
        i_length = 256;
11713
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
11714
      begin
11715
        i_length = i_length + 128;
11716
        tmp_data = i_length + 4; // last tmp_data is ending length
11717
      end
11718
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
11719
        i_length = max_tmp - (4 + 16);
11720
      else if ((i_length + 4) >= (max_tmp - 16))
11721
        i_length = i_length + 1;
11722
      else
11723
      begin
11724
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
11725
        #10 $stop;
11726
      end
11727
      // the number of frame transmitted
11728
      num_of_frames = num_of_frames + 1;
11729
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
11730
        num_of_bd = 0;
11731
      else
11732
        num_of_bd = num_of_bd + 1;
11733
    end
11734
    // disable RX
11735
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11736
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11737
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11738
    @(posedge wb_clk);
11739
    if(fail == 0)
11740
      test_ok;
11741
    else
11742
      fail = 0;
11743
  end
11744
 
11745
 
11746
  ////////////////////////////////////////////////////////////////////
11747
  ////                                                            ////
11748
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11749
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
11750
  ////                                                            ////
11751
  ////////////////////////////////////////////////////////////////////
11752
  if (test_num == 5) // 
11753
  begin
11754
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
11755
    test_name = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
11756
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
11757
 
11758
    // reset MAC registers
11759
    hard_reset;
11760
    // reset MAC and MII LOGIC with soft reset
11761
    reset_mac;
11762
    reset_mii;
11763
    // set wb slave response
11764
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
11765
 
11766
    max_tmp = 0;
11767
    min_tmp = 0;
11768
    num_of_frames = 0;
11769
    num_of_bd = 0;
11770
    // set maximum RX buffer descriptors (128) - must be set before RX enable
11771
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11772
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11773
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11774
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11775
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11776
    // prepare two packets of MAXFL length
11777
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11778
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11779
    min_tmp = tmp[31:16];
11780
    st_data = 8'hAC;
11781
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11782
    st_data = 8'h35;
11783
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11784
    // check WB INT signal
11785
    if (wb_int !== 1'b0)
11786
    begin
11787
      test_fail("WB INT signal should not be set");
11788
      fail = fail + 1;
11789
    end
11790
 
11791
    // write to phy's control register for 100Mbps
11792
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11793
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11794
    speed = 100;
11795
 
11796
    i_length = (min_tmp - 4);
11797
    while (i_length <= (max_tmp - 4))
11798
    begin
11799
      // append CRC to packet
11800
      if (i_length[0] == 1'b0)
11801
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11802
      else
11803
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11804
      // choose generating carrier sense and collision
11805
      case (i_length[1:0])
11806
      2'h0: // Interrupt is generated
11807
      begin
11808
        // Reset_tx_bd nable interrupt generation
11809
        // unmask interrupts
11810
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11811
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11812
        // not detect carrier sense in FD and no collision
11813
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11814
        eth_phy.collision(0);
11815
      end
11816
      2'h1: // Interrupt is not generated
11817
      begin
11818
        // set_tx_bd enable interrupt generation
11819
        // mask interrupts
11820
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11821
        // detect carrier sense in FD and no collision
11822
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11823
        eth_phy.collision(0);
11824
      end
11825
      2'h2: // Interrupt is not generated
11826
      begin
11827
        // set_tx_bd disable the interrupt generation
11828
        // unmask interrupts
11829
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11830
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11831
        // not detect carrier sense in FD and set collision
11832
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11833
        eth_phy.collision(1);
11834
      end
11835
      default: // 2'h3: // Interrupt is not generated
11836
      begin
11837
        // set_tx_bd disable the interrupt generation
11838
        // mask interrupts
11839
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11840
        // detect carrier sense in FD and set collision
11841
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11842
        eth_phy.collision(1);
11843
      end
11844
      endcase
11845
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
11846
      // number of all frames is 154 (146 without first 8)
11847
      if (num_of_frames < 8)
11848
      begin
11849
        case (i_length[1:0])
11850
        2'h0: // Interrupt is generated
11851
        begin
11852
          // enable interrupt generation
11853
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11854
          // interrupts are unmasked
11855
        end
11856
        2'h1: // Interrupt is not generated
11857
        begin
11858
          // enable interrupt generation
11859
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11860
          // interrupts are masked
11861
        end
11862
        2'h2: // Interrupt is not generated
11863
        begin
11864
          // disable interrupt generation
11865
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11866
          // interrupts are unmasked
11867
        end
11868
        default: // 2'h3: // Interrupt is not generated
11869
        begin
11870
          // disable interrupt generation
11871
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11872
          // interrupts are masked
11873
        end
11874
        endcase
11875
        // set wrap bit
11876
        set_rx_bd_wrap(0);
11877
      end
11878
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
11879
      else if ((num_of_frames - 8) == 0)
11880
      begin
11881
        tmp_len = i_length; // length of frame
11882
        tmp_bd_num = 0; // RX BD number
11883
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
11884
        begin
11885
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
11886
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
11887
          if (tmp_len[0] == 0)
11888
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
11889
          else
11890
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
11891
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
11892
          if ((tmp_len + 4) < (min_tmp + 128))
11893
            tmp_len = tmp_len + 1;
11894
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11895
            tmp_len = 256;
11896
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11897
            tmp_len = tmp_len + 128;
11898
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
11899
            tmp_len = max_tmp - (4 + 16);
11900
          else if ((tmp_len + 4) >= (max_tmp - 16))
11901
            tmp_len = tmp_len + 1;
11902
          // set RX BD number
11903
          tmp_bd_num = tmp_bd_num + 1;
11904
        end
11905
        // set wrap bit
11906
        set_rx_bd_wrap(127);
11907
      end
11908
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
11909
      else if ((num_of_frames - 8) == 20) // 128
11910
      begin
11911
        tmp_len = tmp_len; // length of frame remaines from previous settings
11912
        tmp_bd_num = 0; // TX BD number
11913
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
11914
        begin
11915
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
11916
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
11917
          if (tmp_len[0] == 0)
11918
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
11919
          else
11920
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
11921
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
11922
          if ((tmp_len + 4) < (min_tmp + 128))
11923
            tmp_len = tmp_len + 1;
11924
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11925
            tmp_len = 256;
11926
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
11927
            tmp_len = tmp_len + 128;
11928
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
11929
            tmp_len = max_tmp - (4 + 16);
11930
          else if ((tmp_len + 4) >= (max_tmp - 16))
11931
            tmp_len = tmp_len + 1;
11932
          // set TX BD number
11933
          tmp_bd_num = tmp_bd_num + 1;
11934
        end
11935
      end
11936
      // set empty bit
11937
      if (num_of_frames < 8)
11938
        set_rx_bd_empty(0, 0);
11939
      else if ((num_of_frames - 8) < 128)
11940
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
11941
      else if ((num_of_frames - 136) < 19)
11942
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
11943
      // CHECK END OF RECEIVE
11944
      fork
11945
        begin
11946
          if (i_length[0] == 1'b0)
11947
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11948
          else
11949
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11950
          repeat(10) @(posedge mrx_clk);
11951
        end
11952
        begin
11953
          #1 check_rx_bd(num_of_bd, data);
11954
          if (i_length < min_tmp) // just first four
11955
          begin
11956
            while (data[15] === 1)
11957
            begin
11958
              #1 check_rx_bd(num_of_bd, data);
11959
              @(posedge wb_clk);
11960
            end
11961
            repeat (1) @(posedge wb_clk);
11962
          end
11963
          else
11964
          begin
11965
            wait (MRxDV === 1'b1); // start transmit
11966
            #1 check_rx_bd(num_of_bd, data);
11967
            if (data[15] !== 1)
11968
            begin
11969
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11970
              fail = fail + 1;
11971
            end
11972
            wait (MRxDV === 1'b0); // end transmit
11973
            while (data[15] === 1)
11974
            begin
11975
              #1 check_rx_bd(num_of_bd, data);
11976
              @(posedge wb_clk);
11977
            end
11978
            repeat (1) @(posedge wb_clk);
11979
          end
11980
        end
11981
      join
11982
      // check length of a PACKET
11983
      if (data[31:16] != (i_length + 4))
11984
      begin
11985
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11986
                        data[31:16], (i_length + 4));
11987
        test_fail("Wrong length of the packet out from PHY");
11988
        fail = fail + 1;
11989
      end
11990
      // checking in the following if statement is performed only for first and last 64 lengths
11991
      // check received RX packet data and CRC
11992
      if (i_length[0] == 1'b0)
11993
      begin
11994
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11995
      end
11996
      else
11997
      begin
11998
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11999
      end
12000
      if (tmp > 0)
12001
      begin
12002
        `TIME; $display("*E Wrong data of the received packet");
12003
        test_fail("Wrong data of the received packet");
12004
        fail = fail + 1;
12005
      end
12006
      // check WB INT signal
12007
      if (i_length[1:0] == 2'h0)
12008
      begin
12009
        if (wb_int !== 1'b1)
12010
        begin
12011
          `TIME; $display("*E WB INT signal should be set");
12012
          test_fail("WB INT signal should be set");
12013
          fail = fail + 1;
12014
        end
12015
      end
12016
      else
12017
      begin
12018
        if (wb_int !== 1'b0)
12019
        begin
12020
          `TIME; $display("*E WB INT signal should not be set");
12021
          test_fail("WB INT signal should not be set");
12022
          fail = fail + 1;
12023
        end
12024
      end
12025
      // check RX buffer descriptor of a packet
12026
      check_rx_bd(num_of_bd, data);
12027
      if (i_length[1] == 1'b0) // interrupt enabled
12028
      begin
12029
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12030
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12031
        begin
12032
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12033
          test_fail("RX buffer descriptor status is not correct");
12034
          fail = fail + 1;
12035
        end
12036
      end
12037
      else // interrupt not enabled
12038
      begin
12039
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12040
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12041
        begin
12042
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12043
          test_fail("RX buffer descriptor status is not correct");
12044
          fail = fail + 1;
12045
        end
12046
      end
12047
      // clear first half of 8 frames from RX buffer descriptor 0
12048
      if (num_of_frames < 4)
12049
        clear_rx_bd(num_of_bd, num_of_bd);
12050
      // clear BD with wrap bit
12051
      if (num_of_frames == 140)
12052
        clear_rx_bd(127, 127);
12053
      // check interrupts
12054
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12055
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12056
      begin
12057
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12058
        begin
12059
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12060
          test_fail("Interrupt Receive Buffer was not set");
12061
          fail = fail + 1;
12062
        end
12063
        if ((data & (~`ETH_INT_RXB)) !== 0)
12064
        begin
12065
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12066
          test_fail("Other interrupts (except Receive Buffer) were set");
12067
          fail = fail + 1;
12068
        end
12069
      end
12070
      else
12071
      begin
12072
        if (data !== 0)
12073
        begin
12074
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12075
          test_fail("Any of interrupts (except Receive Buffer) was set");
12076
          fail = fail + 1;
12077
        end
12078
      end
12079
      // clear interrupts
12080
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12081
      // check WB INT signal
12082
      if (wb_int !== 1'b0)
12083
      begin
12084
        test_fail("WB INT signal should not be set");
12085
        fail = fail + 1;
12086
      end
12087
      // INTERMEDIATE DISPLAYS
12088
      if ((i_length + 4) == (min_tmp + 7))
12089
      begin
12090
        // starting length is min_tmp, ending length is (min_tmp + 128)
12091
        $display("    receive small packets is NOT selected");
12092
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12093
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12094
                 min_tmp, (min_tmp + 7));
12095
        $display("    ->all packets were received on RX BD 0");
12096
        // reset receive small, remain the rest
12097
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12098
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12099
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12100
      end
12101
      else if ((i_length + 4) == (min_tmp + 128))
12102
      begin
12103
        // starting length is min_tmp, ending length is (min_tmp + 128)
12104
        $display("    receive small packets is NOT selected");
12105
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12106
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12107
                 (min_tmp + 8), (min_tmp + 128));
12108
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12109
                 1'b0, num_of_bd);
12110
        tmp_bd = num_of_bd + 1;
12111
        // set receive small, remain the rest
12112
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12113
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12114
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12115
      end
12116
      else if ((i_length + 4) == (max_tmp - 16))
12117
      begin
12118
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12119
        $display("    receive small packets is selected");
12120
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12121
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12122
                 (min_tmp + 64 + 128), tmp_data);
12123
        if (tmp_bd > num_of_bd)
12124
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12125
                   tmp_bd, num_of_bd);
12126
        else
12127
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12128
                   tmp_bd, num_of_bd);
12129
        tmp_bd = num_of_bd + 1;
12130
        // reset receive small, remain the rest
12131
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12132
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12133
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12134
      end
12135
      else if ((i_length + 4) == max_tmp)
12136
      begin
12137
        $display("    receive small packets is NOT selected");
12138
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12139
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12140
                 (max_tmp - (4 + 16)), max_tmp);
12141
        if (tmp_bd > num_of_bd)
12142
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12143
                   tmp_bd, num_of_bd);
12144
        else
12145
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12146
                   tmp_bd, num_of_bd);
12147
      end
12148
      // set length (loop variable)
12149
      if ((i_length + 4) < (min_tmp + 128))
12150
        i_length = i_length + 1;
12151
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12152
        i_length = 256;
12153
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12154
      begin
12155
        i_length = i_length + 128;
12156
        tmp_data = i_length + 4; // last tmp_data is ending length
12157
      end
12158
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12159
        i_length = max_tmp - (4 + 16);
12160
      else if ((i_length + 4) >= (max_tmp - 16))
12161
        i_length = i_length + 1;
12162
      else
12163
      begin
12164
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12165
        #10 $stop;
12166
      end
12167
      // the number of frame transmitted
12168
      num_of_frames = num_of_frames + 1;
12169
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12170
        num_of_bd = 0;
12171
      else
12172
        num_of_bd = num_of_bd + 1;
12173
    end
12174
    // disable RX
12175
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12176
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12177
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12178
    @(posedge wb_clk);
12179
    if(fail == 0)
12180
      test_ok;
12181
    else
12182
      fail = 0;
12183
  end
12184
 
12185
 
12186
  ////////////////////////////////////////////////////////////////////
12187
  ////                                                            ////
12188
  ////  Test receive packets form 0 to (MINFL - 1) sizes at       ////
12189
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
12190
  ////                                                            ////
12191
  ////////////////////////////////////////////////////////////////////
12192
  if (test_num == 6) // 
12193
  begin
12194
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
12195
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
12196
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
12197
 
12198
    // reset MAC registers
12199
    hard_reset;
12200
    // reset MAC and MII LOGIC with soft reset
12201
    reset_mac;
12202
    reset_mii;
12203
    // set wb slave response
12204
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12205
 
12206
    max_tmp = 0;
12207
    min_tmp = 0;
12208
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
12209
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12210
    // enable RX, set full-duplex mode, receive small, NO correct IFG
12211
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12212
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12213
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12214
    // prepare two packets of MAXFL length
12215
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12216
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12217
    min_tmp = tmp[31:16];
12218
    st_data = 8'hAC;
12219
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12220
    st_data = 8'h35;
12221
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12222
    // check WB INT signal
12223
    if (wb_int !== 1'b0)
12224
    begin
12225
      test_fail("WB INT signal should not be set");
12226
      fail = fail + 1;
12227
    end
12228
 
12229
    // write to phy's control register for 10Mbps
12230
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12231
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12232
    speed = 10;
12233
 
12234
    frame_started = 0;
12235
    num_of_frames = 0;
12236
    num_of_bd = 0;
12237
    i_length = 0; // 0;
12238
    while (i_length < 70) // (min_tmp - 4))
12239
    begin
12240
      #1;
12241
      // choose generating carrier sense and collision
12242
      case (i_length[1:0])
12243
      2'h0: // Interrupt is generated
12244
      begin
12245
        // Reset_tx_bd nable interrupt generation
12246
        // unmask interrupts
12247
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12248
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12249
        // not detect carrier sense in FD and no collision
12250
        eth_phy.carrier_sense_tx_fd_detect(0);
12251
        eth_phy.collision(0);
12252
      end
12253
      2'h1: // Interrupt is not generated
12254
      begin
12255
        // set_tx_bd enable interrupt generation
12256
        // mask interrupts
12257
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12258
        // detect carrier sense in FD and no collision
12259
        eth_phy.carrier_sense_tx_fd_detect(1);
12260
        eth_phy.collision(0);
12261
      end
12262
      2'h2: // Interrupt is not generated
12263
      begin
12264
        // set_tx_bd disable the interrupt generation
12265
        // unmask interrupts
12266
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12267
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12268
        // not detect carrier sense in FD and set collision
12269
        eth_phy.carrier_sense_tx_fd_detect(0);
12270
        eth_phy.collision(1);
12271
      end
12272
      default: // 2'h3: // Interrupt is not generated
12273
      begin
12274
        // set_tx_bd disable the interrupt generation
12275
        // mask interrupts
12276
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12277
        // detect carrier sense in FD and set collision
12278
        eth_phy.carrier_sense_tx_fd_detect(1);
12279
        eth_phy.collision(1);
12280
      end
12281
      endcase
12282
      #1;
12283
      // first destination address on ethernet PHY
12284
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
12285
      // SET packets and wrap bit
12286
      // num_of_frames <= 9 => wrap set to TX BD 0
12287
      if (num_of_frames <= 9)
12288
      begin
12289
        tmp_len = i_length; // length of frame
12290
        tmp_bd_num = 0; // TX BD number
12291
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12292
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12293
        if (tmp_len[0] == 0)
12294
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12295
        else
12296
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12297
        // set wrap bit
12298
        set_tx_bd_wrap(0);
12299
      end
12300
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
12301
      else if ((num_of_frames == 10) || (num_of_frames == 14))
12302
      begin
12303
        tmp_len = i_length; // length of frame
12304
        tmp_bd_num = 0; // TX BD number
12305
        while (tmp_bd_num < 4) //
12306
        begin
12307
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12308
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12309
          if (tmp_len[0] == 0)
12310
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12311
          else
12312
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12313
          tmp_len = tmp_len + 1;
12314
          // set TX BD number
12315
          tmp_bd_num = tmp_bd_num + 1;
12316
        end
12317
        // set wrap bit
12318
        set_tx_bd_wrap(3);
12319
      end
12320
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
12321
      else if ((num_of_frames == 18) || (num_of_frames == 23))
12322
      begin
12323
        tmp_len = i_length; // length of frame
12324
        tmp_bd_num = 0; // TX BD number
12325
        while (tmp_bd_num < 5) //
12326
        begin
12327
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12328
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12329
          if (tmp_len[0] == 0)
12330
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12331
          else
12332
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12333
          tmp_len = tmp_len + 1;
12334
          // set TX BD number
12335
          tmp_bd_num = tmp_bd_num + 1;
12336
        end
12337
        // set wrap bit
12338
        set_tx_bd_wrap(4);
12339
      end
12340
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
12341
      else if ((num_of_frames == 28) || (num_of_frames == 34))
12342
      begin
12343
        tmp_len = i_length; // length of frame
12344
        tmp_bd_num = 0; // TX BD number
12345
        while (tmp_bd_num < 6) //
12346
        begin
12347
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12348
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12349
          if (tmp_len[0] == 0)
12350
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12351
          else
12352
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12353
          tmp_len = tmp_len + 1;
12354
          // set TX BD number
12355
          tmp_bd_num = tmp_bd_num + 1;
12356
        end
12357
        // set wrap bit
12358
        set_tx_bd_wrap(5);
12359
      end
12360
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
12361
      else if ((num_of_frames == 40) || (num_of_frames == 47))
12362
      begin
12363
        tmp_len = i_length; // length of frame
12364
        tmp_bd_num = 0; // TX BD number
12365
        while (tmp_bd_num < 7) //
12366
        begin
12367
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12368
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12369
          if (tmp_len[0] == 0)
12370
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12371
          else
12372
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12373
          tmp_len = tmp_len + 1;
12374
          // set TX BD number
12375
          tmp_bd_num = tmp_bd_num + 1;
12376
        end
12377
        // set wrap bit
12378
        set_tx_bd_wrap(6);
12379
      end
12380
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
12381
      else if ((num_of_frames == 54) || (num_of_frames == 62))
12382
      begin
12383
        tmp_len = i_length; // length of frame
12384
        tmp_bd_num = 0; // TX BD number
12385
        while (tmp_bd_num < 8) //
12386
        begin
12387
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12388
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12389
          if (tmp_len[0] == 0)
12390
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
12391
          else
12392
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
12393
          tmp_len = tmp_len + 1;
12394
          // set TX BD number
12395
          tmp_bd_num = tmp_bd_num + 1;
12396
        end
12397
        // set wrap bit
12398
        set_tx_bd_wrap(7);
12399
      end
12400
      #1;
12401
      // SET ready bit
12402
      if (num_of_frames < 10)
12403
        set_tx_bd_ready(0, 0);
12404
      else if (num_of_frames < 14)
12405
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
12406
      else if (num_of_frames < 18)
12407
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
12408
      else if (num_of_frames < 23)
12409
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
12410
      else if (num_of_frames < 28)
12411
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
12412
      else if (num_of_frames < 34)
12413
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
12414
      else if (num_of_frames < 40)
12415
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
12416
      else if (num_of_frames < 47)
12417
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
12418
      else if (num_of_frames < 54)
12419
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
12420
      else if (num_of_frames < 62)
12421
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
12422
      else if (num_of_frames < 70)
12423
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
12424
      // CHECK END OF TRANSMITION
12425
      frame_started = 0;
12426
      if (num_of_frames >= 5)
12427
        #1 check_tx_bd(num_of_bd, data);
12428
      fork
12429
      begin: fr_st
12430
        wait (MTxEn === 1'b1); // start transmit
12431
        frame_started = 1;
12432
      end
12433
      begin
12434
        repeat (30) @(posedge mtx_clk);
12435
        if (num_of_frames < 5)
12436
        begin
12437
          if (frame_started == 1)
12438
          begin
12439
            `TIME; $display("*E Frame should NOT start!");
12440
          end
12441
          disable fr_st;
12442
        end
12443
        else
12444
        begin
12445
          if (frame_started == 0)
12446
          begin
12447
            `TIME; $display("*W Frame should start!");
12448
            disable fr_st;
12449
          end
12450
        end
12451
      end
12452
      join
12453
      // check packets larger than 4 bytes
12454
      if (num_of_frames >= 5)
12455
      begin
12456
        wait (MTxEn === 1'b0); // end transmit
12457
        while (data[15] === 1)
12458
        begin
12459
          #1 check_tx_bd(num_of_bd, data);
12460
          @(posedge wb_clk);
12461
        end
12462
        repeat (1) @(posedge wb_clk);
12463
        // check length of a PACKET
12464
        if (i_length <= (min_tmp - 4))
12465
        begin
12466
          if (eth_phy.tx_len != min_tmp)
12467
          begin
12468
            test_fail("Wrong length of the packet out from MAC");
12469
            fail = fail + 1;
12470
          end
12471
        end
12472
        else
12473
        begin
12474
          if (eth_phy.tx_len != (i_length + 4))
12475
          begin
12476
            test_fail("Wrong length of the packet out from MAC");
12477
            fail = fail + 1;
12478
          end
12479
        end
12480
        // check transmitted TX packet data
12481
        if (i_length[0] == 0)
12482
        begin
12483
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
12484
        end
12485
        else
12486
        begin
12487
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
12488
        end
12489
        if (tmp > 0)
12490
        begin
12491
          test_fail("Wrong data of the transmitted packet");
12492
          fail = fail + 1;
12493
        end
12494
        // check transmited TX packet CRC
12495
        if (num_of_frames < (min_tmp - 4))
12496
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
12497
        else
12498
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
12499
        if (tmp > 0)
12500
        begin
12501
          test_fail("Wrong CRC of the transmitted packet");
12502
          fail = fail + 1;
12503
        end
12504
      end
12505
      // check WB INT signal
12506
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
12507
      begin
12508
        if (wb_int !== 1'b1)
12509
        begin
12510
          `TIME; $display("*E WB INT signal should be set");
12511
          test_fail("WB INT signal should be set");
12512
          fail = fail + 1;
12513
        end
12514
      end
12515
      else
12516
      begin
12517
        if (wb_int !== 1'b0)
12518
        begin
12519
          `TIME; $display("*E WB INT signal should not be set");
12520
          test_fail("WB INT signal should not be set");
12521
          fail = fail + 1;
12522
        end
12523
      end
12524
      // check TX buffer descriptor of a packet
12525
      check_tx_bd(num_of_bd, data);
12526
      if (num_of_frames >= 5)
12527
      begin
12528
        if (i_length[1] == 1'b0) // interrupt enabled
12529
        begin
12530
          if ( (data[15:0] !== 16'h7800) && // wrap bit
12531
               (data[15:0] !== 16'h5800) ) // without wrap bit
12532
          begin
12533
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
12534
            test_fail("TX buffer descriptor status is not correct");
12535
            fail = fail + 1;
12536
          end
12537
        end
12538
        else // interrupt not enabled
12539
        begin
12540
          if ( (data[15:0] !== 16'h3800) && // wrap bit
12541
               (data[15:0] !== 16'h1800) ) // without wrap bit
12542
          begin
12543
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
12544
            test_fail("TX buffer descriptor status is not correct");
12545
            fail = fail + 1;
12546
          end
12547
        end
12548
      end
12549
      else
12550
      begin
12551
        if (data[15] !== 1'b1)
12552
        begin
12553
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
12554
          test_fail("TX buffer descriptor status is not correct");
12555
          fail = fail + 1;
12556
        end
12557
      end
12558
      // clear TX BD with wrap bit
12559
      if (num_of_frames == 63)
12560
        clear_tx_bd(16, 16);
12561
      // check interrupts
12562
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12563
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
12564
      begin
12565
        if ((data & `ETH_INT_TXB) !== 1'b1)
12566
        begin
12567
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
12568
          test_fail("Interrupt Transmit Buffer was not set");
12569
          fail = fail + 1;
12570
        end
12571
        if ((data & (~`ETH_INT_TXB)) !== 0)
12572
        begin
12573
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
12574
          test_fail("Other interrupts (except Transmit Buffer) were set");
12575
          fail = fail + 1;
12576
        end
12577
      end
12578
      else
12579
      begin
12580
        if (data !== 0)
12581
        begin
12582
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12583
          test_fail("Any of interrupts (except Transmit Buffer) was set");
12584
          fail = fail + 1;
12585
        end
12586
      end
12587
      // clear interrupts
12588
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12589
      // check WB INT signal
12590
      if (wb_int !== 1'b0)
12591
      begin
12592
        test_fail("WB INT signal should not be set");
12593
        fail = fail + 1;
12594
      end
12595
      // INTERMEDIATE DISPLAYS
12596
      if (i_length == 3)
12597
      begin
12598
        $display("    pads appending to packets is selected");
12599
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
12600
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
12601
                 0, 3);
12602
      end
12603
      else if (i_length == 9)
12604
      begin
12605
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
12606
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
12607
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12608
                 5, 9);
12609
      end
12610
      else if (i_length == 17)
12611
      begin
12612
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
12613
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12614
                 10, 17);
12615
      end
12616
      else if (i_length == 27)
12617
      begin
12618
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
12619
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12620
                 18, 27);
12621
      end
12622
      else if (i_length == 40)
12623
      begin
12624
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
12625
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12626
                 28, 40);
12627
      end
12628
      else if (i_length == 54)
12629
      begin
12630
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
12631
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12632
                 41, 54);
12633
      end
12634
      else if (i_length == 69)
12635
      begin
12636
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
12637
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12638
                 55, 69);
12639
      end
12640
      // set length (loop variable)
12641
      i_length = i_length + 1;
12642
      // the number of frame transmitted
12643
      num_of_frames = num_of_frames + 1;
12644
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
12645
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
12646
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
12647
          (num_of_frames == 54) || (num_of_frames == 62))
12648
        num_of_bd = 0;
12649
      else
12650
        num_of_bd = num_of_bd + 1;
12651
    end
12652
    // disable TX
12653
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
12654
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12655
    @(posedge wb_clk);
12656
    if(fail == 0)
12657
      test_ok;
12658
    else
12659
      fail = 0;
12660
  end
12661
 
12662
 
12663
 
12664
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
12665
 
12666
end
12667
endtask // test_mac_full_duplex_receive
12668
 
12669
 
12670
task test_mac_full_duplex_flow;
12671
  input  [31:0]  start_task;
12672
  input  [31:0]  end_task;
12673
  integer        bit_start_1;
12674
  integer        bit_end_1;
12675
  integer        bit_start_2;
12676
  integer        bit_end_2;
12677
  integer        num_of_reg;
12678
  integer        num_of_frames;
12679
  integer        num_of_bd;
12680
  integer        i_addr;
12681
  integer        i_data;
12682
  integer        i_length;
12683
  integer        tmp_len;
12684
  integer        tmp_bd;
12685
  integer        tmp_bd_num;
12686
  integer        tmp_data;
12687
  integer        tmp_ipgt;
12688
  integer        test_num;
12689
  reg    [31:0]  tx_bd_num;
12690
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
12691
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
12692
  integer        i;
12693
  integer        i1;
12694
  integer        i2;
12695
  integer        i3;
12696
  integer        fail;
12697
  integer        speed;
12698
  reg            frame_started;
12699
  reg            frame_ended;
12700
  reg            wait_for_frame;
12701
  reg    [31:0]  addr;
12702
  reg    [31:0]  data;
12703
  reg    [31:0]  tmp;
12704
  reg    [ 7:0]  st_data;
12705
  reg    [15:0]  max_tmp;
12706
  reg    [15:0]  min_tmp;
12707
begin
12708
// MAC FULL DUPLEX FLOW TEST
12709
test_heading("MAC FULL DUPLEX FLOW TEST");
12710
$display(" ");
12711
$display("MAC FULL DUPLEX FLOW TEST");
12712
fail = 0;
12713
 
12714
// reset MAC registers
12715
hard_reset;
12716
// reset MAC and MII LOGIC with soft reset
12717
reset_mac;
12718
reset_mii;
12719
// set wb slave response
12720
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12721
 
12722
  /*
12723
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
12724
  -------------------------------------------------------------------------------------
12725
  set_tx_bd
12726
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
12727
  set_tx_bd_wrap
12728
    (tx_bd_num_end[6:0]);
12729
  set_tx_bd_ready
12730
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
12731
  check_tx_bd
12732
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
12733
  clear_tx_bd
12734
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
12735
 
12736
  TASKS for set and control RX buffer descriptors:
12737
  ------------------------------------------------
12738
  set_rx_bd
12739
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
12740
  set_rx_bd_wrap
12741
    (rx_bd_num_end[6:0]);
12742
  set_rx_bd_empty
12743
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
12744
  check_rx_bd
12745
    (rx_bd_num_end[6:0], rx_bd_status);
12746
  clear_rx_bd
12747
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
12748
 
12749
  TASKS for set and check TX packets:
12750
  -----------------------------------
12751
  set_tx_packet
12752
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
12753
  check_tx_packet
12754
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
12755
 
12756
  TASKS for set and check RX packets:
12757
  -----------------------------------
12758
  set_rx_packet
12759
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
12760
  check_rx_packet
12761
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
12762
 
12763
  TASKS for append and check CRC to/of TX packet:
12764
  -----------------------------------------------
12765
  append_tx_crc
12766
    (txpnt_wb[31:0], len[15:0], negated_crc);
12767
  check_tx_crc
12768
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
12769
 
12770
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
12771
  --------------------------------------------------------------------------------
12772
  append_rx_crc
12773
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
12774
  */
12775
 
12776
//////////////////////////////////////////////////////////////////////
12777
////                                                              ////
12778
////  test_mac_full_duplex_flow:                                  ////
12779
////                                                              ////
12780
////  0: Test                                                     ////
12781
////                                                              ////
12782
//////////////////////////////////////////////////////////////////////
12783
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
12784
begin
12785
 
12786
  ////////////////////////////////////////////////////////////////////
12787
  ////                                                            ////
12788
  ////  Test                                                      ////
12789
  ////                                                            ////
12790
  ////////////////////////////////////////////////////////////////////
12791
  if (test_num == 0) // Test 
12792
  begin
12793
    // TEST 0: 
12794
    test_name   = "TEST 0: ";
12795
    `TIME; $display("  TEST 0: ");
12796
 
12797
 
12798
  end
12799
 
12800
 
12801
 
12802
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
12803
 
12804
end
12805
endtask // test_mac_full_duplex_flow
12806
 
12807
 
12808 169 mohor
//////////////////////////////////////////////////////////////
12809
// WB Behavioral Models Basic tasks
12810
//////////////////////////////////////////////////////////////
12811
 
12812
task wbm_write;
12813
  input  [31:0] address_i;
12814
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
12815
  input  [3:0]  sel_i;
12816
  input  [31:0] size_i;
12817
  input  [3:0]  init_waits_i;
12818
  input  [3:0]  subseq_waits_i;
12819
 
12820
  reg `WRITE_STIM_TYPE write_data;
12821
  reg `WB_TRANSFER_FLAGS flags;
12822
  reg `WRITE_RETURN_TYPE write_status;
12823
  integer i;
12824
begin
12825
  write_status = 0;
12826
 
12827
  flags                    = 0;
12828
  flags`WB_TRANSFER_SIZE   = size_i;
12829
  flags`INIT_WAITS         = init_waits_i;
12830
  flags`SUBSEQ_WAITS       = subseq_waits_i;
12831
 
12832
  write_data               = 0;
12833
  write_data`WRITE_DATA    = data_i[31:0];
12834
  write_data`WRITE_ADDRESS = address_i;
12835
  write_data`WRITE_SEL     = sel_i;
12836
 
12837
  for (i = 0; i < size_i; i = i + 1)
12838
  begin
12839
    wb_master.blk_write_data[i] = write_data;
12840
    data_i                      = data_i >> 32;
12841
    write_data`WRITE_DATA       = data_i[31:0];
12842
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
12843 116 mohor
  end
12844
 
12845 169 mohor
  wb_master.wb_block_write(flags, write_status);
12846 116 mohor
 
12847 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
12848
  begin
12849
    `TIME;
12850
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
12851
  end
12852
end
12853
endtask // wbm_write
12854 116 mohor
 
12855 169 mohor
task wbm_read;
12856
  input  [31:0] address_i;
12857
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
12858
  input  [3:0]  sel_i;
12859
  input  [31:0] size_i;
12860
  input  [3:0]  init_waits_i;
12861
  input  [3:0]  subseq_waits_i;
12862
 
12863
  reg `READ_RETURN_TYPE read_data;
12864
  reg `WB_TRANSFER_FLAGS flags;
12865
  reg `READ_RETURN_TYPE read_status;
12866
  integer i;
12867
begin
12868
  read_status = 0;
12869
  data_o      = 0;
12870
 
12871
  flags                  = 0;
12872
  flags`WB_TRANSFER_SIZE = size_i;
12873
  flags`INIT_WAITS       = init_waits_i;
12874
  flags`SUBSEQ_WAITS     = subseq_waits_i;
12875
 
12876
  read_data              = 0;
12877
  read_data`READ_ADDRESS = address_i;
12878
  read_data`READ_SEL     = sel_i;
12879
 
12880
  for (i = 0; i < size_i; i = i + 1)
12881 116 mohor
  begin
12882 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
12883
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
12884
  end
12885
 
12886
  wb_master.wb_block_read(flags, read_status);
12887
 
12888
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
12889
  begin
12890
    `TIME;
12891
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
12892
  end
12893
 
12894
  for (i = 0; i < size_i; i = i + 1)
12895
  begin
12896
    data_o       = data_o << 32;
12897
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
12898
    data_o[31:0] = read_data`READ_DATA;
12899
  end
12900
end
12901
endtask // wbm_read
12902
 
12903
 
12904
//////////////////////////////////////////////////////////////
12905
// Ethernet Basic tasks
12906
//////////////////////////////////////////////////////////////
12907
 
12908
task hard_reset; //  MAC registers
12909
begin
12910
  // reset MAC registers
12911
  @(posedge wb_clk);
12912
  #2 wb_rst = 1'b1;
12913
  repeat(2) @(posedge wb_clk);
12914
  #2 wb_rst = 1'b0;
12915
end
12916
endtask // hard_reset
12917
 
12918
task reset_mac; //  MAC module
12919
  reg [31:0] tmp;
12920
  reg [31:0] tmp_no_rst;
12921
begin
12922
  // read MODER register first
12923
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12924
  // set reset bit - write back to MODER register with RESET bit
12925
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12926
  // clear reset bit - write back to MODER register without RESET bit
12927
  tmp_no_rst = `ETH_MODER_RST;
12928
  tmp_no_rst = ~tmp_no_rst;
12929
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12930
end
12931
endtask // reset_mac
12932
 
12933
task set_tx_bd;
12934
  input  [6:0]  tx_bd_num_start;
12935
  input  [6:0]  tx_bd_num_end;
12936
  input  [15:0] len;
12937
  input         irq;
12938
  input         pad;
12939
  input         crc;
12940
  input  [31:0] txpnt;
12941
 
12942
  integer       i;
12943
  integer       bd_status_addr, bd_ptr_addr;
12944
//  integer       buf_addr;
12945
begin
12946
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
12947
  begin
12948
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
12949
    bd_status_addr = `TX_BD_BASE + i * 8;
12950
    bd_ptr_addr = bd_status_addr + 4;
12951
    // initialize BD - status
12952
//    wbm_write(bd_status_addr, 32'h00005800, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
12953
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
12954
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
12955
    // initialize BD - pointer
12956
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
12957
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
12958
  end
12959
end
12960
endtask // set_tx_bd
12961
 
12962
task set_tx_bd_wrap;
12963
  input  [6:0]  tx_bd_num_end;
12964
  integer       bd_status_addr, tmp;
12965
begin
12966
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
12967
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12968
  // set wrap bit to this BD - this BD should be last-one
12969
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12970
end
12971
endtask // set_tx_bd_wrap
12972
 
12973
task set_tx_bd_ready;
12974
  input  [6:0]  tx_nd_num_strat;
12975
  input  [6:0]  tx_bd_num_end;
12976
  integer       i;
12977
  integer       bd_status_addr, tmp;
12978
begin
12979
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
12980
  begin
12981
    bd_status_addr = `TX_BD_BASE + i * 8;
12982
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12983
    // set empty bit to this BD - this BD should be ready
12984
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12985
  end
12986
end
12987
endtask // set_tx_bd_ready
12988
 
12989
task check_tx_bd;
12990
  input  [6:0]  tx_bd_num_end;
12991
  output [31:0] tx_bd_status;
12992
  integer       bd_status_addr, tmp;
12993
begin
12994
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
12995
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12996
  #1 tx_bd_status = tmp;
12997
  #1;
12998
end
12999
endtask // check_tx_bd
13000
 
13001
task clear_tx_bd;
13002
  input  [6:0]  tx_nd_num_strat;
13003
  input  [6:0]  tx_bd_num_end;
13004
  integer       i;
13005
  integer       bd_status_addr, bd_ptr_addr;
13006
begin
13007
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
13008
  begin
13009
    bd_status_addr = `TX_BD_BASE + i * 8;
13010
    bd_ptr_addr = bd_status_addr + 4;
13011
    // clear BD - status
13012
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13013
    // clear BD - pointer
13014
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13015
  end
13016
end
13017
endtask // clear_tx_bd
13018
 
13019
task set_rx_bd;
13020
  input  [6:0]  rx_bd_num_strat;
13021
  input  [6:0]  rx_bd_num_end;
13022
  input         irq;
13023
  input  [31:0] rxpnt;
13024
//  input  [6:0]  rxbd_num;
13025
  integer       i;
13026
  integer       bd_status_addr, bd_ptr_addr;
13027
//  integer       buf_addr;
13028
begin
13029
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
13030
  begin
13031
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
13032 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
13033
//    bd_ptr_addr = bd_status_addr + 4; 
13034
    bd_status_addr = `TX_BD_BASE + i * 8;
13035
    bd_ptr_addr = bd_status_addr + 4;
13036 116 mohor
 
13037 169 mohor
    // initialize BD - status
13038
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
13039
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
13040
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13041
    // initialize BD - pointer
13042
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
13043
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
13044
  end
13045
end
13046
endtask // set_rx_bd
13047 116 mohor
 
13048 169 mohor
task set_rx_bd_wrap;
13049
  input  [6:0]  rx_bd_num_end;
13050
  integer       bd_status_addr, tmp;
13051
begin
13052 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
13053
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
13054 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13055
  // set wrap bit to this BD - this BD should be last-one
13056
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13057
end
13058
endtask // set_rx_bd_wrap
13059 116 mohor
 
13060 169 mohor
task set_rx_bd_empty;
13061
  input  [6:0]  rx_bd_num_strat;
13062
  input  [6:0]  rx_bd_num_end;
13063
  integer       i;
13064
  integer       bd_status_addr, tmp;
13065
begin
13066
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
13067
  begin
13068 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
13069
    bd_status_addr = `TX_BD_BASE + i * 8;
13070 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13071
    // set empty bit to this BD - this BD should be ready
13072
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13073 116 mohor
  end
13074 169 mohor
end
13075
endtask // set_rx_bd_empty
13076 116 mohor
 
13077 169 mohor
task check_rx_bd;
13078
  input  [6:0]  rx_bd_num_end;
13079
  output [31:0] rx_bd_status;
13080
  integer       bd_status_addr, tmp;
13081
begin
13082 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
13083
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
13084 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13085
  #1 rx_bd_status = tmp;
13086
  #1;
13087
end
13088
endtask // check_rx_bd
13089 116 mohor
 
13090 169 mohor
task clear_rx_bd;
13091
  input  [6:0]  rx_bd_num_strat;
13092
  input  [6:0]  rx_bd_num_end;
13093
  integer       i;
13094
  integer       bd_status_addr, bd_ptr_addr;
13095
begin
13096
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
13097
  begin
13098 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
13099
    bd_status_addr = `TX_BD_BASE + i * 8;
13100 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
13101
    // clear BD - status
13102
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13103
    // clear BD - pointer
13104
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13105
  end
13106
end
13107
endtask // clear_rx_bd
13108 116 mohor
 
13109 169 mohor
task set_tx_packet;
13110
  input  [31:0] txpnt;
13111
  input  [15:0] len;
13112
  input  [7:0]  eth_start_data;
13113
  integer       i, sd;
13114
  integer       buffer;
13115
  reg           delta_t;
13116
begin
13117
  buffer = txpnt;
13118
  sd = eth_start_data;
13119
  delta_t = 0;
13120 116 mohor
 
13121 169 mohor
  // First write might not be word allign.
13122
  if(buffer[1:0] == 1)
13123
  begin
13124
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
13125
    sd = sd + 3;
13126
    i = 3;
13127
  end
13128
  else if(buffer[1:0] == 2)
13129
  begin
13130
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
13131
    sd = sd + 2;
13132
    i = 2;
13133
  end
13134
  else if(buffer[1:0] == 3)
13135
  begin
13136
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
13137
    sd = sd + 1;
13138
    i = 1;
13139
  end
13140
  else
13141
    i = 0;
13142
  delta_t = !delta_t;
13143 116 mohor
 
13144 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
13145
  begin
13146
    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);
13147
    sd = sd + 4;
13148
  end
13149
  delta_t = !delta_t;
13150
 
13151
  // Last word
13152
  if((len - i) == 3)
13153 116 mohor
  begin
13154 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);
13155
  end
13156
  else if((len - i) == 2)
13157
  begin
13158
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
13159
  end
13160
  else if((len - i) == 1)
13161
  begin
13162
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
13163
  end
13164
  else if((len - i) == 4)
13165
  begin
13166
    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);
13167
  end
13168
  else
13169
    $display("(%0t)(%m) ERROR", $time);
13170
  delta_t = !delta_t;
13171
end
13172
endtask // set_tx_packet
13173
 
13174
task check_tx_packet;
13175
  input  [31:0] txpnt_wb;  // source
13176
  input  [31:0] txpnt_phy; // destination
13177
  input  [15:0] len;
13178
  output [31:0] failure;
13179
  integer       i, data_wb, data_phy;
13180
  reg    [31:0] addr_wb, addr_phy;
13181
  reg    [31:0] failure;
13182
  reg           delta_t;
13183
begin
13184
  addr_wb = txpnt_wb;
13185
  addr_phy = txpnt_phy;
13186
  delta_t = 0;
13187
  failure = 0;
13188 209 tadejm
  #1;
13189 169 mohor
  // First write might not be word allign.
13190
  if(addr_wb[1:0] == 1)
13191
  begin
13192
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
13193
    data_phy[31:24] = 0;
13194
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
13195
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
13196
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
13197
    i = 3;
13198
    if (data_phy[23:0] !== data_wb[23:0])
13199
    begin
13200
      `TIME;
13201 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
13202
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13203 169 mohor
      failure = 1;
13204
    end
13205
  end
13206
  else if (addr_wb[1:0] == 2)
13207
  begin
13208
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
13209
    data_phy[31:16] = 0;
13210
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
13211
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
13212
    i = 2;
13213
    if (data_phy[15:0] !== data_wb[15:0])
13214
    begin
13215
      `TIME;
13216 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
13217
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13218 169 mohor
      failure = 1;
13219
    end
13220
  end
13221
  else if (addr_wb[1:0] == 3)
13222
  begin
13223
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
13224
    data_phy[31: 8] = 0;
13225
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
13226
    i = 1;
13227
    if (data_phy[7:0] !== data_wb[7:0])
13228
    begin
13229
      `TIME;
13230 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
13231
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13232 169 mohor
      failure = 1;
13233
    end
13234
  end
13235
  else
13236
    i = 0;
13237
  delta_t = !delta_t;
13238 209 tadejm
  #1;
13239 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
13240
  begin
13241
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
13242
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
13243
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
13244
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
13245
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
13246
    if (data_phy[31:0] !== data_wb[31:0])
13247
    begin
13248
      `TIME;
13249 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]);
13250
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13251 169 mohor
      failure = failure + 1;
13252
    end
13253
  end
13254
  delta_t = !delta_t;
13255 209 tadejm
  #1;
13256 169 mohor
  // Last word
13257
  if((len - i) == 3)
13258
  begin
13259
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
13260
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
13261
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
13262
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
13263
    data_phy[ 7: 0] = 0;
13264
    if (data_phy[31:8] !== data_wb[31:8])
13265
    begin
13266
      `TIME;
13267 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]);
13268
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13269 169 mohor
      failure = failure + 1;
13270
    end
13271
  end
13272
  else if((len - i) == 2)
13273
  begin
13274
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
13275
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
13276
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
13277
    data_phy[15: 8] = 0;
13278
    data_phy[ 7: 0] = 0;
13279
    if (data_phy[31:16] !== data_wb[31:16])
13280
    begin
13281
      `TIME;
13282 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]);
13283
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13284 169 mohor
      failure = failure + 1;
13285
    end
13286
  end
13287
  else if((len - i) == 1)
13288
  begin
13289
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
13290
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
13291
    data_phy[23:16] = 0;
13292
    data_phy[15: 8] = 0;
13293
    data_phy[ 7: 0] = 0;
13294
    if (data_phy[31:24] !== data_wb[31:24])
13295
    begin
13296
      `TIME;
13297 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]);
13298
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13299 169 mohor
      failure = failure + 1;
13300
    end
13301
  end
13302
  else if((len - i) == 4)
13303
  begin
13304
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
13305
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
13306
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
13307
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
13308
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
13309
    if (data_phy[31:0] !== data_wb[31:0])
13310
    begin
13311
      `TIME;
13312 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]);
13313
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
13314 169 mohor
      failure = failure + 1;
13315
    end
13316
  end
13317
  else
13318
    $display("(%0t)(%m) ERROR", $time);
13319
  delta_t = !delta_t;
13320
end
13321
endtask // check_tx_packet
13322
 
13323
task set_rx_packet;
13324
  input  [31:0] rxpnt;
13325
  input  [15:0] len;
13326
  input         plus_dribble_nibble; // if length is longer for one nibble
13327
  input  [47:0] eth_dest_addr;
13328
  input  [47:0] eth_source_addr;
13329
  input  [15:0] eth_type_len;
13330
  input  [7:0]  eth_start_data;
13331
  integer       i, sd;
13332
  reg    [47:0] dest_addr;
13333
  reg    [47:0] source_addr;
13334
  reg    [15:0] type_len;
13335
  reg    [21:0] buffer;
13336
  reg           delta_t;
13337
begin
13338
  buffer = rxpnt[21:0];
13339
  dest_addr = eth_dest_addr;
13340
  source_addr = eth_source_addr;
13341
  type_len = eth_type_len;
13342
  sd = eth_start_data;
13343
  delta_t = 0;
13344
  for(i = 0; i < len; i = i + 1)
13345
  begin
13346
    if (i < 6)
13347
    begin
13348
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
13349
      dest_addr = dest_addr << 8;
13350
    end
13351
    else if (i < 12)
13352
    begin
13353
      eth_phy.rx_mem[buffer] = source_addr[47:40];
13354
      source_addr = source_addr << 8;
13355
    end
13356
    else if (i < 14)
13357
    begin
13358
      eth_phy.rx_mem[buffer] = type_len[15:8];
13359
      type_len = type_len << 8;
13360
    end
13361
    else
13362
    begin
13363
      eth_phy.rx_mem[buffer] = sd[7:0];
13364
      sd = sd + 1;
13365
    end
13366
    buffer = buffer + 1;
13367
  end
13368
  delta_t = !delta_t;
13369
  if (plus_dribble_nibble)
13370
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
13371
  delta_t = !delta_t;
13372
end
13373
endtask // set_rx_packet
13374
 
13375
task check_rx_packet;
13376
  input  [31:0] rxpnt_phy; // source
13377
  input  [31:0] rxpnt_wb;  // destination
13378
  input  [15:0] len;
13379
  input         plus_dribble_nibble; // if length is longer for one nibble
13380
  input         successful_dribble_nibble; // if additional nibble is stored into memory
13381
  output [31:0] failure;
13382
  integer       i, data_wb, data_phy;
13383
  reg    [31:0] addr_wb, addr_phy;
13384
  reg    [31:0] failure;
13385
  reg    [21:0] buffer;
13386
  reg           delta_t;
13387
begin
13388
  addr_phy = rxpnt_phy;
13389
  addr_wb = rxpnt_wb;
13390
  delta_t = 0;
13391
  failure = 0;
13392
 
13393
  // First write might not be word allign.
13394
  if(addr_wb[1:0] == 1)
13395
  begin
13396
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
13397
    data_phy[31:24] = 0;
13398
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
13399
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
13400
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
13401
    i = 3;
13402
    if (data_phy[23:0] !== data_wb[23:0])
13403
    begin
13404
      `TIME;
13405
      $display("*E Wrong 1. word (3 bytes) of TX packet!");
13406
      failure = 1;
13407
    end
13408
  end
13409
  else if (addr_wb[1:0] == 2)
13410
  begin
13411
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
13412
    data_phy[31:16] = 0;
13413
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
13414
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
13415
    i = 2;
13416
    if (data_phy[15:0] !== data_wb[15:0])
13417
    begin
13418
      `TIME;
13419
      $display("*E Wrong 1. word (2 bytes) of TX packet!");
13420
      failure = 1;
13421
    end
13422
  end
13423
  else if (addr_wb[1:0] == 3)
13424
  begin
13425
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
13426
    data_phy[31: 8] = 0;
13427
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
13428
    i = 1;
13429
    if (data_phy[7:0] !== data_wb[7:0])
13430
    begin
13431
      `TIME;
13432
      $display("*E Wrong 1. word (1 byte) of TX packet!");
13433
      failure = 1;
13434
    end
13435
  end
13436
  else
13437
    i = 0;
13438
  delta_t = !delta_t;
13439
 
13440
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
13441
  begin
13442
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
13443
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
13444
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
13445
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
13446
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
13447
    if (data_phy[31:0] !== data_wb[31:0])
13448
    begin
13449
      `TIME;
13450
      $display("*E Wrong %d. word (4 bytes) of TX packet!", ((i/4)+1));
13451
      failure = failure + 1;
13452
    end
13453
  end
13454
  delta_t = !delta_t;
13455
 
13456
  // Last word
13457
  if((len - i) == 3)
13458
  begin
13459
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
13460
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
13461
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
13462
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
13463
    if (plus_dribble_nibble)
13464
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
13465
    else
13466
      data_phy[ 7: 0] = 0;
13467
    if (data_phy[31:8] !== data_wb[31:8])
13468
    begin
13469
      `TIME;
13470
      $display("*E Wrong %d. word (3 bytes) of TX packet!", ((i/4)+1));
13471
      failure = failure + 1;
13472
    end
13473
    if (plus_dribble_nibble && successful_dribble_nibble)
13474
    begin
13475
      if (data_phy[3:0] !== data_wb[3:0])
13476 116 mohor
      begin
13477 169 mohor
        `TIME;
13478
        $display("*E Wrong dribble nibble in %d. word (3 bytes) of TX packet!", ((i/4)+1));
13479
        failure = failure + 1;
13480 116 mohor
      end
13481 169 mohor
    end
13482
    else if (plus_dribble_nibble && !successful_dribble_nibble)
13483
    begin
13484
      if (data_phy[3:0] === data_wb[3:0])
13485 116 mohor
      begin
13486 169 mohor
        `TIME;
13487
        $display("*E Wrong dribble nibble in %d. word (3 bytes) of TX packet!", ((i/4)+1));
13488
        failure = failure + 1;
13489 116 mohor
      end
13490 169 mohor
    end
13491
  end
13492
  else if((len - i) == 2)
13493
  begin
13494
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
13495
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
13496
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
13497
    if (plus_dribble_nibble)
13498
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
13499
    else
13500
      data_phy[15: 8] = 0;
13501
    data_phy[ 7: 0] = 0;
13502
    if (data_phy[31:16] !== data_wb[31:16])
13503
    begin
13504
      `TIME;
13505
      $display("*E Wrong %d. word (2 bytes) of TX packet!", ((i/4)+1));
13506
      failure = failure + 1;
13507
    end
13508
    if (plus_dribble_nibble && successful_dribble_nibble)
13509
    begin
13510
      if (data_phy[11:8] !== data_wb[11:8])
13511
      begin
13512
        `TIME;
13513
        $display("*E Wrong dribble nibble in %d. word (2 bytes) of TX packet!", ((i/4)+1));
13514
        failure = failure + 1;
13515
      end
13516
    end
13517
    else if (plus_dribble_nibble && !successful_dribble_nibble)
13518
    begin
13519
      if (data_phy[11:8] === data_wb[11:8])
13520
      begin
13521
        `TIME;
13522
        $display("*E Wrong dribble nibble in %d. word (2 bytes) of TX packet!", ((i/4)+1));
13523
        failure = failure + 1;
13524
      end
13525
    end
13526
  end
13527
  else if((len - i) == 1)
13528
  begin
13529
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
13530
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
13531
    if (plus_dribble_nibble)
13532
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
13533
    else
13534
      data_phy[23:16] = 0;
13535
    data_phy[15: 8] = 0;
13536
    data_phy[ 7: 0] = 0;
13537
    if (data_phy[31:24] !== data_wb[31:24])
13538
    begin
13539
      `TIME;
13540
      $display("*E Wrong %d. word (1 byte) of TX packet!", ((i/4)+1));
13541
      failure = failure + 1;
13542
    end
13543
    if (plus_dribble_nibble && successful_dribble_nibble)
13544
    begin
13545
      if (data_phy[19:16] !== data_wb[19:16])
13546
      begin
13547
        `TIME;
13548
        $display("*E Wrong dribble nibble in %d. word (1 byte) of TX packet!", ((i/4)+1));
13549
        failure = failure + 1;
13550
      end
13551
    end
13552
    else if (plus_dribble_nibble && !successful_dribble_nibble)
13553
    begin
13554
      if (data_phy[19:16] === data_wb[19:16])
13555
      begin
13556
        `TIME;
13557
        $display("*E Wrong dribble nibble in %d. word (1 byte) of TX packet!", ((i/4)+1));
13558
        failure = failure + 1;
13559
      end
13560
    end
13561
  end
13562
  else if((len - i) == 4)
13563
  begin
13564
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
13565
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
13566
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
13567
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
13568
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
13569
    if (data_phy[31:0] !== data_wb[31:0])
13570
    begin
13571
      `TIME;
13572
      $display("*E Wrong %d. word (4 bytes) of TX packet!", ((i/4)+1));
13573
      failure = failure + 1;
13574
    end
13575
    if (plus_dribble_nibble)
13576
    begin
13577
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
13578
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
13579
      if (successful_dribble_nibble)
13580
      begin
13581
        if (data_phy[27:24] !== data_wb[27:24])
13582
        begin
13583
          `TIME;
13584
          $display("*E Wrong dribble nibble in %d. word (0 bytes) of TX packet!", ((i/4)+2));
13585
          failure = failure + 1;
13586
        end
13587
      end
13588
      else
13589
      begin
13590
        if (data_phy[27:24] === data_wb[27:24])
13591
        begin
13592
          `TIME;
13593
          $display("*E Wrong dribble nibble in %d. word (0 bytes) of TX packet!", ((i/4)+2));
13594
          failure = failure + 1;
13595
        end
13596
      end
13597
    end
13598
  end
13599
  else
13600
    $display("(%0t)(%m) ERROR", $time);
13601
  delta_t = !delta_t;
13602
end
13603
endtask // check_rx_packet
13604 116 mohor
 
13605 169 mohor
//////////////////////////////////////////////////////////////
13606
// Ethernet CRC Basic tasks
13607
//////////////////////////////////////////////////////////////
13608
 
13609
task append_tx_crc;
13610
  input  [31:0] txpnt_wb;  // source
13611
  input  [15:0] len; // length in bytes without CRC
13612
  input         negated_crc; // if appended CRC is correct or not
13613
  reg    [31:0] crc;
13614
  reg    [31:0] addr_wb;
13615
  reg           delta_t;
13616
begin
13617
  addr_wb = txpnt_wb + len;
13618
  delta_t = 0;
13619
  // calculate CRC from prepared packet
13620
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
13621
  if (negated_crc)
13622
    crc = ~crc;
13623
  delta_t = !delta_t;
13624
 
13625
  // Write might not be word allign.
13626
  if (addr_wb[1:0] == 1)
13627
  begin
13628
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
13629
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
13630 116 mohor
  end
13631 169 mohor
  else if (addr_wb[1:0] == 2)
13632
  begin
13633
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
13634
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
13635
  end
13636
  else if (addr_wb[1:0] == 3)
13637
  begin
13638
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
13639
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
13640
  end
13641
  else
13642
  begin
13643
    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
13644
  end
13645
  delta_t = !delta_t;
13646
end
13647
endtask // append_tx_crc
13648 116 mohor
 
13649 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
13650
  input  [31:0] txpnt_phy; // destination
13651
  input  [15:0] len; // length in bytes without CRC
13652
  input         negated_crc; // if appended CRC is correct or not
13653
  output [31:0] failure;
13654
  reg    [31:0] failure;
13655
  reg    [31:0] crc_calc;
13656
  reg    [31:0] crc;
13657
  reg    [31:0] addr_phy;
13658
  reg           delta_t;
13659
begin
13660
  addr_phy = txpnt_phy;
13661
  failure = 0;
13662
  // calculate CRC from sent packet
13663
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
13664
//#10;
13665
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
13666 209 tadejm
  #1;
13667 169 mohor
  addr_phy = addr_phy + len;
13668
  // Read CRC - BIG endian
13669
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
13670
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
13671
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
13672
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
13673
 
13674
  delta_t = !delta_t;
13675
  if (negated_crc)
13676
  begin
13677
    if ((~crc_calc) !== crc)
13678
    begin
13679
      `TIME;
13680
      $display("*E Negated CRC was not successfuly transmitted!");
13681
      failure = failure + 1;
13682
    end
13683
  end
13684
  else
13685
  begin
13686
    if (crc_calc !== crc)
13687
    begin
13688
      `TIME;
13689 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
13690 169 mohor
      failure = failure + 1;
13691
    end
13692
  end
13693
  delta_t = !delta_t;
13694
end
13695
endtask // check_tx_crc
13696
 
13697
task append_rx_crc;
13698
  input  [31:0] rxpnt_phy; // source
13699
  input  [15:0] len; // length in bytes without CRC
13700
  input         plus_dribble_nibble; // if length is longer for one nibble
13701
  input         negated_crc; // if appended CRC is correct or not
13702
  reg    [31:0] crc;
13703
  reg    [7:0]  tmp;
13704
  reg    [31:0] addr_phy;
13705
  reg           delta_t;
13706
begin
13707
  addr_phy = rxpnt_phy + len;
13708
  delta_t = 0;
13709
  // calculate CRC from prepared packet
13710
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
13711
  if (negated_crc)
13712
    crc = ~crc;
13713
  delta_t = !delta_t;
13714
 
13715
  if (plus_dribble_nibble)
13716
  begin
13717
    tmp = eth_phy.rx_mem[addr_phy];
13718 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
13719
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
13720
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
13721
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
13722
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
13723 169 mohor
  end
13724
  else
13725
  begin
13726 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
13727
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
13728
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
13729
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
13730 169 mohor
  end
13731
end
13732
endtask // append_rx_crc
13733
 
13734
// paralel CRC checking for PHY TX
13735
task paralel_crc_phy_tx;
13736
  input  [31:0] start_addr; // start address
13737
  input  [31:0] len; // length of frame in Bytes without CRC length
13738
  input         plus_dribble_nibble; // if length is longer for one nibble
13739
  output [31:0] crc_out;
13740
  reg    [21:0] addr_cnt; // only 22 address lines
13741
  integer       word_cnt;
13742
  integer       nibble_cnt;
13743
  reg    [31:0] load_reg;
13744
  reg           delta_t;
13745
  reg    [31:0] crc_next;
13746
  reg    [31:0] crc;
13747
  reg           crc_error;
13748
  reg     [3:0] data_in;
13749
  integer       i;
13750
begin
13751
  #1 addr_cnt = start_addr[21:0];
13752
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
13753
  crc = 32'hFFFF_FFFF; // INITIAL value
13754
  delta_t = 0;
13755
  // length must include 4 bytes of ZEROs, to generate CRC
13756
  // get number of nibbles from Byte length (2^1 = 2)
13757
  if (plus_dribble_nibble)
13758
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
13759
  else
13760
    nibble_cnt = ((len + 4) << 1);
13761
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
13762
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
13763
  addr_cnt = addr_cnt + 1;
13764
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
13765
  addr_cnt = addr_cnt + 1;
13766
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
13767
  addr_cnt = addr_cnt + 1;
13768
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
13769
  addr_cnt = addr_cnt + 1;
13770
  while (nibble_cnt > 0)
13771
  begin
13772
    // wait for delta time
13773
    delta_t = !delta_t;
13774
    // shift data in
13775
 
13776
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
13777
      data_in[3:0] = 4'h0;
13778
    else
13779
 
13780
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
13781
    crc_next[0]  = (data_in[0] ^ crc[28]);
13782
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
13783
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
13784
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
13785
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
13786
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
13787
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
13788
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
13789
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
13790
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
13791
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
13792
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
13793
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
13794
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
13795
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
13796
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
13797
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
13798
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
13799
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
13800
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
13801
    crc_next[20] =  crc[16];
13802
    crc_next[21] =  crc[17];
13803
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
13804
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
13805
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
13806
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
13807
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
13808
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
13809
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
13810
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
13811
    crc_next[30] =  crc[26];
13812
    crc_next[31] =  crc[27];
13813
 
13814
    crc = crc_next;
13815
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
13816
    case (nibble_cnt)
13817
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
13818
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
13819
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
13820
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
13821
    default: crc_out = crc_out;
13822
    endcase
13823
    // wait for delta time
13824
    delta_t = !delta_t;
13825
    // increment address and load new data
13826
    if ((word_cnt+3) == 7)//4)
13827
    begin
13828
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
13829
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
13830
      addr_cnt = addr_cnt + 1;
13831
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
13832
      addr_cnt = addr_cnt + 1;
13833
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
13834
      addr_cnt = addr_cnt + 1;
13835
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
13836
      addr_cnt = addr_cnt + 1;
13837
    end
13838
    // set new load bit position
13839
    if((word_cnt+3) == 31)
13840
      word_cnt = 16;
13841
    else if ((word_cnt+3) == 23)
13842
      word_cnt = 8;
13843
    else if ((word_cnt+3) == 15)
13844
      word_cnt = 0;
13845
    else if ((word_cnt+3) == 7)
13846
      word_cnt = 24;
13847
    else
13848
      word_cnt = word_cnt + 4;// - 4;
13849
    // decrement nibble counter
13850
    nibble_cnt = nibble_cnt - 1;
13851
    // wait for delta time
13852
    delta_t = !delta_t;
13853
  end // while
13854
  #1;
13855
end
13856
endtask // paralel_crc_phy_tx
13857
 
13858
// paralel CRC calculating for PHY RX
13859
task paralel_crc_phy_rx;
13860
  input  [31:0] start_addr; // start address
13861
  input  [31:0] len; // length of frame in Bytes without CRC length
13862
  input         plus_dribble_nibble; // if length is longer for one nibble
13863 209 tadejm
  output [31:0] crc_out;
13864 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
13865
  integer       word_cnt;
13866 209 tadejm
  integer       nibble_cnt;
13867 169 mohor
  reg    [31:0] load_reg;
13868
  reg           delta_t;
13869 209 tadejm
  reg    [31:0] crc_next;
13870
  reg    [31:0] crc;
13871
  reg           crc_error;
13872
  reg     [3:0] data_in;
13873
  integer       i;
13874 169 mohor
begin
13875
  #1 addr_cnt = start_addr[21:0];
13876 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
13877
  crc = 32'hFFFF_FFFF; // INITIAL value
13878 169 mohor
  delta_t = 0;
13879
  // length must include 4 bytes of ZEROs, to generate CRC
13880 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
13881 169 mohor
  if (plus_dribble_nibble)
13882 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
13883 169 mohor
  else
13884 209 tadejm
    nibble_cnt = ((len + 4) << 1);
13885
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
13886 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
13887
  addr_cnt = addr_cnt + 1;
13888
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
13889
  addr_cnt = addr_cnt + 1;
13890 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
13891 169 mohor
  addr_cnt = addr_cnt + 1;
13892 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
13893
  addr_cnt = addr_cnt + 1;
13894
  while (nibble_cnt > 0)
13895 169 mohor
  begin
13896
    // wait for delta time
13897
    delta_t = !delta_t;
13898
    // shift data in
13899 209 tadejm
 
13900
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
13901
      data_in[3:0] = 4'h0;
13902 169 mohor
    else
13903 209 tadejm
 
13904
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
13905
    crc_next[0]  = (data_in[0] ^ crc[28]);
13906
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
13907
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
13908
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
13909
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
13910
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
13911
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
13912
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
13913
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
13914
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
13915
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
13916
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
13917
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
13918
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
13919
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
13920
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
13921
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
13922
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
13923
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
13924
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
13925
    crc_next[20] =  crc[16];
13926
    crc_next[21] =  crc[17];
13927
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
13928
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
13929
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
13930
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
13931
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
13932
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
13933
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
13934
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
13935
    crc_next[30] =  crc[26];
13936
    crc_next[31] =  crc[27];
13937
 
13938
    crc = crc_next;
13939
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
13940
    case (nibble_cnt)
13941
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
13942
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
13943
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
13944
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
13945
    default: crc_out = crc_out;
13946
    endcase
13947 169 mohor
    // wait for delta time
13948
    delta_t = !delta_t;
13949
    // increment address and load new data
13950 209 tadejm
    if ((word_cnt+3) == 7)//4)
13951 169 mohor
    begin
13952 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
13953 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
13954
      addr_cnt = addr_cnt + 1;
13955
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
13956
      addr_cnt = addr_cnt + 1;
13957 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
13958 169 mohor
      addr_cnt = addr_cnt + 1;
13959 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
13960
      addr_cnt = addr_cnt + 1;
13961 169 mohor
    end
13962
    // set new load bit position
13963 209 tadejm
    if((word_cnt+3) == 31)
13964 169 mohor
      word_cnt = 16;
13965 209 tadejm
    else if ((word_cnt+3) == 23)
13966 169 mohor
      word_cnt = 8;
13967 209 tadejm
    else if ((word_cnt+3) == 15)
13968 169 mohor
      word_cnt = 0;
13969 209 tadejm
    else if ((word_cnt+3) == 7)
13970 169 mohor
      word_cnt = 24;
13971
    else
13972 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
13973
    // decrement nibble counter
13974
    nibble_cnt = nibble_cnt - 1;
13975 169 mohor
    // wait for delta time
13976
    delta_t = !delta_t;
13977
  end // while
13978
  #1;
13979
end
13980
endtask // paralel_crc_phy_rx
13981
 
13982
// paralel CRC checking for MAC
13983
task paralel_crc_mac;
13984
  input  [31:0] start_addr; // start address
13985
  input  [31:0] len; // length of frame in Bytes without CRC length
13986
  input         plus_dribble_nibble; // if length is longer for one nibble
13987 209 tadejm
  output [31:0] crc_out;
13988
 
13989
  reg    [21:0] addr_cnt; // only 22 address lines
13990 169 mohor
  integer       word_cnt;
13991 209 tadejm
  integer       nibble_cnt;
13992 169 mohor
  reg    [31:0] load_reg;
13993
  reg           delta_t;
13994 209 tadejm
  reg    [31:0] crc_next;
13995
  reg    [31:0] crc;
13996
  reg           crc_error;
13997
  reg     [3:0] data_in;
13998
  integer       i;
13999 169 mohor
begin
14000
  #1 addr_cnt = start_addr[19:0];
14001
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
14002
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
14003
  if (addr_cnt[1:0] == 2'h1)
14004
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14005
  else if (addr_cnt[1:0] == 2'h2)
14006
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14007
  else if (addr_cnt[1:0] == 2'h3)
14008
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14009
  else
14010
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14011 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
14012 169 mohor
  delta_t = 0;
14013
  // length must include 4 bytes of ZEROs, to generate CRC
14014 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
14015 169 mohor
  if (plus_dribble_nibble)
14016 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
14017 169 mohor
  else
14018 209 tadejm
    nibble_cnt = ((len + 4) << 1);
14019 169 mohor
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
14020 209 tadejm
  addr_cnt = addr_cnt + 4;
14021
  while (nibble_cnt > 0)
14022 169 mohor
  begin
14023
    // wait for delta time
14024
    delta_t = !delta_t;
14025
    // shift data in
14026 209 tadejm
 
14027
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
14028
      data_in[3:0] = 4'h0;
14029 169 mohor
    else
14030 209 tadejm
 
14031
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
14032
    crc_next[0]  = (data_in[0] ^ crc[28]);
14033
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
14034
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
14035
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
14036
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
14037
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
14038
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
14039
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
14040
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
14041
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
14042
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
14043
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
14044
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
14045
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
14046
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
14047
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
14048
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
14049
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
14050
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
14051
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
14052
    crc_next[20] =  crc[16];
14053
    crc_next[21] =  crc[17];
14054
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
14055
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
14056
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
14057
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
14058
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
14059
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
14060
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
14061
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
14062
    crc_next[30] =  crc[26];
14063
    crc_next[31] =  crc[27];
14064
 
14065
    crc = crc_next;
14066
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
14067
    case (nibble_cnt)
14068
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
14069
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
14070
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
14071
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
14072
    default: crc_out = crc_out;
14073
    endcase
14074 169 mohor
    // wait for delta time
14075
    delta_t = !delta_t;
14076 209 tadejm
    // increment address and load new data
14077
    if ((word_cnt+3) == 7)//4)
14078 169 mohor
    begin
14079 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
14080
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
14081 169 mohor
      addr_cnt = addr_cnt + 4;
14082
    end
14083 209 tadejm
    // set new load bit position
14084
    if((word_cnt+3) == 31)
14085 169 mohor
      word_cnt = 16;
14086 209 tadejm
    else if ((word_cnt+3) == 23)
14087 169 mohor
      word_cnt = 8;
14088 209 tadejm
    else if ((word_cnt+3) == 15)
14089 169 mohor
      word_cnt = 0;
14090 209 tadejm
    else if ((word_cnt+3) == 7)
14091 169 mohor
      word_cnt = 24;
14092
    else
14093 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
14094
    // decrement nibble counter
14095
    nibble_cnt = nibble_cnt - 1;
14096 169 mohor
    // wait for delta time
14097
    delta_t = !delta_t;
14098
  end // while
14099
  #1;
14100
end
14101
endtask // paralel_crc_mac
14102
 
14103
// serial CRC checking for PHY TX
14104
task serial_crc_phy_tx;
14105
  input  [31:0] start_addr; // start address
14106
  input  [31:0] len; // length of frame in Bytes without CRC length
14107
  input         plus_dribble_nibble; // if length is longer for one nibble
14108
  output [31:0] crc;
14109
  reg    [21:0] addr_cnt; // only 22 address lines
14110
  integer       word_cnt;
14111
  integer       bit_cnt;
14112
  reg    [31:0] load_reg;
14113
  reg    [31:0] crc_shift_reg;
14114
  reg    [31:0] crc_store_reg;
14115
  reg           delta_t;
14116
begin
14117
  #1 addr_cnt = start_addr[21:0];
14118
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
14119
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
14120
  delta_t = 0;
14121
  // length must include 4 bytes of ZEROs, to generate CRC
14122
  // get number of bits from Byte length (2^3 = 8)
14123
  if (plus_dribble_nibble)
14124
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
14125
  else
14126
    bit_cnt = ((len + 4) << 3);
14127
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
14128
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
14129
  addr_cnt = addr_cnt + 1;
14130
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
14131
  addr_cnt = addr_cnt + 1;
14132
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
14133
  addr_cnt = addr_cnt + 1;
14134
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
14135
  addr_cnt = addr_cnt + 1;
14136
#1;
14137
  while (bit_cnt > 0)
14138
  begin
14139
    // wait for delta time
14140
    delta_t = !delta_t;
14141
#1;
14142
    // shift data in
14143
 
14144
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
14145
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
14146
    else
14147
 
14148
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
14149
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
14150
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
14151
    crc_shift_reg[3]  = crc_store_reg[2];
14152
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
14153
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
14154
    crc_shift_reg[6]  = crc_store_reg[5];
14155
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
14156
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
14157
    crc_shift_reg[9]  = crc_store_reg[8];
14158
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
14159
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
14160
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
14161
    crc_shift_reg[13] = crc_store_reg[12];
14162
    crc_shift_reg[14] = crc_store_reg[13];
14163
    crc_shift_reg[15] = crc_store_reg[14];
14164
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
14165
    crc_shift_reg[17] = crc_store_reg[16];
14166
    crc_shift_reg[18] = crc_store_reg[17];
14167
    crc_shift_reg[19] = crc_store_reg[18];
14168
    crc_shift_reg[20] = crc_store_reg[19];
14169
    crc_shift_reg[21] = crc_store_reg[20];
14170
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
14171
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
14172
    crc_shift_reg[24] = crc_store_reg[23];
14173
    crc_shift_reg[25] = crc_store_reg[24];
14174
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
14175
    crc_shift_reg[27] = crc_store_reg[26];
14176
    crc_shift_reg[28] = crc_store_reg[27];
14177
    crc_shift_reg[29] = crc_store_reg[28];
14178
    crc_shift_reg[30] = crc_store_reg[29];
14179
    crc_shift_reg[31] = crc_store_reg[30];
14180
    // wait for delta time
14181
    delta_t = !delta_t;
14182
 
14183
    // store previous data
14184
    crc_store_reg = crc_shift_reg;
14185
 
14186
    // put CRC out
14187
    case (bit_cnt)
14188
    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:
14189
    begin
14190
      crc = crc_store_reg;
14191
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
14192
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
14193
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
14194
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
14195
    end
14196
    default: crc = crc;
14197
    endcase
14198
 
14199
    // increment address and load new data
14200
#1;
14201
    if (word_cnt == 7)//4)
14202
    begin
14203
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
14204
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
14205
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
14206
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
14207
      addr_cnt = addr_cnt + 1;
14208
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
14209
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
14210
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
14211
      addr_cnt = addr_cnt + 1;
14212
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
14213
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
14214
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
14215
      addr_cnt = addr_cnt + 1;
14216
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
14217
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
14218
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
14219
      addr_cnt = addr_cnt + 1;
14220
    end
14221
#1;
14222
    // set new load bit position
14223
    if(word_cnt == 31)
14224
      word_cnt = 16;
14225
    else if (word_cnt == 23)
14226
      word_cnt = 8;
14227
    else if (word_cnt == 15)
14228
      word_cnt = 0;
14229
    else if (word_cnt == 7)
14230
      word_cnt = 24;
14231
 
14232
//   if(word_cnt == 24)
14233
//     word_cnt = 31;
14234
//   else if (word_cnt == 28)
14235
//     word_cnt = 19;
14236
//   else if (word_cnt == 16)
14237
//     word_cnt = 23;
14238
//   else if (word_cnt == 20)
14239
//     word_cnt = 11;
14240
//   else if(word_cnt == 8)
14241
//     word_cnt = 15;
14242
//   else if (word_cnt == 12)
14243
//     word_cnt = 3;
14244
//   else if (word_cnt == 0)
14245
//     word_cnt = 7;
14246
//   else if (word_cnt == 4)
14247
//     word_cnt = 27;
14248
    else
14249
      word_cnt = word_cnt + 1;// - 1;
14250
#1;
14251
    // decrement bit counter
14252
    bit_cnt = bit_cnt - 1;
14253
#1;
14254
    // wait for delta time
14255
    delta_t = !delta_t;
14256
  end // while
14257
 
14258
  #1;
14259
end
14260
endtask // serial_crc_phy_tx
14261
 
14262
// serial CRC calculating for PHY RX
14263
task serial_crc_phy_rx;
14264
  input  [31:0] start_addr; // start address
14265
  input  [31:0] len; // length of frame in Bytes without CRC length
14266
  input         plus_dribble_nibble; // if length is longer for one nibble
14267
  output [31:0] crc;
14268
  reg    [21:0] addr_cnt; // only 22 address lines
14269
  integer       word_cnt;
14270
  integer       bit_cnt;
14271
  reg    [31:0] load_reg;
14272
  reg    [31:0] crc_shift_reg;
14273
  reg    [31:0] crc_store_reg;
14274
  reg           delta_t;
14275
begin
14276
  #1 addr_cnt = start_addr[21:0];
14277
  word_cnt = 24; // start of the frame
14278
  crc_shift_reg = 0;
14279
  delta_t = 0;
14280
  // length must include 4 bytes of ZEROs, to generate CRC
14281
  // get number of bits from Byte length (2^3 = 8)
14282
  if (plus_dribble_nibble)
14283
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
14284
  else
14285
    bit_cnt = ((len + 4) << 3);
14286
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
14287
  addr_cnt = addr_cnt + 1;
14288
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
14289
  addr_cnt = addr_cnt + 1;
14290
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
14291
  addr_cnt = addr_cnt + 1;
14292
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
14293
 
14294
  while (bit_cnt > 0)
14295
  begin
14296
    // wait for delta time
14297
    delta_t = !delta_t;
14298
    // store previous data
14299
    crc_store_reg = crc_shift_reg;
14300
    // shift data in
14301
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
14302
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
14303
    else
14304
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
14305
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
14306
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
14307
    crc_shift_reg[3]  = crc_store_reg[2];
14308
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
14309
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
14310
    crc_shift_reg[6]  = crc_store_reg[5];
14311
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
14312
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
14313
    crc_shift_reg[9]  = crc_store_reg[8];
14314
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
14315
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
14316
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
14317
    crc_shift_reg[13] = crc_store_reg[12];
14318
    crc_shift_reg[14] = crc_store_reg[13];
14319
    crc_shift_reg[15] = crc_store_reg[14];
14320
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
14321
    crc_shift_reg[17] = crc_store_reg[16];
14322
    crc_shift_reg[18] = crc_store_reg[17];
14323
    crc_shift_reg[19] = crc_store_reg[18];
14324
    crc_shift_reg[20] = crc_store_reg[19];
14325
    crc_shift_reg[21] = crc_store_reg[20];
14326
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
14327
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
14328
    crc_shift_reg[24] = crc_store_reg[23];
14329
    crc_shift_reg[25] = crc_store_reg[24];
14330
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
14331
    crc_shift_reg[27] = crc_store_reg[26];
14332
    crc_shift_reg[28] = crc_store_reg[27];
14333
    crc_shift_reg[29] = crc_store_reg[28];
14334
    crc_shift_reg[30] = crc_store_reg[29];
14335
    crc_shift_reg[31] = crc_store_reg[30];
14336
    // wait for delta time
14337
    delta_t = !delta_t;
14338
    // increment address and load new data
14339
    if (word_cnt == 7)
14340
    begin
14341
      addr_cnt = addr_cnt + 1;
14342
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
14343
      addr_cnt = addr_cnt + 1;
14344
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
14345
      addr_cnt = addr_cnt + 1;
14346
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
14347
      addr_cnt = addr_cnt + 1;
14348
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
14349
    end
14350
    // set new load bit position
14351
    if(word_cnt == 31)
14352
      word_cnt = 16;
14353
    else if (word_cnt == 23)
14354
      word_cnt = 8;
14355
    else if (word_cnt == 15)
14356
      word_cnt = 0;
14357
    else if (word_cnt == 7)
14358
      word_cnt = 24;
14359
    else
14360
      word_cnt = word_cnt + 1;
14361
    // decrement bit counter
14362
    bit_cnt = bit_cnt - 1;
14363
    // wait for delta time
14364
    delta_t = !delta_t;
14365
  end // while
14366
 
14367
  // put CRC out
14368
  crc = crc_shift_reg;
14369
  #1;
14370
end
14371
endtask // serial_crc_phy_rx
14372
 
14373
// serial CRC checking for MAC
14374
task serial_crc_mac;
14375
  input  [31:0] start_addr; // start address
14376
  input  [31:0] len; // length of frame in Bytes without CRC length
14377
  input         plus_dribble_nibble; // if length is longer for one nibble
14378
  output [31:0] crc;
14379
  reg    [19:0] addr_cnt; // only 20 address lines
14380
  integer       word_cnt;
14381
  integer       bit_cnt;
14382
  reg    [31:0] load_reg;
14383
  reg    [31:0] crc_shift_reg;
14384
  reg    [31:0] crc_store_reg;
14385
  reg           delta_t;
14386
begin
14387
  #1 addr_cnt = start_addr[19:0];
14388
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
14389
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
14390
  if (addr_cnt[1:0] == 2'h1)
14391
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14392
  else if (addr_cnt[1:0] == 2'h2)
14393
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14394
  else if (addr_cnt[1:0] == 2'h3)
14395
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14396
  else
14397
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
14398
 
14399
  crc_shift_reg = 0;
14400
  delta_t = 0;
14401
  // length must include 4 bytes of ZEROs, to generate CRC
14402
  // get number of bits from Byte length (2^3 = 8)
14403
  if (plus_dribble_nibble)
14404
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
14405
  else
14406
    bit_cnt = ((len + 4) << 3);
14407
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
14408
 
14409
  while (bit_cnt > 0)
14410
  begin
14411
    // wait for delta time
14412
    delta_t = !delta_t;
14413
    // store previous data
14414
    crc_store_reg = crc_shift_reg;
14415
    // shift data in
14416
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
14417
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
14418
    else
14419
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
14420
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
14421
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
14422
    crc_shift_reg[3]  = crc_store_reg[2];
14423
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
14424
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
14425
    crc_shift_reg[6]  = crc_store_reg[5];
14426
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
14427
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
14428
    crc_shift_reg[9]  = crc_store_reg[8];
14429
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
14430
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
14431
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
14432
    crc_shift_reg[13] = crc_store_reg[12];
14433
    crc_shift_reg[14] = crc_store_reg[13];
14434
    crc_shift_reg[15] = crc_store_reg[14];
14435
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
14436
    crc_shift_reg[17] = crc_store_reg[16];
14437
    crc_shift_reg[18] = crc_store_reg[17];
14438
    crc_shift_reg[19] = crc_store_reg[18];
14439
    crc_shift_reg[20] = crc_store_reg[19];
14440
    crc_shift_reg[21] = crc_store_reg[20];
14441
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
14442
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
14443
    crc_shift_reg[24] = crc_store_reg[23];
14444
    crc_shift_reg[25] = crc_store_reg[24];
14445
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
14446
    crc_shift_reg[27] = crc_store_reg[26];
14447
    crc_shift_reg[28] = crc_store_reg[27];
14448
    crc_shift_reg[29] = crc_store_reg[28];
14449
    crc_shift_reg[30] = crc_store_reg[29];
14450
    crc_shift_reg[31] = crc_store_reg[30];
14451
    // wait for delta time
14452
    delta_t = !delta_t;
14453
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
14454
    if (word_cnt == 7)
14455
    begin
14456
      addr_cnt = addr_cnt + 4;
14457
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
14458
    end
14459
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
14460
    if(word_cnt == 31)
14461
      word_cnt = 16;
14462
    else if (word_cnt == 23)
14463
      word_cnt = 8;
14464
    else if (word_cnt == 15)
14465
      word_cnt = 0;
14466
    else if (word_cnt == 7)
14467
      word_cnt = 24;
14468
    else
14469
      word_cnt = word_cnt + 1;
14470
    // decrement bit counter
14471
    bit_cnt = bit_cnt - 1;
14472
    // wait for delta time
14473
    delta_t = !delta_t;
14474
  end // while
14475
 
14476
  // put CRC out
14477
  crc = crc_shift_reg;
14478
  #1;
14479
end
14480
endtask // serial_crc_mac
14481
 
14482
//////////////////////////////////////////////////////////////
14483
// MIIM Basic tasks
14484
//////////////////////////////////////////////////////////////
14485
 
14486
task reset_mii; //  MII module
14487
  reg [31:0] tmp;
14488
  reg [31:0] tmp_no_rst;
14489
begin
14490
  // read MII mode register first
14491
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14492
  // set reset bit - write back to MII mode register with RESET bit
14493
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14494
  // clear reset bit - write back to MII mode register without RESET bit
14495
  tmp_no_rst = `ETH_MIIMODER_RST;
14496
  tmp_no_rst = ~tmp_no_rst;
14497
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14498
end
14499
endtask // reset_mii
14500
 
14501
task mii_set_clk_div; // set clock divider for MII clock
14502
  input [7:0]  clk_div;
14503
begin
14504
  // MII mode register
14505
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14506
end
14507
endtask // mii_set_clk_div
14508
 
14509
 
14510
task check_mii_busy; // MII - check if BUSY
14511
  reg [31:0] tmp;
14512
begin
14513
  @(posedge wb_clk);
14514
  // MII read status register
14515
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14516
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
14517
  begin
14518
    @(posedge wb_clk);
14519
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14520
  end
14521
end
14522
endtask // check_mii_busy
14523
 
14524
 
14525
task check_mii_scan_valid; // MII - check if SCAN data are valid
14526
  reg [31:0] tmp;
14527
begin
14528
  @(posedge wb_clk);
14529
  // MII read status register
14530
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14531
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
14532
  begin
14533
    @(posedge wb_clk);
14534
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14535
  end
14536
end
14537
endtask // check_mii_scan_valid
14538
 
14539
 
14540
task mii_write_req; // requests write to MII
14541
  input [4:0]  phy_addr;
14542
  input [4:0]  reg_addr;
14543
  input [15:0] data_in;
14544
begin
14545
  // MII address, PHY address = 1, command register address = 0
14546
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
14547
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14548
  // MII TX data
14549
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14550
  // MII command
14551
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14552
  @(posedge wb_clk);
14553
end
14554
endtask // mii_write_req
14555
 
14556
 
14557
task mii_read_req; // requests read from MII
14558
  input [4:0]  phy_addr;
14559
  input [4:0]  reg_addr;
14560
begin
14561
  // MII address, PHY address = 1, command register address = 0
14562
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
14563
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14564
  // MII command
14565
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14566
  @(posedge wb_clk);
14567
end
14568
endtask // mii_read_req
14569
 
14570
 
14571
task mii_scan_req; // requests scan from MII
14572
  input [4:0]  phy_addr;
14573
  input [4:0]  reg_addr;
14574
begin
14575
  // MII address, PHY address = 1, command register address = 0
14576
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
14577
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14578
  // MII command
14579
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14580
  @(posedge wb_clk);
14581
end
14582
endtask // mii_scan_req
14583
 
14584
 
14585
task mii_scan_finish; // finish scan from MII
14586
begin
14587
  // MII command
14588
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14589
  @(posedge wb_clk);
14590
end
14591
endtask // mii_scan_finish
14592
 
14593
//////////////////////////////////////////////////////////////
14594
// Log files and memory tasks
14595
//////////////////////////////////////////////////////////////
14596
 
14597
task clear_memories;
14598
  reg    [22:0]  adr_i;
14599
  reg            delta_t;
14600
begin
14601
  delta_t = 0;
14602
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
14603
  begin
14604
    eth_phy.rx_mem[adr_i[21:0]] = 0;
14605
    eth_phy.tx_mem[adr_i[21:0]] = 0;
14606
    wb_slave.wb_memory[adr_i[21:2]] = 0;
14607
    delta_t = !delta_t;
14608
  end
14609
end
14610
endtask // clear_memories
14611
 
14612
task test_note;
14613
  input [799:0] test_note ;
14614
  reg   [799:0] display_note ;
14615
begin
14616
  display_note = test_note;
14617
  while ( display_note[799:792] == 0 )
14618
    display_note = display_note << 8 ;
14619
  $fdisplay( tb_log_file, " " ) ;
14620
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
14621
  $fdisplay( tb_log_file, " " ) ;
14622
end
14623
endtask // test_note
14624
 
14625
task test_heading;
14626
  input [799:0] test_heading ;
14627
  reg   [799:0] display_test ;
14628
begin
14629
  display_test = test_heading;
14630
  while ( display_test[799:792] == 0 )
14631
    display_test = display_test << 8 ;
14632
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
14633
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
14634
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
14635
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
14636
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
14637
  $fdisplay( tb_log_file, " " ) ;
14638
end
14639
endtask // test_heading
14640
 
14641
 
14642
task test_fail ;
14643
  input [7999:0] failure_reason ;
14644
//  reg   [8007:0] display_failure ;
14645
  reg   [7999:0] display_failure ;
14646
  reg   [799:0] display_test ;
14647
begin
14648
  tests_failed = tests_failed + 1 ;
14649
 
14650
  display_failure = failure_reason; // {failure_reason, "!"} ;
14651
  while ( display_failure[7999:7992] == 0 )
14652
    display_failure = display_failure << 8 ;
14653
 
14654
  display_test = test_name ;
14655
  while ( display_test[799:792] == 0 )
14656
    display_test = display_test << 8 ;
14657
 
14658
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
14659
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
14660
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
14661
  $fdisplay( tb_log_file, "    *FAILED* because") ;
14662
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
14663
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
14664
  $fdisplay( tb_log_file, " " ) ;
14665
 
14666
 `ifdef STOP_ON_FAILURE
14667
    #20 $stop ;
14668
 `endif
14669
end
14670
endtask // test_fail
14671
 
14672
 
14673
task test_ok ;
14674
  reg [799:0] display_test ;
14675
begin
14676
  tests_successfull = tests_successfull + 1 ;
14677
 
14678
  display_test = test_name ;
14679
  while ( display_test[799:792] == 0 )
14680
    display_test = display_test << 8 ;
14681
 
14682
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
14683
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
14684
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
14685
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
14686
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
14687
  $fdisplay( tb_log_file, " " ) ;
14688
end
14689
endtask // test_ok
14690
 
14691
 
14692
task test_summary;
14693
begin
14694
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
14695
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
14696
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
14697
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
14698
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
14699
  $fclose(tb_log_file) ;
14700
end
14701
endtask // test_summary
14702
 
14703
 
14704 116 mohor
endmodule

powered by: WebSVN 2.1.0

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