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

Subversion Repositories ethmac

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

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

Line No. Rev Author Line
1 116 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  tb_ethernet.v                                               ////
4
////                                                              ////
5
////  This file is part of the Ethernet IP core project           ////
6
////  http://www.opencores.org/projects/ethmac/                   ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9 169 mohor
////      - Tadej Markovic, tadej@opencores.org                   ////
10 243 tadejm
////      - Igor Mohor,     igorM@opencores.org                  ////
11 116 mohor
////                                                              ////
12 169 mohor
////  All additional information is available in the Readme.txt   ////
13 116 mohor
////  file.                                                       ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2001, 2002 Authors                             ////
18
////                                                              ////
19
//// This source file may be used and distributed without         ////
20
//// restriction provided that this copyright statement is not    ////
21
//// removed from the file and that any derivative work contains  ////
22
//// the original copyright notice and the associated disclaimer. ////
23
////                                                              ////
24
//// This source file is free software; you can redistribute it   ////
25
//// and/or modify it under the terms of the GNU Lesser General   ////
26
//// Public License as published by the Free Software Foundation; ////
27
//// either version 2.1 of the License, or (at your option) any   ////
28
//// later version.                                               ////
29
////                                                              ////
30
//// This source is distributed in the hope that it will be       ////
31
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
32
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
33
//// PURPOSE.  See the GNU Lesser General Public License for more ////
34
//// details.                                                     ////
35
////                                                              ////
36
//// You should have received a copy of the GNU Lesser General    ////
37
//// Public License along with this source; if not, download it   ////
38
//// from http://www.opencores.org/lgpl.shtml                     ////
39
////                                                              ////
40
//////////////////////////////////////////////////////////////////////
41
//
42
// CVS Revision History
43
//
44
// $Log: not supported by cvs2svn $
45 252 tadejm
// Revision 1.19  2002/11/14 13:12:47  tadejm
46
// Late collision is not reported any more.
47
//
48 243 tadejm
// Revision 1.18  2002/10/18 17:03:34  tadejm
49
// Changed BIST scan signals.
50
//
51 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
52
// Some code changed due to bug fixes.
53
//
54 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
55
// Just back-up; not completed testbench and some testcases are not
56
// wotking properly yet.
57
//
58 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
59
// Full duplex tests modified and testbench bug repaired.
60
//
61 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
62
// Some additional reports added
63
//
64 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
65
// Full duplex test improved.
66
//
67 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
68
// MIIM test look better.
69
//
70 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
71
// Bench outputs data to display every 128 bytes.
72
//
73 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
74
// Beautiful tests merget together
75
//
76 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
77
// Rearanged testcases
78
//
79 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
80
// Bug in MIIM fixed.
81
//
82 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
83
// Headers changed.
84
//
85 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
86
// New testbench. Thanks to Tadej M - "The Spammer".
87
//
88 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
89
// Clock mrx_clk set to 2.5 MHz.
90
//
91 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
92
// Testing environment also includes traffic cop, memory interface and host
93
// interface.
94 116 mohor
//
95
//
96
//
97
//
98 117 mohor
//
99 116 mohor
 
100
 
101 169 mohor
`include "eth_phy_defines.v"
102
`include "wb_model_defines.v"
103 116 mohor
`include "tb_eth_defines.v"
104
`include "eth_defines.v"
105
`include "timescale.v"
106
 
107
module tb_ethernet();
108
 
109
 
110 169 mohor
reg           wb_clk;
111
reg           wb_rst;
112
wire          wb_int;
113 116 mohor
 
114 169 mohor
wire          mtx_clk;  // This goes to PHY
115
wire          mrx_clk;  // This goes to PHY
116 116 mohor
 
117
wire   [3:0]  MTxD;
118
wire          MTxEn;
119
wire          MTxErr;
120
 
121 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
122
wire          MRxDV;    // This goes to PHY
123
wire          MRxErr;   // This goes to PHY
124
wire          MColl;    // This goes to PHY
125
wire          MCrs;     // This goes to PHY
126 116 mohor
 
127
wire          Mdi_I;
128
wire          Mdo_O;
129
wire          Mdo_OE;
130 169 mohor
tri           Mdio_IO;
131 116 mohor
wire          Mdc_O;
132
 
133
 
134 169 mohor
parameter Tp = 1;
135 116 mohor
 
136 121 mohor
 
137 116 mohor
// Ethernet Slave Interface signals
138 169 mohor
wire [31:0] eth_sl_wb_adr;
139 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
140
wire  [3:0] eth_sl_wb_sel_i;
141
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;
142
 
143
// Ethernet Master Interface signals
144
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
145
wire  [3:0] eth_ma_wb_sel_o;
146
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;
147
 
148
 
149
 
150
 
151
// Connecting Ethernet top module
152 169 mohor
eth_top eth_top
153 116 mohor
(
154
  // WISHBONE common
155 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
156 116 mohor
 
157
  // WISHBONE slave
158 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),
159
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
160
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
161 116 mohor
 
162
  // WISHBONE master
163
  .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),
164
  .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),
165
  .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),
166
 
167
  //TX
168
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
169
 
170
  //RX
171
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
172
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
173
 
174
  // MIIM
175
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
176
 
177 169 mohor
  .int_o(wb_int)
178 227 tadejm
 
179
  // Bist
180
`ifdef ETH_BIST
181
  ,
182
  .scanb_rst      (1'b0),
183
  .scanb_clk      (1'b0),
184
  .scanb_si       (1'b0),
185
  .scanb_so       (),
186
  .scanb_en       (1'b0)
187
`endif
188 116 mohor
);
189
 
190
 
191
 
192 169 mohor
// Connecting Ethernet PHY Module
193
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
194
assign Mdi_I   = Mdio_IO;
195
integer phy_log_file_desc;
196
 
197
eth_phy eth_phy
198 116 mohor
(
199 169 mohor
  // WISHBONE reset
200
  .m_rst_n_i(!wb_rst),
201 116 mohor
 
202 169 mohor
  // MAC TX
203
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
204
 
205
  // MAC RX
206
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
207
  .mcoll_o(MColl),        .mcrs_o(MCrs),
208
 
209
  // MIIM
210
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
211
 
212
  // SYSTEM
213
  .phy_log(phy_log_file_desc)
214 116 mohor
);
215
 
216
 
217 169 mohor
 
218
// Connecting WB Master as Host Interface
219
integer host_log_file_desc;
220
 
221
WB_MASTER_BEHAVIORAL wb_master
222 116 mohor
(
223 169 mohor
    .CLK_I(wb_clk),
224
    .RST_I(wb_rst),
225
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
226
    .TAG_O(),
227
    .ACK_I(eth_sl_wb_ack_o),
228
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
229
    .CYC_O(eth_sl_wb_cyc_i),
230
    .DAT_I(eth_sl_wb_dat_o),
231
    .DAT_O(eth_sl_wb_dat_i),
232
    .ERR_I(eth_sl_wb_err_o),
233
    .RTY_I(1'b0),  // inactive (1'b0)
234
    .SEL_O(eth_sl_wb_sel_i),
235
    .STB_O(eth_sl_wb_stb_i),
236
    .WE_O (eth_sl_wb_we_i),
237
    .CAB_O()       // NOT USED for now!
238
);
239
 
240
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
241
 
242
 
243
 
244
// Connecting WB Slave as Memory Interface Module
245
integer memory_log_file_desc;
246
 
247
WB_SLAVE_BEHAVIORAL wb_slave
248
(
249
    .CLK_I(wb_clk),
250
    .RST_I(wb_rst),
251
    .ACK_O(eth_ma_wb_ack_i),
252
    .ADR_I(eth_ma_wb_adr_o),
253
    .CYC_I(eth_ma_wb_cyc_o),
254
    .DAT_O(eth_ma_wb_dat_i),
255
    .DAT_I(eth_ma_wb_dat_o),
256
    .ERR_O(eth_ma_wb_err_i),
257
    .RTY_O(),      // NOT USED for now!
258
    .SEL_I(eth_ma_wb_sel_o),
259
    .STB_I(eth_ma_wb_stb_o),
260
    .WE_I (eth_ma_wb_we_o),
261
    .CAB_I(1'b0)   // inactive (1'b0)
262
);
263
 
264
 
265
 
266
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
267
integer wb_s_mon_log_file_desc ;
268
integer wb_m_mon_log_file_desc ;
269
 
270
WB_BUS_MON wb_eth_slave_bus_mon
271
(
272 116 mohor
  // WISHBONE common
273 169 mohor
  .CLK_I(wb_clk),
274
  .RST_I(wb_rst),
275 116 mohor
 
276 169 mohor
  // WISHBONE slave
277
  .ACK_I(eth_sl_wb_ack_o),
278
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
279
  .CYC_O(eth_sl_wb_cyc_i),
280
  .DAT_I(eth_sl_wb_dat_o),
281
  .DAT_O(eth_sl_wb_dat_i),
282
  .ERR_I(eth_sl_wb_err_o),
283
  .RTY_I(1'b0),
284
  .SEL_O(eth_sl_wb_sel_i),
285
  .STB_O(eth_sl_wb_stb_i),
286
  .WE_O (eth_sl_wb_we_i),
287
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
288
  .TAG_O(),
289
  .CAB_O(1'b0),
290
  .log_file_desc (wb_s_mon_log_file_desc)
291
);
292
 
293
WB_BUS_MON wb_eth_master_bus_mon
294
(
295
  // WISHBONE common
296
  .CLK_I(wb_clk),
297
  .RST_I(wb_rst),
298
 
299 116 mohor
  // WISHBONE master
300 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
301
  .ADDR_O(eth_ma_wb_adr_o),
302
  .CYC_O(eth_ma_wb_cyc_o),
303
  .DAT_I(eth_ma_wb_dat_i),
304
  .DAT_O(eth_ma_wb_dat_o),
305
  .ERR_I(eth_ma_wb_err_i),
306
  .RTY_I(1'b0),
307
  .SEL_O(eth_ma_wb_sel_o),
308
  .STB_O(eth_ma_wb_stb_o),
309
  .WE_O (eth_ma_wb_we_o),
310
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
311
  .TAG_O(),
312
  .CAB_O(1'b0),
313
  .log_file_desc(wb_m_mon_log_file_desc)
314 116 mohor
);
315
 
316
 
317
 
318 169 mohor
reg         StartTB;
319
integer     tb_log_file;
320 116 mohor
 
321 169 mohor
initial
322
begin
323
  tb_log_file = $fopen("../log/eth_tb.log");
324
  if (tb_log_file < 2)
325
  begin
326
    $display("*E Could not open/create testbench log file in ../log/ directory!");
327
    $finish;
328
  end
329
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
330
  $fdisplay(tb_log_file, " ");
331 116 mohor
 
332 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
333
  if (phy_log_file_desc < 2)
334
  begin
335
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
336
    $finish;
337
  end
338
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
339
  $fdisplay(phy_log_file_desc, " ");
340
 
341
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
342
  if (memory_log_file_desc < 2)
343
  begin
344
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
345
    $finish;
346
  end
347
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
348
  $fdisplay(memory_log_file_desc, " ");
349
 
350
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
351
  if (host_log_file_desc < 2)
352
  begin
353
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
354
    $finish;
355
  end
356
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
357
  $fdisplay(host_log_file_desc, " ");
358
 
359
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
360
  if (wb_s_mon_log_file_desc < 2)
361
  begin
362
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
363
    $finish;
364
  end
365
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
366
  $fdisplay(wb_s_mon_log_file_desc, " ");
367
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
368
  $fdisplay(wb_s_mon_log_file_desc, " ");
369
 
370
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
371
  if (wb_m_mon_log_file_desc < 2)
372
  begin
373
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
374
    $finish;
375
  end
376
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
377
  $fdisplay(wb_m_mon_log_file_desc, " ");
378
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
379
  $fdisplay(wb_m_mon_log_file_desc, " ");
380
 
381 243 tadejm
  // Reset pulse
382
  wb_rst =  1'b1;
383
  #423 wb_rst =  1'b0;
384
 
385 169 mohor
  // Clear memories
386
  clear_memories;
387 243 tadejm
  clear_buffer_descriptors;
388 169 mohor
 
389
  #423 StartTB  =  1'b1;
390
end
391
 
392
 
393
 
394
// Generating wb_clk clock
395 116 mohor
initial
396
begin
397 169 mohor
  wb_clk=0;
398
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
399 209 tadejm
  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
400 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
401
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
402
//  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
403 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
404 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
405
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
406
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
407
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
408 116 mohor
end
409
 
410
 
411
 
412 169 mohor
integer      tests_successfull;
413
integer      tests_failed;
414
reg [799:0]  test_name; // used for tb_log_file
415 121 mohor
 
416 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
417
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
418
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
419
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
420
 
421 116 mohor
initial
422
begin
423 169 mohor
  wait(StartTB);  // Start of testbench
424
 
425
  // Initial global values
426
  tests_successfull = 0;
427
  tests_failed = 0;
428
 
429
  wbm_init_waits = 4'h1;
430
  wbm_subseq_waits = 4'h3;
431
  wbs_waits = 4'h1;
432
  wbs_retries = 8'h2;
433
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
434
 
435
 
436
  //  Call tests
437
  //  ----------
438 194 tadej
//    test_access_to_mac_reg(0, 3);           // 0 - 3
439
//    test_mii(0, 17);                        // 0 - 17
440 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
441
  eth_phy.carrier_sense_real_delay(0);
442 243 tadejm
//    test_mac_full_duplex_transmit(8, 9);    // 0 - (21)
443
    test_mac_full_duplex_receive(8, 9);
444 209 tadejm
//    test_mac_full_duplex_flow(0, 0);
445 169 mohor
 
446 243 tadejm
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
447 169 mohor
  eth_phy.carrier_sense_real_delay(1);
448
 
449
 
450
  // Finish test's logs
451
  test_summary;
452
  $display("\n\n END of SIMULATION");
453
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
454
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
455
 
456
  $stop;
457 116 mohor
end
458 169 mohor
 
459 116 mohor
 
460 169 mohor
 
461
//////////////////////////////////////////////////////////////
462
// Test tasks
463
//////////////////////////////////////////////////////////////
464
 
465
task test_access_to_mac_reg;
466
  input  [31:0]  start_task;
467
  input  [31:0]  end_task;
468
  integer        bit_start_1;
469
  integer        bit_end_1;
470
  integer        bit_start_2;
471
  integer        bit_end_2;
472
  integer        num_of_reg;
473
  integer        i_addr;
474
  integer        i_data;
475
  integer        i_length;
476
  integer        tmp_data;
477
  reg    [31:0]  tx_bd_num;
478
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
479
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
480
  integer        i;
481
  integer        i1;
482
  integer        i2;
483
  integer        i3;
484
  integer        fail;
485 178 mohor
  integer        test_num;
486 169 mohor
  reg    [31:0]  addr;
487
  reg    [31:0]  data;
488
  reg    [31:0]  data_max;
489 116 mohor
begin
490 169 mohor
// ACCESS TO MAC REGISTERS TEST
491
test_heading("ACCESS TO MAC REGISTERS TEST");
492
$display(" ");
493
$display("ACCESS TO MAC REGISTERS TEST");
494
fail = 0;
495
 
496 192 tadej
// reset MAC registers
497
hard_reset;
498
// reset MAC and MII LOGIC with soft reset
499
reset_mac;
500
reset_mii;
501 169 mohor
 
502 192 tadej
 
503 178 mohor
//////////////////////////////////////////////////////////////////////
504
////                                                              ////
505
////  test_access_to_mac_reg:                                     ////
506
////                                                              ////
507
////  0: Walking 1 with single cycles across MAC regs.            ////
508
////  1: Walking 1 with single cycles across MAC buffer descript. ////
509
////  2: Test max reg. values and reg. values after writing       ////
510
////     inverse reset values and hard reset of the MAC           ////
511
////  3: Test buffer desc. RAM preserving values after hard reset ////
512
////     of the MAC and resetting the logic                       ////
513
////                                                              ////
514
//////////////////////////////////////////////////////////////////////
515 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
516 169 mohor
begin
517
 
518 178 mohor
  ////////////////////////////////////////////////////////////////////
519
  ////                                                            ////
520
  ////  Walking 1 with single cycles across MAC regs.             ////
521
  ////                                                            ////
522
  ////////////////////////////////////////////////////////////////////
523
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
524 194 tadej
  begin
525
    // TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
526
    test_name   = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
527
    `TIME; $display("  TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
528 178 mohor
 
529 194 tadej
    data = 0;
530
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
531
      begin
532
        wbm_init_waits = i;
533
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
534
        for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
535
          begin
536
            addr = `ETH_BASE + i_addr;
537
            // set ranges of R/W bits
538
            case (addr)
539
              `ETH_MODER:
540
                begin
541
                  bit_start_1 = 0;
542
                  bit_end_1   = 16;
543
                  bit_start_2 = 32; // not used
544
                  bit_end_2   = 32; // not used
545
                end
546
              `ETH_INT: // READONLY - tested within INT test
547
                begin
548
                  bit_start_1 = 32; // not used
549
                  bit_end_1   = 32; // not used
550
                  bit_start_2 = 32; // not used
551
                  bit_end_2   = 32; // not used
552
                end
553
              `ETH_INT_MASK:
554
                begin
555
                  bit_start_1 = 0;
556
                  bit_end_1   = 6;
557
                  bit_start_2 = 32; // not used
558
                  bit_end_2   = 32; // not used
559
                end
560
              `ETH_IPGT:
561
                begin
562
                  bit_start_1 = 0;
563
                  bit_end_1   = 6;
564
                  bit_start_2 = 32; // not used
565
                  bit_end_2   = 32; // not used
566
                end
567
              `ETH_IPGR1:
568
                begin
569
                  bit_start_1 = 0;
570
                  bit_end_1   = 6;
571
                  bit_start_2 = 32; // not used
572
                  bit_end_2   = 32; // not used
573
                end
574
              `ETH_IPGR2:
575
                begin
576
                  bit_start_1 = 0;
577
                  bit_end_1   = 6;
578
                  bit_start_2 = 32; // not used
579
                  bit_end_2   = 32; // not used
580
                end
581
              `ETH_PACKETLEN:
582
                begin
583
                  bit_start_1 = 0;
584
                  bit_end_1   = 31;
585
                  bit_start_2 = 32; // not used
586
                  bit_end_2   = 32; // not used
587
                end
588
              `ETH_COLLCONF:
589
                begin
590
                  bit_start_1 = 0;
591
                  bit_end_1   = 5;
592
                  bit_start_2 = 16;
593
                  bit_end_2   = 19;
594
                end
595
              `ETH_TX_BD_NUM:
596
                begin
597
                  bit_start_1 = 0;
598
                  bit_end_1   = 7;
599
                  bit_start_2 = 32; // not used
600
                  bit_end_2   = 32; // not used
601
                end
602
              `ETH_CTRLMODER:
603
                begin
604
                  bit_start_1 = 0;
605
                  bit_end_1   = 2;
606
                  bit_start_2 = 32; // not used
607
                  bit_end_2   = 32; // not used
608
                end
609
              `ETH_MIIMODER:
610
                begin
611
                  bit_start_1 = 0;
612
                  bit_end_1   = 9;
613
                  bit_start_2 = 32; // not used
614
                  bit_end_2   = 32; // not used
615
                end
616
              `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
617
                begin
618
                  bit_start_1 = 32; // not used
619
                  bit_end_1   = 32; // not used
620
                  bit_start_2 = 32; // not used
621
                  bit_end_2   = 32; // not used
622
                end
623
              `ETH_MIIADDRESS:
624
                begin
625
                  bit_start_1 = 0;
626
                  bit_end_1   = 4;
627
                  bit_start_2 = 8;
628
                  bit_end_2   = 12;
629
                end
630
              `ETH_MIITX_DATA:
631
                begin
632
                  bit_start_1 = 0;
633
                  bit_end_1   = 15;
634
                  bit_start_2 = 32; // not used
635
                  bit_end_2   = 32; // not used
636
                end
637
              `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
638
                begin
639
                  bit_start_1 = 32; // not used
640
                  bit_end_1   = 32; // not used
641
                  bit_start_2 = 32; // not used
642
                  bit_end_2   = 32; // not used
643
                end
644
              `ETH_MIISTATUS: // READONLY - tested within MIIM test
645
                begin
646
                  bit_start_1 = 32; // not used
647
                  bit_end_1   = 32; // not used
648
                  bit_start_2 = 32; // not used
649
                  bit_end_2   = 32; // not used
650
                end
651
              `ETH_MAC_ADDR0:
652
                begin
653
                  bit_start_1 = 0;
654
                  bit_end_1   = 31;
655
                  bit_start_2 = 32; // not used
656
                  bit_end_2   = 32; // not used
657 178 mohor
                  end
658 194 tadej
              `ETH_MAC_ADDR1:
659
                begin
660
                  bit_start_1 = 0;
661
                  bit_end_1   = 15;
662
                  bit_start_2 = 32; // not used
663
                  bit_end_2   = 32; // not used
664
                end
665
              `ETH_HASH_ADDR0:
666
                begin
667
                  bit_start_1 = 0;
668
                  bit_end_1   = 31;
669
                  bit_start_2 = 32; // not used
670
                  bit_end_2   = 32; // not used
671
                end
672
              default: // `ETH_HASH_ADDR1:
673
                begin
674
                  bit_start_1 = 0;
675
                  bit_end_1   = 31;
676
                  bit_start_2 = 32; // not used
677
                  bit_end_2   = 32; // not used
678
                end
679
            endcase
680
 
681
            for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
682
              begin
683
                data = 1'b1 << i_data;
684
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
685
                  ;
686
                else
687 178 mohor
                  begin
688 194 tadej
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
689
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
690
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
691
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
692
                      begin
693
                        if (tmp_data !== data)
694 178 mohor
                        begin
695 194 tadej
                          fail = fail + 1;
696
                          test_fail("RW bit of the MAC register was not written or not read");
697
                          `TIME;
698
                          $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
699
                                    wbm_init_waits, addr, data, tmp_data);
700
                        end
701
                      end
702
                    else // data should not be equal to tmp_data
703
                      begin
704
                        if (tmp_data === data)
705 178 mohor
                          begin
706
                            fail = fail + 1;
707 194 tadej
                            test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
708 178 mohor
                            `TIME;
709 194 tadej
                            $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
710 178 mohor
                                      wbm_init_waits, addr, data, tmp_data);
711
                          end
712 194 tadej
                      end
713
                  end
714
              end
715
          end
716
      end
717 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
718
    $display("    ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
719 194 tadej
    if(fail == 0)
720
      test_ok;
721
    else
722
      fail = 0;    // Errors were reported previously
723
  end
724 178 mohor
 
725
 
726
  ////////////////////////////////////////////////////////////////////
727
  ////                                                            ////
728
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
729
  ////                                                            ////
730
  ////////////////////////////////////////////////////////////////////
731
  if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
732 169 mohor
  begin
733 194 tadej
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
734
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
735
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
736 178 mohor
 
737
    data = 0;
738
    // set TX and RX buffer descriptors
739
    tx_bd_num = 32'h40;
740
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
741
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
742
    begin
743 169 mohor
      wbm_init_waits = i;
744
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
745 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
746 169 mohor
      begin
747
        addr = `ETH_BASE + i_addr;
748 178 mohor
        if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
749
        begin
750
          // set ranges of R/W bits
751
          case (addr[3])
752
            1'b0: // buffer control bits
753
            begin
754
              bit_start_1 = 0;
755
              bit_end_1   = 31; // 8;
756
              bit_start_2 = 11;
757
              bit_end_2   = 31;
758
            end
759
            default: // 1'b1: // buffer pointer
760
            begin
761
              bit_start_1 = 0;
762
              bit_end_1   = 31;
763
              bit_start_2 = 32; // not used
764
              bit_end_2   = 32; // not used
765
            end
766
          endcase
767
        end
768
        else // RX buffer descriptors
769
        begin
770
          // set ranges of R/W bits
771
          case (addr[3])
772
            1'b0: // buffer control bits
773
            begin
774
              bit_start_1 = 0;
775
              bit_end_1   = 31; // 7;
776
              bit_start_2 = 13;
777
              bit_end_2   = 31;
778
            end
779
            default: // 1'b1: // buffer pointer
780
            begin
781
              bit_start_1 = 0;
782
              bit_end_1   = 31;
783
              bit_start_2 = 32; // not used
784
              bit_end_2   = 32; // not used
785
            end
786
          endcase
787
        end
788
 
789 169 mohor
        for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
790
        begin
791
          data = 1'b1 << i_data;
792 178 mohor
          if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
793
            ;
794 169 mohor
          else
795
          begin
796
            wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
797
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
798
            if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
799
                 ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
800
            begin
801
              if (tmp_data !== data)
802
              begin
803
                fail = fail + 1;
804 178 mohor
                test_fail("RW bit of the MAC buffer descriptors was not written or not read");
805 169 mohor
                `TIME;
806
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
807
                          wbm_init_waits, addr, data, tmp_data);
808
              end
809
            end
810
            else // data should not be equal to tmp_data
811
            begin
812
              if (tmp_data === data)
813
              begin
814
                fail = fail + 1;
815 178 mohor
                test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
816 169 mohor
                `TIME;
817
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
818
                          wbm_init_waits, addr, data, tmp_data);
819
              end
820
            end
821
          end
822
        end
823
      end
824 178 mohor
      // INTERMEDIATE DISPLAYS
825
      case (i)
826 209 tadejm
        0:       $display("    ->buffer descriptors tested with 0 bus delay");
827
        1:       $display("    ->buffer descriptors tested with 1 bus delay cycle");
828
        2:       $display("    ->buffer descriptors tested with 2 bus delay cycles");
829
        3:       $display("    ->buffer descriptors tested with 3 bus delay cycles");
830
        default: $display("    ->buffer descriptors tested with 4 bus delay cycles");
831 178 mohor
      endcase
832
    end
833
    if(fail == 0)
834
      test_ok;
835
    else
836
      fail = 0;
837 169 mohor
  end
838 178 mohor
 
839
 
840
  ////////////////////////////////////////////////////////////////////
841
  ////                                                            ////
842
  ////  Test max reg. values and reg. values after writing        ////
843
  ////  inverse reset values and hard reset of the MAC            ////
844
  ////                                                            ////
845
  ////////////////////////////////////////////////////////////////////
846
  if (test_num == 2) // Start this task
847 169 mohor
  begin
848 194 tadej
    // TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
849 178 mohor
    test_name   =
850 194 tadej
      "TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
851 178 mohor
    `TIME; $display(
852 194 tadej
      "  TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
853 178 mohor
 
854
    // reset MAC registers
855
    hard_reset;
856
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
857 169 mohor
    begin
858 178 mohor
      for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
859 169 mohor
      begin
860 178 mohor
        addr = `ETH_BASE + i_addr;
861
        // set ranges of R/W bits
862
        case (addr)
863
          `ETH_MODER:
864 169 mohor
          begin
865 178 mohor
            data = 32'h0000_A800;
866
            data_max = 32'h0001_FFFF;
867 169 mohor
          end
868 178 mohor
          `ETH_INT: // READONLY - tested within INT test
869 169 mohor
          begin
870 178 mohor
            data = 32'h0000_0000;
871
            data_max = 32'h0000_0000;
872 169 mohor
          end
873
          `ETH_INT_MASK:
874 178 mohor
          begin
875
            data = 32'h0000_0000;
876
            data_max = 32'h0000_007F;
877
          end
878 169 mohor
          `ETH_IPGT:
879 178 mohor
          begin
880
            data = 32'h0000_0012;
881
            data_max = 32'h0000_007F;
882
          end
883 169 mohor
          `ETH_IPGR1:
884 178 mohor
          begin
885
            data = 32'h0000_000C;
886
            data_max = 32'h0000_007F;
887
          end
888 169 mohor
          `ETH_IPGR2:
889 178 mohor
          begin
890
            data = 32'h0000_0012;
891
            data_max = 32'h0000_007F;
892
          end
893 169 mohor
          `ETH_PACKETLEN:
894 178 mohor
          begin
895
            data = 32'h0040_0600;
896
            data_max = 32'hFFFF_FFFF;
897
          end
898 169 mohor
          `ETH_COLLCONF:
899 178 mohor
          begin
900
            data = 32'h000F_003F;
901
            data_max = 32'h000F_003F;
902
          end
903 169 mohor
          `ETH_TX_BD_NUM:
904 178 mohor
          begin
905
            data = 32'h0000_0040;
906
            data_max = 32'h0000_0080;
907
          end
908 169 mohor
          `ETH_CTRLMODER:
909 178 mohor
          begin
910
            data = 32'h0000_0000;
911
            data_max = 32'h0000_0007;
912
          end
913 169 mohor
          `ETH_MIIMODER:
914 178 mohor
          begin
915
            data = 32'h0000_0064;
916
            data_max = 32'h0000_03FF;
917
          end
918 169 mohor
          `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
919 178 mohor
          begin
920
            data = 32'h0000_0000;
921
            data_max = 32'h0000_0007;
922
          end
923 169 mohor
          `ETH_MIIADDRESS:
924 178 mohor
          begin
925
            data = 32'h0000_0000;
926
            data_max = 32'h0000_1F1F;
927
          end
928 169 mohor
          `ETH_MIITX_DATA:
929 178 mohor
          begin
930
            data = 32'h0000_0000;
931
            data_max = 32'h0000_FFFF;
932
          end
933 169 mohor
          `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
934
          begin
935 178 mohor
            data = 32'h0000_0000;
936
            data_max = 32'h0000_0000;
937 169 mohor
          end
938 178 mohor
          `ETH_MIISTATUS: // READONLY - tested within MIIM test
939 169 mohor
          begin
940 178 mohor
            data = 32'h0000_0000;
941
            data_max = 32'h0000_0000;
942 169 mohor
          end
943 178 mohor
          `ETH_MAC_ADDR0:
944 169 mohor
          begin
945 178 mohor
            data = 32'h0000_0000;
946
            data_max = 32'hFFFF_FFFF;
947 169 mohor
          end
948 178 mohor
          `ETH_MAC_ADDR1:
949 169 mohor
          begin
950 178 mohor
            data = 32'h0000_0000;
951
            data_max = 32'h0000_FFFF;
952 169 mohor
          end
953 178 mohor
          `ETH_HASH_ADDR0:
954 169 mohor
          begin
955 178 mohor
            data = 32'h0000_0000;
956
            data_max = 32'hFFFF_FFFF;
957 169 mohor
          end
958 178 mohor
          default: // `ETH_HASH_ADDR1:
959 169 mohor
          begin
960 178 mohor
            data = 32'h0000_0000;
961
            data_max = 32'hFFFF_FFFF;
962 169 mohor
          end
963
        endcase
964 178 mohor
 
965
        wbm_init_waits = {$random} % 3;
966
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
967
        if (i == 0)
968
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
969
        else if (i == 2)
970
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
971
        else if ((i == 1) || (i == 4))
972 169 mohor
        begin
973 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
974
          if (tmp_data !== data)
975
          begin
976
            fail = fail + 1;
977
            test_fail("RESET value of the MAC register is not correct");
978
            `TIME;
979
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
980
          end
981 169 mohor
        end
982 178 mohor
        else // check maximum values
983 169 mohor
        begin
984
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
985 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
986 169 mohor
          begin
987
            if (tmp_data !== data)
988
            begin
989
              fail = fail + 1;
990 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
991 169 mohor
              `TIME;
992 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
993 169 mohor
            end
994 178 mohor
            // try maximum (80)
995
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
996
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
997
            if (tmp_data !== data_max)
998
            begin
999
              fail = fail + 1;
1000
              test_fail("MAX value of the TX_BD_NUM register is not correct");
1001
              `TIME;
1002
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1003
            end
1004
            // try one less than maximum (80)
1005
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1006
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1007
            if (tmp_data !== (data_max - 1))
1008
            begin
1009
              fail = fail + 1;
1010
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1011
              `TIME;
1012
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1013
            end
1014
            // try one more than maximum (80)
1015
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1016
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1017
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1018
            begin
1019
              fail = fail + 1;
1020
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1021
              `TIME;
1022
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1023
            end
1024 169 mohor
          end
1025 178 mohor
          else
1026 169 mohor
          begin
1027 178 mohor
            if (tmp_data !== data_max)
1028 169 mohor
            begin
1029
              fail = fail + 1;
1030 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1031 169 mohor
              `TIME;
1032 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1033 169 mohor
            end
1034
          end
1035
        end
1036
      end
1037 178 mohor
      // reset MAC registers
1038
      if ((i == 0) || (i == 3))
1039
        hard_reset;
1040 169 mohor
    end
1041 178 mohor
    if(fail == 0)
1042
      test_ok;
1043
    else
1044
      fail = 0;
1045 169 mohor
  end
1046 116 mohor
 
1047 156 mohor
 
1048 181 mohor
  ////////////////////////////////////////////////////////////////////
1049
  ////                                                            ////
1050
  ////  Test buffer desc. ram preserving values after hard reset  ////
1051
  ////  of the mac and reseting the logic                         ////
1052
  ////                                                            ////
1053
  ////////////////////////////////////////////////////////////////////
1054 178 mohor
  if (test_num == 3) // Start this task
1055 169 mohor
  begin
1056 194 tadej
    // TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1057
    test_name   = "TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1058 178 mohor
    `TIME;
1059 194 tadej
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1060 178 mohor
 
1061
    // reset MAC registers
1062
    hard_reset;
1063
    // reset LOGIC with soft reset
1064
    reset_mac;
1065
    reset_mii;
1066
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1067 169 mohor
    begin
1068 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1069 169 mohor
      begin
1070 178 mohor
        addr = `ETH_BASE + i_addr;
1071
 
1072
        wbm_init_waits = {$random} % 3;
1073
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1074
        if (i == 0)
1075 169 mohor
        begin
1076 178 mohor
          data = 32'hFFFFFFFF;
1077
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1078 169 mohor
        end
1079 178 mohor
        else if (i == 2)
1080 169 mohor
        begin
1081 178 mohor
          data = 32'h00000000;
1082
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1083 169 mohor
        end
1084
        else
1085
        begin
1086 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1087
          if (tmp_data !== data)
1088 169 mohor
          begin
1089
            fail = fail + 1;
1090 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1091 169 mohor
            `TIME;
1092 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1093 169 mohor
          end
1094
        end
1095
      end
1096 178 mohor
      if ((i == 0) || (i == 2))
1097
      begin
1098
        // reset MAC registers
1099
        hard_reset;
1100
        // reset LOGIC with soft reset
1101
        reset_mac;
1102
        reset_mii;
1103
      end
1104 169 mohor
    end
1105 178 mohor
    if(fail == 0)
1106
      test_ok;
1107
    else
1108
    fail = 0;
1109 169 mohor
  end
1110 116 mohor
 
1111
 
1112 178 mohor
  if (test_num == 4) // Start this task
1113 169 mohor
  begin
1114 194 tadej
        /*  // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1115
          test_name   = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1116
          `TIME; $display("  TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1117 178 mohor
 
1118
          data = 0;
1119
          burst_data = 0;
1120
          burst_tmp_data = 0;
1121
          i_length = 10; // two bursts for length 20
1122
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1123
          begin
1124
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1125
            begin
1126
              wbm_init_waits = i;
1127
              wbm_subseq_waits = i1;
1128
              #1;
1129
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1130
              begin
1131
                data = 1'b1 << i_data;
1132
                #1;
1133
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1134
                begin
1135
                  burst_data = burst_data << 32;
1136
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1137
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1138
                  begin
1139
                    #1 burst_data[31:0] = 0;
1140
                  end
1141
                  else
1142
                  begin
1143
                    #1 burst_data[31:0] = data;
1144
                  end
1145
                end
1146
                #1;
1147
                // 2 burst writes
1148
                addr = `ETH_BASE; // address of a first burst
1149
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1150
                burst_tmp_data = burst_data >> (32 * i_length);
1151
                addr = addr + 32'h28; // address of a second burst
1152
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1153
                #1;
1154
                // 2 burst reads
1155
                addr = `ETH_BASE; // address of a first burst
1156
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1157
                         wbm_init_waits, wbm_subseq_waits); // first burst
1158
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1159
                addr = addr + 32'h28; // address of a second burst
1160
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1161
                         wbm_init_waits, wbm_subseq_waits); // second burst
1162
                #1;
1163
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1164
                begin
1165
                  // set ranges of R/W bits
1166
                  case (`ETH_BASE + i2)
1167
                  `ETH_MODER:
1168
                    begin
1169
                      bit_start_1 = 0;
1170
                      bit_end_1   = 16;
1171
                      bit_start_2 = 32; // not used
1172
                      bit_end_2   = 32; // not used
1173
                    end
1174
                  `ETH_INT: // READONLY - tested within INT test
1175
                    begin
1176
                      bit_start_1 = 32; // not used
1177
                      bit_end_1   = 32; // not used
1178
                      bit_start_2 = 32; // not used
1179
                      bit_end_2   = 32; // not used
1180
                    end
1181
                  `ETH_INT_MASK:
1182
                    begin
1183
                      bit_start_1 = 0;
1184
                      bit_end_1   = 6;
1185
                      bit_start_2 = 32; // not used
1186
                      bit_end_2   = 32; // not used
1187
                    end
1188
                  `ETH_IPGT:
1189
                    begin
1190
                      bit_start_1 = 0;
1191
                      bit_end_1   = 6;
1192
                      bit_start_2 = 32; // not used
1193
                      bit_end_2   = 32; // not used
1194
                    end
1195
                  `ETH_IPGR1:
1196
                    begin
1197
                      bit_start_1 = 0;
1198
                      bit_end_1   = 6;
1199
                      bit_start_2 = 32; // not used
1200
                      bit_end_2   = 32; // not used
1201
                    end
1202
                  `ETH_IPGR2:
1203
                    begin
1204
                      bit_start_1 = 0;
1205
                      bit_end_1   = 6;
1206
                      bit_start_2 = 32; // not used
1207
                      bit_end_2   = 32; // not used
1208
                    end
1209
                  `ETH_PACKETLEN:
1210
                    begin
1211
                      bit_start_1 = 0;
1212
                      bit_end_1   = 31;
1213
                      bit_start_2 = 32; // not used
1214
                      bit_end_2   = 32; // not used
1215
                    end
1216
                  `ETH_COLLCONF:
1217
                    begin
1218
                      bit_start_1 = 0;
1219
                      bit_end_1   = 5;
1220
                      bit_start_2 = 16;
1221
                      bit_end_2   = 19;
1222
                    end
1223
                  `ETH_TX_BD_NUM:
1224
                    begin
1225
                      bit_start_1 = 0;
1226
                      bit_end_1   = 7;
1227
                      bit_start_2 = 32; // not used
1228
                      bit_end_2   = 32; // not used
1229
                    end
1230
                  `ETH_CTRLMODER:
1231
                    begin
1232
                      bit_start_1 = 0;
1233
                      bit_end_1   = 2;
1234
                      bit_start_2 = 32; // not used
1235
                      bit_end_2   = 32; // not used
1236
                    end
1237
                  `ETH_MIIMODER:
1238
                    begin
1239
                      bit_start_1 = 0;
1240
                      bit_end_1   = 9;
1241
                      bit_start_2 = 32; // not used
1242
                      bit_end_2   = 32; // not used
1243
                    end
1244
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1245
                    begin
1246
                      bit_start_1 = 32; // not used
1247
                      bit_end_1   = 32; // not used
1248
                      bit_start_2 = 32; // not used
1249
                      bit_end_2   = 32; // not used
1250
                    end
1251
                  `ETH_MIIADDRESS:
1252
                    begin
1253
                      bit_start_1 = 0;
1254
                      bit_end_1   = 4;
1255
                      bit_start_2 = 8;
1256
                      bit_end_2   = 12;
1257
                    end
1258
                  `ETH_MIITX_DATA:
1259
                    begin
1260
                      bit_start_1 = 0;
1261
                      bit_end_1   = 15;
1262
                      bit_start_2 = 32; // not used
1263
                      bit_end_2   = 32; // not used
1264
                    end
1265
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1266
                    begin
1267
                      bit_start_1 = 32; // not used
1268
                      bit_end_1   = 32; // not used
1269
                      bit_start_2 = 32; // not used
1270
                      bit_end_2   = 32; // not used
1271
                    end
1272
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1273
                    begin
1274
                      bit_start_1 = 32; // not used
1275
                      bit_end_1   = 32; // not used
1276
                      bit_start_2 = 32; // not used
1277
                      bit_end_2   = 32; // not used
1278
                    end
1279
                  `ETH_MAC_ADDR0:
1280
                    begin
1281
                      bit_start_1 = 0;
1282
                      bit_end_1   = 31;
1283
                      bit_start_2 = 32; // not used
1284
                      bit_end_2   = 32; // not used
1285
                    end
1286
                  `ETH_MAC_ADDR1:
1287
                    begin
1288
                      bit_start_1 = 0;
1289
                      bit_end_1   = 15;
1290
                      bit_start_2 = 32; // not used
1291
                      bit_end_2   = 32; // not used
1292
                    end
1293
                  `ETH_HASH_ADDR0:
1294
                    begin
1295
                      bit_start_1 = 0;
1296
                      bit_end_1   = 31;
1297
                      bit_start_2 = 32; // not used
1298
                      bit_end_2   = 32; // not used
1299
                    end
1300
                  default: // `ETH_HASH_ADDR1:
1301
                    begin
1302
                      bit_start_1 = 0;
1303
                      bit_end_1   = 31;
1304
                      bit_start_2 = 32; // not used
1305
                      bit_end_2   = 32; // not used
1306
                    end
1307
                  endcase
1308
                  #1;
1309
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1310
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1311
                  begin
1312
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1313
                    begin
1314
                      fail = fail + 1;
1315
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1316
                      `TIME;
1317
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1318
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1319
                    end
1320
                  end
1321
                  else
1322
                  begin
1323
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1324
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1325
                    begin
1326
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1327
                      begin
1328
                        fail = fail + 1;
1329
                        test_fail("RW bit of the MAC register was not written or not read");
1330
                        `TIME;
1331
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1332
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1333
                      end
1334
                    end
1335
                    else // data should not be equal to tmp_data
1336
                    begin
1337
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1338
                      begin
1339
                        fail = fail + 1;
1340
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1341
                        `TIME;
1342
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1343
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1344
                      end
1345
                    end
1346
                  end
1347
                  burst_tmp_data = burst_tmp_data >> 32;
1348
                  burst_data = burst_data >> 32;
1349
                end
1350
              end
1351
            end
1352
          end
1353
          if(fail == 0)
1354
            test_ok;
1355
          else
1356
            fail = 0;*/
1357
  end
1358 116 mohor
 
1359 169 mohor
end
1360 156 mohor
 
1361 169 mohor
end
1362
endtask // test_access_to_mac_reg
1363 156 mohor
 
1364
 
1365 169 mohor
task test_mii;
1366
  input  [31:0]  start_task;
1367
  input  [31:0]  end_task;
1368
  integer        i;
1369
  integer        i1;
1370
  integer        i2;
1371
  integer        i3;
1372
  integer        cnt;
1373
  integer        fail;
1374 181 mohor
  integer        test_num;
1375 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1376
  reg     [4:0]  phy_addr;
1377
  reg     [4:0]  reg_addr;
1378
  reg     [15:0] phy_data;
1379
  reg     [15:0] tmp_data;
1380
begin
1381
// MIIM MODULE TEST
1382
test_heading("MIIM MODULE TEST");
1383
$display(" ");
1384
$display("MIIM MODULE TEST");
1385
fail = 0;
1386 156 mohor
 
1387 192 tadej
// reset MAC registers
1388
hard_reset;
1389
// reset MAC and MII LOGIC with soft reset
1390
reset_mac;
1391 169 mohor
reset_mii;
1392 116 mohor
 
1393 194 tadej
 
1394 181 mohor
//////////////////////////////////////////////////////////////////////
1395
////                                                              ////
1396
////  test_mii:                                                   ////
1397
////                                                              ////
1398
////  0:  Test clock divider of mii management module with all    ////
1399
////      possible frequences.                                    ////
1400
////  1:  Test various readings from 'real' phy registers.        ////
1401
////  2:  Test various writings to 'real' phy registers (control  ////
1402
////      and non writable registers)                             ////
1403
////  3:  Test reset phy through mii management module            ////
1404
////  4:  Test 'walking one' across phy address (with and without ////
1405
////      preamble)                                               ////
1406
////  5:  Test 'walking one' across phy's register address (with  ////
1407
////      and without preamble)                                   ////
1408
////  6:  Test 'walking one' across phy's data (with and without  ////
1409
////      preamble)                                               ////
1410
////  7:  Test reading from phy with wrong phy address (host      ////
1411
////      reading high 'z' data)                                  ////
1412
////  8:  Test writing to phy with wrong phy address and reading  ////
1413
////      from correct one                                        ////
1414
////  9:  Test sliding stop scan command immediately after read   ////
1415
////      request (with and without preamble)                     ////
1416
//// 10:  Test sliding stop scan command immediately after write  ////
1417
////      request (with and without preamble)                     ////
1418
//// 11:  Test busy and nvalid status durations during write      ////
1419
////      (with and without preamble)                             ////
1420
//// 12:  Test busy and nvalid status durations during write      ////
1421
////      (with and without preamble)                             ////
1422
//// 13:  Test busy and nvalid status durations during scan (with ////
1423
////      and without preamble)                                   ////
1424
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1425
////      (with and without preamble)                             ////
1426
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1427
////      (with and without preamble)                             ////
1428
//// 16:  Test sliding stop scan command immediately after scan   ////
1429
////      request (with and without preamble)                     ////
1430
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1431
////      without preamble)                                       ////
1432
////                                                              ////
1433
//////////////////////////////////////////////////////////////////////
1434 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1435 169 mohor
begin
1436 194 tadej
 
1437 181 mohor
  ////////////////////////////////////////////////////////////////////
1438
  ////                                                            ////
1439
  ////  Test clock divider of mii management module with all      ////
1440
  ////  possible frequences.                                      ////
1441
  ////                                                            ////
1442
  ////////////////////////////////////////////////////////////////////
1443
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1444 169 mohor
  begin
1445 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1446
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1447
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1448 181 mohor
 
1449
    wait(Mdc_O); // wait for MII clock to be 1
1450
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1451
    begin
1452
      i1 = 0;
1453
      i2 = 0;
1454
      #Tp mii_set_clk_div(clk_div[7:0]);
1455
      @(posedge Mdc_O);
1456
      #Tp;
1457
      fork
1458 169 mohor
        begin
1459 181 mohor
          @(posedge Mdc_O);
1460 169 mohor
          #Tp;
1461 181 mohor
          disable count_i1;
1462
          disable count_i2;
1463 169 mohor
        end
1464 181 mohor
        begin: count_i1
1465
          forever
1466
          begin
1467
            @(posedge wb_clk);
1468
            i1 = i1 + 1;
1469
            #Tp;
1470
          end
1471
        end
1472
        begin: count_i2
1473
          forever
1474
          begin
1475
            @(negedge wb_clk);
1476
            i2 = i2 + 1;
1477
            #Tp;
1478
          end
1479
        end
1480
      join
1481
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1482
      begin
1483
        if((i1 == i2) && (i1 == 2))
1484 169 mohor
        begin
1485
        end
1486 181 mohor
        else
1487
        begin
1488
          fail = fail + 1;
1489 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1490 181 mohor
        end
1491 169 mohor
      end
1492
      else
1493
      begin
1494 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1495
        begin
1496
        end
1497
        else
1498
        begin
1499
          fail = fail + 1;
1500
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1501
        end
1502 169 mohor
      end
1503
    end
1504 181 mohor
    if(fail == 0)
1505
      test_ok;
1506 169 mohor
    else
1507 181 mohor
      fail = 0;
1508
  end
1509
 
1510
 
1511
  ////////////////////////////////////////////////////////////////////
1512
  ////                                                            ////
1513
  ////  Test various readings from 'real' phy registers.          ////
1514
  ////                                                            ////
1515
  ////////////////////////////////////////////////////////////////////
1516
  if (test_num == 1) // Test various readings from 'real' phy registers.
1517
  begin
1518 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1519
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1520
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1521 181 mohor
 
1522
    // set the fastest possible MII
1523
    clk_div = 0;
1524
    mii_set_clk_div(clk_div[7:0]);
1525
    // set address
1526
    reg_addr = 5'h1F;
1527
    phy_addr = 5'h1;
1528
    while(reg_addr >= 5'h4)
1529 169 mohor
    begin
1530 181 mohor
      // read request
1531
      #Tp mii_read_req(phy_addr, reg_addr);
1532
      check_mii_busy; // wait for read to finish
1533
      // read data
1534
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1535
      if (phy_data !== 16'hDEAD)
1536 169 mohor
      begin
1537 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1538
        fail = fail + 1;
1539 169 mohor
      end
1540 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1541
        reg_addr = 5'h3;
1542 169 mohor
      else
1543 181 mohor
        reg_addr = reg_addr - 5'h9;
1544 169 mohor
    end
1545 181 mohor
 
1546
    // set address
1547
    reg_addr = 5'h3;
1548
    // read request
1549
    #Tp mii_read_req(phy_addr, reg_addr);
1550
    check_mii_busy; // wait for read to finish
1551
    // read data
1552
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1553
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1554
    begin
1555
      test_fail("Wrong data was read from PHY from ID register 2");
1556
      fail = fail + 1;
1557
    end
1558
    if(fail == 0)
1559
      test_ok;
1560
    else
1561
      fail = 0;
1562 169 mohor
  end
1563 116 mohor
 
1564
 
1565 181 mohor
  ////////////////////////////////////////////////////////////////////
1566
  ////                                                            ////
1567
  ////  Test various writings to 'real' phy registers (control    ////
1568
  ////  and non writable registers)                               ////
1569
  ////                                                            ////
1570
  ////////////////////////////////////////////////////////////////////
1571
  if (test_num == 2) // 
1572 169 mohor
  begin
1573 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1574
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1575
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1576 181 mohor
 
1577
    // negate data and try to write into unwritable register
1578
    tmp_data = ~phy_data;
1579
    // write request
1580
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1581
    check_mii_busy; // wait for write to finish
1582 169 mohor
    // read request
1583
    #Tp mii_read_req(phy_addr, reg_addr);
1584
    check_mii_busy; // wait for read to finish
1585
    // read data
1586 181 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1587
    if (tmp_data !== phy_data)
1588
    begin
1589
      test_fail("Data was written into unwritable PHY register - ID register 2");
1590
      fail = fail + 1;
1591
    end
1592
 
1593
    // set address
1594
    reg_addr = 5'h0; // control register
1595
    // read request
1596
    #Tp mii_read_req(phy_addr, reg_addr);
1597
    check_mii_busy; // wait for read to finish
1598
    // read data
1599
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1600
    // write request
1601
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1602
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1603
    check_mii_busy; // wait for write to finish
1604
    // read request
1605
    #Tp mii_read_req(phy_addr, reg_addr);
1606
    check_mii_busy; // wait for read to finish
1607
    // read data
1608 169 mohor
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1609 181 mohor
    if (phy_data !== 16'h7DFF)
1610 169 mohor
    begin
1611 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1612 169 mohor
      fail = fail + 1;
1613
    end
1614 181 mohor
    // write request
1615
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1616
    check_mii_busy; // wait for write to finish
1617
    // read request
1618
    #Tp mii_read_req(phy_addr, reg_addr);
1619
    check_mii_busy; // wait for read to finish
1620
    // read data
1621
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1622
    if (phy_data !== tmp_data)
1623
    begin
1624
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1625
      fail = fail + 1;
1626
    end
1627
    if(fail == 0)
1628
      test_ok;
1629 116 mohor
    else
1630 181 mohor
      fail = 0;
1631 169 mohor
  end
1632 116 mohor
 
1633
 
1634 181 mohor
  ////////////////////////////////////////////////////////////////////
1635
  ////                                                            ////
1636
  ////  Test reset phy through mii management module              ////
1637
  ////                                                            ////
1638
  ////////////////////////////////////////////////////////////////////
1639
  if (test_num == 3) // 
1640 169 mohor
  begin
1641 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1642
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1643
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1644 181 mohor
 
1645
    // set address
1646
    reg_addr = 5'h0; // control register
1647
    // write request
1648
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1649
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1650
    check_mii_busy; // wait for write to finish
1651
    // read request
1652
    #Tp mii_read_req(phy_addr, reg_addr);
1653
    check_mii_busy; // wait for read to finish
1654
    // read data
1655
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1656
    if (phy_data !== tmp_data)
1657
    begin
1658
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1659
      fail = fail + 1;
1660
    end
1661
    // set reset bit - selfclearing bit in PHY
1662
    phy_data = phy_data | 16'h8000;
1663
    // write request
1664
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1665
    check_mii_busy; // wait for write to finish
1666
    // read request
1667
    #Tp mii_read_req(phy_addr, reg_addr);
1668
    check_mii_busy; // wait for read to finish
1669
    // read data
1670
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1671
    // check self clearing of reset bit
1672
    if (tmp_data[15] !== 1'b0)
1673
    begin
1674
      test_fail("Reset bit should be self cleared - control register");
1675
      fail = fail + 1;
1676
    end
1677
    // check reset value of control register
1678
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1679
    begin
1680
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1681
      fail = fail + 1;
1682
    end
1683
    if(fail == 0)
1684
      test_ok;
1685
    else
1686
      fail = 0;
1687 169 mohor
  end
1688
 
1689
 
1690 181 mohor
  ////////////////////////////////////////////////////////////////////
1691
  ////                                                            ////
1692
  ////  Test 'walking one' across phy address (with and without   ////
1693
  ////  preamble)                                                 ////
1694
  ////                                                            ////
1695
  ////////////////////////////////////////////////////////////////////
1696
  if (test_num == 4) // 
1697 169 mohor
  begin
1698 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1699
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1700
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1701 181 mohor
 
1702
    // set PHY to test mode
1703
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1704
    for (i = 0; i <= 1; i = i + 1)
1705 169 mohor
    begin
1706 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1707
      #Tp eth_phy.clear_test_regs;
1708
      // MII mode register
1709
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1710
                wbm_subseq_waits);
1711
      // walk one across phy address
1712
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1713 169 mohor
      begin
1714 181 mohor
        reg_addr = $random;
1715
        tmp_data = $random;
1716
        // write request
1717
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1718
        check_mii_busy; // wait for write to finish
1719
        // read request
1720
        #Tp mii_read_req(phy_addr, reg_addr);
1721
        check_mii_busy; // wait for read to finish
1722
        // read data
1723
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1724
        #Tp;
1725
        if (phy_data !== tmp_data)
1726
        begin
1727
          if (i)
1728
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1729
          else
1730
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1731
          fail = fail + 1;
1732
        end
1733
        @(posedge wb_clk);
1734
        #Tp;
1735 169 mohor
      end
1736
    end
1737 181 mohor
    // set PHY to normal mode
1738
    #Tp eth_phy.test_regs(0);
1739
    #Tp eth_phy.preamble_suppresed(0);
1740
    // MII mode register
1741
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1742
    if(fail == 0)
1743
      test_ok;
1744
    else
1745
      fail = 0;
1746 169 mohor
  end
1747
 
1748
 
1749 181 mohor
  ////////////////////////////////////////////////////////////////////
1750
  ////                                                            ////
1751
  ////  Test 'walking one' across phy's register address (with    ////
1752
  ////  and without preamble)                                     ////
1753
  ////                                                            ////
1754
  ////////////////////////////////////////////////////////////////////
1755
  if (test_num == 5) // 
1756 169 mohor
  begin
1757 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1758
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1759
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1760 181 mohor
 
1761
    // set PHY to test mode
1762
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1763
    for (i = 0; i <= 1; i = i + 1)
1764 169 mohor
    begin
1765 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1766
      #Tp eth_phy.clear_test_regs;
1767
      // MII mode register
1768
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1769
                wbm_subseq_waits);
1770
      // walk one across reg address
1771
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1772 169 mohor
      begin
1773 181 mohor
        phy_addr = $random;
1774
        tmp_data = $random;
1775
        // write request
1776
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1777
        check_mii_busy; // wait for write to finish
1778
        // read request
1779
        #Tp mii_read_req(phy_addr, reg_addr);
1780
        check_mii_busy; // wait for read to finish
1781
        // read data
1782
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1783
        #Tp;
1784
        if (phy_data !== tmp_data)
1785
        begin
1786
          if (i)
1787
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1788
          else
1789
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1790
          fail = fail + 1;
1791
        end
1792
        @(posedge wb_clk);
1793
        #Tp;
1794 169 mohor
      end
1795
    end
1796 181 mohor
    // set PHY to normal mode
1797
    #Tp eth_phy.test_regs(0);
1798
    #Tp eth_phy.preamble_suppresed(0);
1799
    // MII mode register
1800
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1801
    if(fail == 0)
1802
      test_ok;
1803
    else
1804
      fail = 0;
1805 169 mohor
  end
1806
 
1807
 
1808 181 mohor
  ////////////////////////////////////////////////////////////////////
1809
  ////                                                            ////
1810
  ////  Test 'walking one' across phy's data (with and without    ////
1811
  ////  preamble)                                                 ////
1812
  ////                                                            ////
1813
  ////////////////////////////////////////////////////////////////////
1814
  if (test_num == 6) // 
1815 169 mohor
  begin
1816 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
1817
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
1818
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
1819 181 mohor
 
1820
    // set PHY to test mode
1821
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1822
    for (i = 0; i <= 1; i = i + 1)
1823 169 mohor
    begin
1824 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1825
      #Tp eth_phy.clear_test_regs;
1826
      // MII mode register
1827
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1828
                wbm_subseq_waits);
1829
      // walk one across data
1830
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
1831 169 mohor
      begin
1832 181 mohor
        phy_addr = $random;
1833
        reg_addr = $random;
1834
        // write request
1835
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1836
        check_mii_busy; // wait for write to finish
1837
        // read request
1838
        #Tp mii_read_req(phy_addr, reg_addr);
1839
        check_mii_busy; // wait for read to finish
1840
        // read data
1841
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1842
        #Tp;
1843
        if (phy_data !== tmp_data)
1844
        begin
1845
          if (i)
1846
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1847
          else
1848
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1849
          fail = fail + 1;
1850
        end
1851
        @(posedge wb_clk);
1852
        #Tp;
1853 169 mohor
      end
1854
    end
1855 181 mohor
    // set PHY to normal mode
1856
    #Tp eth_phy.test_regs(0);
1857
    #Tp eth_phy.preamble_suppresed(0);
1858
    // MII mode register
1859
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1860
    if(fail == 0)
1861
      test_ok;
1862
    else
1863
      fail = 0;
1864 169 mohor
  end
1865
 
1866
 
1867 181 mohor
  ////////////////////////////////////////////////////////////////////
1868
  ////                                                            ////
1869
  ////  Test reading from phy with wrong phy address (host        ////
1870
  ////  reading high 'z' data)                                    ////
1871
  ////                                                            ////
1872
  ////////////////////////////////////////////////////////////////////
1873
  if (test_num == 7) // 
1874 169 mohor
  begin
1875 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
1876
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
1877
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
1878 181 mohor
 
1879
    phy_addr = 5'h2; // wrong PHY address
1880
    // read request
1881
    #Tp mii_read_req(phy_addr, reg_addr);
1882
    check_mii_busy; // wait for read to finish
1883
    // read data
1884
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
1885
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1886
    if (tmp_data !== 16'hzzzz)
1887
    begin
1888
      test_fail("Data was read from PHY register with wrong PHY address - control register");
1889
      fail = fail + 1;
1890
    end
1891
    if(fail == 0)
1892
      test_ok;
1893
    else
1894
      fail = 0;
1895 169 mohor
  end
1896
 
1897
 
1898 181 mohor
  ////////////////////////////////////////////////////////////////////
1899
  ////                                                            ////
1900
  ////  Test writing to phy with wrong phy address and reading    ////
1901
  ////  from correct one                                          ////
1902
  ////                                                            ////
1903
  ////////////////////////////////////////////////////////////////////
1904
  if (test_num == 8) // 
1905 169 mohor
  begin
1906 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
1907
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
1908
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
1909 181 mohor
 
1910
    // set address
1911
    reg_addr = 5'h0; // control register
1912
    phy_addr = 5'h2; // wrong PHY address
1913
    // write request
1914
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1915
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1916
    check_mii_busy; // wait for write to finish
1917
 
1918
    phy_addr = 5'h1; // correct PHY address
1919
    // read request
1920
    #Tp mii_read_req(phy_addr, reg_addr);
1921
    check_mii_busy; // wait for read to finish
1922
    // read data
1923
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1924
    if (phy_data === tmp_data)
1925
    begin
1926
      test_fail("Data was written into PHY register with wrong PHY address - control register");
1927
      fail = fail + 1;
1928
    end
1929
    if(fail == 0)
1930
      test_ok;
1931
    else
1932
      fail = 0;
1933 169 mohor
  end
1934
 
1935
 
1936 181 mohor
  ////////////////////////////////////////////////////////////////////
1937
  ////                                                            ////
1938
  ////  Test sliding stop scan command immediately after read     ////
1939
  ////  request (with and without preamble)                       ////
1940
  ////                                                            ////
1941
  ////////////////////////////////////////////////////////////////////
1942
  if (test_num == 9) // 
1943 169 mohor
  begin
1944 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
1945
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
1946 181 mohor
    `TIME;
1947 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
1948 181 mohor
 
1949
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
1950 169 mohor
    begin
1951 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
1952
      // MII mode register
1953
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
1954
               wbm_subseq_waits);
1955
      i = 0;
1956
      cnt = 0;
1957
      while (i < 80) // delay for sliding of writing a STOP SCAN command
1958 169 mohor
      begin
1959 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
1960
        begin
1961
          // set address
1962
          reg_addr = 5'h0; // control register
1963
          phy_addr = 5'h1; // correct PHY address
1964
          cnt = 0;
1965
          // read request
1966
          #Tp mii_read_req(phy_addr, reg_addr);
1967
          fork
1968
            begin
1969
              repeat(i) @(posedge Mdc_O);
1970
              // write command 0x0 into MII command register
1971
              // MII command written while read in progress
1972
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1973
              @(posedge wb_clk);
1974
              #Tp check_mii_busy; // wait for read to finish
1975
            end
1976
            begin
1977
              // wait for serial bus to become active
1978
              wait(Mdio_IO !== 1'bz);
1979
              // count transfer length
1980
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
1981
              begin
1982
                @(posedge Mdc_O);
1983
                #Tp cnt = cnt + 1;
1984
              end
1985
            end
1986
          join
1987
          // check transfer length
1988
          if (i2) // without preamble
1989 169 mohor
          begin
1990 181 mohor
            if (cnt != 33) // 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 169 mohor
          end
1996 181 mohor
          else // with preamble
1997 169 mohor
          begin
1998 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
1999
            begin
2000
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2001
              fail = fail + 1;
2002
            end
2003
          end
2004
          // check the BUSY signal to see if the bus is still IDLE
2005
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2006
            check_mii_busy; // wait for bus to become idle
2007
 
2008
          // try normal write or read after read was finished
2009
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2010
          #Tp cnt = 0;
2011
          if (i3 == 0) // write after read
2012
          begin
2013
            // write request
2014
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2015 169 mohor
            // wait for serial bus to become active
2016
            wait(Mdio_IO !== 1'bz);
2017
            // count transfer length
2018 181 mohor
            while(Mdio_IO !== 1'bz)
2019 169 mohor
            begin
2020
              @(posedge Mdc_O);
2021
              #Tp cnt = cnt + 1;
2022
            end
2023 181 mohor
            @(posedge Mdc_O);
2024
            // read request
2025
            #Tp mii_read_req(phy_addr, reg_addr);
2026
            check_mii_busy; // wait for read to finish
2027
            // read and check data
2028
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2029
            if (phy_data !== tmp_data)
2030
            begin
2031
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2032
              fail = fail + 1;
2033
            end
2034 169 mohor
          end
2035 181 mohor
          else // read after read
2036 169 mohor
          begin
2037 181 mohor
            // read request
2038
            #Tp mii_read_req(phy_addr, reg_addr);
2039
            // wait for serial bus to become active
2040
            wait(Mdio_IO !== 1'bz);
2041
            // count transfer length
2042
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2043
            begin
2044
              @(posedge Mdc_O);
2045
              #Tp cnt = cnt + 1;
2046
            end
2047 169 mohor
            @(posedge Mdc_O);
2048 181 mohor
            check_mii_busy; // wait for read to finish
2049
            // read and check data
2050
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2051
            if (phy_data !== tmp_data)
2052
            begin
2053
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2054
              fail = fail + 1;
2055
            end
2056 169 mohor
          end
2057 181 mohor
          // check if transfer was a proper length
2058
          if (i2) // without preamble
2059 169 mohor
          begin
2060 181 mohor
            if (cnt != 33) // 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 181 mohor
          else // with preamble
2067 169 mohor
          begin
2068 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2069
            begin
2070
              test_fail("New request did not proceed correctly, after read request");
2071
              fail = fail + 1;
2072
            end
2073 169 mohor
          end
2074
        end
2075 181 mohor
        #Tp;
2076
        // set delay of writing the command
2077 169 mohor
        if (i2) // without preamble
2078
        begin
2079 181 mohor
          case(i)
2080
            0, 1:               i = i + 1;
2081
            18, 19, 20, 21, 22,
2082
            23, 24, 25, 26, 27,
2083
            28, 29, 30, 31, 32,
2084
            33, 34, 35:         i = i + 1;
2085
            36:                 i = 80;
2086
            default:            i = 18;
2087
          endcase
2088 169 mohor
        end
2089
        else // with preamble
2090
        begin
2091 181 mohor
          case(i)
2092
            0, 1:               i = i + 1;
2093
            50, 51, 52, 53, 54,
2094
            55, 56, 57, 58, 59,
2095
            60, 61, 62, 63, 64,
2096
            65, 66, 67:         i = i + 1;
2097
            68:                 i = 80;
2098
            default:            i = 50;
2099
          endcase
2100 169 mohor
        end
2101 181 mohor
        @(posedge wb_clk);
2102 169 mohor
      end
2103
    end
2104 181 mohor
    // set PHY to normal mode
2105
    #Tp eth_phy.preamble_suppresed(0);
2106
    // MII mode register
2107
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2108
    if(fail == 0)
2109
      test_ok;
2110
    else
2111
      fail = 0;
2112 169 mohor
  end
2113
 
2114
 
2115 181 mohor
  ////////////////////////////////////////////////////////////////////
2116
  ////                                                            ////
2117
  ////  Test sliding stop scan command immediately after write    ////
2118
  ////  request (with and without preamble)                       ////
2119
  ////                                                            ////
2120
  ////////////////////////////////////////////////////////////////////
2121
  if (test_num == 10) // 
2122 169 mohor
  begin
2123 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2124
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2125 181 mohor
    `TIME;
2126 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2127 181 mohor
 
2128
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2129 169 mohor
    begin
2130 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2131
      // MII mode register
2132
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2133
                wbm_subseq_waits);
2134
      i = 0;
2135
      cnt = 0;
2136
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2137 169 mohor
      begin
2138 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2139
        begin
2140
          // set address
2141
          reg_addr = 5'h0; // control register
2142
          phy_addr = 5'h1; // correct PHY address
2143
          cnt = 0;
2144
          // write request
2145
          phy_data = {8'h75, (i[7:0] + 1)};
2146
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2147
          fork
2148
            begin
2149
              repeat(i) @(posedge Mdc_O);
2150
              // write command 0x0 into MII command register
2151
              // MII command written while read in progress
2152
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2153
              @(posedge wb_clk);
2154
              #Tp check_mii_busy; // wait for write to finish
2155
            end
2156
            begin
2157
              // wait for serial bus to become active
2158
              wait(Mdio_IO !== 1'bz);
2159
              // count transfer length
2160
              while(Mdio_IO !== 1'bz)
2161
              begin
2162
                @(posedge Mdc_O);
2163
                #Tp cnt = cnt + 1;
2164
              end
2165
            end
2166
          join
2167
          // check transfer length
2168
          if (i2) // without preamble
2169 169 mohor
          begin
2170 181 mohor
            if (cnt != 33) // 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 169 mohor
          end
2176 181 mohor
          else // with preamble
2177 169 mohor
          begin
2178 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2179
            begin
2180
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2181
              fail = fail + 1;
2182
            end
2183
          end
2184
          // check the BUSY signal to see if the bus is still IDLE
2185
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2186
            check_mii_busy; // wait for bus to become idle
2187
 
2188
          // try normal write or read after write was finished
2189
          #Tp cnt = 0;
2190
          if (i3 == 0) // write after write
2191
          begin
2192
            phy_data = {8'h7A, (i[7:0] + 1)};
2193
            // write request
2194
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2195 169 mohor
            // wait for serial bus to become active
2196
            wait(Mdio_IO !== 1'bz);
2197
            // count transfer length
2198
            while(Mdio_IO !== 1'bz)
2199
            begin
2200
              @(posedge Mdc_O);
2201
              #Tp cnt = cnt + 1;
2202
            end
2203 181 mohor
            @(posedge Mdc_O);
2204
            // read request
2205
            #Tp mii_read_req(phy_addr, reg_addr);
2206
            check_mii_busy; // wait for read to finish
2207
            // read and check data
2208
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2209
            if (phy_data !== tmp_data)
2210
            begin
2211
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2212
              fail = fail + 1;
2213
            end
2214 169 mohor
          end
2215 181 mohor
          else // read after write
2216 169 mohor
          begin
2217 181 mohor
            // read request
2218
            #Tp mii_read_req(phy_addr, reg_addr);
2219
            // wait for serial bus to become active
2220
            wait(Mdio_IO !== 1'bz);
2221
            // count transfer length
2222
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2223
            begin
2224
              @(posedge Mdc_O);
2225
              #Tp cnt = cnt + 1;
2226
            end
2227 169 mohor
            @(posedge Mdc_O);
2228 181 mohor
            check_mii_busy; // wait for read to finish
2229
            // read and check data
2230
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2231
            if (phy_data !== tmp_data)
2232
            begin
2233
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2234
              fail = fail + 1;
2235
            end
2236 169 mohor
          end
2237 181 mohor
          // check if transfer was a proper length
2238
          if (i2) // without preamble
2239 169 mohor
          begin
2240 181 mohor
            if (cnt != 33) // 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 181 mohor
          else // with preamble
2247 169 mohor
          begin
2248 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2249
            begin
2250
              test_fail("New request did not proceed correctly, after write request");
2251
              fail = fail + 1;
2252
            end
2253 169 mohor
          end
2254
        end
2255 181 mohor
        #Tp;
2256
        // set delay of writing the command
2257 169 mohor
        if (i2) // without preamble
2258
        begin
2259 181 mohor
          case(i)
2260
            0, 1:               i = i + 1;
2261
            18, 19, 20, 21, 22,
2262
            23, 24, 25, 26, 27,
2263
            28, 29, 30, 31, 32,
2264
            33, 34, 35:         i = i + 1;
2265
            36:                 i = 80;
2266
            default:            i = 18;
2267
          endcase
2268 169 mohor
        end
2269
        else // with preamble
2270
        begin
2271 181 mohor
          case(i)
2272
            0, 1:               i = i + 1;
2273
            50, 51, 52, 53, 54,
2274
            55, 56, 57, 58, 59,
2275
            60, 61, 62, 63, 64,
2276
            65, 66, 67:         i = i + 1;
2277
            68:                 i = 80;
2278
            default:            i = 50;
2279
          endcase
2280 169 mohor
        end
2281 181 mohor
        @(posedge wb_clk);
2282 169 mohor
      end
2283
    end
2284 181 mohor
    // set PHY to normal mode
2285
    #Tp eth_phy.preamble_suppresed(0);
2286
    // MII mode register
2287
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2288
    if(fail == 0)
2289
      test_ok;
2290
    else
2291
      fail = 0;
2292 169 mohor
  end
2293
 
2294
 
2295 181 mohor
  ////////////////////////////////////////////////////////////////////
2296
  ////                                                            ////
2297
  ////  Test busy and nvalid status durations during write (with  ////
2298
  ////  and without preamble)                                     ////
2299
  ////                                                            ////
2300
  ////////////////////////////////////////////////////////////////////
2301
  if (test_num == 11) // 
2302 169 mohor
  begin
2303 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2304
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2305
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2306 181 mohor
 
2307
    reset_mii; // reset MII
2308
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2309
    #Tp eth_phy.link_up_down(1);
2310
    // set the MII
2311
    clk_div = 64;
2312
    mii_set_clk_div(clk_div[7:0]);
2313
    // set address
2314
    reg_addr = 5'h1; // status register
2315
    phy_addr = 5'h1; // correct PHY address
2316
 
2317
    for (i = 0; i <= 1; i = i + 1)
2318 169 mohor
    begin
2319 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2320
      // MII mode register
2321
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2322
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2323
      @(posedge Mdc_O);
2324
      // write request
2325
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2326
      // read data from MII status register - Busy and Nvalid bits
2327
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2328
 
2329
      // check MII IO signal and Busy and Nvalid bits
2330
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2331 169 mohor
      begin
2332 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2333
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2334
        begin
2335
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2336
          fail = fail + 1;
2337
        end
2338
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2339
        begin
2340
          test_fail("Nvalid signal was set during write");
2341
          fail = fail + 1;
2342
        end
2343 169 mohor
      end
2344 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2345 169 mohor
      begin
2346 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2347
        begin
2348
          test_fail("Busy signal should be set after write, due to reads from MII status register");
2349
          fail = fail + 1;
2350
        end
2351
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2352
        begin
2353
          test_fail("Nvalid signal was set during write");
2354
          fail = fail + 1;
2355
        end
2356 169 mohor
      end
2357 181 mohor
 
2358
      // wait for serial bus to become active
2359
      wait(Mdio_IO !== 1'bz);
2360
      // count transfer bits
2361
      if (i)
2362 169 mohor
      begin
2363 181 mohor
        repeat(32) @(posedge Mdc_O);
2364 169 mohor
      end
2365 181 mohor
      else
2366 169 mohor
      begin
2367 181 mohor
        repeat(64) @(posedge Mdc_O);
2368 169 mohor
      end
2369 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2370
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2371
 
2372
      // check MII IO signal and Busy and Nvalid bits
2373
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2374 169 mohor
      begin
2375 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2376
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2377
        begin
2378
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2379
          fail = fail + 1;
2380
        end
2381
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2382
        begin
2383
          test_fail("Nvalid signal was set during write");
2384
          fail = fail + 1;
2385
        end
2386 169 mohor
      end
2387 181 mohor
      else // Busy bit should still be set to '1'
2388 169 mohor
      begin
2389 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2390
        begin
2391
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2392
          fail = fail + 1;
2393
        end
2394
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2395
        begin
2396
          test_fail("Nvalid signal was set during write");
2397
          fail = fail + 1;
2398
        end
2399 169 mohor
      end
2400 181 mohor
 
2401
      // wait for next negative clock edge
2402
      @(negedge Mdc_O);
2403 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2404
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2405 181 mohor
 
2406 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2407
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2408
      begin
2409
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2410
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2411
        begin
2412
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2413
          fail = fail + 1;
2414
        end
2415
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2416
        begin
2417
          test_fail("Nvalid signal was set during write");
2418
          fail = fail + 1;
2419
        end
2420
      end
2421 181 mohor
      else // Busy bit should still be set to '1'
2422 169 mohor
      begin
2423
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2424
        begin
2425 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2426
          fail = fail + 1;
2427 169 mohor
        end
2428 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2429 169 mohor
        begin
2430 181 mohor
          test_fail("Nvalid signal was set during write");
2431
          fail = fail + 1;
2432
        end
2433
      end
2434
 
2435
      // wait for Busy to become inactive
2436
      i1 = 0;
2437
      while (i1 <= 2)
2438
      begin
2439
        // wait for next positive clock edge
2440
        @(posedge Mdc_O);
2441
        // read data from MII status register - Busy and Nvalid bits
2442
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2443
 
2444
        // check MII IO signal and Busy and Nvalid bits
2445
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2446
        begin
2447
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2448
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2449 169 mohor
          begin
2450 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2451 169 mohor
            fail = fail + 1;
2452
          end
2453 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2454
          begin
2455
            test_fail("Nvalid signal was set during write");
2456
            fail = fail + 1;
2457
          end
2458 169 mohor
        end
2459 181 mohor
        else // wait for Busy bit to be set to '0'
2460 169 mohor
        begin
2461 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2462
          begin
2463
            i1 = 3; // end of Busy checking
2464
          end
2465
          else
2466
          begin
2467
            if (i1 == 2)
2468
            begin
2469
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2470
              fail = fail + 1;
2471
            end
2472
            #Tp i1 = i1 + 1;
2473
          end
2474
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2475
          begin
2476
            test_fail("Nvalid signal was set after write");
2477
            fail = fail + 1;
2478
          end
2479 169 mohor
        end
2480
      end
2481
    end
2482 181 mohor
    // set PHY to normal mode
2483
    #Tp eth_phy.preamble_suppresed(0);
2484
    // MII mode register
2485
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2486
    if(fail == 0)
2487
      test_ok;
2488
    else
2489
      fail = 0;
2490 116 mohor
  end
2491
 
2492
 
2493 181 mohor
  ////////////////////////////////////////////////////////////////////
2494
  ////                                                            ////
2495
  ////  Test busy and nvalid status durations during write (with  ////
2496
  ////  and without preamble)                                     ////
2497
  ////                                                            ////
2498
  ////////////////////////////////////////////////////////////////////
2499
  if (test_num == 12) // 
2500 169 mohor
  begin
2501 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2502
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2503
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2504 181 mohor
 
2505
    reset_mii; // reset MII
2506
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2507
    #Tp eth_phy.link_up_down(1);
2508
    // set the MII
2509
    clk_div = 64;
2510
    mii_set_clk_div(clk_div[7:0]);
2511
    // set address
2512
    reg_addr = 5'h1; // status register
2513
    phy_addr = 5'h1; // correct PHY address
2514
 
2515
    for (i = 0; i <= 1; i = i + 1)
2516 169 mohor
    begin
2517 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2518
      // MII mode register
2519
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2520
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2521 169 mohor
      @(posedge Mdc_O);
2522 181 mohor
      // read request
2523
      #Tp mii_read_req(phy_addr, reg_addr);
2524 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2525
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2526 181 mohor
 
2527 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2528
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2529
      begin
2530 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2531 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2532
        begin
2533 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2534 169 mohor
          fail = fail + 1;
2535
        end
2536
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2537
        begin
2538
          test_fail("Nvalid signal was set during read");
2539
          fail = fail + 1;
2540
        end
2541
      end
2542 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2543 169 mohor
      begin
2544
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2545
        begin
2546 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2547
          fail = fail + 1;
2548 169 mohor
        end
2549
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2550
        begin
2551 181 mohor
          test_fail("Nvalid signal was set during read");
2552 169 mohor
          fail = fail + 1;
2553
        end
2554
      end
2555 181 mohor
 
2556
      // wait for serial bus to become active
2557
      wait(Mdio_IO !== 1'bz);
2558
      // count transfer bits
2559
      if (i)
2560 169 mohor
      begin
2561 181 mohor
        repeat(31) @(posedge Mdc_O);
2562 169 mohor
      end
2563 181 mohor
      else
2564 169 mohor
      begin
2565 181 mohor
        repeat(63) @(posedge Mdc_O);
2566 169 mohor
      end
2567 181 mohor
      // wait for next negative clock edge
2568
      @(negedge Mdc_O);
2569
      // read data from MII status register - Busy and Nvalid bits
2570
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2571
 
2572
      // check MII IO signal and Busy and Nvalid bits
2573
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2574 169 mohor
      begin
2575 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2576
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2577
        begin
2578
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2579
          fail = fail + 1;
2580
        end
2581
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2582
        begin
2583
          test_fail("Nvalid signal was set during read");
2584
          fail = fail + 1;
2585
        end
2586 169 mohor
      end
2587 181 mohor
      else // Busy bit should still be set to '1'
2588 169 mohor
      begin
2589 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2590
        begin
2591
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2592
          fail = fail + 1;
2593
        end
2594
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2595
        begin
2596
          test_fail("Nvalid signal was set during read");
2597
          fail = fail + 1;
2598
        end
2599 169 mohor
      end
2600 181 mohor
 
2601 169 mohor
      // wait for next positive clock edge
2602
      @(posedge Mdc_O);
2603
      // read data from MII status register - Busy and Nvalid bits
2604
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2605 181 mohor
 
2606 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2607
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2608
      begin
2609
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2610 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2611 169 mohor
        begin
2612 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2613
          fail = fail + 1;
2614
        end
2615
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2616
        begin
2617
          test_fail("Nvalid signal was set during read");
2618
          fail = fail + 1;
2619
        end
2620
      end
2621
      else // Busy bit should still be set to '1'
2622
      begin
2623
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2624
        begin
2625
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2626
          fail = fail + 1;
2627
        end
2628
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2629
        begin
2630
          test_fail("Nvalid signal was set during read");
2631
          fail = fail + 1;
2632
        end
2633
      end
2634
 
2635
      // wait for Busy to become inactive
2636
      i1 = 0;
2637
      while (i1 <= 2)
2638
      begin
2639
        // wait for next positive clock edge
2640
        @(posedge Mdc_O);
2641
        // read data from MII status register - Busy and Nvalid bits
2642
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2643
 
2644
        // check MII IO signal and Busy and Nvalid bits
2645
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2646
        begin
2647
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2648 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2649
          begin
2650
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2651
            fail = fail + 1;
2652
          end
2653 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2654 169 mohor
          begin
2655 181 mohor
            test_fail("Nvalid signal was set during read");
2656 169 mohor
            fail = fail + 1;
2657
          end
2658
        end
2659 181 mohor
        else // wait for Busy bit to be set to '0'
2660 169 mohor
        begin
2661
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2662
          begin
2663
            i1 = 3; // end of Busy checking
2664
          end
2665
          else
2666
          begin
2667
            if (i1 == 2)
2668
            begin
2669
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2670
              fail = fail + 1;
2671
            end
2672
            #Tp i1 = i1 + 1;
2673
          end
2674 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2675 169 mohor
          begin
2676 181 mohor
            test_fail("Nvalid signal was set after read");
2677 169 mohor
            fail = fail + 1;
2678
          end
2679
        end
2680
      end
2681
    end
2682 181 mohor
    // set PHY to normal mode
2683
    #Tp eth_phy.preamble_suppresed(0);
2684
    // MII mode register
2685
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2686
    if(fail == 0)
2687
      test_ok;
2688
    else
2689
      fail = 0;
2690 169 mohor
  end
2691
 
2692
 
2693 181 mohor
  ////////////////////////////////////////////////////////////////////
2694
  ////                                                            ////
2695
  ////  Test busy and nvalid status durations during scan (with   ////
2696
  ////  and without preamble)                                     ////
2697
  ////                                                            ////
2698
  ////////////////////////////////////////////////////////////////////
2699
  if (test_num == 13) // 
2700 169 mohor
  begin
2701 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2702
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2703
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2704 181 mohor
 
2705
    reset_mii; // reset MII
2706
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2707
    #Tp eth_phy.link_up_down(1);
2708
    // set the MII
2709
    clk_div = 64;
2710
    mii_set_clk_div(clk_div[7:0]);
2711
    // set address
2712
    reg_addr = 5'h1; // status register
2713
    phy_addr = 5'h1; // correct PHY address
2714
 
2715
    for (i = 0; i <= 1; i = i + 1)
2716 169 mohor
    begin
2717 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2718
      // MII mode register
2719
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2720
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2721
      @(posedge Mdc_O);
2722
      // scan request
2723
      #Tp mii_scan_req(phy_addr, reg_addr);
2724
      // read data from MII status register - Busy and Nvalid bits
2725
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2726
 
2727
      // check MII IO signal and Busy and Nvalid bits
2728
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2729 169 mohor
      begin
2730 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2731
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2732
        begin
2733
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2734
          fail = fail + 1;
2735
        end
2736
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2737
        begin
2738
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2739
          fail = fail + 1;
2740
        end
2741 169 mohor
      end
2742 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2743 169 mohor
      begin
2744 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2745
        begin
2746
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2747
          fail = fail + 1;
2748
        end
2749
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2750
        begin
2751
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2752
          fail = fail + 1;
2753
        end
2754 169 mohor
      end
2755 181 mohor
 
2756
      // wait for serial bus to become active
2757 169 mohor
      wait(Mdio_IO !== 1'bz);
2758 181 mohor
      // count transfer bits
2759
      if (i)
2760 169 mohor
      begin
2761 181 mohor
        repeat(21) @(posedge Mdc_O);
2762 169 mohor
      end
2763 181 mohor
      else
2764 169 mohor
      begin
2765 181 mohor
        repeat(53) @(posedge Mdc_O);
2766 169 mohor
      end
2767 181 mohor
      // stop scan
2768
      #Tp mii_scan_finish; // finish scan operation
2769
 
2770
      // wait for next positive clock edge
2771
      repeat(10) @(posedge Mdc_O);
2772
      // read data from MII status register - Busy and Nvalid bits
2773
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2774
 
2775
      // check MII IO signal and Busy and Nvalid bits
2776
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2777 169 mohor
      begin
2778 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2779
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2780 169 mohor
        begin
2781 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2782 169 mohor
          fail = fail + 1;
2783
        end
2784 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2785 169 mohor
      end
2786 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2787 169 mohor
      begin
2788 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2789 169 mohor
        begin
2790 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2791 169 mohor
          fail = fail + 1;
2792
        end
2793 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2794 169 mohor
        begin
2795 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2796 169 mohor
          fail = fail + 1;
2797
        end
2798 181 mohor
      end
2799
 
2800
      // wait for next negative clock edge
2801
      @(negedge Mdc_O);
2802
      // read data from MII status register - Busy and Nvalid bits
2803
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2804
 
2805
      // check MII IO signal and Busy and Nvalid bits
2806
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2807
      begin
2808
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2809
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2810 169 mohor
        begin
2811 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2812
          fail = fail + 1;
2813 169 mohor
        end
2814 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2815 169 mohor
      end
2816 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2817 169 mohor
      begin
2818 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2819 169 mohor
        begin
2820 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2821
          fail = fail + 1;
2822 169 mohor
        end
2823 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2824 169 mohor
        begin
2825 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2826
          fail = fail + 1;
2827 169 mohor
        end
2828
      end
2829 181 mohor
 
2830
      // wait for next negative clock edge
2831
      @(posedge Mdc_O);
2832
      // read data from MII status register - Busy and Nvalid bits
2833 169 mohor
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2834 181 mohor
 
2835
      // check MII IO signal and Busy and Nvalid bits
2836
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2837 169 mohor
      begin
2838 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2839
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2840 169 mohor
        begin
2841 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2842 169 mohor
          fail = fail + 1;
2843
        end
2844 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2845 169 mohor
        begin
2846 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2847 169 mohor
          fail = fail + 1;
2848
        end
2849
      end
2850 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
2851 169 mohor
      begin
2852 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2853 169 mohor
        begin
2854 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2855
          fail = fail + 1;
2856 169 mohor
        end
2857 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2858 169 mohor
        begin
2859 181 mohor
          i2 = 1; // check finished
2860 169 mohor
        end
2861 181 mohor
        else
2862 169 mohor
        begin
2863 181 mohor
          i2 = 0; // check must continue
2864 169 mohor
        end
2865
      end
2866 181 mohor
 
2867
      // wait for Busy to become inactive
2868
      i1 = 0;
2869
      while ((i1 <= 2) || (i2 == 0))
2870
      begin
2871
        // wait for next positive clock edge
2872
        @(posedge Mdc_O);
2873
        // read data from MII status register - Busy and Nvalid bits
2874
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2875
 
2876
        // check MII IO signal and Busy and Nvalid bits
2877
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2878 169 mohor
        begin
2879 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2880
          if (i1 <= 2)
2881 169 mohor
          begin
2882 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2883 169 mohor
            begin
2884 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2885 169 mohor
              fail = fail + 1;
2886
            end
2887
          end
2888 181 mohor
          if (i2 == 0)
2889 169 mohor
          begin
2890 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2891 169 mohor
            begin
2892 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2893 169 mohor
              fail = fail + 1;
2894
            end
2895
          end
2896
        end
2897 181 mohor
        else // wait for Busy bit to be set to '0'
2898 169 mohor
        begin
2899 181 mohor
          if (i1 <= 2)
2900 169 mohor
          begin
2901 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2902 169 mohor
            begin
2903 181 mohor
              i1 = 3; // end of Busy checking
2904 169 mohor
            end
2905 181 mohor
            else
2906 169 mohor
            begin
2907 181 mohor
              if (i1 == 2)
2908 169 mohor
              begin
2909 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2910 169 mohor
                fail = fail + 1;
2911
              end
2912 181 mohor
              #Tp i1 = i1 + 1;
2913 169 mohor
            end
2914 181 mohor
          end
2915
          if (i2 == 0)
2916
          begin
2917
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2918 169 mohor
            begin
2919 181 mohor
              i2 = 1;
2920 169 mohor
            end
2921 181 mohor
            else
2922
            begin
2923
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
2924
              fail = fail + 1;
2925
            end
2926 169 mohor
          end
2927
        end
2928 181 mohor
      end
2929
    end
2930
    // set PHY to normal mode
2931
    #Tp eth_phy.preamble_suppresed(0);
2932
    // MII mode register
2933
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2934
    if(fail == 0)
2935
      test_ok;
2936
    else
2937
      fail = 0;
2938
  end
2939
 
2940
 
2941
  ////////////////////////////////////////////////////////////////////
2942
  ////                                                            ////
2943
  ////  Test scan status from phy with detecting link-fail bit    ////
2944
  ////  (with and without preamble)                               ////
2945
  ////                                                            ////
2946
  ////////////////////////////////////////////////////////////////////
2947
  if (test_num == 14) // 
2948
  begin
2949 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
2950
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
2951
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
2952 181 mohor
 
2953
    reset_mii; // reset MII
2954
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2955
    #Tp eth_phy.link_up_down(1);
2956
    // set MII speed
2957
    clk_div = 6;
2958
    mii_set_clk_div(clk_div[7:0]);
2959
    // set address
2960
    reg_addr = 5'h1; // status register
2961
    phy_addr = 5'h1; // correct PHY address
2962
 
2963
    // read request
2964
    #Tp mii_read_req(phy_addr, reg_addr);
2965
    check_mii_busy; // wait for read to finish
2966
    // read data from PHY status register - remember LINK-UP status
2967
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2968
 
2969
    for (i = 0; i <= 1; i = i + 1)
2970
    begin
2971
      #Tp eth_phy.preamble_suppresed(i);
2972
      // MII mode register
2973
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2974
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2975
      if (i)
2976
      begin
2977
        // change saved data when preamble is suppressed
2978
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
2979
      end
2980
 
2981
      // scan request
2982
      #Tp mii_scan_req(phy_addr, reg_addr);
2983
      check_mii_scan_valid; // wait for scan to make first data valid
2984
 
2985 169 mohor
      fork
2986 181 mohor
      begin
2987 169 mohor
        repeat(2) @(posedge Mdc_O);
2988
        // read data from PHY status register
2989
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2990 181 mohor
        if (phy_data !== tmp_data)
2991 169 mohor
        begin
2992 181 mohor
          test_fail("Data was not correctly scaned from status register");
2993 169 mohor
          fail = fail + 1;
2994
        end
2995
        // read data from MII status register
2996
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2997 181 mohor
        if (phy_data[0] !== 1'b0)
2998 169 mohor
        begin
2999 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
3000 169 mohor
          fail = fail + 1;
3001
        end
3002
      end
3003
      begin
3004 181 mohor
      // Completely check second scan
3005 169 mohor
        #Tp cnt = 0;
3006
        // wait for serial bus to become active - second scan
3007
        wait(Mdio_IO !== 1'bz);
3008
        // count transfer length
3009 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3010 169 mohor
        begin
3011
          @(posedge Mdc_O);
3012
          #Tp cnt = cnt + 1;
3013
        end
3014
        // check transfer length
3015 181 mohor
        if (i) // without preamble
3016 169 mohor
        begin
3017
          if (cnt != 33) // 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
        else // with preamble
3024
        begin
3025
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3026
          begin
3027 181 mohor
            test_fail("Second scan request did not proceed correctly");
3028 169 mohor
            fail = fail + 1;
3029
          end
3030
        end
3031
      end
3032
      join
3033 181 mohor
      // check third to fifth scans
3034
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3035
      begin
3036
        fork
3037 169 mohor
        begin
3038
          repeat(2) @(posedge Mdc_O);
3039
          // read data from PHY status register
3040
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3041 181 mohor
          if (phy_data !== tmp_data)
3042 169 mohor
          begin
3043 181 mohor
            test_fail("Data was not correctly scaned from status register");
3044
            fail = fail + 1;
3045 169 mohor
          end
3046
          // read data from MII status register
3047
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3048 181 mohor
          if (phy_data[0] !== 1'b0)
3049 169 mohor
          begin
3050 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3051
            fail = fail + 1;
3052 169 mohor
          end
3053 181 mohor
          if (i3 == 2) // after fourth scan read
3054 169 mohor
          begin
3055 181 mohor
            @(posedge Mdc_O);
3056
            // change saved data
3057
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3058
            // set link down
3059
            #Tp eth_phy.link_up_down(0);
3060 169 mohor
          end
3061
        end
3062
        begin
3063 181 mohor
        // Completely check scans
3064
          #Tp cnt = 0;
3065
          // wait for serial bus to become active - second scan
3066
          wait(Mdio_IO !== 1'bz);
3067
          // count transfer length
3068
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3069 169 mohor
          begin
3070 181 mohor
            @(posedge Mdc_O);
3071
            #Tp cnt = cnt + 1;
3072
          end
3073
          // check transfer length
3074
          if (i) // without preamble
3075
          begin
3076
            if (cnt != 33) // 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 181 mohor
          end
3082
          else // with preamble
3083
          begin
3084
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3085 169 mohor
            begin
3086 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3087
              fail = fail + 1;
3088 169 mohor
            end
3089
          end
3090
        end
3091 181 mohor
        join
3092
      end
3093
 
3094
      fork
3095
      begin
3096
        repeat(2) @(posedge Mdc_O);
3097
        // read data from PHY status register
3098
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3099
        if (phy_data !== tmp_data)
3100
        begin
3101
          test_fail("Data was not correctly scaned from status register");
3102
          fail = fail + 1;
3103
        end
3104
        // read data from MII status register
3105
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3106
        if (phy_data[0] === 1'b0)
3107
        begin
3108
          test_fail("Link FAIL bit was not set in the MII status register");
3109
          fail = fail + 1;
3110
        end
3111
        // wait to see if data stayed latched
3112
        repeat(4) @(posedge Mdc_O);
3113
        // read data from PHY status register
3114
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3115
        if (phy_data !== tmp_data)
3116
        begin
3117
          test_fail("Data was not latched correctly in status register");
3118
          fail = fail + 1;
3119
        end
3120
        // read data from MII status register
3121
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3122
        if (phy_data[0] === 1'b0)
3123
        begin
3124
          test_fail("Link FAIL bit was not set in the MII status register");
3125
          fail = fail + 1;
3126
        end
3127
        // change saved data
3128
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3129
        // set link up
3130
        #Tp eth_phy.link_up_down(1);
3131
      end
3132
      begin
3133
      // Wait for sixth scan
3134
        // wait for serial bus to become active - sixth scan
3135
        wait(Mdio_IO !== 1'bz);
3136
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3137
        wait(Mdio_IO === 1'bz);
3138
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3139
        wait(Mdio_IO !== 1'bz);
3140
        // wait for serial bus to become inactive - end of sixth scan
3141
        wait(Mdio_IO === 1'bz);
3142
      end
3143 169 mohor
      join
3144 181 mohor
 
3145
      @(posedge Mdc_O);
3146 169 mohor
      // read data from PHY status register
3147
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3148
      if (phy_data !== tmp_data)
3149
      begin
3150 181 mohor
        test_fail("Data was not correctly scaned from status register");
3151 169 mohor
        fail = fail + 1;
3152
      end
3153
      // read data from MII status register
3154
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3155
      if (phy_data[0] !== 1'b0)
3156
      begin
3157
        test_fail("Link FAIL bit was set in the MII status register");
3158
        fail = fail + 1;
3159
      end
3160 181 mohor
      // wait to see if data stayed latched
3161
      repeat(4) @(posedge Mdc_O);
3162
      // read data from PHY status register
3163
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3164
      if (phy_data !== tmp_data)
3165 169 mohor
      begin
3166 181 mohor
        test_fail("Data was not correctly scaned from status register");
3167
        fail = fail + 1;
3168 169 mohor
      end
3169 181 mohor
      // read data from MII status register
3170
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3171
      if (phy_data[0] !== 1'b0)
3172 169 mohor
      begin
3173 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3174
        fail = fail + 1;
3175 169 mohor
      end
3176 181 mohor
 
3177
      // STOP SCAN
3178
      #Tp mii_scan_finish; // finish scan operation
3179
      #Tp check_mii_busy; // wait for scan to finish
3180 169 mohor
    end
3181 181 mohor
    // set PHY to normal mode
3182
    #Tp eth_phy.preamble_suppresed(0);
3183
    // MII mode register
3184
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3185
    if(fail == 0)
3186
      test_ok;
3187
    else
3188
      fail = 0;
3189 169 mohor
  end
3190
 
3191
 
3192 181 mohor
  ////////////////////////////////////////////////////////////////////
3193
  ////                                                            ////
3194
  ////  Test scan status from phy with sliding link-fail bit      ////
3195
  ////  (with and without preamble)                               ////
3196
  ////                                                            ////
3197
  ////////////////////////////////////////////////////////////////////
3198
  if (test_num == 15) // 
3199 169 mohor
  begin
3200 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3201
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3202
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3203 181 mohor
 
3204
    // set address
3205
    reg_addr = 5'h1; // status register
3206
    phy_addr = 5'h1; // correct PHY address
3207
 
3208
    // read request
3209
    #Tp mii_read_req(phy_addr, reg_addr);
3210
    check_mii_busy; // wait for read to finish
3211
    // read data from PHY status register - remember LINK-UP status
3212
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3213
 
3214
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3215 169 mohor
    begin
3216 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3217
      // MII mode register
3218
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3219
                    wbm_subseq_waits);
3220
      if (i2)
3221 169 mohor
      begin
3222 181 mohor
        // change saved data when preamble is suppressed
3223
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3224
      end
3225
 
3226
      i = 0;
3227
      while (i < 80) // delay for sliding of LinkFail bit
3228
      begin
3229
        // first there are two scans
3230
        #Tp cnt = 0;
3231 169 mohor
        // scan request
3232
        #Tp mii_scan_req(phy_addr, reg_addr);
3233 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3234
 
3235
        // check second scan
3236 169 mohor
        fork
3237 181 mohor
        begin
3238
          repeat(4) @(posedge Mdc_O);
3239
          // read data from PHY status register
3240
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3241
          if (phy_data !== tmp_data)
3242 169 mohor
          begin
3243 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3244
            fail = fail + 1;
3245 169 mohor
          end
3246 181 mohor
          // read data from MII status register
3247
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3248
          if (phy_data[0] !== 1'b0)
3249
          begin
3250
            test_fail("Link FAIL bit was set in the MII status register");
3251
            fail = fail + 1;
3252
          end
3253
        end
3254
        begin
3255
        // Completely check scan
3256
          #Tp cnt = 0;
3257
          // wait for serial bus to become active - second scan
3258
          wait(Mdio_IO !== 1'bz);
3259
          // count transfer length
3260
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3261
          begin
3262
            @(posedge Mdc_O);
3263
            #Tp cnt = cnt + 1;
3264
          end
3265
          // check transfer length
3266
          if (i2) // without preamble
3267
          begin
3268
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3269 169 mohor
            begin
3270 181 mohor
              test_fail("Second scan request did not proceed correctly");
3271
              fail = fail + 1;
3272 169 mohor
            end
3273 181 mohor
          end
3274
          else // with preamble
3275
          begin
3276
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3277
            begin
3278
              test_fail("Second scan request did not proceed correctly");
3279
              fail = fail + 1;
3280
            end
3281
          end
3282
        end
3283
        join
3284
        // reset counter 
3285
        #Tp cnt = 0;
3286
        // SLIDING LINK DOWN and CHECK
3287
        fork
3288
          begin
3289
          // set link down
3290
            repeat(i) @(posedge Mdc_O);
3291
            // set link down
3292
            #Tp eth_phy.link_up_down(0);
3293
          end
3294
          begin
3295
          // check data in MII registers after each scan in this fork statement
3296 169 mohor
            if (i2) // without preamble
3297 181 mohor
              wait (cnt == 32);
3298
            else // with preamble
3299
              wait (cnt == 64);
3300
            repeat(3) @(posedge Mdc_O);
3301
            // read data from PHY status register
3302
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3303
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3304 169 mohor
            begin
3305 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
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
            else
3312 169 mohor
            begin
3313 181 mohor
              if (phy_data !== tmp_data)
3314 169 mohor
              begin
3315 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3316 169 mohor
                fail = fail + 1;
3317
              end
3318
            end
3319 181 mohor
            // read data from MII status register
3320
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3321
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3322 169 mohor
            begin
3323 181 mohor
              if (phy_data[0] === 1'b0)
3324
              begin
3325
                test_fail("Link FAIL bit was not set in the MII status register");
3326
                fail = fail + 1;
3327
              end
3328 169 mohor
            end
3329 181 mohor
            else
3330 169 mohor
            begin
3331 181 mohor
              if (phy_data[0] !== 1'b0)
3332 169 mohor
              begin
3333 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3334 169 mohor
                fail = fail + 1;
3335
              end
3336
            end
3337 181 mohor
          end
3338
          begin
3339
          // check length
3340
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3341 169 mohor
            begin
3342 181 mohor
              #Tp cnt = 0;
3343
              // wait for serial bus to become active if there is more than one scan
3344
              wait(Mdio_IO !== 1'bz);
3345
              // count transfer length
3346
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3347 169 mohor
              begin
3348 181 mohor
                @(posedge Mdc_O);
3349
                #Tp cnt = cnt + 1;
3350 169 mohor
              end
3351 181 mohor
              // check transfer length
3352
              if (i2) // without preamble
3353
              begin
3354
                if (cnt != 33) // 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
              else // with preamble
3361
              begin
3362
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3363
                begin
3364
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3365
                  fail = fail + 1;
3366
                end
3367
              end
3368 169 mohor
            end
3369
          end
3370
        join
3371 181 mohor
        // reset counter
3372
        #Tp cnt = 0;
3373
        // check fifth scan and data from fourth scan
3374
        fork
3375 169 mohor
        begin
3376 181 mohor
          repeat(2) @(posedge Mdc_O);
3377
          // read data from PHY status register
3378
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3379
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3380 169 mohor
          begin
3381 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3382
            fail = fail + 1;
3383 169 mohor
          end
3384 181 mohor
          // read data from MII status register
3385
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3386
          if (phy_data[0] === 1'b0)
3387 169 mohor
          begin
3388 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3389 169 mohor
            fail = fail + 1;
3390
          end
3391
        end
3392
        begin
3393 181 mohor
        // Completely check intermediate scan
3394
          #Tp cnt = 0;
3395
          // wait for serial bus to become active - second scan
3396 169 mohor
          wait(Mdio_IO !== 1'bz);
3397
          // count transfer length
3398
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3399
          begin
3400
            @(posedge Mdc_O);
3401
            #Tp cnt = cnt + 1;
3402
          end
3403 181 mohor
          // check transfer length
3404
          if (i2) // without preamble
3405 169 mohor
          begin
3406 181 mohor
            if (cnt != 33) // 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 169 mohor
          end
3412 181 mohor
          else // with preamble
3413
          begin
3414
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3415
            begin
3416
              test_fail("Fifth scan request did not proceed correctly");
3417
              fail = fail + 1;
3418
            end
3419
          end
3420 169 mohor
        end
3421 181 mohor
        join
3422
        // reset counter 
3423
        #Tp cnt = 0;
3424
        // SLIDING LINK UP and CHECK
3425
        fork
3426 169 mohor
          begin
3427 181 mohor
          // set link up
3428
            repeat(i) @(posedge Mdc_O);
3429
            // set link up
3430
            #Tp eth_phy.link_up_down(1);
3431 169 mohor
          end
3432 181 mohor
          begin
3433
          // check data in MII registers after each scan in this fork statement
3434
            repeat(2) @(posedge Mdc_O);
3435
            if (i2) // without preamble
3436
              wait (cnt == 32);
3437
            else // with preamble
3438
              wait (cnt == 64);
3439
            repeat(3) @(posedge Mdc_O);
3440
            // read data from PHY status register
3441
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3442
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3443
            begin
3444
              if (phy_data !== tmp_data)
3445
              begin
3446
                test_fail("6. data was not correctly scaned from status register");
3447
                fail = fail + 1;
3448
              end
3449
            end
3450
            else
3451
            begin
3452
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3453
              begin
3454
                test_fail("6. data was not correctly scaned from status register");
3455
                fail = fail + 1;
3456
              end
3457
            end
3458
            // read data from MII status register
3459
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3460
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3461
            begin
3462
              if (phy_data[0] !== 1'b0)
3463
              begin
3464
                test_fail("Link FAIL bit was set in the MII status register");
3465
                fail = fail + 1;
3466
              end
3467
            end
3468
            else
3469
            begin
3470
              if (phy_data[0] === 1'b0)
3471
              begin
3472
                test_fail("Link FAIL bit was not set in the MII status register");
3473
                fail = fail + 1;
3474
              end
3475
            end
3476
          end
3477
          begin
3478
          // check length
3479
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3480
            begin
3481
              #Tp cnt = 0;
3482
              // wait for serial bus to become active if there is more than one scan
3483
              wait(Mdio_IO !== 1'bz);
3484
              // count transfer length
3485
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3486
              begin
3487
                @(posedge Mdc_O);
3488
                #Tp cnt = cnt + 1;
3489
              end
3490
              // check transfer length
3491
              if (i2) // without preamble
3492
              begin
3493
                if (cnt != 33) // 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
              else // with preamble
3500
              begin
3501
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3502
                begin
3503
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3504
                  fail = fail + 1;
3505
                end
3506
              end
3507
            end
3508
          end
3509
        join
3510
        // check last scan 
3511
        repeat(4) @(posedge Mdc_O);
3512
        // read data from PHY status register
3513
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3514
        if (phy_data !== tmp_data)
3515
        begin
3516
          test_fail("7. data was not correctly scaned from status register");
3517
          fail = fail + 1;
3518 169 mohor
        end
3519 181 mohor
        // read data from MII status register
3520
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3521
        if (phy_data[0] !== 1'b0)
3522
        begin
3523
          test_fail("Link FAIL bit was set in the MII status register");
3524
          fail = fail + 1;
3525
        end
3526
 
3527
        #Tp mii_scan_finish; // finish scan operation
3528
        #Tp check_mii_busy; // wait for scan to finish
3529
        #Tp;
3530
        // set delay of writing the command
3531
        if (i2) // without preamble
3532
        begin
3533
          case(i)
3534
            0,  1,  2,  3,  4:  i = i + 1;
3535
            13, 14, 15, 16, 17,
3536
            18, 19, 20, 21, 22,
3537
            23, 24, 25, 26, 27,
3538
            28, 29, 30, 31, 32,
3539
            33, 34, 35:         i = i + 1;
3540
            36:                 i = 80;
3541
            default:            i = 13;
3542
          endcase
3543
        end
3544 169 mohor
        else // with preamble
3545
        begin
3546 181 mohor
          case(i)
3547
            0,  1,  2,  3,  4:  i = i + 1;
3548
            45, 46, 47, 48, 49,
3549
            50, 51, 52, 53, 54,
3550
            55, 56, 57, 58, 59,
3551
            60, 61, 62, 63, 64,
3552
            65, 66, 67:         i = i + 1;
3553
            68:                 i = 80;
3554
            default:            i = 45;
3555
          endcase
3556 169 mohor
        end
3557 181 mohor
        @(posedge wb_clk);
3558
        #Tp;
3559 169 mohor
      end
3560
    end
3561 181 mohor
    // set PHY to normal mode
3562
    #Tp eth_phy.preamble_suppresed(0);
3563
    // MII mode register
3564
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3565
    if(fail == 0)
3566
      test_ok;
3567
    else
3568
      fail = 0;
3569 169 mohor
  end
3570
 
3571
 
3572 181 mohor
  ////////////////////////////////////////////////////////////////////
3573
  ////                                                            ////
3574
  ////  Test sliding stop scan command immediately after scan     ////
3575
  ////  request (with and without preamble)                       ////
3576
  ////                                                            ////
3577
  ////////////////////////////////////////////////////////////////////
3578
  if (test_num == 16) // 
3579 116 mohor
  begin
3580 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3581
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3582 181 mohor
    `TIME;
3583 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3584 181 mohor
 
3585
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3586 169 mohor
    begin
3587 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3588
      // MII mode register
3589
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3590
                wbm_subseq_waits);
3591
      i = 0;
3592
      cnt = 0;
3593
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3594 169 mohor
      begin
3595 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3596 169 mohor
        begin
3597 181 mohor
          // set address
3598
          reg_addr = 5'h0; // control register
3599
          phy_addr = 5'h1; // correct PHY address
3600
          cnt = 0;
3601
          // scan request
3602
          #Tp mii_scan_req(phy_addr, reg_addr);
3603
          fork
3604
            begin
3605
              repeat(i) @(posedge Mdc_O);
3606
              // write command 0x0 into MII command register
3607
              // MII command written while scan in progress
3608
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3609
              @(posedge wb_clk);
3610
              #Tp check_mii_busy; // wait for scan to finish
3611
              @(posedge wb_clk);
3612
              disable check;
3613
            end
3614
            begin: check
3615
              // wait for serial bus to become active
3616
              wait(Mdio_IO !== 1'bz);
3617
              // count transfer length
3618
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3619
              begin
3620
                @(posedge Mdc_O);
3621
                #Tp cnt = cnt + 1;
3622
              end
3623
              // check transfer length
3624
              if (i2) // without preamble
3625
              begin
3626
                if (cnt != 33) // 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
              else // with preamble
3633
              begin
3634
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3635
                begin
3636
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3637
                  fail = fail + 1;
3638
                end
3639
              end
3640
              cnt = 0;
3641
              // wait for serial bus to become active if there is more than one scan
3642
              wait(Mdio_IO !== 1'bz);
3643
              // count transfer length
3644
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3645
              begin
3646
                @(posedge Mdc_O);
3647
                #Tp cnt = cnt + 1;
3648
              end
3649
              // check transfer length
3650
              if (i2) // without preamble
3651
              begin
3652
                if (cnt != 33) // 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
              else // with preamble
3659
              begin
3660
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3661
                begin
3662
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3663
                  fail = fail + 1;
3664
                end
3665
              end
3666
            end
3667
          join
3668
          // check the BUSY signal to see if the bus is still IDLE
3669
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3670
            check_mii_busy; // wait for bus to become idle
3671
 
3672
          // try normal write or read after scan was finished
3673
          phy_data = {8'h7D, (i[7:0] + 1)};
3674
          cnt = 0;
3675
          if (i3 == 0) // write after scan
3676 169 mohor
          begin
3677 181 mohor
            // write request
3678
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3679
            // wait for serial bus to become active
3680
            wait(Mdio_IO !== 1'bz);
3681
            // count transfer length
3682
            while(Mdio_IO !== 1'bz)
3683
            begin
3684
              @(posedge Mdc_O);
3685
              #Tp cnt = cnt + 1;
3686
            end
3687 169 mohor
            @(posedge Mdc_O);
3688 181 mohor
            // read request
3689
            #Tp mii_read_req(phy_addr, reg_addr);
3690
            check_mii_busy; // wait for read to finish
3691
            // read and check data
3692
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3693
            if (phy_data !== tmp_data)
3694 169 mohor
            begin
3695 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3696 169 mohor
              fail = fail + 1;
3697
            end
3698
          end
3699 181 mohor
          else // read after scan
3700 169 mohor
          begin
3701 181 mohor
            // read request
3702
            #Tp mii_read_req(phy_addr, reg_addr);
3703
            // wait for serial bus to become active
3704
            wait(Mdio_IO !== 1'bz);
3705
            // count transfer length
3706
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3707 169 mohor
            begin
3708 181 mohor
              @(posedge Mdc_O);
3709
              #Tp cnt = cnt + 1;
3710
            end
3711
            @(posedge Mdc_O);
3712
            check_mii_busy; // wait for read to finish
3713
            // read and check data
3714
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3715
            if (phy_data !== tmp_data)
3716
            begin
3717
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3718 169 mohor
              fail = fail + 1;
3719
            end
3720
          end
3721 181 mohor
          // check if transfer was a proper length
3722 169 mohor
          if (i2) // without preamble
3723
          begin
3724
            if (cnt != 33) // 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
          else // with preamble
3731
          begin
3732
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3733
            begin
3734 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3735 169 mohor
              fail = fail + 1;
3736
            end
3737
          end
3738
        end
3739 181 mohor
        #Tp;
3740
        // set delay of writing the command
3741
        if (i2) // without preamble
3742
        begin
3743
          case(i)
3744
            0, 1:               i = i + 1;
3745
            18, 19, 20, 21, 22,
3746
            23, 24, 25, 26, 27,
3747
            28, 29, 30, 31, 32,
3748
            33, 34, 35:         i = i + 1;
3749
            36:                 i = 80;
3750
            default:            i = 18;
3751
          endcase
3752
        end
3753
        else // with preamble
3754
        begin
3755
          case(i)
3756
            0, 1:               i = i + 1;
3757
            50, 51, 52, 53, 54,
3758
            55, 56, 57, 58, 59,
3759
            60, 61, 62, 63, 64,
3760
            65, 66, 67:         i = i + 1;
3761
            68:                 i = 80;
3762
            default:            i = 50;
3763
          endcase
3764
        end
3765
        @(posedge wb_clk);
3766
      end
3767
    end
3768
    // set PHY to normal mode
3769
    #Tp eth_phy.preamble_suppresed(0);
3770
    // MII mode register
3771
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3772
    if(fail == 0)
3773
      test_ok;
3774
    else
3775
      fail = 0;
3776
  end
3777 169 mohor
 
3778 181 mohor
 
3779
  ////////////////////////////////////////////////////////////////////
3780
  ////                                                            ////
3781
  ////  Test sliding stop scan command after 2. scan (with and    ////
3782
  ////  without preamble)                                         ////
3783
  ////                                                            ////
3784
  ////////////////////////////////////////////////////////////////////
3785
  if (test_num == 17) // 
3786
  begin
3787 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3788
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3789
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3790 181 mohor
 
3791
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3792
    begin
3793
      #Tp eth_phy.preamble_suppresed(i2);
3794
      // MII mode register
3795
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3796
                wbm_subseq_waits);
3797
 
3798
      i = 0;
3799
      cnt = 0;
3800
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3801
      begin
3802
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3803
        begin
3804
          // first there are two scans
3805
          // set address
3806
          reg_addr = 5'h0; // control register
3807
          phy_addr = 5'h1; // correct PHY address
3808
          cnt = 0;
3809
          // scan request
3810
          #Tp mii_scan_req(phy_addr, reg_addr);
3811
          // wait and check first 2 scans
3812 169 mohor
          begin
3813
            // wait for serial bus to become active
3814
            wait(Mdio_IO !== 1'bz);
3815
            // count transfer length
3816
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3817
            begin
3818
              @(posedge Mdc_O);
3819
              #Tp cnt = cnt + 1;
3820
            end
3821
            // check transfer length
3822
            if (i2) // without preamble
3823
            begin
3824
              if (cnt != 33) // 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
            else // with preamble
3831
            begin
3832
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3833
              begin
3834
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3835
                fail = fail + 1;
3836
              end
3837
            end
3838
            cnt = 0;
3839
            // wait for serial bus to become active if there is more than one scan
3840
            wait(Mdio_IO !== 1'bz);
3841
            // count transfer length
3842
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3843
            begin
3844
              @(posedge Mdc_O);
3845
              #Tp cnt = cnt + 1;
3846
            end
3847
            // check transfer length
3848
            if (i2) // without preamble
3849
            begin
3850
              if (cnt != 33) // 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
            else // with preamble
3857
            begin
3858
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3859
              begin
3860
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3861
                fail = fail + 1;
3862
              end
3863
            end
3864
          end
3865
 
3866 181 mohor
          // reset counter 
3867
          cnt = 0;
3868
          fork
3869
            begin
3870
              repeat(i) @(posedge Mdc_O);
3871
              // write command 0x0 into MII command register
3872
              // MII command written while scan in progress
3873
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3874
              @(posedge wb_clk);
3875
              #Tp check_mii_busy; // wait for scan to finish
3876
              @(posedge wb_clk);
3877
              disable check_3;
3878
            end
3879
            begin: check_3
3880
              // wait for serial bus to become active
3881
              wait(Mdio_IO !== 1'bz);
3882
              // count transfer length
3883
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3884
              begin
3885
                @(posedge Mdc_O);
3886
                #Tp cnt = cnt + 1;
3887
              end
3888
              // check transfer length
3889
              if (i2) // without preamble
3890
              begin
3891
                if (cnt != 33) // 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
              else // with preamble
3898
              begin
3899
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3900
                begin
3901
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3902
                  fail = fail + 1;
3903
                end
3904
              end
3905
              cnt = 0;
3906
              // wait for serial bus to become active if there is more than one scan
3907
              wait(Mdio_IO !== 1'bz);
3908
              // count transfer length
3909
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3910
              begin
3911
                @(posedge Mdc_O);
3912
                #Tp cnt = cnt + 1;
3913
              end
3914
              // check transfer length
3915
              if (i2) // without preamble
3916
              begin
3917
                if (cnt != 33) // 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
              else // with preamble
3924
              begin
3925
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3926
                begin
3927
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3928
                  fail = fail + 1;
3929
                end
3930
              end
3931
            end
3932
          join
3933
          // check the BUSY signal to see if the bus is still IDLE
3934
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3935
            check_mii_busy; // wait for bus to become idle
3936
 
3937
          // try normal write or read after scan was finished
3938
          phy_data = {8'h7D, (i[7:0] + 1)};
3939
          cnt = 0;
3940
          if (i3 == 0) // write after scan
3941 169 mohor
          begin
3942 181 mohor
            // write request
3943
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3944
            // wait for serial bus to become active
3945
            wait(Mdio_IO !== 1'bz);
3946
            // count transfer length
3947
            while(Mdio_IO !== 1'bz)
3948
            begin
3949
              @(posedge Mdc_O);
3950
              #Tp cnt = cnt + 1;
3951
            end
3952 169 mohor
            @(posedge Mdc_O);
3953 181 mohor
            // read request
3954
            #Tp mii_read_req(phy_addr, reg_addr);
3955
            check_mii_busy; // wait for read to finish
3956
            // read and check data
3957
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3958
            if (phy_data !== tmp_data)
3959
            begin
3960
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3961
              fail = fail + 1;
3962
            end
3963 169 mohor
          end
3964 181 mohor
          else // read after scan
3965 169 mohor
          begin
3966 181 mohor
            // read request
3967
            #Tp mii_read_req(phy_addr, reg_addr);
3968
            // wait for serial bus to become active
3969
            wait(Mdio_IO !== 1'bz);
3970
            // count transfer length
3971
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3972
            begin
3973
              @(posedge Mdc_O);
3974
              #Tp cnt = cnt + 1;
3975
            end
3976
            @(posedge Mdc_O);
3977
            check_mii_busy; // wait for read to finish
3978
            // read and check data
3979
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3980
            if (phy_data !== tmp_data)
3981
            begin
3982
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3983
              fail = fail + 1;
3984
            end
3985 169 mohor
          end
3986 181 mohor
          // check if transfer was a proper length
3987
          if (i2) // without preamble
3988 169 mohor
          begin
3989 181 mohor
            if (cnt != 33) // 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 181 mohor
          else // with preamble
3996 169 mohor
          begin
3997 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3998
            begin
3999
              test_fail("New request did not proceed correctly, after scan request");
4000
              fail = fail + 1;
4001
            end
4002 169 mohor
          end
4003
        end
4004 181 mohor
        #Tp;
4005
        // set delay of writing the command
4006 169 mohor
        if (i2) // without preamble
4007
        begin
4008 181 mohor
          case(i)
4009
            0, 1:               i = i + 1;
4010
            18, 19, 20, 21, 22,
4011
            23, 24, 25, 26, 27,
4012
            28, 29, 30, 31, 32,
4013
            33, 34, 35:         i = i + 1;
4014
            36:                 i = 80;
4015
            default:            i = 18;
4016
          endcase
4017 169 mohor
        end
4018
        else // with preamble
4019
        begin
4020 181 mohor
          case(i)
4021
            0, 1:               i = i + 1;
4022
            50, 51, 52, 53, 54,
4023
            55, 56, 57, 58, 59,
4024
            60, 61, 62, 63, 64,
4025
            65, 66, 67:         i = i + 1;
4026
            68:                 i = 80;
4027
            default:            i = 50;
4028
          endcase
4029 169 mohor
        end
4030 181 mohor
        @(posedge wb_clk);
4031 116 mohor
      end
4032
    end
4033 181 mohor
    // set PHY to normal mode
4034
    #Tp eth_phy.preamble_suppresed(0);
4035
    // MII mode register
4036
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4037
    if(fail == 0)
4038
      test_ok;
4039
    else
4040
      fail = 0;
4041 169 mohor
  end
4042 116 mohor
 
4043 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4044
 
4045 169 mohor
end
4046
endtask // test_mii
4047
 
4048
 
4049
task test_mac_full_duplex_transmit;
4050
  input  [31:0]  start_task;
4051
  input  [31:0]  end_task;
4052
  integer        bit_start_1;
4053
  integer        bit_end_1;
4054
  integer        bit_start_2;
4055
  integer        bit_end_2;
4056
  integer        num_of_reg;
4057 209 tadejm
  integer        num_of_frames;
4058
  integer        num_of_bd;
4059 169 mohor
  integer        i_addr;
4060
  integer        i_data;
4061
  integer        i_length;
4062 209 tadejm
  integer        tmp_len;
4063
  integer        tmp_bd;
4064
  integer        tmp_bd_num;
4065 169 mohor
  integer        tmp_data;
4066 209 tadejm
  integer        tmp_ipgt;
4067 194 tadej
  integer        test_num;
4068 169 mohor
  reg    [31:0]  tx_bd_num;
4069
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4070
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4071
  integer        i;
4072
  integer        i1;
4073
  integer        i2;
4074
  integer        i3;
4075
  integer        fail;
4076
  integer        speed;
4077 209 tadejm
  reg            frame_started;
4078
  reg            frame_ended;
4079
  reg            wait_for_frame;
4080 169 mohor
  reg    [31:0]  addr;
4081
  reg    [31:0]  data;
4082
  reg    [31:0]  tmp;
4083
  reg    [ 7:0]  st_data;
4084
  reg    [15:0]  max_tmp;
4085
  reg    [15:0]  min_tmp;
4086
begin
4087
// MAC FULL DUPLEX TRANSMIT TEST
4088
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4089
$display(" ");
4090
$display("MAC FULL DUPLEX TRANSMIT TEST");
4091
fail = 0;
4092
 
4093
// reset MAC registers
4094
hard_reset;
4095
// reset MAC and MII LOGIC with soft reset
4096
reset_mac;
4097
reset_mii;
4098
// set wb slave response
4099
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4100
 
4101
  /*
4102
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4103
  -------------------------------------------------------------------------------------
4104
  set_tx_bd
4105
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4106
  set_tx_bd_wrap
4107
    (tx_bd_num_end[6:0]);
4108
  set_tx_bd_ready
4109
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4110
  check_tx_bd
4111
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4112
  clear_tx_bd
4113
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4114
 
4115
  TASKS for set and control RX buffer descriptors:
4116
  ------------------------------------------------
4117
  set_rx_bd
4118
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4119
  set_rx_bd_wrap
4120
    (rx_bd_num_end[6:0]);
4121
  set_rx_bd_empty
4122
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4123
  check_rx_bd
4124
    (rx_bd_num_end[6:0], rx_bd_status);
4125
  clear_rx_bd
4126
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4127
 
4128
  TASKS for set and check TX packets:
4129
  -----------------------------------
4130
  set_tx_packet
4131
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4132
  check_tx_packet
4133
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4134
 
4135
  TASKS for set and check RX packets:
4136
  -----------------------------------
4137
  set_rx_packet
4138
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4139
  check_rx_packet
4140
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4141
 
4142
  TASKS for append and check CRC to/of TX packet:
4143
  -----------------------------------------------
4144
  append_tx_crc
4145
    (txpnt_wb[31:0], len[15:0], negated_crc);
4146
  check_tx_crc
4147
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4148
 
4149
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4150
  --------------------------------------------------------------------------------
4151
  append_rx_crc
4152
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4153
  */
4154
 
4155 194 tadej
//////////////////////////////////////////////////////////////////////
4156
////                                                              ////
4157
////  test_mac_full_duplex_transmit:                              ////
4158
////                                                              ////
4159
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4160
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4161
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4162
////     one TX buffer decriptor ( 10Mbps ).                      ////
4163
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4164
////     one TX buffer decriptor ( 100Mbps ).                     ////
4165
////                                                              ////
4166
//////////////////////////////////////////////////////////////////////
4167
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4168 169 mohor
begin
4169
 
4170 194 tadej
  ////////////////////////////////////////////////////////////////////
4171
  ////                                                            ////
4172
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4173
  ////                                                            ////
4174
  ////////////////////////////////////////////////////////////////////
4175
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4176 169 mohor
  begin
4177 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4178
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4179
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4180
 
4181
    // unmask interrupts
4182 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4183 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4184
    // set all buffer descriptors to RX - must be set before TX enable
4185
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4186
    // enable TX, set full-duplex mode, padding and CRC appending
4187
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4188
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4189
 
4190
    // write to phy's control register for 10Mbps
4191
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4192
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4193
    speed = 10;
4194
 
4195
    i = 0;
4196
    while (i < 128)
4197 169 mohor
    begin
4198 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4199 169 mohor
      begin
4200 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4201
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4202 169 mohor
      end
4203 194 tadej
      set_tx_bd_wrap(i);
4204
      fork
4205
        begin
4206
          set_tx_bd_ready(0, i);
4207
          repeat(20) @(negedge mtx_clk);
4208
          #1 disable check_tx_en10;
4209
        end
4210
        begin: check_tx_en10
4211
          wait (MTxEn === 1'b1);
4212
          test_fail("Tramsmit should not start at all");
4213
          fail = fail + 1;
4214
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4215
        end
4216
      join
4217
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4218 169 mohor
      begin
4219 194 tadej
        check_tx_bd(0, tmp);
4220
        #1;
4221
        if (tmp[15] === 1'b0)
4222
        begin
4223
          test_fail("Tramsmit should not start at all");
4224
          fail = fail + 1;
4225
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4226
        end
4227
        if (tmp[8:0] !== 0)
4228
        begin
4229
          test_fail("Tramsmit should not be finished since it should not start at all");
4230
          fail = fail + 1;
4231
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4232
        end
4233
        @(posedge wb_clk);
4234 169 mohor
      end
4235 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4236
      if (tmp[6:0] !== 0)
4237 169 mohor
      begin
4238 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4239 169 mohor
        fail = fail + 1;
4240 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4241 169 mohor
      end
4242 194 tadej
      clear_tx_bd(0, i);
4243
      if ((i < 5) || (i > 124))
4244
        i = i + 1;
4245
      else
4246
        i = i + 120;
4247 116 mohor
    end
4248 194 tadej
    // disable TX
4249
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4250
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4251
    if(fail == 0)
4252
      test_ok;
4253 116 mohor
    else
4254 194 tadej
      fail = 0;
4255 169 mohor
  end
4256 116 mohor
 
4257
 
4258 194 tadej
  ////////////////////////////////////////////////////////////////////
4259
  ////                                                            ////
4260
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4261
  ////                                                            ////
4262
  ////////////////////////////////////////////////////////////////////
4263
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4264 169 mohor
  begin
4265 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4266
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4267
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4268
 
4269
    // unmask interrupts
4270 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4271 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4272
    // set all buffer descriptors to RX - must be set before TX enable
4273
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4274
    // enable TX, set full-duplex mode, padding and CRC appending
4275
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4276
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4277
 
4278
    // write to phy's control register for 100Mbps
4279
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4280
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4281
    speed = 100;
4282
 
4283
    i = 0;
4284
    while (i < 128)
4285 169 mohor
    begin
4286 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4287 169 mohor
      begin
4288 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4289
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4290 169 mohor
      end
4291 194 tadej
      set_tx_bd_wrap(i);
4292
      fork
4293
        begin
4294
          set_tx_bd_ready(0, i);
4295
          repeat(20) @(negedge mtx_clk);
4296
          #1 disable check_tx_en100;
4297
        end
4298
        begin: check_tx_en100
4299
          wait (MTxEn === 1'b1);
4300
          test_fail("Tramsmit should not start at all");
4301
          fail = fail + 1;
4302
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4303
        end
4304
      join
4305
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4306 169 mohor
      begin
4307 194 tadej
        check_tx_bd(0, tmp);
4308
        #1;
4309
        if (tmp[15] === 1'b0)
4310
        begin
4311
          test_fail("Tramsmit should not start at all");
4312
          fail = fail + 1;
4313
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4314
        end
4315
        if (tmp[8:0] !== 0)
4316
        begin
4317
          test_fail("Tramsmit should not be finished since it should not start at all");
4318
          fail = fail + 1;
4319
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4320
        end
4321
        @(posedge wb_clk);
4322 169 mohor
      end
4323 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4324
      if (tmp[6:0] !== 0)
4325 169 mohor
      begin
4326 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4327 169 mohor
        fail = fail + 1;
4328 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4329 169 mohor
      end
4330 194 tadej
      clear_tx_bd(0, i);
4331
      if ((i < 5) || (i > 124))
4332
        i = i + 1;
4333
      else
4334
        i = i + 120;
4335 169 mohor
    end
4336 194 tadej
    // disable TX
4337
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4338
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4339
    if(fail == 0)
4340
      test_ok;
4341 169 mohor
    else
4342 194 tadej
      fail = 0;
4343 169 mohor
  end
4344
 
4345
 
4346 194 tadej
  ////////////////////////////////////////////////////////////////////
4347
  ////                                                            ////
4348
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4349
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4350
  ////                                                            ////
4351
  ////////////////////////////////////////////////////////////////////
4352 209 tadejm
  if (test_num == 2) // without and with padding
4353 169 mohor
  begin
4354 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4355
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4356
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4357
 
4358
    max_tmp = 0;
4359
    min_tmp = 0;
4360
    // set one TX buffer descriptor - must be set before TX enable
4361
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4362 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4363
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4364 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4365
    // prepare two packets of MAXFL length
4366
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4367
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4368
    min_tmp = tmp[31:16];
4369 209 tadejm
    st_data = 8'h01;
4370
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4371 194 tadej
    st_data = 8'h10;
4372 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4373 194 tadej
    // check WB INT signal
4374
    if (wb_int !== 1'b0)
4375 169 mohor
    begin
4376 194 tadej
      test_fail("WB INT signal should not be set");
4377
      fail = fail + 1;
4378 169 mohor
    end
4379 194 tadej
 
4380
    // write to phy's control register for 10Mbps
4381
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4382
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4383
    speed = 10;
4384
 
4385
    i_length = (min_tmp - 4);
4386
    while (i_length <= (max_tmp - 4))
4387 169 mohor
    begin
4388 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4389
      case (i_length[1:0])
4390
      2'h0: // Interrupt is generated
4391 169 mohor
      begin
4392 194 tadej
        // enable interrupt generation
4393 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4394 194 tadej
        // unmask interrupts
4395 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4396 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4397
        // not detect carrier sense in FD and no collision
4398
        eth_phy.carrier_sense_tx_fd_detect(0);
4399
        eth_phy.collision(0);
4400 169 mohor
      end
4401 194 tadej
      2'h1: // Interrupt is not generated
4402 169 mohor
      begin
4403 194 tadej
        // enable interrupt generation
4404 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4405 194 tadej
        // mask interrupts
4406
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4407
        // detect carrier sense in FD and no collision
4408
        eth_phy.carrier_sense_tx_fd_detect(1);
4409
        eth_phy.collision(0);
4410 169 mohor
      end
4411 194 tadej
      2'h2: // Interrupt is not generated
4412
      begin
4413
        // disable interrupt generation
4414 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4415 194 tadej
        // unmask interrupts
4416 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4417 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4418
        // not detect carrier sense in FD and set collision
4419
        eth_phy.carrier_sense_tx_fd_detect(0);
4420
        eth_phy.collision(1);
4421
      end
4422
      default: // 2'h3: // Interrupt is not generated
4423
      begin
4424
        // disable interrupt generation
4425 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4426 194 tadej
        // mask interrupts
4427
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4428
        // detect carrier sense in FD and set collision
4429
        eth_phy.carrier_sense_tx_fd_detect(1);
4430
        eth_phy.collision(1);
4431
      end
4432
      endcase
4433
      eth_phy.set_tx_mem_addr(max_tmp);
4434
      // set wrap bit
4435
      set_tx_bd_wrap(0);
4436
      set_tx_bd_ready(0, 0);
4437 169 mohor
      #1 check_tx_bd(0, data);
4438 194 tadej
      if (i_length < min_tmp) // just first four
4439 169 mohor
      begin
4440 194 tadej
        while (data[15] === 1)
4441
        begin
4442
          #1 check_tx_bd(0, data);
4443
          @(posedge wb_clk);
4444
        end
4445 209 tadejm
        repeat (1) @(posedge wb_clk);
4446 169 mohor
      end
4447 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4448 192 tadej
      begin
4449 194 tadej
        tmp = 0;
4450
        wait (MTxEn === 1'b1); // start transmit
4451
        while (tmp < (i_length - 20))
4452
        begin
4453
          #1 tmp = tmp + 1;
4454
          @(posedge wb_clk);
4455
        end
4456
        #1 check_tx_bd(0, data);
4457
        while (data[15] === 1)
4458
        begin
4459
          #1 check_tx_bd(0, data);
4460
          @(posedge wb_clk);
4461
        end
4462 209 tadejm
        repeat (1) @(posedge wb_clk);
4463 192 tadej
      end
4464
      else
4465
      begin
4466 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4467
        #1 check_tx_bd(0, data);
4468
        if (data[15] !== 1)
4469
        begin
4470
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4471
          fail = fail + 1;
4472
        end
4473
        wait (MTxEn === 1'b0); // end transmit
4474
        while (data[15] === 1)
4475
        begin
4476
          #1 check_tx_bd(0, data);
4477
          @(posedge wb_clk);
4478
        end
4479
        repeat (1) @(posedge wb_clk);
4480 192 tadej
      end
4481 194 tadej
      // check length of a PACKET
4482
      if (eth_phy.tx_len != (i_length + 4))
4483 192 tadej
      begin
4484 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4485 192 tadej
        fail = fail + 1;
4486
      end
4487 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4488
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4489 192 tadej
      begin
4490 194 tadej
        // check transmitted TX packet data
4491
        if (i_length[0] == 0)
4492
        begin
4493 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4494 194 tadej
        end
4495
        else
4496
        begin
4497 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4498 194 tadej
        end
4499
        if (tmp > 0)
4500
        begin
4501
          test_fail("Wrong data of the transmitted packet");
4502
          fail = fail + 1;
4503
        end
4504
        // check transmited TX packet CRC
4505
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4506
        if (tmp > 0)
4507
        begin
4508
          test_fail("Wrong CRC of the transmitted packet");
4509
          fail = fail + 1;
4510
        end
4511 192 tadej
      end
4512 194 tadej
      // check WB INT signal
4513
      if (i_length[1:0] == 2'h0)
4514 192 tadej
      begin
4515 194 tadej
        if (wb_int !== 1'b1)
4516
        begin
4517
          `TIME; $display("*E WB INT signal should be set");
4518
          test_fail("WB INT signal should be set");
4519
          fail = fail + 1;
4520
        end
4521 192 tadej
      end
4522 194 tadej
      else
4523 192 tadej
      begin
4524 194 tadej
        if (wb_int !== 1'b0)
4525
        begin
4526
          `TIME; $display("*E WB INT signal should not be set");
4527
          test_fail("WB INT signal should not be set");
4528
          fail = fail + 1;
4529
        end
4530 192 tadej
      end
4531 194 tadej
      // check TX buffer descriptor of a packet
4532
      check_tx_bd(0, data);
4533
      if (i_length[1] == 1'b0) // interrupt enabled
4534 192 tadej
      begin
4535 194 tadej
        if (data[15:0] !== 16'h7800)
4536
        begin
4537
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4538
          test_fail("TX buffer descriptor status is not correct");
4539
          fail = fail + 1;
4540
        end
4541 192 tadej
      end
4542 194 tadej
      else // interrupt not enabled
4543 192 tadej
      begin
4544 194 tadej
        if (data[15:0] !== 16'h3800)
4545
        begin
4546
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4547
          test_fail("TX buffer descriptor status is not correct");
4548
          fail = fail + 1;
4549
        end
4550 192 tadej
      end
4551 194 tadej
      // clear TX buffer descriptor
4552
      clear_tx_bd(0, 0);
4553
      // check interrupts
4554
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4555
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4556 192 tadej
      begin
4557 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4558
        begin
4559
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4560
          test_fail("Interrupt Transmit Buffer was not set");
4561
          fail = fail + 1;
4562
        end
4563
        if ((data & (~`ETH_INT_TXB)) !== 0)
4564
        begin
4565
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4566
          test_fail("Other interrupts (except Transmit Buffer) were set");
4567
          fail = fail + 1;
4568
        end
4569 192 tadej
      end
4570 194 tadej
      else
4571 192 tadej
      begin
4572 194 tadej
        if (data !== 0)
4573
        begin
4574
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4575
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4576
          fail = fail + 1;
4577
        end
4578 192 tadej
      end
4579 194 tadej
      // clear interrupts
4580
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4581
      // check WB INT signal
4582
      if (wb_int !== 1'b0)
4583 192 tadej
      begin
4584 194 tadej
        test_fail("WB INT signal should not be set");
4585 192 tadej
        fail = fail + 1;
4586
      end
4587 194 tadej
      // INTERMEDIATE DISPLAYS
4588
      if ((i_length + 4) == (min_tmp + 64))
4589 209 tadejm
      begin
4590 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4591 209 tadejm
        $display("    pads appending to packets is NOT selected");
4592
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4593 194 tadej
                 min_tmp, (min_tmp + 64));
4594 209 tadejm
        // set padding, remain the rest
4595
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4596
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4597
      end
4598 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4599 209 tadejm
      begin
4600 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4601 209 tadejm
        $display("    pads appending to packets is selected");
4602
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4603 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4604 209 tadejm
        // reset padding, remain the rest
4605
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4606
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4607
      end
4608 194 tadej
      else if ((i_length + 4) == max_tmp)
4609 209 tadejm
      begin
4610
        $display("    pads appending to packets is NOT selected");
4611
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4612 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4613 209 tadejm
      end
4614 194 tadej
      // set length (loop variable)
4615
      if ((i_length + 4) < (min_tmp + 64))
4616
        i_length = i_length + 1;
4617
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4618
      begin
4619
        i_length = i_length + 128;
4620
        tmp_data = i_length + 4; // last tmp_data is ending length
4621
      end
4622
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4623
        i_length = max_tmp - (4 + 16);
4624
      else if ((i_length + 4) >= (max_tmp - 16))
4625
        i_length = i_length + 1;
4626
      else
4627
      begin
4628
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4629
        #10 $stop;
4630
      end
4631 192 tadej
    end
4632 194 tadej
    // disable TX
4633
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4634
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4635
    if(fail == 0)
4636
      test_ok;
4637
    else
4638
      fail = 0;
4639
  end
4640
 
4641
 
4642
  ////////////////////////////////////////////////////////////////////
4643
  ////                                                            ////
4644
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4645
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4646
  ////                                                            ////
4647
  ////////////////////////////////////////////////////////////////////
4648 209 tadejm
  if (test_num == 3) // with and without padding
4649 194 tadej
  begin
4650
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4651
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4652
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4653
 
4654
    max_tmp = 0;
4655
    min_tmp = 0;
4656
    // set one TX buffer descriptor - must be set before TX enable
4657
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4658 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4659
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4660 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4661
    // prepare two packets of MAXFL length
4662
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4663
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4664
    min_tmp = tmp[31:16];
4665
    st_data = 8'h5A;
4666 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4667 194 tadej
    st_data = 8'h10;
4668 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4669 169 mohor
    // check WB INT signal
4670 192 tadej
    if (wb_int !== 1'b0)
4671 169 mohor
    begin
4672
      test_fail("WB INT signal should not be set");
4673
      fail = fail + 1;
4674
    end
4675 194 tadej
 
4676
    // write to phy's control register for 100Mbps
4677
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4678
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4679
    speed = 100;
4680 192 tadej
 
4681 194 tadej
    i_length = (min_tmp - 4);
4682
    while (i_length <= (max_tmp - 4))
4683 192 tadej
    begin
4684 194 tadej
      // choose generating carrier sense and collision
4685
      case (i_length[1:0])
4686
      2'h0: // Interrupt is generated
4687 192 tadej
      begin
4688 194 tadej
        // enable interrupt generation
4689 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4690 194 tadej
        // unmask interrupts
4691 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4692 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4693
        // not detect carrier sense in FD and no collision
4694
        eth_phy.carrier_sense_tx_fd_detect(0);
4695
        eth_phy.collision(0);
4696 192 tadej
      end
4697 194 tadej
      2'h1: // Interrupt is not generated
4698 192 tadej
      begin
4699 194 tadej
        // enable interrupt generation
4700 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4701 194 tadej
        // mask interrupts
4702
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4703
        // detect carrier sense in FD and no collision
4704
        eth_phy.carrier_sense_tx_fd_detect(1);
4705
        eth_phy.collision(0);
4706 192 tadej
      end
4707 194 tadej
      2'h2: // Interrupt is not generated
4708
      begin
4709
        // disable interrupt generation
4710 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4711 194 tadej
        // unmask interrupts
4712 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4713 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4714
        // not detect carrier sense in FD and set collision
4715
        eth_phy.carrier_sense_tx_fd_detect(0);
4716
        eth_phy.collision(1);
4717
      end
4718
      default: // 2'h3: // Interrupt is not generated
4719
      begin
4720
        // disable interrupt generation
4721 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4722 194 tadej
        // mask interrupts
4723
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4724
        // detect carrier sense in FD and set collision
4725
        eth_phy.carrier_sense_tx_fd_detect(1);
4726
        eth_phy.collision(1);
4727
      end
4728
      endcase
4729
      eth_phy.set_tx_mem_addr(max_tmp);
4730
      // set wrap bit
4731
      set_tx_bd_wrap(0);
4732
      set_tx_bd_ready(0, 0);
4733 192 tadej
      #1 check_tx_bd(0, data);
4734 194 tadej
      if (i_length < min_tmp) // just first four
4735 192 tadej
      begin
4736 194 tadej
        while (data[15] === 1)
4737
        begin
4738
          #1 check_tx_bd(0, data);
4739
          @(posedge wb_clk);
4740
        end
4741 209 tadejm
        repeat (1) @(posedge wb_clk);
4742 194 tadej
      end
4743
      else if (i_length > (max_tmp - 8)) // just last four
4744
      begin
4745
        tmp = 0;
4746
        wait (MTxEn === 1'b1); // start transmit
4747
        while (tmp < (i_length - 20))
4748
        begin
4749
          #1 tmp = tmp + 1;
4750
          @(posedge wb_clk);
4751
        end
4752 192 tadej
        #1 check_tx_bd(0, data);
4753 194 tadej
        while (data[15] === 1)
4754
        begin
4755
          #1 check_tx_bd(0, data);
4756
          @(posedge wb_clk);
4757
        end
4758 209 tadejm
        repeat (1) @(posedge wb_clk);
4759 192 tadej
      end
4760 194 tadej
      else
4761
      begin
4762
        wait (MTxEn === 1'b1); // start transmit
4763
        #1 check_tx_bd(0, data);
4764
        if (data[15] !== 1)
4765
        begin
4766
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4767
          fail = fail + 1;
4768
        end
4769
        wait (MTxEn === 1'b0); // end transmit
4770
        while (data[15] === 1)
4771
        begin
4772
          #1 check_tx_bd(0, data);
4773
          @(posedge wb_clk);
4774
        end
4775
        repeat (1) @(posedge wb_clk);
4776
      end
4777
      // check length of a PACKET
4778
      if (eth_phy.tx_len != (i_length + 4))
4779
      begin
4780
        test_fail("Wrong length of the packet out from MAC");
4781
        fail = fail + 1;
4782
      end
4783 192 tadej
      // check transmitted TX packet data
4784
      if (i_length[0] == 0)
4785
      begin
4786 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4787 192 tadej
      end
4788
      else
4789
      begin
4790 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4791 192 tadej
      end
4792
      if (tmp > 0)
4793
      begin
4794
        test_fail("Wrong data of the transmitted packet");
4795
        fail = fail + 1;
4796
      end
4797
      // check transmited TX packet CRC
4798
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4799
      if (tmp > 0)
4800
      begin
4801
        test_fail("Wrong CRC of the transmitted packet");
4802
        fail = fail + 1;
4803
      end
4804 194 tadej
      // check WB INT signal
4805
      if (i_length[1:0] == 2'h0)
4806 192 tadej
      begin
4807 194 tadej
        if (wb_int !== 1'b1)
4808
        begin
4809
          `TIME; $display("*E WB INT signal should be set");
4810
          test_fail("WB INT signal should be set");
4811
          fail = fail + 1;
4812
        end
4813 192 tadej
      end
4814 194 tadej
      else
4815 192 tadej
      begin
4816 194 tadej
        if (wb_int !== 1'b0)
4817
        begin
4818
          `TIME; $display("*E WB INT signal should not be set");
4819
          test_fail("WB INT signal should not be set");
4820
          fail = fail + 1;
4821
        end
4822 192 tadej
      end
4823 194 tadej
      // check TX buffer descriptor of a packet
4824
      check_tx_bd(0, data);
4825
      if (i_length[1] == 1'b0) // interrupt enabled
4826 192 tadej
      begin
4827 194 tadej
        if (data[15:0] !== 16'h7800)
4828
        begin
4829
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4830
          test_fail("TX buffer descriptor status is not correct");
4831
          fail = fail + 1;
4832
        end
4833 192 tadej
      end
4834 194 tadej
      else // interrupt not enabled
4835 192 tadej
      begin
4836 194 tadej
        if (data[15:0] !== 16'h3800)
4837
        begin
4838
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4839
          test_fail("TX buffer descriptor status is not correct");
4840
          fail = fail + 1;
4841
        end
4842 192 tadej
      end
4843 194 tadej
      // clear TX buffer descriptor
4844
      clear_tx_bd(0, 0);
4845
      // check interrupts
4846
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4847
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4848 192 tadej
      begin
4849 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4850
        begin
4851
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4852
          test_fail("Interrupt Transmit Buffer was not set");
4853
          fail = fail + 1;
4854
        end
4855
        if ((data & (~`ETH_INT_TXB)) !== 0)
4856
        begin
4857
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4858
          test_fail("Other interrupts (except Transmit Buffer) were set");
4859
          fail = fail + 1;
4860
        end
4861 192 tadej
      end
4862 194 tadej
      else
4863 192 tadej
      begin
4864 194 tadej
        if (data !== 0)
4865
        begin
4866
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
4867
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4868
          fail = fail + 1;
4869
        end
4870 192 tadej
      end
4871 194 tadej
      // clear interrupts
4872
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4873
      // check WB INT signal
4874
      if (wb_int !== 1'b0)
4875 192 tadej
      begin
4876 194 tadej
        test_fail("WB INT signal should not be set");
4877 192 tadej
        fail = fail + 1;
4878
      end
4879 194 tadej
      // INTERMEDIATE DISPLAYS
4880
      if ((i_length + 4) == (min_tmp + 64))
4881 209 tadejm
      begin
4882 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4883 209 tadejm
        $display("    pads appending to packets is NOT selected");
4884
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4885 194 tadej
                 min_tmp, (min_tmp + 64));
4886 209 tadejm
        // set padding, remain the rest
4887
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4888
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4889
      end
4890 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4891 209 tadejm
      begin
4892 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4893 209 tadejm
        $display("    pads appending to packets is selected");
4894
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4895 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4896 209 tadejm
        // reset padding, remain the rest
4897
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4898
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4899
      end
4900 194 tadej
      else if ((i_length + 4) == max_tmp)
4901 209 tadejm
      begin
4902
        $display("    pads appending to packets is NOT selected");
4903
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4904 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4905 209 tadejm
      end
4906 194 tadej
      // set length (loop variable)
4907
      if ((i_length + 4) < (min_tmp + 64))
4908
        i_length = i_length + 1;
4909
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4910
      begin
4911
        i_length = i_length + 128;
4912
        tmp_data = i_length + 4; // last tmp_data is ending length
4913
      end
4914
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4915
        i_length = max_tmp - (4 + 16);
4916
      else if ((i_length + 4) >= (max_tmp - 16))
4917
        i_length = i_length + 1;
4918 192 tadej
      else
4919 194 tadej
      begin
4920
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4921
        #10 $stop;
4922
      end
4923 179 mohor
    end
4924 194 tadej
    // disable TX
4925
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4926
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4927
    if(fail == 0)
4928
      test_ok;
4929
    else
4930
      fail = 0;
4931 169 mohor
  end
4932
 
4933
 
4934 209 tadejm
  ////////////////////////////////////////////////////////////////////
4935
  ////                                                            ////
4936
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4937
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
4938
  ////                                                            ////
4939
  ////////////////////////////////////////////////////////////////////
4940
  if (test_num == 4) // without and with padding
4941
  begin
4942
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
4943
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
4944
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
4945
 
4946
    // reset MAC registers
4947
    hard_reset;
4948
    // reset MAC and MII LOGIC with soft reset
4949
    reset_mac;
4950
    reset_mii;
4951
    // set wb slave response
4952
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4953 192 tadej
 
4954 209 tadejm
    max_tmp = 0;
4955
    min_tmp = 0;
4956
    num_of_frames = 0;
4957
    num_of_bd = 0;
4958
    // set maximum TX buffer descriptors (128) - must be set before TX enable
4959
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4960
    // enable TX, set full-duplex mode, NO padding and CRC appending
4961
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4962
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4963
    // prepare two packets of MAXFL length
4964
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4965
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4966
    min_tmp = tmp[31:16];
4967
    st_data = 8'hA3;
4968
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4969
    st_data = 8'h81;
4970
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4971
    // check WB INT signal
4972
    if (wb_int !== 1'b0)
4973
    begin
4974
      test_fail("WB INT signal should not be set");
4975
      fail = fail + 1;
4976
    end
4977
 
4978
    // write to phy's control register for 10Mbps
4979
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4980
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4981
    speed = 10;
4982
 
4983
    i_length = (min_tmp - 4);
4984
    while (i_length <= (max_tmp - 4))
4985
    begin
4986
      // choose generating carrier sense and collision
4987
      case (i_length[1:0])
4988
      2'h0: // Interrupt is generated
4989
      begin
4990
        // Reset_tx_bd nable interrupt generation
4991
        // unmask interrupts
4992
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4993
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4994
        // not detect carrier sense in FD and no collision
4995
        eth_phy.carrier_sense_tx_fd_detect(0);
4996
        eth_phy.collision(0);
4997
      end
4998
      2'h1: // Interrupt is not generated
4999
      begin
5000
        // set_tx_bd enable interrupt generation
5001
        // mask interrupts
5002
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5003
        // detect carrier sense in FD and no collision
5004
        eth_phy.carrier_sense_tx_fd_detect(1);
5005
        eth_phy.collision(0);
5006
      end
5007
      2'h2: // Interrupt is not generated
5008
      begin
5009
        // set_tx_bd disable the interrupt generation
5010
        // unmask interrupts
5011
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5012
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5013
        // not detect carrier sense in FD and set collision
5014
        eth_phy.carrier_sense_tx_fd_detect(0);
5015
        eth_phy.collision(1);
5016
      end
5017
      default: // 2'h3: // Interrupt is not generated
5018
      begin
5019
        // set_tx_bd disable the interrupt generation
5020
        // mask interrupts
5021
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5022
        // detect carrier sense in FD and set collision
5023
        eth_phy.carrier_sense_tx_fd_detect(1);
5024
        eth_phy.collision(1);
5025
      end
5026
      endcase
5027
      // first destination address on ethernet PHY
5028
      if (i_length[0] == 0)
5029
        eth_phy.set_tx_mem_addr(0);
5030
      else
5031
        eth_phy.set_tx_mem_addr(max_tmp);
5032
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5033
      // number of all frames is 154 (146 without first 8)
5034
      if (num_of_frames < 8)
5035
      begin
5036
        case (i_length[1:0])
5037
        2'h0: // Interrupt is generated
5038
        begin
5039
          // enable interrupt generation
5040
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5041
          // interrupts are unmasked
5042
        end
5043
        2'h1: // Interrupt is not generated
5044
        begin
5045
          // enable interrupt generation
5046
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5047
          // interrupts are masked
5048
        end
5049
        2'h2: // Interrupt is not generated
5050
        begin
5051
          // disable interrupt generation
5052
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5053
          // interrupts are unmasked
5054
        end
5055
        default: // 2'h3: // Interrupt is not generated
5056
        begin
5057
          // disable interrupt generation
5058
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5059
          // interrupts are masked
5060
        end
5061
        endcase
5062
        // set wrap bit
5063
        set_tx_bd_wrap(0);
5064
      end
5065
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5066
      else if ((num_of_frames - 8) == 0)
5067
      begin
5068
        tmp_len = i_length; // length of frame
5069
        tmp_bd_num = 0; // TX BD number
5070
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5071
        begin
5072
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5073
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5074
          if (tmp_len[0] == 0)
5075
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5076
          else
5077
            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));
5078
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5079
          if ((tmp_len + 4) < (min_tmp + 128))
5080
            tmp_len = tmp_len + 1;
5081
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5082
            tmp_len = 256;
5083
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5084
            tmp_len = tmp_len + 128;
5085
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5086
            tmp_len = max_tmp - (4 + 16);
5087
          else if ((tmp_len + 4) >= (max_tmp - 16))
5088
            tmp_len = tmp_len + 1;
5089
          // set TX BD number
5090
          tmp_bd_num = tmp_bd_num + 1;
5091
        end
5092
        // set wrap bit
5093
        set_tx_bd_wrap(127);
5094
      end
5095
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5096
      else if ((num_of_frames - 8) == 20) // 128
5097
      begin
5098
        tmp_len = tmp_len; // length of frame remaines from previous settings
5099
        tmp_bd_num = 0; // TX BD number
5100
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5101
        begin
5102
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5103
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5104
          if (tmp_len[0] == 0)
5105
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5106
          else
5107
            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));
5108
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5109
          if ((tmp_len + 4) < (min_tmp + 128))
5110
            tmp_len = tmp_len + 1;
5111
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5112
            tmp_len = 256;
5113
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5114
            tmp_len = tmp_len + 128;
5115
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5116
            tmp_len = max_tmp - (4 + 16);
5117
          else if ((tmp_len + 4) >= (max_tmp - 16))
5118
            tmp_len = tmp_len + 1;
5119
          // set TX BD number
5120
          tmp_bd_num = tmp_bd_num + 1;
5121
        end
5122
      end
5123
      // set ready bit
5124
      if (num_of_frames < 8)
5125
        set_tx_bd_ready(0, 0);
5126
      else if ((num_of_frames - 8) < 128)
5127
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5128
      else if ((num_of_frames - 136) < 19)
5129
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5130
      // CHECK END OF TRANSMITION
5131
      #1 check_tx_bd(num_of_bd, data);
5132
      if (i_length < min_tmp) // just first four
5133
      begin
5134
        while (data[15] === 1)
5135
        begin
5136
          #1 check_tx_bd(num_of_bd, data);
5137
          @(posedge wb_clk);
5138
        end
5139
        repeat (1) @(posedge wb_clk);
5140
      end
5141
      else if (i_length > (max_tmp - 8)) // just last four
5142
      begin
5143
        tmp = 0;
5144
        wait (MTxEn === 1'b1); // start transmit
5145
        while (tmp < (i_length - 20))
5146
        begin
5147
          #1 tmp = tmp + 1;
5148
          @(posedge wb_clk);
5149
        end
5150
        #1 check_tx_bd(num_of_bd, data);
5151
        while (data[15] === 1)
5152
        begin
5153
          #1 check_tx_bd(num_of_bd, data);
5154
          @(posedge wb_clk);
5155
        end
5156
        repeat (1) @(posedge wb_clk);
5157
      end
5158
      else
5159
      begin
5160
        wait (MTxEn === 1'b1); // start transmit
5161
        #1 check_tx_bd(num_of_bd, data);
5162
        if (data[15] !== 1)
5163
        begin
5164
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5165
          fail = fail + 1;
5166
        end
5167
        wait (MTxEn === 1'b0); // end transmit
5168
        while (data[15] === 1)
5169
        begin
5170
          #1 check_tx_bd(num_of_bd, data);
5171
          @(posedge wb_clk);
5172
        end
5173
        repeat (1) @(posedge wb_clk);
5174
      end
5175
      // check length of a PACKET
5176
      if (eth_phy.tx_len != (i_length + 4))
5177
      begin
5178
        test_fail("Wrong length of the packet out from MAC");
5179
        fail = fail + 1;
5180
      end
5181
        // check transmitted TX packet data
5182
        if (i_length[0] == 0)
5183
        begin
5184
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5185
        end
5186
        else
5187
        begin
5188
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5189
        end
5190
        if (tmp > 0)
5191
        begin
5192
          test_fail("Wrong data of the transmitted packet");
5193
          fail = fail + 1;
5194
        end
5195
        // check transmited TX packet CRC
5196
        if (i_length[0] == 0)
5197
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5198
        else
5199
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5200
        if (tmp > 0)
5201
        begin
5202
          test_fail("Wrong CRC of the transmitted packet");
5203
          fail = fail + 1;
5204
        end
5205
      // check WB INT signal
5206
      if (i_length[1:0] == 2'h0)
5207
      begin
5208
        if (wb_int !== 1'b1)
5209
        begin
5210
          `TIME; $display("*E WB INT signal should be set");
5211
          test_fail("WB INT signal should be set");
5212
          fail = fail + 1;
5213
        end
5214
      end
5215
      else
5216
      begin
5217
        if (wb_int !== 1'b0)
5218
        begin
5219
          `TIME; $display("*E WB INT signal should not be set");
5220
          test_fail("WB INT signal should not be set");
5221
          fail = fail + 1;
5222
        end
5223
      end
5224
      // check TX buffer descriptor of a packet
5225
      check_tx_bd(num_of_bd, data);
5226
      if (i_length[1] == 1'b0) // interrupt enabled
5227
      begin
5228
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5229
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5230
        begin
5231
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5232
          test_fail("TX buffer descriptor status is not correct");
5233
          fail = fail + 1;
5234
        end
5235
      end
5236
      else // interrupt not enabled
5237
      begin
5238
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5239
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5240
        begin
5241
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5242
          test_fail("TX buffer descriptor status is not correct");
5243
          fail = fail + 1;
5244
        end
5245
      end
5246
      // clear first half of 8 frames from TX buffer descriptor 0
5247
      if (num_of_frames < 4)
5248
        clear_tx_bd(num_of_bd, num_of_bd);
5249
      // clear BD with wrap bit
5250
      if (num_of_frames == 140)
5251
        clear_tx_bd(127, 127);
5252
      // check interrupts
5253
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5254
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5255
      begin
5256
        if ((data & `ETH_INT_TXB) !== 1'b1)
5257
        begin
5258
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5259
          test_fail("Interrupt Transmit Buffer was not set");
5260
          fail = fail + 1;
5261
        end
5262
        if ((data & (~`ETH_INT_TXB)) !== 0)
5263
        begin
5264
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5265
          test_fail("Other interrupts (except Transmit Buffer) were set");
5266
          fail = fail + 1;
5267
        end
5268
      end
5269
      else
5270
      begin
5271
        if (data !== 0)
5272
        begin
5273
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5274
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5275
          fail = fail + 1;
5276
        end
5277
      end
5278
      // clear interrupts
5279
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5280
      // check WB INT signal
5281
      if (wb_int !== 1'b0)
5282
      begin
5283
        test_fail("WB INT signal should not be set");
5284
        fail = fail + 1;
5285
      end
5286
      // INTERMEDIATE DISPLAYS
5287
      if ((i_length + 4) == (min_tmp + 7))
5288
      begin
5289
        // starting length is min_tmp, ending length is (min_tmp + 128)
5290
        $display("    pads appending to packets is NOT selected");
5291
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5292
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5293
                 min_tmp, (min_tmp + 7));
5294
        $display("    ->all packets were send from TX BD 0");
5295
        // set padding, remain the rest
5296
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5297
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5298
      end
5299
      else if ((i_length + 4) == (min_tmp + 128))
5300
      begin
5301
        // starting length is min_tmp, ending length is (min_tmp + 128)
5302
        $display("    pads appending to packets is NOT selected");
5303
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5304
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5305
                 (min_tmp + 8), (min_tmp + 128));
5306
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5307
                 1'b0, num_of_bd);
5308
        tmp_bd = num_of_bd + 1;
5309
        // set padding, remain the rest
5310
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5311
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5312
      end
5313
      else if ((i_length + 4) == (max_tmp - 16))
5314
      begin
5315
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5316
        $display("    pads appending to packets is selected");
5317
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5318
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5319
                 (min_tmp + 64 + 128), tmp_data);
5320
        if (tmp_bd > num_of_bd)
5321
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5322
                   tmp_bd, num_of_bd);
5323
        else
5324
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5325
                   tmp_bd, num_of_bd);
5326
        tmp_bd = num_of_bd + 1;
5327
        // reset padding, remain the rest
5328
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5329
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5330
      end
5331
      else if ((i_length + 4) == max_tmp)
5332
      begin
5333
        $display("    pads appending to packets is NOT selected");
5334
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5335
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5336
                 (max_tmp - (4 + 16)), max_tmp);
5337
        if (tmp_bd > num_of_bd)
5338
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5339
                   tmp_bd, num_of_bd);
5340
        else
5341
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5342
                   tmp_bd, num_of_bd);
5343
      end
5344
      // set length (loop variable)
5345
      if ((i_length + 4) < (min_tmp + 128))
5346
        i_length = i_length + 1;
5347
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5348
        i_length = 256;
5349
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5350
      begin
5351
        i_length = i_length + 128;
5352
        tmp_data = i_length + 4; // last tmp_data is ending length
5353
      end
5354
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5355
        i_length = max_tmp - (4 + 16);
5356
      else if ((i_length + 4) >= (max_tmp - 16))
5357
        i_length = i_length + 1;
5358
      else
5359
      begin
5360
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5361
        #10 $stop;
5362
      end
5363
      // the number of frame transmitted
5364
      num_of_frames = num_of_frames + 1;
5365
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5366
        num_of_bd = 0;
5367
      else
5368
        num_of_bd = num_of_bd + 1;
5369
    end
5370
    // disable TX
5371
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5372
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5373
    @(posedge wb_clk);
5374
    if(fail == 0)
5375
      test_ok;
5376
    else
5377
      fail = 0;
5378
  end
5379
 
5380
 
5381
  ////////////////////////////////////////////////////////////////////
5382
  ////                                                            ////
5383
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5384
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5385
  ////                                                            ////
5386
  ////////////////////////////////////////////////////////////////////
5387
  if (test_num == 5) // with and without padding
5388
  begin
5389
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5390
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5391
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5392
 
5393
    // reset MAC registers
5394
    hard_reset;
5395
    // reset MAC and MII LOGIC with soft reset
5396
    reset_mac;
5397
    reset_mii;
5398
    // set wb slave response
5399
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5400
 
5401
    max_tmp = 0;
5402
    min_tmp = 0;
5403
    num_of_frames = 0;
5404
    num_of_bd = 0;
5405
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5406
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5407
    // enable TX, set full-duplex mode, NO padding and CRC appending
5408
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5409
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5410
    // prepare two packets of MAXFL length
5411
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5412
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5413
    min_tmp = tmp[31:16];
5414
    st_data = 8'hA5;
5415
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5416
    st_data = 8'h71;
5417
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5418
    // check WB INT signal
5419
    if (wb_int !== 1'b0)
5420
    begin
5421
      test_fail("WB INT signal should not be set");
5422
      fail = fail + 1;
5423
    end
5424
 
5425
    // write to phy's control register for 100Mbps
5426
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5427
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5428
    speed = 100;
5429
 
5430
    i_length = (min_tmp - 4);
5431
    while (i_length <= (max_tmp - 4))
5432
    begin
5433
      // choose generating carrier sense and collision
5434
      case (i_length[1:0])
5435
      2'h0: // Interrupt is generated
5436
      begin
5437
        // Reset_tx_bd nable interrupt generation
5438
        // unmask interrupts
5439
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5440
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5441
        // not detect carrier sense in FD and no collision
5442
        eth_phy.carrier_sense_tx_fd_detect(0);
5443
        eth_phy.collision(0);
5444
      end
5445
      2'h1: // Interrupt is not generated
5446
      begin
5447
        // set_tx_bd enable interrupt generation
5448
        // mask interrupts
5449
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5450
        // detect carrier sense in FD and no collision
5451
        eth_phy.carrier_sense_tx_fd_detect(1);
5452
        eth_phy.collision(0);
5453
      end
5454
      2'h2: // Interrupt is not generated
5455
      begin
5456
        // set_tx_bd disable the interrupt generation
5457
        // unmask interrupts
5458
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5459
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5460
        // not detect carrier sense in FD and set collision
5461
        eth_phy.carrier_sense_tx_fd_detect(0);
5462
        eth_phy.collision(1);
5463
      end
5464
      default: // 2'h3: // Interrupt is not generated
5465
      begin
5466
        // set_tx_bd disable the interrupt generation
5467
        // mask interrupts
5468
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5469
        // detect carrier sense in FD and set collision
5470
        eth_phy.carrier_sense_tx_fd_detect(1);
5471
        eth_phy.collision(1);
5472
      end
5473
      endcase
5474
      // first destination address on ethernet PHY
5475
      if (i_length[0] == 0)
5476
        eth_phy.set_tx_mem_addr(0);
5477
      else
5478
        eth_phy.set_tx_mem_addr(max_tmp);
5479
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5480
      // number of all frames is 154 (146 without first 8)
5481
      if (num_of_frames < 8)
5482
      begin
5483
        case (i_length[1:0])
5484
        2'h0: // Interrupt is generated
5485
        begin
5486
          // enable interrupt generation
5487
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5488
          // interrupts are unmasked
5489
        end
5490
        2'h1: // Interrupt is not generated
5491
        begin
5492
          // enable interrupt generation
5493
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5494
          // interrupts are masked
5495
        end
5496
        2'h2: // Interrupt is not generated
5497
        begin
5498
          // disable interrupt generation
5499
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5500
          // interrupts are unmasked
5501
        end
5502
        default: // 2'h3: // Interrupt is not generated
5503
        begin
5504
          // disable interrupt generation
5505
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5506
          // interrupts are masked
5507
        end
5508
        endcase
5509
        // set wrap bit
5510
        set_tx_bd_wrap(0);
5511
      end
5512
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5513
      else if ((num_of_frames - 8) == 0)
5514
      begin
5515
        tmp_len = i_length; // length of frame
5516
        tmp_bd_num = 0; // TX BD number
5517
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5518
        begin
5519
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5520
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5521
          if (tmp_len[0] == 0)
5522
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5523
          else
5524
            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));
5525
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5526
          if ((tmp_len + 4) < (min_tmp + 128))
5527
            tmp_len = tmp_len + 1;
5528
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5529
            tmp_len = 256;
5530
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5531
            tmp_len = tmp_len + 128;
5532
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5533
            tmp_len = max_tmp - (4 + 16);
5534
          else if ((tmp_len + 4) >= (max_tmp - 16))
5535
            tmp_len = tmp_len + 1;
5536
          // set TX BD number
5537
          tmp_bd_num = tmp_bd_num + 1;
5538
        end
5539
        // set wrap bit
5540
        set_tx_bd_wrap(127);
5541
      end
5542
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5543
      else if ((num_of_frames - 8) == 20) // 128
5544
      begin
5545
        tmp_len = tmp_len; // length of frame remaines from previous settings
5546
        tmp_bd_num = 0; // TX BD number
5547
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5548
        begin
5549
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5550
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5551
          if (tmp_len[0] == 0)
5552
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5553
          else
5554
            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));
5555
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5556
          if ((tmp_len + 4) < (min_tmp + 128))
5557
            tmp_len = tmp_len + 1;
5558
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5559
            tmp_len = 256;
5560
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5561
            tmp_len = tmp_len + 128;
5562
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5563
            tmp_len = max_tmp - (4 + 16);
5564
          else if ((tmp_len + 4) >= (max_tmp - 16))
5565
            tmp_len = tmp_len + 1;
5566
          // set TX BD number
5567
          tmp_bd_num = tmp_bd_num + 1;
5568
        end
5569
      end
5570
      // set ready bit
5571
      if (num_of_frames < 8)
5572
        set_tx_bd_ready(0, 0);
5573
      else if ((num_of_frames - 8) < 128)
5574
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5575
      else if ((num_of_frames - 136) < 19)
5576
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5577
      // CHECK END OF TRANSMITION
5578
      #1 check_tx_bd(num_of_bd, data);
5579
      if (i_length < min_tmp) // just first four
5580
      begin
5581
        while (data[15] === 1)
5582
        begin
5583
          #1 check_tx_bd(num_of_bd, data);
5584
          @(posedge wb_clk);
5585
        end
5586
        repeat (1) @(posedge wb_clk);
5587
      end
5588
      else if (i_length > (max_tmp - 8)) // just last four
5589
      begin
5590
        tmp = 0;
5591
        wait (MTxEn === 1'b1); // start transmit
5592
        while (tmp < (i_length - 20))
5593
        begin
5594
          #1 tmp = tmp + 1;
5595
          @(posedge wb_clk);
5596
        end
5597
        #1 check_tx_bd(num_of_bd, data);
5598
        while (data[15] === 1)
5599
        begin
5600
          #1 check_tx_bd(num_of_bd, data);
5601
          @(posedge wb_clk);
5602
        end
5603
        repeat (1) @(posedge wb_clk);
5604
      end
5605
      else
5606
      begin
5607
        wait (MTxEn === 1'b1); // start transmit
5608
        #1 check_tx_bd(num_of_bd, data);
5609
        if (data[15] !== 1)
5610
        begin
5611
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5612
          fail = fail + 1;
5613
        end
5614
        wait (MTxEn === 1'b0); // end transmit
5615
        while (data[15] === 1)
5616
        begin
5617
          #1 check_tx_bd(num_of_bd, data);
5618
          @(posedge wb_clk);
5619
        end
5620
        repeat (1) @(posedge wb_clk);
5621
      end
5622
      // check length of a PACKET
5623
      if (eth_phy.tx_len != (i_length + 4))
5624
      begin
5625
        test_fail("Wrong length of the packet out from MAC");
5626
        fail = fail + 1;
5627
      end
5628
      // checking in the following if statement is performed only for first and last 64 lengths
5629
        // check transmitted TX packet data
5630
        if (i_length[0] == 0)
5631
        begin
5632
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5633
        end
5634
        else
5635
        begin
5636
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5637
        end
5638
        if (tmp > 0)
5639
        begin
5640
          test_fail("Wrong data of the transmitted packet");
5641
          fail = fail + 1;
5642
        end
5643
        // check transmited TX packet CRC
5644
        if (i_length[0] == 0)
5645
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5646
        else
5647
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5648
        if (tmp > 0)
5649
        begin
5650
          test_fail("Wrong CRC of the transmitted packet");
5651
          fail = fail + 1;
5652
        end
5653
      // check WB INT signal
5654
      if (i_length[1:0] == 2'h0)
5655
      begin
5656
        if (wb_int !== 1'b1)
5657
        begin
5658
          `TIME; $display("*E WB INT signal should be set");
5659
          test_fail("WB INT signal should be set");
5660
          fail = fail + 1;
5661
        end
5662
      end
5663
      else
5664
      begin
5665
        if (wb_int !== 1'b0)
5666
        begin
5667
          `TIME; $display("*E WB INT signal should not be set");
5668
          test_fail("WB INT signal should not be set");
5669
          fail = fail + 1;
5670
        end
5671
      end
5672
      // check TX buffer descriptor of a packet
5673
      check_tx_bd(num_of_bd, data);
5674
      if (i_length[1] == 1'b0) // interrupt enabled
5675
      begin
5676
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5677
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5678
        begin
5679
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5680
          test_fail("TX buffer descriptor status is not correct");
5681
          fail = fail + 1;
5682
        end
5683
      end
5684
      else // interrupt not enabled
5685
      begin
5686
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5687
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5688
        begin
5689
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5690
          test_fail("TX buffer descriptor status is not correct");
5691
          fail = fail + 1;
5692
        end
5693
      end
5694
      // clear first half of 8 frames from TX buffer descriptor 0
5695
      if (num_of_frames < 4)
5696
        clear_tx_bd(num_of_bd, num_of_bd);
5697
      // clear BD with wrap bit
5698
      if (num_of_frames == 140)
5699
        clear_tx_bd(127, 127);
5700
      // check interrupts
5701
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5702
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5703
      begin
5704
        if ((data & `ETH_INT_TXB) !== 1'b1)
5705
        begin
5706
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5707
          test_fail("Interrupt Transmit Buffer was not set");
5708
          fail = fail + 1;
5709
        end
5710
        if ((data & (~`ETH_INT_TXB)) !== 0)
5711
        begin
5712
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5713
          test_fail("Other interrupts (except Transmit Buffer) were set");
5714
          fail = fail + 1;
5715
        end
5716
      end
5717
      else
5718
      begin
5719
        if (data !== 0)
5720
        begin
5721
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5722
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5723
          fail = fail + 1;
5724
        end
5725
      end
5726
      // clear interrupts
5727
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5728
      // check WB INT signal
5729
      if (wb_int !== 1'b0)
5730
      begin
5731
        test_fail("WB INT signal should not be set");
5732
        fail = fail + 1;
5733
      end
5734
      // INTERMEDIATE DISPLAYS
5735
      if ((i_length + 4) == (min_tmp + 7))
5736
      begin
5737
        // starting length is min_tmp, ending length is (min_tmp + 128)
5738
        $display("    pads appending to packets is NOT selected");
5739
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5740
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5741
                 min_tmp, (min_tmp + 7));
5742
        $display("    ->all packets were send from TX BD 0");
5743
        // set padding, remain the rest
5744
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5745
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5746
      end
5747
      else if ((i_length + 4) == (min_tmp + 128))
5748
      begin
5749
        // starting length is min_tmp, ending length is (min_tmp + 128)
5750
        $display("    pads appending to packets is NOT selected");
5751
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5752
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5753
                 (min_tmp + 8), (min_tmp + 128));
5754
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5755
                 1'b0, num_of_bd);
5756
        tmp_bd = num_of_bd + 1;
5757
        // set padding, remain the rest
5758
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5759
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5760
      end
5761
      else if ((i_length + 4) == (max_tmp - 16))
5762
      begin
5763
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5764
        $display("    pads appending to packets is selected");
5765
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5766
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5767
                 (min_tmp + 64 + 128), tmp_data);
5768
        if (tmp_bd > num_of_bd)
5769
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5770
                   tmp_bd, num_of_bd);
5771
        else
5772
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5773
                   tmp_bd, num_of_bd);
5774
        tmp_bd = num_of_bd + 1;
5775
        // reset padding, remain the rest
5776
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5777
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5778
      end
5779
      else if ((i_length + 4) == max_tmp)
5780
      begin
5781
        $display("    pads appending to packets is NOT selected");
5782
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5783
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5784
                 (max_tmp - (4 + 16)), max_tmp);
5785
        if (tmp_bd > num_of_bd)
5786
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5787
                   tmp_bd, num_of_bd);
5788
        else
5789
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5790
                   tmp_bd, num_of_bd);
5791
      end
5792
      // set length (loop variable)
5793
      if ((i_length + 4) < (min_tmp + 128))
5794
        i_length = i_length + 1;
5795
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5796
        i_length = 256;
5797
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5798
      begin
5799
        i_length = i_length + 128;
5800
        tmp_data = i_length + 4; // last tmp_data is ending length
5801
      end
5802
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5803
        i_length = max_tmp - (4 + 16);
5804
      else if ((i_length + 4) >= (max_tmp - 16))
5805
        i_length = i_length + 1;
5806
      else
5807
      begin
5808
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5809
        #10 $stop;
5810
      end
5811
      // the number of frame transmitted
5812
      num_of_frames = num_of_frames + 1;
5813
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5814
        num_of_bd = 0;
5815
      else
5816
        num_of_bd = num_of_bd + 1;
5817
    end
5818
    // disable TX
5819
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5820
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5821
    @(posedge wb_clk);
5822
    if(fail == 0)
5823
      test_ok;
5824
    else
5825
      fail = 0;
5826
  end
5827
 
5828
 
5829
  ////////////////////////////////////////////////////////////////////
5830
  ////                                                            ////
5831
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
5832
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
5833
  ////                                                            ////
5834
  ////////////////////////////////////////////////////////////////////
5835
  if (test_num == 6) // 
5836
  begin
5837
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
5838
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
5839
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
5840
 
5841
    // reset MAC registers
5842
    hard_reset;
5843
    // reset MAC and MII LOGIC with soft reset
5844
    reset_mac;
5845
    reset_mii;
5846
    // set wb slave response
5847
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5848
 
5849
    max_tmp = 0;
5850
    min_tmp = 0;
5851
    // set 8 TX buffer descriptors - must be set before TX enable
5852
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5853
    // enable TX, set full-duplex mode, padding and CRC appending
5854
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5855
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5856
    // prepare two packets of MAXFL length
5857
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5858
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5859
    min_tmp = tmp[31:16];
5860
    st_data = 8'h12;
5861
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
5862
    st_data = 8'h34;
5863
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
5864
    // check WB INT signal
5865
    if (wb_int !== 1'b0)
5866
    begin
5867
      test_fail("WB INT signal should not be set");
5868
      fail = fail + 1;
5869
    end
5870
 
5871
    // write to phy's control register for 10Mbps
5872
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5873
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5874
    speed = 10;
5875
 
5876
    frame_started = 0;
5877
    num_of_frames = 0;
5878
    num_of_bd = 0;
5879
    i_length = 0; // 0;
5880
    while (i_length < 70) // (min_tmp - 4))
5881
    begin
5882
      #1;
5883
      // choose generating carrier sense and collision
5884
      case (i_length[1:0])
5885
      2'h0: // Interrupt is generated
5886
      begin
5887
        // Reset_tx_bd nable interrupt generation
5888
        // unmask interrupts
5889
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5890
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5891
        // not detect carrier sense in FD and no collision
5892
        eth_phy.carrier_sense_tx_fd_detect(0);
5893
        eth_phy.collision(0);
5894
      end
5895
      2'h1: // Interrupt is not generated
5896
      begin
5897
        // set_tx_bd enable interrupt generation
5898
        // mask interrupts
5899
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5900
        // detect carrier sense in FD and no collision
5901
        eth_phy.carrier_sense_tx_fd_detect(1);
5902
        eth_phy.collision(0);
5903
      end
5904
      2'h2: // Interrupt is not generated
5905
      begin
5906
        // set_tx_bd disable the interrupt generation
5907
        // unmask interrupts
5908
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5909
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5910
        // not detect carrier sense in FD and set collision
5911
        eth_phy.carrier_sense_tx_fd_detect(0);
5912
        eth_phy.collision(1);
5913
      end
5914
      default: // 2'h3: // Interrupt is not generated
5915
      begin
5916
        // set_tx_bd disable the interrupt generation
5917
        // mask interrupts
5918
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5919
        // detect carrier sense in FD and set collision
5920
        eth_phy.carrier_sense_tx_fd_detect(1);
5921
        eth_phy.collision(1);
5922
      end
5923
      endcase
5924
      #1;
5925
      // first destination address on ethernet PHY
5926
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
5927
      // SET packets and wrap bit
5928
      // num_of_frames <= 9 => wrap set to TX BD 0
5929
      if (num_of_frames <= 9)
5930
      begin
5931
        tmp_len = i_length; // length of frame
5932
        tmp_bd_num = 0; // TX BD number
5933
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5934
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5935
        if (tmp_len[0] == 0)
5936
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5937
        else
5938
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5939
        // set wrap bit
5940
        set_tx_bd_wrap(0);
5941
      end
5942
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
5943
      else if ((num_of_frames == 10) || (num_of_frames == 14))
5944
      begin
5945
        tmp_len = i_length; // length of frame
5946
        tmp_bd_num = 0; // TX BD number
5947
        while (tmp_bd_num < 4) //
5948
        begin
5949
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5950
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5951
          if (tmp_len[0] == 0)
5952
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5953
          else
5954
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5955
          tmp_len = tmp_len + 1;
5956
          // set TX BD number
5957
          tmp_bd_num = tmp_bd_num + 1;
5958
        end
5959
        // set wrap bit
5960
        set_tx_bd_wrap(3);
5961
      end
5962
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
5963
      else if ((num_of_frames == 18) || (num_of_frames == 23))
5964
      begin
5965
        tmp_len = i_length; // length of frame
5966
        tmp_bd_num = 0; // TX BD number
5967
        while (tmp_bd_num < 5) //
5968
        begin
5969
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5970
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5971
          if (tmp_len[0] == 0)
5972
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5973
          else
5974
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5975
          tmp_len = tmp_len + 1;
5976
          // set TX BD number
5977
          tmp_bd_num = tmp_bd_num + 1;
5978
        end
5979
        // set wrap bit
5980
        set_tx_bd_wrap(4);
5981
      end
5982
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
5983
      else if ((num_of_frames == 28) || (num_of_frames == 34))
5984
      begin
5985
        tmp_len = i_length; // length of frame
5986
        tmp_bd_num = 0; // TX BD number
5987
        while (tmp_bd_num < 6) //
5988
        begin
5989
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5990
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5991
          if (tmp_len[0] == 0)
5992
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
5993
          else
5994
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
5995
          tmp_len = tmp_len + 1;
5996
          // set TX BD number
5997
          tmp_bd_num = tmp_bd_num + 1;
5998
        end
5999
        // set wrap bit
6000
        set_tx_bd_wrap(5);
6001
      end
6002
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6003
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6004
      begin
6005
        tmp_len = i_length; // length of frame
6006
        tmp_bd_num = 0; // TX BD number
6007
        while (tmp_bd_num < 7) //
6008
        begin
6009
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6010
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6011
          if (tmp_len[0] == 0)
6012
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6013
          else
6014
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6015
          tmp_len = tmp_len + 1;
6016
          // set TX BD number
6017
          tmp_bd_num = tmp_bd_num + 1;
6018
        end
6019
        // set wrap bit
6020
        set_tx_bd_wrap(6);
6021
      end
6022
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6023
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6024
      begin
6025
        tmp_len = i_length; // length of frame
6026
        tmp_bd_num = 0; // TX BD number
6027
        while (tmp_bd_num < 8) //
6028
        begin
6029
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6030
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6031
          if (tmp_len[0] == 0)
6032
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6033
          else
6034
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6035
          tmp_len = tmp_len + 1;
6036
          // set TX BD number
6037
          tmp_bd_num = tmp_bd_num + 1;
6038
        end
6039
        // set wrap bit
6040
        set_tx_bd_wrap(7);
6041
      end
6042
      #1;
6043
      // SET ready bit
6044
      if (num_of_frames < 10)
6045
        set_tx_bd_ready(0, 0);
6046
      else if (num_of_frames < 14)
6047
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6048
      else if (num_of_frames < 18)
6049
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6050
      else if (num_of_frames < 23)
6051
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6052
      else if (num_of_frames < 28)
6053
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6054
      else if (num_of_frames < 34)
6055
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6056
      else if (num_of_frames < 40)
6057
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6058
      else if (num_of_frames < 47)
6059
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6060
      else if (num_of_frames < 54)
6061
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6062
      else if (num_of_frames < 62)
6063
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6064
      else if (num_of_frames < 70)
6065
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6066
      // CHECK END OF TRANSMITION
6067
      frame_started = 0;
6068
      if (num_of_frames >= 5)
6069
        #1 check_tx_bd(num_of_bd, data);
6070
      fork
6071
      begin: fr_st
6072
        wait (MTxEn === 1'b1); // start transmit
6073
        frame_started = 1;
6074
      end
6075
      begin
6076
        repeat (30) @(posedge mtx_clk);
6077
        if (num_of_frames < 5)
6078
        begin
6079
          if (frame_started == 1)
6080
          begin
6081
            `TIME; $display("*E Frame should NOT start!");
6082
          end
6083
          disable fr_st;
6084
        end
6085
        else
6086
        begin
6087
          if (frame_started == 0)
6088
          begin
6089
            `TIME; $display("*W Frame should start!");
6090
            disable fr_st;
6091
          end
6092
        end
6093
      end
6094
      join
6095
      // check packets larger than 4 bytes
6096
      if (num_of_frames >= 5)
6097
      begin
6098
        wait (MTxEn === 1'b0); // end transmit
6099
        while (data[15] === 1)
6100
        begin
6101
          #1 check_tx_bd(num_of_bd, data);
6102
          @(posedge wb_clk);
6103
        end
6104
        repeat (1) @(posedge wb_clk);
6105
        // check length of a PACKET
6106
        if (i_length <= (min_tmp - 4))
6107
        begin
6108
          if (eth_phy.tx_len != min_tmp)
6109
          begin
6110
            test_fail("Wrong length of the packet out from MAC");
6111
            fail = fail + 1;
6112
          end
6113
        end
6114
        else
6115
        begin
6116
          if (eth_phy.tx_len != (i_length + 4))
6117
          begin
6118
            test_fail("Wrong length of the packet out from MAC");
6119
            fail = fail + 1;
6120
          end
6121
        end
6122
        // check transmitted TX packet data
6123
        if (i_length[0] == 0)
6124
        begin
6125
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6126
        end
6127
        else
6128
        begin
6129
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6130
        end
6131
        if (tmp > 0)
6132
        begin
6133
          test_fail("Wrong data of the transmitted packet");
6134
          fail = fail + 1;
6135
        end
6136
        // check transmited TX packet CRC
6137
        if (num_of_frames < (min_tmp - 4))
6138
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6139
        else
6140
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6141
        if (tmp > 0)
6142
        begin
6143
          test_fail("Wrong CRC of the transmitted packet");
6144
          fail = fail + 1;
6145
        end
6146
      end
6147
      // check WB INT signal
6148
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6149
      begin
6150
        if (wb_int !== 1'b1)
6151
        begin
6152
          `TIME; $display("*E WB INT signal should be set");
6153
          test_fail("WB INT signal should be set");
6154
          fail = fail + 1;
6155
        end
6156
      end
6157
      else
6158
      begin
6159
        if (wb_int !== 1'b0)
6160
        begin
6161
          `TIME; $display("*E WB INT signal should not be set");
6162
          test_fail("WB INT signal should not be set");
6163
          fail = fail + 1;
6164
        end
6165
      end
6166
      // check TX buffer descriptor of a packet
6167
      check_tx_bd(num_of_bd, data);
6168
      if (num_of_frames >= 5)
6169
      begin
6170
        if (i_length[1] == 1'b0) // interrupt enabled
6171
        begin
6172
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6173
               (data[15:0] !== 16'h5800) ) // without wrap bit
6174
          begin
6175
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6176
            test_fail("TX buffer descriptor status is not correct");
6177
            fail = fail + 1;
6178
          end
6179
        end
6180
        else // interrupt not enabled
6181
        begin
6182
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6183
               (data[15:0] !== 16'h1800) ) // without wrap bit
6184
          begin
6185
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6186
            test_fail("TX buffer descriptor status is not correct");
6187
            fail = fail + 1;
6188
          end
6189
        end
6190
      end
6191
      else
6192
      begin
6193
        if (data[15] !== 1'b1)
6194
        begin
6195
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6196
          test_fail("TX buffer descriptor status is not correct");
6197
          fail = fail + 1;
6198
        end
6199
      end
6200
      // clear TX BD with wrap bit
6201
      if (num_of_frames == 63)
6202
        clear_tx_bd(16, 16);
6203
      // check interrupts
6204
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6205
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6206
      begin
6207
        if ((data & `ETH_INT_TXB) !== 1'b1)
6208
        begin
6209
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6210
          test_fail("Interrupt Transmit Buffer was not set");
6211
          fail = fail + 1;
6212
        end
6213
        if ((data & (~`ETH_INT_TXB)) !== 0)
6214
        begin
6215
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6216
          test_fail("Other interrupts (except Transmit Buffer) were set");
6217
          fail = fail + 1;
6218
        end
6219
      end
6220
      else
6221
      begin
6222
        if (data !== 0)
6223
        begin
6224
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6225
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6226
          fail = fail + 1;
6227
        end
6228
      end
6229
      // clear interrupts
6230
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6231
      // check WB INT signal
6232
      if (wb_int !== 1'b0)
6233
      begin
6234
        test_fail("WB INT signal should not be set");
6235
        fail = fail + 1;
6236
      end
6237
      // INTERMEDIATE DISPLAYS
6238
      if (i_length == 3)
6239
      begin
6240
        $display("    pads appending to packets is selected");
6241
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6242
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6243
                 0, 3);
6244
      end
6245
      else if (i_length == 9)
6246
      begin
6247
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6248
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6249
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6250
                 5, 9);
6251
      end
6252
      else if (i_length == 17)
6253
      begin
6254
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6255
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6256
                 10, 17);
6257
      end
6258
      else if (i_length == 27)
6259
      begin
6260
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6261
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6262
                 18, 27);
6263
      end
6264
      else if (i_length == 40)
6265
      begin
6266
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6267
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6268
                 28, 40);
6269
      end
6270
      else if (i_length == 54)
6271
      begin
6272
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6273
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6274
                 41, 54);
6275
      end
6276
      else if (i_length == 69)
6277
      begin
6278
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6279
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6280
                 55, 69);
6281
      end
6282
      // set length (loop variable)
6283
      i_length = i_length + 1;
6284
      // the number of frame transmitted
6285
      num_of_frames = num_of_frames + 1;
6286
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6287
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6288
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6289
          (num_of_frames == 54) || (num_of_frames == 62))
6290
        num_of_bd = 0;
6291
      else
6292
        num_of_bd = num_of_bd + 1;
6293
    end
6294
    // disable TX
6295
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6296
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6297
    @(posedge wb_clk);
6298
    if(fail == 0)
6299
      test_ok;
6300
    else
6301
      fail = 0;
6302
  end
6303
 
6304
 
6305
  ////////////////////////////////////////////////////////////////////
6306
  ////                                                            ////
6307
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6308
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6309
  ////                                                            ////
6310
  ////////////////////////////////////////////////////////////////////
6311
  if (test_num == 7) // 
6312
  begin
6313
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6314
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6315
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6316
 
6317
    // reset MAC registers
6318
    hard_reset;
6319
    // reset MAC and MII LOGIC with soft reset
6320
    reset_mac;
6321
    reset_mii;
6322
    // set wb slave response
6323
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6324
 
6325
    max_tmp = 0;
6326
    min_tmp = 0;
6327
    // set 8 TX buffer descriptors - must be set before TX enable
6328
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6329
    // enable TX, set full-duplex mode, padding and CRC appending
6330
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6331
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6332
    // prepare two packets of MAXFL length
6333
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6334
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6335
    min_tmp = tmp[31:16];
6336
    st_data = 8'h12;
6337
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6338
    st_data = 8'h34;
6339
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6340
    // check WB INT signal
6341
    if (wb_int !== 1'b0)
6342
    begin
6343
      test_fail("WB INT signal should not be set");
6344
      fail = fail + 1;
6345
    end
6346
 
6347
    // write to phy's control register for 100Mbps
6348
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6349
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6350
    speed = 100;
6351
 
6352
    frame_started = 0;
6353
    num_of_frames = 0;
6354
    num_of_bd = 0;
6355
    i_length = 0; // 0;
6356
    while (i_length < 70) // (min_tmp - 4))
6357
    begin
6358
      #1;
6359
      // choose generating carrier sense and collision
6360
      case (i_length[1:0])
6361
      2'h0: // Interrupt is generated
6362
      begin
6363
        // Reset_tx_bd nable interrupt generation
6364
        // unmask interrupts
6365
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6366
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6367
        // not detect carrier sense in FD and no collision
6368
        eth_phy.carrier_sense_tx_fd_detect(0);
6369
        eth_phy.collision(0);
6370
      end
6371
      2'h1: // Interrupt is not generated
6372
      begin
6373
        // set_tx_bd enable interrupt generation
6374
        // mask interrupts
6375
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6376
        // detect carrier sense in FD and no collision
6377
        eth_phy.carrier_sense_tx_fd_detect(1);
6378
        eth_phy.collision(0);
6379
      end
6380
      2'h2: // Interrupt is not generated
6381
      begin
6382
        // set_tx_bd disable the interrupt generation
6383
        // unmask interrupts
6384
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6385
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6386
        // not detect carrier sense in FD and set collision
6387
        eth_phy.carrier_sense_tx_fd_detect(0);
6388
        eth_phy.collision(1);
6389
      end
6390
      default: // 2'h3: // Interrupt is not generated
6391
      begin
6392
        // set_tx_bd disable the interrupt generation
6393
        // mask interrupts
6394
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6395
        // detect carrier sense in FD and set collision
6396
        eth_phy.carrier_sense_tx_fd_detect(1);
6397
        eth_phy.collision(1);
6398
      end
6399
      endcase
6400
      #1;
6401
      // first destination address on ethernet PHY
6402
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6403
      // SET packets and wrap bit
6404
      // num_of_frames <= 9 => wrap set to TX BD 0
6405
      if (num_of_frames <= 9)
6406
      begin
6407
        tmp_len = i_length; // length of frame
6408
        tmp_bd_num = 0; // TX BD number
6409
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6410
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6411
        if (tmp_len[0] == 0)
6412
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6413
        else
6414
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6415
        // set wrap bit
6416
        set_tx_bd_wrap(0);
6417
      end
6418
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6419
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6420
      begin
6421
        tmp_len = i_length; // length of frame
6422
        tmp_bd_num = 0; // TX BD number
6423
        while (tmp_bd_num < 4) //
6424
        begin
6425
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6426
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6427
          if (tmp_len[0] == 0)
6428
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6429
          else
6430
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6431
          tmp_len = tmp_len + 1;
6432
          // set TX BD number
6433
          tmp_bd_num = tmp_bd_num + 1;
6434
        end
6435
        // set wrap bit
6436
        set_tx_bd_wrap(3);
6437
      end
6438
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6439
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6440
      begin
6441
        tmp_len = i_length; // length of frame
6442
        tmp_bd_num = 0; // TX BD number
6443
        while (tmp_bd_num < 5) //
6444
        begin
6445
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6446
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6447
          if (tmp_len[0] == 0)
6448
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6449
          else
6450
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6451
          tmp_len = tmp_len + 1;
6452
          // set TX BD number
6453
          tmp_bd_num = tmp_bd_num + 1;
6454
        end
6455
        // set wrap bit
6456
        set_tx_bd_wrap(4);
6457
      end
6458
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6459
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6460
      begin
6461
        tmp_len = i_length; // length of frame
6462
        tmp_bd_num = 0; // TX BD number
6463
        while (tmp_bd_num < 6) //
6464
        begin
6465
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6466
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6467
          if (tmp_len[0] == 0)
6468
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6469
          else
6470
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6471
          tmp_len = tmp_len + 1;
6472
          // set TX BD number
6473
          tmp_bd_num = tmp_bd_num + 1;
6474
        end
6475
        // set wrap bit
6476
        set_tx_bd_wrap(5);
6477
      end
6478
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6479
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6480
      begin
6481
        tmp_len = i_length; // length of frame
6482
        tmp_bd_num = 0; // TX BD number
6483
        while (tmp_bd_num < 7) //
6484
        begin
6485
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6486
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6487
          if (tmp_len[0] == 0)
6488
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6489
          else
6490
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6491
          tmp_len = tmp_len + 1;
6492
          // set TX BD number
6493
          tmp_bd_num = tmp_bd_num + 1;
6494
        end
6495
        // set wrap bit
6496
        set_tx_bd_wrap(6);
6497
      end
6498
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6499
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6500
      begin
6501
        tmp_len = i_length; // length of frame
6502
        tmp_bd_num = 0; // TX BD number
6503
        while (tmp_bd_num < 8) //
6504
        begin
6505
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6506
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6507
          if (tmp_len[0] == 0)
6508
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6509
          else
6510
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6511
          tmp_len = tmp_len + 1;
6512
          // set TX BD number
6513
          tmp_bd_num = tmp_bd_num + 1;
6514
        end
6515
        // set wrap bit
6516
        set_tx_bd_wrap(7);
6517
      end
6518
      #1;
6519
      // SET ready bit
6520
      if (num_of_frames < 10)
6521
        set_tx_bd_ready(0, 0);
6522
      else if (num_of_frames < 14)
6523
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6524
      else if (num_of_frames < 18)
6525
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6526
      else if (num_of_frames < 23)
6527
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6528
      else if (num_of_frames < 28)
6529
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6530
      else if (num_of_frames < 34)
6531
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6532
      else if (num_of_frames < 40)
6533
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6534
      else if (num_of_frames < 47)
6535
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6536
      else if (num_of_frames < 54)
6537
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6538
      else if (num_of_frames < 62)
6539
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6540
      else if (num_of_frames < 70)
6541
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6542
      // CHECK END OF TRANSMITION
6543
      frame_started = 0;
6544
      if (num_of_frames >= 5)
6545
        #1 check_tx_bd(num_of_bd, data);
6546
      fork
6547
      begin: fr_st1
6548
        wait (MTxEn === 1'b1); // start transmit
6549
        frame_started = 1;
6550
      end
6551
      begin
6552
        repeat (30) @(posedge mtx_clk);
6553
        if (num_of_frames < 5)
6554
        begin
6555
          if (frame_started == 1)
6556
          begin
6557
            `TIME; $display("*E Frame should NOT start!");
6558
          end
6559
          disable fr_st1;
6560
        end
6561
        else
6562
        begin
6563
          if (frame_started == 0)
6564
          begin
6565
            `TIME; $display("*W Frame should start!");
6566
            disable fr_st1;
6567
          end
6568
        end
6569
      end
6570
      join
6571
      // check packets larger than 4 bytes
6572
      if (num_of_frames >= 5)
6573
      begin
6574
        wait (MTxEn === 1'b0); // end transmit
6575
        while (data[15] === 1)
6576
        begin
6577
          #1 check_tx_bd(num_of_bd, data);
6578
          @(posedge wb_clk);
6579
        end
6580
        repeat (1) @(posedge wb_clk);
6581
        // check length of a PACKET
6582
        if (i_length <= (min_tmp - 4))
6583
        begin
6584
          if (eth_phy.tx_len != min_tmp)
6585
          begin
6586
            test_fail("Wrong length of the packet out from MAC");
6587
            fail = fail + 1;
6588
          end
6589
        end
6590
        else
6591
        begin
6592
          if (eth_phy.tx_len != (i_length + 4))
6593
          begin
6594
            test_fail("Wrong length of the packet out from MAC");
6595
            fail = fail + 1;
6596
          end
6597
        end
6598
        // check transmitted TX packet data
6599
        if (i_length[0] == 0)
6600
        begin
6601
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6602
        end
6603
        else
6604
        begin
6605
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6606
        end
6607
        if (tmp > 0)
6608
        begin
6609
          test_fail("Wrong data of the transmitted packet");
6610
          fail = fail + 1;
6611
        end
6612
        // check transmited TX packet CRC
6613
        if (num_of_frames < (min_tmp - 4))
6614
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6615
        else
6616
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6617
        if (tmp > 0)
6618
        begin
6619
          test_fail("Wrong CRC of the transmitted packet");
6620
          fail = fail + 1;
6621
        end
6622
      end
6623
      // check WB INT signal
6624
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6625
      begin
6626
        if (wb_int !== 1'b1)
6627
        begin
6628
          `TIME; $display("*E WB INT signal should be set");
6629
          test_fail("WB INT signal should be set");
6630
          fail = fail + 1;
6631
        end
6632
      end
6633
      else
6634
      begin
6635
        if (wb_int !== 1'b0)
6636
        begin
6637
          `TIME; $display("*E WB INT signal should not be set");
6638
          test_fail("WB INT signal should not be set");
6639
          fail = fail + 1;
6640
        end
6641
      end
6642
      // check TX buffer descriptor of a packet
6643
      check_tx_bd(num_of_bd, data);
6644
      if (num_of_frames >= 5)
6645
      begin
6646
        if (i_length[1] == 1'b0) // interrupt enabled
6647
        begin
6648
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6649
               (data[15:0] !== 16'h5800) ) // without wrap bit
6650
          begin
6651
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6652
            test_fail("TX buffer descriptor status is not correct");
6653
            fail = fail + 1;
6654
          end
6655
        end
6656
        else // interrupt not enabled
6657
        begin
6658
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6659
               (data[15:0] !== 16'h1800) ) // without wrap bit
6660
          begin
6661
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6662
            test_fail("TX buffer descriptor status is not correct");
6663
            fail = fail + 1;
6664
          end
6665
        end
6666
      end
6667
      else
6668
      begin
6669
        if (data[15] !== 1'b1)
6670
        begin
6671
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6672
          test_fail("TX buffer descriptor status is not correct");
6673
          fail = fail + 1;
6674
        end
6675
      end
6676
      // clear TX BD with wrap bit
6677
      if (num_of_frames == 63)
6678
        clear_tx_bd(16, 16);
6679
      // check interrupts
6680
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6681
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6682
      begin
6683
        if ((data & `ETH_INT_TXB) !== 1'b1)
6684
        begin
6685
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6686
          test_fail("Interrupt Transmit Buffer was not set");
6687
          fail = fail + 1;
6688
        end
6689
        if ((data & (~`ETH_INT_TXB)) !== 0)
6690
        begin
6691
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6692
          test_fail("Other interrupts (except Transmit Buffer) were set");
6693
          fail = fail + 1;
6694
        end
6695
      end
6696
      else
6697
      begin
6698
        if (data !== 0)
6699
        begin
6700
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6701
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6702
          fail = fail + 1;
6703
        end
6704
      end
6705
      // clear interrupts
6706
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6707
      // check WB INT signal
6708
      if (wb_int !== 1'b0)
6709
      begin
6710
        test_fail("WB INT signal should not be set");
6711
        fail = fail + 1;
6712
      end
6713
      // INTERMEDIATE DISPLAYS
6714
      if (i_length == 3)
6715
      begin
6716
        $display("    pads appending to packets is selected");
6717
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6718
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6719
                 0, 3);
6720
      end
6721
      else if (i_length == 9)
6722
      begin
6723
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6724
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6725
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6726
                 5, 9);
6727
      end
6728
      else if (i_length == 17)
6729
      begin
6730
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6731
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6732
                 10, 17);
6733
      end
6734
      else if (i_length == 27)
6735
      begin
6736
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6737
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6738
                 18, 27);
6739
      end
6740
      else if (i_length == 40)
6741
      begin
6742
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6743
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6744
                 28, 40);
6745
      end
6746
      else if (i_length == 54)
6747
      begin
6748
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6749
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6750
                 41, 54);
6751
      end
6752
      else if (i_length == 69)
6753
      begin
6754
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6755
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6756
                 55, 69);
6757
      end
6758
      // set length (loop variable)
6759
      i_length = i_length + 1;
6760
      // the number of frame transmitted
6761
      num_of_frames = num_of_frames + 1;
6762
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6763
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6764
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6765
          (num_of_frames == 54) || (num_of_frames == 62))
6766
        num_of_bd = 0;
6767
      else
6768
        num_of_bd = num_of_bd + 1;
6769
    end
6770
    // disable TX
6771
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6772
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6773
    @(posedge wb_clk);
6774
    if(fail == 0)
6775
      test_ok;
6776
    else
6777
      fail = 0;
6778
  end
6779
 
6780
 
6781
  ////////////////////////////////////////////////////////////////////
6782
  ////                                                            ////
6783 243 tadejm
  ////  Test transmit packets (no pads) from 0 to (MINFL - 1)     ////
6784 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
6785
  ////                                                            ////
6786
  ////////////////////////////////////////////////////////////////////
6787
  if (test_num == 8) // 
6788
  begin
6789 243 tadejm
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6790
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6791
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6792 209 tadejm
 
6793
    // reset MAC registers
6794
    hard_reset;
6795
    // reset MAC and MII LOGIC with soft reset
6796
    reset_mac;
6797
    reset_mii;
6798
    // set wb slave response
6799
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6800
 
6801
    max_tmp = 0;
6802
    min_tmp = 0;
6803
    // set 8 TX buffer descriptors - must be set before TX enable
6804
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6805
    // enable TX, set full-duplex mode, padding and CRC appending
6806 243 tadejm
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6807
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
6808 209 tadejm
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6809
    // prepare two packets of MAXFL length
6810
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6811
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6812
    min_tmp = tmp[31:16];
6813
    st_data = 8'h12;
6814
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6815
    st_data = 8'h34;
6816
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6817
    // check WB INT signal
6818
    if (wb_int !== 1'b0)
6819
    begin
6820
      test_fail("WB INT signal should not be set");
6821
      fail = fail + 1;
6822
    end
6823
 
6824
    // write to phy's control register for 10Mbps
6825
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6826
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6827
    speed = 10;
6828
 
6829
    frame_started = 0;
6830
    num_of_frames = 0;
6831
    num_of_bd = 0;
6832
    i_length = 0; // 0;
6833
    while (i_length < 70) // (min_tmp - 4))
6834
    begin
6835
      #1;
6836
      // choose generating carrier sense and collision
6837
      case (i_length[1:0])
6838
      2'h0: // Interrupt is generated
6839
      begin
6840
        // Reset_tx_bd nable interrupt generation
6841
        // unmask interrupts
6842
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6843
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6844
        // not detect carrier sense in FD and no collision
6845
        eth_phy.carrier_sense_tx_fd_detect(0);
6846
        eth_phy.collision(0);
6847
      end
6848
      2'h1: // Interrupt is not generated
6849
      begin
6850
        // set_tx_bd enable interrupt generation
6851
        // mask interrupts
6852
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6853
        // detect carrier sense in FD and no collision
6854
        eth_phy.carrier_sense_tx_fd_detect(1);
6855
        eth_phy.collision(0);
6856
      end
6857
      2'h2: // Interrupt is not generated
6858
      begin
6859
        // set_tx_bd disable the interrupt generation
6860
        // unmask interrupts
6861
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6862
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6863
        // not detect carrier sense in FD and set collision
6864
        eth_phy.carrier_sense_tx_fd_detect(0);
6865
        eth_phy.collision(1);
6866
      end
6867
      default: // 2'h3: // Interrupt is not generated
6868
      begin
6869
        // set_tx_bd disable the interrupt generation
6870
        // mask interrupts
6871
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6872
        // detect carrier sense in FD and set collision
6873
        eth_phy.carrier_sense_tx_fd_detect(1);
6874
        eth_phy.collision(1);
6875
      end
6876
      endcase
6877 243 tadejm
//      // append CRC
6878
//      if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
6879
//      begin
6880
//        append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
6881
//      end
6882 209 tadejm
      #1;
6883
      // first destination address on ethernet PHY
6884
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6885
      // SET packets and wrap bit
6886
      // num_of_frames <= 9 => wrap set to TX BD 0
6887 243 tadejm
      if (num_of_frames <= 5)
6888
        begin
6889
          tmp_len = i_length; // length of frame
6890
          tmp_bd_num = 0; // TX BD number
6891
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6892
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6893
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
6894
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
6895
          else
6896
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6897
          // set wrap bit
6898
          set_tx_bd_wrap(0);
6899
        end
6900
        else if (num_of_frames <= 9)
6901
        begin
6902
          tmp_len = i_length; // length of frame
6903
          tmp_bd_num = 0; // TX BD number
6904
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6905
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6906
          if (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
6907
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6908
          else
6909
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6910
          // set wrap bit
6911
          set_tx_bd_wrap(0);
6912 209 tadejm
      end
6913
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6914
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6915
      begin
6916
        tmp_len = i_length; // length of frame
6917
        tmp_bd_num = 0; // TX BD number
6918
        while (tmp_bd_num < 4) //
6919
        begin
6920
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6921
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6922
          if (tmp_len[0] == 0)
6923 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6924 209 tadejm
          else
6925 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6926 209 tadejm
          tmp_len = tmp_len + 1;
6927
          // set TX BD number
6928
          tmp_bd_num = tmp_bd_num + 1;
6929
        end
6930
        // set wrap bit
6931
        set_tx_bd_wrap(3);
6932
      end
6933
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6934
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6935
      begin
6936
        tmp_len = i_length; // length of frame
6937
        tmp_bd_num = 0; // TX BD number
6938
        while (tmp_bd_num < 5) //
6939
        begin
6940
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6941
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6942
          if (tmp_len[0] == 0)
6943 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6944
          else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
6945
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
6946
                      ((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
6947 209 tadejm
          tmp_len = tmp_len + 1;
6948
          // set TX BD number
6949
          tmp_bd_num = tmp_bd_num + 1;
6950
        end
6951
        // set wrap bit
6952
        set_tx_bd_wrap(4);
6953
      end
6954
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6955
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6956
      begin
6957
        tmp_len = i_length; // length of frame
6958
        tmp_bd_num = 0; // TX BD number
6959
        while (tmp_bd_num < 6) //
6960
        begin
6961
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6962
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6963
          if (tmp_len[0] == 0)
6964 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6965 209 tadejm
          else
6966 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6967 209 tadejm
          tmp_len = tmp_len + 1;
6968
          // set TX BD number
6969
          tmp_bd_num = tmp_bd_num + 1;
6970
        end
6971
        // set wrap bit
6972
        set_tx_bd_wrap(5);
6973
      end
6974
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6975
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6976
      begin
6977
        tmp_len = i_length; // length of frame
6978
        tmp_bd_num = 0; // TX BD number
6979
        while (tmp_bd_num < 7) //
6980
        begin
6981
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6982
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6983
          if (tmp_len[0] == 0)
6984 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
6985 209 tadejm
          else
6986 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
6987 209 tadejm
          tmp_len = tmp_len + 1;
6988
          // set TX BD number
6989
          tmp_bd_num = tmp_bd_num + 1;
6990
        end
6991
        // set wrap bit
6992
        set_tx_bd_wrap(6);
6993
      end
6994
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6995
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6996
      begin
6997
        tmp_len = i_length; // length of frame
6998
        tmp_bd_num = 0; // TX BD number
6999
        while (tmp_bd_num < 8) //
7000
        begin
7001
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7002
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7003
          if (tmp_len[0] == 0)
7004 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, (tmp_len + 0), !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7005 209 tadejm
          else
7006 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7007 209 tadejm
          tmp_len = tmp_len + 1;
7008
          // set TX BD number
7009
          tmp_bd_num = tmp_bd_num + 1;
7010
        end
7011
        // set wrap bit
7012
        set_tx_bd_wrap(7);
7013
      end
7014
      #1;
7015
      // SET ready bit
7016
      if (num_of_frames < 10)
7017
        set_tx_bd_ready(0, 0);
7018
      else if (num_of_frames < 14)
7019
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7020
      else if (num_of_frames < 18)
7021
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7022
      else if (num_of_frames < 23)
7023
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7024
      else if (num_of_frames < 28)
7025
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7026
      else if (num_of_frames < 34)
7027
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7028
      else if (num_of_frames < 40)
7029
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7030
      else if (num_of_frames < 47)
7031
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7032
      else if (num_of_frames < 54)
7033
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7034
      else if (num_of_frames < 62)
7035
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7036
      else if (num_of_frames < 70)
7037
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7038
      // CHECK END OF TRANSMITION
7039
      frame_started = 0;
7040
      if (num_of_frames >= 5)
7041
        #1 check_tx_bd(num_of_bd, data);
7042
      fork
7043
      begin: fr_st2
7044
        wait (MTxEn === 1'b1); // start transmit
7045
        frame_started = 1;
7046
      end
7047
      begin
7048
        repeat (30) @(posedge mtx_clk);
7049
        if (num_of_frames < 5)
7050
        begin
7051
          if (frame_started == 1)
7052
          begin
7053
            `TIME; $display("*E Frame should NOT start!");
7054
          end
7055
          disable fr_st2;
7056
        end
7057
        else
7058
        begin
7059
          if (frame_started == 0)
7060
          begin
7061
            `TIME; $display("*W Frame should start!");
7062
            disable fr_st2;
7063
          end
7064
        end
7065
      end
7066
      join
7067
      // check packets larger than 4 bytes
7068
      if (num_of_frames >= 5)
7069
      begin
7070
        wait (MTxEn === 1'b0); // end transmit
7071
        while (data[15] === 1)
7072
        begin
7073
          #1 check_tx_bd(num_of_bd, data);
7074
          @(posedge wb_clk);
7075
        end
7076
        repeat (1) @(posedge wb_clk);
7077 243 tadejm
        // check length of a PACKET 
7078
        if ((eth_phy.tx_len != i_length) && (i_length[0] == 1'b0) && (num_of_frames >= 6))
7079 209 tadejm
        begin
7080
          `TIME; $display("*E Wrong length of the packet out from MAC");
7081
          test_fail("Wrong length of the packet out from MAC");
7082
          fail = fail + 1;
7083
        end
7084 243 tadejm
        else if ((eth_phy.tx_len != (i_length + 4)) && (num_of_frames != 23))
7085
        begin
7086
          `TIME; $display("*E Wrong length of the packet out from MAC");
7087
          test_fail("Wrong length of the packet out from MAC");
7088
          fail = fail + 1;
7089
        end
7090
        else if ((eth_phy.tx_len != (min_tmp)) && (num_of_frames == 23))
7091
        begin
7092
          `TIME; $display("*E Wrong length of the packet out from MAC");
7093
          test_fail("Wrong length of the packet out from MAC");
7094
          fail = fail + 1;
7095
        end
7096 209 tadejm
        // check transmitted TX packet data
7097
        if (i_length[0] == 0)
7098
        begin
7099
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7100
        end
7101 243 tadejm
        else if (num_of_frames == 23) // i_length[0] == 1 here
7102
        begin
7103
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), (min_tmp - 4), tmp);
7104
        end
7105 209 tadejm
        else
7106
        begin
7107
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7108
        end
7109
        if (tmp > 0)
7110
        begin
7111
          test_fail("Wrong data of the transmitted packet");
7112
          fail = fail + 1;
7113
        end
7114
        // check transmited TX packet CRC
7115 243 tadejm
        #1;
7116
        if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7117
        begin
7118
        end
7119
        else
7120
          check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7121 209 tadejm
        if (tmp > 0)
7122
        begin
7123
          test_fail("Wrong CRC of the transmitted packet");
7124
          fail = fail + 1;
7125
        end
7126
      end
7127
      // check WB INT signal
7128
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7129
      begin
7130
        if (wb_int !== 1'b1)
7131
        begin
7132
          `TIME; $display("*E WB INT signal should be set");
7133
          test_fail("WB INT signal should be set");
7134
          fail = fail + 1;
7135
        end
7136
      end
7137
      else
7138
      begin
7139
        if (wb_int !== 1'b0)
7140
        begin
7141
          `TIME; $display("*E WB INT signal should not be set");
7142
          test_fail("WB INT signal should not be set");
7143
          fail = fail + 1;
7144
        end
7145
      end
7146
      // check TX buffer descriptor of a packet
7147
      check_tx_bd(num_of_bd, data);
7148
      if (num_of_frames >= 5)
7149
      begin
7150 243 tadejm
        if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
7151 209 tadejm
        begin
7152 243 tadejm
          if ( (data[15:0] !== 16'h6000) &&  // wrap bit
7153
               (data[15:0] !== 16'h4000) )  // without wrap bit
7154 209 tadejm
          begin
7155
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7156
            test_fail("TX buffer descriptor status is not correct");
7157
            fail = fail + 1;
7158
          end
7159
        end
7160 243 tadejm
        else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
7161 209 tadejm
        begin
7162 243 tadejm
          if ( (data[15:0] !== 16'h2000) && // wrap bit
7163
               (data[15:0] !== 16'h0000) ) // without wrap bit
7164
          begin
7165
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7166
            test_fail("TX buffer descriptor status is not correct");
7167
            fail = fail + 1;
7168
          end
7169
        end
7170
        else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
7171
        begin
7172
          if ( (data[15:0] !== 16'h6800) && // wrap bit
7173
               (data[15:0] !== 16'h4800) ) // without wrap bit
7174
          begin
7175
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7176
            test_fail("TX buffer descriptor status is not correct");
7177
            fail = fail + 1;
7178
          end
7179
        end
7180
        else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7181
        begin
7182
          if ( (data[15:0] !== 16'h2800) && // wrap bit
7183
               (data[15:0] !== 16'h0800) ) // without wrap bit
7184
          begin
7185
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7186
            test_fail("TX buffer descriptor status is not correct");
7187
            fail = fail + 1;
7188
          end
7189
        end
7190
        else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7191
        begin
7192 209 tadejm
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7193
               (data[15:0] !== 16'h1800) ) // without wrap bit
7194
          begin
7195
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7196
            test_fail("TX buffer descriptor status is not correct");
7197
            fail = fail + 1;
7198
          end
7199
        end
7200
      end
7201
      else
7202
      begin
7203
        if (data[15] !== 1'b1)
7204
        begin
7205
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7206
          test_fail("TX buffer descriptor status is not correct");
7207
          fail = fail + 1;
7208
        end
7209
      end
7210
      // clear TX BD with wrap bit
7211
      if (num_of_frames == 63)
7212
        clear_tx_bd(16, 16);
7213
      // check interrupts
7214
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7215
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7216
      begin
7217
        if ((data & `ETH_INT_TXB) !== 1'b1)
7218
        begin
7219
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7220
          test_fail("Interrupt Transmit Buffer was not set");
7221
          fail = fail + 1;
7222
        end
7223
        if ((data & (~`ETH_INT_TXB)) !== 0)
7224
        begin
7225
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7226
          test_fail("Other interrupts (except Transmit Buffer) were set");
7227
          fail = fail + 1;
7228
        end
7229
      end
7230
      else
7231
      begin
7232
        if (data !== 0)
7233
        begin
7234
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7235
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7236
          fail = fail + 1;
7237
        end
7238
      end
7239
      // clear interrupts
7240
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7241
      // check WB INT signal
7242
      if (wb_int !== 1'b0)
7243
      begin
7244
        test_fail("WB INT signal should not be set");
7245
        fail = fail + 1;
7246
      end
7247
      // INTERMEDIATE DISPLAYS
7248
      if (i_length == 3)
7249
      begin
7250
        $display("    pads appending to packets is selected");
7251
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7252
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7253
                 0, 3);
7254
      end
7255
      else if (i_length == 9)
7256
      begin
7257
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7258
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7259
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7260
                 5, 9);
7261
      end
7262
      else if (i_length == 17)
7263
      begin
7264
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7265
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7266
                 10, 17);
7267
      end
7268
      else if (i_length == 27)
7269
      begin
7270
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7271
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7272
                 18, 27);
7273
      end
7274
      else if (i_length == 40)
7275
      begin
7276
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7277
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7278
                 28, 40);
7279
      end
7280
      else if (i_length == 54)
7281
      begin
7282
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7283
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7284
                 41, 54);
7285
      end
7286
      else if (i_length == 69)
7287
      begin
7288
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7289
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7290
                 55, 69);
7291
      end
7292
      // set length (loop variable)
7293
      i_length = i_length + 1;
7294
      // the number of frame transmitted
7295
      num_of_frames = num_of_frames + 1;
7296
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7297
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7298
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7299
          (num_of_frames == 54) || (num_of_frames == 62))
7300
        num_of_bd = 0;
7301
      else
7302
        num_of_bd = num_of_bd + 1;
7303
    end
7304
    // disable TX
7305
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7306
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7307
    @(posedge wb_clk);
7308
    if(fail == 0)
7309
      test_ok;
7310
    else
7311
      fail = 0;
7312
  end
7313
 
7314
 
7315
  ////////////////////////////////////////////////////////////////////
7316
  ////                                                            ////
7317 243 tadejm
  ////  Test transmit packets (no pads) form 0 to (MINFL - 1)     ////
7318 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7319
  ////                                                            ////
7320
  ////////////////////////////////////////////////////////////////////
7321
  if (test_num == 9) // 
7322
  begin
7323 243 tadejm
    // TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7324
    test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7325
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7326 209 tadejm
 
7327
    // reset MAC registers
7328
    hard_reset;
7329
    // reset MAC and MII LOGIC with soft reset
7330
    reset_mac;
7331
    reset_mii;
7332
    // set wb slave response
7333
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7334
 
7335
    max_tmp = 0;
7336
    min_tmp = 0;
7337
    // set 8 TX buffer descriptors - must be set before TX enable
7338
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7339
    // enable TX, set full-duplex mode, padding and CRC appending
7340
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7341
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7342
    // prepare two packets of MAXFL length
7343
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7344
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7345
    min_tmp = tmp[31:16];
7346
    st_data = 8'h12;
7347
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7348
    st_data = 8'h34;
7349
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7350
    // check WB INT signal
7351
    if (wb_int !== 1'b0)
7352
    begin
7353
      test_fail("WB INT signal should not be set");
7354
      fail = fail + 1;
7355
    end
7356
 
7357
    // write to phy's control register for 100Mbps
7358
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7359
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7360
    speed = 100;
7361
 
7362
    frame_started = 0;
7363
    num_of_frames = 0;
7364
    num_of_bd = 0;
7365
    i_length = 0; // 0;
7366
    while (i_length < 70) // (min_tmp - 4))
7367
    begin
7368
      #1;
7369
      // choose generating carrier sense and collision
7370
      case (i_length[1:0])
7371
      2'h0: // Interrupt is generated
7372
      begin
7373
        // Reset_tx_bd nable interrupt generation
7374
        // unmask interrupts
7375
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7376
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7377
        // not detect carrier sense in FD and no collision
7378
        eth_phy.carrier_sense_tx_fd_detect(0);
7379
        eth_phy.collision(0);
7380
      end
7381
      2'h1: // Interrupt is not generated
7382
      begin
7383
        // set_tx_bd enable interrupt generation
7384
        // mask interrupts
7385
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7386
        // detect carrier sense in FD and no collision
7387
        eth_phy.carrier_sense_tx_fd_detect(1);
7388
        eth_phy.collision(0);
7389
      end
7390
      2'h2: // Interrupt is not generated
7391
      begin
7392
        // set_tx_bd disable the interrupt generation
7393
        // unmask interrupts
7394
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7395
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7396
        // not detect carrier sense in FD and set collision
7397
        eth_phy.carrier_sense_tx_fd_detect(0);
7398
        eth_phy.collision(1);
7399
      end
7400
      default: // 2'h3: // Interrupt is not generated
7401
      begin
7402
        // set_tx_bd disable the interrupt generation
7403
        // mask interrupts
7404
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7405
        // detect carrier sense in FD and set collision
7406
        eth_phy.carrier_sense_tx_fd_detect(1);
7407
        eth_phy.collision(1);
7408
      end
7409
      endcase
7410
      #1;
7411
      // first destination address on ethernet PHY
7412
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7413
      // SET packets and wrap bit
7414
      // num_of_frames <= 9 => wrap set to TX BD 0
7415
      if (num_of_frames <= 9)
7416
      begin
7417
        tmp_len = i_length; // length of frame
7418
        tmp_bd_num = 0; // TX BD number
7419
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7420
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7421
        if (tmp_len[0] == 0)
7422
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7423
        else
7424
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7425
        // set wrap bit
7426
        set_tx_bd_wrap(0);
7427
      end
7428
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7429
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7430
      begin
7431
        tmp_len = i_length; // length of frame
7432
        tmp_bd_num = 0; // TX BD number
7433
        while (tmp_bd_num < 4) //
7434
        begin
7435
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7436
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7437
          if (tmp_len[0] == 0)
7438
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7439
          else
7440
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7441
          tmp_len = tmp_len + 1;
7442
          // set TX BD number
7443
          tmp_bd_num = tmp_bd_num + 1;
7444
        end
7445
        // set wrap bit
7446
        set_tx_bd_wrap(3);
7447
      end
7448
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7449
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7450
      begin
7451
        tmp_len = i_length; // length of frame
7452
        tmp_bd_num = 0; // TX BD number
7453
        while (tmp_bd_num < 5) //
7454
        begin
7455
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7456
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7457
          if (tmp_len[0] == 0)
7458
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7459
          else
7460
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7461
          tmp_len = tmp_len + 1;
7462
          // set TX BD number
7463
          tmp_bd_num = tmp_bd_num + 1;
7464
        end
7465
        // set wrap bit
7466
        set_tx_bd_wrap(4);
7467
      end
7468
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7469
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7470
      begin
7471
        tmp_len = i_length; // length of frame
7472
        tmp_bd_num = 0; // TX BD number
7473
        while (tmp_bd_num < 6) //
7474
        begin
7475
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7476
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7477
          if (tmp_len[0] == 0)
7478
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7479
          else
7480
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7481
          tmp_len = tmp_len + 1;
7482
          // set TX BD number
7483
          tmp_bd_num = tmp_bd_num + 1;
7484
        end
7485
        // set wrap bit
7486
        set_tx_bd_wrap(5);
7487
      end
7488
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7489
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7490
      begin
7491
        tmp_len = i_length; // length of frame
7492
        tmp_bd_num = 0; // TX BD number
7493
        while (tmp_bd_num < 7) //
7494
        begin
7495
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7496
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7497
          if (tmp_len[0] == 0)
7498
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7499
          else
7500
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7501
          tmp_len = tmp_len + 1;
7502
          // set TX BD number
7503
          tmp_bd_num = tmp_bd_num + 1;
7504
        end
7505
        // set wrap bit
7506
        set_tx_bd_wrap(6);
7507
      end
7508
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7509
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7510
      begin
7511
        tmp_len = i_length; // length of frame
7512
        tmp_bd_num = 0; // TX BD number
7513
        while (tmp_bd_num < 8) //
7514
        begin
7515
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7516
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7517
          if (tmp_len[0] == 0)
7518
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7519
          else
7520
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7521
          tmp_len = tmp_len + 1;
7522
          // set TX BD number
7523
          tmp_bd_num = tmp_bd_num + 1;
7524
        end
7525
        // set wrap bit
7526
        set_tx_bd_wrap(7);
7527
      end
7528
      #1;
7529
      // SET ready bit
7530
      if (num_of_frames < 10)
7531
        set_tx_bd_ready(0, 0);
7532
      else if (num_of_frames < 14)
7533
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7534
      else if (num_of_frames < 18)
7535
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7536
      else if (num_of_frames < 23)
7537
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7538
      else if (num_of_frames < 28)
7539
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7540
      else if (num_of_frames < 34)
7541
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7542
      else if (num_of_frames < 40)
7543
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7544
      else if (num_of_frames < 47)
7545
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7546
      else if (num_of_frames < 54)
7547
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7548
      else if (num_of_frames < 62)
7549
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7550
      else if (num_of_frames < 70)
7551
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7552
      // CHECK END OF TRANSMITION
7553
      frame_started = 0;
7554
      if (num_of_frames >= 5)
7555
        #1 check_tx_bd(num_of_bd, data);
7556
      fork
7557
      begin: fr_st3
7558
        wait (MTxEn === 1'b1); // start transmit
7559
        frame_started = 1;
7560
      end
7561
      begin
7562
        repeat (30) @(posedge mtx_clk);
7563
        if (num_of_frames < 5)
7564
        begin
7565
          if (frame_started == 1)
7566
          begin
7567
            `TIME; $display("*E Frame should NOT start!");
7568
          end
7569
          disable fr_st3;
7570
        end
7571
        else
7572
        begin
7573
          if (frame_started == 0)
7574
          begin
7575
            `TIME; $display("*W Frame should start!");
7576
            disable fr_st3;
7577
          end
7578
        end
7579
      end
7580
      join
7581
      // check packets larger than 4 bytes
7582
      if (num_of_frames >= 5)
7583
      begin
7584
        wait (MTxEn === 1'b0); // end transmit
7585
        while (data[15] === 1)
7586
        begin
7587
          #1 check_tx_bd(num_of_bd, data);
7588
          @(posedge wb_clk);
7589
        end
7590
        repeat (1) @(posedge wb_clk);
7591
        // check length of a PACKET
7592
        if (eth_phy.tx_len != (i_length + 4))
7593
        begin
7594
          `TIME; $display("*E Wrong length of the packet out from MAC");
7595
          test_fail("Wrong length of the packet out from MAC");
7596
          fail = fail + 1;
7597
        end
7598
        // check transmitted TX packet data
7599
        if (i_length[0] == 0)
7600
        begin
7601
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7602
        end
7603
        else
7604
        begin
7605
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7606
        end
7607
        if (tmp > 0)
7608
        begin
7609
          test_fail("Wrong data of the transmitted packet");
7610
          fail = fail + 1;
7611
        end
7612
        // check transmited TX packet CRC
7613
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7614
        if (tmp > 0)
7615
        begin
7616
          test_fail("Wrong CRC of the transmitted packet");
7617
          fail = fail + 1;
7618
        end
7619
      end
7620
      // check WB INT signal
7621
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7622
      begin
7623
        if (wb_int !== 1'b1)
7624
        begin
7625
          `TIME; $display("*E WB INT signal should be set");
7626
          test_fail("WB INT signal should be set");
7627
          fail = fail + 1;
7628
        end
7629
      end
7630
      else
7631
      begin
7632
        if (wb_int !== 1'b0)
7633
        begin
7634
          `TIME; $display("*E WB INT signal should not be set");
7635
          test_fail("WB INT signal should not be set");
7636
          fail = fail + 1;
7637
        end
7638
      end
7639
      // check TX buffer descriptor of a packet
7640
      check_tx_bd(num_of_bd, data);
7641
      if (num_of_frames >= 5)
7642
      begin
7643
        if (i_length[1] == 1'b0) // interrupt enabled
7644
        begin
7645
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7646
               (data[15:0] !== 16'h5800) ) // without wrap bit
7647
          begin
7648
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7649
            test_fail("TX buffer descriptor status is not correct");
7650
            fail = fail + 1;
7651
          end
7652
        end
7653
        else // interrupt not enabled
7654
        begin
7655
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7656
               (data[15:0] !== 16'h1800) ) // without wrap bit
7657
          begin
7658
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7659
            test_fail("TX buffer descriptor status is not correct");
7660
            fail = fail + 1;
7661
          end
7662
        end
7663
      end
7664
      else
7665
      begin
7666
        if (data[15] !== 1'b1)
7667
        begin
7668
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7669
          test_fail("TX buffer descriptor status is not correct");
7670
          fail = fail + 1;
7671
        end
7672
      end
7673
      // clear TX BD with wrap bit
7674
      if (num_of_frames == 63)
7675
        clear_tx_bd(16, 16);
7676
      // check interrupts
7677
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7678
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7679
      begin
7680
        if ((data & `ETH_INT_TXB) !== 1'b1)
7681
        begin
7682
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7683
          test_fail("Interrupt Transmit Buffer was not set");
7684
          fail = fail + 1;
7685
        end
7686
        if ((data & (~`ETH_INT_TXB)) !== 0)
7687
        begin
7688
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7689
          test_fail("Other interrupts (except Transmit Buffer) were set");
7690
          fail = fail + 1;
7691
        end
7692
      end
7693
      else
7694
      begin
7695
        if (data !== 0)
7696
        begin
7697
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7698
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7699
          fail = fail + 1;
7700
        end
7701
      end
7702
      // clear interrupts
7703
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7704
      // check WB INT signal
7705
      if (wb_int !== 1'b0)
7706
      begin
7707
        test_fail("WB INT signal should not be set");
7708
        fail = fail + 1;
7709
      end
7710
      // INTERMEDIATE DISPLAYS
7711
      if (i_length == 3)
7712
      begin
7713
        $display("    pads appending to packets is selected");
7714
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7715
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7716
                 0, 3);
7717
      end
7718
      else if (i_length == 9)
7719
      begin
7720
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7721
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7722
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7723
                 5, 9);
7724
      end
7725
      else if (i_length == 17)
7726
      begin
7727
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7728
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7729
                 10, 17);
7730
      end
7731
      else if (i_length == 27)
7732
      begin
7733
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7734
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7735
                 18, 27);
7736
      end
7737
      else if (i_length == 40)
7738
      begin
7739
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7740
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7741
                 28, 40);
7742
      end
7743
      else if (i_length == 54)
7744
      begin
7745
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7746
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7747
                 41, 54);
7748
      end
7749
      else if (i_length == 69)
7750
      begin
7751
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7752
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7753
                 55, 69);
7754
      end
7755
      // set length (loop variable)
7756
      i_length = i_length + 1;
7757
      // the number of frame transmitted
7758
      num_of_frames = num_of_frames + 1;
7759
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7760
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7761
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7762
          (num_of_frames == 54) || (num_of_frames == 62))
7763
        num_of_bd = 0;
7764
      else
7765
        num_of_bd = num_of_bd + 1;
7766
    end
7767
    // disable TX
7768
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7769
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7770
    @(posedge wb_clk);
7771
    if(fail == 0)
7772
      test_ok;
7773
    else
7774
      fail = 0;
7775
  end
7776
 
7777
 
7778
  ////////////////////////////////////////////////////////////////////
7779
  ////                                                            ////
7780
  ////  Test transmit packets across MAXFL value at               ////
7781
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
7782
  ////                                                            ////
7783
  ////////////////////////////////////////////////////////////////////
7784
  if (test_num == 10) // without and with padding
7785
  begin
7786
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
7787
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
7788
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
7789
 
7790
    // reset MAC registers
7791
    hard_reset;
7792
    // reset MAC and MII LOGIC with soft reset
7793
    reset_mac;
7794
    reset_mii;
7795
    // set wb slave response
7796
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7797
 
7798
    max_tmp = 0;
7799
    min_tmp = 0;
7800
    num_of_frames = 0;
7801
    num_of_bd = 0;
7802
    // set 13 TX buffer descriptors - must be set before TX enable
7803
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7804
    // enable TX, set full-duplex mode, NO padding and CRC appending
7805
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7806
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7807
    // prepare a packet of MAXFL + 10 length
7808
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7809
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7810
    min_tmp = tmp[31:16];
7811
    st_data = 8'hA3;
7812
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
7813
    // check WB INT signal
7814
    if (wb_int !== 1'b0)
7815
    begin
7816
      test_fail("WB INT signal should not be set");
7817
      fail = fail + 1;
7818
    end
7819
 
7820
    // write to phy's control register for 10Mbps
7821
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
7822
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
7823
    speed = 10;
7824
 
7825
    i_length = (max_tmp - 5);
7826
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
7827
    begin
7828
$display("   i_length = %0d", i_length);
7829
      // choose generating carrier sense and collision
7830
//      case (i_length[1:0])
7831
//      2'h0: // Interrupt is generated
7832
//      begin
7833
        // Reset_tx_bd nable interrupt generation
7834
        // unmask interrupts
7835
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7836
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7837
        // not detect carrier sense in FD and no collision
7838
        eth_phy.carrier_sense_tx_fd_detect(0);
7839
        eth_phy.collision(0);
7840
//      end
7841
//      2'h1: // Interrupt is not generated
7842
//      begin
7843
        // set_tx_bd enable interrupt generation
7844
        // mask interrupts
7845
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7846
        // detect carrier sense in FD and no collision
7847
//        eth_phy.carrier_sense_tx_fd_detect(1);
7848
//        eth_phy.collision(0);
7849
//      end
7850
//      2'h2: // Interrupt is not generated
7851
//      begin
7852
        // set_tx_bd disable the interrupt generation
7853
        // unmask interrupts
7854
//        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7855
//                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7856
        // not detect carrier sense in FD and set collision
7857
//        eth_phy.carrier_sense_tx_fd_detect(0);
7858
//        eth_phy.collision(1);
7859
//      end
7860
//      default: // 2'h3: // Interrupt is not generated
7861
//      begin
7862
        // set_tx_bd disable the interrupt generation
7863
        // mask interrupts
7864
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7865
        // detect carrier sense in FD and set collision
7866
//        eth_phy.carrier_sense_tx_fd_detect(1);
7867
//        eth_phy.collision(1);
7868
//      end
7869
//      endcase
7870
      // first destination address on ethernet PHY
7871
      eth_phy.set_tx_mem_addr(0);
7872
      // 
7873
if (num_of_bd == 0)
7874
begin
7875
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7876
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7877
set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
7878
set_tx_bd_wrap(2);
7879
set_tx_bd_ready(0, 0);
7880
end
7881
else if (num_of_bd == 1)
7882
set_tx_bd_ready(1, 1);
7883
else if (num_of_bd == 2)
7884
set_tx_bd_ready(2, 2);
7885
 
7886
 
7887
//        tmp_len = i_length; // length of frame
7888
//        tmp_bd_num = 0; // TX BD number
7889
//        while (tmp_bd_num < 8) // 
7890
//        begin
7891
//          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7892
//          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7893
//          if (tmp_len[0] == 0)
7894
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7895
//          else
7896
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + 2*max_tmp));
7897
//          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
7898
//          tmp_len = tmp_len + 1;
7899
//          // set TX BD number
7900
//          tmp_bd_num = tmp_bd_num + 1;
7901
//        end
7902
//        // set wrap bit
7903
//        set_tx_bd_wrap(7);
7904
//      // set ready bit
7905
//      set_tx_bd_ready((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
7906
      // CHECK END OF TRANSMITION
7907
check_tx_bd(num_of_bd, data);
7908
//      #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7909
        wait (MTxEn === 1'b1); // start transmit
7910
check_tx_bd(num_of_bd, data);
7911
//        #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7912
        if (data[15] !== 1)
7913
        begin
7914
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
7915
          fail = fail + 1;
7916
        end
7917
        wait (MTxEn === 1'b0); // end transmit
7918
        while (data[15] === 1)
7919
        begin
7920
check_tx_bd(num_of_bd, data);
7921
//          #1 check_tx_bd((i_length - (max_tmp - 8)), data);
7922
          @(posedge wb_clk);
7923
        end
7924
        repeat (1) @(posedge wb_clk);
7925
      // check length of a PACKET
7926
$display("   eth_phy length = %0d", eth_phy.tx_len);
7927
tmp_len = eth_phy.tx_len;
7928
#1;
7929
if (tmp_len != (i_length + 4))
7930
//      if (eth_phy.tx_len != (i_length + 4))
7931
      begin
7932
        test_fail("Wrong length of the packet out from MAC");
7933
        fail = fail + 1;
7934
      end
7935
      // checking in the following if statement is performed only for first and last 64 lengths
7936
//      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
7937
//      begin
7938
        // check transmitted TX packet data
7939
//        if (i_length[0] == 0)
7940
//        begin
7941
          check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
7942
//        end
7943
//        else
7944
//        begin
7945
//          check_tx_packet((`MEMORY_BASE + 2*max_tmp), 0, i_length, tmp);
7946
//        end
7947
        if (tmp > 0)
7948
        begin
7949
          test_fail("Wrong data of the transmitted packet");
7950
          fail = fail + 1;
7951
        end
7952
        // check transmited TX packet CRC
7953
//        if (i_length[0] == 0)
7954
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7955
//        else
7956
//          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
7957
        if (tmp > 0)
7958
        begin
7959
          test_fail("Wrong CRC of the transmitted packet");
7960
          fail = fail + 1;
7961
        end
7962
//      end
7963
      // check WB INT signal
7964
//      if (i_length[1:0] == 2'h0)
7965
//      begin
7966
        if (wb_int !== 1'b1)
7967
        begin
7968
          `TIME; $display("*E WB INT signal should be set");
7969
          test_fail("WB INT signal should be set");
7970
          fail = fail + 1;
7971
        end
7972
//      end
7973
//      else
7974
//      begin
7975
//        if (wb_int !== 1'b0)
7976
//        begin
7977
//          `TIME; $display("*E WB INT signal should not be set");
7978
//          test_fail("WB INT signal should not be set");
7979
//          fail = fail + 1;
7980
//        end
7981
//      end
7982
//      // check TX buffer descriptor of a packet
7983
//      check_tx_bd((i_length - (max_tmp - 8)), data);
7984
check_tx_bd(num_of_bd, data);
7985
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
7986
     ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
7987
//      if (i_length[1] == 1'b0) // interrupt enabled
7988
//      begin
7989
//        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
7990
//             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
7991
        begin
7992
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7993
          test_fail("TX buffer descriptor status is not correct");
7994
          fail = fail + 1;
7995
        end
7996
//      end
7997
//      else // interrupt not enabled
7998
//      begin
7999
//        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
8000
//             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
8001
//        begin
8002
//          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8003
//          test_fail("TX buffer descriptor status is not correct");
8004
//          fail = fail + 1;
8005
//        end
8006
//      end
8007
//      // clear first half of 8 frames from TX buffer descriptor 0
8008
//      if (num_of_frames < 4)
8009
//        clear_tx_bd((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
8010
      // check interrupts
8011
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8012
//      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
8013
//      begin
8014
        if ((data & `ETH_INT_TXB) !== 1'b1)
8015
        begin
8016
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8017
          test_fail("Interrupt Transmit Buffer was not set");
8018
          fail = fail + 1;
8019
        end
8020
        if ((data & (~`ETH_INT_TXB)) !== 0)
8021
        begin
8022
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8023
          test_fail("Other interrupts (except Transmit Buffer) were set");
8024
          fail = fail + 1;
8025
        end
8026
//      end
8027
//      else
8028
//      begin
8029
//        if (data !== 0)
8030
//        begin
8031
//          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
8032
//          test_fail("Any of interrupts (except Transmit Buffer) was set");
8033
//          fail = fail + 1;
8034
//        end
8035
//      end
8036
      // clear interrupts
8037
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8038
      // check WB INT signal
8039
      if (wb_int !== 1'b0)
8040
      begin
8041
        test_fail("WB INT signal should not be set");
8042
        fail = fail + 1;
8043
      end
8044
      // INTERMEDIATE DISPLAYS
8045
if (num_of_bd == 0)
8046
  $display("    ->packet with length %0d sent", (i_length + 4));
8047
else if (num_of_bd == 1)
8048
  $display("    ->packet with length %0d sent", (i_length + 4));
8049
else if (num_of_bd == 2)
8050
  $display("    ->packet with length %0d sent", (i_length + 4));
8051
      // set length (loop variable)
8052
      i_length = i_length + 1;
8053
      // the number of frame transmitted
8054
      num_of_frames = num_of_frames + 1;
8055
      num_of_bd = num_of_bd + 1;
8056
      @(posedge wb_clk);
8057
    end
8058
    // disable TX
8059
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8060
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8061
    @(posedge wb_clk);
8062
    if(fail == 0)
8063
      test_ok;
8064
    else
8065
      fail = 0;
8066
  end
8067
 
8068
 
8069
  ////////////////////////////////////////////////////////////////////
8070
  ////                                                            ////
8071
  ////  Test transmit packets across MAXFL value at               ////
8072
  ////  13 TX buffer decriptors ( 100Mbps ).                      ////
8073
  ////                                                            ////
8074
  ////////////////////////////////////////////////////////////////////
8075
  if (test_num == 11) // without and with padding
8076
  begin
8077
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8078
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8079
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8080
 
8081
    // reset MAC registers
8082
    hard_reset;
8083
    // reset MAC and MII LOGIC with soft reset
8084
    reset_mac;
8085
    reset_mii;
8086
    // set wb slave response
8087
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8088
 
8089
    max_tmp = 0;
8090
    min_tmp = 0;
8091
    num_of_frames = 0;
8092
    num_of_bd = 0;
8093
    // set 13 TX buffer descriptors - must be set before TX enable
8094
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8095
    // enable TX, set full-duplex mode, NO padding and CRC appending
8096
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8097
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8098
    // prepare a packet of MAXFL + 10 length
8099
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8100
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8101
    min_tmp = tmp[31:16];
8102
    st_data = 8'hA3;
8103
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8104
    // check WB INT signal
8105
    if (wb_int !== 1'b0)
8106
    begin
8107
      test_fail("WB INT signal should not be set");
8108
      fail = fail + 1;
8109
    end
8110
 
8111
    // write to phy's control register for 100Mbps
8112
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8113
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8114
    speed = 100;
8115
 
8116
    i_length = (max_tmp - 5);
8117
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
8118
    begin
8119
      $display("   i_length = %0d", i_length);
8120
      // Reset_tx_bd nable interrupt generation
8121
      // unmask interrupts
8122
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8123
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8124
      // not detect carrier sense in FD and no collision
8125
      eth_phy.carrier_sense_tx_fd_detect(0);
8126
      eth_phy.collision(0);
8127
      // first destination address on ethernet PHY
8128
      eth_phy.set_tx_mem_addr(0);
8129
      // prepare BDs
8130
      if (num_of_bd == 0)
8131
      begin
8132
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8133
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8134
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8135
        set_tx_bd_wrap(2);
8136
        set_tx_bd_ready(0, 0);
8137
      end
8138
      else if (num_of_bd == 1)
8139
        set_tx_bd_ready(1, 1);
8140
      else if (num_of_bd == 2)
8141
        set_tx_bd_ready(2, 2);
8142
      // CHECK END OF TRANSMITION
8143
      check_tx_bd(num_of_bd, data);
8144
        wait (MTxEn === 1'b1); // start transmit
8145
      check_tx_bd(num_of_bd, data);
8146
        if (data[15] !== 1)
8147
        begin
8148
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8149
          fail = fail + 1;
8150
        end
8151
        wait (MTxEn === 1'b0); // end transmit
8152
        while (data[15] === 1)
8153
        begin
8154
      check_tx_bd(num_of_bd, data);
8155
          @(posedge wb_clk);
8156
        end
8157
        repeat (1) @(posedge wb_clk);
8158
      // check length of a PACKET
8159
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8160
      tmp_len = eth_phy.tx_len;
8161
      #1;
8162
      if (tmp_len != (i_length + 4))
8163
      begin
8164
        test_fail("Wrong length of the packet out from MAC");
8165
        fail = fail + 1;
8166
      end
8167
      // checking packet
8168
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8169
      if (tmp > 0)
8170
      begin
8171
        test_fail("Wrong data of the transmitted packet");
8172
        fail = fail + 1;
8173
      end
8174
      // check transmited TX packet CRC
8175
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8176
      if (tmp > 0)
8177
      begin
8178
        test_fail("Wrong CRC of the transmitted packet");
8179
        fail = fail + 1;
8180
      end
8181
      // check WB INT signal
8182
      if (wb_int !== 1'b1)
8183
      begin
8184
        `TIME; $display("*E WB INT signal should be set");
8185
        test_fail("WB INT signal should be set");
8186
        fail = fail + 1;
8187
      end
8188
      // check TX buffer descriptor of a packet
8189
      check_tx_bd(num_of_bd, data);
8190
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8191
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8192
      begin
8193
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8194
        test_fail("TX buffer descriptor status is not correct");
8195
        fail = fail + 1;
8196
      end
8197
      // check interrupts
8198
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8199
      if ((data & `ETH_INT_TXB) !== 1'b1)
8200
      begin
8201
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8202
        test_fail("Interrupt Transmit Buffer was not set");
8203
        fail = fail + 1;
8204
      end
8205
      if ((data & (~`ETH_INT_TXB)) !== 0)
8206
      begin
8207
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8208
        test_fail("Other interrupts (except Transmit Buffer) were set");
8209
        fail = fail + 1;
8210
      end
8211
      // clear interrupts
8212
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8213
      // check WB INT signal
8214
      if (wb_int !== 1'b0)
8215
      begin
8216
        test_fail("WB INT signal should not be set");
8217
        fail = fail + 1;
8218
      end
8219
      // INTERMEDIATE DISPLAYS
8220
      if (num_of_bd == 0)
8221
        $display("    ->packet with length %0d sent", (i_length + 4));
8222
      else if (num_of_bd == 1)
8223
        $display("    ->packet with length %0d sent", (i_length + 4));
8224
      else if (num_of_bd == 2)
8225
        $display("    ->packet with length %0d sent", (i_length + 4));
8226
      // set length (loop variable)
8227
      i_length = i_length + 1;
8228
      // the number of frame transmitted
8229
      num_of_frames = num_of_frames + 1;
8230
      num_of_bd = num_of_bd + 1;
8231
      @(posedge wb_clk);
8232
    end
8233
    // disable TX
8234
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8235
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8236
    @(posedge wb_clk);
8237
    if(fail == 0)
8238
      test_ok;
8239
    else
8240
      fail = 0;
8241
  end
8242
 
8243
 
8244
  ////////////////////////////////////////////////////////////////////
8245
  ////                                                            ////
8246
  ////  Test transmit packets across changed MAXFL value at       ////
8247
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8248
  ////                                                            ////
8249
  ////////////////////////////////////////////////////////////////////
8250
  if (test_num == 12) // without and with padding
8251
  begin
8252
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8253
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8254
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8255
 
8256
    // reset MAC registers
8257
    hard_reset;
8258
    // reset MAC and MII LOGIC with soft reset
8259
    reset_mac;
8260
    reset_mii;
8261
    // set wb slave response
8262
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8263
 
8264
    max_tmp = 0;
8265
    min_tmp = 0;
8266
    num_of_frames = 0;
8267
    num_of_bd = 0;
8268
    // set 47 TX buffer descriptors - must be set before TX enable
8269
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8270
    // prepare a packet of MAXFL + 10 length
8271
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8272
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8273
    min_tmp = tmp[31:16];
8274
    // change MAXFL value
8275
    max_tmp = min_tmp + 53;
8276
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8277
    st_data = 8'h62;
8278
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8279
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8280
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8281
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8282
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8283
    // check WB INT signal
8284
    if (wb_int !== 1'b0)
8285
    begin
8286
      test_fail("WB INT signal should not be set");
8287
      fail = fail + 1;
8288
    end
8289
 
8290
    // write to phy's control register for 10Mbps
8291
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8292
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8293
    speed = 10;
8294
 
8295
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8296
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8297
    begin
8298
      $display("   i_length = %0d", i_length);
8299
      // prepare packet's CRC
8300
      if (num_of_bd == 1)
8301
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8302
      // Reset_tx_bd nable interrupt generation
8303
      // unmask interrupts
8304
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8305
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8306
      // not detect carrier sense in FD and no collision
8307
      eth_phy.carrier_sense_tx_fd_detect(0);
8308
      eth_phy.collision(0);
8309
      // first destination address on ethernet PHY
8310
      eth_phy.set_tx_mem_addr(0);
8311
      // prepare BDs
8312
      if (num_of_bd == 0)
8313
      begin
8314
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8315
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8316
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8317
        set_tx_bd_wrap(2);
8318
        set_tx_bd_ready(0, 0);
8319
      end
8320
      else if (num_of_bd == 1)
8321
        set_tx_bd_ready(1, 1);
8322
      else if (num_of_bd == 2)
8323
        set_tx_bd_ready(2, 2);
8324
      // CHECK END OF TRANSMITION
8325
      check_tx_bd(num_of_bd, data);
8326
        wait (MTxEn === 1'b1); // start transmit
8327
      check_tx_bd(num_of_bd, data);
8328
        if (data[15] !== 1)
8329
        begin
8330
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8331
          fail = fail + 1;
8332
        end
8333
        wait (MTxEn === 1'b0); // end transmit
8334
        while (data[15] === 1)
8335
        begin
8336
      check_tx_bd(num_of_bd, data);
8337
          @(posedge wb_clk);
8338
        end
8339
        repeat (1) @(posedge wb_clk);
8340
      // check length of a PACKET
8341
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8342
      tmp_len = eth_phy.tx_len;
8343
      #1;
8344
      if (tmp_len != (i_length + 4))
8345
      begin
8346
        test_fail("Wrong length of the packet out from MAC");
8347
        fail = fail + 1;
8348
      end
8349
      // checking packet
8350
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8351
      if (tmp > 0)
8352
      begin
8353
        test_fail("Wrong data of the transmitted packet");
8354
        fail = fail + 1;
8355
      end
8356
      // check transmited TX packet CRC
8357
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8358
      if (tmp > 0)
8359
      begin
8360
        test_fail("Wrong CRC of the transmitted packet");
8361
        fail = fail + 1;
8362
      end
8363
      // check WB INT signal
8364
      if (wb_int !== 1'b1)
8365
      begin
8366
        `TIME; $display("*E WB INT signal should be set");
8367
        test_fail("WB INT signal should be set");
8368
        fail = fail + 1;
8369
      end
8370
      // check TX buffer descriptor of a packet
8371
      check_tx_bd(num_of_bd, data);
8372
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8373
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8374
      begin
8375
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8376
        test_fail("TX buffer descriptor status is not correct");
8377
        fail = fail + 1;
8378
      end
8379
      // check interrupts
8380
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8381
      if ((data & `ETH_INT_TXB) !== 1'b1)
8382
      begin
8383
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8384
        test_fail("Interrupt Transmit Buffer was not set");
8385
        fail = fail + 1;
8386
      end
8387
      if ((data & (~`ETH_INT_TXB)) !== 0)
8388
      begin
8389
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8390
        test_fail("Other interrupts (except Transmit Buffer) were set");
8391
        fail = fail + 1;
8392
      end
8393
      // clear interrupts
8394
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8395
      // check WB INT signal
8396
      if (wb_int !== 1'b0)
8397
      begin
8398
        test_fail("WB INT signal should not be set");
8399
        fail = fail + 1;
8400
      end
8401
      // INTERMEDIATE DISPLAYS
8402
      if (num_of_bd == 0)
8403
        $display("    ->packet with length %0d sent", (i_length + 4));
8404
      else if (num_of_bd == 1)
8405
        $display("    ->packet with length %0d sent", (i_length + 4));
8406
      else if (num_of_bd == 2)
8407
        $display("    ->packet with length %0d sent", (i_length + 4));
8408
      // set length (loop variable)
8409
      i_length = i_length + 1;
8410
      // the number of frame transmitted
8411
      num_of_frames = num_of_frames + 1;
8412
      num_of_bd = num_of_bd + 1;
8413
      @(posedge wb_clk);
8414
    end
8415
    // disable TX
8416
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8417
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8418
    @(posedge wb_clk);
8419
    if(fail == 0)
8420
      test_ok;
8421
    else
8422
      fail = 0;
8423
  end
8424
 
8425
 
8426
  ////////////////////////////////////////////////////////////////////
8427
  ////                                                            ////
8428
  ////  Test transmit packets across changed MAXFL value at       ////
8429
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8430
  ////                                                            ////
8431
  ////////////////////////////////////////////////////////////////////
8432
  if (test_num == 13) // without and with padding
8433
  begin
8434
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8435
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8436
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8437
 
8438
    // reset MAC registers
8439
    hard_reset;
8440
    // reset MAC and MII LOGIC with soft reset
8441
    reset_mac;
8442
    reset_mii;
8443
    // set wb slave response
8444
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8445
 
8446
    max_tmp = 0;
8447
    min_tmp = 0;
8448
    num_of_frames = 0;
8449
    num_of_bd = 0;
8450
    // set 47 TX buffer descriptors - must be set before TX enable
8451
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8452
    // prepare a packet of MAXFL + 10 length
8453
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8454
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8455
    min_tmp = tmp[31:16];
8456
    // change MAXFL value
8457
    max_tmp = min_tmp + 53;
8458
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8459
    st_data = 8'h62;
8460
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8461
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
8462
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
8463
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8464
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8465
    // check WB INT signal
8466
    if (wb_int !== 1'b0)
8467
    begin
8468
      test_fail("WB INT signal should not be set");
8469
      fail = fail + 1;
8470
    end
8471
 
8472
    // write to phy's control register for 100Mbps
8473
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8474
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8475
    speed = 100;
8476
 
8477
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8478
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8479
    begin
8480
      $display("   i_length = %0d", i_length);
8481
      // prepare packet's CRC
8482
      if (num_of_bd == 1)
8483
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
8484
      // Reset_tx_bd nable interrupt generation
8485
      // unmask interrupts
8486
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8487
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8488
      // not detect carrier sense in FD and no collision
8489
      eth_phy.carrier_sense_tx_fd_detect(0);
8490
      eth_phy.collision(0);
8491
      // first destination address on ethernet PHY
8492
      eth_phy.set_tx_mem_addr(0);
8493
      // prepare BDs
8494
      if (num_of_bd == 0)
8495
      begin
8496
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8497
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8498
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8499
        set_tx_bd_wrap(2);
8500
        set_tx_bd_ready(0, 0);
8501
      end
8502
      else if (num_of_bd == 1)
8503
        set_tx_bd_ready(1, 1);
8504
      else if (num_of_bd == 2)
8505
        set_tx_bd_ready(2, 2);
8506
      // CHECK END OF TRANSMITION
8507
      check_tx_bd(num_of_bd, data);
8508
        wait (MTxEn === 1'b1); // start transmit
8509
      check_tx_bd(num_of_bd, data);
8510
        if (data[15] !== 1)
8511
        begin
8512
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8513
          fail = fail + 1;
8514
        end
8515
        wait (MTxEn === 1'b0); // end transmit
8516
        while (data[15] === 1)
8517
        begin
8518
      check_tx_bd(num_of_bd, data);
8519
          @(posedge wb_clk);
8520
        end
8521
        repeat (1) @(posedge wb_clk);
8522
      // check length of a PACKET
8523
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8524
      tmp_len = eth_phy.tx_len;
8525
      #1;
8526
      if (tmp_len != (i_length + 4))
8527
      begin
8528
        test_fail("Wrong length of the packet out from MAC");
8529
        fail = fail + 1;
8530
      end
8531
      // checking packet
8532
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8533
      if (tmp > 0)
8534
      begin
8535
        test_fail("Wrong data of the transmitted packet");
8536
        fail = fail + 1;
8537
      end
8538
      // check transmited TX packet CRC
8539
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8540
      if (tmp > 0)
8541
      begin
8542
        test_fail("Wrong CRC of the transmitted packet");
8543
        fail = fail + 1;
8544
      end
8545
      // check WB INT signal
8546
      if (wb_int !== 1'b1)
8547
      begin
8548
        `TIME; $display("*E WB INT signal should be set");
8549
        test_fail("WB INT signal should be set");
8550
        fail = fail + 1;
8551
      end
8552
      // check TX buffer descriptor of a packet
8553
      check_tx_bd(num_of_bd, data);
8554
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8555
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8556
      begin
8557
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8558
        test_fail("TX buffer descriptor status is not correct");
8559
        fail = fail + 1;
8560
      end
8561
      // check interrupts
8562
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8563
      if ((data & `ETH_INT_TXB) !== 1'b1)
8564
      begin
8565
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8566
        test_fail("Interrupt Transmit Buffer was not set");
8567
        fail = fail + 1;
8568
      end
8569
      if ((data & (~`ETH_INT_TXB)) !== 0)
8570
      begin
8571
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8572
        test_fail("Other interrupts (except Transmit Buffer) were set");
8573
        fail = fail + 1;
8574
      end
8575
      // clear interrupts
8576
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8577
      // check WB INT signal
8578
      if (wb_int !== 1'b0)
8579
      begin
8580
        test_fail("WB INT signal should not be set");
8581
        fail = fail + 1;
8582
      end
8583
      // INTERMEDIATE DISPLAYS
8584
      if (num_of_bd == 0)
8585
        $display("    ->packet with length %0d sent", (i_length + 4));
8586
      else if (num_of_bd == 1)
8587
        $display("    ->packet with length %0d sent", (i_length + 4));
8588
      else if (num_of_bd == 2)
8589
        $display("    ->packet with length %0d sent", (i_length + 4));
8590
      // set length (loop variable)
8591
      i_length = i_length + 1;
8592
      // the number of frame transmitted
8593
      num_of_frames = num_of_frames + 1;
8594
      num_of_bd = num_of_bd + 1;
8595
      @(posedge wb_clk);
8596
    end
8597
    // disable TX
8598
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8599
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8600
    @(posedge wb_clk);
8601
    if(fail == 0)
8602
      test_ok;
8603
    else
8604
      fail = 0;
8605
  end
8606
 
8607
 
8608
  ////////////////////////////////////////////////////////////////////
8609
  ////                                                            ////
8610
  ////  Test transmit packets across changed MINFL value at       ////
8611
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8612
  ////                                                            ////
8613
  ////////////////////////////////////////////////////////////////////
8614
  if (test_num == 14) // without and with padding
8615
  begin
8616
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8617
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8618
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8619
 
8620
    // reset MAC registers
8621
    hard_reset;
8622
    // reset MAC and MII LOGIC with soft reset
8623
    reset_mac;
8624
    reset_mii;
8625
    // set wb slave response
8626
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8627
 
8628
    max_tmp = 0;
8629
    min_tmp = 0;
8630
    num_of_frames = 0;
8631
    num_of_bd = 0;
8632
    // set 7 TX buffer descriptors - must be set before TX enable
8633
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8634
    // prepare a packet of MAXFL + 10 length
8635
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8636
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8637
    min_tmp = tmp[31:16];
8638
    // change MINFL value
8639
    min_tmp = max_tmp - 177;
8640
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8641
    st_data = 8'h62;
8642
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8643
    // enable TX, set full-duplex mode, padding and CRC appending
8644
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8645
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8646
    // check WB INT signal
8647
    if (wb_int !== 1'b0)
8648
    begin
8649
      test_fail("WB INT signal should not be set");
8650
      fail = fail + 1;
8651
    end
8652
 
8653
    // write to phy's control register for 10Mbps
8654
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8655
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8656
    speed = 10;
8657
 
8658
    i_length = (min_tmp - 5);
8659
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8660
    begin
8661
      $display("   i_length = %0d", i_length);
8662
      // Reset_tx_bd nable interrupt generation
8663
      // unmask interrupts
8664
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8665
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8666
      // not detect carrier sense in FD and no collision
8667
      eth_phy.carrier_sense_tx_fd_detect(0);
8668
      eth_phy.collision(0);
8669
      // first destination address on ethernet PHY
8670
      eth_phy.set_tx_mem_addr(0);
8671
      // prepare BDs
8672
      if (num_of_bd == 0)
8673
      begin
8674
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8675
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8676
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8677
        set_tx_bd_wrap(2);
8678
        set_tx_bd_ready(0, 0);
8679
      end
8680
      else if (num_of_bd == 1)
8681
        set_tx_bd_ready(1, 1);
8682
      else if (num_of_bd == 2)
8683
        set_tx_bd_ready(2, 2);
8684
      // CHECK END OF TRANSMITION
8685
      check_tx_bd(num_of_bd, data);
8686
        wait (MTxEn === 1'b1); // start transmit
8687
      check_tx_bd(num_of_bd, data);
8688
        if (data[15] !== 1)
8689
        begin
8690
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8691
          fail = fail + 1;
8692
        end
8693
        wait (MTxEn === 1'b0); // end transmit
8694
        while (data[15] === 1)
8695
        begin
8696
      check_tx_bd(num_of_bd, data);
8697
          @(posedge wb_clk);
8698
        end
8699
        repeat (1) @(posedge wb_clk);
8700
      // check length of a PACKET
8701
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8702
      tmp_len = eth_phy.tx_len;
8703
      #1;
8704
      if (tmp_len != (i_length + 4))
8705
      begin
8706
        test_fail("Wrong length of the packet out from MAC");
8707
        fail = fail + 1;
8708
      end
8709
      // checking packet
8710
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8711
      if (tmp > 0)
8712
      begin
8713
        test_fail("Wrong data of the transmitted packet");
8714
        fail = fail + 1;
8715
      end
8716
      // check transmited TX packet CRC
8717
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8718
      if (tmp > 0)
8719
      begin
8720
        test_fail("Wrong CRC of the transmitted packet");
8721
        fail = fail + 1;
8722
      end
8723
      // check WB INT signal
8724
      if (wb_int !== 1'b1)
8725
      begin
8726
        `TIME; $display("*E WB INT signal should be set");
8727
        test_fail("WB INT signal should be set");
8728
        fail = fail + 1;
8729
      end
8730
      // check TX buffer descriptor of a packet
8731
      check_tx_bd(num_of_bd, data);
8732
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8733
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8734
      begin
8735
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8736
        test_fail("TX buffer descriptor status is not correct");
8737
        fail = fail + 1;
8738
      end
8739
      // check interrupts
8740
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8741
      if ((data & `ETH_INT_TXB) !== 1'b1)
8742
      begin
8743
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8744
        test_fail("Interrupt Transmit Buffer was not set");
8745
        fail = fail + 1;
8746
      end
8747
      if ((data & (~`ETH_INT_TXB)) !== 0)
8748
      begin
8749
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8750
        test_fail("Other interrupts (except Transmit Buffer) were set");
8751
        fail = fail + 1;
8752
      end
8753
      // clear interrupts
8754
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8755
      // check WB INT signal
8756
      if (wb_int !== 1'b0)
8757
      begin
8758
        test_fail("WB INT signal should not be set");
8759
        fail = fail + 1;
8760
      end
8761
      // INTERMEDIATE DISPLAYS
8762
      if (num_of_bd == 0)
8763
        $display("    ->packet with length %0d sent", (i_length + 4));
8764
      else if (num_of_bd == 1)
8765
        $display("    ->packet with length %0d sent", (i_length + 4));
8766
      else if (num_of_bd == 2)
8767
        $display("    ->packet with length %0d sent", (i_length + 4));
8768
      // set length (loop variable)
8769
      i_length = i_length + 1;
8770
      // the number of frame transmitted
8771
      num_of_frames = num_of_frames + 1;
8772
      num_of_bd = num_of_bd + 1;
8773
      @(posedge wb_clk);
8774
    end
8775
    // disable TX
8776
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8777
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8778
    @(posedge wb_clk);
8779
    if(fail == 0)
8780
      test_ok;
8781
    else
8782
      fail = 0;
8783
  end
8784
 
8785
 
8786
  ////////////////////////////////////////////////////////////////////
8787
  ////                                                            ////
8788
  ////  Test transmit packets across changed MINFL value at       ////
8789
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
8790
  ////                                                            ////
8791
  ////////////////////////////////////////////////////////////////////
8792
  if (test_num == 15) // without and with padding
8793
  begin
8794
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
8795
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
8796
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
8797
 
8798
    // reset MAC registers
8799
    hard_reset;
8800
    // reset MAC and MII LOGIC with soft reset
8801
    reset_mac;
8802
    reset_mii;
8803
    // set wb slave response
8804
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8805
 
8806
    max_tmp = 0;
8807
    min_tmp = 0;
8808
    num_of_frames = 0;
8809
    num_of_bd = 0;
8810
    // set 7 TX buffer descriptors - must be set before TX enable
8811
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8812
    // prepare a packet of MAXFL + 10 length
8813
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8814
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8815
    min_tmp = tmp[31:16];
8816
    // change MINFL value
8817
    min_tmp = max_tmp - 177;
8818
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8819
    st_data = 8'h62;
8820
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8821
    // enable TX, set full-duplex mode, padding and CRC appending
8822
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8823
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8824
    // check WB INT signal
8825
    if (wb_int !== 1'b0)
8826
    begin
8827
      test_fail("WB INT signal should not be set");
8828
      fail = fail + 1;
8829
    end
8830
 
8831
    // write to phy's control register for 100Mbps
8832
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8833
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8834
    speed = 100;
8835
 
8836
    i_length = (min_tmp - 5);
8837
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8838
    begin
8839
      $display("   i_length = %0d", i_length);
8840
      // Reset_tx_bd nable interrupt generation
8841
      // unmask interrupts
8842
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8843
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8844
      // not detect carrier sense in FD and no collision
8845
      eth_phy.carrier_sense_tx_fd_detect(0);
8846
      eth_phy.collision(0);
8847
      // first destination address on ethernet PHY
8848
      eth_phy.set_tx_mem_addr(0);
8849
      // prepare BDs
8850
      if (num_of_bd == 0)
8851
      begin
8852
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8853
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8854
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8855
        set_tx_bd_wrap(2);
8856
        set_tx_bd_ready(0, 0);
8857
      end
8858
      else if (num_of_bd == 1)
8859
        set_tx_bd_ready(1, 1);
8860
      else if (num_of_bd == 2)
8861
        set_tx_bd_ready(2, 2);
8862
      // CHECK END OF TRANSMITION
8863
      check_tx_bd(num_of_bd, data);
8864
        wait (MTxEn === 1'b1); // start transmit
8865
      check_tx_bd(num_of_bd, data);
8866
        if (data[15] !== 1)
8867
        begin
8868
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8869
          fail = fail + 1;
8870
        end
8871
        wait (MTxEn === 1'b0); // end transmit
8872
        while (data[15] === 1)
8873
        begin
8874
      check_tx_bd(num_of_bd, data);
8875
          @(posedge wb_clk);
8876
        end
8877
        repeat (1) @(posedge wb_clk);
8878
      // check length of a PACKET
8879
      $display("   eth_phy length = %0d", eth_phy.tx_len);
8880
      tmp_len = eth_phy.tx_len;
8881
      #1;
8882
      if (tmp_len != (i_length + 4))
8883
      begin
8884
        test_fail("Wrong length of the packet out from MAC");
8885
        fail = fail + 1;
8886
      end
8887
      // checking packet
8888
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8889
      if (tmp > 0)
8890
      begin
8891
        test_fail("Wrong data of the transmitted packet");
8892
        fail = fail + 1;
8893
      end
8894
      // check transmited TX packet CRC
8895
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8896
      if (tmp > 0)
8897
      begin
8898
        test_fail("Wrong CRC of the transmitted packet");
8899
        fail = fail + 1;
8900
      end
8901
      // check WB INT signal
8902
      if (wb_int !== 1'b1)
8903
      begin
8904
        `TIME; $display("*E WB INT signal should be set");
8905
        test_fail("WB INT signal should be set");
8906
        fail = fail + 1;
8907
      end
8908
      // check TX buffer descriptor of a packet
8909
      check_tx_bd(num_of_bd, data);
8910
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8911
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8912
      begin
8913
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8914
        test_fail("TX buffer descriptor status is not correct");
8915
        fail = fail + 1;
8916
      end
8917
      // check interrupts
8918
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8919
      if ((data & `ETH_INT_TXB) !== 1'b1)
8920
      begin
8921
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8922
        test_fail("Interrupt Transmit Buffer was not set");
8923
        fail = fail + 1;
8924
      end
8925
      if ((data & (~`ETH_INT_TXB)) !== 0)
8926
      begin
8927
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8928
        test_fail("Other interrupts (except Transmit Buffer) were set");
8929
        fail = fail + 1;
8930
      end
8931
      // clear interrupts
8932
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8933
      // check WB INT signal
8934
      if (wb_int !== 1'b0)
8935
      begin
8936
        test_fail("WB INT signal should not be set");
8937
        fail = fail + 1;
8938
      end
8939
      // INTERMEDIATE DISPLAYS
8940
      if (num_of_bd == 0)
8941
        $display("    ->packet with length %0d sent", (i_length + 4));
8942
      else if (num_of_bd == 1)
8943
        $display("    ->packet with length %0d sent", (i_length + 4));
8944
      else if (num_of_bd == 2)
8945
        $display("    ->packet with length %0d sent", (i_length + 4));
8946
      // set length (loop variable)
8947
      i_length = i_length + 1;
8948
      // the number of frame transmitted
8949
      num_of_frames = num_of_frames + 1;
8950
      num_of_bd = num_of_bd + 1;
8951
      @(posedge wb_clk);
8952
    end
8953
    // disable TX
8954
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8955
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8956
    @(posedge wb_clk);
8957
    if(fail == 0)
8958
      test_ok;
8959
    else
8960
      fail = 0;
8961
  end
8962
 
8963
 
8964
  ////////////////////////////////////////////////////////////////////
8965
  ////                                                            ////
8966
  ////  Test transmit packets across MAXFL with HUGEN at          ////
8967
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
8968
  ////                                                            ////
8969
  ////////////////////////////////////////////////////////////////////
8970
  if (test_num == 16) // without and with padding
8971
  begin
8972
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
8973
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
8974
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
8975
 
8976
    // reset MAC registers
8977
    hard_reset;
8978
    // reset MAC and MII LOGIC with soft reset
8979
    reset_mac;
8980
    reset_mii;
8981
    // set wb slave response
8982
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8983
 
8984
    max_tmp = 0;
8985
    min_tmp = 0;
8986
    num_of_frames = 0;
8987
    num_of_bd = 0;
8988
    // set 19 TX buffer descriptors - must be set before TX enable
8989
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8990
    // prepare a packet of 64k - 1 length (16'hFFFF)
8991
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8992
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8993
    min_tmp = tmp[31:16];
8994
    st_data = 8'h8D;
8995
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
8996
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
8997
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
8998
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8999
    // check WB INT signal
9000
    if (wb_int !== 1'b0)
9001
    begin
9002
      test_fail("WB INT signal should not be set");
9003
      fail = fail + 1;
9004
    end
9005
 
9006
    // write to phy's control register for 10Mbps
9007
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9008
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9009
    speed = 10;
9010
 
9011
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9012
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9013
    begin
9014
      $display("   i_length = %0d", i_length);
9015
      // Reset_tx_bd nable interrupt generation
9016
      // unmask interrupts
9017
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9018
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9019
      // not detect carrier sense in FD and no collision
9020
      eth_phy.carrier_sense_tx_fd_detect(0);
9021
      eth_phy.collision(0);
9022
      // first destination address on ethernet PHY
9023
      eth_phy.set_tx_mem_addr(0);
9024
      // prepare BDs
9025
      if (num_of_bd == 0)
9026
      begin
9027
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9028
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9029
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9030
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9031
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9032
        set_tx_bd_wrap(4);
9033
        set_tx_bd_ready(0, 0);
9034
      end
9035
      else if (num_of_bd == 1)
9036
        set_tx_bd_ready(1, 1);
9037
      else if (num_of_bd == 2)
9038
        set_tx_bd_ready(2, 2);
9039
      else if (num_of_bd == 3)
9040
        set_tx_bd_ready(3, 3);
9041
      else if (num_of_bd == 4)
9042
        set_tx_bd_ready(4, 4);
9043
      // CHECK END OF TRANSMITION
9044
      check_tx_bd(num_of_bd, data);
9045
        wait (MTxEn === 1'b1); // start transmit
9046
      check_tx_bd(num_of_bd, data);
9047
        if (data[15] !== 1)
9048
        begin
9049
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9050
          fail = fail + 1;
9051
        end
9052
        wait (MTxEn === 1'b0); // end transmit
9053
        while (data[15] === 1)
9054
        begin
9055
      check_tx_bd(num_of_bd, data);
9056
          @(posedge wb_clk);
9057
        end
9058
        repeat (1) @(posedge wb_clk);
9059
      // check length of a PACKET
9060
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9061
      tmp_len = eth_phy.tx_len;
9062
      #1;
9063
      if (tmp_len != (i_length + 4))
9064
      begin
9065
        test_fail("Wrong length of the packet out from MAC");
9066
        fail = fail + 1;
9067
      end
9068
      // checking packet
9069
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9070
      if (tmp > 0)
9071
      begin
9072
        test_fail("Wrong data of the transmitted packet");
9073
        fail = fail + 1;
9074
      end
9075
      // check transmited TX packet CRC
9076
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9077
      if (tmp > 0)
9078
      begin
9079
        test_fail("Wrong CRC of the transmitted packet");
9080
        fail = fail + 1;
9081
      end
9082
      // check WB INT signal
9083
      if (wb_int !== 1'b1)
9084
      begin
9085
        `TIME; $display("*E WB INT signal should be set");
9086
        test_fail("WB INT signal should be set");
9087
        fail = fail + 1;
9088
      end
9089
      // check TX buffer descriptor of a packet
9090
      check_tx_bd(num_of_bd, data);
9091
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9092
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9093
      begin
9094
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9095
        test_fail("TX buffer descriptor status is not correct");
9096
        fail = fail + 1;
9097
      end
9098
      // check interrupts
9099
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9100
      if ((data & `ETH_INT_TXB) !== 1'b1)
9101
      begin
9102
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9103
        test_fail("Interrupt Transmit Buffer was not set");
9104
        fail = fail + 1;
9105
      end
9106
      if ((data & (~`ETH_INT_TXB)) !== 0)
9107
      begin
9108
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9109
        test_fail("Other interrupts (except Transmit Buffer) were set");
9110
        fail = fail + 1;
9111
      end
9112
      // clear interrupts
9113
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9114
      // check WB INT signal
9115
      if (wb_int !== 1'b0)
9116
      begin
9117
        test_fail("WB INT signal should not be set");
9118
        fail = fail + 1;
9119
      end
9120
      // INTERMEDIATE DISPLAYS
9121
      $display("    ->packet with length %0d sent", (i_length + 4));
9122
      // set length (loop variable)
9123
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9124
        i_length = i_length + 1;
9125
      else if (num_of_bd == 2)
9126
        i_length = (16'hFFFF - 5);
9127
      // the number of frame transmitted
9128
      num_of_frames = num_of_frames + 1;
9129
      num_of_bd = num_of_bd + 1;
9130
      @(posedge wb_clk);
9131
    end
9132
    // disable TX
9133
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9134
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9135
    @(posedge wb_clk);
9136
    if(fail == 0)
9137
      test_ok;
9138
    else
9139
      fail = 0;
9140
  end
9141
 
9142
 
9143
  ////////////////////////////////////////////////////////////////////
9144
  ////                                                            ////
9145
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9146
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9147
  ////                                                            ////
9148
  ////////////////////////////////////////////////////////////////////
9149
  if (test_num == 17) // without and with padding
9150
  begin
9151
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9152
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9153
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9154
 
9155
    // reset MAC registers
9156
    hard_reset;
9157
    // reset MAC and MII LOGIC with soft reset
9158
    reset_mac;
9159
    reset_mii;
9160
    // set wb slave response
9161
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9162
 
9163
    max_tmp = 0;
9164
    min_tmp = 0;
9165
    num_of_frames = 0;
9166
    num_of_bd = 0;
9167
    // set 19 TX buffer descriptors - must be set before TX enable
9168
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9169
    // prepare a packet of 64k - 1 length (16'hFFFF)
9170
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9171
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9172
    min_tmp = tmp[31:16];
9173
    st_data = 8'h8D;
9174
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9175
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9176
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9177
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9178
    // check WB INT signal
9179
    if (wb_int !== 1'b0)
9180
    begin
9181
      test_fail("WB INT signal should not be set");
9182
      fail = fail + 1;
9183
    end
9184
 
9185
    // write to phy's control register for 100Mbps
9186
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9187
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9188
    speed = 100;
9189
 
9190
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9191
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9192
    begin
9193
      $display("   i_length = %0d", i_length);
9194
      // Reset_tx_bd nable interrupt generation
9195
      // unmask interrupts
9196
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9197
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9198
      // not detect carrier sense in FD and no collision
9199
      eth_phy.carrier_sense_tx_fd_detect(0);
9200
      eth_phy.collision(0);
9201
      // first destination address on ethernet PHY
9202
      eth_phy.set_tx_mem_addr(0);
9203
      // prepare BDs
9204
      if (num_of_bd == 0)
9205
      begin
9206
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9207
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9208
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9209
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9210
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9211
        set_tx_bd_wrap(4);
9212
        set_tx_bd_ready(0, 0);
9213
      end
9214
      else if (num_of_bd == 1)
9215
        set_tx_bd_ready(1, 1);
9216
      else if (num_of_bd == 2)
9217
        set_tx_bd_ready(2, 2);
9218
      else if (num_of_bd == 3)
9219
        set_tx_bd_ready(3, 3);
9220
      else if (num_of_bd == 4)
9221
        set_tx_bd_ready(4, 4);
9222
      // CHECK END OF TRANSMITION
9223
      check_tx_bd(num_of_bd, data);
9224
        wait (MTxEn === 1'b1); // start transmit
9225
      check_tx_bd(num_of_bd, data);
9226
        if (data[15] !== 1)
9227
        begin
9228
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9229
          fail = fail + 1;
9230
        end
9231
        wait (MTxEn === 1'b0); // end transmit
9232
        while (data[15] === 1)
9233
        begin
9234
      check_tx_bd(num_of_bd, data);
9235
          @(posedge wb_clk);
9236
        end
9237
        repeat (1) @(posedge wb_clk);
9238
      // check length of a PACKET
9239
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9240
      tmp_len = eth_phy.tx_len;
9241
      #1;
9242
      if (tmp_len != (i_length + 4))
9243
      begin
9244
        test_fail("Wrong length of the packet out from MAC");
9245
        fail = fail + 1;
9246
      end
9247
      // checking packet
9248
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9249
      if (tmp > 0)
9250
      begin
9251
        test_fail("Wrong data of the transmitted packet");
9252
        fail = fail + 1;
9253
      end
9254
      // check transmited TX packet CRC
9255
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9256
      if (tmp > 0)
9257
      begin
9258
        test_fail("Wrong CRC of the transmitted packet");
9259
        fail = fail + 1;
9260
      end
9261
      // check WB INT signal
9262
      if (wb_int !== 1'b1)
9263
      begin
9264
        `TIME; $display("*E WB INT signal should be set");
9265
        test_fail("WB INT signal should be set");
9266
        fail = fail + 1;
9267
      end
9268
      // check TX buffer descriptor of a packet
9269
      check_tx_bd(num_of_bd, data);
9270
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9271
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9272
      begin
9273
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9274
        test_fail("TX buffer descriptor status is not correct");
9275
        fail = fail + 1;
9276
      end
9277
      // check interrupts
9278
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9279
      if ((data & `ETH_INT_TXB) !== 1'b1)
9280
      begin
9281
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9282
        test_fail("Interrupt Transmit Buffer was not set");
9283
        fail = fail + 1;
9284
      end
9285
      if ((data & (~`ETH_INT_TXB)) !== 0)
9286
      begin
9287
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9288
        test_fail("Other interrupts (except Transmit Buffer) were set");
9289
        fail = fail + 1;
9290
      end
9291
      // clear interrupts
9292
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9293
      // check WB INT signal
9294
      if (wb_int !== 1'b0)
9295
      begin
9296
        test_fail("WB INT signal should not be set");
9297
        fail = fail + 1;
9298
      end
9299
      // INTERMEDIATE DISPLAYS
9300
      $display("    ->packet with length %0d sent", (i_length + 4));
9301
      // set length (loop variable)
9302
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9303
        i_length = i_length + 1;
9304
      else if (num_of_bd == 2)
9305
        i_length = (16'hFFFF - 5);
9306
      // the number of frame transmitted
9307
      num_of_frames = num_of_frames + 1;
9308
      num_of_bd = num_of_bd + 1;
9309
      @(posedge wb_clk);
9310
    end
9311
    // disable TX
9312
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9313
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9314
    @(posedge wb_clk);
9315
    if(fail == 0)
9316
      test_ok;
9317
    else
9318
      fail = 0;
9319
  end
9320
 
9321
 
9322
  ////////////////////////////////////////////////////////////////////
9323
  ////                                                            ////
9324
  ////  Test IPG during Back-to-Back transmit at                  ////
9325
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9326
  ////                                                            ////
9327
  ////////////////////////////////////////////////////////////////////
9328
  if (test_num == 18) // without and with padding
9329
  begin
9330
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9331
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9332
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9333
 
9334
    // reset MAC registers
9335
    hard_reset;
9336
    // reset MAC and MII LOGIC with soft reset
9337
    reset_mac;
9338
    reset_mii;
9339
    // set wb slave response
9340
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9341
 
9342
    max_tmp = 0;
9343
    min_tmp = 0;
9344
    num_of_frames = 0;
9345
    num_of_bd = 0;
9346
    tmp_ipgt = 0;
9347
    // set 88 TX buffer descriptors - must be set before TX enable
9348
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9349
    // enable TX, set full-duplex mode, NO padding and CRC appending
9350
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9351
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9352
    // prepare two packets of MAXFL length
9353
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9354
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9355
    min_tmp = tmp[31:16];
9356
    st_data = 8'h29;
9357
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9358
    // check WB INT signal
9359
    if (wb_int !== 1'b0)
9360
    begin
9361
      test_fail("WB INT signal should not be set");
9362
      fail = fail + 1;
9363
    end
9364
 
9365
    // write to phy's control register for 10Mbps
9366
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9367
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9368
    speed = 10;
9369
 
9370
    i_length = (min_tmp - 4);
9371
    while (i_length < (max_tmp - 4))
9372
    begin
9373
      // disable TX, set full-duplex mode, NO padding and CRC appending
9374
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9375
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9376
      // set IPGT register
9377
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9378
      // enable TX, set full-duplex mode, NO padding and CRC appending
9379
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9380
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9381
      // Reset_tx_bd enable interrupt generation
9382
      // unmask interrupts
9383
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9384
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9385
      // not detect carrier sense in FD and no collision
9386
      eth_phy.carrier_sense_tx_fd_detect(0);
9387
      eth_phy.collision(0);
9388
      // first destination address on ethernet PHY
9389
      eth_phy.set_tx_mem_addr(0);
9390
      // prepare BDs
9391
      if (num_of_bd == 0)
9392
      begin
9393
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9394
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9395
        set_tx_bd_wrap(1);
9396
        set_tx_bd_ready(0, 0);
9397
        set_tx_bd_ready(1, 1);
9398
      end
9399
      // CHECK END OF TWO TRANSMITIONs
9400
      // wait for first transmit to end
9401
      check_tx_bd(num_of_bd, data);
9402
      wait (MTxEn === 1'b1); // start transmit
9403
      if (data[15] !== 1)
9404
      begin
9405
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9406
        fail = fail + 1;
9407
      end
9408
      wait (MTxEn === 1'b0); // end transmit
9409
      num_of_frames = num_of_frames + 1;
9410
      num_of_bd = num_of_bd + 1;
9411
      #Tp;
9412
      // destination address on ethernet PHY
9413
      eth_phy.set_tx_mem_addr(0);
9414
      i1 = 0;
9415
      i2 = 0;
9416
      // count IPG clock periods
9417
      fork
9418
        begin
9419
          wait (MTxEn === 1'b1); // start second transmit
9420
          #Tp;
9421
          disable count_rising;
9422
          disable count_falling;
9423
        end
9424
        begin: count_rising
9425
          forever
9426
          begin
9427
            @(posedge mtx_clk);
9428
            i1 = i1 + 1;
9429
            #Tp;
9430
          end
9431
        end
9432
        begin: count_falling
9433
          forever
9434
          begin
9435
            @(negedge mtx_clk);
9436
            i2 = i2 + 1;
9437
            #Tp;
9438
          end
9439
        end
9440
      join
9441
      // check IPG length - INTERMEDIATE DISPLAYS
9442
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9443
      begin
9444
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9445
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9446
      end
9447
      else
9448
      begin
9449
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9450
        fail = fail + 1;
9451
        test_fail("IPG is not correct");
9452
      end
9453
      // wait for second transmit to end
9454
      wait (MTxEn === 1'b0); // end second transmit
9455
      while (data[15] === 1)
9456
      begin
9457
        check_tx_bd(num_of_bd, data);
9458
        @(posedge wb_clk);
9459
      end
9460
      repeat (1) @(posedge wb_clk);
9461
      // check length of a second PACKET
9462
      tmp_len = eth_phy.tx_len;
9463
      #1;
9464
      if (tmp_len != (i_length + 4 + 1))
9465
      begin
9466
        test_fail("Wrong length of second packet out from MAC");
9467
        fail = fail + 1;
9468
      end
9469
      // checking second packet
9470
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9471
      if (tmp > 0)
9472
      begin
9473
        test_fail("Wrong data of second transmitted packet");
9474
        fail = fail + 1;
9475
      end
9476
      // check second transmited TX packet CRC
9477
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9478
      if (tmp > 0)
9479
      begin
9480
        test_fail("Wrong CRC of second transmitted packet");
9481
        fail = fail + 1;
9482
      end
9483
      // check WB INT signal
9484
      if (wb_int !== 1'b1)
9485
      begin
9486
        `TIME; $display("*E WB INT signal should be set");
9487
        test_fail("WB INT signal should be set");
9488
        fail = fail + 1;
9489
      end
9490
      // check TX buffer descriptor of a packet
9491
      check_tx_bd(num_of_bd, data);
9492
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9493
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9494
      begin
9495
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9496
        test_fail("TX buffer descriptor status is not correct");
9497
        fail = fail + 1;
9498
      end
9499
      // check interrupts
9500
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9501
      if ((data & `ETH_INT_TXB) !== 1'b1)
9502
      begin
9503
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9504
        test_fail("Interrupt Transmit Buffer was not set");
9505
        fail = fail + 1;
9506
      end
9507
      if ((data & (~`ETH_INT_TXB)) !== 0)
9508
      begin
9509
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9510
        test_fail("Other interrupts (except Transmit Buffer) were set");
9511
        fail = fail + 1;
9512
      end
9513
      // clear interrupts
9514
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9515
      // check WB INT signal
9516
      if (wb_int !== 1'b0)
9517
      begin
9518
        test_fail("WB INT signal should not be set");
9519
        fail = fail + 1;
9520
      end
9521
      // set length (LOOP variable)
9522
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9523
        i_length = i_length + 2;
9524
      else
9525
        i_length = (max_tmp - 4);
9526
      // set IPGT
9527
      if ((tmp_ipgt + 3) < 10)
9528
        tmp_ipgt = tmp_ipgt + 1;
9529
      else if ((tmp_ipgt + 3) < 24)
9530
        tmp_ipgt = tmp_ipgt + 7;
9531
      else if ((tmp_ipgt + 3) == 24)
9532
        tmp_ipgt = 38 - 3;
9533
      else if ((tmp_ipgt + 3) == 38)
9534
        tmp_ipgt = 72 - 3;
9535
      else if ((tmp_ipgt + 3) == 72)
9536
        tmp_ipgt = 130 - 3; // 124 - 3
9537
      // the number of frame transmitted
9538
      num_of_frames = num_of_frames + 1;
9539
      num_of_bd = 0;
9540
      @(posedge wb_clk);
9541
    end
9542
    // disable TX
9543
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9544
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9545
    @(posedge wb_clk);
9546
    if(fail == 0)
9547
      test_ok;
9548
    else
9549
      fail = 0;
9550
  end
9551
 
9552
 
9553
  ////////////////////////////////////////////////////////////////////
9554
  ////                                                            ////
9555
  ////  Test IPG during Back-to-Back transmit at                  ////
9556
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9557
  ////                                                            ////
9558
  ////////////////////////////////////////////////////////////////////
9559
  if (test_num == 19) // without and with padding
9560
  begin
9561
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9562
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9563
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9564
 
9565
    // reset MAC registers
9566
    hard_reset;
9567
    // reset MAC and MII LOGIC with soft reset
9568
    reset_mac;
9569
    reset_mii;
9570
    // set wb slave response
9571
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9572
 
9573
    max_tmp = 0;
9574
    min_tmp = 0;
9575
    num_of_frames = 0;
9576
    num_of_bd = 0;
9577
    tmp_ipgt = 0;
9578
    // set 88 TX buffer descriptors - must be set before TX enable
9579
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9580
    // enable TX, set full-duplex mode, NO padding and CRC appending
9581
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9582
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9583
    // prepare two packets of MAXFL length
9584
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9585
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9586
    min_tmp = tmp[31:16];
9587
    st_data = 8'h29;
9588
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9589
    // check WB INT signal
9590
    if (wb_int !== 1'b0)
9591
    begin
9592
      test_fail("WB INT signal should not be set");
9593
      fail = fail + 1;
9594
    end
9595
 
9596
    // write to phy's control register for 100Mbps
9597
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9598
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9599
    speed = 100;
9600
 
9601
    i_length = (min_tmp - 4);
9602
    while (i_length < (max_tmp - 4))
9603
    begin
9604
      // disable TX, set full-duplex mode, NO padding and CRC appending
9605
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9606
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9607
      // set IPGT register
9608
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9609
      // enable TX, set full-duplex mode, NO padding and CRC appending
9610
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9611
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9612
      // Reset_tx_bd enable interrupt generation
9613
      // unmask interrupts
9614
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9615
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9616
      // not detect carrier sense in FD and no collision
9617
      eth_phy.carrier_sense_tx_fd_detect(0);
9618
      eth_phy.collision(0);
9619
      // first destination address on ethernet PHY
9620
      eth_phy.set_tx_mem_addr(0);
9621
      // prepare BDs
9622
      if (num_of_bd == 0)
9623
      begin
9624
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9625
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9626
        set_tx_bd_wrap(1);
9627
        set_tx_bd_ready(0, 0);
9628
        set_tx_bd_ready(1, 1);
9629
      end
9630
      // CHECK END OF TWO TRANSMITIONs
9631
      // wait for first transmit to end
9632
      check_tx_bd(num_of_bd, data);
9633
      wait (MTxEn === 1'b1); // start transmit
9634
      if (data[15] !== 1)
9635
      begin
9636
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9637
        fail = fail + 1;
9638
      end
9639
      wait (MTxEn === 1'b0); // end transmit
9640
      num_of_frames = num_of_frames + 1;
9641
      num_of_bd = num_of_bd + 1;
9642
      #Tp;
9643
      // destination address on ethernet PHY
9644
      eth_phy.set_tx_mem_addr(0);
9645
      i1 = 0;
9646
      i2 = 0;
9647
      // count IPG clock periods
9648
      fork
9649
        begin
9650
          wait (MTxEn === 1'b1); // start second transmit
9651
          #Tp;
9652
          disable count_rising1;
9653
          disable count_falling1;
9654
        end
9655
        begin: count_rising1
9656
          forever
9657
          begin
9658
            @(posedge mtx_clk);
9659
            i1 = i1 + 1;
9660
            #Tp;
9661
          end
9662
        end
9663
        begin: count_falling1
9664
          forever
9665
          begin
9666
            @(negedge mtx_clk);
9667
            i2 = i2 + 1;
9668
            #Tp;
9669
          end
9670
        end
9671
      join
9672
      // check IPG length - INTERMEDIATE DISPLAYS
9673
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9674
      begin
9675
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9676
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9677
      end
9678
      else
9679
      begin
9680
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9681
        fail = fail + 1;
9682
        test_fail("IPG is not correct");
9683
      end
9684
      // wait for second transmit to end
9685
      wait (MTxEn === 1'b0); // end second transmit
9686
      while (data[15] === 1)
9687
      begin
9688
        check_tx_bd(num_of_bd, data);
9689
        @(posedge wb_clk);
9690
      end
9691
      repeat (1) @(posedge wb_clk);
9692
      // check length of a second PACKET
9693
      tmp_len = eth_phy.tx_len;
9694
      #1;
9695
      if (tmp_len != (i_length + 4 + 1))
9696
      begin
9697
        test_fail("Wrong length of second packet out from MAC");
9698
        fail = fail + 1;
9699
      end
9700
      // checking second packet
9701
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9702
      if (tmp > 0)
9703
      begin
9704
        test_fail("Wrong data of second transmitted packet");
9705
        fail = fail + 1;
9706
      end
9707
      // check second transmited TX packet CRC
9708
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9709
      if (tmp > 0)
9710
      begin
9711
        test_fail("Wrong CRC of second transmitted packet");
9712
        fail = fail + 1;
9713
      end
9714
      // check WB INT signal
9715
      if (wb_int !== 1'b1)
9716
      begin
9717
        `TIME; $display("*E WB INT signal should be set");
9718
        test_fail("WB INT signal should be set");
9719
        fail = fail + 1;
9720
      end
9721
      // check TX buffer descriptor of a packet
9722
      check_tx_bd(num_of_bd, data);
9723
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9724
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9725
      begin
9726
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9727
        test_fail("TX buffer descriptor status is not correct");
9728
        fail = fail + 1;
9729
      end
9730
      // check interrupts
9731
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9732
      if ((data & `ETH_INT_TXB) !== 1'b1)
9733
      begin
9734
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9735
        test_fail("Interrupt Transmit Buffer was not set");
9736
        fail = fail + 1;
9737
      end
9738
      if ((data & (~`ETH_INT_TXB)) !== 0)
9739
      begin
9740
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9741
        test_fail("Other interrupts (except Transmit Buffer) were set");
9742
        fail = fail + 1;
9743
      end
9744
      // clear interrupts
9745
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9746
      // check WB INT signal
9747
      if (wb_int !== 1'b0)
9748
      begin
9749
        test_fail("WB INT signal should not be set");
9750
        fail = fail + 1;
9751
      end
9752
      // set length (LOOP variable)
9753
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9754
        i_length = i_length + 2;
9755
      else
9756
        i_length = (max_tmp - 4);
9757
      // set IPGT
9758
      if ((tmp_ipgt + 3) < 10)
9759
        tmp_ipgt = tmp_ipgt + 1;
9760
      else if ((tmp_ipgt + 3) < 24)
9761
        tmp_ipgt = tmp_ipgt + 7;
9762
      else if ((tmp_ipgt + 3) == 24)
9763
        tmp_ipgt = 38 - 3;
9764
      else if ((tmp_ipgt + 3) == 38)
9765
        tmp_ipgt = 72 - 3;
9766
      else if ((tmp_ipgt + 3) == 72)
9767
        tmp_ipgt = 130 - 3; // 124 - 3
9768
      // the number of frame transmitted
9769
      num_of_frames = num_of_frames + 1;
9770
      num_of_bd = 0;
9771
      @(posedge wb_clk);
9772
    end
9773
    // disable TX
9774
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9775
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9776
    @(posedge wb_clk);
9777
    if(fail == 0)
9778
      test_ok;
9779
    else
9780
      fail = 0;
9781
  end
9782
 
9783
 
9784
  ////////////////////////////////////////////////////////////////////
9785
  ////                                                            ////
9786
  ////  Test transmit packets after TX under-run on each packet's ////
9787
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
9788
  ////                                                            ////
9789
  ////////////////////////////////////////////////////////////////////
9790
  if (test_num == 20) // without padding
9791
  begin
9792
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
9793
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
9794
    `TIME;
9795
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
9796
 
9797
    // reset MAC registers
9798
    hard_reset;
9799
    // reset MAC and MII LOGIC with soft reset
9800
    reset_mac;
9801
    reset_mii;
9802
    // set wb slave response
9803
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9804
 
9805
    max_tmp = 0;
9806
    min_tmp = 0;
9807
    // set 2 TX buffer descriptors - must be set before TX enable
9808
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9809
    // enable TX, set full-duplex mode, NO padding and CRC appending
9810
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9811
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9812
    // prepare a packet of MAXFL length
9813
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9814
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9815
    min_tmp = tmp[31:16];
9816
    st_data = 8'h99;
9817
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9818
    // read IPG value
9819
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9820
    // check WB INT signal
9821
    if (wb_int !== 1'b0)
9822
    begin
9823
      test_fail("WB INT signal should not be set");
9824
      fail = fail + 1;
9825
    end
9826
 
9827
    // write to phy's control register for 10Mbps
9828
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9829
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9830
    speed = 10;
9831
 
9832 223 tadejm
    num_of_frames = 40; // (0..3) => start under-run on first word
9833 209 tadejm
    num_of_bd = 0;
9834
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
9835
    i_length = (min_tmp + 4);
9836
    while (i_length < (max_tmp - 4))
9837
    begin
9838
      // Reset_tx_bd enable interrupt generation
9839
      // unmask interrupts
9840
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9841
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9842
      // not detect carrier sense in FD and no collision
9843
      eth_phy.carrier_sense_tx_fd_detect(0);
9844
      eth_phy.collision(0);
9845
      // first destination address on ethernet PHY
9846
      eth_phy.set_tx_mem_addr(0);
9847
      // prepare BDs
9848
      if (num_of_bd == 0)
9849
      begin
9850
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
9851
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9852
        set_tx_bd_wrap(1);
9853
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9854
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9855 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9856 209 tadejm
        set_tx_bd_ready(1, 1);
9857
        set_tx_bd_ready(0, 0);
9858
      end
9859
      // frame under-run checking
9860
      frame_started = 0;
9861
      frame_ended = 0;
9862
      wait_for_frame = 0;
9863
      fork
9864
        begin
9865
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
9866
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
9867
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
9868
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
9869
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9870
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9871 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
9872 209 tadejm
          // wait for synchronization and some additional clocks
9873
          wait_for_frame = 1;
9874
          // wait for frame
9875
          wait ((wait_for_frame == 0) || (frame_started == 1))
9876
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
9877
          begin
9878
            disable check_fr;
9879
          end
9880
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
9881
          begin
9882
            disable wait_fr;
9883
            wait (frame_ended == 1);
9884
          end
9885
          repeat (2) @(posedge wb_clk);
9886
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
9887
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
9888 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
9889 209 tadejm
        end
9890
        begin: wait_fr
9891
          wait (wait_for_frame == 1)
9892
          begin
9893
            // wait for synchronization and some additional clocks
9894
            repeat (3) @(posedge wb_clk);
9895
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
9896
            repeat (2) @(posedge wb_clk);
9897
            repeat (2) @(posedge mtx_clk);
9898
            wait_for_frame = 0;
9899
          end
9900
        end
9901
        begin: check_fr
9902
          // wait for frame to start
9903
          @(posedge MTxEn);
9904
          frame_started = 1;
9905 223 tadejm
`TIME; $display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
9906 209 tadejm
          // wait for frame to end due to under-run
9907
          @(negedge MTxEn);
9908
          frame_ended = 1;
9909 223 tadejm
`TIME; $display("  Under-run frame ended");
9910 209 tadejm
        end
9911
      join
9912
      // wait for first transmit to end, if under-run didn't happen
9913
      if (frame_ended == 0)
9914
      begin
9915
        // WAIT FOR FIRST TRANSMIT
9916
        check_tx_bd(num_of_bd, data);
9917
        wait (MTxEn === 1'b1); // start first transmit
9918
        if (data[15] !== 1)
9919
        begin
9920
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9921
          fail = fail + 1;
9922
        end
9923
        wait (MTxEn === 1'b0); // end first transmit
9924
        while (data[15] === 1)
9925
        begin
9926
          check_tx_bd(num_of_bd, data);
9927
          @(posedge wb_clk);
9928
        end
9929
        repeat (1) @(posedge wb_clk);
9930
        // CHECK FIRST FRAME
9931
        // check length of a first PACKET
9932
        tmp_len = eth_phy.tx_len;
9933
        #1;
9934
        if (tmp_len != (i_length + 4))
9935
        begin
9936 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
9937
          test_fail("Wrong length of first packet out from MAC");
9938 209 tadejm
          fail = fail + 1;
9939
        end
9940
        // checking first packet
9941
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
9942
        if (tmp > 0)
9943
        begin
9944 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
9945
          test_fail("Wrong data of first transmitted packet");
9946 209 tadejm
          fail = fail + 1;
9947
        end
9948
        // check first transmited TX packet CRC
9949
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
9950
        if (tmp > 0)
9951
        begin
9952 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
9953
          test_fail("Wrong CRC of first transmitted packet");
9954 209 tadejm
          fail = fail + 1;
9955
        end
9956
        // check WB INT signal
9957
        if (wb_int !== 1'b1)
9958
        begin
9959
          `TIME; $display("*E WB INT signal should be set");
9960
          test_fail("WB INT signal should be set");
9961
          fail = fail + 1;
9962
        end
9963
        // check TX buffer descriptor of a packet
9964
        check_tx_bd(num_of_bd, data);
9965
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9966
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9967
        begin
9968
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9969
          test_fail("TX buffer descriptor status is not correct");
9970
          fail = fail + 1;
9971
        end
9972
        // check interrupts
9973
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9974
        if ((data & `ETH_INT_TXB) !== 1'b1)
9975
        begin
9976
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9977
          test_fail("Interrupt Transmit Buffer was not set");
9978
          fail = fail + 1;
9979
        end
9980
        if ((data & (~`ETH_INT_TXB)) !== 0)
9981
        begin
9982
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9983
          test_fail("Other interrupts (except Transmit Buffer) were set");
9984
          fail = fail + 1;
9985
        end
9986
        // clear interrupts
9987
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9988
        // check WB INT signal
9989
        if (wb_int !== 1'b0)
9990
        begin
9991
          test_fail("WB INT signal should not be set");
9992
          fail = fail + 1;
9993
        end
9994
      end
9995 223 tadejm
      else
9996
      begin
9997
        // CHECK FIRST FRAME
9998
        // check length of a first PACKET
9999
        tmp_len = eth_phy.tx_len_err;
10000
        #1;
10001
        if (tmp_len != (num_of_frames + (4 - i_data)))
10002
        begin
10003
          `TIME; $display("*E Wrong length of first packet out from MAC");
10004
          test_fail("Wrong length of first packet out from MAC");
10005
          fail = fail + 1;
10006
        end
10007
        // checking first packet
10008
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10009
        if (tmp > 0)
10010
        begin
10011
          `TIME; $display("*E Wrong data of first transmitted packet");
10012
          test_fail("Wrong data of first transmitted packet");
10013
          fail = fail + 1;
10014
        end
10015
        // check WB INT signal
10016
        if (wb_int !== 1'b1)
10017
        begin
10018
          `TIME; $display("*E WB INT signal should be set");
10019
          test_fail("WB INT signal should be set");
10020
          fail = fail + 1;
10021
        end
10022
        // check TX buffer descriptor of a packet
10023
        check_tx_bd(num_of_bd, data);
10024
        if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10025
             ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10026
        begin
10027
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10028
          test_fail("TX buffer descriptor status is not correct");
10029
          fail = fail + 1;
10030
        end
10031
        // check interrupts
10032
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10033
        if ((data & `ETH_INT_TXE) !== 2'b10)
10034
        begin
10035
          `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10036
          test_fail("Interrupt Transmit Buffer was not set");
10037
          fail = fail + 1;
10038
        end
10039
        if ((data & (~`ETH_INT_TXE)) !== 0)
10040
        begin
10041
          `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10042
          test_fail("Other interrupts (except Transmit Buffer) were set");
10043
          fail = fail + 1;
10044
        end
10045
        // clear interrupts
10046
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10047
        // check WB INT signal
10048
        if (wb_int !== 1'b0)
10049
        begin
10050
          test_fail("WB INT signal should not be set");
10051
          fail = fail + 1;
10052
        end
10053
      end
10054 209 tadejm
      num_of_bd = num_of_bd + 1;
10055
      // destination address on ethernet PHY
10056
      eth_phy.set_tx_mem_addr(0);
10057 223 tadejm
      // WAIT FOR SECOND TRANSMIT
10058 209 tadejm
      check_tx_bd(num_of_bd, data);
10059
      wait (MTxEn === 1'b1); // start first transmit
10060
      if (data[15] !== 1)
10061
      begin
10062
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10063
        fail = fail + 1;
10064
      end
10065
      wait (MTxEn === 1'b0); // end first transmit
10066
      while (data[15] === 1)
10067
      begin
10068
        check_tx_bd(num_of_bd, data);
10069
        @(posedge wb_clk);
10070
      end
10071
      repeat (1) @(posedge wb_clk);
10072
      // CHECK SECOND FRAME
10073
      // check length of a second PACKET
10074 223 tadejm
if (frame_ended == 1'b1)
10075
begin
10076
`TIME; $display("  Second frame after under-run ended");
10077
end
10078 209 tadejm
      tmp_len = eth_phy.tx_len;
10079
      #1;
10080
      if (tmp_len != (i_length + 4))
10081
      begin
10082 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10083 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10084
        fail = fail + 1;
10085
      end
10086
      // checking second packet
10087
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10088
      if (tmp > 0)
10089
      begin
10090 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10091 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10092
        fail = fail + 1;
10093
      end
10094
      // check second transmited TX packet CRC
10095
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10096
      if (tmp > 0)
10097
      begin
10098 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10099 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10100
        fail = fail + 1;
10101
      end
10102
      // check WB INT signal
10103
      if (wb_int !== 1'b1)
10104
      begin
10105
        `TIME; $display("*E WB INT signal should be set");
10106
        test_fail("WB INT signal should be set");
10107
        fail = fail + 1;
10108
      end
10109
      // check TX buffer descriptor of a packet
10110
      check_tx_bd(num_of_bd, data);
10111
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10112
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10113
      begin
10114
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10115
        test_fail("TX buffer descriptor status is not correct");
10116
        fail = fail + 1;
10117
      end
10118
      // check interrupts
10119
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10120
      if ((data & `ETH_INT_TXB) !== 1'b1)
10121
      begin
10122
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10123
        test_fail("Interrupt Transmit Buffer was not set");
10124
        fail = fail + 1;
10125
      end
10126
      if ((data & (~`ETH_INT_TXB)) !== 0)
10127
      begin
10128
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10129
        test_fail("Other interrupts (except Transmit Buffer) were set");
10130
        fail = fail + 1;
10131
      end
10132
      // clear interrupts
10133
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10134
      // check WB INT signal
10135
      if (wb_int !== 1'b0)
10136
      begin
10137
        test_fail("WB INT signal should not be set");
10138
        fail = fail + 1;
10139
      end
10140
      // set initial value
10141
      i_data = i_data - 1;
10142
      // the number of frame transmitted
10143
      num_of_frames = num_of_frames + 1;
10144
      num_of_bd = 0;
10145
      // set length (LOOP variable)
10146 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10147 209 tadejm
        i_length = (max_tmp - 4);
10148
      @(posedge wb_clk);
10149
    end
10150
    // disable TX
10151
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10152
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10153
    @(posedge wb_clk);
10154
    if(fail == 0)
10155
      test_ok;
10156
    else
10157
      fail = 0;
10158
  end
10159
 
10160
 
10161
  ////////////////////////////////////////////////////////////////////
10162
  ////                                                            ////
10163
  ////  Test transmit packets after TX under-run on each packet's ////
10164
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10165
  ////                                                            ////
10166
  ////////////////////////////////////////////////////////////////////
10167
  if (test_num == 21) // without padding
10168
  begin
10169
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10170
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10171
    `TIME;
10172
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10173
 
10174
    // reset MAC registers
10175
    hard_reset;
10176
    // reset MAC and MII LOGIC with soft reset
10177
    reset_mac;
10178
    reset_mii;
10179
    // set wb slave response
10180
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10181
 
10182
    max_tmp = 0;
10183
    min_tmp = 0;
10184
    // set 2 TX buffer descriptors - must be set before TX enable
10185
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10186
    // enable TX, set full-duplex mode, NO padding and CRC appending
10187
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10188
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10189
    // prepare a packet of MAXFL length
10190
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10191
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10192
    min_tmp = tmp[31:16];
10193
    st_data = 8'h99;
10194
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10195
    // read IPG value
10196
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10197
    // check WB INT signal
10198
    if (wb_int !== 1'b0)
10199
    begin
10200
      test_fail("WB INT signal should not be set");
10201
      fail = fail + 1;
10202
    end
10203
 
10204
    // write to phy's control register for 100Mbps
10205
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10206
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10207
    speed = 100;
10208
 
10209
    num_of_frames = 0; // (0..3) => start under-run on first word
10210
    num_of_bd = 0;
10211
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10212
    i_length = (min_tmp + 4);
10213
    while (i_length < (max_tmp - 4))
10214
    begin
10215
      // Reset_tx_bd enable interrupt generation
10216
      // unmask interrupts
10217
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10218
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10219
      // not detect carrier sense in FD and no collision
10220
      eth_phy.carrier_sense_tx_fd_detect(0);
10221
      eth_phy.collision(0);
10222
      // first destination address on ethernet PHY
10223
      eth_phy.set_tx_mem_addr(0);
10224
      // prepare BDs
10225
      if (num_of_bd == 0)
10226
      begin
10227
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10228
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10229
        set_tx_bd_wrap(1);
10230
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10231
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10232
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10233
        set_tx_bd_ready(1, 1);
10234
        set_tx_bd_ready(0, 0);
10235
      end
10236
      // frame under-run checking
10237
      frame_started = 0;
10238
      frame_ended = 0;
10239
      wait_for_frame = 0;
10240
      fork
10241
        begin
10242
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10243
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10244
          repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
10245
          @(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
10246
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10247
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10248
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h7, 8'hFF);
10249
          // wait for synchronization and some additional clocks
10250
          wait_for_frame = 1;
10251
          // wait for frame
10252
          wait ((wait_for_frame == 0) || (frame_started == 1))
10253
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10254
          begin
10255
            disable check_fr1;
10256
          end
10257
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10258
          begin
10259
            disable wait_fr1;
10260
            wait (frame_ended == 1);
10261
          end
10262
          repeat (2) @(posedge wb_clk);
10263
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10264
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10265
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
10266
        end
10267
        begin: wait_fr1
10268
          wait (wait_for_frame == 1)
10269
          begin
10270
            // wait for synchronization and some additional clocks
10271
            repeat (3) @(posedge wb_clk);
10272
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10273
            repeat (2) @(posedge wb_clk);
10274
            repeat (2) @(posedge mtx_clk);
10275
            wait_for_frame = 0;
10276
          end
10277
        end
10278
        begin: check_fr1
10279
          // wait for frame to start
10280
          @(posedge MTxEn);
10281
          frame_started = 1;
10282
$display("  Under-run (on %0d. byte) frame started", (num_of_frames + 1));
10283
          // wait for frame to end due to under-run
10284
          @(negedge MTxEn);
10285
          frame_ended = 1;
10286
$display("  Under-run frame ended");
10287
        end
10288
      join
10289
      // wait for first transmit to end, if under-run didn't happen
10290
      if (frame_ended == 0)
10291
      begin
10292
        // WAIT FOR FIRST TRANSMIT
10293
        check_tx_bd(num_of_bd, data);
10294
        wait (MTxEn === 1'b1); // start first transmit
10295
        if (data[15] !== 1)
10296
        begin
10297
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10298
          fail = fail + 1;
10299
        end
10300
        wait (MTxEn === 1'b0); // end first transmit
10301
        while (data[15] === 1)
10302
        begin
10303
          check_tx_bd(num_of_bd, data);
10304
          @(posedge wb_clk);
10305
        end
10306
        repeat (1) @(posedge wb_clk);
10307
        // CHECK FIRST FRAME
10308
        // check length of a first PACKET
10309
        tmp_len = eth_phy.tx_len;
10310
        #1;
10311
        if (tmp_len != (i_length + 4))
10312
        begin
10313
          test_fail("Wrong length of second packet out from MAC");
10314
          fail = fail + 1;
10315
        end
10316
        // checking first packet
10317
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10318
        if (tmp > 0)
10319
        begin
10320
          test_fail("Wrong data of second transmitted packet");
10321
          fail = fail + 1;
10322
        end
10323
        // check first transmited TX packet CRC
10324
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10325
        if (tmp > 0)
10326
        begin
10327
          test_fail("Wrong CRC of second transmitted packet");
10328
          fail = fail + 1;
10329
        end
10330
        // check WB INT signal
10331
        if (wb_int !== 1'b1)
10332
        begin
10333
          `TIME; $display("*E WB INT signal should be set");
10334
          test_fail("WB INT signal should be set");
10335
          fail = fail + 1;
10336
        end
10337
        // check TX buffer descriptor of a packet
10338
        check_tx_bd(num_of_bd, data);
10339
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10340
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10341
        begin
10342
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10343
          test_fail("TX buffer descriptor status is not correct");
10344
          fail = fail + 1;
10345
        end
10346
        // check interrupts
10347
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10348
        if ((data & `ETH_INT_TXB) !== 1'b1)
10349
        begin
10350
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10351
          test_fail("Interrupt Transmit Buffer was not set");
10352
          fail = fail + 1;
10353
        end
10354
        if ((data & (~`ETH_INT_TXB)) !== 0)
10355
        begin
10356
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10357
          test_fail("Other interrupts (except Transmit Buffer) were set");
10358
          fail = fail + 1;
10359
        end
10360
        // clear interrupts
10361
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10362
        // check WB INT signal
10363
        if (wb_int !== 1'b0)
10364
        begin
10365
          test_fail("WB INT signal should not be set");
10366
          fail = fail + 1;
10367
        end
10368
      end
10369
      num_of_bd = num_of_bd + 1;
10370
      // destination address on ethernet PHY
10371
      eth_phy.set_tx_mem_addr(0);
10372
      // WAIT FOR FIRST TRANSMIT
10373
      check_tx_bd(num_of_bd, data);
10374
      wait (MTxEn === 1'b1); // start first transmit
10375
      if (data[15] !== 1)
10376
      begin
10377
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10378
        fail = fail + 1;
10379
      end
10380
      wait (MTxEn === 1'b0); // end first transmit
10381
      while (data[15] === 1)
10382
      begin
10383
        check_tx_bd(num_of_bd, data);
10384
        @(posedge wb_clk);
10385
      end
10386
      repeat (1) @(posedge wb_clk);
10387
      // CHECK SECOND FRAME
10388
      // check length of a second PACKET
10389
      tmp_len = eth_phy.tx_len;
10390
      #1;
10391
      if (tmp_len != (i_length + 4))
10392
      begin
10393
        test_fail("Wrong length of second packet out from MAC");
10394
        fail = fail + 1;
10395
      end
10396
      // checking second packet
10397
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10398
      if (tmp > 0)
10399
      begin
10400
        test_fail("Wrong data of second transmitted packet");
10401
        fail = fail + 1;
10402
      end
10403
      // check second transmited TX packet CRC
10404
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10405
      if (tmp > 0)
10406
      begin
10407
        test_fail("Wrong CRC of second transmitted packet");
10408
        fail = fail + 1;
10409
      end
10410
      // check WB INT signal
10411
      if (wb_int !== 1'b1)
10412
      begin
10413
        `TIME; $display("*E WB INT signal should be set");
10414
        test_fail("WB INT signal should be set");
10415
        fail = fail + 1;
10416
      end
10417
      // check TX buffer descriptor of a packet
10418
      check_tx_bd(num_of_bd, data);
10419
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10420
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10421
      begin
10422
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10423
        test_fail("TX buffer descriptor status is not correct");
10424
        fail = fail + 1;
10425
      end
10426
      // check interrupts
10427
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10428
      if ((data & `ETH_INT_TXB) !== 1'b1)
10429
      begin
10430
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10431
        test_fail("Interrupt Transmit Buffer was not set");
10432
        fail = fail + 1;
10433
      end
10434
      if ((data & (~`ETH_INT_TXB)) !== 0)
10435
      begin
10436
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10437
        test_fail("Other interrupts (except Transmit Buffer) were set");
10438
        fail = fail + 1;
10439
      end
10440
      // clear interrupts
10441
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10442
      // check WB INT signal
10443
      if (wb_int !== 1'b0)
10444
      begin
10445
        test_fail("WB INT signal should not be set");
10446
        fail = fail + 1;
10447
      end
10448
      // set initial value
10449
      i_data = i_data - 1;
10450
      // the number of frame transmitted
10451
      num_of_frames = num_of_frames + 1;
10452
      num_of_bd = 0;
10453
      // set length (LOOP variable)
10454
      if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
10455
        i_length = (max_tmp - 4);
10456
      @(posedge wb_clk);
10457
    end
10458
    // disable TX
10459
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10460
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10461
    @(posedge wb_clk);
10462
    if(fail == 0)
10463
      test_ok;
10464
    else
10465
      fail = 0;
10466
  end
10467
 
10468 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
10469 169 mohor
 
10470
end
10471
endtask // test_mac_full_duplex_transmit
10472
 
10473
 
10474 209 tadejm
task test_mac_full_duplex_receive;
10475
  input  [31:0]  start_task;
10476
  input  [31:0]  end_task;
10477
  integer        bit_start_1;
10478
  integer        bit_end_1;
10479
  integer        bit_start_2;
10480
  integer        bit_end_2;
10481
  integer        num_of_reg;
10482
  integer        num_of_frames;
10483
  integer        num_of_bd;
10484
  integer        i_addr;
10485
  integer        i_data;
10486
  integer        i_length;
10487
  integer        tmp_len;
10488
  integer        tmp_bd;
10489
  integer        tmp_bd_num;
10490
  integer        tmp_data;
10491
  integer        tmp_ipgt;
10492
  integer        test_num;
10493
  reg    [31:0]  tx_bd_num;
10494
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
10495
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
10496
  integer        i;
10497
  integer        i1;
10498
  integer        i2;
10499
  integer        i3;
10500
  integer        fail;
10501
  integer        speed;
10502
  reg            frame_started;
10503
  reg            frame_ended;
10504
  reg            wait_for_frame;
10505 243 tadejm
  reg            check_frame;
10506
  reg            stop_checking_frame;
10507
  reg            first_fr_received;
10508 209 tadejm
  reg    [31:0]  addr;
10509
  reg    [31:0]  data;
10510
  reg    [31:0]  tmp;
10511
  reg    [ 7:0]  st_data;
10512
  reg    [15:0]  max_tmp;
10513
  reg    [15:0]  min_tmp;
10514
begin
10515
// MAC FULL DUPLEX RECEIVE TEST
10516
test_heading("MAC FULL DUPLEX RECEIVE TEST");
10517
$display(" ");
10518
$display("MAC FULL DUPLEX RECEIVE TEST");
10519
fail = 0;
10520
 
10521
// reset MAC registers
10522
hard_reset;
10523
// reset MAC and MII LOGIC with soft reset
10524
reset_mac;
10525
reset_mii;
10526
// set wb slave response
10527
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10528
 
10529
  /*
10530
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
10531
  -------------------------------------------------------------------------------------
10532
  set_tx_bd
10533
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
10534
  set_tx_bd_wrap
10535
    (tx_bd_num_end[6:0]);
10536
  set_tx_bd_ready
10537
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10538
  check_tx_bd
10539
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
10540
  clear_tx_bd
10541
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10542
 
10543
  TASKS for set and control RX buffer descriptors:
10544
  ------------------------------------------------
10545
  set_rx_bd
10546
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
10547
  set_rx_bd_wrap
10548
    (rx_bd_num_end[6:0]);
10549
  set_rx_bd_empty
10550
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10551
  check_rx_bd
10552
    (rx_bd_num_end[6:0], rx_bd_status);
10553
  clear_rx_bd
10554
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10555
 
10556
  TASKS for set and check TX packets:
10557
  -----------------------------------
10558
  set_tx_packet
10559
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
10560
  check_tx_packet
10561
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
10562
 
10563
  TASKS for set and check RX packets:
10564
  -----------------------------------
10565
  set_rx_packet
10566
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
10567
  check_rx_packet
10568
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
10569
 
10570
  TASKS for append and check CRC to/of TX packet:
10571
  -----------------------------------------------
10572
  append_tx_crc
10573
    (txpnt_wb[31:0], len[15:0], negated_crc);
10574
  check_tx_crc
10575
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
10576
 
10577
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
10578
  --------------------------------------------------------------------------------
10579
  append_rx_crc
10580
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
10581
  */
10582
 
10583
//////////////////////////////////////////////////////////////////////
10584
////                                                              ////
10585
////  test_mac_full_duplex_receive:                               ////
10586
////                                                              ////
10587
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
10588
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
10589 243 tadejm
////  2: Test receive packet synchronization with receive         ////
10590
////     disable/enable ( 10Mbps ).                               ////
10591
////  3: Test receive packet synchronization with receive         ////
10592
////     disable/enable ( 100Mbps ).                              ////
10593
////  4: Test receive packets form MINFL to MAXFL sizes at        ////
10594 209 tadejm
////     one RX buffer decriptor ( 10Mbps ).                      ////
10595 243 tadejm
////  5: Test receive packets form MINFL to MAXFL sizes at        ////
10596 209 tadejm
////     one RX buffer decriptor ( 100Mbps ).                     ////
10597
////                                                              ////
10598
//////////////////////////////////////////////////////////////////////
10599
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
10600
begin
10601
 
10602
  ////////////////////////////////////////////////////////////////////
10603
  ////                                                            ////
10604
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
10605
  ////                                                            ////
10606
  ////////////////////////////////////////////////////////////////////
10607
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
10608
  begin
10609
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
10610
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
10611
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
10612
 
10613
    // unmask interrupts
10614
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10615
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10616
    // set all buffer descriptors to TX - must be set before RX enable
10617
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10618 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10619 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10620
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10621
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10622
 
10623
    // write to phy's control register for 10Mbps
10624
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10625
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10626
    speed = 10;
10627
 
10628
    i = 0;
10629
    while (i < 128)
10630
    begin
10631
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10632
      begin
10633
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10634
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10635
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10636
      end
10637
      set_rx_bd_wrap(i);
10638
      set_rx_bd_empty(0, i);
10639
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10640
      begin
10641
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10642
        repeat(10) @(posedge mrx_clk);
10643
      end
10644
      @(posedge mrx_clk);
10645
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10646
      begin
10647
        check_rx_bd(0, tmp);
10648
        #1;
10649
        if (tmp[15] === 1'b0)
10650
        begin
10651
          test_fail("Receive should not start at all");
10652
          fail = fail + 1;
10653
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10654
        end
10655
        if (tmp[7:0] !== 0)
10656
        begin
10657
          test_fail("Receive should not be finished since it should not start at all");
10658
          fail = fail + 1;
10659
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10660
        end
10661
        @(posedge wb_clk);
10662
      end
10663
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10664
      if (tmp[6:0] !== 0)
10665
      begin
10666
        test_fail("Receive should not get INT since it should not start at all");
10667
        fail = fail + 1;
10668
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10669
      end
10670
      clear_rx_bd(0, i);
10671
      if ((i < 5) || (i > 124))
10672
        i = i + 1;
10673
      else
10674
        i = i + 120;
10675
    end
10676
    // disable RX
10677
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10678
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10679
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10680
    if(fail == 0)
10681
      test_ok;
10682
    else
10683
      fail = 0;
10684
  end
10685
 
10686
 
10687
  ////////////////////////////////////////////////////////////////////
10688
  ////                                                            ////
10689
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
10690
  ////                                                            ////
10691
  ////////////////////////////////////////////////////////////////////
10692
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
10693
  begin
10694
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
10695
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
10696
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
10697
 
10698
    // unmask interrupts
10699
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10700
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10701
    // set all buffer descriptors to TX - must be set before RX enable
10702
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10703 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
10704 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10705
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10706
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10707
 
10708
    // write to phy's control register for 100Mbps
10709
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10710
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
10711
    speed = 100;
10712
 
10713
    i = 0;
10714
    while (i < 128)
10715
    begin
10716
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10717
      begin
10718
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
10719
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
10720
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
10721
      end
10722
      set_rx_bd_wrap(i);
10723
      set_rx_bd_empty(0, i);
10724
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
10725
      begin
10726
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
10727
        repeat(10) @(posedge mrx_clk);
10728
      end
10729
      @(posedge mrx_clk);
10730
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
10731
      begin
10732
        check_rx_bd(0, tmp);
10733
        #1;
10734
        if (tmp[15] === 1'b0)
10735
        begin
10736
          test_fail("Receive should not start at all");
10737
          fail = fail + 1;
10738
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
10739
        end
10740
        if (tmp[7:0] !== 0)
10741
        begin
10742
          test_fail("Receive should not be finished since it should not start at all");
10743
          fail = fail + 1;
10744
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
10745
        end
10746
        @(posedge wb_clk);
10747
      end
10748
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10749
      if (tmp[6:0] !== 0)
10750
      begin
10751
        test_fail("Receive should not get INT since it should not start at all");
10752
        fail = fail + 1;
10753
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
10754
      end
10755
      clear_rx_bd(0, i);
10756
      if ((i < 5) || (i > 124))
10757
        i = i + 1;
10758
      else
10759
        i = i + 120;
10760
    end
10761
    // disable RX
10762
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
10763
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10764
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10765
    if(fail == 0)
10766
      test_ok;
10767
    else
10768
      fail = 0;
10769
  end
10770
 
10771
 
10772
  ////////////////////////////////////////////////////////////////////
10773
  ////                                                            ////
10774 243 tadejm
  ////  Test receive packet synchronization with receive          ////
10775
  ////  disable/enable ( 10Mbps ).                                ////
10776
  ////                                                            ////
10777
  ////////////////////////////////////////////////////////////////////
10778
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
10779
  begin
10780
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
10781
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
10782
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
10783
 
10784
    // unmask interrupts
10785
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10786
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10787
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
10788
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10789
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
10790
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
10791
              `ETH_MODER_PRO | `ETH_MODER_BRO,
10792
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10793
    // prepare two packets of MAXFL length
10794
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10795
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10796
    min_tmp = tmp[31:16];
10797
    st_data = 8'h0F;
10798
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
10799
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
10800
    st_data = 8'h1A;
10801
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
10802
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
10803
    // check WB INT signal
10804
    if (wb_int !== 1'b0)
10805
    begin
10806
      test_fail("WB INT signal should not be set");
10807
      fail = fail + 1;
10808
    end
10809
 
10810
    // write to phy's control register for 10Mbps
10811
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10812
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10813
    speed = 10;
10814
 
10815
    frame_started = 0;
10816
    frame_ended = 0;
10817
    wait_for_frame = 0;
10818
    check_frame = 0;
10819
    stop_checking_frame = 0;
10820
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
10821
 
10822
    num_of_frames = 0; // 
10823
    num_of_bd = 0;
10824
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
10825
    while (i_length < (max_tmp - 4))
10826
    begin
10827
      // choose generating carrier sense and collision 
10828
      case (num_of_frames[1:0])
10829
      2'h0: // Interrupt is generated
10830
      begin
10831
        // enable interrupt generation
10832
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10833
        // not detect carrier sense in FD and no collision
10834
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10835
        eth_phy.collision(0);
10836
      end
10837
      2'h1: // Interrupt is generated
10838
      begin
10839
        // enable interrupt generation
10840
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10841
        // detect carrier sense in FD and no collision
10842
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10843
        eth_phy.collision(0);
10844
      end
10845
      2'h2: // Interrupt is generated
10846
      begin
10847
        // disable interrupt generation
10848
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10849
        // not detect carrier sense in FD and set collision
10850
        eth_phy.no_carrier_sense_rx_fd_detect(0);
10851
        eth_phy.collision(1);
10852
      end
10853
      default: // 2'h3: // Interrupt is generated
10854
      begin
10855
        // disable interrupt generation
10856
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
10857
        // detect carrier sense in FD and set collision
10858
        eth_phy.no_carrier_sense_rx_fd_detect(1);
10859
        eth_phy.collision(1);
10860
      end
10861
      endcase
10862
      // set wrap bit
10863
      set_rx_bd_wrap(118);
10864
      set_rx_bd_empty(118, 118);
10865
      check_frame = 0;
10866
      stop_checking_frame = 0;
10867
      tmp_data = 0;
10868
      fork
10869
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
10870
          if (num_of_frames[0] == 1'b0)
10871
          begin
10872
            repeat(1) @(posedge wb_clk);
10873
            if (num_of_frames[1] == 1'b0)
10874
            begin
10875
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
10876
            end
10877
            else
10878
            begin
10879
              @(posedge mrx_clk);
10880
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
10881
            end
10882
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
10883
            wbm_init_waits = 4'h0;
10884
            wbm_subseq_waits = 4'h0;
10885
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
10886
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
10887
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
10888
          end
10889
        end
10890
        begin // send a packet from PHY RX
10891
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
10892
          if (num_of_frames[1] == 1'b0)
10893
          begin
10894
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
10895
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
10896
          end
10897
          else
10898
          begin
10899
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
10900
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
10901
          end
10902
        end
10903
        begin: send_packet0
10904
          wait (MRxDV === 1'b1); // start transmit
10905
          wait (MRxDV === 1'b0); // end transmit
10906
          check_frame = 1;
10907
          repeat(10) @(posedge mrx_clk);
10908
          repeat(15) @(posedge wb_clk);
10909
          stop_checking_frame = 1;
10910
        end
10911
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
10912
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
10913
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
10914
          begin
10915
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
10916
          end
10917
          else if (MRxDV === 1'b1)
10918
          begin
10919
            while (eth_sl_wb_ack_o === 1'b0)
10920
            begin
10921
              @(posedge wb_clk);
10922
              tmp_data = tmp_data + 1;
10923
            end
10924
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
10925
          end
10926
          else if (eth_sl_wb_ack_o === 1'b1)
10927
          begin
10928
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
10929
            while (MRxDV === 1'b0)
10930
            begin
10931
              @(posedge wb_clk);
10932
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
10933
            end
10934
          end
10935
        end
10936
        begin // check packet
10937
          wait (check_frame == 1);
10938
          check_rx_bd(118, tmp_bd);
10939
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
10940
          begin
10941
            #1 check_rx_bd(118, tmp_bd);
10942
            @(posedge wb_clk);
10943
          end
10944
          if (num_of_frames[0] == 1'b0)
10945
          begin
10946
            if (tmp_bd[15] === 1)
10947
            begin
10948
              if (first_fr_received == 1)
10949
              begin
10950
                first_fr_received = 0;
10951
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
10952
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
10953
                $display("    From this moment:");
10954
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
10955
                if (tmp_data[31])
10956
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
10957
                else
10958
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
10959
              end
10960
            end
10961
          end
10962
          if (stop_checking_frame == 0)
10963
            disable send_packet0;
10964
        end
10965
      join
10966
      // ONLY IF packet was received!
10967
      if (tmp_bd[15] === 0)
10968
      begin
10969
        // check length of a PACKET
10970
        if (tmp_bd[31:16] != (i_length + 4))
10971
        begin
10972
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
10973
                          tmp_bd[31:16], (i_length + 4));
10974
          test_fail("Wrong length of the packet out from PHY");
10975
          fail = fail + 1;
10976
        end
10977
        // check received RX packet data and CRC
10978
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
10979
        begin
10980
          if (num_of_frames[1] == 1'b0)
10981
          begin
10982
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
10983
          end
10984
          else
10985
          begin
10986
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
10987
          end
10988
          if (tmp > 0)
10989
          begin
10990
            `TIME; $display("*E Wrong data of the received packet");
10991
            test_fail("Wrong data of the received packet");
10992
            fail = fail + 1;
10993
          end
10994
        end
10995
        else // if PREVIOUS RX buffer descriptor was ready
10996
        begin
10997
          if (num_of_frames[1] == 1'b0)
10998
          begin
10999
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11000
          end
11001
          else
11002
          begin
11003
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11004
          end
11005
          if (tmp > 0)
11006
          begin
11007
            `TIME; $display("*E Wrong data of the received packet");
11008
            test_fail("Wrong data of the received packet");
11009
            fail = fail + 1;
11010
          end
11011
        end
11012
      end
11013
      // check WB INT signal
11014
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11015
      begin
11016
        if (wb_int !== 1'b0)
11017
        begin
11018
          `TIME; $display("*E WB INT signal should not be set");
11019
          test_fail("WB INT signal should not be set");
11020
          fail = fail + 1;
11021
        end
11022
      end
11023
      else
11024
      begin
11025
        if (wb_int !== 1'b1)
11026
        begin
11027
          `TIME; $display("*E WB INT signal should be set");
11028
          test_fail("WB INT signal should be set");
11029
          fail = fail + 1;
11030
        end
11031
      end
11032
      // check RX buffer descriptor of a packet - only 15 LSBits
11033
      check_rx_bd(118, data);
11034
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11035
      begin
11036
        if (data[15:0] !== 16'hE000)
11037
        begin
11038
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11039
          test_fail("RX buffer descriptor status is not correct");
11040
          fail = fail + 1;
11041
        end
11042
      end
11043
      else // interrupt enabled
11044
      begin
11045
        if (data[15:0] !== 16'h6000)
11046
        begin
11047
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11048
          test_fail("RX buffer descriptor status is not correct");
11049
          fail = fail + 1;
11050
        end
11051
      end
11052
      // check interrupts
11053
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11054
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11055
      begin
11056
        if (data !== 0)
11057
        begin
11058
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11059
          test_fail("Any of interrupts was set");
11060
          fail = fail + 1;
11061
        end
11062
      end
11063
      else
11064
      begin
11065
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11066
        begin
11067
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11068
          test_fail("Interrupt Receive Buffer was not set");
11069
          fail = fail + 1;
11070
        end
11071
        if ((data & (~`ETH_INT_RXB)) !== 0)
11072
        begin
11073
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11074
          test_fail("Other interrupts (except Receive Buffer) were set");
11075
          fail = fail + 1;
11076
        end
11077
      end
11078
      // clear interrupts
11079
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11080
      // check WB INT signal
11081
      if (wb_int !== 1'b0)
11082
      begin
11083
        test_fail("WB INT signal should not be set");
11084
        fail = fail + 1;
11085
      end
11086
      // disable RX after two packets
11087
      if (num_of_frames[0] == 1'b1)
11088
      begin
11089
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11090
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11091
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11092
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11093
      end
11094
      // the number of frame transmitted
11095
      num_of_frames = num_of_frames + 1;
11096
      num_of_bd = 0;
11097
      // set length (LOOP variable)
11098
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11099
        i_length = (max_tmp - 4);
11100
      @(posedge wb_clk);
11101
    end
11102
    // disable RX
11103
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11104
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11105
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11106
    if(fail == 0)
11107
      test_ok;
11108
    else
11109
      fail = 0;
11110
  end
11111
 
11112
 
11113
  ////////////////////////////////////////////////////////////////////
11114
  ////                                                            ////
11115
  ////  Test receive packet synchronization with receive          ////
11116
  ////  disable/enable ( 100Mbps ).                               ////
11117
  ////                                                            ////
11118
  ////////////////////////////////////////////////////////////////////
11119
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11120
  begin
11121
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
11122
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
11123
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
11124
 
11125
    // unmask interrupts
11126
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11127
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11128
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11129
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11130
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11131
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11132
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11133
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11134
    // prepare two packets of MAXFL length
11135
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11136
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11137
    min_tmp = tmp[31:16];
11138
    st_data = 8'h0F;
11139
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11140
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11141
    st_data = 8'h1A;
11142
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11143
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11144
    // check WB INT signal
11145
    if (wb_int !== 1'b0)
11146
    begin
11147
      test_fail("WB INT signal should not be set");
11148
      fail = fail + 1;
11149
    end
11150
 
11151
    // write to phy's control register for 100Mbps
11152
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11153
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11154
    speed = 100;
11155
 
11156
    frame_started = 0;
11157
    frame_ended = 0;
11158
    wait_for_frame = 0;
11159
    check_frame = 0;
11160
    stop_checking_frame = 0;
11161
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11162
 
11163
    num_of_frames = 0; // 
11164
    num_of_bd = 0;
11165
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11166
    while (i_length < (max_tmp - 4))
11167
    begin
11168
      // choose generating carrier sense and collision 
11169
      case (num_of_frames[1:0])
11170
      2'h0: // Interrupt is generated
11171
      begin
11172
        // enable interrupt generation
11173
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11174
        // not detect carrier sense in FD and no collision
11175
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11176
        eth_phy.collision(0);
11177
      end
11178
      2'h1: // Interrupt is generated
11179
      begin
11180
        // enable interrupt generation
11181
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11182
        // detect carrier sense in FD and no collision
11183
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11184
        eth_phy.collision(0);
11185
      end
11186
      2'h2: // Interrupt is generated
11187
      begin
11188
        // disable interrupt generation
11189
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11190
        // not detect carrier sense in FD and set collision
11191
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11192
        eth_phy.collision(1);
11193
      end
11194
      default: // 2'h3: // Interrupt is generated
11195
      begin
11196
        // disable interrupt generation
11197
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11198
        // detect carrier sense in FD and set collision
11199
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11200
        eth_phy.collision(1);
11201
      end
11202
      endcase
11203
//if (first_fr_received == 0)
11204
//begin
11205
//  check_rx_bd(118, data);
11206
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11207
//  $display("RX BD set : %h, %h", data, tmp);
11208
//end
11209
      // set wrap bit
11210
      set_rx_bd_wrap(118);
11211
      set_rx_bd_empty(118, 118);
11212
      check_frame = 0;
11213
      stop_checking_frame = 0;
11214
      tmp_data = 0;
11215
$display("mama 1");
11216
      fork
11217
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11218
          if (num_of_frames[0] == 1'b0)
11219
          begin
11220
            repeat(1) @(posedge wb_clk);
11221
            if (num_of_frames[1] == 1'b0)
11222
            begin
11223
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11224
            end
11225
            else
11226
            begin
11227
              @(posedge mrx_clk);
11228
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11229
            end
11230
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11231
            wbm_init_waits = 4'h0;
11232
            wbm_subseq_waits = 4'h0;
11233
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11234
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11235
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11236
$display("mama 2, num_of_frames=%0h", num_of_frames);
11237
          end
11238
        end
11239
        begin // send a packet from PHY RX
11240
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11241
          if (num_of_frames[1] == 1'b0)
11242
          begin
11243
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11244
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11245
          end
11246
          else
11247
          begin
11248
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11249
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11250
          end
11251
        end
11252
        begin: send_packet1
11253
          wait (MRxDV === 1'b1); // start transmit
11254
          wait (MRxDV === 1'b0); // end transmit
11255
          check_frame = 1;
11256
$display("mama 3");
11257
          repeat(10) @(posedge mrx_clk);
11258
          repeat(15) @(posedge wb_clk);
11259
          stop_checking_frame = 1;
11260
        end
11261
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11262
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11263
$display("mama 4");
11264
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11265
          begin
11266
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11267
$display("mama 4_1");
11268
          end
11269
          else if (MRxDV === 1'b1)
11270
          begin
11271
            while (eth_sl_wb_ack_o === 1'b0)
11272
            begin
11273
              @(posedge wb_clk);
11274
              tmp_data = tmp_data + 1;
11275
            end
11276
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11277
$display("mama 4_2");
11278
          end
11279
          else if (eth_sl_wb_ack_o === 1'b1)
11280
          begin
11281
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11282
            while (MRxDV === 1'b0)
11283
            begin
11284
              @(posedge wb_clk);
11285
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11286
            end
11287
$display("mama 4_3");
11288
          end
11289
        end
11290
        begin // check packet
11291
          wait (check_frame == 1);
11292
          check_rx_bd(118, tmp_bd);
11293
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11294
          begin
11295
            #1 check_rx_bd(118, tmp_bd);
11296
            @(posedge wb_clk);
11297
          end
11298
$display("mama 5, tmp_bd=%0h", tmp_bd);
11299
          if (num_of_frames[0] == 1'b0)
11300
          begin
11301
            if (tmp_bd[15] === 1)
11302
            begin
11303
              if (first_fr_received == 1)
11304
              begin
11305
                first_fr_received = 0;
11306
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11307
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11308
                $display("    From this moment:");
11309
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11310
                if (tmp_data[31])
11311
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11312
                else
11313
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11314
              end
11315
              // check FB, etc.
11316
 
11317
            end
11318
            else // (tmp_bd[15] === 0)
11319
            begin // check FB, packet, etc.
11320
 
11321
            end
11322
$display("mama 5_1");
11323
          end
11324
          else // (num_of_frames[0] == 1'b1)
11325
          begin
11326
            if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
11327
            begin // check NOTHING
11328
 
11329
            end
11330
            else // (tmp_bd[15] === 0)
11331
            begin // check FB, packet, etc.
11332
 
11333
            end
11334
$display("mama 5_2");
11335
          end
11336
          if (stop_checking_frame == 0)
11337
            disable send_packet1;
11338
        end
11339
      join
11340
      // ONLY IF packet was received!
11341
$display("mama 6");
11342
      if (tmp_bd[15] === 0)
11343
      begin
11344
        // check length of a PACKET
11345
        if (tmp_bd[31:16] != (i_length + 4))
11346
        begin
11347
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11348
                          tmp_bd[31:16], (i_length + 4));
11349
          test_fail("Wrong length of the packet out from PHY");
11350
          fail = fail + 1;
11351
        end
11352
        // check received RX packet data and CRC
11353
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11354
        begin
11355
          if (num_of_frames[1] == 1'b0)
11356
          begin
11357
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11358
          end
11359
          else
11360
          begin
11361
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11362
          end
11363
          if (tmp > 0)
11364
          begin
11365
            `TIME; $display("*E Wrong data of the received packet");
11366
            test_fail("Wrong data of the received packet");
11367
            fail = fail + 1;
11368
          end
11369
        end
11370
        else // if PREVIOUS RX buffer descriptor was ready
11371
        begin
11372
          if (num_of_frames[1] == 1'b0)
11373
          begin
11374
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11375
          end
11376
          else
11377
          begin
11378
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11379
          end
11380
          if (tmp > 0)
11381
          begin
11382
            `TIME; $display("*E Wrong data of the received packet");
11383
            test_fail("Wrong data of the received packet");
11384
            fail = fail + 1;
11385
          end
11386
        end
11387
      end
11388
      // check WB INT signal
11389
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11390
      begin
11391
        if (wb_int !== 1'b0)
11392
        begin
11393
          `TIME; $display("*E WB INT signal should not be set");
11394
          test_fail("WB INT signal should not be set");
11395
          fail = fail + 1;
11396
        end
11397
      end
11398
      else
11399
      begin
11400
        if (wb_int !== 1'b1)
11401
        begin
11402
          `TIME; $display("*E WB INT signal should be set");
11403
          test_fail("WB INT signal should be set");
11404
          fail = fail + 1;
11405
        end
11406
      end
11407
      // check RX buffer descriptor of a packet - only 15 LSBits
11408
      check_rx_bd(118, data);
11409
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11410
      begin
11411
        if (data[15:0] !== 16'hE000)
11412
        begin
11413
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11414
          test_fail("RX buffer descriptor status is not correct");
11415
          fail = fail + 1;
11416
        end
11417
      end
11418
      else // interrupt enabled
11419
      begin
11420
        if (data[15:0] !== 16'h6000)
11421
        begin
11422
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11423
          test_fail("RX buffer descriptor status is not correct");
11424
          fail = fail + 1;
11425
        end
11426
      end
11427
      // check interrupts
11428
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11429
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11430
      begin
11431
        if (data !== 0)
11432
        begin
11433
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11434
          test_fail("Any of interrupts was set");
11435
          fail = fail + 1;
11436
        end
11437
      end
11438
      else
11439
      begin
11440
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11441
        begin
11442
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11443
          test_fail("Interrupt Receive Buffer was not set");
11444
          fail = fail + 1;
11445
        end
11446
        if ((data & (~`ETH_INT_RXB)) !== 0)
11447
        begin
11448
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11449
          test_fail("Other interrupts (except Receive Buffer) were set");
11450
          fail = fail + 1;
11451
        end
11452
      end
11453
      // clear interrupts
11454
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11455
      // check WB INT signal
11456
      if (wb_int !== 1'b0)
11457
      begin
11458
        test_fail("WB INT signal should not be set");
11459
        fail = fail + 1;
11460
      end
11461
      // disable RX after two packets
11462
      if (num_of_frames[0] == 1'b1)
11463
      begin
11464
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11465
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11466
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11467
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11468
      end
11469
      // the number of frame transmitted
11470
      num_of_frames = num_of_frames + 1;
11471
      num_of_bd = 0;
11472
      // set length (LOOP variable)
11473
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11474
        i_length = (max_tmp - 4);
11475
      @(posedge wb_clk);
11476
    end
11477
    // disable RX
11478
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11479
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11480
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11481
    if(fail == 0)
11482
      test_ok;
11483
    else
11484
      fail = 0;
11485
  end
11486
 
11487
 
11488
  ////////////////////////////////////////////////////////////////////
11489
  ////                                                            ////
11490 209 tadejm
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11491
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
11492
  ////                                                            ////
11493
  ////////////////////////////////////////////////////////////////////
11494 243 tadejm
  if (test_num == 4) // 
11495 209 tadejm
  begin
11496 243 tadejm
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
11497
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
11498
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
11499 209 tadejm
 
11500
    // unmask interrupts
11501
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11502
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11503
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11504
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11505
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11506
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11507
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11508
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11509
    // prepare two packets of MAXFL length
11510
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11511
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11512
    min_tmp = tmp[31:16];
11513
    st_data = 8'h0F;
11514
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11515
    st_data = 8'h1A;
11516
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11517
    // check WB INT signal
11518
    if (wb_int !== 1'b0)
11519
    begin
11520
      test_fail("WB INT signal should not be set");
11521
      fail = fail + 1;
11522
    end
11523
 
11524
    // write to phy's control register for 10Mbps
11525
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11526
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11527
    speed = 10;
11528
 
11529
    i_length = (min_tmp - 4);
11530
    while (i_length <= (max_tmp - 4))
11531
    begin
11532
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11533
      case (i_length[1:0])
11534
      2'h0: // Interrupt is generated
11535
      begin
11536
        // enable interrupt generation
11537
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11538
        // unmask interrupts
11539
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11540
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11541
        // not detect carrier sense in FD and no collision
11542
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11543
        eth_phy.collision(0);
11544
      end
11545
      2'h1: // Interrupt is not generated
11546
      begin
11547
        // enable interrupt generation
11548
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11549
        // mask interrupts
11550
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11551
        // detect carrier sense in FD and no collision
11552
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11553
        eth_phy.collision(0);
11554
      end
11555
      2'h2: // Interrupt is not generated
11556
      begin
11557
        // disable interrupt generation
11558
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11559
        // unmask interrupts
11560
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11561
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11562
        // not detect carrier sense in FD and set collision
11563
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11564
        eth_phy.collision(1);
11565
      end
11566
      default: // 2'h3: // Interrupt is not generated
11567
      begin
11568
        // disable interrupt generation
11569
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11570
        // mask interrupts
11571
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11572
        // detect carrier sense in FD and set collision
11573
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11574
        eth_phy.collision(1);
11575
      end
11576
      endcase
11577
      if (i_length[0] == 1'b0)
11578
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11579
      else
11580
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11581
      // set wrap bit
11582
      set_rx_bd_wrap(127);
11583
      set_rx_bd_empty(127, 127);
11584
      fork
11585
        begin
11586
          if (i_length[0] == 1'b0)
11587
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11588
          else
11589
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11590
          repeat(10) @(posedge mrx_clk);
11591
        end
11592
        begin
11593
          #1 check_rx_bd(127, data);
11594
          if (i_length < min_tmp) // just first four
11595
          begin
11596
            while (data[15] === 1)
11597
            begin
11598
              #1 check_rx_bd(127, data);
11599
              @(posedge wb_clk);
11600
            end
11601
            repeat (1) @(posedge wb_clk);
11602
          end
11603
          else
11604
          begin
11605
            wait (MRxDV === 1'b1); // start transmit
11606
            #1 check_rx_bd(127, data);
11607
            if (data[15] !== 1)
11608
            begin
11609
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11610
              fail = fail + 1;
11611
            end
11612
            wait (MRxDV === 1'b0); // end transmit
11613
            while (data[15] === 1)
11614
            begin
11615
              #1 check_rx_bd(127, data);
11616
              @(posedge wb_clk);
11617
            end
11618
            repeat (1) @(posedge wb_clk);
11619
          end
11620
        end
11621
      join
11622
      // check length of a PACKET
11623
      if (data[31:16] != (i_length + 4))
11624
      begin
11625
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11626
                        data[31:16], (i_length + 4));
11627
        test_fail("Wrong length of the packet out from PHY");
11628
        fail = fail + 1;
11629
      end
11630
      // checking in the following if statement is performed only for first and last 64 lengths
11631
      // check received RX packet data and CRC
11632
      if (i_length[0] == 1'b0)
11633
      begin
11634
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11635
      end
11636
      else
11637
      begin
11638
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11639
      end
11640
      if (tmp > 0)
11641
      begin
11642
        `TIME; $display("*E Wrong data of the received packet");
11643
        test_fail("Wrong data of the received packet");
11644
        fail = fail + 1;
11645
      end
11646
      // check WB INT signal
11647
      if (i_length[1:0] == 2'h0)
11648
      begin
11649
        if (wb_int !== 1'b1)
11650
        begin
11651
          `TIME; $display("*E WB INT signal should be set");
11652
          test_fail("WB INT signal should be set");
11653
          fail = fail + 1;
11654
        end
11655
      end
11656
      else
11657
      begin
11658
        if (wb_int !== 1'b0)
11659
        begin
11660
          `TIME; $display("*E WB INT signal should not be set");
11661
          test_fail("WB INT signal should not be set");
11662
          fail = fail + 1;
11663
        end
11664
      end
11665
      // check RX buffer descriptor of a packet
11666
      check_rx_bd(127, data);
11667
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
11668
      begin
11669
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
11670
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
11671
        begin
11672
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11673
          test_fail("RX buffer descriptor status is not correct");
11674
          fail = fail + 1;
11675
        end
11676
      end
11677
      else // interrupt not enabled
11678
      begin
11679
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
11680
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
11681
        begin
11682
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11683
          test_fail("RX buffer descriptor status is not correct");
11684
          fail = fail + 1;
11685
        end
11686
      end
11687
      // clear RX buffer descriptor for first 4 frames
11688
      if (i_length < min_tmp)
11689
        clear_rx_bd(127, 127);
11690
      // check interrupts
11691
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11692
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11693
      begin
11694
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11695
        begin
11696
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11697
          test_fail("Interrupt Receive Buffer was not set");
11698
          fail = fail + 1;
11699
        end
11700
        if ((data & (~`ETH_INT_RXB)) !== 0)
11701
        begin
11702
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11703
          test_fail("Other interrupts (except Receive Buffer) were set");
11704
          fail = fail + 1;
11705
        end
11706
      end
11707
      else
11708
      begin
11709
        if (data !== 0)
11710
        begin
11711
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
11712
          test_fail("Any of interrupts (except Receive Buffer) was set");
11713
          fail = fail + 1;
11714
        end
11715
      end
11716
      // clear interrupts
11717
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11718
      // check WB INT signal
11719
      if (wb_int !== 1'b0)
11720
      begin
11721
        test_fail("WB INT signal should not be set");
11722
        fail = fail + 1;
11723
      end
11724
      // INTERMEDIATE DISPLAYS
11725
      if ((i_length + 4) == (min_tmp + 64))
11726
      begin
11727
        // starting length is min_tmp, ending length is (min_tmp + 64)
11728
        $display("    receive small packets is NOT selected");
11729
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
11730
                 min_tmp, (min_tmp + 64));
11731
        // set receive small, remain the rest
11732
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11733
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11734
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11735
      end
11736
      else if ((i_length + 4) == (max_tmp - 16))
11737
      begin
11738
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
11739
        $display("    receive small packets is selected");
11740
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
11741
                 (min_tmp + 64 + 128), tmp_data);
11742
        // reset receive small, remain the rest
11743
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11744
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11745
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11746
      end
11747
      else if ((i_length + 4) == max_tmp)
11748
      begin
11749
        $display("    receive small packets is NOT selected");
11750
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
11751
                 (max_tmp - (4 + 16)), max_tmp);
11752
      end
11753
      // set length (loop variable)
11754
      if ((i_length + 4) < (min_tmp + 64))
11755
        i_length = i_length + 1;
11756
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
11757
      begin
11758
        i_length = i_length + 128;
11759
        tmp_data = i_length + 4; // last tmp_data is ending length
11760
      end
11761
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
11762
        i_length = max_tmp - (4 + 16);
11763
      else if ((i_length + 4) >= (max_tmp - 16))
11764
        i_length = i_length + 1;
11765
      else
11766
      begin
11767
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
11768
        #10 $stop;
11769
      end
11770
    end
11771
    // disable RX
11772
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11773
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11774
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11775
    if(fail == 0)
11776
      test_ok;
11777
    else
11778
      fail = 0;
11779
  end
11780
 
11781
 
11782
  ////////////////////////////////////////////////////////////////////
11783
  ////                                                            ////
11784
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11785
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
11786
  ////                                                            ////
11787
  ////////////////////////////////////////////////////////////////////
11788 243 tadejm
  if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
11789 209 tadejm
  begin
11790 243 tadejm
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
11791
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
11792
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
11793 209 tadejm
 
11794
    // unmask interrupts
11795
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11796
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11797
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11798
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11799
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11800
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11801
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11802
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11803
    // prepare two packets of MAXFL length
11804
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11805
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11806
    min_tmp = tmp[31:16];
11807
    st_data = 8'h0F;
11808
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11809
    st_data = 8'h1A;
11810
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11811
    // check WB INT signal
11812
    if (wb_int !== 1'b0)
11813
    begin
11814
      test_fail("WB INT signal should not be set");
11815
      fail = fail + 1;
11816
    end
11817
 
11818
    // write to phy's control register for 100Mbps
11819
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11820
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11821
    speed = 100;
11822
 
11823
    i_length = (min_tmp - 4);
11824
    while (i_length <= (max_tmp - 4))
11825
    begin
11826
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11827
      case (i_length[1:0])
11828
      2'h0: // Interrupt is generated
11829
      begin
11830
        // enable interrupt generation
11831
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11832
        // unmask interrupts
11833
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11834
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11835
        // not detect carrier sense in FD and no collision
11836
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11837
        eth_phy.collision(0);
11838
      end
11839
      2'h1: // Interrupt is not generated
11840
      begin
11841
        // enable interrupt generation
11842
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11843
        // mask interrupts
11844
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11845
        // detect carrier sense in FD and no collision
11846
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11847
        eth_phy.collision(0);
11848
      end
11849
      2'h2: // Interrupt is not generated
11850
      begin
11851
        // disable interrupt generation
11852
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
11853
        // unmask interrupts
11854
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11855
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11856
        // not detect carrier sense in FD and set collision
11857
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11858
        eth_phy.collision(1);
11859
      end
11860
      default: // 2'h3: // Interrupt is not generated
11861
      begin
11862
        // disable interrupt generation
11863
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
11864
        // mask interrupts
11865
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11866
        // detect carrier sense in FD and set collision
11867
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11868
        eth_phy.collision(1);
11869
      end
11870
      endcase
11871
      if (i_length[0] == 1'b0)
11872
        append_rx_crc (0, i_length, 1'b0, 1'b0);
11873
      else
11874
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
11875
      // set wrap bit
11876
      set_rx_bd_wrap(127);
11877
      set_rx_bd_empty(127, 127);
11878
      fork
11879
        begin
11880
          if (i_length[0] == 1'b0)
11881
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11882
          else
11883
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11884
          repeat(10) @(posedge mrx_clk);
11885
        end
11886
        begin
11887
          #1 check_rx_bd(127, data);
11888
          if (i_length < min_tmp) // just first four
11889
          begin
11890
            while (data[15] === 1)
11891
            begin
11892
              #1 check_rx_bd(127, data);
11893
              @(posedge wb_clk);
11894
            end
11895
            repeat (1) @(posedge wb_clk);
11896
          end
11897
          else
11898
          begin
11899
            wait (MRxDV === 1'b1); // start transmit
11900
            #1 check_rx_bd(127, data);
11901
            if (data[15] !== 1)
11902
            begin
11903
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
11904
              fail = fail + 1;
11905
            end
11906
            wait (MRxDV === 1'b0); // end transmit
11907
            while (data[15] === 1)
11908
            begin
11909
              #1 check_rx_bd(127, data);
11910
              @(posedge wb_clk);
11911
            end
11912
            repeat (1) @(posedge wb_clk);
11913
          end
11914
        end
11915
      join
11916
      // check length of a PACKET
11917
      if (data[31:16] != (i_length + 4))
11918
      begin
11919
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11920
                        data[31:16], (i_length + 4));
11921
        test_fail("Wrong length of the packet out from PHY");
11922
        fail = fail + 1;
11923
      end
11924
      // checking in the following if statement is performed only for first and last 64 lengths
11925
      // check received RX packet data and CRC
11926
      if (i_length[0] == 1'b0)
11927
      begin
11928
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11929
      end
11930
      else
11931
      begin
11932
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
11933
      end
11934
      if (tmp > 0)
11935
      begin
11936
        `TIME; $display("*E Wrong data of the received packet");
11937
        test_fail("Wrong data of the received packet");
11938
        fail = fail + 1;
11939
      end
11940
      // check WB INT signal
11941
      if (i_length[1:0] == 2'h0)
11942
      begin
11943
        if (wb_int !== 1'b1)
11944
        begin
11945
          `TIME; $display("*E WB INT signal should be set");
11946
          test_fail("WB INT signal should be set");
11947
          fail = fail + 1;
11948
        end
11949
      end
11950
      else
11951
      begin
11952
        if (wb_int !== 1'b0)
11953
        begin
11954
          `TIME; $display("*E WB INT signal should not be set");
11955
          test_fail("WB INT signal should not be set");
11956
          fail = fail + 1;
11957
        end
11958
      end
11959
      // check RX buffer descriptor of a packet
11960
      check_rx_bd(127, data);
11961
      if (i_length[1] == 1'b0) // interrupt enabled 
11962
      begin
11963
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
11964
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
11965
        begin
11966
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11967
          test_fail("RX buffer descriptor status is not correct");
11968
          fail = fail + 1;
11969
        end
11970
      end
11971
      else // interrupt not enabled
11972
      begin
11973
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
11974
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
11975
        begin
11976
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11977
          test_fail("RX buffer descriptor status is not correct");
11978
          fail = fail + 1;
11979
        end
11980
      end
11981
      // clear RX buffer descriptor for first 4 frames
11982
      if (i_length < min_tmp)
11983
        clear_rx_bd(127, 127);
11984
      // check interrupts
11985
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11986
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
11987
      begin
11988
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11989
        begin
11990
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11991
          test_fail("Interrupt Receive Buffer was not set");
11992
          fail = fail + 1;
11993
        end
11994
        if ((data & (~`ETH_INT_RXB)) !== 0)
11995
        begin
11996
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11997
          test_fail("Other interrupts (except Receive Buffer) were set");
11998
          fail = fail + 1;
11999
        end
12000
      end
12001
      else
12002
      begin
12003
        if (data !== 0)
12004
        begin
12005
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12006
          test_fail("Any of interrupts (except Receive Buffer) was set");
12007
          fail = fail + 1;
12008
        end
12009
      end
12010
      // clear interrupts
12011
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12012
      // check WB INT signal
12013
      if (wb_int !== 1'b0)
12014
      begin
12015
        test_fail("WB INT signal should not be set");
12016
        fail = fail + 1;
12017
      end
12018
      // INTERMEDIATE DISPLAYS
12019
      if ((i_length + 4) == (min_tmp + 64))
12020
      begin
12021
        // starting length is min_tmp, ending length is (min_tmp + 64)
12022
        $display("    receive small packets is NOT selected");
12023
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12024
                 min_tmp, (min_tmp + 64));
12025
        // set receive small, remain the rest
12026
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12027
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12028
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12029
      end
12030
      else if ((i_length + 4) == (max_tmp - 16))
12031
      begin
12032
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12033
        $display("    receive small packets is selected");
12034
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12035
                 (min_tmp + 64 + 128), tmp_data);
12036
        // reset receive small, remain the rest
12037
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12038
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12039
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12040
      end
12041
      else if ((i_length + 4) == max_tmp)
12042
      begin
12043
        $display("    receive small packets is NOT selected");
12044
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12045
                 (max_tmp - (4 + 16)), max_tmp);
12046
      end
12047
      // set length (loop variable)
12048
      if ((i_length + 4) < (min_tmp + 64))
12049
        i_length = i_length + 1;
12050
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12051
      begin
12052
        i_length = i_length + 128;
12053
        tmp_data = i_length + 4; // last tmp_data is ending length
12054
      end
12055
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12056
        i_length = max_tmp - (4 + 16);
12057
      else if ((i_length + 4) >= (max_tmp - 16))
12058
        i_length = i_length + 1;
12059
      else
12060
      begin
12061
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12062
        #10 $stop;
12063
      end
12064
    end
12065
    // disable RX
12066
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12067
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12068
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12069
    if(fail == 0)
12070
      test_ok;
12071
    else
12072
      fail = 0;
12073
  end
12074
 
12075
 
12076
  ////////////////////////////////////////////////////////////////////
12077
  ////                                                            ////
12078
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12079
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
12080
  ////                                                            ////
12081
  ////////////////////////////////////////////////////////////////////
12082 243 tadejm
  if (test_num == 6) // 
12083 209 tadejm
  begin
12084 243 tadejm
    // TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
12085
    test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
12086
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
12087 209 tadejm
 
12088
    // reset MAC registers
12089
    hard_reset;
12090
    // reset MAC and MII LOGIC with soft reset
12091
    reset_mac;
12092
    reset_mii;
12093
    // set wb slave response
12094
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12095
 
12096
    max_tmp = 0;
12097
    min_tmp = 0;
12098
    num_of_frames = 0;
12099
    num_of_bd = 0;
12100
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12101
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12102
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12103
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12104
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12105
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12106
    // prepare two packets of MAXFL length
12107
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12108
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12109
    min_tmp = tmp[31:16];
12110
    st_data = 8'hAC;
12111
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12112
    st_data = 8'h35;
12113
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12114
    // check WB INT signal
12115
    if (wb_int !== 1'b0)
12116
    begin
12117
      test_fail("WB INT signal should not be set");
12118
      fail = fail + 1;
12119
    end
12120
 
12121
    // write to phy's control register for 10Mbps
12122
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12123
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12124
    speed = 10;
12125
 
12126
    i_length = (min_tmp - 4);
12127
    while (i_length <= (max_tmp - 4))
12128
    begin
12129
      // append CRC to packet
12130
      if (i_length[0] == 1'b0)
12131
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12132
      else
12133
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12134
      // choose generating carrier sense and collision
12135
      case (i_length[1:0])
12136
      2'h0: // Interrupt is generated
12137
      begin
12138
        // Reset_tx_bd nable interrupt generation
12139
        // unmask interrupts
12140
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12141
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12142
        // not detect carrier sense in FD and no collision
12143
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12144
        eth_phy.collision(0);
12145
      end
12146
      2'h1: // Interrupt is not generated
12147
      begin
12148
        // set_tx_bd enable interrupt generation
12149
        // mask interrupts
12150
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12151
        // detect carrier sense in FD and no collision
12152
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12153
        eth_phy.collision(0);
12154
      end
12155
      2'h2: // Interrupt is not generated
12156
      begin
12157
        // set_tx_bd disable the interrupt generation
12158
        // unmask interrupts
12159
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12160
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12161
        // not detect carrier sense in FD and set collision
12162
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12163
        eth_phy.collision(1);
12164
      end
12165
      default: // 2'h3: // Interrupt is not generated
12166
      begin
12167
        // set_tx_bd disable the interrupt generation
12168
        // mask interrupts
12169
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12170
        // detect carrier sense in FD and set collision
12171
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12172
        eth_phy.collision(1);
12173
      end
12174
      endcase
12175
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12176
      // number of all frames is 154 (146 without first 8)
12177
      if (num_of_frames < 8)
12178
      begin
12179
        case (i_length[1:0])
12180
        2'h0: // Interrupt is generated
12181
        begin
12182
          // enable interrupt generation
12183
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12184
          // interrupts are unmasked
12185
        end
12186
        2'h1: // Interrupt is not generated
12187
        begin
12188
          // enable interrupt generation
12189
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12190
          // interrupts are masked
12191
        end
12192
        2'h2: // Interrupt is not generated
12193
        begin
12194
          // disable interrupt generation
12195
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12196
          // interrupts are unmasked
12197
        end
12198
        default: // 2'h3: // Interrupt is not generated
12199
        begin
12200
          // disable interrupt generation
12201
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12202
          // interrupts are masked
12203
        end
12204
        endcase
12205
        // set wrap bit
12206
        set_rx_bd_wrap(0);
12207
      end
12208
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12209
      else if ((num_of_frames - 8) == 0)
12210
      begin
12211
        tmp_len = i_length; // length of frame
12212
        tmp_bd_num = 0; // RX BD number
12213
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12214
        begin
12215
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12216
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12217
          if (tmp_len[0] == 0)
12218
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12219
          else
12220
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12221
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12222
          if ((tmp_len + 4) < (min_tmp + 128))
12223
            tmp_len = tmp_len + 1;
12224
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12225
            tmp_len = 256;
12226
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12227
            tmp_len = tmp_len + 128;
12228
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12229
            tmp_len = max_tmp - (4 + 16);
12230
          else if ((tmp_len + 4) >= (max_tmp - 16))
12231
            tmp_len = tmp_len + 1;
12232
          // set RX BD number
12233
          tmp_bd_num = tmp_bd_num + 1;
12234
        end
12235
        // set wrap bit
12236
        set_rx_bd_wrap(127);
12237
      end
12238
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12239
      else if ((num_of_frames - 8) == 20) // 128
12240
      begin
12241
        tmp_len = tmp_len; // length of frame remaines from previous settings
12242
        tmp_bd_num = 0; // TX BD number
12243
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12244
        begin
12245
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12246
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12247
          if (tmp_len[0] == 0)
12248
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12249
          else
12250
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12251
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12252
          if ((tmp_len + 4) < (min_tmp + 128))
12253
            tmp_len = tmp_len + 1;
12254
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12255
            tmp_len = 256;
12256
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12257
            tmp_len = tmp_len + 128;
12258
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12259
            tmp_len = max_tmp - (4 + 16);
12260
          else if ((tmp_len + 4) >= (max_tmp - 16))
12261
            tmp_len = tmp_len + 1;
12262
          // set TX BD number
12263
          tmp_bd_num = tmp_bd_num + 1;
12264
        end
12265
      end
12266
      // set empty bit
12267
      if (num_of_frames < 8)
12268
        set_rx_bd_empty(0, 0);
12269
      else if ((num_of_frames - 8) < 128)
12270
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12271
      else if ((num_of_frames - 136) < 19)
12272
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12273
      // CHECK END OF RECEIVE
12274
      fork
12275
        begin
12276
          if (i_length[0] == 1'b0)
12277
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12278
          else
12279
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12280
          repeat(10) @(posedge mrx_clk);
12281
        end
12282
        begin
12283
          #1 check_rx_bd(num_of_bd, data);
12284
          if (i_length < min_tmp) // just first four
12285
          begin
12286
            while (data[15] === 1)
12287
            begin
12288
              #1 check_rx_bd(num_of_bd, data);
12289
              @(posedge wb_clk);
12290
            end
12291
            repeat (1) @(posedge wb_clk);
12292
          end
12293
          else
12294
          begin
12295
            wait (MRxDV === 1'b1); // start transmit
12296
            #1 check_rx_bd(num_of_bd, data);
12297
            if (data[15] !== 1)
12298
            begin
12299
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12300
              fail = fail + 1;
12301
            end
12302
            wait (MRxDV === 1'b0); // end transmit
12303
            while (data[15] === 1)
12304
            begin
12305
              #1 check_rx_bd(num_of_bd, data);
12306
              @(posedge wb_clk);
12307
            end
12308
            repeat (1) @(posedge wb_clk);
12309
          end
12310
        end
12311
      join
12312
      // check length of a PACKET
12313
      if (data[31:16] != (i_length + 4))
12314
      begin
12315
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12316
                        data[31:16], (i_length + 4));
12317
        test_fail("Wrong length of the packet out from PHY");
12318
        fail = fail + 1;
12319
      end
12320
      // checking in the following if statement is performed only for first and last 64 lengths
12321
      // check received RX packet data and CRC
12322
      if (i_length[0] == 1'b0)
12323
      begin
12324
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12325
      end
12326
      else
12327
      begin
12328
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12329
      end
12330
      if (tmp > 0)
12331
      begin
12332
        `TIME; $display("*E Wrong data of the received packet");
12333
        test_fail("Wrong data of the received packet");
12334
        fail = fail + 1;
12335
      end
12336
      // check WB INT signal
12337
      if (i_length[1:0] == 2'h0)
12338
      begin
12339
        if (wb_int !== 1'b1)
12340
        begin
12341
          `TIME; $display("*E WB INT signal should be set");
12342
          test_fail("WB INT signal should be set");
12343
          fail = fail + 1;
12344
        end
12345
      end
12346
      else
12347
      begin
12348
        if (wb_int !== 1'b0)
12349
        begin
12350
          `TIME; $display("*E WB INT signal should not be set");
12351
          test_fail("WB INT signal should not be set");
12352
          fail = fail + 1;
12353
        end
12354
      end
12355
      // check RX buffer descriptor of a packet
12356
      check_rx_bd(num_of_bd, data);
12357
      if (i_length[1] == 1'b0) // interrupt enabled
12358
      begin
12359
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12360
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12361
        begin
12362
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12363
          test_fail("RX buffer descriptor status is not correct");
12364
          fail = fail + 1;
12365
        end
12366
      end
12367
      else // interrupt not enabled
12368
      begin
12369
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12370
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12371
        begin
12372
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12373
          test_fail("RX buffer descriptor status is not correct");
12374
          fail = fail + 1;
12375
        end
12376
      end
12377
      // clear first half of 8 frames from RX buffer descriptor 0
12378
      if (num_of_frames < 4)
12379
        clear_rx_bd(num_of_bd, num_of_bd);
12380
      // clear BD with wrap bit
12381
      if (num_of_frames == 140)
12382
        clear_rx_bd(127, 127);
12383
      // check interrupts
12384
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12385
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12386
      begin
12387
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12388
        begin
12389
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12390
          test_fail("Interrupt Receive Buffer was not set");
12391
          fail = fail + 1;
12392
        end
12393
        if ((data & (~`ETH_INT_RXB)) !== 0)
12394
        begin
12395
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12396
          test_fail("Other interrupts (except Receive Buffer) were set");
12397
          fail = fail + 1;
12398
        end
12399
      end
12400
      else
12401
      begin
12402
        if (data !== 0)
12403
        begin
12404
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12405
          test_fail("Any of interrupts (except Receive Buffer) was set");
12406
          fail = fail + 1;
12407
        end
12408
      end
12409
      // clear interrupts
12410
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12411
      // check WB INT signal
12412
      if (wb_int !== 1'b0)
12413
      begin
12414
        test_fail("WB INT signal should not be set");
12415
        fail = fail + 1;
12416
      end
12417
      // INTERMEDIATE DISPLAYS
12418
      if ((i_length + 4) == (min_tmp + 7))
12419
      begin
12420
        // starting length is min_tmp, ending length is (min_tmp + 128)
12421
        $display("    receive small packets is NOT selected");
12422
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12423
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12424
                 min_tmp, (min_tmp + 7));
12425
        $display("    ->all packets were received on RX BD 0");
12426
        // reset receive small, remain the rest
12427
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12428
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12429
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12430
      end
12431
      else if ((i_length + 4) == (min_tmp + 128))
12432
      begin
12433
        // starting length is min_tmp, ending length is (min_tmp + 128)
12434
        $display("    receive small packets is NOT selected");
12435
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12436
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12437
                 (min_tmp + 8), (min_tmp + 128));
12438
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12439
                 1'b0, num_of_bd);
12440
        tmp_bd = num_of_bd + 1;
12441
        // set receive small, remain the rest
12442
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12443
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12444
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12445
      end
12446
      else if ((i_length + 4) == (max_tmp - 16))
12447
      begin
12448
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12449
        $display("    receive small packets is selected");
12450
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12451
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12452
                 (min_tmp + 64 + 128), tmp_data);
12453
        if (tmp_bd > num_of_bd)
12454
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12455
                   tmp_bd, num_of_bd);
12456
        else
12457
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12458
                   tmp_bd, num_of_bd);
12459
        tmp_bd = num_of_bd + 1;
12460
        // reset receive small, remain the rest
12461
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12462
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12463
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12464
      end
12465
      else if ((i_length + 4) == max_tmp)
12466
      begin
12467
        $display("    receive small packets is NOT selected");
12468
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12469
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12470
                 (max_tmp - (4 + 16)), max_tmp);
12471
        if (tmp_bd > num_of_bd)
12472
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12473
                   tmp_bd, num_of_bd);
12474
        else
12475
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12476
                   tmp_bd, num_of_bd);
12477
      end
12478
      // set length (loop variable)
12479
      if ((i_length + 4) < (min_tmp + 128))
12480
        i_length = i_length + 1;
12481
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12482
        i_length = 256;
12483
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12484
      begin
12485
        i_length = i_length + 128;
12486
        tmp_data = i_length + 4; // last tmp_data is ending length
12487
      end
12488
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12489
        i_length = max_tmp - (4 + 16);
12490
      else if ((i_length + 4) >= (max_tmp - 16))
12491
        i_length = i_length + 1;
12492
      else
12493
      begin
12494
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12495
        #10 $stop;
12496
      end
12497
      // the number of frame transmitted
12498
      num_of_frames = num_of_frames + 1;
12499
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12500
        num_of_bd = 0;
12501
      else
12502
        num_of_bd = num_of_bd + 1;
12503
    end
12504
    // disable RX
12505
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12506
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12507
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12508
    @(posedge wb_clk);
12509
    if(fail == 0)
12510
      test_ok;
12511
    else
12512
      fail = 0;
12513
  end
12514
 
12515
 
12516
  ////////////////////////////////////////////////////////////////////
12517
  ////                                                            ////
12518
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12519
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
12520
  ////                                                            ////
12521
  ////////////////////////////////////////////////////////////////////
12522 243 tadejm
  if (test_num == 7) // 
12523 209 tadejm
  begin
12524 243 tadejm
    // TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
12525
    test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
12526
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
12527 209 tadejm
 
12528
    // reset MAC registers
12529
    hard_reset;
12530
    // reset MAC and MII LOGIC with soft reset
12531
    reset_mac;
12532
    reset_mii;
12533
    // set wb slave response
12534
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12535
 
12536
    max_tmp = 0;
12537
    min_tmp = 0;
12538
    num_of_frames = 0;
12539
    num_of_bd = 0;
12540
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12541
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12542
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12543
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12544
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12545
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12546
    // prepare two packets of MAXFL length
12547
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12548
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12549
    min_tmp = tmp[31:16];
12550
    st_data = 8'hAC;
12551
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12552
    st_data = 8'h35;
12553
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12554
    // check WB INT signal
12555
    if (wb_int !== 1'b0)
12556
    begin
12557
      test_fail("WB INT signal should not be set");
12558
      fail = fail + 1;
12559
    end
12560
 
12561
    // write to phy's control register for 100Mbps
12562
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
12563
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
12564
    speed = 100;
12565
 
12566
    i_length = (min_tmp - 4);
12567
    while (i_length <= (max_tmp - 4))
12568
    begin
12569
      // append CRC to packet
12570
      if (i_length[0] == 1'b0)
12571
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12572
      else
12573
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12574
      // choose generating carrier sense and collision
12575
      case (i_length[1:0])
12576
      2'h0: // Interrupt is generated
12577
      begin
12578
        // Reset_tx_bd nable interrupt generation
12579
        // unmask interrupts
12580
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12581
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12582
        // not detect carrier sense in FD and no collision
12583
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12584
        eth_phy.collision(0);
12585
      end
12586
      2'h1: // Interrupt is not generated
12587
      begin
12588
        // set_tx_bd enable interrupt generation
12589
        // mask interrupts
12590
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12591
        // detect carrier sense in FD and no collision
12592
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12593
        eth_phy.collision(0);
12594
      end
12595
      2'h2: // Interrupt is not generated
12596
      begin
12597
        // set_tx_bd disable the interrupt generation
12598
        // unmask interrupts
12599
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12600
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12601
        // not detect carrier sense in FD and set collision
12602
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12603
        eth_phy.collision(1);
12604
      end
12605
      default: // 2'h3: // Interrupt is not generated
12606
      begin
12607
        // set_tx_bd disable the interrupt generation
12608
        // mask interrupts
12609
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12610
        // detect carrier sense in FD and set collision
12611
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12612
        eth_phy.collision(1);
12613
      end
12614
      endcase
12615
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12616
      // number of all frames is 154 (146 without first 8)
12617
      if (num_of_frames < 8)
12618
      begin
12619
        case (i_length[1:0])
12620
        2'h0: // Interrupt is generated
12621
        begin
12622
          // enable interrupt generation
12623
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12624
          // interrupts are unmasked
12625
        end
12626
        2'h1: // Interrupt is not generated
12627
        begin
12628
          // enable interrupt generation
12629
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12630
          // interrupts are masked
12631
        end
12632
        2'h2: // Interrupt is not generated
12633
        begin
12634
          // disable interrupt generation
12635
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12636
          // interrupts are unmasked
12637
        end
12638
        default: // 2'h3: // Interrupt is not generated
12639
        begin
12640
          // disable interrupt generation
12641
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12642
          // interrupts are masked
12643
        end
12644
        endcase
12645
        // set wrap bit
12646
        set_rx_bd_wrap(0);
12647
      end
12648
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12649
      else if ((num_of_frames - 8) == 0)
12650
      begin
12651
        tmp_len = i_length; // length of frame
12652
        tmp_bd_num = 0; // RX BD number
12653
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12654
        begin
12655
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12656
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12657
          if (tmp_len[0] == 0)
12658
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12659
          else
12660
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12661
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12662
          if ((tmp_len + 4) < (min_tmp + 128))
12663
            tmp_len = tmp_len + 1;
12664
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12665
            tmp_len = 256;
12666
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12667
            tmp_len = tmp_len + 128;
12668
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12669
            tmp_len = max_tmp - (4 + 16);
12670
          else if ((tmp_len + 4) >= (max_tmp - 16))
12671
            tmp_len = tmp_len + 1;
12672
          // set RX BD number
12673
          tmp_bd_num = tmp_bd_num + 1;
12674
        end
12675
        // set wrap bit
12676
        set_rx_bd_wrap(127);
12677
      end
12678
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12679
      else if ((num_of_frames - 8) == 20) // 128
12680
      begin
12681
        tmp_len = tmp_len; // length of frame remaines from previous settings
12682
        tmp_bd_num = 0; // TX BD number
12683
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12684
        begin
12685
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12686
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12687
          if (tmp_len[0] == 0)
12688
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12689
          else
12690
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12691
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12692
          if ((tmp_len + 4) < (min_tmp + 128))
12693
            tmp_len = tmp_len + 1;
12694
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12695
            tmp_len = 256;
12696
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12697
            tmp_len = tmp_len + 128;
12698
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12699
            tmp_len = max_tmp - (4 + 16);
12700
          else if ((tmp_len + 4) >= (max_tmp - 16))
12701
            tmp_len = tmp_len + 1;
12702
          // set TX BD number
12703
          tmp_bd_num = tmp_bd_num + 1;
12704
        end
12705
      end
12706
      // set empty bit
12707
      if (num_of_frames < 8)
12708
        set_rx_bd_empty(0, 0);
12709
      else if ((num_of_frames - 8) < 128)
12710
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12711
      else if ((num_of_frames - 136) < 19)
12712
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12713
      // CHECK END OF RECEIVE
12714
      fork
12715
        begin
12716
          if (i_length[0] == 1'b0)
12717
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12718
          else
12719
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12720
          repeat(10) @(posedge mrx_clk);
12721
        end
12722
        begin
12723
          #1 check_rx_bd(num_of_bd, data);
12724
          if (i_length < min_tmp) // just first four
12725
          begin
12726
            while (data[15] === 1)
12727
            begin
12728
              #1 check_rx_bd(num_of_bd, data);
12729
              @(posedge wb_clk);
12730
            end
12731
            repeat (1) @(posedge wb_clk);
12732
          end
12733
          else
12734
          begin
12735
            wait (MRxDV === 1'b1); // start transmit
12736
            #1 check_rx_bd(num_of_bd, data);
12737
            if (data[15] !== 1)
12738
            begin
12739
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12740
              fail = fail + 1;
12741
            end
12742
            wait (MRxDV === 1'b0); // end transmit
12743
            while (data[15] === 1)
12744
            begin
12745
              #1 check_rx_bd(num_of_bd, data);
12746
              @(posedge wb_clk);
12747
            end
12748
            repeat (1) @(posedge wb_clk);
12749
          end
12750
        end
12751
      join
12752
      // check length of a PACKET
12753
      if (data[31:16] != (i_length + 4))
12754
      begin
12755
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12756
                        data[31:16], (i_length + 4));
12757
        test_fail("Wrong length of the packet out from PHY");
12758
        fail = fail + 1;
12759
      end
12760
      // check received RX packet data and CRC
12761
      if (i_length[0] == 1'b0)
12762
      begin
12763
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12764
      end
12765
      else
12766
      begin
12767
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12768
      end
12769
      if (tmp > 0)
12770
      begin
12771
        `TIME; $display("*E Wrong data of the received packet");
12772
        test_fail("Wrong data of the received packet");
12773
        fail = fail + 1;
12774
      end
12775
      // check WB INT signal
12776
      if (i_length[1:0] == 2'h0)
12777
      begin
12778
        if (wb_int !== 1'b1)
12779
        begin
12780
          `TIME; $display("*E WB INT signal should be set");
12781
          test_fail("WB INT signal should be set");
12782
          fail = fail + 1;
12783
        end
12784
      end
12785
      else
12786
      begin
12787
        if (wb_int !== 1'b0)
12788
        begin
12789
          `TIME; $display("*E WB INT signal should not be set");
12790
          test_fail("WB INT signal should not be set");
12791
          fail = fail + 1;
12792
        end
12793
      end
12794
      // check RX buffer descriptor of a packet
12795
      check_rx_bd(num_of_bd, data);
12796
      if (i_length[1] == 1'b0) // interrupt enabled
12797
      begin
12798
        if ( ((data[15:0] !== 16'h6000) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12799
             ((data[15:0] !== 16'h4000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12800
        begin
12801
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12802
          test_fail("RX buffer descriptor status is not correct");
12803
          fail = fail + 1;
12804
        end
12805
      end
12806
      else // interrupt not enabled
12807
      begin
12808
        if ( ((data[15:0] !== 16'h2000)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12809
             ((data[15:0] !== 16'h0000) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12810
        begin
12811
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12812
          test_fail("RX buffer descriptor status is not correct");
12813
          fail = fail + 1;
12814
        end
12815
      end
12816
      // clear first half of 8 frames from RX buffer descriptor 0
12817
      if (num_of_frames < 4)
12818
        clear_rx_bd(num_of_bd, num_of_bd);
12819
      // clear BD with wrap bit
12820
      if (num_of_frames == 140)
12821
        clear_rx_bd(127, 127);
12822
      // check interrupts
12823
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12824
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12825
      begin
12826
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12827
        begin
12828
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12829
          test_fail("Interrupt Receive Buffer was not set");
12830
          fail = fail + 1;
12831
        end
12832
        if ((data & (~`ETH_INT_RXB)) !== 0)
12833
        begin
12834
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12835
          test_fail("Other interrupts (except Receive Buffer) were set");
12836
          fail = fail + 1;
12837
        end
12838
      end
12839
      else
12840
      begin
12841
        if (data !== 0)
12842
        begin
12843
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12844
          test_fail("Any of interrupts (except Receive Buffer) was set");
12845
          fail = fail + 1;
12846
        end
12847
      end
12848
      // clear interrupts
12849
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12850
      // check WB INT signal
12851
      if (wb_int !== 1'b0)
12852
      begin
12853
        test_fail("WB INT signal should not be set");
12854
        fail = fail + 1;
12855
      end
12856
      // INTERMEDIATE DISPLAYS
12857
      if ((i_length + 4) == (min_tmp + 7))
12858
      begin
12859
        // starting length is min_tmp, ending length is (min_tmp + 128)
12860
        $display("    receive small packets is NOT selected");
12861
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12862
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12863
                 min_tmp, (min_tmp + 7));
12864
        $display("    ->all packets were received on RX BD 0");
12865
        // reset receive small, remain the rest
12866
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12867
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12868
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12869
      end
12870
      else if ((i_length + 4) == (min_tmp + 128))
12871
      begin
12872
        // starting length is min_tmp, ending length is (min_tmp + 128)
12873
        $display("    receive small packets is NOT selected");
12874
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12875
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12876
                 (min_tmp + 8), (min_tmp + 128));
12877
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12878
                 1'b0, num_of_bd);
12879
        tmp_bd = num_of_bd + 1;
12880
        // set receive small, remain the rest
12881
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12882
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12883
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12884
      end
12885
      else if ((i_length + 4) == (max_tmp - 16))
12886
      begin
12887
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12888
        $display("    receive small packets is selected");
12889
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12890
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12891
                 (min_tmp + 64 + 128), tmp_data);
12892
        if (tmp_bd > num_of_bd)
12893
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12894
                   tmp_bd, num_of_bd);
12895
        else
12896
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12897
                   tmp_bd, num_of_bd);
12898
        tmp_bd = num_of_bd + 1;
12899
        // reset receive small, remain the rest
12900
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12901
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12902
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12903
      end
12904
      else if ((i_length + 4) == max_tmp)
12905
      begin
12906
        $display("    receive small packets is NOT selected");
12907
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12908
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12909
                 (max_tmp - (4 + 16)), max_tmp);
12910
        if (tmp_bd > num_of_bd)
12911
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12912
                   tmp_bd, num_of_bd);
12913
        else
12914
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12915
                   tmp_bd, num_of_bd);
12916
      end
12917
      // set length (loop variable)
12918
      if ((i_length + 4) < (min_tmp + 128))
12919
        i_length = i_length + 1;
12920
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12921
        i_length = 256;
12922
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12923
      begin
12924
        i_length = i_length + 128;
12925
        tmp_data = i_length + 4; // last tmp_data is ending length
12926
      end
12927
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12928
        i_length = max_tmp - (4 + 16);
12929
      else if ((i_length + 4) >= (max_tmp - 16))
12930
        i_length = i_length + 1;
12931
      else
12932
      begin
12933
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12934
        #10 $stop;
12935
      end
12936
      // the number of frame transmitted
12937
      num_of_frames = num_of_frames + 1;
12938
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12939
        num_of_bd = 0;
12940
      else
12941
        num_of_bd = num_of_bd + 1;
12942
    end
12943
    // disable RX
12944
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12945
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12946
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12947
    @(posedge wb_clk);
12948
    if(fail == 0)
12949
      test_ok;
12950
    else
12951
      fail = 0;
12952
  end
12953
 
12954
 
12955
  ////////////////////////////////////////////////////////////////////
12956
  ////                                                            ////
12957 243 tadejm
  ////  Test receive packets form 0 to (MINFL + 12) sizes at       ////
12958 209 tadejm
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
12959
  ////                                                            ////
12960
  ////////////////////////////////////////////////////////////////////
12961 243 tadejm
  if (test_num == 8) // 
12962 209 tadejm
  begin
12963 243 tadejm
    // TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
12964
    test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
12965
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
12966 209 tadejm
 
12967
    // reset MAC registers
12968
    hard_reset;
12969
    // reset MAC and MII LOGIC with soft reset
12970
    reset_mac;
12971
    reset_mii;
12972
    // set wb slave response
12973
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12974
 
12975
    max_tmp = 0;
12976
    min_tmp = 0;
12977
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
12978
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12979
    // enable RX, set full-duplex mode, receive small, NO correct IFG
12980
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12981
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12982
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12983
    // prepare two packets of MAXFL length
12984
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12985
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12986
    min_tmp = tmp[31:16];
12987
    st_data = 8'hAC;
12988
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12989
    st_data = 8'h35;
12990
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12991
    // check WB INT signal
12992
    if (wb_int !== 1'b0)
12993
    begin
12994
      test_fail("WB INT signal should not be set");
12995
      fail = fail + 1;
12996
    end
12997 243 tadejm
    // unmask interrupts
12998
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12999
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13000 209 tadejm
 
13001
    // write to phy's control register for 10Mbps
13002
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
13003
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
13004
    speed = 10;
13005
 
13006 243 tadejm
    frame_ended = 0;
13007
    num_of_frames = 0;// 0; // 10;
13008
    num_of_bd = 120;
13009
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13010
    while ((i_length + 4) < 78) // (min_tmp - 4))
13011 209 tadejm
    begin
13012 243 tadejm
      // append CRC to packet
13013
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13014
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13015
      else if (num_of_frames > 4)
13016
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13017 209 tadejm
      // choose generating carrier sense and collision
13018
      case (i_length[1:0])
13019 243 tadejm
      2'h0:
13020 209 tadejm
      begin
13021
        // not detect carrier sense in FD and no collision
13022 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13023 209 tadejm
        eth_phy.collision(0);
13024
      end
13025 243 tadejm
      2'h1:
13026 209 tadejm
      begin
13027
        // detect carrier sense in FD and no collision
13028 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13029 209 tadejm
        eth_phy.collision(0);
13030
      end
13031 243 tadejm
      2'h2:
13032 209 tadejm
      begin
13033
        // not detect carrier sense in FD and set collision
13034 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13035 209 tadejm
        eth_phy.collision(1);
13036
      end
13037 243 tadejm
      default: // 2'h3:
13038 209 tadejm
      begin
13039
        // detect carrier sense in FD and set collision
13040 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13041 209 tadejm
        eth_phy.collision(1);
13042
      end
13043
      endcase
13044
      #1;
13045 243 tadejm
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13046 209 tadejm
      if (num_of_frames <= 9)
13047
      begin
13048 243 tadejm
        case (i_length[1:0])
13049
        2'h0: // Interrupt is generated
13050
        begin
13051
          // enable interrupt generation
13052
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13053
        end
13054
        2'h1: // Interrupt is generated
13055
        begin
13056
          // enable interrupt generation
13057
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13058
        end
13059
        2'h2: // Interrupt is generated
13060
        begin
13061
          // enable interrupt generation
13062
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13063
        end
13064
        default: // 2'h3: // Interrupt is generated
13065
        begin
13066
          // enable interrupt generation
13067
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13068
        end
13069
        endcase
13070 209 tadejm
        // set wrap bit
13071 243 tadejm
        set_rx_bd_wrap(120);
13072 209 tadejm
      end
13073 243 tadejm
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13074 209 tadejm
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13075
      begin
13076
        tmp_len = i_length; // length of frame
13077 243 tadejm
        tmp_bd_num = 120; // RX BD number
13078
        while (tmp_bd_num < 124) // 
13079 209 tadejm
        begin
13080
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13081
          if (tmp_len[0] == 0)
13082 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13083 209 tadejm
          else
13084 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13085
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13086 209 tadejm
          tmp_len = tmp_len + 1;
13087 243 tadejm
          // set RX BD number
13088 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13089
        end
13090
        // set wrap bit
13091 243 tadejm
        set_rx_bd_wrap(123);
13092 209 tadejm
      end
13093 243 tadejm
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13094 209 tadejm
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13095
      begin
13096
        tmp_len = i_length; // length of frame
13097 243 tadejm
        tmp_bd_num = 120; // RX BD number
13098
        while (tmp_bd_num < 125) // 
13099 209 tadejm
        begin
13100
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13101
          if (tmp_len[0] == 0)
13102 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13103 209 tadejm
          else
13104 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13105
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13106 209 tadejm
          tmp_len = tmp_len + 1;
13107 243 tadejm
          // set RX BD number
13108 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13109
        end
13110
        // set wrap bit
13111 243 tadejm
        set_rx_bd_wrap(124);
13112 209 tadejm
      end
13113 243 tadejm
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13114 209 tadejm
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13115
      begin
13116
        tmp_len = i_length; // length of frame
13117 243 tadejm
        tmp_bd_num = 120; // RX BD number
13118
        while (tmp_bd_num < 126) // 
13119 209 tadejm
        begin
13120
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13121
          if (tmp_len[0] == 0)
13122 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13123 209 tadejm
          else
13124 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13125
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13126 209 tadejm
          tmp_len = tmp_len + 1;
13127 243 tadejm
          // set RX BD number
13128 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13129
        end
13130
        // set wrap bit
13131 243 tadejm
        set_rx_bd_wrap(125);
13132 209 tadejm
      end
13133 243 tadejm
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13134 209 tadejm
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13135
      begin
13136
        tmp_len = i_length; // length of frame
13137 243 tadejm
        tmp_bd_num = 120; // RX BD number
13138
        while (tmp_bd_num < 127) // 
13139 209 tadejm
        begin
13140
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13141
          if (tmp_len[0] == 0)
13142 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13143 209 tadejm
          else
13144 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13145
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13146 209 tadejm
          tmp_len = tmp_len + 1;
13147 243 tadejm
          // set RX BD number
13148 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13149
        end
13150
        // set wrap bit
13151 243 tadejm
        set_rx_bd_wrap(126);
13152 209 tadejm
      end
13153 243 tadejm
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13154 209 tadejm
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13155
      begin
13156
        tmp_len = i_length; // length of frame
13157 243 tadejm
        tmp_bd_num = 120; // RX BD number
13158
        while (tmp_bd_num < 128) // 
13159 209 tadejm
        begin
13160
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13161
          if (tmp_len[0] == 0)
13162 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13163 209 tadejm
          else
13164 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13165
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13166 209 tadejm
          tmp_len = tmp_len + 1;
13167 243 tadejm
          // set RX BD number
13168 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13169
        end
13170
        // set wrap bit
13171 243 tadejm
        set_rx_bd_wrap(127);
13172 209 tadejm
      end
13173 243 tadejm
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13174
      else if (num_of_frames == 70)
13175
      begin
13176
        tmp_len = i_length; // length of frame
13177
        tmp_bd_num = 120; // RX BD number
13178
        while (tmp_bd_num < 128) // 
13179
        begin
13180
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13181
          if (tmp_len[0] == 0)
13182
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13183
          else
13184
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13185
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13186
          tmp_len = tmp_len + 1;
13187
          // set RX BD number
13188
          tmp_bd_num = tmp_bd_num + 1;
13189
        end
13190
        // set wrap bit
13191
        set_rx_bd_wrap(127);
13192
      end
13193 209 tadejm
      #1;
13194 243 tadejm
      // SET empty bit
13195 209 tadejm
      if (num_of_frames < 10)
13196 243 tadejm
        set_rx_bd_empty(120, 120);
13197 209 tadejm
      else if (num_of_frames < 14)
13198 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13199 209 tadejm
      else if (num_of_frames < 18)
13200 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13201 209 tadejm
      else if (num_of_frames < 23)
13202 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13203 209 tadejm
      else if (num_of_frames < 28)
13204 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13205 209 tadejm
      else if (num_of_frames < 34)
13206 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13207 209 tadejm
      else if (num_of_frames < 40)
13208 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13209 209 tadejm
      else if (num_of_frames < 47)
13210 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13211 209 tadejm
      else if (num_of_frames < 54)
13212 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13213 209 tadejm
      else if (num_of_frames < 62)
13214 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13215 209 tadejm
      else if (num_of_frames < 70)
13216 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13217
      else if (num_of_frames < 78)
13218
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13219
      // CHECK END OF RECEIVE
13220 252 tadejm
      // receive just preamble between some packets
13221
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
13222
      begin
13223
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
13224
        @(posedge mrx_clk);
13225
        wait (MRxDV === 1'b0); // end receive
13226
        repeat(10) @(posedge mrx_clk);
13227
        repeat(15) @(posedge wb_clk);
13228
      end
13229
      // receiving frames and checking end of them
13230 243 tadejm
      frame_ended = 0;
13231
      check_frame = 0;
13232 209 tadejm
      fork
13233
        begin
13234 243 tadejm
          if (i_length[0] == 1'b0)
13235
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13236
          else
13237
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13238
          repeat(10) @(posedge mrx_clk);
13239
        end
13240
        begin: fr_end1
13241
          wait (MRxDV === 1'b1); // start receive
13242
          #1 check_rx_bd(num_of_bd, data);
13243
          if (data[15] !== 1)
13244 209 tadejm
          begin
13245 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13246
            fail = fail + 1;
13247 209 tadejm
          end
13248 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13249
          while ((data[15] === 1) && (check_frame == 0))
13250
          begin
13251
            #1 check_rx_bd(num_of_bd, data);
13252
            @(posedge wb_clk);
13253
          end
13254
          if (data[15] === 0)
13255
            frame_ended = 1;
13256
          repeat (1) @(posedge wb_clk);
13257 209 tadejm
        end
13258 243 tadejm
        begin
13259
          wait (MRxDV === 1'b1); // start receive
13260
          wait (MRxDV === 1'b0); // end receive
13261
          repeat(10) @(posedge mrx_clk);
13262
          repeat(15) @(posedge wb_clk);
13263
          check_frame = 1;
13264
        end
13265
      join
13266
      // check length of a PACKET
13267
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
13268
           ((data[31:16] != 0) && (num_of_frames < 3)) )
13269
      begin
13270
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13271
                        data[31:16], (i_length + 4));
13272
        test_fail("Wrong length of the packet out from PHY");
13273
        fail = fail + 1;
13274
      end
13275
      // check received RX packet data and CRC
13276
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
13277
      begin                                           // CRC has 4 bytes for itself
13278
        if (i_length[0] == 1'b0)
13279
        begin
13280
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13281
        end
13282 209 tadejm
        else
13283
        begin
13284 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13285 209 tadejm
        end
13286 243 tadejm
        if (tmp > 0)
13287
        begin
13288
          `TIME; $display("*E Wrong data of the received packet");
13289
          test_fail("Wrong data of the received packet");
13290
          fail = fail + 1;
13291
        end
13292 209 tadejm
      end
13293 243 tadejm
      // check WB INT signal
13294
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
13295
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
13296
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
13297
        begin
13298
          `TIME; $display("*E WB INT signal should be set");
13299
          test_fail("WB INT signal should be set");
13300
          fail = fail + 1;
13301
        end
13302
      end
13303
      else
13304
      begin
13305
        if (wb_int !== 1'b0)
13306
        begin
13307
          `TIME; $display("*E WB INT signal should not be set");
13308
          test_fail("WB INT signal should not be set");
13309
          fail = fail + 1;
13310
        end
13311
      end
13312
      // check RX buffer descriptor of a packet
13313
      if (num_of_frames >= min_tmp)
13314
      begin
13315
        if ( (data[15:0] !== 16'h6000) && // wrap bit
13316
             (data[15:0] !== 16'h4000) ) // without wrap bit
13317
        begin
13318
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13319
          test_fail("RX buffer descriptor status is not correct");
13320
          fail = fail + 1;
13321
        end
13322
      end
13323
      else if (num_of_frames > 4)
13324
      begin
13325
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13326
             (data[15:0] !== 16'h4004) ) // without wrap bit
13327
        begin
13328
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13329
          test_fail("RX buffer descriptor status is not correct");
13330
          fail = fail + 1;
13331
        end
13332
      end
13333
      else if (num_of_frames > 2)
13334
      begin
13335
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13336
             (data[15:0] !== 16'h4006) ) // without wrap bit
13337
        begin
13338
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13339
          test_fail("RX buffer descriptor status is not correct");
13340
          fail = fail + 1;
13341
        end
13342
      end
13343
      else
13344
      begin
13345
        if (data[15] !== 1'b1)
13346
        begin
13347
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13348
          test_fail("RX buffer descriptor status is not correct");
13349
          fail = fail + 1;
13350
        end
13351
      end
13352
      // check interrupts
13353
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13354 209 tadejm
      if (num_of_frames >= 5)
13355
      begin
13356 243 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13357 209 tadejm
        begin
13358 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13359
          test_fail("Interrupt Receive Buffer was not set");
13360
          fail = fail + 1;
13361 209 tadejm
        end
13362 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13363 209 tadejm
        begin
13364 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13365
          test_fail("Other interrupts (except Receive Buffer) were set");
13366
          fail = fail + 1;
13367 209 tadejm
        end
13368 243 tadejm
      end
13369
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
13370
      begin
13371
        if (data) // Checking if any interrupt is pending)
13372 209 tadejm
        begin
13373 243 tadejm
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
13374
          test_fail("Interrupts were set");
13375
          fail = fail + 1;
13376
        end
13377
      end
13378
      else
13379
      begin
13380
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
13381
        begin
13382
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13383
          test_fail("Interrupt Receive Buffer Error was not set");
13384
          fail = fail + 1;
13385
        end
13386
        if ((data & (~`ETH_INT_RXE)) !== 0)
13387
        begin
13388
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13389
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13390
          fail = fail + 1;
13391
        end
13392
      end
13393
      // clear interrupts
13394
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13395
      // check WB INT signal
13396
      if (wb_int !== 1'b0)
13397
      begin
13398
        test_fail("WB INT signal should not be set");
13399
        fail = fail + 1;
13400
      end
13401
      // INTERMEDIATE DISPLAYS
13402
      if (num_of_frames == 3)
13403
      begin
13404
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13405
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13406
                 0, 3);
13407
      end
13408
      else if (num_of_frames == 9)
13409
      begin
13410
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13411
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13412
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13413
                 5, 9);
13414
      end
13415
      else if (num_of_frames == 17)
13416
      begin
13417
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13418
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13419
                 10, 17);
13420
      end
13421
      else if (num_of_frames == 27)
13422
      begin
13423
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13424
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13425
                 18, 27);
13426
      end
13427
      else if (num_of_frames == 40)
13428
      begin
13429
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13430
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13431
                 28, 40);
13432
      end
13433
      else if (num_of_frames == 54)
13434
      begin
13435
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13436
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13437
                 41, 54);
13438
      end
13439
      else if (num_of_frames == 69)
13440
      begin
13441
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13442
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13443
                 55, 69);
13444
      end
13445
      else if (num_of_frames == 69)
13446
      begin
13447
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13448
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13449
                 55, 69);
13450
      end
13451
      else if (num_of_frames == 77)
13452
      begin
13453
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13454
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13455
                 70, 77);
13456
      end
13457
      // set length (loop variable)
13458
      i_length = i_length + 1;
13459
      // the number of frame transmitted
13460
      num_of_frames = num_of_frames + 1;
13461
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13462
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13463
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13464
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13465
        num_of_bd = 120;
13466
      else
13467
        num_of_bd = num_of_bd + 1;
13468
    end
13469
    // disable RX
13470
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13471
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13472
    @(posedge wb_clk);
13473
    if(fail == 0)
13474
      test_ok;
13475
    else
13476
      fail = 0;
13477
  end
13478
 
13479
 
13480
  ////////////////////////////////////////////////////////////////////
13481
  ////                                                            ////
13482
  ////  Test receive packets form 0 to (MINFL + 12) sizes at      ////
13483
  ////  8 RX buffer decriptors ( 100Mbps ).                       ////
13484
  ////                                                            ////
13485
  ////////////////////////////////////////////////////////////////////
13486
  if (test_num == 9) // 
13487
  begin
13488
    // TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
13489
    test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
13490
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
13491
 
13492
    // reset MAC registers
13493
    hard_reset;
13494
    // reset MAC and MII LOGIC with soft reset
13495
    reset_mac;
13496
    reset_mii;
13497
    // set wb slave response
13498
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13499
 
13500
    max_tmp = 0;
13501
    min_tmp = 0;
13502
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
13503
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13504
    // enable RX, set full-duplex mode, receive small, NO correct IFG
13505
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13506
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13507
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13508
    // prepare two packets of MAXFL length
13509
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13510
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13511
    min_tmp = tmp[31:16];
13512
    st_data = 8'hAC;
13513
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13514
    st_data = 8'h35;
13515
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13516
    // check WB INT signal
13517
    if (wb_int !== 1'b0)
13518
    begin
13519
      test_fail("WB INT signal should not be set");
13520
      fail = fail + 1;
13521
    end
13522
    // unmask interrupts
13523
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13524
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13525
 
13526
    // write to phy's control register for 100Mbps
13527
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
13528
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
13529
    speed = 100;
13530
 
13531
    frame_ended = 0;
13532 252 tadejm
    num_of_frames = 0;// 0; // 10;
13533 243 tadejm
    num_of_bd = 120;
13534
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13535
    while ((i_length + 4) < 78) // (min_tmp - 4))
13536
    begin
13537
      // append CRC to packet
13538 252 tadejm
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13539 243 tadejm
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13540 252 tadejm
      else if (num_of_frames > 4)
13541 243 tadejm
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13542
      // choose generating carrier sense and collision
13543
      case (i_length[1:0])
13544
      2'h0:
13545
      begin
13546
        // not detect carrier sense in FD and no collision
13547
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13548
        eth_phy.collision(0);
13549
      end
13550
      2'h1:
13551
      begin
13552
        // detect carrier sense in FD and no collision
13553
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13554
        eth_phy.collision(0);
13555
      end
13556
      2'h2:
13557
      begin
13558
        // not detect carrier sense in FD and set collision
13559
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13560
        eth_phy.collision(1);
13561
      end
13562
      default: // 2'h3:
13563
      begin
13564
        // detect carrier sense in FD and set collision
13565
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13566
        eth_phy.collision(1);
13567
      end
13568
      endcase
13569
      #1;
13570
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13571
      if (num_of_frames <= 9)
13572
      begin
13573
        case (i_length[1:0])
13574
        2'h0: // Interrupt is generated
13575
        begin
13576
          // enable interrupt generation
13577
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13578
        end
13579
        2'h1: // Interrupt is generated
13580
        begin
13581
          // enable interrupt generation
13582
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13583
        end
13584
        2'h2: // Interrupt is generated
13585
        begin
13586
          // enable interrupt generation
13587
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13588
        end
13589
        default: // 2'h3: // Interrupt is generated
13590
        begin
13591
          // enable interrupt generation
13592
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13593
        end
13594
        endcase
13595
        // set wrap bit
13596
        set_rx_bd_wrap(120);
13597
      end
13598
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13599
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13600
      begin
13601
        tmp_len = i_length; // length of frame
13602
        tmp_bd_num = 120; // RX BD number
13603
        while (tmp_bd_num < 124) // 
13604
        begin
13605
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13606
          if (tmp_len[0] == 0)
13607
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13608
          else
13609
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13610
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13611
          tmp_len = tmp_len + 1;
13612
          // set RX BD number
13613
          tmp_bd_num = tmp_bd_num + 1;
13614
        end
13615
        // set wrap bit
13616
        set_rx_bd_wrap(123);
13617
      end
13618
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13619
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13620
      begin
13621
        tmp_len = i_length; // length of frame
13622
        tmp_bd_num = 120; // RX BD number
13623
        while (tmp_bd_num < 125) // 
13624
        begin
13625
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13626
          if (tmp_len[0] == 0)
13627
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13628
          else
13629
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13630
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13631
          tmp_len = tmp_len + 1;
13632
          // set RX BD number
13633
          tmp_bd_num = tmp_bd_num + 1;
13634
        end
13635
        // set wrap bit
13636
        set_rx_bd_wrap(124);
13637
      end
13638
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13639
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13640
      begin
13641
        tmp_len = i_length; // length of frame
13642
        tmp_bd_num = 120; // RX BD number
13643
        while (tmp_bd_num < 126) // 
13644
        begin
13645
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13646
          if (tmp_len[0] == 0)
13647
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13648
          else
13649
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13650
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13651
          tmp_len = tmp_len + 1;
13652
          // set RX BD number
13653
          tmp_bd_num = tmp_bd_num + 1;
13654
        end
13655
        // set wrap bit
13656
        set_rx_bd_wrap(125);
13657
      end
13658
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13659
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13660
      begin
13661
        tmp_len = i_length; // length of frame
13662
        tmp_bd_num = 120; // RX BD number
13663
        while (tmp_bd_num < 127) // 
13664
        begin
13665
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13666
          if (tmp_len[0] == 0)
13667
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13668
          else
13669
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13670
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13671
          tmp_len = tmp_len + 1;
13672
          // set RX BD number
13673
          tmp_bd_num = tmp_bd_num + 1;
13674
        end
13675
        // set wrap bit
13676
        set_rx_bd_wrap(126);
13677
      end
13678
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13679
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13680
      begin
13681
        tmp_len = i_length; // length of frame
13682
        tmp_bd_num = 120; // RX BD number
13683
        while (tmp_bd_num < 128) // 
13684
        begin
13685
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13686
          if (tmp_len[0] == 0)
13687
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13688
          else
13689
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13690
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13691
          tmp_len = tmp_len + 1;
13692
          // set RX BD number
13693
          tmp_bd_num = tmp_bd_num + 1;
13694
        end
13695
        // set wrap bit
13696
        set_rx_bd_wrap(127);
13697
      end
13698
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13699
      else if (num_of_frames == 70)
13700
      begin
13701
        tmp_len = i_length; // length of frame
13702
        tmp_bd_num = 120; // RX BD number
13703
        while (tmp_bd_num < 128) // 
13704
        begin
13705
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13706
          if (tmp_len[0] == 0)
13707
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13708
          else
13709
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13710
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13711
          tmp_len = tmp_len + 1;
13712
          // set RX BD number
13713
          tmp_bd_num = tmp_bd_num + 1;
13714
        end
13715
        // set wrap bit
13716
        set_rx_bd_wrap(127);
13717
      end
13718
      #1;
13719
      // SET empty bit
13720
      if (num_of_frames < 10)
13721
        set_rx_bd_empty(120, 120);
13722
      else if (num_of_frames < 14)
13723
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13724
      else if (num_of_frames < 18)
13725
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13726
      else if (num_of_frames < 23)
13727
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13728
      else if (num_of_frames < 28)
13729
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13730
      else if (num_of_frames < 34)
13731
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13732
      else if (num_of_frames < 40)
13733
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13734
      else if (num_of_frames < 47)
13735
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13736
      else if (num_of_frames < 54)
13737
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13738
      else if (num_of_frames < 62)
13739
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13740
      else if (num_of_frames < 70)
13741
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13742
      else if (num_of_frames < 78)
13743
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13744
      // CHECK END OF RECEIVE
13745 252 tadejm
      // receive just preamble between some packets
13746
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
13747
      begin
13748
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
13749
        @(posedge mrx_clk);
13750
        wait (MRxDV === 1'b0); // end receive
13751
        repeat(10) @(posedge mrx_clk);
13752
        repeat(15) @(posedge wb_clk);
13753
      end
13754
      // receiving frames and checking end of them
13755 243 tadejm
      frame_ended = 0;
13756
      check_frame = 0;
13757
      fork
13758
        begin
13759
          if (i_length[0] == 1'b0)
13760
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13761
          else
13762
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13763
          repeat(10) @(posedge mrx_clk);
13764
        end
13765 252 tadejm
        begin: fr_end1
13766 243 tadejm
          wait (MRxDV === 1'b1); // start receive
13767
          #1 check_rx_bd(num_of_bd, data);
13768
          if (data[15] !== 1)
13769 209 tadejm
          begin
13770 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13771 209 tadejm
            fail = fail + 1;
13772
          end
13773 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13774
          while ((data[15] === 1) && (check_frame == 0))
13775
          begin
13776
            #1 check_rx_bd(num_of_bd, data);
13777
            @(posedge wb_clk);
13778
          end
13779
          if (data[15] === 0)
13780
            frame_ended = 1;
13781
          repeat (1) @(posedge wb_clk);
13782 209 tadejm
        end
13783
        begin
13784 243 tadejm
          wait (MRxDV === 1'b1); // start receive
13785
          wait (MRxDV === 1'b0); // end receive
13786
          repeat(10) @(posedge mrx_clk);
13787
          repeat(15) @(posedge wb_clk);
13788
          check_frame = 1;
13789 209 tadejm
        end
13790 243 tadejm
      join
13791
      // check length of a PACKET
13792 252 tadejm
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
13793
           ((data[31:16] != 0) && (num_of_frames < 3)) )
13794 243 tadejm
      begin
13795
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13796
                        data[31:16], (i_length + 4));
13797
        test_fail("Wrong length of the packet out from PHY");
13798
        fail = fail + 1;
13799
      end
13800
      // check received RX packet data and CRC
13801 252 tadejm
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
13802
      begin                                           // CRC has 4 bytes for itself
13803 243 tadejm
        if (i_length[0] == 1'b0)
13804 209 tadejm
        begin
13805 243 tadejm
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13806 209 tadejm
        end
13807 243 tadejm
        else
13808 209 tadejm
        begin
13809 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13810 209 tadejm
        end
13811
        if (tmp > 0)
13812
        begin
13813 243 tadejm
          `TIME; $display("*E Wrong data of the received packet");
13814
          test_fail("Wrong data of the received packet");
13815 209 tadejm
          fail = fail + 1;
13816
        end
13817
      end
13818
      // check WB INT signal
13819 252 tadejm
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
13820
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
13821
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
13822 209 tadejm
        begin
13823
          `TIME; $display("*E WB INT signal should be set");
13824
          test_fail("WB INT signal should be set");
13825
          fail = fail + 1;
13826
        end
13827
      end
13828 252 tadejm
      else
13829 209 tadejm
      begin
13830
        if (wb_int !== 1'b0)
13831
        begin
13832
          `TIME; $display("*E WB INT signal should not be set");
13833
          test_fail("WB INT signal should not be set");
13834
          fail = fail + 1;
13835
        end
13836
      end
13837 243 tadejm
      // check RX buffer descriptor of a packet
13838
      if (num_of_frames >= min_tmp)
13839
      begin
13840
        if ( (data[15:0] !== 16'h6000) && // wrap bit
13841
             (data[15:0] !== 16'h4000) ) // without wrap bit
13842 209 tadejm
        begin
13843 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13844
          test_fail("RX buffer descriptor status is not correct");
13845
          fail = fail + 1;
13846 209 tadejm
        end
13847 243 tadejm
      end
13848
      else if (num_of_frames > 4)
13849
      begin
13850
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13851
             (data[15:0] !== 16'h4004) ) // without wrap bit
13852 209 tadejm
        begin
13853 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13854
          test_fail("RX buffer descriptor status is not correct");
13855
          fail = fail + 1;
13856 209 tadejm
        end
13857
      end
13858 243 tadejm
      else if (num_of_frames > 2)
13859
      begin
13860
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13861
             (data[15:0] !== 16'h4006) ) // without wrap bit
13862
        begin
13863
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13864
          test_fail("RX buffer descriptor status is not correct");
13865
          fail = fail + 1;
13866
        end
13867
      end
13868 209 tadejm
      else
13869
      begin
13870
        if (data[15] !== 1'b1)
13871
        begin
13872 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13873
          test_fail("RX buffer descriptor status is not correct");
13874 209 tadejm
          fail = fail + 1;
13875
        end
13876
      end
13877
      // check interrupts
13878
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13879 252 tadejm
      if (num_of_frames >= 5)
13880 209 tadejm
      begin
13881 252 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13882 209 tadejm
        begin
13883 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13884
          test_fail("Interrupt Receive Buffer was not set");
13885 209 tadejm
          fail = fail + 1;
13886
        end
13887 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13888 209 tadejm
        begin
13889 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13890
          test_fail("Other interrupts (except Receive Buffer) were set");
13891 209 tadejm
          fail = fail + 1;
13892
        end
13893
      end
13894 252 tadejm
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
13895
      begin
13896
        if (data) // Checking if any interrupt is pending)
13897
        begin
13898
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
13899
          test_fail("Interrupts were set");
13900
          fail = fail + 1;
13901
        end
13902
      end
13903 209 tadejm
      else
13904
      begin
13905 252 tadejm
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
13906 209 tadejm
        begin
13907 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13908
          test_fail("Interrupt Receive Buffer Error was not set");
13909 209 tadejm
          fail = fail + 1;
13910
        end
13911 243 tadejm
        if ((data & (~`ETH_INT_RXE)) !== 0)
13912
        begin
13913
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13914
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13915
          fail = fail + 1;
13916
        end
13917 209 tadejm
      end
13918
      // clear interrupts
13919
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13920
      // check WB INT signal
13921
      if (wb_int !== 1'b0)
13922
      begin
13923
        test_fail("WB INT signal should not be set");
13924
        fail = fail + 1;
13925
      end
13926
      // INTERMEDIATE DISPLAYS
13927 243 tadejm
      if (num_of_frames == 3)
13928 209 tadejm
      begin
13929 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13930
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13931 209 tadejm
                 0, 3);
13932
      end
13933 243 tadejm
      else if (num_of_frames == 9)
13934 209 tadejm
      begin
13935 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13936
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13937 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13938
                 5, 9);
13939
      end
13940 243 tadejm
      else if (num_of_frames == 17)
13941 209 tadejm
      begin
13942 243 tadejm
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13943 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13944
                 10, 17);
13945
      end
13946 243 tadejm
      else if (num_of_frames == 27)
13947 209 tadejm
      begin
13948 243 tadejm
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13949 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13950
                 18, 27);
13951
      end
13952 243 tadejm
      else if (num_of_frames == 40)
13953 209 tadejm
      begin
13954 243 tadejm
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13955 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13956
                 28, 40);
13957
      end
13958 243 tadejm
      else if (num_of_frames == 54)
13959 209 tadejm
      begin
13960 243 tadejm
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13961 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13962
                 41, 54);
13963
      end
13964 243 tadejm
      else if (num_of_frames == 69)
13965 209 tadejm
      begin
13966 243 tadejm
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13967 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13968
                 55, 69);
13969
      end
13970 243 tadejm
      else if (num_of_frames == 69)
13971
      begin
13972
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13973
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13974
                 55, 69);
13975
      end
13976
      else if (num_of_frames == 77)
13977
      begin
13978
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13979
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13980
                 70, 77);
13981
      end
13982 209 tadejm
      // set length (loop variable)
13983
      i_length = i_length + 1;
13984
      // the number of frame transmitted
13985
      num_of_frames = num_of_frames + 1;
13986
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13987
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13988
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13989 243 tadejm
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13990
        num_of_bd = 120;
13991 209 tadejm
      else
13992
        num_of_bd = num_of_bd + 1;
13993
    end
13994 243 tadejm
    // disable RX
13995 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13996
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13997
    @(posedge wb_clk);
13998
    if(fail == 0)
13999
      test_ok;
14000
    else
14001
      fail = 0;
14002
  end
14003
 
14004
 
14005 243 tadejm
  ////////////////////////////////////////////////////////////////////
14006
  ////                                                            ////
14007
  ////  Test receive packet synchronization with receive          ////
14008
  ////  disable/enable ( 10Mbps ).                                ////
14009
  ////                                                            ////
14010
  ////////////////////////////////////////////////////////////////////
14011
  if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
14012
  begin
14013
    // TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14014
    test_name   = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14015
    `TIME; $display("  TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14016 209 tadejm
 
14017 243 tadejm
 
14018
 
14019
 
14020
 
14021
 
14022
  end
14023
 
14024
 
14025
  ////////////////////////////////////////////////////////////////////
14026
  ////                                                            ////
14027
  ////  Test receive packet synchronization with receive          ////
14028
  ////  disable/enable ( 10Mbps ).                                ////
14029
  ////                                                            ////
14030
  ////////////////////////////////////////////////////////////////////
14031
  if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
14032
  begin
14033
    // TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14034
    test_name   = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14035
    `TIME; $display("  TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14036
 
14037
 
14038
 
14039
 
14040
 
14041
 
14042
  end
14043
 
14044
 
14045
  ////////////////////////////////////////////////////////////////////
14046
  ////                                                            ////
14047
  ////  Test receive packet synchronization with receive          ////
14048
  ////  disable/enable ( 10Mbps ).                                ////
14049
  ////                                                            ////
14050
  ////////////////////////////////////////////////////////////////////
14051
  if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
14052
  begin
14053
    // TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14054
    test_name   = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14055
    `TIME; $display("  TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14056
 
14057
 
14058
 
14059
 
14060
 
14061
 
14062
  end
14063
 
14064
 
14065
  ////////////////////////////////////////////////////////////////////
14066
  ////                                                            ////
14067
  ////  Test receive packet synchronization with receive          ////
14068
  ////  disable/enable ( 10Mbps ).                                ////
14069
  ////                                                            ////
14070
  ////////////////////////////////////////////////////////////////////
14071
  if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
14072
  begin
14073
    // TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14074
    test_name   = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14075
    `TIME; $display("  TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14076
 
14077
 
14078
 
14079
 
14080
 
14081
 
14082
  end
14083
 
14084
 
14085
 
14086 209 tadejm
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14087
 
14088
end
14089
endtask // test_mac_full_duplex_receive
14090
 
14091
 
14092
task test_mac_full_duplex_flow;
14093
  input  [31:0]  start_task;
14094
  input  [31:0]  end_task;
14095
  integer        bit_start_1;
14096
  integer        bit_end_1;
14097
  integer        bit_start_2;
14098
  integer        bit_end_2;
14099
  integer        num_of_reg;
14100
  integer        num_of_frames;
14101
  integer        num_of_bd;
14102
  integer        i_addr;
14103
  integer        i_data;
14104
  integer        i_length;
14105
  integer        tmp_len;
14106
  integer        tmp_bd;
14107
  integer        tmp_bd_num;
14108
  integer        tmp_data;
14109
  integer        tmp_ipgt;
14110
  integer        test_num;
14111
  reg    [31:0]  tx_bd_num;
14112
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
14113
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
14114
  integer        i;
14115
  integer        i1;
14116
  integer        i2;
14117
  integer        i3;
14118
  integer        fail;
14119
  integer        speed;
14120
  reg            frame_started;
14121
  reg            frame_ended;
14122
  reg            wait_for_frame;
14123
  reg    [31:0]  addr;
14124
  reg    [31:0]  data;
14125
  reg    [31:0]  tmp;
14126
  reg    [ 7:0]  st_data;
14127
  reg    [15:0]  max_tmp;
14128
  reg    [15:0]  min_tmp;
14129
begin
14130
// MAC FULL DUPLEX FLOW TEST
14131
test_heading("MAC FULL DUPLEX FLOW TEST");
14132
$display(" ");
14133
$display("MAC FULL DUPLEX FLOW TEST");
14134
fail = 0;
14135
 
14136
// reset MAC registers
14137
hard_reset;
14138
// reset MAC and MII LOGIC with soft reset
14139
reset_mac;
14140
reset_mii;
14141
// set wb slave response
14142
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14143
 
14144
  /*
14145
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
14146
  -------------------------------------------------------------------------------------
14147
  set_tx_bd
14148
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
14149
  set_tx_bd_wrap
14150
    (tx_bd_num_end[6:0]);
14151
  set_tx_bd_ready
14152
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14153
  check_tx_bd
14154
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
14155
  clear_tx_bd
14156
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14157
 
14158
  TASKS for set and control RX buffer descriptors:
14159
  ------------------------------------------------
14160
  set_rx_bd
14161
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
14162
  set_rx_bd_wrap
14163
    (rx_bd_num_end[6:0]);
14164
  set_rx_bd_empty
14165
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14166
  check_rx_bd
14167
    (rx_bd_num_end[6:0], rx_bd_status);
14168
  clear_rx_bd
14169
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14170
 
14171
  TASKS for set and check TX packets:
14172
  -----------------------------------
14173
  set_tx_packet
14174
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
14175
  check_tx_packet
14176
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
14177
 
14178
  TASKS for set and check RX packets:
14179
  -----------------------------------
14180
  set_rx_packet
14181
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
14182
  check_rx_packet
14183
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
14184
 
14185
  TASKS for append and check CRC to/of TX packet:
14186
  -----------------------------------------------
14187
  append_tx_crc
14188
    (txpnt_wb[31:0], len[15:0], negated_crc);
14189
  check_tx_crc
14190
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
14191
 
14192
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
14193
  --------------------------------------------------------------------------------
14194
  append_rx_crc
14195
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
14196
  */
14197
 
14198
//////////////////////////////////////////////////////////////////////
14199
////                                                              ////
14200
////  test_mac_full_duplex_flow:                                  ////
14201
////                                                              ////
14202
////  0: Test                                                     ////
14203
////                                                              ////
14204
//////////////////////////////////////////////////////////////////////
14205
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
14206
begin
14207
 
14208
  ////////////////////////////////////////////////////////////////////
14209
  ////                                                            ////
14210
  ////  Test                                                      ////
14211
  ////                                                            ////
14212
  ////////////////////////////////////////////////////////////////////
14213
  if (test_num == 0) // Test 
14214
  begin
14215
    // TEST 0: 
14216
    test_name   = "TEST 0: ";
14217
    `TIME; $display("  TEST 0: ");
14218
 
14219
 
14220
  end
14221
 
14222
 
14223
 
14224
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14225
 
14226
end
14227
endtask // test_mac_full_duplex_flow
14228
 
14229
 
14230 169 mohor
//////////////////////////////////////////////////////////////
14231
// WB Behavioral Models Basic tasks
14232
//////////////////////////////////////////////////////////////
14233
 
14234
task wbm_write;
14235
  input  [31:0] address_i;
14236
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
14237
  input  [3:0]  sel_i;
14238
  input  [31:0] size_i;
14239
  input  [3:0]  init_waits_i;
14240
  input  [3:0]  subseq_waits_i;
14241
 
14242
  reg `WRITE_STIM_TYPE write_data;
14243
  reg `WB_TRANSFER_FLAGS flags;
14244
  reg `WRITE_RETURN_TYPE write_status;
14245
  integer i;
14246
begin
14247
  write_status = 0;
14248
 
14249
  flags                    = 0;
14250
  flags`WB_TRANSFER_SIZE   = size_i;
14251
  flags`INIT_WAITS         = init_waits_i;
14252
  flags`SUBSEQ_WAITS       = subseq_waits_i;
14253
 
14254
  write_data               = 0;
14255
  write_data`WRITE_DATA    = data_i[31:0];
14256
  write_data`WRITE_ADDRESS = address_i;
14257
  write_data`WRITE_SEL     = sel_i;
14258
 
14259
  for (i = 0; i < size_i; i = i + 1)
14260
  begin
14261
    wb_master.blk_write_data[i] = write_data;
14262
    data_i                      = data_i >> 32;
14263
    write_data`WRITE_DATA       = data_i[31:0];
14264
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
14265 116 mohor
  end
14266
 
14267 169 mohor
  wb_master.wb_block_write(flags, write_status);
14268 116 mohor
 
14269 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
14270
  begin
14271
    `TIME;
14272
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
14273
  end
14274
end
14275
endtask // wbm_write
14276 116 mohor
 
14277 169 mohor
task wbm_read;
14278
  input  [31:0] address_i;
14279
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
14280
  input  [3:0]  sel_i;
14281
  input  [31:0] size_i;
14282
  input  [3:0]  init_waits_i;
14283
  input  [3:0]  subseq_waits_i;
14284
 
14285
  reg `READ_RETURN_TYPE read_data;
14286
  reg `WB_TRANSFER_FLAGS flags;
14287
  reg `READ_RETURN_TYPE read_status;
14288
  integer i;
14289
begin
14290
  read_status = 0;
14291
  data_o      = 0;
14292
 
14293
  flags                  = 0;
14294
  flags`WB_TRANSFER_SIZE = size_i;
14295
  flags`INIT_WAITS       = init_waits_i;
14296
  flags`SUBSEQ_WAITS     = subseq_waits_i;
14297
 
14298
  read_data              = 0;
14299
  read_data`READ_ADDRESS = address_i;
14300
  read_data`READ_SEL     = sel_i;
14301
 
14302
  for (i = 0; i < size_i; i = i + 1)
14303 116 mohor
  begin
14304 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
14305
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
14306
  end
14307
 
14308
  wb_master.wb_block_read(flags, read_status);
14309
 
14310
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
14311
  begin
14312
    `TIME;
14313
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
14314
  end
14315
 
14316
  for (i = 0; i < size_i; i = i + 1)
14317
  begin
14318
    data_o       = data_o << 32;
14319
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
14320
    data_o[31:0] = read_data`READ_DATA;
14321
  end
14322
end
14323
endtask // wbm_read
14324
 
14325
 
14326
//////////////////////////////////////////////////////////////
14327
// Ethernet Basic tasks
14328
//////////////////////////////////////////////////////////////
14329
 
14330
task hard_reset; //  MAC registers
14331
begin
14332
  // reset MAC registers
14333
  @(posedge wb_clk);
14334
  #2 wb_rst = 1'b1;
14335
  repeat(2) @(posedge wb_clk);
14336
  #2 wb_rst = 1'b0;
14337
end
14338
endtask // hard_reset
14339
 
14340
task reset_mac; //  MAC module
14341
  reg [31:0] tmp;
14342
  reg [31:0] tmp_no_rst;
14343
begin
14344
  // read MODER register first
14345
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14346
  // set reset bit - write back to MODER register with RESET bit
14347
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14348
  // clear reset bit - write back to MODER register without RESET bit
14349
  tmp_no_rst = `ETH_MODER_RST;
14350
  tmp_no_rst = ~tmp_no_rst;
14351
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14352
end
14353
endtask // reset_mac
14354
 
14355
task set_tx_bd;
14356
  input  [6:0]  tx_bd_num_start;
14357
  input  [6:0]  tx_bd_num_end;
14358
  input  [15:0] len;
14359
  input         irq;
14360
  input         pad;
14361
  input         crc;
14362
  input  [31:0] txpnt;
14363
 
14364
  integer       i;
14365
  integer       bd_status_addr, bd_ptr_addr;
14366
//  integer       buf_addr;
14367
begin
14368
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
14369
  begin
14370
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
14371
    bd_status_addr = `TX_BD_BASE + i * 8;
14372
    bd_ptr_addr = bd_status_addr + 4;
14373
    // initialize BD - status
14374
//    wbm_write(bd_status_addr, 32'h00005800, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14375
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
14376
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14377
    // initialize BD - pointer
14378
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14379
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14380
  end
14381
end
14382
endtask // set_tx_bd
14383
 
14384
task set_tx_bd_wrap;
14385
  input  [6:0]  tx_bd_num_end;
14386
  integer       bd_status_addr, tmp;
14387
begin
14388
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
14389
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14390
  // set wrap bit to this BD - this BD should be last-one
14391
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14392
end
14393
endtask // set_tx_bd_wrap
14394
 
14395
task set_tx_bd_ready;
14396
  input  [6:0]  tx_nd_num_strat;
14397
  input  [6:0]  tx_bd_num_end;
14398
  integer       i;
14399
  integer       bd_status_addr, tmp;
14400
begin
14401
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
14402
  begin
14403
    bd_status_addr = `TX_BD_BASE + i * 8;
14404
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14405
    // set empty bit to this BD - this BD should be ready
14406
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14407
  end
14408
end
14409
endtask // set_tx_bd_ready
14410
 
14411
task check_tx_bd;
14412
  input  [6:0]  tx_bd_num_end;
14413
  output [31:0] tx_bd_status;
14414
  integer       bd_status_addr, tmp;
14415
begin
14416
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
14417
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14418
  #1 tx_bd_status = tmp;
14419
  #1;
14420
end
14421
endtask // check_tx_bd
14422
 
14423
task clear_tx_bd;
14424
  input  [6:0]  tx_nd_num_strat;
14425
  input  [6:0]  tx_bd_num_end;
14426
  integer       i;
14427
  integer       bd_status_addr, bd_ptr_addr;
14428
begin
14429
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
14430
  begin
14431
    bd_status_addr = `TX_BD_BASE + i * 8;
14432
    bd_ptr_addr = bd_status_addr + 4;
14433
    // clear BD - status
14434
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14435
    // clear BD - pointer
14436
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14437
  end
14438
end
14439
endtask // clear_tx_bd
14440
 
14441
task set_rx_bd;
14442
  input  [6:0]  rx_bd_num_strat;
14443
  input  [6:0]  rx_bd_num_end;
14444
  input         irq;
14445
  input  [31:0] rxpnt;
14446
//  input  [6:0]  rxbd_num;
14447
  integer       i;
14448
  integer       bd_status_addr, bd_ptr_addr;
14449
//  integer       buf_addr;
14450
begin
14451
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14452
  begin
14453
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
14454 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14455
//    bd_ptr_addr = bd_status_addr + 4; 
14456
    bd_status_addr = `TX_BD_BASE + i * 8;
14457
    bd_ptr_addr = bd_status_addr + 4;
14458 116 mohor
 
14459 169 mohor
    // initialize BD - status
14460
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
14461
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
14462
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14463
    // initialize BD - pointer
14464
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14465
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
14466
  end
14467
end
14468
endtask // set_rx_bd
14469 116 mohor
 
14470 169 mohor
task set_rx_bd_wrap;
14471
  input  [6:0]  rx_bd_num_end;
14472
  integer       bd_status_addr, tmp;
14473
begin
14474 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
14475
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
14476 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14477
  // set wrap bit to this BD - this BD should be last-one
14478
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14479
end
14480
endtask // set_rx_bd_wrap
14481 116 mohor
 
14482 169 mohor
task set_rx_bd_empty;
14483
  input  [6:0]  rx_bd_num_strat;
14484
  input  [6:0]  rx_bd_num_end;
14485
  integer       i;
14486
  integer       bd_status_addr, tmp;
14487
begin
14488
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14489
  begin
14490 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14491
    bd_status_addr = `TX_BD_BASE + i * 8;
14492 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14493
    // set empty bit to this BD - this BD should be ready
14494
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14495 116 mohor
  end
14496 169 mohor
end
14497
endtask // set_rx_bd_empty
14498 116 mohor
 
14499 169 mohor
task check_rx_bd;
14500
  input  [6:0]  rx_bd_num_end;
14501
  output [31:0] rx_bd_status;
14502
  integer       bd_status_addr, tmp;
14503
begin
14504 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
14505
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
14506 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14507
  #1 rx_bd_status = tmp;
14508
  #1;
14509
end
14510
endtask // check_rx_bd
14511 116 mohor
 
14512 169 mohor
task clear_rx_bd;
14513
  input  [6:0]  rx_bd_num_strat;
14514
  input  [6:0]  rx_bd_num_end;
14515
  integer       i;
14516
  integer       bd_status_addr, bd_ptr_addr;
14517
begin
14518
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
14519
  begin
14520 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
14521
    bd_status_addr = `TX_BD_BASE + i * 8;
14522 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
14523
    // clear BD - status
14524
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14525
    // clear BD - pointer
14526
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14527
  end
14528
end
14529
endtask // clear_rx_bd
14530 116 mohor
 
14531 169 mohor
task set_tx_packet;
14532
  input  [31:0] txpnt;
14533
  input  [15:0] len;
14534
  input  [7:0]  eth_start_data;
14535
  integer       i, sd;
14536
  integer       buffer;
14537
  reg           delta_t;
14538
begin
14539
  buffer = txpnt;
14540
  sd = eth_start_data;
14541
  delta_t = 0;
14542 116 mohor
 
14543 169 mohor
  // First write might not be word allign.
14544
  if(buffer[1:0] == 1)
14545
  begin
14546
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
14547
    sd = sd + 3;
14548
    i = 3;
14549
  end
14550
  else if(buffer[1:0] == 2)
14551
  begin
14552
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
14553
    sd = sd + 2;
14554
    i = 2;
14555
  end
14556
  else if(buffer[1:0] == 3)
14557
  begin
14558
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
14559
    sd = sd + 1;
14560
    i = 1;
14561
  end
14562
  else
14563
    i = 0;
14564
  delta_t = !delta_t;
14565 116 mohor
 
14566 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
14567
  begin
14568
    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);
14569
    sd = sd + 4;
14570
  end
14571
  delta_t = !delta_t;
14572
 
14573
  // Last word
14574
  if((len - i) == 3)
14575 116 mohor
  begin
14576 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);
14577
  end
14578
  else if((len - i) == 2)
14579
  begin
14580
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
14581
  end
14582
  else if((len - i) == 1)
14583
  begin
14584
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
14585
  end
14586
  else if((len - i) == 4)
14587
  begin
14588
    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);
14589
  end
14590
  else
14591
    $display("(%0t)(%m) ERROR", $time);
14592
  delta_t = !delta_t;
14593
end
14594
endtask // set_tx_packet
14595
 
14596
task check_tx_packet;
14597
  input  [31:0] txpnt_wb;  // source
14598
  input  [31:0] txpnt_phy; // destination
14599
  input  [15:0] len;
14600
  output [31:0] failure;
14601
  integer       i, data_wb, data_phy;
14602
  reg    [31:0] addr_wb, addr_phy;
14603
  reg    [31:0] failure;
14604
  reg           delta_t;
14605
begin
14606
  addr_wb = txpnt_wb;
14607
  addr_phy = txpnt_phy;
14608
  delta_t = 0;
14609
  failure = 0;
14610 209 tadejm
  #1;
14611 169 mohor
  // First write might not be word allign.
14612
  if(addr_wb[1:0] == 1)
14613
  begin
14614
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
14615
    data_phy[31:24] = 0;
14616
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
14617
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
14618
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
14619
    i = 3;
14620
    if (data_phy[23:0] !== data_wb[23:0])
14621
    begin
14622
      `TIME;
14623 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
14624
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14625 169 mohor
      failure = 1;
14626
    end
14627
  end
14628
  else if (addr_wb[1:0] == 2)
14629
  begin
14630
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
14631
    data_phy[31:16] = 0;
14632
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
14633
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
14634
    i = 2;
14635
    if (data_phy[15:0] !== data_wb[15:0])
14636
    begin
14637
      `TIME;
14638 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
14639
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14640 169 mohor
      failure = 1;
14641
    end
14642
  end
14643
  else if (addr_wb[1:0] == 3)
14644
  begin
14645
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
14646
    data_phy[31: 8] = 0;
14647
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
14648
    i = 1;
14649
    if (data_phy[7:0] !== data_wb[7:0])
14650
    begin
14651
      `TIME;
14652 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
14653
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14654 169 mohor
      failure = 1;
14655
    end
14656
  end
14657
  else
14658
    i = 0;
14659
  delta_t = !delta_t;
14660 209 tadejm
  #1;
14661 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
14662
  begin
14663
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14664
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14665
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14666
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14667
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
14668
    if (data_phy[31:0] !== data_wb[31:0])
14669
    begin
14670
      `TIME;
14671 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]);
14672
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14673 169 mohor
      failure = failure + 1;
14674
    end
14675
  end
14676
  delta_t = !delta_t;
14677 209 tadejm
  #1;
14678 169 mohor
  // Last word
14679
  if((len - i) == 3)
14680
  begin
14681
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
14682
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14683
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14684
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14685
    data_phy[ 7: 0] = 0;
14686
    if (data_phy[31:8] !== data_wb[31:8])
14687
    begin
14688
      `TIME;
14689 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]);
14690
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14691 169 mohor
      failure = failure + 1;
14692
    end
14693
  end
14694
  else if((len - i) == 2)
14695
  begin
14696
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
14697
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14698
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14699
    data_phy[15: 8] = 0;
14700
    data_phy[ 7: 0] = 0;
14701
    if (data_phy[31:16] !== data_wb[31:16])
14702
    begin
14703
      `TIME;
14704 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]);
14705
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14706 169 mohor
      failure = failure + 1;
14707
    end
14708
  end
14709
  else if((len - i) == 1)
14710
  begin
14711
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
14712
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14713
    data_phy[23:16] = 0;
14714
    data_phy[15: 8] = 0;
14715
    data_phy[ 7: 0] = 0;
14716
    if (data_phy[31:24] !== data_wb[31:24])
14717
    begin
14718
      `TIME;
14719 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]);
14720
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14721 169 mohor
      failure = failure + 1;
14722
    end
14723
  end
14724
  else if((len - i) == 4)
14725
  begin
14726
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14727
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
14728
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
14729
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
14730
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
14731
    if (data_phy[31:0] !== data_wb[31:0])
14732
    begin
14733
      `TIME;
14734 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]);
14735
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
14736 169 mohor
      failure = failure + 1;
14737
    end
14738
  end
14739
  else
14740
    $display("(%0t)(%m) ERROR", $time);
14741
  delta_t = !delta_t;
14742
end
14743
endtask // check_tx_packet
14744
 
14745
task set_rx_packet;
14746
  input  [31:0] rxpnt;
14747
  input  [15:0] len;
14748
  input         plus_dribble_nibble; // if length is longer for one nibble
14749
  input  [47:0] eth_dest_addr;
14750
  input  [47:0] eth_source_addr;
14751
  input  [15:0] eth_type_len;
14752
  input  [7:0]  eth_start_data;
14753
  integer       i, sd;
14754
  reg    [47:0] dest_addr;
14755
  reg    [47:0] source_addr;
14756
  reg    [15:0] type_len;
14757
  reg    [21:0] buffer;
14758
  reg           delta_t;
14759
begin
14760
  buffer = rxpnt[21:0];
14761
  dest_addr = eth_dest_addr;
14762
  source_addr = eth_source_addr;
14763
  type_len = eth_type_len;
14764
  sd = eth_start_data;
14765
  delta_t = 0;
14766
  for(i = 0; i < len; i = i + 1)
14767
  begin
14768
    if (i < 6)
14769
    begin
14770
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
14771
      dest_addr = dest_addr << 8;
14772
    end
14773
    else if (i < 12)
14774
    begin
14775
      eth_phy.rx_mem[buffer] = source_addr[47:40];
14776
      source_addr = source_addr << 8;
14777
    end
14778
    else if (i < 14)
14779
    begin
14780
      eth_phy.rx_mem[buffer] = type_len[15:8];
14781
      type_len = type_len << 8;
14782
    end
14783
    else
14784
    begin
14785
      eth_phy.rx_mem[buffer] = sd[7:0];
14786
      sd = sd + 1;
14787
    end
14788
    buffer = buffer + 1;
14789
  end
14790
  delta_t = !delta_t;
14791
  if (plus_dribble_nibble)
14792
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
14793
  delta_t = !delta_t;
14794
end
14795
endtask // set_rx_packet
14796
 
14797 243 tadejm
task set_rx_addr_type;
14798
  input  [31:0] rxpnt;
14799
  input  [47:0] eth_dest_addr;
14800
  input  [47:0] eth_source_addr;
14801
  input  [15:0] eth_type_len;
14802
  integer       i;
14803
  reg    [47:0] dest_addr;
14804
  reg    [47:0] source_addr;
14805
  reg    [15:0] type_len;
14806
  reg    [21:0] buffer;
14807
  reg           delta_t;
14808
begin
14809
  buffer = rxpnt[21:0];
14810
  dest_addr = eth_dest_addr;
14811
  source_addr = eth_source_addr;
14812
  type_len = eth_type_len;
14813
  delta_t = 0;
14814
  for(i = 0; i < 14; i = i + 1)
14815
  begin
14816
    if (i < 6)
14817
    begin
14818
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
14819
      dest_addr = dest_addr << 8;
14820
    end
14821
    else if (i < 12)
14822
    begin
14823
      eth_phy.rx_mem[buffer] = source_addr[47:40];
14824
      source_addr = source_addr << 8;
14825
    end
14826
    else // if (i < 14)
14827
    begin
14828
      eth_phy.rx_mem[buffer] = type_len[15:8];
14829
      type_len = type_len << 8;
14830
    end
14831
    buffer = buffer + 1;
14832
  end
14833
  delta_t = !delta_t;
14834
end
14835
endtask // set_rx_addr_type
14836
 
14837 169 mohor
task check_rx_packet;
14838
  input  [31:0] rxpnt_phy; // source
14839
  input  [31:0] rxpnt_wb;  // destination
14840
  input  [15:0] len;
14841
  input         plus_dribble_nibble; // if length is longer for one nibble
14842
  input         successful_dribble_nibble; // if additional nibble is stored into memory
14843
  output [31:0] failure;
14844
  integer       i, data_wb, data_phy;
14845
  reg    [31:0] addr_wb, addr_phy;
14846
  reg    [31:0] failure;
14847
  reg    [21:0] buffer;
14848
  reg           delta_t;
14849
begin
14850
  addr_phy = rxpnt_phy;
14851
  addr_wb = rxpnt_wb;
14852
  delta_t = 0;
14853
  failure = 0;
14854
 
14855
  // First write might not be word allign.
14856
  if(addr_wb[1:0] == 1)
14857
  begin
14858
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
14859
    data_phy[31:24] = 0;
14860
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
14861
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
14862
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
14863
    i = 3;
14864
    if (data_phy[23:0] !== data_wb[23:0])
14865
    begin
14866
      `TIME;
14867 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14868
      $display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
14869 169 mohor
      failure = 1;
14870
    end
14871
  end
14872
  else if (addr_wb[1:0] == 2)
14873
  begin
14874
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
14875
    data_phy[31:16] = 0;
14876
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
14877
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
14878
    i = 2;
14879
    if (data_phy[15:0] !== data_wb[15:0])
14880
    begin
14881
      `TIME;
14882 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14883
      $display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
14884 169 mohor
      failure = 1;
14885
    end
14886
  end
14887
  else if (addr_wb[1:0] == 3)
14888
  begin
14889
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
14890
    data_phy[31: 8] = 0;
14891
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
14892
    i = 1;
14893
    if (data_phy[7:0] !== data_wb[7:0])
14894
    begin
14895
      `TIME;
14896 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14897
      $display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
14898 169 mohor
      failure = 1;
14899
    end
14900
  end
14901
  else
14902
    i = 0;
14903
  delta_t = !delta_t;
14904
 
14905
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
14906
  begin
14907
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14908
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14909
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14910
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14911
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
14912
    if (data_phy[31:0] !== data_wb[31:0])
14913
    begin
14914
      `TIME;
14915 243 tadejm
      if (i == 0)
14916
        $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
14917
      $display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
14918 169 mohor
      failure = failure + 1;
14919
    end
14920
  end
14921
  delta_t = !delta_t;
14922
 
14923
  // Last word
14924
  if((len - i) == 3)
14925
  begin
14926
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
14927
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14928
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14929
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14930
    if (plus_dribble_nibble)
14931
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
14932
    else
14933
      data_phy[ 7: 0] = 0;
14934
    if (data_phy[31:8] !== data_wb[31:8])
14935
    begin
14936
      `TIME;
14937 243 tadejm
      $display("*E Wrong %0d. word (3 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
14938 169 mohor
      failure = failure + 1;
14939
    end
14940
    if (plus_dribble_nibble && successful_dribble_nibble)
14941
    begin
14942
      if (data_phy[3:0] !== data_wb[3:0])
14943 116 mohor
      begin
14944 169 mohor
        `TIME;
14945 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
14946 169 mohor
        failure = failure + 1;
14947 116 mohor
      end
14948 169 mohor
    end
14949
    else if (plus_dribble_nibble && !successful_dribble_nibble)
14950
    begin
14951
      if (data_phy[3:0] === data_wb[3:0])
14952 116 mohor
      begin
14953 169 mohor
        `TIME;
14954 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
14955 169 mohor
        failure = failure + 1;
14956 116 mohor
      end
14957 169 mohor
    end
14958
  end
14959
  else if((len - i) == 2)
14960
  begin
14961
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
14962
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14963
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
14964
    if (plus_dribble_nibble)
14965
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
14966
    else
14967
      data_phy[15: 8] = 0;
14968
    data_phy[ 7: 0] = 0;
14969
    if (data_phy[31:16] !== data_wb[31:16])
14970
    begin
14971
      `TIME;
14972 243 tadejm
      $display("*E Wrong %0d. word (2 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
14973 169 mohor
      failure = failure + 1;
14974
    end
14975
    if (plus_dribble_nibble && successful_dribble_nibble)
14976
    begin
14977
      if (data_phy[11:8] !== data_wb[11:8])
14978
      begin
14979
        `TIME;
14980 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
14981 169 mohor
        failure = failure + 1;
14982
      end
14983
    end
14984
    else if (plus_dribble_nibble && !successful_dribble_nibble)
14985
    begin
14986
      if (data_phy[11:8] === data_wb[11:8])
14987
      begin
14988
        `TIME;
14989 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
14990 169 mohor
        failure = failure + 1;
14991
      end
14992
    end
14993
  end
14994
  else if((len - i) == 1)
14995
  begin
14996
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
14997
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
14998
    if (plus_dribble_nibble)
14999
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
15000
    else
15001
      data_phy[23:16] = 0;
15002
    data_phy[15: 8] = 0;
15003
    data_phy[ 7: 0] = 0;
15004
    if (data_phy[31:24] !== data_wb[31:24])
15005
    begin
15006
      `TIME;
15007 243 tadejm
      $display("*E Wrong %0d. word (1 byte) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
15008 169 mohor
      failure = failure + 1;
15009
    end
15010
    if (plus_dribble_nibble && successful_dribble_nibble)
15011
    begin
15012
      if (data_phy[19:16] !== data_wb[19:16])
15013
      begin
15014
        `TIME;
15015 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
15016 169 mohor
        failure = failure + 1;
15017
      end
15018
    end
15019
    else if (plus_dribble_nibble && !successful_dribble_nibble)
15020
    begin
15021
      if (data_phy[19:16] === data_wb[19:16])
15022
      begin
15023
        `TIME;
15024 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
15025 169 mohor
        failure = failure + 1;
15026
      end
15027
    end
15028
  end
15029
  else if((len - i) == 4)
15030
  begin
15031
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
15032
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
15033
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
15034
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
15035
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
15036
    if (data_phy[31:0] !== data_wb[31:0])
15037
    begin
15038
      `TIME;
15039 243 tadejm
      $display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
15040 169 mohor
      failure = failure + 1;
15041
    end
15042
    if (plus_dribble_nibble)
15043
    begin
15044
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
15045
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
15046
      if (successful_dribble_nibble)
15047
      begin
15048
        if (data_phy[27:24] !== data_wb[27:24])
15049
        begin
15050
          `TIME;
15051 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
15052 169 mohor
          failure = failure + 1;
15053
        end
15054
      end
15055
      else
15056
      begin
15057
        if (data_phy[27:24] === data_wb[27:24])
15058
        begin
15059
          `TIME;
15060 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
15061 169 mohor
          failure = failure + 1;
15062
        end
15063
      end
15064
    end
15065
  end
15066
  else
15067
    $display("(%0t)(%m) ERROR", $time);
15068
  delta_t = !delta_t;
15069
end
15070
endtask // check_rx_packet
15071 116 mohor
 
15072 169 mohor
//////////////////////////////////////////////////////////////
15073
// Ethernet CRC Basic tasks
15074
//////////////////////////////////////////////////////////////
15075
 
15076
task append_tx_crc;
15077
  input  [31:0] txpnt_wb;  // source
15078
  input  [15:0] len; // length in bytes without CRC
15079
  input         negated_crc; // if appended CRC is correct or not
15080
  reg    [31:0] crc;
15081
  reg    [31:0] addr_wb;
15082
  reg           delta_t;
15083
begin
15084 243 tadejm
  addr_wb = txpnt_wb + {16'h0, len};
15085 169 mohor
  delta_t = 0;
15086
  // calculate CRC from prepared packet
15087
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
15088
  if (negated_crc)
15089
    crc = ~crc;
15090
  delta_t = !delta_t;
15091
 
15092
  // Write might not be word allign.
15093
  if (addr_wb[1:0] == 1)
15094
  begin
15095
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
15096
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
15097 116 mohor
  end
15098 169 mohor
  else if (addr_wb[1:0] == 2)
15099
  begin
15100
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
15101
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
15102
  end
15103
  else if (addr_wb[1:0] == 3)
15104
  begin
15105
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
15106
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
15107
  end
15108
  else
15109
  begin
15110
    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
15111
  end
15112
  delta_t = !delta_t;
15113
end
15114
endtask // append_tx_crc
15115 116 mohor
 
15116 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
15117
  input  [31:0] txpnt_phy; // destination
15118
  input  [15:0] len; // length in bytes without CRC
15119
  input         negated_crc; // if appended CRC is correct or not
15120
  output [31:0] failure;
15121
  reg    [31:0] failure;
15122
  reg    [31:0] crc_calc;
15123
  reg    [31:0] crc;
15124
  reg    [31:0] addr_phy;
15125
  reg           delta_t;
15126
begin
15127
  addr_phy = txpnt_phy;
15128
  failure = 0;
15129
  // calculate CRC from sent packet
15130
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
15131
//#10;
15132
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
15133 209 tadejm
  #1;
15134 169 mohor
  addr_phy = addr_phy + len;
15135
  // Read CRC - BIG endian
15136
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
15137
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
15138
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
15139
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
15140
 
15141
  delta_t = !delta_t;
15142
  if (negated_crc)
15143
  begin
15144
    if ((~crc_calc) !== crc)
15145
    begin
15146
      `TIME;
15147
      $display("*E Negated CRC was not successfuly transmitted!");
15148
      failure = failure + 1;
15149
    end
15150
  end
15151
  else
15152
  begin
15153
    if (crc_calc !== crc)
15154
    begin
15155
      `TIME;
15156 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
15157 169 mohor
      failure = failure + 1;
15158
    end
15159
  end
15160
  delta_t = !delta_t;
15161
end
15162
endtask // check_tx_crc
15163
 
15164
task append_rx_crc;
15165
  input  [31:0] rxpnt_phy; // source
15166
  input  [15:0] len; // length in bytes without CRC
15167
  input         plus_dribble_nibble; // if length is longer for one nibble
15168
  input         negated_crc; // if appended CRC is correct or not
15169
  reg    [31:0] crc;
15170
  reg    [7:0]  tmp;
15171
  reg    [31:0] addr_phy;
15172
  reg           delta_t;
15173
begin
15174
  addr_phy = rxpnt_phy + len;
15175
  delta_t = 0;
15176
  // calculate CRC from prepared packet
15177
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
15178
  if (negated_crc)
15179
    crc = ~crc;
15180
  delta_t = !delta_t;
15181
 
15182
  if (plus_dribble_nibble)
15183
  begin
15184
    tmp = eth_phy.rx_mem[addr_phy];
15185 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
15186
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
15187
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
15188
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
15189
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
15190 169 mohor
  end
15191
  else
15192
  begin
15193 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
15194
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
15195
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
15196
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
15197 169 mohor
  end
15198
end
15199
endtask // append_rx_crc
15200
 
15201
// paralel CRC checking for PHY TX
15202
task paralel_crc_phy_tx;
15203
  input  [31:0] start_addr; // start address
15204
  input  [31:0] len; // length of frame in Bytes without CRC length
15205
  input         plus_dribble_nibble; // if length is longer for one nibble
15206
  output [31:0] crc_out;
15207
  reg    [21:0] addr_cnt; // only 22 address lines
15208
  integer       word_cnt;
15209
  integer       nibble_cnt;
15210
  reg    [31:0] load_reg;
15211
  reg           delta_t;
15212
  reg    [31:0] crc_next;
15213
  reg    [31:0] crc;
15214
  reg           crc_error;
15215
  reg     [3:0] data_in;
15216
  integer       i;
15217
begin
15218
  #1 addr_cnt = start_addr[21:0];
15219
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15220
  crc = 32'hFFFF_FFFF; // INITIAL value
15221
  delta_t = 0;
15222
  // length must include 4 bytes of ZEROs, to generate CRC
15223
  // get number of nibbles from Byte length (2^1 = 2)
15224
  if (plus_dribble_nibble)
15225
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15226
  else
15227
    nibble_cnt = ((len + 4) << 1);
15228
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15229
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15230
  addr_cnt = addr_cnt + 1;
15231
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15232
  addr_cnt = addr_cnt + 1;
15233
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15234
  addr_cnt = addr_cnt + 1;
15235
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15236
  addr_cnt = addr_cnt + 1;
15237
  while (nibble_cnt > 0)
15238
  begin
15239
    // wait for delta time
15240
    delta_t = !delta_t;
15241
    // shift data in
15242
 
15243
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15244
      data_in[3:0] = 4'h0;
15245
    else
15246
 
15247
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15248
    crc_next[0]  = (data_in[0] ^ crc[28]);
15249
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15250
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15251
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15252
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15253
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15254
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15255
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15256
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15257
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15258
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15259
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15260
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15261
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15262
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15263
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15264
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15265
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15266
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15267
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15268
    crc_next[20] =  crc[16];
15269
    crc_next[21] =  crc[17];
15270
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15271
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15272
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15273
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15274
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15275
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15276
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15277
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15278
    crc_next[30] =  crc[26];
15279
    crc_next[31] =  crc[27];
15280
 
15281
    crc = crc_next;
15282
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15283
    case (nibble_cnt)
15284
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15285
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15286
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15287
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15288
    default: crc_out = crc_out;
15289
    endcase
15290
    // wait for delta time
15291
    delta_t = !delta_t;
15292
    // increment address and load new data
15293
    if ((word_cnt+3) == 7)//4)
15294
    begin
15295
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15296
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15297
      addr_cnt = addr_cnt + 1;
15298
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15299
      addr_cnt = addr_cnt + 1;
15300
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15301
      addr_cnt = addr_cnt + 1;
15302
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15303
      addr_cnt = addr_cnt + 1;
15304
    end
15305
    // set new load bit position
15306
    if((word_cnt+3) == 31)
15307
      word_cnt = 16;
15308
    else if ((word_cnt+3) == 23)
15309
      word_cnt = 8;
15310
    else if ((word_cnt+3) == 15)
15311
      word_cnt = 0;
15312
    else if ((word_cnt+3) == 7)
15313
      word_cnt = 24;
15314
    else
15315
      word_cnt = word_cnt + 4;// - 4;
15316
    // decrement nibble counter
15317
    nibble_cnt = nibble_cnt - 1;
15318
    // wait for delta time
15319
    delta_t = !delta_t;
15320
  end // while
15321
  #1;
15322
end
15323
endtask // paralel_crc_phy_tx
15324
 
15325
// paralel CRC calculating for PHY RX
15326
task paralel_crc_phy_rx;
15327
  input  [31:0] start_addr; // start address
15328
  input  [31:0] len; // length of frame in Bytes without CRC length
15329
  input         plus_dribble_nibble; // if length is longer for one nibble
15330 209 tadejm
  output [31:0] crc_out;
15331 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
15332
  integer       word_cnt;
15333 209 tadejm
  integer       nibble_cnt;
15334 169 mohor
  reg    [31:0] load_reg;
15335
  reg           delta_t;
15336 209 tadejm
  reg    [31:0] crc_next;
15337
  reg    [31:0] crc;
15338
  reg           crc_error;
15339
  reg     [3:0] data_in;
15340
  integer       i;
15341 169 mohor
begin
15342
  #1 addr_cnt = start_addr[21:0];
15343 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15344
  crc = 32'hFFFF_FFFF; // INITIAL value
15345 169 mohor
  delta_t = 0;
15346
  // length must include 4 bytes of ZEROs, to generate CRC
15347 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
15348 169 mohor
  if (plus_dribble_nibble)
15349 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15350 169 mohor
  else
15351 209 tadejm
    nibble_cnt = ((len + 4) << 1);
15352
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15353 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15354
  addr_cnt = addr_cnt + 1;
15355
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15356
  addr_cnt = addr_cnt + 1;
15357 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
15358 169 mohor
  addr_cnt = addr_cnt + 1;
15359 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
15360
  addr_cnt = addr_cnt + 1;
15361
  while (nibble_cnt > 0)
15362 169 mohor
  begin
15363
    // wait for delta time
15364
    delta_t = !delta_t;
15365
    // shift data in
15366 209 tadejm
 
15367
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15368
      data_in[3:0] = 4'h0;
15369 169 mohor
    else
15370 209 tadejm
 
15371
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15372
    crc_next[0]  = (data_in[0] ^ crc[28]);
15373
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15374
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15375
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15376
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15377
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15378
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15379
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15380
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15381
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15382
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15383
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15384
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15385
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15386
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15387
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15388
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15389
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15390
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15391
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15392
    crc_next[20] =  crc[16];
15393
    crc_next[21] =  crc[17];
15394
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15395
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15396
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15397
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15398
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15399
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15400
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15401
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15402
    crc_next[30] =  crc[26];
15403
    crc_next[31] =  crc[27];
15404
 
15405
    crc = crc_next;
15406
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15407
    case (nibble_cnt)
15408
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15409
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15410
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15411
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15412
    default: crc_out = crc_out;
15413
    endcase
15414 169 mohor
    // wait for delta time
15415
    delta_t = !delta_t;
15416
    // increment address and load new data
15417 209 tadejm
    if ((word_cnt+3) == 7)//4)
15418 169 mohor
    begin
15419 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15420 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15421
      addr_cnt = addr_cnt + 1;
15422
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15423
      addr_cnt = addr_cnt + 1;
15424 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
15425 169 mohor
      addr_cnt = addr_cnt + 1;
15426 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
15427
      addr_cnt = addr_cnt + 1;
15428 169 mohor
    end
15429
    // set new load bit position
15430 209 tadejm
    if((word_cnt+3) == 31)
15431 169 mohor
      word_cnt = 16;
15432 209 tadejm
    else if ((word_cnt+3) == 23)
15433 169 mohor
      word_cnt = 8;
15434 209 tadejm
    else if ((word_cnt+3) == 15)
15435 169 mohor
      word_cnt = 0;
15436 209 tadejm
    else if ((word_cnt+3) == 7)
15437 169 mohor
      word_cnt = 24;
15438
    else
15439 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
15440
    // decrement nibble counter
15441
    nibble_cnt = nibble_cnt - 1;
15442 169 mohor
    // wait for delta time
15443
    delta_t = !delta_t;
15444
  end // while
15445
  #1;
15446
end
15447
endtask // paralel_crc_phy_rx
15448
 
15449
// paralel CRC checking for MAC
15450
task paralel_crc_mac;
15451
  input  [31:0] start_addr; // start address
15452
  input  [31:0] len; // length of frame in Bytes without CRC length
15453
  input         plus_dribble_nibble; // if length is longer for one nibble
15454 209 tadejm
  output [31:0] crc_out;
15455
 
15456
  reg    [21:0] addr_cnt; // only 22 address lines
15457 169 mohor
  integer       word_cnt;
15458 209 tadejm
  integer       nibble_cnt;
15459 169 mohor
  reg    [31:0] load_reg;
15460
  reg           delta_t;
15461 209 tadejm
  reg    [31:0] crc_next;
15462
  reg    [31:0] crc;
15463
  reg           crc_error;
15464
  reg     [3:0] data_in;
15465
  integer       i;
15466 169 mohor
begin
15467
  #1 addr_cnt = start_addr[19:0];
15468
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
15469
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
15470
  if (addr_cnt[1:0] == 2'h1)
15471
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15472
  else if (addr_cnt[1:0] == 2'h2)
15473
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15474
  else if (addr_cnt[1:0] == 2'h3)
15475
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15476
  else
15477
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15478 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
15479 169 mohor
  delta_t = 0;
15480
  // length must include 4 bytes of ZEROs, to generate CRC
15481 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
15482 169 mohor
  if (plus_dribble_nibble)
15483 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
15484 169 mohor
  else
15485 209 tadejm
    nibble_cnt = ((len + 4) << 1);
15486 169 mohor
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15487 209 tadejm
  addr_cnt = addr_cnt + 4;
15488
  while (nibble_cnt > 0)
15489 169 mohor
  begin
15490
    // wait for delta time
15491
    delta_t = !delta_t;
15492
    // shift data in
15493 209 tadejm
 
15494
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
15495
      data_in[3:0] = 4'h0;
15496 169 mohor
    else
15497 209 tadejm
 
15498
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
15499
    crc_next[0]  = (data_in[0] ^ crc[28]);
15500
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
15501
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
15502
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
15503
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
15504
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
15505
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
15506
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
15507
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
15508
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
15509
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
15510
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
15511
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
15512
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
15513
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
15514
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
15515
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
15516
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
15517
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
15518
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
15519
    crc_next[20] =  crc[16];
15520
    crc_next[21] =  crc[17];
15521
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
15522
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
15523
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
15524
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
15525
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
15526
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
15527
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
15528
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
15529
    crc_next[30] =  crc[26];
15530
    crc_next[31] =  crc[27];
15531
 
15532
    crc = crc_next;
15533
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
15534
    case (nibble_cnt)
15535
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15536
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15537
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15538
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15539
    default: crc_out = crc_out;
15540
    endcase
15541 169 mohor
    // wait for delta time
15542
    delta_t = !delta_t;
15543 209 tadejm
    // increment address and load new data
15544
    if ((word_cnt+3) == 7)//4)
15545 169 mohor
    begin
15546 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15547
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15548 169 mohor
      addr_cnt = addr_cnt + 4;
15549
    end
15550 209 tadejm
    // set new load bit position
15551
    if((word_cnt+3) == 31)
15552 169 mohor
      word_cnt = 16;
15553 209 tadejm
    else if ((word_cnt+3) == 23)
15554 169 mohor
      word_cnt = 8;
15555 209 tadejm
    else if ((word_cnt+3) == 15)
15556 169 mohor
      word_cnt = 0;
15557 209 tadejm
    else if ((word_cnt+3) == 7)
15558 169 mohor
      word_cnt = 24;
15559
    else
15560 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
15561
    // decrement nibble counter
15562
    nibble_cnt = nibble_cnt - 1;
15563 169 mohor
    // wait for delta time
15564
    delta_t = !delta_t;
15565
  end // while
15566
  #1;
15567
end
15568
endtask // paralel_crc_mac
15569
 
15570
// serial CRC checking for PHY TX
15571
task serial_crc_phy_tx;
15572
  input  [31:0] start_addr; // start address
15573
  input  [31:0] len; // length of frame in Bytes without CRC length
15574
  input         plus_dribble_nibble; // if length is longer for one nibble
15575
  output [31:0] crc;
15576
  reg    [21:0] addr_cnt; // only 22 address lines
15577
  integer       word_cnt;
15578
  integer       bit_cnt;
15579
  reg    [31:0] load_reg;
15580
  reg    [31:0] crc_shift_reg;
15581
  reg    [31:0] crc_store_reg;
15582
  reg           delta_t;
15583
begin
15584
  #1 addr_cnt = start_addr[21:0];
15585
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
15586
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
15587
  delta_t = 0;
15588
  // length must include 4 bytes of ZEROs, to generate CRC
15589
  // get number of bits from Byte length (2^3 = 8)
15590
  if (plus_dribble_nibble)
15591
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15592
  else
15593
    bit_cnt = ((len + 4) << 3);
15594
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15595
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15596
  addr_cnt = addr_cnt + 1;
15597
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15598
  addr_cnt = addr_cnt + 1;
15599
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15600
  addr_cnt = addr_cnt + 1;
15601
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15602
  addr_cnt = addr_cnt + 1;
15603
#1;
15604
  while (bit_cnt > 0)
15605
  begin
15606
    // wait for delta time
15607
    delta_t = !delta_t;
15608
#1;
15609
    // shift data in
15610
 
15611
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15612
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15613
    else
15614
 
15615
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15616
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15617
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15618
    crc_shift_reg[3]  = crc_store_reg[2];
15619
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15620
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15621
    crc_shift_reg[6]  = crc_store_reg[5];
15622
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15623
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15624
    crc_shift_reg[9]  = crc_store_reg[8];
15625
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15626
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15627
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15628
    crc_shift_reg[13] = crc_store_reg[12];
15629
    crc_shift_reg[14] = crc_store_reg[13];
15630
    crc_shift_reg[15] = crc_store_reg[14];
15631
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15632
    crc_shift_reg[17] = crc_store_reg[16];
15633
    crc_shift_reg[18] = crc_store_reg[17];
15634
    crc_shift_reg[19] = crc_store_reg[18];
15635
    crc_shift_reg[20] = crc_store_reg[19];
15636
    crc_shift_reg[21] = crc_store_reg[20];
15637
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15638
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15639
    crc_shift_reg[24] = crc_store_reg[23];
15640
    crc_shift_reg[25] = crc_store_reg[24];
15641
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15642
    crc_shift_reg[27] = crc_store_reg[26];
15643
    crc_shift_reg[28] = crc_store_reg[27];
15644
    crc_shift_reg[29] = crc_store_reg[28];
15645
    crc_shift_reg[30] = crc_store_reg[29];
15646
    crc_shift_reg[31] = crc_store_reg[30];
15647
    // wait for delta time
15648
    delta_t = !delta_t;
15649
 
15650
    // store previous data
15651
    crc_store_reg = crc_shift_reg;
15652
 
15653
    // put CRC out
15654
    case (bit_cnt)
15655
    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:
15656
    begin
15657
      crc = crc_store_reg;
15658
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
15659
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
15660
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
15661
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
15662
    end
15663
    default: crc = crc;
15664
    endcase
15665
 
15666
    // increment address and load new data
15667
#1;
15668
    if (word_cnt == 7)//4)
15669
    begin
15670
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
15671
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
15672
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
15673
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
15674
      addr_cnt = addr_cnt + 1;
15675
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
15676
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
15677
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
15678
      addr_cnt = addr_cnt + 1;
15679
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
15680
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
15681
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
15682
      addr_cnt = addr_cnt + 1;
15683
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
15684
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
15685
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
15686
      addr_cnt = addr_cnt + 1;
15687
    end
15688
#1;
15689
    // set new load bit position
15690
    if(word_cnt == 31)
15691
      word_cnt = 16;
15692
    else if (word_cnt == 23)
15693
      word_cnt = 8;
15694
    else if (word_cnt == 15)
15695
      word_cnt = 0;
15696
    else if (word_cnt == 7)
15697
      word_cnt = 24;
15698
 
15699
//   if(word_cnt == 24)
15700
//     word_cnt = 31;
15701
//   else if (word_cnt == 28)
15702
//     word_cnt = 19;
15703
//   else if (word_cnt == 16)
15704
//     word_cnt = 23;
15705
//   else if (word_cnt == 20)
15706
//     word_cnt = 11;
15707
//   else if(word_cnt == 8)
15708
//     word_cnt = 15;
15709
//   else if (word_cnt == 12)
15710
//     word_cnt = 3;
15711
//   else if (word_cnt == 0)
15712
//     word_cnt = 7;
15713
//   else if (word_cnt == 4)
15714
//     word_cnt = 27;
15715
    else
15716
      word_cnt = word_cnt + 1;// - 1;
15717
#1;
15718
    // decrement bit counter
15719
    bit_cnt = bit_cnt - 1;
15720
#1;
15721
    // wait for delta time
15722
    delta_t = !delta_t;
15723
  end // while
15724
 
15725
  #1;
15726
end
15727
endtask // serial_crc_phy_tx
15728
 
15729
// serial CRC calculating for PHY RX
15730
task serial_crc_phy_rx;
15731
  input  [31:0] start_addr; // start address
15732
  input  [31:0] len; // length of frame in Bytes without CRC length
15733
  input         plus_dribble_nibble; // if length is longer for one nibble
15734
  output [31:0] crc;
15735
  reg    [21:0] addr_cnt; // only 22 address lines
15736
  integer       word_cnt;
15737
  integer       bit_cnt;
15738
  reg    [31:0] load_reg;
15739
  reg    [31:0] crc_shift_reg;
15740
  reg    [31:0] crc_store_reg;
15741
  reg           delta_t;
15742
begin
15743
  #1 addr_cnt = start_addr[21:0];
15744
  word_cnt = 24; // start of the frame
15745
  crc_shift_reg = 0;
15746
  delta_t = 0;
15747
  // length must include 4 bytes of ZEROs, to generate CRC
15748
  // get number of bits from Byte length (2^3 = 8)
15749
  if (plus_dribble_nibble)
15750
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15751
  else
15752
    bit_cnt = ((len + 4) << 3);
15753
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15754
  addr_cnt = addr_cnt + 1;
15755
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15756
  addr_cnt = addr_cnt + 1;
15757
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
15758
  addr_cnt = addr_cnt + 1;
15759
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
15760
 
15761
  while (bit_cnt > 0)
15762
  begin
15763
    // wait for delta time
15764
    delta_t = !delta_t;
15765
    // store previous data
15766
    crc_store_reg = crc_shift_reg;
15767
    // shift data in
15768
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15769
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15770
    else
15771
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15772
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15773
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15774
    crc_shift_reg[3]  = crc_store_reg[2];
15775
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15776
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15777
    crc_shift_reg[6]  = crc_store_reg[5];
15778
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15779
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15780
    crc_shift_reg[9]  = crc_store_reg[8];
15781
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15782
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15783
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15784
    crc_shift_reg[13] = crc_store_reg[12];
15785
    crc_shift_reg[14] = crc_store_reg[13];
15786
    crc_shift_reg[15] = crc_store_reg[14];
15787
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15788
    crc_shift_reg[17] = crc_store_reg[16];
15789
    crc_shift_reg[18] = crc_store_reg[17];
15790
    crc_shift_reg[19] = crc_store_reg[18];
15791
    crc_shift_reg[20] = crc_store_reg[19];
15792
    crc_shift_reg[21] = crc_store_reg[20];
15793
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15794
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15795
    crc_shift_reg[24] = crc_store_reg[23];
15796
    crc_shift_reg[25] = crc_store_reg[24];
15797
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15798
    crc_shift_reg[27] = crc_store_reg[26];
15799
    crc_shift_reg[28] = crc_store_reg[27];
15800
    crc_shift_reg[29] = crc_store_reg[28];
15801
    crc_shift_reg[30] = crc_store_reg[29];
15802
    crc_shift_reg[31] = crc_store_reg[30];
15803
    // wait for delta time
15804
    delta_t = !delta_t;
15805
    // increment address and load new data
15806
    if (word_cnt == 7)
15807
    begin
15808
      addr_cnt = addr_cnt + 1;
15809
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
15810
      addr_cnt = addr_cnt + 1;
15811
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
15812
      addr_cnt = addr_cnt + 1;
15813
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
15814
      addr_cnt = addr_cnt + 1;
15815
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
15816
    end
15817
    // set new load bit position
15818
    if(word_cnt == 31)
15819
      word_cnt = 16;
15820
    else if (word_cnt == 23)
15821
      word_cnt = 8;
15822
    else if (word_cnt == 15)
15823
      word_cnt = 0;
15824
    else if (word_cnt == 7)
15825
      word_cnt = 24;
15826
    else
15827
      word_cnt = word_cnt + 1;
15828
    // decrement bit counter
15829
    bit_cnt = bit_cnt - 1;
15830
    // wait for delta time
15831
    delta_t = !delta_t;
15832
  end // while
15833
 
15834
  // put CRC out
15835
  crc = crc_shift_reg;
15836
  #1;
15837
end
15838
endtask // serial_crc_phy_rx
15839
 
15840
// serial CRC checking for MAC
15841
task serial_crc_mac;
15842
  input  [31:0] start_addr; // start address
15843
  input  [31:0] len; // length of frame in Bytes without CRC length
15844
  input         plus_dribble_nibble; // if length is longer for one nibble
15845
  output [31:0] crc;
15846
  reg    [19:0] addr_cnt; // only 20 address lines
15847
  integer       word_cnt;
15848
  integer       bit_cnt;
15849
  reg    [31:0] load_reg;
15850
  reg    [31:0] crc_shift_reg;
15851
  reg    [31:0] crc_store_reg;
15852
  reg           delta_t;
15853
begin
15854
  #1 addr_cnt = start_addr[19:0];
15855
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
15856
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
15857
  if (addr_cnt[1:0] == 2'h1)
15858
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15859
  else if (addr_cnt[1:0] == 2'h2)
15860
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15861
  else if (addr_cnt[1:0] == 2'h3)
15862
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15863
  else
15864
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
15865
 
15866
  crc_shift_reg = 0;
15867
  delta_t = 0;
15868
  // length must include 4 bytes of ZEROs, to generate CRC
15869
  // get number of bits from Byte length (2^3 = 8)
15870
  if (plus_dribble_nibble)
15871
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
15872
  else
15873
    bit_cnt = ((len + 4) << 3);
15874
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15875
 
15876
  while (bit_cnt > 0)
15877
  begin
15878
    // wait for delta time
15879
    delta_t = !delta_t;
15880
    // store previous data
15881
    crc_store_reg = crc_shift_reg;
15882
    // shift data in
15883
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
15884
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
15885
    else
15886
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
15887
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
15888
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
15889
    crc_shift_reg[3]  = crc_store_reg[2];
15890
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
15891
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
15892
    crc_shift_reg[6]  = crc_store_reg[5];
15893
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
15894
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
15895
    crc_shift_reg[9]  = crc_store_reg[8];
15896
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
15897
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
15898
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
15899
    crc_shift_reg[13] = crc_store_reg[12];
15900
    crc_shift_reg[14] = crc_store_reg[13];
15901
    crc_shift_reg[15] = crc_store_reg[14];
15902
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
15903
    crc_shift_reg[17] = crc_store_reg[16];
15904
    crc_shift_reg[18] = crc_store_reg[17];
15905
    crc_shift_reg[19] = crc_store_reg[18];
15906
    crc_shift_reg[20] = crc_store_reg[19];
15907
    crc_shift_reg[21] = crc_store_reg[20];
15908
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
15909
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
15910
    crc_shift_reg[24] = crc_store_reg[23];
15911
    crc_shift_reg[25] = crc_store_reg[24];
15912
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
15913
    crc_shift_reg[27] = crc_store_reg[26];
15914
    crc_shift_reg[28] = crc_store_reg[27];
15915
    crc_shift_reg[29] = crc_store_reg[28];
15916
    crc_shift_reg[30] = crc_store_reg[29];
15917
    crc_shift_reg[31] = crc_store_reg[30];
15918
    // wait for delta time
15919
    delta_t = !delta_t;
15920
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
15921
    if (word_cnt == 7)
15922
    begin
15923
      addr_cnt = addr_cnt + 4;
15924
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
15925
    end
15926
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
15927
    if(word_cnt == 31)
15928
      word_cnt = 16;
15929
    else if (word_cnt == 23)
15930
      word_cnt = 8;
15931
    else if (word_cnt == 15)
15932
      word_cnt = 0;
15933
    else if (word_cnt == 7)
15934
      word_cnt = 24;
15935
    else
15936
      word_cnt = word_cnt + 1;
15937
    // decrement bit counter
15938
    bit_cnt = bit_cnt - 1;
15939
    // wait for delta time
15940
    delta_t = !delta_t;
15941
  end // while
15942
 
15943
  // put CRC out
15944
  crc = crc_shift_reg;
15945
  #1;
15946
end
15947
endtask // serial_crc_mac
15948
 
15949
//////////////////////////////////////////////////////////////
15950
// MIIM Basic tasks
15951
//////////////////////////////////////////////////////////////
15952
 
15953
task reset_mii; //  MII module
15954
  reg [31:0] tmp;
15955
  reg [31:0] tmp_no_rst;
15956
begin
15957
  // read MII mode register first
15958
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15959
  // set reset bit - write back to MII mode register with RESET bit
15960
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15961
  // clear reset bit - write back to MII mode register without RESET bit
15962
  tmp_no_rst = `ETH_MIIMODER_RST;
15963
  tmp_no_rst = ~tmp_no_rst;
15964
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15965
end
15966
endtask // reset_mii
15967
 
15968
task mii_set_clk_div; // set clock divider for MII clock
15969
  input [7:0]  clk_div;
15970
begin
15971
  // MII mode register
15972
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15973
end
15974
endtask // mii_set_clk_div
15975
 
15976
 
15977
task check_mii_busy; // MII - check if BUSY
15978
  reg [31:0] tmp;
15979
begin
15980
  @(posedge wb_clk);
15981
  // MII read status register
15982
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15983
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
15984
  begin
15985
    @(posedge wb_clk);
15986
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15987
  end
15988
end
15989
endtask // check_mii_busy
15990
 
15991
 
15992
task check_mii_scan_valid; // MII - check if SCAN data are valid
15993
  reg [31:0] tmp;
15994
begin
15995
  @(posedge wb_clk);
15996
  // MII read status register
15997
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15998
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
15999
  begin
16000
    @(posedge wb_clk);
16001
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16002
  end
16003
end
16004
endtask // check_mii_scan_valid
16005
 
16006
 
16007
task mii_write_req; // requests write to MII
16008
  input [4:0]  phy_addr;
16009
  input [4:0]  reg_addr;
16010
  input [15:0] data_in;
16011
begin
16012
  // MII address, PHY address = 1, command register address = 0
16013
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
16014
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16015
  // MII TX data
16016
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16017
  // MII command
16018
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16019
  @(posedge wb_clk);
16020
end
16021
endtask // mii_write_req
16022
 
16023
 
16024
task mii_read_req; // requests read from MII
16025
  input [4:0]  phy_addr;
16026
  input [4:0]  reg_addr;
16027
begin
16028
  // MII address, PHY address = 1, command register address = 0
16029
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
16030
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16031
  // MII command
16032
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16033
  @(posedge wb_clk);
16034
end
16035
endtask // mii_read_req
16036
 
16037
 
16038
task mii_scan_req; // requests scan from MII
16039
  input [4:0]  phy_addr;
16040
  input [4:0]  reg_addr;
16041
begin
16042
  // MII address, PHY address = 1, command register address = 0
16043
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
16044
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16045
  // MII command
16046
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16047
  @(posedge wb_clk);
16048
end
16049
endtask // mii_scan_req
16050
 
16051
 
16052
task mii_scan_finish; // finish scan from MII
16053
begin
16054
  // MII command
16055
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16056
  @(posedge wb_clk);
16057
end
16058
endtask // mii_scan_finish
16059
 
16060
//////////////////////////////////////////////////////////////
16061
// Log files and memory tasks
16062
//////////////////////////////////////////////////////////////
16063
 
16064
task clear_memories;
16065
  reg    [22:0]  adr_i;
16066
  reg            delta_t;
16067
begin
16068
  delta_t = 0;
16069
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
16070
  begin
16071
    eth_phy.rx_mem[adr_i[21:0]] = 0;
16072
    eth_phy.tx_mem[adr_i[21:0]] = 0;
16073
    wb_slave.wb_memory[adr_i[21:2]] = 0;
16074
    delta_t = !delta_t;
16075
  end
16076
end
16077
endtask // clear_memories
16078
 
16079 243 tadejm
task clear_buffer_descriptors;
16080
  reg    [8:0]  adr_i;
16081
  reg            delta_t;
16082
begin
16083
  delta_t = 0;
16084
  for (adr_i = 0; adr_i < 256; adr_i = adr_i + 1)
16085
  begin
16086
    wbm_write((`TX_BD_BASE + {adr_i[7:0], 2'b0}), 32'h0, 4'hF, 1, 4'h1, 4'h1);
16087
    delta_t = !delta_t;
16088
  end
16089
end
16090
endtask // clear_buffer_descriptors
16091
 
16092 169 mohor
task test_note;
16093
  input [799:0] test_note ;
16094
  reg   [799:0] display_note ;
16095
begin
16096
  display_note = test_note;
16097
  while ( display_note[799:792] == 0 )
16098
    display_note = display_note << 8 ;
16099
  $fdisplay( tb_log_file, " " ) ;
16100
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
16101
  $fdisplay( tb_log_file, " " ) ;
16102
end
16103
endtask // test_note
16104
 
16105
task test_heading;
16106
  input [799:0] test_heading ;
16107
  reg   [799:0] display_test ;
16108
begin
16109
  display_test = test_heading;
16110
  while ( display_test[799:792] == 0 )
16111
    display_test = display_test << 8 ;
16112
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16113
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16114
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
16115
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16116
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
16117
  $fdisplay( tb_log_file, " " ) ;
16118
end
16119
endtask // test_heading
16120
 
16121
 
16122
task test_fail ;
16123
  input [7999:0] failure_reason ;
16124
//  reg   [8007:0] display_failure ;
16125
  reg   [7999:0] display_failure ;
16126
  reg   [799:0] display_test ;
16127
begin
16128
  tests_failed = tests_failed + 1 ;
16129
 
16130
  display_failure = failure_reason; // {failure_reason, "!"} ;
16131
  while ( display_failure[7999:7992] == 0 )
16132
    display_failure = display_failure << 8 ;
16133
 
16134
  display_test = test_name ;
16135
  while ( display_test[799:792] == 0 )
16136
    display_test = display_test << 8 ;
16137
 
16138
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16139
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
16140
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
16141
  $fdisplay( tb_log_file, "    *FAILED* because") ;
16142
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
16143
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16144
  $fdisplay( tb_log_file, " " ) ;
16145
 
16146
 `ifdef STOP_ON_FAILURE
16147
    #20 $stop ;
16148
 `endif
16149
end
16150
endtask // test_fail
16151
 
16152
 
16153
task test_ok ;
16154
  reg [799:0] display_test ;
16155
begin
16156
  tests_successfull = tests_successfull + 1 ;
16157
 
16158
  display_test = test_name ;
16159
  while ( display_test[799:792] == 0 )
16160
    display_test = display_test << 8 ;
16161
 
16162
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16163
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
16164
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
16165
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
16166
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
16167
  $fdisplay( tb_log_file, " " ) ;
16168
end
16169
endtask // test_ok
16170
 
16171
 
16172
task test_summary;
16173
begin
16174
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
16175
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
16176
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
16177
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
16178
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
16179
  $fclose(tb_log_file) ;
16180
end
16181
endtask // test_summary
16182
 
16183
 
16184 116 mohor
endmodule

powered by: WebSVN 2.1.0

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