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

Subversion Repositories ethmac

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

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 281 mohor
// Revision 1.27  2003/01/30 13:38:15  mohor
46
// Underrun test fixed. Many other tests fixed.
47
//
48 279 mohor
// Revision 1.26  2003/01/22 19:40:10  tadejm
49
// Backup version. Not fully working.
50
//
51 274 tadejm
// Revision 1.25  2002/11/27 16:21:55  mohor
52
// Full duplex control frames tested.
53
//
54 267 mohor
// Revision 1.24  2002/11/22 17:29:42  mohor
55
// Flow control test almost finished.
56
//
57 266 mohor
// Revision 1.23  2002/11/22 02:12:16  mohor
58
// test_mac_full_duplex_flow_control tests pretty much finished.
59
// TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL
60
// FRM. AT 4 TX BD ( 10Mbps ) finished.
61
// TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION
62
// TURNED OFF AT ONE RX BD ( 10Mbps ) finished.
63
//
64 263 mohor
// Revision 1.22  2002/11/21 13:56:50  mohor
65
// test_mac_full_duplex_flow test 0 finished. Sending the control (PAUSE) frame
66
// finished.
67
//
68 260 mohor
// Revision 1.21  2002/11/19 20:27:45  mohor
69
// Temp version.
70
//
71 254 mohor
// Revision 1.20  2002/11/19 17:41:19  tadejm
72
// Just some updates.
73
//
74 252 tadejm
// Revision 1.19  2002/11/14 13:12:47  tadejm
75
// Late collision is not reported any more.
76
//
77 243 tadejm
// Revision 1.18  2002/10/18 17:03:34  tadejm
78
// Changed BIST scan signals.
79
//
80 227 tadejm
// Revision 1.17  2002/10/18 13:58:22  tadejm
81
// Some code changed due to bug fixes.
82
//
83 223 tadejm
// Revision 1.16  2002/10/09 13:16:51  tadejm
84
// Just back-up; not completed testbench and some testcases are not
85
// wotking properly yet.
86
//
87 209 tadejm
// Revision 1.15  2002/09/20 14:29:12  tadej
88
// Full duplex tests modified and testbench bug repaired.
89
//
90 194 tadej
// Revision 1.14  2002/09/18 17:56:38  tadej
91
// Some additional reports added
92
//
93 192 tadej
// Revision 1.13  2002/09/16 17:53:49  tadej
94
// Full duplex test improved.
95
//
96 182 tadej
// Revision 1.12  2002/09/16 15:10:42  mohor
97
// MIIM test look better.
98
//
99 181 mohor
// Revision 1.11  2002/09/13 19:18:04  mohor
100
// Bench outputs data to display every 128 bytes.
101
//
102 180 mohor
// Revision 1.10  2002/09/13 18:44:29  mohor
103
// Beautiful tests merget together
104
//
105 179 mohor
// Revision 1.9  2002/09/13 18:41:45  mohor
106
// Rearanged testcases
107
//
108 178 mohor
// Revision 1.8  2002/09/13 14:50:15  mohor
109
// Bug in MIIM fixed.
110
//
111 177 mohor
// Revision 1.7  2002/09/13 12:29:14  mohor
112
// Headers changed.
113
//
114 170 mohor
// Revision 1.6  2002/09/13 11:57:20  mohor
115
// New testbench. Thanks to Tadej M - "The Spammer".
116
//
117 121 mohor
// Revision 1.2  2002/07/19 14:02:47  mohor
118
// Clock mrx_clk set to 2.5 MHz.
119
//
120 117 mohor
// Revision 1.1  2002/07/19 13:57:53  mohor
121
// Testing environment also includes traffic cop, memory interface and host
122
// interface.
123 116 mohor
//
124
//
125
//
126
//
127 117 mohor
//
128 116 mohor
 
129
 
130 169 mohor
`include "eth_phy_defines.v"
131
`include "wb_model_defines.v"
132 116 mohor
`include "tb_eth_defines.v"
133
`include "eth_defines.v"
134
`include "timescale.v"
135
 
136
module tb_ethernet();
137
 
138
 
139 169 mohor
reg           wb_clk;
140
reg           wb_rst;
141
wire          wb_int;
142 116 mohor
 
143 169 mohor
wire          mtx_clk;  // This goes to PHY
144
wire          mrx_clk;  // This goes to PHY
145 116 mohor
 
146
wire   [3:0]  MTxD;
147
wire          MTxEn;
148
wire          MTxErr;
149
 
150 169 mohor
wire   [3:0]  MRxD;     // This goes to PHY
151
wire          MRxDV;    // This goes to PHY
152
wire          MRxErr;   // This goes to PHY
153
wire          MColl;    // This goes to PHY
154
wire          MCrs;     // This goes to PHY
155 116 mohor
 
156
wire          Mdi_I;
157
wire          Mdo_O;
158
wire          Mdo_OE;
159 169 mohor
tri           Mdio_IO;
160 116 mohor
wire          Mdc_O;
161
 
162
 
163 169 mohor
parameter Tp = 1;
164 116 mohor
 
165 121 mohor
 
166 116 mohor
// Ethernet Slave Interface signals
167 169 mohor
wire [31:0] eth_sl_wb_adr;
168 116 mohor
wire [31:0] eth_sl_wb_adr_i, eth_sl_wb_dat_o, eth_sl_wb_dat_i;
169
wire  [3:0] eth_sl_wb_sel_i;
170
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;
171
 
172
// Ethernet Master Interface signals
173
wire [31:0] eth_ma_wb_adr_o, eth_ma_wb_dat_i, eth_ma_wb_dat_o;
174
wire  [3:0] eth_ma_wb_sel_o;
175
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;
176
 
177
 
178
 
179
 
180
// Connecting Ethernet top module
181 169 mohor
eth_top eth_top
182 116 mohor
(
183
  // WISHBONE common
184 169 mohor
  .wb_clk_i(wb_clk),              .wb_rst_i(wb_rst),
185 116 mohor
 
186
  // WISHBONE slave
187 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),
188
  .wb_cyc_i(eth_sl_wb_cyc_i),       .wb_stb_i(eth_sl_wb_stb_i),   .wb_ack_o(eth_sl_wb_ack_o),
189
  .wb_err_o(eth_sl_wb_err_o),       .wb_dat_i(eth_sl_wb_dat_i),   .wb_dat_o(eth_sl_wb_dat_o),
190 116 mohor
 
191
  // WISHBONE master
192
  .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),
193
  .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),
194
  .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),
195
 
196
  //TX
197
  .mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
198
 
199
  //RX
200
  .mrx_clk_pad_i(mrx_clk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr),
201
  .mcoll_pad_i(MColl),    .mcrs_pad_i(MCrs),
202
 
203
  // MIIM
204
  .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE),
205
 
206 169 mohor
  .int_o(wb_int)
207 227 tadejm
 
208
  // Bist
209
`ifdef ETH_BIST
210
  ,
211
  .scanb_rst      (1'b0),
212
  .scanb_clk      (1'b0),
213
  .scanb_si       (1'b0),
214
  .scanb_so       (),
215
  .scanb_en       (1'b0)
216
`endif
217 116 mohor
);
218
 
219
 
220
 
221 169 mohor
// Connecting Ethernet PHY Module
222
assign Mdio_IO = Mdo_OE ? Mdo_O : 1'bz ;
223
assign Mdi_I   = Mdio_IO;
224
integer phy_log_file_desc;
225
 
226
eth_phy eth_phy
227 116 mohor
(
228 169 mohor
  // WISHBONE reset
229
  .m_rst_n_i(!wb_rst),
230 116 mohor
 
231 169 mohor
  // MAC TX
232
  .mtx_clk_o(mtx_clk),    .mtxd_i(MTxD),    .mtxen_i(MTxEn),    .mtxerr_i(MTxErr),
233
 
234
  // MAC RX
235
  .mrx_clk_o(mrx_clk),    .mrxd_o(MRxD),    .mrxdv_o(MRxDV),    .mrxerr_o(MRxErr),
236
  .mcoll_o(MColl),        .mcrs_o(MCrs),
237
 
238
  // MIIM
239
  .mdc_i(Mdc_O),          .md_io(Mdio_IO),
240
 
241
  // SYSTEM
242
  .phy_log(phy_log_file_desc)
243 116 mohor
);
244
 
245
 
246 169 mohor
 
247
// Connecting WB Master as Host Interface
248
integer host_log_file_desc;
249
 
250
WB_MASTER_BEHAVIORAL wb_master
251 116 mohor
(
252 169 mohor
    .CLK_I(wb_clk),
253
    .RST_I(wb_rst),
254
    .TAG_I({`WB_TAG_WIDTH{1'b0}}),
255
    .TAG_O(),
256
    .ACK_I(eth_sl_wb_ack_o),
257
    .ADR_O(eth_sl_wb_adr), // only eth_sl_wb_adr_i[11:2] used
258
    .CYC_O(eth_sl_wb_cyc_i),
259
    .DAT_I(eth_sl_wb_dat_o),
260
    .DAT_O(eth_sl_wb_dat_i),
261
    .ERR_I(eth_sl_wb_err_o),
262
    .RTY_I(1'b0),  // inactive (1'b0)
263
    .SEL_O(eth_sl_wb_sel_i),
264
    .STB_O(eth_sl_wb_stb_i),
265
    .WE_O (eth_sl_wb_we_i),
266
    .CAB_O()       // NOT USED for now!
267
);
268
 
269
assign eth_sl_wb_adr_i = {20'h0, eth_sl_wb_adr[11:2], 2'h0};
270
 
271
 
272
 
273
// Connecting WB Slave as Memory Interface Module
274
integer memory_log_file_desc;
275
 
276
WB_SLAVE_BEHAVIORAL wb_slave
277
(
278
    .CLK_I(wb_clk),
279
    .RST_I(wb_rst),
280
    .ACK_O(eth_ma_wb_ack_i),
281
    .ADR_I(eth_ma_wb_adr_o),
282
    .CYC_I(eth_ma_wb_cyc_o),
283
    .DAT_O(eth_ma_wb_dat_i),
284
    .DAT_I(eth_ma_wb_dat_o),
285
    .ERR_O(eth_ma_wb_err_i),
286
    .RTY_O(),      // NOT USED for now!
287
    .SEL_I(eth_ma_wb_sel_o),
288
    .STB_I(eth_ma_wb_stb_o),
289
    .WE_I (eth_ma_wb_we_o),
290
    .CAB_I(1'b0)   // inactive (1'b0)
291
);
292
 
293
 
294
 
295
// Connecting WISHBONE Bus Monitors to ethernet master and slave interfaces
296
integer wb_s_mon_log_file_desc ;
297
integer wb_m_mon_log_file_desc ;
298
 
299
WB_BUS_MON wb_eth_slave_bus_mon
300
(
301 116 mohor
  // WISHBONE common
302 169 mohor
  .CLK_I(wb_clk),
303
  .RST_I(wb_rst),
304 116 mohor
 
305 169 mohor
  // WISHBONE slave
306
  .ACK_I(eth_sl_wb_ack_o),
307
  .ADDR_O({20'h0, eth_sl_wb_adr_i[11:2], 2'b0}),
308
  .CYC_O(eth_sl_wb_cyc_i),
309
  .DAT_I(eth_sl_wb_dat_o),
310
  .DAT_O(eth_sl_wb_dat_i),
311
  .ERR_I(eth_sl_wb_err_o),
312
  .RTY_I(1'b0),
313
  .SEL_O(eth_sl_wb_sel_i),
314
  .STB_O(eth_sl_wb_stb_i),
315
  .WE_O (eth_sl_wb_we_i),
316
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
317
  .TAG_O(),
318
  .CAB_O(1'b0),
319
  .log_file_desc (wb_s_mon_log_file_desc)
320
);
321
 
322
WB_BUS_MON wb_eth_master_bus_mon
323
(
324
  // WISHBONE common
325
  .CLK_I(wb_clk),
326
  .RST_I(wb_rst),
327
 
328 116 mohor
  // WISHBONE master
329 169 mohor
  .ACK_I(eth_ma_wb_ack_i),
330
  .ADDR_O(eth_ma_wb_adr_o),
331
  .CYC_O(eth_ma_wb_cyc_o),
332
  .DAT_I(eth_ma_wb_dat_i),
333
  .DAT_O(eth_ma_wb_dat_o),
334
  .ERR_I(eth_ma_wb_err_i),
335
  .RTY_I(1'b0),
336
  .SEL_O(eth_ma_wb_sel_o),
337
  .STB_O(eth_ma_wb_stb_o),
338
  .WE_O (eth_ma_wb_we_o),
339
  .TAG_I({`WB_TAG_WIDTH{1'b0}}),
340
  .TAG_O(),
341
  .CAB_O(1'b0),
342
  .log_file_desc(wb_m_mon_log_file_desc)
343 116 mohor
);
344
 
345
 
346
 
347 169 mohor
reg         StartTB;
348
integer     tb_log_file;
349 116 mohor
 
350 169 mohor
initial
351
begin
352
  tb_log_file = $fopen("../log/eth_tb.log");
353
  if (tb_log_file < 2)
354
  begin
355
    $display("*E Could not open/create testbench log file in ../log/ directory!");
356
    $finish;
357
  end
358
  $fdisplay(tb_log_file, "========================== ETHERNET IP Core Testbench results ===========================");
359
  $fdisplay(tb_log_file, " ");
360 116 mohor
 
361 169 mohor
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
362
  if (phy_log_file_desc < 2)
363
  begin
364
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_phy.log file in ../log/ directory!");
365
    $finish;
366
  end
367
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
368
  $fdisplay(phy_log_file_desc, " ");
369
 
370
  memory_log_file_desc = $fopen("../log/eth_tb_memory.log");
371
  if (memory_log_file_desc < 2)
372
  begin
373
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_memory.log file in ../log/ directory!");
374
    $finish;
375
  end
376
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
377
  $fdisplay(memory_log_file_desc, " ");
378
 
379
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
380
  if (host_log_file_desc < 2)
381
  begin
382
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
383
    $finish;
384
  end
385
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
386
  $fdisplay(host_log_file_desc, " ");
387
 
388
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
389
  if (wb_s_mon_log_file_desc < 2)
390
  begin
391
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
392
    $finish;
393
  end
394
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
395
  $fdisplay(wb_s_mon_log_file_desc, " ");
396
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
397
  $fdisplay(wb_s_mon_log_file_desc, " ");
398
 
399
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
400
  if (wb_m_mon_log_file_desc < 2)
401
  begin
402
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
403
    $finish;
404
  end
405
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
406
  $fdisplay(wb_m_mon_log_file_desc, " ");
407
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
408
  $fdisplay(wb_m_mon_log_file_desc, " ");
409
 
410 243 tadejm
  // Reset pulse
411
  wb_rst =  1'b1;
412
  #423 wb_rst =  1'b0;
413
 
414 169 mohor
  // Clear memories
415
  clear_memories;
416 243 tadejm
  clear_buffer_descriptors;
417 169 mohor
 
418
  #423 StartTB  =  1'b1;
419
end
420
 
421
 
422
 
423
// Generating wb_clk clock
424 116 mohor
initial
425
begin
426 169 mohor
  wb_clk=0;
427
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
428 274 tadejm
//  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
429 169 mohor
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
430
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
431 274 tadejm
  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
432 209 tadejm
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
433 169 mohor
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
434
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
435
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
436
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
437 116 mohor
end
438
 
439
 
440
 
441 169 mohor
integer      tests_successfull;
442
integer      tests_failed;
443
reg [799:0]  test_name; // used for tb_log_file
444 121 mohor
 
445 169 mohor
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
446
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
447
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
448
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
449
 
450 274 tadejm
reg          wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
451
 
452
 
453 116 mohor
initial
454
begin
455 169 mohor
  wait(StartTB);  // Start of testbench
456
 
457
  // Initial global values
458
  tests_successfull = 0;
459
  tests_failed = 0;
460 274 tadejm
 
461
  wbm_working = 0;
462 169 mohor
 
463
  wbm_init_waits = 4'h1;
464
  wbm_subseq_waits = 4'h3;
465
  wbs_waits = 4'h1;
466
  wbs_retries = 8'h2;
467
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
468
 
469 274 tadejm
  // set DIFFERENT mrx_clk to mtx_clk!
470
//  eth_phy.set_mrx_equal_mtx = 1'b0;
471 169 mohor
 
472
  //  Call tests
473
  //  ----------
474 274 tadejm
//    test_access_to_mac_reg(0, 0);           // 0 - 3
475 194 tadej
//    test_mii(0, 17);                        // 0 - 17
476 169 mohor
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
477
  eth_phy.carrier_sense_real_delay(0);
478 279 mohor
    test_mac_full_duplex_transmit(0, 21);    // 0 - (21)
479 281 mohor
    test_mac_full_duplex_receive(0, 13);     // 0 - 13
480
    test_mac_full_duplex_flow_control(0, 4);  // 0 - 4
481 274 tadejm
                                              // 4 is executed, everything is OK
482
//    test_mac_half_duplex_flow(0, 0);
483 169 mohor
 
484 243 tadejm
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
485 169 mohor
  eth_phy.carrier_sense_real_delay(1);
486
 
487
 
488
  // Finish test's logs
489
  test_summary;
490
  $display("\n\n END of SIMULATION");
491
  $fclose(tb_log_file | phy_log_file_desc | memory_log_file_desc | host_log_file_desc);
492
  $fclose(wb_s_mon_log_file_desc | wb_m_mon_log_file_desc);
493
 
494
  $stop;
495 116 mohor
end
496 169 mohor
 
497 116 mohor
 
498 169 mohor
 
499
//////////////////////////////////////////////////////////////
500
// Test tasks
501
//////////////////////////////////////////////////////////////
502
 
503
task test_access_to_mac_reg;
504
  input  [31:0]  start_task;
505
  input  [31:0]  end_task;
506
  integer        bit_start_1;
507
  integer        bit_end_1;
508
  integer        bit_start_2;
509
  integer        bit_end_2;
510
  integer        num_of_reg;
511
  integer        i_addr;
512
  integer        i_data;
513
  integer        i_length;
514
  integer        tmp_data;
515
  reg    [31:0]  tx_bd_num;
516
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
517
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
518
  integer        i;
519
  integer        i1;
520
  integer        i2;
521
  integer        i3;
522
  integer        fail;
523 178 mohor
  integer        test_num;
524 169 mohor
  reg    [31:0]  addr;
525
  reg    [31:0]  data;
526
  reg    [31:0]  data_max;
527 116 mohor
begin
528 169 mohor
// ACCESS TO MAC REGISTERS TEST
529
test_heading("ACCESS TO MAC REGISTERS TEST");
530
$display(" ");
531
$display("ACCESS TO MAC REGISTERS TEST");
532
fail = 0;
533
 
534 192 tadej
// reset MAC registers
535
hard_reset;
536
// reset MAC and MII LOGIC with soft reset
537 274 tadejm
//reset_mac;
538
//reset_mii;
539 169 mohor
 
540 192 tadej
 
541 178 mohor
//////////////////////////////////////////////////////////////////////
542
////                                                              ////
543
////  test_access_to_mac_reg:                                     ////
544
////                                                              ////
545
////  0: Walking 1 with single cycles across MAC regs.            ////
546
////  1: Walking 1 with single cycles across MAC buffer descript. ////
547
////  2: Test max reg. values and reg. values after writing       ////
548
////     inverse reset values and hard reset of the MAC           ////
549
////  3: Test buffer desc. RAM preserving values after hard reset ////
550
////     of the MAC and resetting the logic                       ////
551
////                                                              ////
552
//////////////////////////////////////////////////////////////////////
553 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
554 169 mohor
begin
555
 
556 178 mohor
  ////////////////////////////////////////////////////////////////////
557
  ////                                                            ////
558
  ////  Walking 1 with single cycles across MAC regs.             ////
559
  ////                                                            ////
560
  ////////////////////////////////////////////////////////////////////
561
  if (test_num == 0) // Walking 1 with single cycles across MAC regs.
562 194 tadej
  begin
563
    // TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
564
    test_name   = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
565
    `TIME; $display("  TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
566 178 mohor
 
567 194 tadej
    data = 0;
568
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
569
      begin
570
        wbm_init_waits = i;
571
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
572
        for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
573
          begin
574
            addr = `ETH_BASE + i_addr;
575
            // set ranges of R/W bits
576
            case (addr)
577
              `ETH_MODER:
578
                begin
579
                  bit_start_1 = 0;
580
                  bit_end_1   = 16;
581
                  bit_start_2 = 32; // not used
582
                  bit_end_2   = 32; // not used
583
                end
584
              `ETH_INT: // READONLY - tested within INT test
585
                begin
586
                  bit_start_1 = 32; // not used
587
                  bit_end_1   = 32; // not used
588
                  bit_start_2 = 32; // not used
589
                  bit_end_2   = 32; // not used
590
                end
591
              `ETH_INT_MASK:
592
                begin
593
                  bit_start_1 = 0;
594
                  bit_end_1   = 6;
595
                  bit_start_2 = 32; // not used
596
                  bit_end_2   = 32; // not used
597
                end
598
              `ETH_IPGT:
599
                begin
600
                  bit_start_1 = 0;
601
                  bit_end_1   = 6;
602
                  bit_start_2 = 32; // not used
603
                  bit_end_2   = 32; // not used
604
                end
605
              `ETH_IPGR1:
606
                begin
607
                  bit_start_1 = 0;
608
                  bit_end_1   = 6;
609
                  bit_start_2 = 32; // not used
610
                  bit_end_2   = 32; // not used
611
                end
612
              `ETH_IPGR2:
613
                begin
614
                  bit_start_1 = 0;
615
                  bit_end_1   = 6;
616
                  bit_start_2 = 32; // not used
617
                  bit_end_2   = 32; // not used
618
                end
619
              `ETH_PACKETLEN:
620
                begin
621
                  bit_start_1 = 0;
622
                  bit_end_1   = 31;
623
                  bit_start_2 = 32; // not used
624
                  bit_end_2   = 32; // not used
625
                end
626
              `ETH_COLLCONF:
627
                begin
628
                  bit_start_1 = 0;
629
                  bit_end_1   = 5;
630
                  bit_start_2 = 16;
631
                  bit_end_2   = 19;
632
                end
633
              `ETH_TX_BD_NUM:
634
                begin
635
                  bit_start_1 = 0;
636
                  bit_end_1   = 7;
637
                  bit_start_2 = 32; // not used
638
                  bit_end_2   = 32; // not used
639
                end
640
              `ETH_CTRLMODER:
641
                begin
642
                  bit_start_1 = 0;
643
                  bit_end_1   = 2;
644
                  bit_start_2 = 32; // not used
645
                  bit_end_2   = 32; // not used
646
                end
647
              `ETH_MIIMODER:
648
                begin
649
                  bit_start_1 = 0;
650
                  bit_end_1   = 9;
651
                  bit_start_2 = 32; // not used
652
                  bit_end_2   = 32; // not used
653
                end
654
              `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
655
                begin
656
                  bit_start_1 = 32; // not used
657
                  bit_end_1   = 32; // not used
658
                  bit_start_2 = 32; // not used
659
                  bit_end_2   = 32; // not used
660
                end
661
              `ETH_MIIADDRESS:
662
                begin
663
                  bit_start_1 = 0;
664
                  bit_end_1   = 4;
665
                  bit_start_2 = 8;
666
                  bit_end_2   = 12;
667
                end
668
              `ETH_MIITX_DATA:
669
                begin
670
                  bit_start_1 = 0;
671
                  bit_end_1   = 15;
672
                  bit_start_2 = 32; // not used
673
                  bit_end_2   = 32; // not used
674
                end
675
              `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
676
                begin
677
                  bit_start_1 = 32; // not used
678
                  bit_end_1   = 32; // not used
679
                  bit_start_2 = 32; // not used
680
                  bit_end_2   = 32; // not used
681
                end
682
              `ETH_MIISTATUS: // READONLY - tested within MIIM test
683
                begin
684
                  bit_start_1 = 32; // not used
685
                  bit_end_1   = 32; // not used
686
                  bit_start_2 = 32; // not used
687
                  bit_end_2   = 32; // not used
688
                end
689
              `ETH_MAC_ADDR0:
690
                begin
691
                  bit_start_1 = 0;
692
                  bit_end_1   = 31;
693
                  bit_start_2 = 32; // not used
694
                  bit_end_2   = 32; // not used
695 178 mohor
                  end
696 194 tadej
              `ETH_MAC_ADDR1:
697
                begin
698
                  bit_start_1 = 0;
699
                  bit_end_1   = 15;
700
                  bit_start_2 = 32; // not used
701
                  bit_end_2   = 32; // not used
702
                end
703
              `ETH_HASH_ADDR0:
704
                begin
705
                  bit_start_1 = 0;
706
                  bit_end_1   = 31;
707
                  bit_start_2 = 32; // not used
708
                  bit_end_2   = 32; // not used
709
                end
710
              default: // `ETH_HASH_ADDR1:
711
                begin
712
                  bit_start_1 = 0;
713
                  bit_end_1   = 31;
714
                  bit_start_2 = 32; // not used
715
                  bit_end_2   = 32; // not used
716
                end
717
            endcase
718
 
719
            for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
720
              begin
721
                data = 1'b1 << i_data;
722
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
723
                  ;
724
                else
725 178 mohor
                  begin
726 194 tadej
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
727 274 tadejm
                    wait (wbm_working == 0);
728 194 tadej
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
729
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
730
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
731
                      begin
732
                        if (tmp_data !== data)
733 178 mohor
                        begin
734 194 tadej
                          fail = fail + 1;
735
                          test_fail("RW bit of the MAC register was not written or not read");
736
                          `TIME;
737
                          $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
738
                                    wbm_init_waits, addr, data, tmp_data);
739
                        end
740
                      end
741
                    else // data should not be equal to tmp_data
742
                      begin
743
                        if (tmp_data === data)
744 178 mohor
                          begin
745
                            fail = fail + 1;
746 194 tadej
                            test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
747 178 mohor
                            `TIME;
748 194 tadej
                            $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
749 178 mohor
                                      wbm_init_waits, addr, data, tmp_data);
750
                          end
751 194 tadej
                      end
752
                  end
753
              end
754
          end
755
      end
756 209 tadejm
    // INTERMEDIATE DISPLAYS (The only one)
757
    $display("    ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
758 194 tadej
    if(fail == 0)
759
      test_ok;
760
    else
761
      fail = 0;    // Errors were reported previously
762
  end
763 178 mohor
 
764
 
765
  ////////////////////////////////////////////////////////////////////
766
  ////                                                            ////
767
  ////  Walking 1 with single cycles across MAC buffer descript.  ////
768
  ////                                                            ////
769
  ////////////////////////////////////////////////////////////////////
770
  if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
771 169 mohor
  begin
772 194 tadej
    // TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
773
    test_name   = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
774
    `TIME; $display("  TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
775 178 mohor
 
776
    data = 0;
777
    // set TX and RX buffer descriptors
778
    tx_bd_num = 32'h40;
779
    wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
780
    for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
781
    begin
782 169 mohor
      wbm_init_waits = i;
783
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
784 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
785 169 mohor
      begin
786
        addr = `ETH_BASE + i_addr;
787 178 mohor
        if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
788
        begin
789
          // set ranges of R/W bits
790
          case (addr[3])
791
            1'b0: // buffer control bits
792
            begin
793
              bit_start_1 = 0;
794
              bit_end_1   = 31; // 8;
795
              bit_start_2 = 11;
796
              bit_end_2   = 31;
797
            end
798
            default: // 1'b1: // buffer pointer
799
            begin
800
              bit_start_1 = 0;
801
              bit_end_1   = 31;
802
              bit_start_2 = 32; // not used
803
              bit_end_2   = 32; // not used
804
            end
805
          endcase
806
        end
807
        else // RX buffer descriptors
808
        begin
809
          // set ranges of R/W bits
810
          case (addr[3])
811
            1'b0: // buffer control bits
812
            begin
813
              bit_start_1 = 0;
814
              bit_end_1   = 31; // 7;
815
              bit_start_2 = 13;
816
              bit_end_2   = 31;
817
            end
818
            default: // 1'b1: // buffer pointer
819
            begin
820
              bit_start_1 = 0;
821
              bit_end_1   = 31;
822
              bit_start_2 = 32; // not used
823
              bit_end_2   = 32; // not used
824
            end
825
          endcase
826
        end
827
 
828 169 mohor
        for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
829
        begin
830
          data = 1'b1 << i_data;
831 178 mohor
          if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
832
            ;
833 169 mohor
          else
834
          begin
835
            wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
836
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
837
            if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
838
                 ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
839
            begin
840
              if (tmp_data !== data)
841
              begin
842
                fail = fail + 1;
843 178 mohor
                test_fail("RW bit of the MAC buffer descriptors was not written or not read");
844 169 mohor
                `TIME;
845
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
846
                          wbm_init_waits, addr, data, tmp_data);
847
              end
848
            end
849
            else // data should not be equal to tmp_data
850
            begin
851
              if (tmp_data === data)
852
              begin
853
                fail = fail + 1;
854 178 mohor
                test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
855 169 mohor
                `TIME;
856
                $display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
857
                          wbm_init_waits, addr, data, tmp_data);
858
              end
859
            end
860
          end
861
        end
862
      end
863 178 mohor
      // INTERMEDIATE DISPLAYS
864
      case (i)
865 209 tadejm
        0:       $display("    ->buffer descriptors tested with 0 bus delay");
866
        1:       $display("    ->buffer descriptors tested with 1 bus delay cycle");
867
        2:       $display("    ->buffer descriptors tested with 2 bus delay cycles");
868
        3:       $display("    ->buffer descriptors tested with 3 bus delay cycles");
869
        default: $display("    ->buffer descriptors tested with 4 bus delay cycles");
870 178 mohor
      endcase
871
    end
872
    if(fail == 0)
873
      test_ok;
874
    else
875
      fail = 0;
876 169 mohor
  end
877 178 mohor
 
878
 
879
  ////////////////////////////////////////////////////////////////////
880
  ////                                                            ////
881
  ////  Test max reg. values and reg. values after writing        ////
882
  ////  inverse reset values and hard reset of the MAC            ////
883
  ////                                                            ////
884
  ////////////////////////////////////////////////////////////////////
885
  if (test_num == 2) // Start this task
886 169 mohor
  begin
887 194 tadej
    // TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
888 178 mohor
    test_name   =
889 194 tadej
      "TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
890 178 mohor
    `TIME; $display(
891 194 tadej
      "  TEST 2: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC");
892 178 mohor
 
893
    // reset MAC registers
894
    hard_reset;
895
    for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
896 169 mohor
    begin
897 178 mohor
      for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
898 169 mohor
      begin
899 178 mohor
        addr = `ETH_BASE + i_addr;
900
        // set ranges of R/W bits
901
        case (addr)
902
          `ETH_MODER:
903 169 mohor
          begin
904 178 mohor
            data = 32'h0000_A800;
905
            data_max = 32'h0001_FFFF;
906 169 mohor
          end
907 178 mohor
          `ETH_INT: // READONLY - tested within INT test
908 169 mohor
          begin
909 178 mohor
            data = 32'h0000_0000;
910
            data_max = 32'h0000_0000;
911 169 mohor
          end
912
          `ETH_INT_MASK:
913 178 mohor
          begin
914
            data = 32'h0000_0000;
915
            data_max = 32'h0000_007F;
916
          end
917 169 mohor
          `ETH_IPGT:
918 178 mohor
          begin
919
            data = 32'h0000_0012;
920
            data_max = 32'h0000_007F;
921
          end
922 169 mohor
          `ETH_IPGR1:
923 178 mohor
          begin
924
            data = 32'h0000_000C;
925
            data_max = 32'h0000_007F;
926
          end
927 169 mohor
          `ETH_IPGR2:
928 178 mohor
          begin
929
            data = 32'h0000_0012;
930
            data_max = 32'h0000_007F;
931
          end
932 169 mohor
          `ETH_PACKETLEN:
933 178 mohor
          begin
934
            data = 32'h0040_0600;
935
            data_max = 32'hFFFF_FFFF;
936
          end
937 169 mohor
          `ETH_COLLCONF:
938 178 mohor
          begin
939
            data = 32'h000F_003F;
940
            data_max = 32'h000F_003F;
941
          end
942 169 mohor
          `ETH_TX_BD_NUM:
943 178 mohor
          begin
944
            data = 32'h0000_0040;
945
            data_max = 32'h0000_0080;
946
          end
947 169 mohor
          `ETH_CTRLMODER:
948 178 mohor
          begin
949
            data = 32'h0000_0000;
950
            data_max = 32'h0000_0007;
951
          end
952 169 mohor
          `ETH_MIIMODER:
953 178 mohor
          begin
954
            data = 32'h0000_0064;
955
            data_max = 32'h0000_03FF;
956
          end
957 169 mohor
          `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
958 178 mohor
          begin
959
            data = 32'h0000_0000;
960
            data_max = 32'h0000_0007;
961
          end
962 169 mohor
          `ETH_MIIADDRESS:
963 178 mohor
          begin
964
            data = 32'h0000_0000;
965
            data_max = 32'h0000_1F1F;
966
          end
967 169 mohor
          `ETH_MIITX_DATA:
968 178 mohor
          begin
969
            data = 32'h0000_0000;
970
            data_max = 32'h0000_FFFF;
971
          end
972 169 mohor
          `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
973
          begin
974 178 mohor
            data = 32'h0000_0000;
975
            data_max = 32'h0000_0000;
976 169 mohor
          end
977 178 mohor
          `ETH_MIISTATUS: // READONLY - tested within MIIM test
978 169 mohor
          begin
979 178 mohor
            data = 32'h0000_0000;
980
            data_max = 32'h0000_0000;
981 169 mohor
          end
982 178 mohor
          `ETH_MAC_ADDR0:
983 169 mohor
          begin
984 178 mohor
            data = 32'h0000_0000;
985
            data_max = 32'hFFFF_FFFF;
986 169 mohor
          end
987 178 mohor
          `ETH_MAC_ADDR1:
988 169 mohor
          begin
989 178 mohor
            data = 32'h0000_0000;
990
            data_max = 32'h0000_FFFF;
991 169 mohor
          end
992 178 mohor
          `ETH_HASH_ADDR0:
993 169 mohor
          begin
994 178 mohor
            data = 32'h0000_0000;
995
            data_max = 32'hFFFF_FFFF;
996 169 mohor
          end
997 178 mohor
          default: // `ETH_HASH_ADDR1:
998 169 mohor
          begin
999 178 mohor
            data = 32'h0000_0000;
1000
            data_max = 32'hFFFF_FFFF;
1001 169 mohor
          end
1002
        endcase
1003 178 mohor
 
1004
        wbm_init_waits = {$random} % 3;
1005
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1006
        if (i == 0)
1007 274 tadejm
        begin
1008 178 mohor
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1009 274 tadejm
        end
1010 178 mohor
        else if (i == 2)
1011 274 tadejm
        begin
1012 178 mohor
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1013 274 tadejm
        end
1014 178 mohor
        else if ((i == 1) || (i == 4))
1015 169 mohor
        begin
1016 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1017
          if (tmp_data !== data)
1018
          begin
1019
            fail = fail + 1;
1020
            test_fail("RESET value of the MAC register is not correct");
1021
            `TIME;
1022
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1023
          end
1024 169 mohor
        end
1025 178 mohor
        else // check maximum values
1026 169 mohor
        begin
1027
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1028 178 mohor
          if (addr == `ETH_TX_BD_NUM) // previous data should remain in this register
1029 169 mohor
          begin
1030
            if (tmp_data !== data)
1031
            begin
1032
              fail = fail + 1;
1033 178 mohor
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1034 169 mohor
              `TIME;
1035 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1036 169 mohor
            end
1037 178 mohor
            // try maximum (80)
1038
            wbm_write(addr, data_max, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1039
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1040
            if (tmp_data !== data_max)
1041
            begin
1042
              fail = fail + 1;
1043
              test_fail("MAX value of the TX_BD_NUM register is not correct");
1044
              `TIME;
1045
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1046
            end
1047
            // try one less than maximum (80)
1048
            wbm_write(addr, (data_max - 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1049
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1050
            if (tmp_data !== (data_max - 1))
1051
            begin
1052
              fail = fail + 1;
1053
              test_fail("ONE less than MAX value of the TX_BD_NUM register is not correct");
1054
              `TIME;
1055
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1056
            end
1057
            // try one more than maximum (80)
1058
            wbm_write(addr, (data_max + 1), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1059
            wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1060
            if (tmp_data !== (data_max - 1)) // previous data should remain in this register
1061
            begin
1062
              fail = fail + 1;
1063
              test_fail("Previous value of the TX_BD_NUM register did not remain");
1064
              `TIME;
1065
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1066
            end
1067 169 mohor
          end
1068 178 mohor
          else
1069 169 mohor
          begin
1070 178 mohor
            if (tmp_data !== data_max)
1071 169 mohor
            begin
1072
              fail = fail + 1;
1073 178 mohor
              test_fail("MAX value of the MAC register is not correct");
1074 169 mohor
              `TIME;
1075 178 mohor
              $display("  addr %h, data_max %h, tmp_data %h", addr, data_max, tmp_data);
1076 169 mohor
            end
1077
          end
1078
        end
1079
      end
1080 178 mohor
      // reset MAC registers
1081
      if ((i == 0) || (i == 3))
1082
        hard_reset;
1083 169 mohor
    end
1084 178 mohor
    if(fail == 0)
1085
      test_ok;
1086
    else
1087
      fail = 0;
1088 169 mohor
  end
1089 116 mohor
 
1090 156 mohor
 
1091 181 mohor
  ////////////////////////////////////////////////////////////////////
1092
  ////                                                            ////
1093
  ////  Test buffer desc. ram preserving values after hard reset  ////
1094
  ////  of the mac and reseting the logic                         ////
1095
  ////                                                            ////
1096
  ////////////////////////////////////////////////////////////////////
1097 178 mohor
  if (test_num == 3) // Start this task
1098 169 mohor
  begin
1099 194 tadej
    // TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
1100
    test_name   = "TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
1101 178 mohor
    `TIME;
1102 194 tadej
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
1103 178 mohor
 
1104
    // reset MAC registers
1105
    hard_reset;
1106
    // reset LOGIC with soft reset
1107 274 tadejm
//    reset_mac;
1108
//    reset_mii;
1109 178 mohor
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
1110 169 mohor
    begin
1111 178 mohor
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1112 169 mohor
      begin
1113 178 mohor
        addr = `ETH_BASE + i_addr;
1114
 
1115
        wbm_init_waits = {$random} % 3;
1116
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
1117
        if (i == 0)
1118 169 mohor
        begin
1119 178 mohor
          data = 32'hFFFFFFFF;
1120
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1121 169 mohor
        end
1122 178 mohor
        else if (i == 2)
1123 169 mohor
        begin
1124 178 mohor
          data = 32'h00000000;
1125
          wbm_write(addr, 32'h00000000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1126 169 mohor
        end
1127
        else
1128
        begin
1129 178 mohor
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1130
          if (tmp_data !== data)
1131 169 mohor
          begin
1132
            fail = fail + 1;
1133 178 mohor
            test_fail("PRESERVED value of the MAC buffer descriptors is not correct");
1134 169 mohor
            `TIME;
1135 178 mohor
            $display("  addr %h, data %h, tmp_data %h", addr, data, tmp_data);
1136 169 mohor
          end
1137
        end
1138
      end
1139 178 mohor
      if ((i == 0) || (i == 2))
1140
      begin
1141
        // reset MAC registers
1142
        hard_reset;
1143
        // reset LOGIC with soft reset
1144 274 tadejm
//        reset_mac;
1145
//        reset_mii;
1146 178 mohor
      end
1147 169 mohor
    end
1148 178 mohor
    if(fail == 0)
1149
      test_ok;
1150
    else
1151
    fail = 0;
1152 169 mohor
  end
1153 116 mohor
 
1154
 
1155 178 mohor
  if (test_num == 4) // Start this task
1156 169 mohor
  begin
1157 194 tadej
        /*  // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
1158
          test_name   = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
1159
          `TIME; $display("  TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
1160 178 mohor
 
1161
          data = 0;
1162
          burst_data = 0;
1163
          burst_tmp_data = 0;
1164
          i_length = 10; // two bursts for length 20
1165
          for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
1166
          begin
1167
            for (i1 = 0; i1 <= 4; i1 = i1 + 1) // for initial wait cycles on WB bus
1168
            begin
1169
              wbm_init_waits = i;
1170
              wbm_subseq_waits = i1;
1171
              #1;
1172
              for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
1173
              begin
1174
                data = 1'b1 << i_data;
1175
                #1;
1176
                for (i2 = 32'h4C; i2 >= 0; i2 = i2 - 4)
1177
                begin
1178
                  burst_data = burst_data << 32;
1179
                  // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
1180
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1181
                  begin
1182
                    #1 burst_data[31:0] = 0;
1183
                  end
1184
                  else
1185
                  begin
1186
                    #1 burst_data[31:0] = data;
1187
                  end
1188
                end
1189
                #1;
1190
                // 2 burst writes
1191
                addr = `ETH_BASE; // address of a first burst
1192
                wbm_write(addr, burst_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1193
                burst_tmp_data = burst_data >> (32 * i_length);
1194
                addr = addr + 32'h28; // address of a second burst
1195
                wbm_write(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length, wbm_init_waits, wbm_subseq_waits);
1196
                #1;
1197
                // 2 burst reads
1198
                addr = `ETH_BASE; // address of a first burst
1199
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1200
                         wbm_init_waits, wbm_subseq_waits); // first burst
1201
                burst_tmp_data = burst_tmp_data << (32 * i_length);
1202
                addr = addr + 32'h28; // address of a second burst
1203
                wbm_read(addr, burst_tmp_data[(32 * 10 - 1):0], 4'hF, i_length,
1204
                         wbm_init_waits, wbm_subseq_waits); // second burst
1205
                #1;
1206
                for (i2 = 0; i2 <= 32'h4C; i2 = i2 + 4)
1207
                begin
1208
                  // set ranges of R/W bits
1209
                  case (`ETH_BASE + i2)
1210
                  `ETH_MODER:
1211
                    begin
1212
                      bit_start_1 = 0;
1213
                      bit_end_1   = 16;
1214
                      bit_start_2 = 32; // not used
1215
                      bit_end_2   = 32; // not used
1216
                    end
1217
                  `ETH_INT: // READONLY - tested within INT test
1218
                    begin
1219
                      bit_start_1 = 32; // not used
1220
                      bit_end_1   = 32; // not used
1221
                      bit_start_2 = 32; // not used
1222
                      bit_end_2   = 32; // not used
1223
                    end
1224
                  `ETH_INT_MASK:
1225
                    begin
1226
                      bit_start_1 = 0;
1227
                      bit_end_1   = 6;
1228
                      bit_start_2 = 32; // not used
1229
                      bit_end_2   = 32; // not used
1230
                    end
1231
                  `ETH_IPGT:
1232
                    begin
1233
                      bit_start_1 = 0;
1234
                      bit_end_1   = 6;
1235
                      bit_start_2 = 32; // not used
1236
                      bit_end_2   = 32; // not used
1237
                    end
1238
                  `ETH_IPGR1:
1239
                    begin
1240
                      bit_start_1 = 0;
1241
                      bit_end_1   = 6;
1242
                      bit_start_2 = 32; // not used
1243
                      bit_end_2   = 32; // not used
1244
                    end
1245
                  `ETH_IPGR2:
1246
                    begin
1247
                      bit_start_1 = 0;
1248
                      bit_end_1   = 6;
1249
                      bit_start_2 = 32; // not used
1250
                      bit_end_2   = 32; // not used
1251
                    end
1252
                  `ETH_PACKETLEN:
1253
                    begin
1254
                      bit_start_1 = 0;
1255
                      bit_end_1   = 31;
1256
                      bit_start_2 = 32; // not used
1257
                      bit_end_2   = 32; // not used
1258
                    end
1259
                  `ETH_COLLCONF:
1260
                    begin
1261
                      bit_start_1 = 0;
1262
                      bit_end_1   = 5;
1263
                      bit_start_2 = 16;
1264
                      bit_end_2   = 19;
1265
                    end
1266
                  `ETH_TX_BD_NUM:
1267
                    begin
1268
                      bit_start_1 = 0;
1269
                      bit_end_1   = 7;
1270
                      bit_start_2 = 32; // not used
1271
                      bit_end_2   = 32; // not used
1272
                    end
1273
                  `ETH_CTRLMODER:
1274
                    begin
1275
                      bit_start_1 = 0;
1276
                      bit_end_1   = 2;
1277
                      bit_start_2 = 32; // not used
1278
                      bit_end_2   = 32; // not used
1279
                    end
1280
                  `ETH_MIIMODER:
1281
                    begin
1282
                      bit_start_1 = 0;
1283
                      bit_end_1   = 9;
1284
                      bit_start_2 = 32; // not used
1285
                      bit_end_2   = 32; // not used
1286
                    end
1287
                  `ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
1288
                    begin
1289
                      bit_start_1 = 32; // not used
1290
                      bit_end_1   = 32; // not used
1291
                      bit_start_2 = 32; // not used
1292
                      bit_end_2   = 32; // not used
1293
                    end
1294
                  `ETH_MIIADDRESS:
1295
                    begin
1296
                      bit_start_1 = 0;
1297
                      bit_end_1   = 4;
1298
                      bit_start_2 = 8;
1299
                      bit_end_2   = 12;
1300
                    end
1301
                  `ETH_MIITX_DATA:
1302
                    begin
1303
                      bit_start_1 = 0;
1304
                      bit_end_1   = 15;
1305
                      bit_start_2 = 32; // not used
1306
                      bit_end_2   = 32; // not used
1307
                    end
1308
                  `ETH_MIIRX_DATA: // READONLY - tested within MIIM test
1309
                    begin
1310
                      bit_start_1 = 32; // not used
1311
                      bit_end_1   = 32; // not used
1312
                      bit_start_2 = 32; // not used
1313
                      bit_end_2   = 32; // not used
1314
                    end
1315
                  `ETH_MIISTATUS: // READONLY - tested within MIIM test
1316
                    begin
1317
                      bit_start_1 = 32; // not used
1318
                      bit_end_1   = 32; // not used
1319
                      bit_start_2 = 32; // not used
1320
                      bit_end_2   = 32; // not used
1321
                    end
1322
                  `ETH_MAC_ADDR0:
1323
                    begin
1324
                      bit_start_1 = 0;
1325
                      bit_end_1   = 31;
1326
                      bit_start_2 = 32; // not used
1327
                      bit_end_2   = 32; // not used
1328
                    end
1329
                  `ETH_MAC_ADDR1:
1330
                    begin
1331
                      bit_start_1 = 0;
1332
                      bit_end_1   = 15;
1333
                      bit_start_2 = 32; // not used
1334
                      bit_end_2   = 32; // not used
1335
                    end
1336
                  `ETH_HASH_ADDR0:
1337
                    begin
1338
                      bit_start_1 = 0;
1339
                      bit_end_1   = 31;
1340
                      bit_start_2 = 32; // not used
1341
                      bit_end_2   = 32; // not used
1342
                    end
1343
                  default: // `ETH_HASH_ADDR1:
1344
                    begin
1345
                      bit_start_1 = 0;
1346
                      bit_end_1   = 31;
1347
                      bit_start_2 = 32; // not used
1348
                      bit_end_2   = 32; // not used
1349
                    end
1350
                  endcase
1351
                  #1;
1352
                  // 3 LSBits of MIICOMMAND are NOT written !!!
1353
                  if ( ((`ETH_BASE + i2) == `ETH_MIICOMMAND) && (i_data <= 2) )
1354
                  begin
1355
                    if (burst_tmp_data[31:0] !== burst_data[31:0])
1356
                    begin
1357
                      fail = fail + 1;
1358
                      test_fail("NON WR bit of the MAC MIICOMMAND register was wrong written or read");
1359
                      `TIME;
1360
                      $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1361
                                wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1362
                    end
1363
                  end
1364
                  else
1365
                  begin
1366
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
1367
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
1368
                    begin
1369
                      if (burst_tmp_data[31:0] !== burst_data[31:0])
1370
                      begin
1371
                        fail = fail + 1;
1372
                        test_fail("RW bit of the MAC register was not written or not read");
1373
                        `TIME;
1374
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1375
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1376
                      end
1377
                    end
1378
                    else // data should not be equal to tmp_data
1379
                    begin
1380
                      if (burst_tmp_data[31:0] === burst_data[31:0])
1381
                      begin
1382
                        fail = fail + 1;
1383
                        test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
1384
                        `TIME;
1385
                        $display("wbm_init_waits %d, wbm_subseq_waits %d, addr %h, data %h, tmp_data %h",
1386
                                  wbm_init_waits, wbm_subseq_waits, i2, burst_data[31:0], burst_tmp_data[31:0]);
1387
                      end
1388
                    end
1389
                  end
1390
                  burst_tmp_data = burst_tmp_data >> 32;
1391
                  burst_data = burst_data >> 32;
1392
                end
1393
              end
1394
            end
1395
          end
1396
          if(fail == 0)
1397
            test_ok;
1398
          else
1399
            fail = 0;*/
1400
  end
1401 116 mohor
 
1402 169 mohor
end
1403 156 mohor
 
1404 169 mohor
end
1405
endtask // test_access_to_mac_reg
1406 156 mohor
 
1407
 
1408 169 mohor
task test_mii;
1409
  input  [31:0]  start_task;
1410
  input  [31:0]  end_task;
1411
  integer        i;
1412
  integer        i1;
1413
  integer        i2;
1414
  integer        i3;
1415
  integer        cnt;
1416
  integer        fail;
1417 181 mohor
  integer        test_num;
1418 169 mohor
  reg     [8:0]  clk_div; // only 8 bits are valid!
1419
  reg     [4:0]  phy_addr;
1420
  reg     [4:0]  reg_addr;
1421
  reg     [15:0] phy_data;
1422
  reg     [15:0] tmp_data;
1423
begin
1424
// MIIM MODULE TEST
1425
test_heading("MIIM MODULE TEST");
1426
$display(" ");
1427
$display("MIIM MODULE TEST");
1428
fail = 0;
1429 156 mohor
 
1430 192 tadej
// reset MAC registers
1431
hard_reset;
1432
// reset MAC and MII LOGIC with soft reset
1433 274 tadejm
//reset_mac;
1434
//reset_mii;
1435 116 mohor
 
1436 194 tadej
 
1437 181 mohor
//////////////////////////////////////////////////////////////////////
1438
////                                                              ////
1439
////  test_mii:                                                   ////
1440
////                                                              ////
1441
////  0:  Test clock divider of mii management module with all    ////
1442
////      possible frequences.                                    ////
1443
////  1:  Test various readings from 'real' phy registers.        ////
1444
////  2:  Test various writings to 'real' phy registers (control  ////
1445
////      and non writable registers)                             ////
1446
////  3:  Test reset phy through mii management module            ////
1447
////  4:  Test 'walking one' across phy address (with and without ////
1448
////      preamble)                                               ////
1449
////  5:  Test 'walking one' across phy's register address (with  ////
1450
////      and without preamble)                                   ////
1451
////  6:  Test 'walking one' across phy's data (with and without  ////
1452
////      preamble)                                               ////
1453
////  7:  Test reading from phy with wrong phy address (host      ////
1454
////      reading high 'z' data)                                  ////
1455
////  8:  Test writing to phy with wrong phy address and reading  ////
1456
////      from correct one                                        ////
1457
////  9:  Test sliding stop scan command immediately after read   ////
1458
////      request (with and without preamble)                     ////
1459
//// 10:  Test sliding stop scan command immediately after write  ////
1460
////      request (with and without preamble)                     ////
1461
//// 11:  Test busy and nvalid status durations during write      ////
1462
////      (with and without preamble)                             ////
1463
//// 12:  Test busy and nvalid status durations during write      ////
1464
////      (with and without preamble)                             ////
1465
//// 13:  Test busy and nvalid status durations during scan (with ////
1466
////      and without preamble)                                   ////
1467
//// 14:  Test scan status from phy with detecting link-fail bit  ////
1468
////      (with and without preamble)                             ////
1469
//// 15:  Test scan status from phy with sliding link-fail bit    ////
1470
////      (with and without preamble)                             ////
1471
//// 16:  Test sliding stop scan command immediately after scan   ////
1472
////      request (with and without preamble)                     ////
1473
//// 17:  Test sliding stop scan command after 2. scan (with and  ////
1474
////      without preamble)                                       ////
1475
////                                                              ////
1476
//////////////////////////////////////////////////////////////////////
1477 194 tadej
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1478 169 mohor
begin
1479 194 tadej
 
1480 181 mohor
  ////////////////////////////////////////////////////////////////////
1481
  ////                                                            ////
1482
  ////  Test clock divider of mii management module with all      ////
1483
  ////  possible frequences.                                      ////
1484
  ////                                                            ////
1485
  ////////////////////////////////////////////////////////////////////
1486
  if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
1487 169 mohor
  begin
1488 194 tadej
    // TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
1489
    test_name   = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
1490
    `TIME; $display("  TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
1491 181 mohor
 
1492
    wait(Mdc_O); // wait for MII clock to be 1
1493
    for(clk_div = 0; clk_div <= 255; clk_div = clk_div + 1)
1494
    begin
1495
      i1 = 0;
1496
      i2 = 0;
1497
      #Tp mii_set_clk_div(clk_div[7:0]);
1498
      @(posedge Mdc_O);
1499
      #Tp;
1500
      fork
1501 169 mohor
        begin
1502 181 mohor
          @(posedge Mdc_O);
1503 169 mohor
          #Tp;
1504 181 mohor
          disable count_i1;
1505
          disable count_i2;
1506 169 mohor
        end
1507 181 mohor
        begin: count_i1
1508
          forever
1509
          begin
1510
            @(posedge wb_clk);
1511
            i1 = i1 + 1;
1512
            #Tp;
1513
          end
1514
        end
1515
        begin: count_i2
1516
          forever
1517
          begin
1518
            @(negedge wb_clk);
1519
            i2 = i2 + 1;
1520
            #Tp;
1521
          end
1522
        end
1523
      join
1524
      if((clk_div[7:0] == 0) || (clk_div[7:0] == 1) || (clk_div[7:0] == 2) || (clk_div[7:0] == 3))
1525
      begin
1526
        if((i1 == i2) && (i1 == 2))
1527 169 mohor
        begin
1528
        end
1529 181 mohor
        else
1530
        begin
1531
          fail = fail + 1;
1532 209 tadejm
          test_fail("Clock divider of MII module did'nt divide frequency corectly (it should divide by 2)");
1533 181 mohor
        end
1534 169 mohor
      end
1535
      else
1536
      begin
1537 181 mohor
        if((i1 == i2) && (i1 == {clk_div[7:1], 1'b0}))
1538
        begin
1539
        end
1540
        else
1541
        begin
1542
          fail = fail + 1;
1543
          test_fail("Clock divider of MII module did'nt divide frequency corectly");
1544
        end
1545 169 mohor
      end
1546
    end
1547 181 mohor
    if(fail == 0)
1548
      test_ok;
1549 169 mohor
    else
1550 181 mohor
      fail = 0;
1551
  end
1552
 
1553
 
1554
  ////////////////////////////////////////////////////////////////////
1555
  ////                                                            ////
1556
  ////  Test various readings from 'real' phy registers.          ////
1557
  ////                                                            ////
1558
  ////////////////////////////////////////////////////////////////////
1559
  if (test_num == 1) // Test various readings from 'real' phy registers.
1560
  begin
1561 194 tadej
    // TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
1562
    test_name   = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
1563
    `TIME; $display("  TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
1564 181 mohor
 
1565
    // set the fastest possible MII
1566
    clk_div = 0;
1567
    mii_set_clk_div(clk_div[7:0]);
1568
    // set address
1569
    reg_addr = 5'h1F;
1570
    phy_addr = 5'h1;
1571
    while(reg_addr >= 5'h4)
1572 169 mohor
    begin
1573 181 mohor
      // read request
1574
      #Tp mii_read_req(phy_addr, reg_addr);
1575
      check_mii_busy; // wait for read to finish
1576
      // read data
1577 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1578 181 mohor
      if (phy_data !== 16'hDEAD)
1579 169 mohor
      begin
1580 181 mohor
        test_fail("Wrong data was read from PHY from 'not used' address space");
1581
        fail = fail + 1;
1582 169 mohor
      end
1583 181 mohor
      if (reg_addr == 5'h4) // go out of for loop
1584
        reg_addr = 5'h3;
1585 169 mohor
      else
1586 181 mohor
        reg_addr = reg_addr - 5'h9;
1587 169 mohor
    end
1588 181 mohor
 
1589
    // set address
1590
    reg_addr = 5'h3;
1591
    // read request
1592
    #Tp mii_read_req(phy_addr, reg_addr);
1593
    check_mii_busy; // wait for read to finish
1594
    // read data
1595 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1596 181 mohor
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
1597
    begin
1598
      test_fail("Wrong data was read from PHY from ID register 2");
1599
      fail = fail + 1;
1600
    end
1601
    if(fail == 0)
1602
      test_ok;
1603
    else
1604
      fail = 0;
1605 169 mohor
  end
1606 116 mohor
 
1607
 
1608 181 mohor
  ////////////////////////////////////////////////////////////////////
1609
  ////                                                            ////
1610
  ////  Test various writings to 'real' phy registers (control    ////
1611
  ////  and non writable registers)                               ////
1612
  ////                                                            ////
1613
  ////////////////////////////////////////////////////////////////////
1614
  if (test_num == 2) // 
1615 169 mohor
  begin
1616 194 tadej
    // TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )
1617
    test_name   = "TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )";
1618
    `TIME; $display("  TEST 2: VARIOUS WRITINGS TO 'REAL' PHY REGISTERS ( CONTROL AND NON WRITABLE REGISTERS )");
1619 181 mohor
 
1620
    // negate data and try to write into unwritable register
1621
    tmp_data = ~phy_data;
1622
    // write request
1623
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1624
    check_mii_busy; // wait for write to finish
1625 169 mohor
    // read request
1626
    #Tp mii_read_req(phy_addr, reg_addr);
1627
    check_mii_busy; // wait for read to finish
1628
    // read data
1629 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1630 181 mohor
    if (tmp_data !== phy_data)
1631
    begin
1632
      test_fail("Data was written into unwritable PHY register - ID register 2");
1633
      fail = fail + 1;
1634
    end
1635
 
1636
    // set address
1637
    reg_addr = 5'h0; // control register
1638
    // read request
1639
    #Tp mii_read_req(phy_addr, reg_addr);
1640
    check_mii_busy; // wait for read to finish
1641
    // read data
1642 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1643 181 mohor
    // write request
1644
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1645
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1646
    check_mii_busy; // wait for write to finish
1647
    // read request
1648
    #Tp mii_read_req(phy_addr, reg_addr);
1649
    check_mii_busy; // wait for read to finish
1650
    // read data
1651 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1652 181 mohor
    if (phy_data !== 16'h7DFF)
1653 169 mohor
    begin
1654 181 mohor
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1655 169 mohor
      fail = fail + 1;
1656
    end
1657 181 mohor
    // write request
1658
    #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1659
    check_mii_busy; // wait for write to finish
1660
    // read request
1661
    #Tp mii_read_req(phy_addr, reg_addr);
1662
    check_mii_busy; // wait for read to finish
1663
    // read data
1664 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1665 181 mohor
    if (phy_data !== tmp_data)
1666
    begin
1667
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1668
      fail = fail + 1;
1669
    end
1670
    if(fail == 0)
1671
      test_ok;
1672 116 mohor
    else
1673 181 mohor
      fail = 0;
1674 169 mohor
  end
1675 116 mohor
 
1676
 
1677 181 mohor
  ////////////////////////////////////////////////////////////////////
1678
  ////                                                            ////
1679
  ////  Test reset phy through mii management module              ////
1680
  ////                                                            ////
1681
  ////////////////////////////////////////////////////////////////////
1682
  if (test_num == 3) // 
1683 169 mohor
  begin
1684 194 tadej
    // TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE
1685
    test_name   = "TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE";
1686
    `TIME; $display("  TEST 3: RESET PHY THROUGH MII MANAGEMENT MODULE");
1687 181 mohor
 
1688
    // set address
1689
    reg_addr = 5'h0; // control register
1690
    // write request
1691
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1692
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1693
    check_mii_busy; // wait for write to finish
1694
    // read request
1695
    #Tp mii_read_req(phy_addr, reg_addr);
1696
    check_mii_busy; // wait for read to finish
1697
    // read data
1698 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1699 181 mohor
    if (phy_data !== tmp_data)
1700
    begin
1701
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
1702
      fail = fail + 1;
1703
    end
1704
    // set reset bit - selfclearing bit in PHY
1705
    phy_data = phy_data | 16'h8000;
1706
    // write request
1707
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1708
    check_mii_busy; // wait for write to finish
1709
    // read request
1710
    #Tp mii_read_req(phy_addr, reg_addr);
1711
    check_mii_busy; // wait for read to finish
1712
    // read data
1713 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1714 181 mohor
    // check self clearing of reset bit
1715
    if (tmp_data[15] !== 1'b0)
1716
    begin
1717
      test_fail("Reset bit should be self cleared - control register");
1718
      fail = fail + 1;
1719
    end
1720
    // check reset value of control register
1721
    if (tmp_data !== {2'h0, (`LED_CFG1 || `LED_CFG2), `LED_CFG1, 3'h0, `LED_CFG3, 8'h0})
1722
    begin
1723
      test_fail("PHY was not reset correctly AND/OR reset bit not self cleared");
1724
      fail = fail + 1;
1725
    end
1726
    if(fail == 0)
1727
      test_ok;
1728
    else
1729
      fail = 0;
1730 169 mohor
  end
1731
 
1732
 
1733 181 mohor
  ////////////////////////////////////////////////////////////////////
1734
  ////                                                            ////
1735
  ////  Test 'walking one' across phy address (with and without   ////
1736
  ////  preamble)                                                 ////
1737
  ////                                                            ////
1738
  ////////////////////////////////////////////////////////////////////
1739
  if (test_num == 4) // 
1740 169 mohor
  begin
1741 194 tadej
    // TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )
1742
    test_name   = "TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1743
    `TIME; $display("  TEST 4: 'WALKING ONE' ACROSS PHY ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1744 181 mohor
 
1745
    // set PHY to test mode
1746
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1747
    for (i = 0; i <= 1; i = i + 1)
1748 169 mohor
    begin
1749 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1750
      #Tp eth_phy.clear_test_regs;
1751
      // MII mode register
1752
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1753
                wbm_subseq_waits);
1754
      // walk one across phy address
1755
      for (phy_addr = 5'h1; phy_addr > 5'h0; phy_addr = phy_addr << 1)
1756 169 mohor
      begin
1757 181 mohor
        reg_addr = $random;
1758
        tmp_data = $random;
1759
        // write request
1760
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1761
        check_mii_busy; // wait for write to finish
1762
        // read request
1763
        #Tp mii_read_req(phy_addr, reg_addr);
1764
        check_mii_busy; // wait for read to finish
1765
        // read data
1766 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1767 181 mohor
        #Tp;
1768
        if (phy_data !== tmp_data)
1769
        begin
1770
          if (i)
1771
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1772
          else
1773
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1774
          fail = fail + 1;
1775
        end
1776
        @(posedge wb_clk);
1777
        #Tp;
1778 169 mohor
      end
1779
    end
1780 181 mohor
    // set PHY to normal mode
1781
    #Tp eth_phy.test_regs(0);
1782
    #Tp eth_phy.preamble_suppresed(0);
1783
    // MII mode register
1784
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1785
    if(fail == 0)
1786
      test_ok;
1787
    else
1788
      fail = 0;
1789 169 mohor
  end
1790
 
1791
 
1792 181 mohor
  ////////////////////////////////////////////////////////////////////
1793
  ////                                                            ////
1794
  ////  Test 'walking one' across phy's register address (with    ////
1795
  ////  and without preamble)                                     ////
1796
  ////                                                            ////
1797
  ////////////////////////////////////////////////////////////////////
1798
  if (test_num == 5) // 
1799 169 mohor
  begin
1800 194 tadej
    // TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )
1801
    test_name   = "TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )";
1802
    `TIME; $display("  TEST 5: 'WALKING ONE' ACROSS PHY'S REGISTER ADDRESS ( WITH AND WITHOUT PREAMBLE )");
1803 181 mohor
 
1804
    // set PHY to test mode
1805
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1806
    for (i = 0; i <= 1; i = i + 1)
1807 169 mohor
    begin
1808 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1809
      #Tp eth_phy.clear_test_regs;
1810
      // MII mode register
1811
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1812
                wbm_subseq_waits);
1813
      // walk one across reg address
1814
      for (reg_addr = 5'h1; reg_addr > 5'h0; reg_addr = reg_addr << 1)
1815 169 mohor
      begin
1816 181 mohor
        phy_addr = $random;
1817
        tmp_data = $random;
1818
        // write request
1819
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1820
        check_mii_busy; // wait for write to finish
1821
        // read request
1822
        #Tp mii_read_req(phy_addr, reg_addr);
1823
        check_mii_busy; // wait for read to finish
1824
        // read data
1825 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1826 181 mohor
        #Tp;
1827
        if (phy_data !== tmp_data)
1828
        begin
1829
          if (i)
1830
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1831
          else
1832
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1833
          fail = fail + 1;
1834
        end
1835
        @(posedge wb_clk);
1836
        #Tp;
1837 169 mohor
      end
1838
    end
1839 181 mohor
    // set PHY to normal mode
1840
    #Tp eth_phy.test_regs(0);
1841
    #Tp eth_phy.preamble_suppresed(0);
1842
    // MII mode register
1843
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1844
    if(fail == 0)
1845
      test_ok;
1846
    else
1847
      fail = 0;
1848 169 mohor
  end
1849
 
1850
 
1851 181 mohor
  ////////////////////////////////////////////////////////////////////
1852
  ////                                                            ////
1853
  ////  Test 'walking one' across phy's data (with and without    ////
1854
  ////  preamble)                                                 ////
1855
  ////                                                            ////
1856
  ////////////////////////////////////////////////////////////////////
1857
  if (test_num == 6) // 
1858 169 mohor
  begin
1859 194 tadej
    // TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )
1860
    test_name   = "TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )";
1861
    `TIME; $display("  TEST 6: 'WALKING ONE' ACROSS PHY'S DATA ( WITH AND WITHOUT PREAMBLE )");
1862 181 mohor
 
1863
    // set PHY to test mode
1864
    #Tp eth_phy.test_regs(1); // set test registers (wholy writable registers) and respond to all PHY addresses
1865
    for (i = 0; i <= 1; i = i + 1)
1866 169 mohor
    begin
1867 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
1868
      #Tp eth_phy.clear_test_regs;
1869
      // MII mode register
1870
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}), 4'hF, 1, wbm_init_waits,
1871
                wbm_subseq_waits);
1872
      // walk one across data
1873
      for (tmp_data = 16'h1; tmp_data > 16'h0; tmp_data = tmp_data << 1)
1874 169 mohor
      begin
1875 181 mohor
        phy_addr = $random;
1876
        reg_addr = $random;
1877
        // write request
1878
        #Tp mii_write_req(phy_addr, reg_addr, tmp_data);
1879
        check_mii_busy; // wait for write to finish
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 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1885 181 mohor
        #Tp;
1886
        if (phy_data !== tmp_data)
1887
        begin
1888
          if (i)
1889
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
1890
          else
1891
            test_fail("Data was not correctly written into OR read from test registers (with preamble)");
1892
          fail = fail + 1;
1893
        end
1894
        @(posedge wb_clk);
1895
        #Tp;
1896 169 mohor
      end
1897
    end
1898 181 mohor
    // set PHY to normal mode
1899
    #Tp eth_phy.test_regs(0);
1900
    #Tp eth_phy.preamble_suppresed(0);
1901
    // MII mode register
1902
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1903
    if(fail == 0)
1904
      test_ok;
1905
    else
1906
      fail = 0;
1907 169 mohor
  end
1908
 
1909
 
1910 181 mohor
  ////////////////////////////////////////////////////////////////////
1911
  ////                                                            ////
1912
  ////  Test reading from phy with wrong phy address (host        ////
1913
  ////  reading high 'z' data)                                    ////
1914
  ////                                                            ////
1915
  ////////////////////////////////////////////////////////////////////
1916
  if (test_num == 7) // 
1917 169 mohor
  begin
1918 194 tadej
    // TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )
1919
    test_name   = "TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )";
1920
    `TIME; $display("  TEST 7: READING FROM PHY WITH WRONG PHY ADDRESS ( HOST READING HIGH 'Z' DATA )");
1921 181 mohor
 
1922
    phy_addr = 5'h2; // wrong PHY address
1923
    // read request
1924
    #Tp mii_read_req(phy_addr, reg_addr);
1925
    check_mii_busy; // wait for read to finish
1926
    // read data
1927
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
1928 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1929 181 mohor
    if (tmp_data !== 16'hzzzz)
1930
    begin
1931
      test_fail("Data was read from PHY register with wrong PHY address - control register");
1932
      fail = fail + 1;
1933
    end
1934
    if(fail == 0)
1935
      test_ok;
1936
    else
1937
      fail = 0;
1938 169 mohor
  end
1939
 
1940
 
1941 181 mohor
  ////////////////////////////////////////////////////////////////////
1942
  ////                                                            ////
1943
  ////  Test writing to phy with wrong phy address and reading    ////
1944
  ////  from correct one                                          ////
1945
  ////                                                            ////
1946
  ////////////////////////////////////////////////////////////////////
1947
  if (test_num == 8) // 
1948 169 mohor
  begin
1949 194 tadej
    // TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE
1950
    test_name   = "TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE";
1951
    `TIME; $display("  TEST 8: WRITING TO PHY WITH WRONG PHY ADDRESS AND READING FROM CORRECT ONE");
1952 181 mohor
 
1953
    // set address
1954
    reg_addr = 5'h0; // control register
1955
    phy_addr = 5'h2; // wrong PHY address
1956
    // write request
1957
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
1958
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
1959
    check_mii_busy; // wait for write to finish
1960
 
1961
    phy_addr = 5'h1; // correct PHY address
1962
    // read request
1963
    #Tp mii_read_req(phy_addr, reg_addr);
1964
    check_mii_busy; // wait for read to finish
1965
    // read data
1966 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1967 181 mohor
    if (phy_data === tmp_data)
1968
    begin
1969
      test_fail("Data was written into PHY register with wrong PHY address - control register");
1970
      fail = fail + 1;
1971
    end
1972
    if(fail == 0)
1973
      test_ok;
1974
    else
1975
      fail = 0;
1976 169 mohor
  end
1977
 
1978
 
1979 181 mohor
  ////////////////////////////////////////////////////////////////////
1980
  ////                                                            ////
1981
  ////  Test sliding stop scan command immediately after read     ////
1982
  ////  request (with and without preamble)                       ////
1983
  ////                                                            ////
1984
  ////////////////////////////////////////////////////////////////////
1985
  if (test_num == 9) // 
1986 169 mohor
  begin
1987 194 tadej
    // TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )
1988
    test_name = "TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )";
1989 181 mohor
    `TIME;
1990 194 tadej
    $display("  TEST 9: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER READ REQUEST ( WITH AND WITHOUT PREAMBLE )");
1991 181 mohor
 
1992
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
1993 169 mohor
    begin
1994 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
1995
      // MII mode register
1996
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
1997
               wbm_subseq_waits);
1998
      i = 0;
1999
      cnt = 0;
2000
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2001 169 mohor
      begin
2002 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after read will be finished
2003
        begin
2004
          // set address
2005
          reg_addr = 5'h0; // control register
2006
          phy_addr = 5'h1; // correct PHY address
2007
          cnt = 0;
2008
          // read request
2009
          #Tp mii_read_req(phy_addr, reg_addr);
2010
          fork
2011
            begin
2012
              repeat(i) @(posedge Mdc_O);
2013
              // write command 0x0 into MII command register
2014
              // MII command written while read in progress
2015
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2016
              @(posedge wb_clk);
2017
              #Tp check_mii_busy; // wait for read to finish
2018
            end
2019
            begin
2020
              // wait for serial bus to become active
2021
              wait(Mdio_IO !== 1'bz);
2022
              // count transfer length
2023
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2024
              begin
2025
                @(posedge Mdc_O);
2026
                #Tp cnt = cnt + 1;
2027
              end
2028
            end
2029
          join
2030
          // check transfer length
2031
          if (i2) // without preamble
2032 169 mohor
          begin
2033 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2034
            begin
2035
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2036
              fail = fail + 1;
2037
            end
2038 169 mohor
          end
2039 181 mohor
          else // with preamble
2040 169 mohor
          begin
2041 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2042
            begin
2043
              test_fail("Read request did not proceed correctly, while SCAN STOP command was written");
2044
              fail = fail + 1;
2045
            end
2046
          end
2047
          // check the BUSY signal to see if the bus is still IDLE
2048
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2049
            check_mii_busy; // wait for bus to become idle
2050
 
2051
          // try normal write or read after read was finished
2052
          #Tp phy_data = {8'h7D, (i[7:0] + 1)};
2053
          #Tp cnt = 0;
2054
          if (i3 == 0) // write after read
2055
          begin
2056
            // write request
2057
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2058 169 mohor
            // wait for serial bus to become active
2059
            wait(Mdio_IO !== 1'bz);
2060
            // count transfer length
2061 181 mohor
            while(Mdio_IO !== 1'bz)
2062 169 mohor
            begin
2063
              @(posedge Mdc_O);
2064
              #Tp cnt = cnt + 1;
2065
            end
2066 181 mohor
            @(posedge Mdc_O);
2067
            // read request
2068
            #Tp mii_read_req(phy_addr, reg_addr);
2069
            check_mii_busy; // wait for read to finish
2070
            // read and check data
2071 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2072 181 mohor
            if (phy_data !== tmp_data)
2073
            begin
2074
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2075
              fail = fail + 1;
2076
            end
2077 169 mohor
          end
2078 181 mohor
          else // read after read
2079 169 mohor
          begin
2080 181 mohor
            // read request
2081
            #Tp mii_read_req(phy_addr, reg_addr);
2082
            // wait for serial bus to become active
2083
            wait(Mdio_IO !== 1'bz);
2084
            // count transfer length
2085
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2086
            begin
2087
              @(posedge Mdc_O);
2088
              #Tp cnt = cnt + 1;
2089
            end
2090 169 mohor
            @(posedge Mdc_O);
2091 181 mohor
            check_mii_busy; // wait for read to finish
2092
            // read and check data
2093 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2094 181 mohor
            if (phy_data !== tmp_data)
2095
            begin
2096
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2097
              fail = fail + 1;
2098
            end
2099 169 mohor
          end
2100 181 mohor
          // check if transfer was a proper length
2101
          if (i2) // without preamble
2102 169 mohor
          begin
2103 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2104
            begin
2105
              test_fail("New request did not proceed correctly, after read request");
2106
              fail = fail + 1;
2107
            end
2108 169 mohor
          end
2109 181 mohor
          else // with preamble
2110 169 mohor
          begin
2111 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2112
            begin
2113
              test_fail("New request did not proceed correctly, after read request");
2114
              fail = fail + 1;
2115
            end
2116 169 mohor
          end
2117
        end
2118 181 mohor
        #Tp;
2119
        // set delay of writing the command
2120 169 mohor
        if (i2) // without preamble
2121
        begin
2122 181 mohor
          case(i)
2123
            0, 1:               i = i + 1;
2124
            18, 19, 20, 21, 22,
2125
            23, 24, 25, 26, 27,
2126
            28, 29, 30, 31, 32,
2127
            33, 34, 35:         i = i + 1;
2128
            36:                 i = 80;
2129
            default:            i = 18;
2130
          endcase
2131 169 mohor
        end
2132
        else // with preamble
2133
        begin
2134 181 mohor
          case(i)
2135
            0, 1:               i = i + 1;
2136
            50, 51, 52, 53, 54,
2137
            55, 56, 57, 58, 59,
2138
            60, 61, 62, 63, 64,
2139
            65, 66, 67:         i = i + 1;
2140
            68:                 i = 80;
2141
            default:            i = 50;
2142
          endcase
2143 169 mohor
        end
2144 181 mohor
        @(posedge wb_clk);
2145 169 mohor
      end
2146
    end
2147 181 mohor
    // set PHY to normal mode
2148
    #Tp eth_phy.preamble_suppresed(0);
2149
    // MII mode register
2150
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2151
    if(fail == 0)
2152
      test_ok;
2153
    else
2154
      fail = 0;
2155 169 mohor
  end
2156
 
2157
 
2158 181 mohor
  ////////////////////////////////////////////////////////////////////
2159
  ////                                                            ////
2160
  ////  Test sliding stop scan command immediately after write    ////
2161
  ////  request (with and without preamble)                       ////
2162
  ////                                                            ////
2163
  ////////////////////////////////////////////////////////////////////
2164
  if (test_num == 10) // 
2165 169 mohor
  begin
2166 194 tadej
    // TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )
2167
    test_name = "TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )";
2168 181 mohor
    `TIME;
2169 194 tadej
    $display("  TEST 10: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER WRITE REQUEST ( WITH AND WITHOUT PREAMBLE )");
2170 181 mohor
 
2171
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
2172 169 mohor
    begin
2173 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
2174
      // MII mode register
2175
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
2176
                wbm_subseq_waits);
2177
      i = 0;
2178
      cnt = 0;
2179
      while (i < 80) // delay for sliding of writing a STOP SCAN command
2180 169 mohor
      begin
2181 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after write will be finished
2182
        begin
2183
          // set address
2184
          reg_addr = 5'h0; // control register
2185
          phy_addr = 5'h1; // correct PHY address
2186
          cnt = 0;
2187
          // write request
2188
          phy_data = {8'h75, (i[7:0] + 1)};
2189
          #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2190
          fork
2191
            begin
2192
              repeat(i) @(posedge Mdc_O);
2193
              // write command 0x0 into MII command register
2194
              // MII command written while read in progress
2195
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2196
              @(posedge wb_clk);
2197
              #Tp check_mii_busy; // wait for write to finish
2198
            end
2199
            begin
2200
              // wait for serial bus to become active
2201
              wait(Mdio_IO !== 1'bz);
2202
              // count transfer length
2203
              while(Mdio_IO !== 1'bz)
2204
              begin
2205
                @(posedge Mdc_O);
2206
                #Tp cnt = cnt + 1;
2207
              end
2208
            end
2209
          join
2210
          // check transfer length
2211
          if (i2) // without preamble
2212 169 mohor
          begin
2213 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2214
            begin
2215
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2216
              fail = fail + 1;
2217
            end
2218 169 mohor
          end
2219 181 mohor
          else // with preamble
2220 169 mohor
          begin
2221 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2222
            begin
2223
              test_fail("Write request did not proceed correctly, while SCAN STOP command was written");
2224
              fail = fail + 1;
2225
            end
2226
          end
2227
          // check the BUSY signal to see if the bus is still IDLE
2228
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
2229
            check_mii_busy; // wait for bus to become idle
2230
 
2231
          // try normal write or read after write was finished
2232
          #Tp cnt = 0;
2233
          if (i3 == 0) // write after write
2234
          begin
2235
            phy_data = {8'h7A, (i[7:0] + 1)};
2236
            // write request
2237
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
2238 169 mohor
            // wait for serial bus to become active
2239
            wait(Mdio_IO !== 1'bz);
2240
            // count transfer length
2241
            while(Mdio_IO !== 1'bz)
2242
            begin
2243
              @(posedge Mdc_O);
2244
              #Tp cnt = cnt + 1;
2245
            end
2246 181 mohor
            @(posedge Mdc_O);
2247
            // read request
2248
            #Tp mii_read_req(phy_addr, reg_addr);
2249
            check_mii_busy; // wait for read to finish
2250
            // read and check data
2251 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2252 181 mohor
            if (phy_data !== tmp_data)
2253
            begin
2254
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2255
              fail = fail + 1;
2256
            end
2257 169 mohor
          end
2258 181 mohor
          else // read after write
2259 169 mohor
          begin
2260 181 mohor
            // read request
2261
            #Tp mii_read_req(phy_addr, reg_addr);
2262
            // wait for serial bus to become active
2263
            wait(Mdio_IO !== 1'bz);
2264
            // count transfer length
2265
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
2266
            begin
2267
              @(posedge Mdc_O);
2268
              #Tp cnt = cnt + 1;
2269
            end
2270 169 mohor
            @(posedge Mdc_O);
2271 181 mohor
            check_mii_busy; // wait for read to finish
2272
            // read and check data
2273 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2274 181 mohor
            if (phy_data !== tmp_data)
2275
            begin
2276
              test_fail("Data was not correctly written into OR read from PHY register - control register");
2277
              fail = fail + 1;
2278
            end
2279 169 mohor
          end
2280 181 mohor
          // check if transfer was a proper length
2281
          if (i2) // without preamble
2282 169 mohor
          begin
2283 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
2284
            begin
2285
              test_fail("New request did not proceed correctly, after write request");
2286
              fail = fail + 1;
2287
            end
2288 169 mohor
          end
2289 181 mohor
          else // with preamble
2290 169 mohor
          begin
2291 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
2292
            begin
2293
              test_fail("New request did not proceed correctly, after write request");
2294
              fail = fail + 1;
2295
            end
2296 169 mohor
          end
2297
        end
2298 181 mohor
        #Tp;
2299
        // set delay of writing the command
2300 169 mohor
        if (i2) // without preamble
2301
        begin
2302 181 mohor
          case(i)
2303
            0, 1:               i = i + 1;
2304
            18, 19, 20, 21, 22,
2305
            23, 24, 25, 26, 27,
2306
            28, 29, 30, 31, 32,
2307
            33, 34, 35:         i = i + 1;
2308
            36:                 i = 80;
2309
            default:            i = 18;
2310
          endcase
2311 169 mohor
        end
2312
        else // with preamble
2313
        begin
2314 181 mohor
          case(i)
2315
            0, 1:               i = i + 1;
2316
            50, 51, 52, 53, 54,
2317
            55, 56, 57, 58, 59,
2318
            60, 61, 62, 63, 64,
2319
            65, 66, 67:         i = i + 1;
2320
            68:                 i = 80;
2321
            default:            i = 50;
2322
          endcase
2323 169 mohor
        end
2324 181 mohor
        @(posedge wb_clk);
2325 169 mohor
      end
2326
    end
2327 181 mohor
    // set PHY to normal mode
2328
    #Tp eth_phy.preamble_suppresed(0);
2329
    // MII mode register
2330
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2331
    if(fail == 0)
2332
      test_ok;
2333
    else
2334
      fail = 0;
2335 169 mohor
  end
2336
 
2337
 
2338 181 mohor
  ////////////////////////////////////////////////////////////////////
2339
  ////                                                            ////
2340
  ////  Test busy and nvalid status durations during write (with  ////
2341
  ////  and without preamble)                                     ////
2342
  ////                                                            ////
2343
  ////////////////////////////////////////////////////////////////////
2344
  if (test_num == 11) // 
2345 169 mohor
  begin
2346 194 tadej
    // TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
2347
    test_name   = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
2348
    `TIME; $display("  TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
2349 181 mohor
 
2350
    reset_mii; // reset MII
2351
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2352
    #Tp eth_phy.link_up_down(1);
2353
    // set the MII
2354
    clk_div = 64;
2355
    mii_set_clk_div(clk_div[7:0]);
2356
    // set address
2357
    reg_addr = 5'h1; // status register
2358
    phy_addr = 5'h1; // correct PHY address
2359
 
2360
    for (i = 0; i <= 1; i = i + 1)
2361 169 mohor
    begin
2362 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2363
      // MII mode register
2364
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2365
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2366
      @(posedge Mdc_O);
2367
      // write request
2368
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
2369
      // read data from MII status register - Busy and Nvalid bits
2370 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2371 181 mohor
 
2372
      // check MII IO signal and Busy and Nvalid bits
2373
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2374 169 mohor
      begin
2375 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2376
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2377
        begin
2378
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
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 already be set to '1', due to reads from MII status register
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 after write, due to reads from MII status register");
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 serial bus to become active
2402
      wait(Mdio_IO !== 1'bz);
2403
      // count transfer bits
2404
      if (i)
2405 169 mohor
      begin
2406 181 mohor
        repeat(32) @(posedge Mdc_O);
2407 169 mohor
      end
2408 181 mohor
      else
2409 169 mohor
      begin
2410 181 mohor
        repeat(64) @(posedge Mdc_O);
2411 169 mohor
      end
2412 181 mohor
      // read data from MII status register - Busy and Nvalid bits
2413 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2414 181 mohor
 
2415
      // check MII IO signal and Busy and Nvalid bits
2416
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2417 169 mohor
      begin
2418 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2419
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2420
        begin
2421
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2422
          fail = fail + 1;
2423
        end
2424
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2425
        begin
2426
          test_fail("Nvalid signal was set during write");
2427
          fail = fail + 1;
2428
        end
2429 169 mohor
      end
2430 181 mohor
      else // Busy bit should still be set to '1'
2431 169 mohor
      begin
2432 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2433
        begin
2434
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2435
          fail = fail + 1;
2436
        end
2437
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2438
        begin
2439
          test_fail("Nvalid signal was set during write");
2440
          fail = fail + 1;
2441
        end
2442 169 mohor
      end
2443 181 mohor
 
2444
      // wait for next negative clock edge
2445
      @(negedge Mdc_O);
2446 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2447 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2448 181 mohor
 
2449 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2450
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2451
      begin
2452
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2453
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2454
        begin
2455
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2456
          fail = fail + 1;
2457
        end
2458
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2459
        begin
2460
          test_fail("Nvalid signal was set during write");
2461
          fail = fail + 1;
2462
        end
2463
      end
2464 181 mohor
      else // Busy bit should still be set to '1'
2465 169 mohor
      begin
2466
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2467
        begin
2468 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2469
          fail = fail + 1;
2470 169 mohor
        end
2471 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2472 169 mohor
        begin
2473 181 mohor
          test_fail("Nvalid signal was set during write");
2474
          fail = fail + 1;
2475
        end
2476
      end
2477
 
2478
      // wait for Busy to become inactive
2479
      i1 = 0;
2480
      while (i1 <= 2)
2481
      begin
2482
        // wait for next positive clock edge
2483
        @(posedge Mdc_O);
2484
        // read data from MII status register - Busy and Nvalid bits
2485 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2486 181 mohor
 
2487
        // check MII IO signal and Busy and Nvalid bits
2488
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2489
        begin
2490
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2491
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2492 169 mohor
          begin
2493 181 mohor
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2494 169 mohor
            fail = fail + 1;
2495
          end
2496 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2497
          begin
2498
            test_fail("Nvalid signal was set during write");
2499
            fail = fail + 1;
2500
          end
2501 169 mohor
        end
2502 181 mohor
        else // wait for Busy bit to be set to '0'
2503 169 mohor
        begin
2504 181 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2505
          begin
2506
            i1 = 3; // end of Busy checking
2507
          end
2508
          else
2509
          begin
2510
            if (i1 == 2)
2511
            begin
2512
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2513
              fail = fail + 1;
2514
            end
2515
            #Tp i1 = i1 + 1;
2516
          end
2517
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2518
          begin
2519
            test_fail("Nvalid signal was set after write");
2520
            fail = fail + 1;
2521
          end
2522 169 mohor
        end
2523
      end
2524
    end
2525 181 mohor
    // set PHY to normal mode
2526
    #Tp eth_phy.preamble_suppresed(0);
2527
    // MII mode register
2528
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2529
    if(fail == 0)
2530
      test_ok;
2531
    else
2532
      fail = 0;
2533 116 mohor
  end
2534
 
2535
 
2536 181 mohor
  ////////////////////////////////////////////////////////////////////
2537
  ////                                                            ////
2538
  ////  Test busy and nvalid status durations during write (with  ////
2539
  ////  and without preamble)                                     ////
2540
  ////                                                            ////
2541
  ////////////////////////////////////////////////////////////////////
2542
  if (test_num == 12) // 
2543 169 mohor
  begin
2544 194 tadej
    // TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
2545
    test_name   = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
2546
    `TIME; $display("  TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
2547 181 mohor
 
2548
    reset_mii; // reset MII
2549
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2550
    #Tp eth_phy.link_up_down(1);
2551
    // set the MII
2552
    clk_div = 64;
2553
    mii_set_clk_div(clk_div[7:0]);
2554
    // set address
2555
    reg_addr = 5'h1; // status register
2556
    phy_addr = 5'h1; // correct PHY address
2557
 
2558
    for (i = 0; i <= 1; i = i + 1)
2559 169 mohor
    begin
2560 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2561
      // MII mode register
2562
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2563
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2564 169 mohor
      @(posedge Mdc_O);
2565 181 mohor
      // read request
2566
      #Tp mii_read_req(phy_addr, reg_addr);
2567 169 mohor
      // read data from MII status register - Busy and Nvalid bits
2568 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2569 181 mohor
 
2570 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2571
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2572
      begin
2573 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2574 169 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2575
        begin
2576 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2577 169 mohor
          fail = fail + 1;
2578
        end
2579
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2580
        begin
2581
          test_fail("Nvalid signal was set during read");
2582
          fail = fail + 1;
2583
        end
2584
      end
2585 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2586 169 mohor
      begin
2587
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2588
        begin
2589 181 mohor
          test_fail("Busy signal should be set after read, due to reads from MII status register");
2590
          fail = fail + 1;
2591 169 mohor
        end
2592
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2593
        begin
2594 181 mohor
          test_fail("Nvalid signal was set during read");
2595 169 mohor
          fail = fail + 1;
2596
        end
2597
      end
2598 181 mohor
 
2599
      // wait for serial bus to become active
2600
      wait(Mdio_IO !== 1'bz);
2601
      // count transfer bits
2602
      if (i)
2603 169 mohor
      begin
2604 181 mohor
        repeat(31) @(posedge Mdc_O);
2605 169 mohor
      end
2606 181 mohor
      else
2607 169 mohor
      begin
2608 181 mohor
        repeat(63) @(posedge Mdc_O);
2609 169 mohor
      end
2610 181 mohor
      // wait for next negative clock edge
2611
      @(negedge Mdc_O);
2612
      // read data from MII status register - Busy and Nvalid bits
2613 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2614 181 mohor
 
2615
      // check MII IO signal and Busy and Nvalid bits
2616
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2617 169 mohor
      begin
2618 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2619
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2620
        begin
2621
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2622
          fail = fail + 1;
2623
        end
2624
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2625
        begin
2626
          test_fail("Nvalid signal was set during read");
2627
          fail = fail + 1;
2628
        end
2629 169 mohor
      end
2630 181 mohor
      else // Busy bit should still be set to '1'
2631 169 mohor
      begin
2632 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2633
        begin
2634
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2635
          fail = fail + 1;
2636
        end
2637
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2638
        begin
2639
          test_fail("Nvalid signal was set during read");
2640
          fail = fail + 1;
2641
        end
2642 169 mohor
      end
2643 181 mohor
 
2644 169 mohor
      // wait for next positive clock edge
2645
      @(posedge Mdc_O);
2646
      // read data from MII status register - Busy and Nvalid bits
2647 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2648 181 mohor
 
2649 169 mohor
      // check MII IO signal and Busy and Nvalid bits
2650
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2651
      begin
2652
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2653 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2654 169 mohor
        begin
2655 181 mohor
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2656
          fail = fail + 1;
2657
        end
2658
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2659
        begin
2660
          test_fail("Nvalid signal was set during read");
2661
          fail = fail + 1;
2662
        end
2663
      end
2664
      else // Busy bit should still be set to '1'
2665
      begin
2666
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2667
        begin
2668
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2669
          fail = fail + 1;
2670
        end
2671
        if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2672
        begin
2673
          test_fail("Nvalid signal was set during read");
2674
          fail = fail + 1;
2675
        end
2676
      end
2677
 
2678
      // wait for Busy to become inactive
2679
      i1 = 0;
2680
      while (i1 <= 2)
2681
      begin
2682
        // wait for next positive clock edge
2683
        @(posedge Mdc_O);
2684
        // read data from MII status register - Busy and Nvalid bits
2685 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2686 181 mohor
 
2687
        // check MII IO signal and Busy and Nvalid bits
2688
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2689
        begin
2690
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2691 169 mohor
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2692
          begin
2693
            test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2694
            fail = fail + 1;
2695
          end
2696 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2697 169 mohor
          begin
2698 181 mohor
            test_fail("Nvalid signal was set during read");
2699 169 mohor
            fail = fail + 1;
2700
          end
2701
        end
2702 181 mohor
        else // wait for Busy bit to be set to '0'
2703 169 mohor
        begin
2704
          if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2705
          begin
2706
            i1 = 3; // end of Busy checking
2707
          end
2708
          else
2709
          begin
2710
            if (i1 == 2)
2711
            begin
2712
              test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2713
              fail = fail + 1;
2714
            end
2715
            #Tp i1 = i1 + 1;
2716
          end
2717 181 mohor
          if (phy_data[`ETH_MIISTATUS_NVALID] !== 1'b0)
2718 169 mohor
          begin
2719 181 mohor
            test_fail("Nvalid signal was set after read");
2720 169 mohor
            fail = fail + 1;
2721
          end
2722
        end
2723
      end
2724
    end
2725 181 mohor
    // set PHY to normal mode
2726
    #Tp eth_phy.preamble_suppresed(0);
2727
    // MII mode register
2728
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2729
    if(fail == 0)
2730
      test_ok;
2731
    else
2732
      fail = 0;
2733 169 mohor
  end
2734
 
2735
 
2736 181 mohor
  ////////////////////////////////////////////////////////////////////
2737
  ////                                                            ////
2738
  ////  Test busy and nvalid status durations during scan (with   ////
2739
  ////  and without preamble)                                     ////
2740
  ////                                                            ////
2741
  ////////////////////////////////////////////////////////////////////
2742
  if (test_num == 13) // 
2743 169 mohor
  begin
2744 194 tadej
    // TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
2745
    test_name   = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
2746
    `TIME; $display("  TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
2747 181 mohor
 
2748
    reset_mii; // reset MII
2749
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2750
    #Tp eth_phy.link_up_down(1);
2751
    // set the MII
2752
    clk_div = 64;
2753
    mii_set_clk_div(clk_div[7:0]);
2754
    // set address
2755
    reg_addr = 5'h1; // status register
2756
    phy_addr = 5'h1; // correct PHY address
2757
 
2758
    for (i = 0; i <= 1; i = i + 1)
2759 169 mohor
    begin
2760 181 mohor
      #Tp eth_phy.preamble_suppresed(i);
2761
      // MII mode register
2762
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
2763
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2764
      @(posedge Mdc_O);
2765
      // scan request
2766
      #Tp mii_scan_req(phy_addr, reg_addr);
2767
      // read data from MII status register - Busy and Nvalid bits
2768 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2769 181 mohor
 
2770
      // check MII IO signal and Busy and Nvalid bits
2771
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2772 169 mohor
      begin
2773 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
2774
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2775
        begin
2776
          test_fail("Busy signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2777
          fail = fail + 1;
2778
        end
2779
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2780
        begin
2781
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z anymore - 1. read");
2782
          fail = fail + 1;
2783
        end
2784 169 mohor
      end
2785 181 mohor
      else // Busy bit should already be set to '1', due to reads from MII status register
2786 169 mohor
      begin
2787 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2788
        begin
2789
          test_fail("Busy signal should be set after scan, due to reads from MII status register");
2790
          fail = fail + 1;
2791
        end
2792
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2793
        begin
2794
          test_fail("Nvalid signal should be set after scan, due to reads from MII status register");
2795
          fail = fail + 1;
2796
        end
2797 169 mohor
      end
2798 181 mohor
 
2799
      // wait for serial bus to become active
2800 169 mohor
      wait(Mdio_IO !== 1'bz);
2801 181 mohor
      // count transfer bits
2802
      if (i)
2803 169 mohor
      begin
2804 181 mohor
        repeat(21) @(posedge Mdc_O);
2805 169 mohor
      end
2806 181 mohor
      else
2807 169 mohor
      begin
2808 181 mohor
        repeat(53) @(posedge Mdc_O);
2809 169 mohor
      end
2810 181 mohor
      // stop scan
2811
      #Tp mii_scan_finish; // finish scan operation
2812
 
2813
      // wait for next positive clock edge
2814
      repeat(10) @(posedge Mdc_O);
2815
      // read data from MII status register - Busy and Nvalid bits
2816 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2817 181 mohor
 
2818
      // check MII IO signal and Busy and Nvalid bits
2819
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2820 169 mohor
      begin
2821 181 mohor
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2822
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2823 169 mohor
        begin
2824 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2825 169 mohor
          fail = fail + 1;
2826
        end
2827 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2828 169 mohor
      end
2829 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2830 169 mohor
      begin
2831 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2832 169 mohor
        begin
2833 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2834 169 mohor
          fail = fail + 1;
2835
        end
2836 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2837 169 mohor
        begin
2838 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2839 169 mohor
          fail = fail + 1;
2840
        end
2841 181 mohor
      end
2842
 
2843
      // wait for next negative clock edge
2844
      @(negedge Mdc_O);
2845
      // read data from MII status register - Busy and Nvalid bits
2846 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2847 181 mohor
 
2848
      // check MII IO signal and Busy and Nvalid bits
2849
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
2850
      begin
2851
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
2852
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2853 169 mohor
        begin
2854 181 mohor
          test_fail("Busy signal should be set while MII IO signal is not active anymore");
2855
          fail = fail + 1;
2856 169 mohor
        end
2857 181 mohor
        // Nvalid signal can be cleared here - it is still Testbench error
2858 169 mohor
      end
2859 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit should still be set to '1'
2860 169 mohor
      begin
2861 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2862 169 mohor
        begin
2863 181 mohor
          test_fail("Busy signal should be set while MII IO signal not HIGH Z");
2864
          fail = fail + 1;
2865 169 mohor
        end
2866 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2867 169 mohor
        begin
2868 181 mohor
          test_fail("Nvalid signal should be set while MII IO signal not HIGH Z");
2869
          fail = fail + 1;
2870 169 mohor
        end
2871
      end
2872 181 mohor
 
2873
      // wait for next negative clock edge
2874
      @(posedge Mdc_O);
2875
      // read data from MII status register - Busy and Nvalid bits
2876 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2877 181 mohor
 
2878
      // check MII IO signal and Busy and Nvalid bits
2879
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2880 169 mohor
      begin
2881 181 mohor
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2882
        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 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2888 169 mohor
        begin
2889 181 mohor
          test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2890 169 mohor
          fail = fail + 1;
2891
        end
2892
      end
2893 181 mohor
      else // Busy bit should still be set to '1', Nvalid bit can be set to '0'
2894 169 mohor
      begin
2895 181 mohor
        if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2896 169 mohor
        begin
2897 181 mohor
          test_fail("Busy signal should be set after MII IO signal become HIGH Z");
2898
          fail = fail + 1;
2899 169 mohor
        end
2900 181 mohor
        if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2901 169 mohor
        begin
2902 181 mohor
          i2 = 1; // check finished
2903 169 mohor
        end
2904 181 mohor
        else
2905 169 mohor
        begin
2906 181 mohor
          i2 = 0; // check must continue
2907 169 mohor
        end
2908
      end
2909 181 mohor
 
2910
      // wait for Busy to become inactive
2911
      i1 = 0;
2912
      while ((i1 <= 2) || (i2 == 0))
2913
      begin
2914
        // wait for next positive clock edge
2915
        @(posedge Mdc_O);
2916
        // read data from MII status register - Busy and Nvalid bits
2917 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2918 181 mohor
 
2919
        // check MII IO signal and Busy and Nvalid bits
2920
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
2921 169 mohor
        begin
2922 181 mohor
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
2923
          if (i1 <= 2)
2924 169 mohor
          begin
2925 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2926 169 mohor
            begin
2927 181 mohor
              test_fail("Busy signal was not set while MII IO signal is not HIGH Z");
2928 169 mohor
              fail = fail + 1;
2929
            end
2930
          end
2931 181 mohor
          if (i2 == 0)
2932 169 mohor
          begin
2933 181 mohor
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2934 169 mohor
            begin
2935 181 mohor
              test_fail("Nvalid signal was not set while MII IO signal is not HIGH Z");
2936 169 mohor
              fail = fail + 1;
2937
            end
2938
          end
2939
        end
2940 181 mohor
        else // wait for Busy bit to be set to '0'
2941 169 mohor
        begin
2942 181 mohor
          if (i1 <= 2)
2943 169 mohor
          begin
2944 181 mohor
            if (phy_data[`ETH_MIISTATUS_BUSY] === 1'b0)
2945 169 mohor
            begin
2946 181 mohor
              i1 = 3; // end of Busy checking
2947 169 mohor
            end
2948 181 mohor
            else
2949 169 mohor
            begin
2950 181 mohor
              if (i1 == 2)
2951 169 mohor
              begin
2952 181 mohor
                test_fail("Busy signal should be cleared after 2 periods after MII IO signal become HIGH Z");
2953 169 mohor
                fail = fail + 1;
2954
              end
2955 181 mohor
              #Tp i1 = i1 + 1;
2956 169 mohor
            end
2957 181 mohor
          end
2958
          if (i2 == 0)
2959
          begin
2960
            if (phy_data[`ETH_MIISTATUS_NVALID] === 1'b0)
2961 169 mohor
            begin
2962 181 mohor
              i2 = 1;
2963 169 mohor
            end
2964 181 mohor
            else
2965
            begin
2966
              test_fail("Nvalid signal should be cleared after MII IO signal become HIGH Z");
2967
              fail = fail + 1;
2968
            end
2969 169 mohor
          end
2970
        end
2971 181 mohor
      end
2972
    end
2973
    // set PHY to normal mode
2974
    #Tp eth_phy.preamble_suppresed(0);
2975
    // MII mode register
2976
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2977
    if(fail == 0)
2978
      test_ok;
2979
    else
2980
      fail = 0;
2981
  end
2982
 
2983
 
2984
  ////////////////////////////////////////////////////////////////////
2985
  ////                                                            ////
2986
  ////  Test scan status from phy with detecting link-fail bit    ////
2987
  ////  (with and without preamble)                               ////
2988
  ////                                                            ////
2989
  ////////////////////////////////////////////////////////////////////
2990
  if (test_num == 14) // 
2991
  begin
2992 194 tadej
    // TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
2993
    test_name   = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
2994
    `TIME; $display("  TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
2995 181 mohor
 
2996
    reset_mii; // reset MII
2997
    // set link up, if it wasn't due to previous tests, since there weren't PHY registers
2998
    #Tp eth_phy.link_up_down(1);
2999
    // set MII speed
3000
    clk_div = 6;
3001
    mii_set_clk_div(clk_div[7:0]);
3002
    // set address
3003
    reg_addr = 5'h1; // status register
3004
    phy_addr = 5'h1; // correct PHY address
3005
 
3006
    // read request
3007
    #Tp mii_read_req(phy_addr, reg_addr);
3008
    check_mii_busy; // wait for read to finish
3009
    // read data from PHY status register - remember LINK-UP status
3010 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3011 181 mohor
 
3012
    for (i = 0; i <= 1; i = i + 1)
3013
    begin
3014
      #Tp eth_phy.preamble_suppresed(i);
3015
      // MII mode register
3016
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
3017
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3018
      if (i)
3019
      begin
3020
        // change saved data when preamble is suppressed
3021
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3022
      end
3023
 
3024
      // scan request
3025
      #Tp mii_scan_req(phy_addr, reg_addr);
3026
      check_mii_scan_valid; // wait for scan to make first data valid
3027
 
3028 169 mohor
      fork
3029 181 mohor
      begin
3030 169 mohor
        repeat(2) @(posedge Mdc_O);
3031
        // read data from PHY status register
3032 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3033 181 mohor
        if (phy_data !== tmp_data)
3034 169 mohor
        begin
3035 181 mohor
          test_fail("Data was not correctly scaned from status register");
3036 169 mohor
          fail = fail + 1;
3037
        end
3038
        // read data from MII status register
3039 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3040 181 mohor
        if (phy_data[0] !== 1'b0)
3041 169 mohor
        begin
3042 181 mohor
          test_fail("Link FAIL bit was set in the MII status register");
3043 169 mohor
          fail = fail + 1;
3044
        end
3045
      end
3046
      begin
3047 181 mohor
      // Completely check second scan
3048 169 mohor
        #Tp cnt = 0;
3049
        // wait for serial bus to become active - second scan
3050
        wait(Mdio_IO !== 1'bz);
3051
        // count transfer length
3052 181 mohor
        while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3053 169 mohor
        begin
3054
          @(posedge Mdc_O);
3055
          #Tp cnt = cnt + 1;
3056
        end
3057
        // check transfer length
3058 181 mohor
        if (i) // without preamble
3059 169 mohor
        begin
3060
          if (cnt != 33) // at this value Mdio_IO is HIGH Z
3061
          begin
3062 181 mohor
            test_fail("Second scan request did not proceed correctly");
3063 169 mohor
            fail = fail + 1;
3064
          end
3065
        end
3066
        else // with preamble
3067
        begin
3068
          if (cnt != 65) // at this value Mdio_IO is HIGH Z
3069
          begin
3070 181 mohor
            test_fail("Second scan request did not proceed correctly");
3071 169 mohor
            fail = fail + 1;
3072
          end
3073
        end
3074
      end
3075
      join
3076 181 mohor
      // check third to fifth scans
3077
      for (i3 = 0; i3 <= 2; i3 = i3 + 1)
3078
      begin
3079
        fork
3080 169 mohor
        begin
3081
          repeat(2) @(posedge Mdc_O);
3082
          // read data from PHY status register
3083 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3084 181 mohor
          if (phy_data !== tmp_data)
3085 169 mohor
          begin
3086 181 mohor
            test_fail("Data was not correctly scaned from status register");
3087
            fail = fail + 1;
3088 169 mohor
          end
3089
          // read data from MII status register
3090 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3091 181 mohor
          if (phy_data[0] !== 1'b0)
3092 169 mohor
          begin
3093 181 mohor
            test_fail("Link FAIL bit was set in the MII status register");
3094
            fail = fail + 1;
3095 169 mohor
          end
3096 181 mohor
          if (i3 == 2) // after fourth scan read
3097 169 mohor
          begin
3098 181 mohor
            @(posedge Mdc_O);
3099
            // change saved data
3100
            #Tp tmp_data = tmp_data & 16'hFFFB; // put bit 3 to ZERO
3101
            // set link down
3102
            #Tp eth_phy.link_up_down(0);
3103 169 mohor
          end
3104
        end
3105
        begin
3106 181 mohor
        // Completely check scans
3107
          #Tp cnt = 0;
3108
          // wait for serial bus to become active - second scan
3109
          wait(Mdio_IO !== 1'bz);
3110
          // count transfer length
3111
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i == 0)) || ((cnt == 15) && (i == 1)) )
3112 169 mohor
          begin
3113 181 mohor
            @(posedge Mdc_O);
3114
            #Tp cnt = cnt + 1;
3115
          end
3116
          // check transfer length
3117
          if (i) // without preamble
3118
          begin
3119
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3120 169 mohor
            begin
3121 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3122
              fail = fail + 1;
3123 169 mohor
            end
3124 181 mohor
          end
3125
          else // with preamble
3126
          begin
3127
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3128 169 mohor
            begin
3129 181 mohor
              test_fail("Fifth scan request did not proceed correctly");
3130
              fail = fail + 1;
3131 169 mohor
            end
3132
          end
3133
        end
3134 181 mohor
        join
3135
      end
3136
 
3137
      fork
3138
      begin
3139
        repeat(2) @(posedge Mdc_O);
3140
        // read data from PHY status register
3141 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3142 181 mohor
        if (phy_data !== tmp_data)
3143
        begin
3144
          test_fail("Data was not correctly scaned from status register");
3145
          fail = fail + 1;
3146
        end
3147
        // read data from MII status register
3148 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3149 181 mohor
        if (phy_data[0] === 1'b0)
3150
        begin
3151
          test_fail("Link FAIL bit was not set in the MII status register");
3152
          fail = fail + 1;
3153
        end
3154
        // wait to see if data stayed latched
3155
        repeat(4) @(posedge Mdc_O);
3156
        // read data from PHY status register
3157 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3158 181 mohor
        if (phy_data !== tmp_data)
3159
        begin
3160
          test_fail("Data was not latched correctly in status register");
3161
          fail = fail + 1;
3162
        end
3163
        // read data from MII status register
3164 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3165 181 mohor
        if (phy_data[0] === 1'b0)
3166
        begin
3167
          test_fail("Link FAIL bit was not set in the MII status register");
3168
          fail = fail + 1;
3169
        end
3170
        // change saved data
3171
        #Tp tmp_data = tmp_data | 16'h0004; // put bit 2 to ONE
3172
        // set link up
3173
        #Tp eth_phy.link_up_down(1);
3174
      end
3175
      begin
3176
      // Wait for sixth scan
3177
        // wait for serial bus to become active - sixth scan
3178
        wait(Mdio_IO !== 1'bz);
3179
        // wait for serial bus to become inactive - turn-around cycle in sixth scan
3180
        wait(Mdio_IO === 1'bz);
3181
        // wait for serial bus to become active - end of turn-around cycle in sixth scan
3182
        wait(Mdio_IO !== 1'bz);
3183
        // wait for serial bus to become inactive - end of sixth scan
3184
        wait(Mdio_IO === 1'bz);
3185
      end
3186 169 mohor
      join
3187 181 mohor
 
3188
      @(posedge Mdc_O);
3189 169 mohor
      // read data from PHY status register
3190 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3191 169 mohor
      if (phy_data !== tmp_data)
3192
      begin
3193 181 mohor
        test_fail("Data was not correctly scaned from status register");
3194 169 mohor
        fail = fail + 1;
3195
      end
3196
      // read data from MII status register
3197 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3198 169 mohor
      if (phy_data[0] !== 1'b0)
3199
      begin
3200
        test_fail("Link FAIL bit was set in the MII status register");
3201
        fail = fail + 1;
3202
      end
3203 181 mohor
      // wait to see if data stayed latched
3204
      repeat(4) @(posedge Mdc_O);
3205
      // read data from PHY status register
3206 274 tadejm
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3207 181 mohor
      if (phy_data !== tmp_data)
3208 169 mohor
      begin
3209 181 mohor
        test_fail("Data was not correctly scaned from status register");
3210
        fail = fail + 1;
3211 169 mohor
      end
3212 181 mohor
      // read data from MII status register
3213 274 tadejm
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3214 181 mohor
      if (phy_data[0] !== 1'b0)
3215 169 mohor
      begin
3216 181 mohor
        test_fail("Link FAIL bit was set in the MII status register");
3217
        fail = fail + 1;
3218 169 mohor
      end
3219 181 mohor
 
3220
      // STOP SCAN
3221
      #Tp mii_scan_finish; // finish scan operation
3222
      #Tp check_mii_busy; // wait for scan to finish
3223 169 mohor
    end
3224 181 mohor
    // set PHY to normal mode
3225
    #Tp eth_phy.preamble_suppresed(0);
3226
    // MII mode register
3227
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3228
    if(fail == 0)
3229
      test_ok;
3230
    else
3231
      fail = 0;
3232 169 mohor
  end
3233
 
3234
 
3235 181 mohor
  ////////////////////////////////////////////////////////////////////
3236
  ////                                                            ////
3237
  ////  Test scan status from phy with sliding link-fail bit      ////
3238
  ////  (with and without preamble)                               ////
3239
  ////                                                            ////
3240
  ////////////////////////////////////////////////////////////////////
3241
  if (test_num == 15) // 
3242 169 mohor
  begin
3243 194 tadej
    // TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
3244
    test_name   = "TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
3245
    `TIME; $display("  TEST 15: SCAN STATUS FROM PHY WITH SLIDING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
3246 181 mohor
 
3247
    // set address
3248
    reg_addr = 5'h1; // status register
3249
    phy_addr = 5'h1; // correct PHY address
3250
 
3251
    // read request
3252
    #Tp mii_read_req(phy_addr, reg_addr);
3253
    check_mii_busy; // wait for read to finish
3254
    // read data from PHY status register - remember LINK-UP status
3255 274 tadejm
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3256 181 mohor
 
3257
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3258 169 mohor
    begin
3259 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3260
      // MII mode register
3261
      #Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3262
                    wbm_subseq_waits);
3263
      if (i2)
3264 169 mohor
      begin
3265 181 mohor
        // change saved data when preamble is suppressed
3266
        #Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
3267
      end
3268
 
3269
      i = 0;
3270
      while (i < 80) // delay for sliding of LinkFail bit
3271
      begin
3272
        // first there are two scans
3273
        #Tp cnt = 0;
3274 169 mohor
        // scan request
3275
        #Tp mii_scan_req(phy_addr, reg_addr);
3276 181 mohor
        #Tp check_mii_scan_valid; // wait for scan to make first data valid
3277
 
3278
        // check second scan
3279 169 mohor
        fork
3280 181 mohor
        begin
3281
          repeat(4) @(posedge Mdc_O);
3282
          // read data from PHY status register
3283 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3284 181 mohor
          if (phy_data !== tmp_data)
3285 169 mohor
          begin
3286 181 mohor
            test_fail("Second data was not correctly scaned from status register");
3287
            fail = fail + 1;
3288 169 mohor
          end
3289 181 mohor
          // read data from MII status register
3290 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3291 181 mohor
          if (phy_data[0] !== 1'b0)
3292
          begin
3293
            test_fail("Link FAIL bit was set in the MII status register");
3294
            fail = fail + 1;
3295
          end
3296
        end
3297
        begin
3298
        // Completely check scan
3299
          #Tp cnt = 0;
3300
          // wait for serial bus to become active - second scan
3301
          wait(Mdio_IO !== 1'bz);
3302
          // count transfer length
3303
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3304
          begin
3305
            @(posedge Mdc_O);
3306
            #Tp cnt = cnt + 1;
3307
          end
3308
          // check transfer length
3309
          if (i2) // without preamble
3310
          begin
3311
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3312 169 mohor
            begin
3313 181 mohor
              test_fail("Second scan request did not proceed correctly");
3314
              fail = fail + 1;
3315 169 mohor
            end
3316 181 mohor
          end
3317
          else // with preamble
3318
          begin
3319
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3320
            begin
3321
              test_fail("Second scan request did not proceed correctly");
3322
              fail = fail + 1;
3323
            end
3324
          end
3325
        end
3326
        join
3327
        // reset counter 
3328
        #Tp cnt = 0;
3329
        // SLIDING LINK DOWN and CHECK
3330
        fork
3331
          begin
3332
          // set link down
3333
            repeat(i) @(posedge Mdc_O);
3334
            // set link down
3335
            #Tp eth_phy.link_up_down(0);
3336
          end
3337
          begin
3338
          // check data in MII registers after each scan in this fork statement
3339 169 mohor
            if (i2) // without preamble
3340 181 mohor
              wait (cnt == 32);
3341
            else // with preamble
3342
              wait (cnt == 64);
3343
            repeat(3) @(posedge Mdc_O);
3344
            // read data from PHY status register
3345 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3346 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3347 169 mohor
            begin
3348 181 mohor
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3349 169 mohor
              begin
3350 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3351 169 mohor
                fail = fail + 1;
3352
              end
3353
            end
3354 181 mohor
            else
3355 169 mohor
            begin
3356 181 mohor
              if (phy_data !== tmp_data)
3357 169 mohor
              begin
3358 181 mohor
                test_fail("Third data was not correctly scaned from status register");
3359 169 mohor
                fail = fail + 1;
3360
              end
3361
            end
3362 181 mohor
            // read data from MII status register
3363 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3364 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3365 169 mohor
            begin
3366 181 mohor
              if (phy_data[0] === 1'b0)
3367
              begin
3368
                test_fail("Link FAIL bit was not set in the MII status register");
3369
                fail = fail + 1;
3370
              end
3371 169 mohor
            end
3372 181 mohor
            else
3373 169 mohor
            begin
3374 181 mohor
              if (phy_data[0] !== 1'b0)
3375 169 mohor
              begin
3376 181 mohor
                test_fail("Link FAIL bit was set in the MII status register");
3377 169 mohor
                fail = fail + 1;
3378
              end
3379
            end
3380 181 mohor
          end
3381
          begin
3382
          // check length
3383
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3384 169 mohor
            begin
3385 181 mohor
              #Tp cnt = 0;
3386
              // wait for serial bus to become active if there is more than one scan
3387
              wait(Mdio_IO !== 1'bz);
3388
              // count transfer length
3389
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3390 169 mohor
              begin
3391 181 mohor
                @(posedge Mdc_O);
3392
                #Tp cnt = cnt + 1;
3393 169 mohor
              end
3394 181 mohor
              // check transfer length
3395
              if (i2) // without preamble
3396
              begin
3397
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3398
                begin
3399
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3400
                  fail = fail + 1;
3401
                end
3402
              end
3403
              else // with preamble
3404
              begin
3405
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3406
                begin
3407
                  test_fail("3. or 4. scan request did not proceed correctly, while SCAN STOP was written");
3408
                  fail = fail + 1;
3409
                end
3410
              end
3411 169 mohor
            end
3412
          end
3413
        join
3414 181 mohor
        // reset counter
3415
        #Tp cnt = 0;
3416
        // check fifth scan and data from fourth scan
3417
        fork
3418 169 mohor
        begin
3419 181 mohor
          repeat(2) @(posedge Mdc_O);
3420
          // read data from PHY status register
3421 274 tadejm
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3422 181 mohor
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3423 169 mohor
          begin
3424 181 mohor
            test_fail("4. data was not correctly scaned from status register");
3425
            fail = fail + 1;
3426 169 mohor
          end
3427 181 mohor
          // read data from MII status register
3428 274 tadejm
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3429 181 mohor
          if (phy_data[0] === 1'b0)
3430 169 mohor
          begin
3431 181 mohor
            test_fail("Link FAIL bit was not set in the MII status register");
3432 169 mohor
            fail = fail + 1;
3433
          end
3434
        end
3435
        begin
3436 181 mohor
        // Completely check intermediate scan
3437
          #Tp cnt = 0;
3438
          // wait for serial bus to become active - second scan
3439 169 mohor
          wait(Mdio_IO !== 1'bz);
3440
          // count transfer length
3441
          while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3442
          begin
3443
            @(posedge Mdc_O);
3444
            #Tp cnt = cnt + 1;
3445
          end
3446 181 mohor
          // check transfer length
3447
          if (i2) // without preamble
3448 169 mohor
          begin
3449 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3450
            begin
3451
              test_fail("Fifth scan request did not proceed correctly");
3452
              fail = fail + 1;
3453
            end
3454 169 mohor
          end
3455 181 mohor
          else // with preamble
3456
          begin
3457
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3458
            begin
3459
              test_fail("Fifth scan request did not proceed correctly");
3460
              fail = fail + 1;
3461
            end
3462
          end
3463 169 mohor
        end
3464 181 mohor
        join
3465
        // reset counter 
3466
        #Tp cnt = 0;
3467
        // SLIDING LINK UP and CHECK
3468
        fork
3469 169 mohor
          begin
3470 181 mohor
          // set link up
3471
            repeat(i) @(posedge Mdc_O);
3472
            // set link up
3473
            #Tp eth_phy.link_up_down(1);
3474 169 mohor
          end
3475 181 mohor
          begin
3476
          // check data in MII registers after each scan in this fork statement
3477
            repeat(2) @(posedge Mdc_O);
3478
            if (i2) // without preamble
3479
              wait (cnt == 32);
3480
            else // with preamble
3481
              wait (cnt == 64);
3482
            repeat(3) @(posedge Mdc_O);
3483
            // read data from PHY status register
3484 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3485 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3486
            begin
3487
              if (phy_data !== tmp_data)
3488
              begin
3489
                test_fail("6. data was not correctly scaned from status register");
3490
                fail = fail + 1;
3491
              end
3492
            end
3493
            else
3494
            begin
3495
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
3496
              begin
3497
                test_fail("6. data was not correctly scaned from status register");
3498
                fail = fail + 1;
3499
              end
3500
            end
3501
            // read data from MII status register
3502 274 tadejm
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3503 181 mohor
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
3504
            begin
3505
              if (phy_data[0] !== 1'b0)
3506
              begin
3507
                test_fail("Link FAIL bit was set in the MII status register");
3508
                fail = fail + 1;
3509
              end
3510
            end
3511
            else
3512
            begin
3513
              if (phy_data[0] === 1'b0)
3514
              begin
3515
                test_fail("Link FAIL bit was not set in the MII status register");
3516
                fail = fail + 1;
3517
              end
3518
            end
3519
          end
3520
          begin
3521
          // check length
3522
            for (i3 = 0; i3 <= 1; i3 = i3 + 1) // two scans
3523
            begin
3524
              #Tp cnt = 0;
3525
              // wait for serial bus to become active if there is more than one scan
3526
              wait(Mdio_IO !== 1'bz);
3527
              // count transfer length
3528
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3529
              begin
3530
                @(posedge Mdc_O);
3531
                #Tp cnt = cnt + 1;
3532
              end
3533
              // check transfer length
3534
              if (i2) // without preamble
3535
              begin
3536
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3537
                begin
3538
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3539
                  fail = fail + 1;
3540
                end
3541
              end
3542
              else // with preamble
3543
              begin
3544
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3545
                begin
3546
                  test_fail("Scan request did not proceed correctly, while SCAN STOP was written");
3547
                  fail = fail + 1;
3548
                end
3549
              end
3550
            end
3551
          end
3552
        join
3553
        // check last scan 
3554
        repeat(4) @(posedge Mdc_O);
3555
        // read data from PHY status register
3556 274 tadejm
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3557 181 mohor
        if (phy_data !== tmp_data)
3558
        begin
3559
          test_fail("7. data was not correctly scaned from status register");
3560
          fail = fail + 1;
3561 169 mohor
        end
3562 181 mohor
        // read data from MII status register
3563 274 tadejm
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3564 181 mohor
        if (phy_data[0] !== 1'b0)
3565
        begin
3566
          test_fail("Link FAIL bit was set in the MII status register");
3567
          fail = fail + 1;
3568
        end
3569
 
3570
        #Tp mii_scan_finish; // finish scan operation
3571
        #Tp check_mii_busy; // wait for scan to finish
3572
        #Tp;
3573
        // set delay of writing the command
3574
        if (i2) // without preamble
3575
        begin
3576
          case(i)
3577
            0,  1,  2,  3,  4:  i = i + 1;
3578
            13, 14, 15, 16, 17,
3579
            18, 19, 20, 21, 22,
3580
            23, 24, 25, 26, 27,
3581
            28, 29, 30, 31, 32,
3582
            33, 34, 35:         i = i + 1;
3583
            36:                 i = 80;
3584
            default:            i = 13;
3585
          endcase
3586
        end
3587 169 mohor
        else // with preamble
3588
        begin
3589 181 mohor
          case(i)
3590
            0,  1,  2,  3,  4:  i = i + 1;
3591
            45, 46, 47, 48, 49,
3592
            50, 51, 52, 53, 54,
3593
            55, 56, 57, 58, 59,
3594
            60, 61, 62, 63, 64,
3595
            65, 66, 67:         i = i + 1;
3596
            68:                 i = 80;
3597
            default:            i = 45;
3598
          endcase
3599 169 mohor
        end
3600 181 mohor
        @(posedge wb_clk);
3601
        #Tp;
3602 169 mohor
      end
3603
    end
3604 181 mohor
    // set PHY to normal mode
3605
    #Tp eth_phy.preamble_suppresed(0);
3606
    // MII mode register
3607
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3608
    if(fail == 0)
3609
      test_ok;
3610
    else
3611
      fail = 0;
3612 169 mohor
  end
3613
 
3614
 
3615 181 mohor
  ////////////////////////////////////////////////////////////////////
3616
  ////                                                            ////
3617
  ////  Test sliding stop scan command immediately after scan     ////
3618
  ////  request (with and without preamble)                       ////
3619
  ////                                                            ////
3620
  ////////////////////////////////////////////////////////////////////
3621
  if (test_num == 16) // 
3622 116 mohor
  begin
3623 194 tadej
    // TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )
3624
    test_name = "TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )";
3625 181 mohor
    `TIME;
3626 194 tadej
    $display("  TEST 16: SLIDING STOP SCAN COMMAND IMMEDIATELY AFTER SCAN REQUEST ( WITH AND WITHOUT PREAMBLE )");
3627 181 mohor
 
3628
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3629 169 mohor
    begin
3630 181 mohor
      #Tp eth_phy.preamble_suppresed(i2);
3631
      // MII mode register
3632
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3633
                wbm_subseq_waits);
3634
      i = 0;
3635
      cnt = 0;
3636
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3637 169 mohor
      begin
3638 181 mohor
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3639 169 mohor
        begin
3640 181 mohor
          // set address
3641
          reg_addr = 5'h0; // control register
3642
          phy_addr = 5'h1; // correct PHY address
3643
          cnt = 0;
3644
          // scan request
3645
          #Tp mii_scan_req(phy_addr, reg_addr);
3646
          fork
3647
            begin
3648
              repeat(i) @(posedge Mdc_O);
3649
              // write command 0x0 into MII command register
3650
              // MII command written while scan in progress
3651
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3652
              @(posedge wb_clk);
3653
              #Tp check_mii_busy; // wait for scan to finish
3654
              @(posedge wb_clk);
3655
              disable check;
3656
            end
3657
            begin: check
3658
              // wait for serial bus to become active
3659
              wait(Mdio_IO !== 1'bz);
3660
              // count transfer length
3661
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3662
              begin
3663
                @(posedge Mdc_O);
3664
                #Tp cnt = cnt + 1;
3665
              end
3666
              // check transfer length
3667
              if (i2) // without preamble
3668
              begin
3669
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3670
                begin
3671
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3672
                  fail = fail + 1;
3673
                end
3674
              end
3675
              else // with preamble
3676
              begin
3677
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3678
                begin
3679
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3680
                  fail = fail + 1;
3681
                end
3682
              end
3683
              cnt = 0;
3684
              // wait for serial bus to become active if there is more than one scan
3685
              wait(Mdio_IO !== 1'bz);
3686
              // count transfer length
3687
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3688
              begin
3689
                @(posedge Mdc_O);
3690
                #Tp cnt = cnt + 1;
3691
              end
3692
              // check transfer length
3693
              if (i2) // without preamble
3694
              begin
3695
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3696
                begin
3697
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3698
                  fail = fail + 1;
3699
                end
3700
              end
3701
              else // with preamble
3702
              begin
3703
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3704
                begin
3705
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3706
                  fail = fail + 1;
3707
                end
3708
              end
3709
            end
3710
          join
3711
          // check the BUSY signal to see if the bus is still IDLE
3712
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3713
            check_mii_busy; // wait for bus to become idle
3714
 
3715
          // try normal write or read after scan was finished
3716
          phy_data = {8'h7D, (i[7:0] + 1)};
3717
          cnt = 0;
3718
          if (i3 == 0) // write after scan
3719 169 mohor
          begin
3720 181 mohor
            // write request
3721
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3722
            // wait for serial bus to become active
3723
            wait(Mdio_IO !== 1'bz);
3724
            // count transfer length
3725
            while(Mdio_IO !== 1'bz)
3726
            begin
3727
              @(posedge Mdc_O);
3728
              #Tp cnt = cnt + 1;
3729
            end
3730 169 mohor
            @(posedge Mdc_O);
3731 181 mohor
            // read request
3732
            #Tp mii_read_req(phy_addr, reg_addr);
3733
            check_mii_busy; // wait for read to finish
3734
            // read and check data
3735 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3736 181 mohor
            if (phy_data !== tmp_data)
3737 169 mohor
            begin
3738 181 mohor
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3739 169 mohor
              fail = fail + 1;
3740
            end
3741
          end
3742 181 mohor
          else // read after scan
3743 169 mohor
          begin
3744 181 mohor
            // read request
3745
            #Tp mii_read_req(phy_addr, reg_addr);
3746
            // wait for serial bus to become active
3747
            wait(Mdio_IO !== 1'bz);
3748
            // count transfer length
3749
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3750 169 mohor
            begin
3751 181 mohor
              @(posedge Mdc_O);
3752
              #Tp cnt = cnt + 1;
3753
            end
3754
            @(posedge Mdc_O);
3755
            check_mii_busy; // wait for read to finish
3756
            // read and check data
3757 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3758 181 mohor
            if (phy_data !== tmp_data)
3759
            begin
3760
              test_fail("Data was not correctly written into OR read from PHY register - control register");
3761 169 mohor
              fail = fail + 1;
3762
            end
3763
          end
3764 181 mohor
          // check if transfer was a proper length
3765 169 mohor
          if (i2) // without preamble
3766
          begin
3767
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
3768
            begin
3769 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3770 169 mohor
              fail = fail + 1;
3771
            end
3772
          end
3773
          else // with preamble
3774
          begin
3775
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
3776
            begin
3777 181 mohor
              test_fail("New request did not proceed correctly, after scan request");
3778 169 mohor
              fail = fail + 1;
3779
            end
3780
          end
3781
        end
3782 181 mohor
        #Tp;
3783
        // set delay of writing the command
3784
        if (i2) // without preamble
3785
        begin
3786
          case(i)
3787
            0, 1:               i = i + 1;
3788
            18, 19, 20, 21, 22,
3789
            23, 24, 25, 26, 27,
3790
            28, 29, 30, 31, 32,
3791
            33, 34, 35:         i = i + 1;
3792
            36:                 i = 80;
3793
            default:            i = 18;
3794
          endcase
3795
        end
3796
        else // with preamble
3797
        begin
3798
          case(i)
3799
            0, 1:               i = i + 1;
3800
            50, 51, 52, 53, 54,
3801
            55, 56, 57, 58, 59,
3802
            60, 61, 62, 63, 64,
3803
            65, 66, 67:         i = i + 1;
3804
            68:                 i = 80;
3805
            default:            i = 50;
3806
          endcase
3807
        end
3808
        @(posedge wb_clk);
3809
      end
3810
    end
3811
    // set PHY to normal mode
3812
    #Tp eth_phy.preamble_suppresed(0);
3813
    // MII mode register
3814
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3815
    if(fail == 0)
3816
      test_ok;
3817
    else
3818
      fail = 0;
3819
  end
3820 169 mohor
 
3821 181 mohor
 
3822
  ////////////////////////////////////////////////////////////////////
3823
  ////                                                            ////
3824
  ////  Test sliding stop scan command after 2. scan (with and    ////
3825
  ////  without preamble)                                         ////
3826
  ////                                                            ////
3827
  ////////////////////////////////////////////////////////////////////
3828
  if (test_num == 17) // 
3829
  begin
3830 194 tadej
    // TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )
3831
    test_name = "TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )";
3832
    `TIME; $display("  TEST 17: SLIDING STOP SCAN COMMAND AFTER 2. SCAN ( WITH AND WITHOUT PREAMBLE )");
3833 181 mohor
 
3834
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
3835
    begin
3836
      #Tp eth_phy.preamble_suppresed(i2);
3837
      // MII mode register
3838
      wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
3839
                wbm_subseq_waits);
3840
 
3841
      i = 0;
3842
      cnt = 0;
3843
      while (i < 80) // delay for sliding of writing a STOP SCAN command
3844
      begin
3845
        for (i3 = 0; i3 <= 1; i3 = i3 + 1) // choose read or write after scan will be finished
3846
        begin
3847
          // first there are two scans
3848
          // set address
3849
          reg_addr = 5'h0; // control register
3850
          phy_addr = 5'h1; // correct PHY address
3851
          cnt = 0;
3852
          // scan request
3853
          #Tp mii_scan_req(phy_addr, reg_addr);
3854
          // wait and check first 2 scans
3855 169 mohor
          begin
3856
            // wait for serial bus to become active
3857
            wait(Mdio_IO !== 1'bz);
3858
            // count transfer length
3859
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3860
            begin
3861
              @(posedge Mdc_O);
3862
              #Tp cnt = cnt + 1;
3863
            end
3864
            // check transfer length
3865
            if (i2) // without preamble
3866
            begin
3867
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3868
              begin
3869
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3870
                fail = fail + 1;
3871
              end
3872
            end
3873
            else // with preamble
3874
            begin
3875
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3876
              begin
3877
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3878
                fail = fail + 1;
3879
              end
3880
            end
3881
            cnt = 0;
3882
            // wait for serial bus to become active if there is more than one scan
3883
            wait(Mdio_IO !== 1'bz);
3884
            // count transfer length
3885
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3886
            begin
3887
              @(posedge Mdc_O);
3888
              #Tp cnt = cnt + 1;
3889
            end
3890
            // check transfer length
3891
            if (i2) // without preamble
3892
            begin
3893
              if (cnt != 33) // at this value Mdio_IO is HIGH Z
3894
              begin
3895
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3896
                fail = fail + 1;
3897
              end
3898
            end
3899
            else // with preamble
3900
            begin
3901
              if (cnt != 65) // at this value Mdio_IO is HIGH Z
3902
              begin
3903
                test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3904
                fail = fail + 1;
3905
              end
3906
            end
3907
          end
3908
 
3909 181 mohor
          // reset counter 
3910
          cnt = 0;
3911
          fork
3912
            begin
3913
              repeat(i) @(posedge Mdc_O);
3914
              // write command 0x0 into MII command register
3915
              // MII command written while scan in progress
3916
              wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
3917
              @(posedge wb_clk);
3918
              #Tp check_mii_busy; // wait for scan to finish
3919
              @(posedge wb_clk);
3920
              disable check_3;
3921
            end
3922
            begin: check_3
3923
              // wait for serial bus to become active
3924
              wait(Mdio_IO !== 1'bz);
3925
              // count transfer length
3926
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3927
              begin
3928
                @(posedge Mdc_O);
3929
                #Tp cnt = cnt + 1;
3930
              end
3931
              // check transfer length
3932
              if (i2) // without preamble
3933
              begin
3934
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3935
                begin
3936
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3937
                  fail = fail + 1;
3938
                end
3939
              end
3940
              else // with preamble
3941
              begin
3942
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3943
                begin
3944
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3945
                  fail = fail + 1;
3946
                end
3947
              end
3948
              cnt = 0;
3949
              // wait for serial bus to become active if there is more than one scan
3950
              wait(Mdio_IO !== 1'bz);
3951
              // count transfer length
3952
              while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
3953
              begin
3954
                @(posedge Mdc_O);
3955
                #Tp cnt = cnt + 1;
3956
              end
3957
              // check transfer length
3958
              if (i2) // without preamble
3959
              begin
3960
                if (cnt != 33) // at this value Mdio_IO is HIGH Z
3961
                begin
3962
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3963
                  fail = fail + 1;
3964
                end
3965
              end
3966
              else // with preamble
3967
              begin
3968
                if (cnt != 65) // at this value Mdio_IO is HIGH Z
3969
                begin
3970
                  test_fail("First scan request did not proceed correctly, while SCAN STOP was written");
3971
                  fail = fail + 1;
3972
                end
3973
              end
3974
            end
3975
          join
3976
          // check the BUSY signal to see if the bus is still IDLE
3977
          for (i1 = 0; i1 < 8; i1 = i1 + 1)
3978
            check_mii_busy; // wait for bus to become idle
3979
 
3980
          // try normal write or read after scan was finished
3981
          phy_data = {8'h7D, (i[7:0] + 1)};
3982
          cnt = 0;
3983
          if (i3 == 0) // write after scan
3984 169 mohor
          begin
3985 181 mohor
            // write request
3986
            #Tp mii_write_req(phy_addr, reg_addr, phy_data);
3987
            // wait for serial bus to become active
3988
            wait(Mdio_IO !== 1'bz);
3989
            // count transfer length
3990
            while(Mdio_IO !== 1'bz)
3991
            begin
3992
              @(posedge Mdc_O);
3993
              #Tp cnt = cnt + 1;
3994
            end
3995 169 mohor
            @(posedge Mdc_O);
3996 181 mohor
            // read request
3997
            #Tp mii_read_req(phy_addr, reg_addr);
3998
            check_mii_busy; // wait for read to finish
3999
            // read and check data
4000 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4001 181 mohor
            if (phy_data !== tmp_data)
4002
            begin
4003
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4004
              fail = fail + 1;
4005
            end
4006 169 mohor
          end
4007 181 mohor
          else // read after scan
4008 169 mohor
          begin
4009 181 mohor
            // read request
4010
            #Tp mii_read_req(phy_addr, reg_addr);
4011
            // wait for serial bus to become active
4012
            wait(Mdio_IO !== 1'bz);
4013
            // count transfer length
4014
            while( (Mdio_IO !== 1'bz) || ((cnt == 47) && (i2 == 0)) || ((cnt == 15) && (i2 == 1)) )
4015
            begin
4016
              @(posedge Mdc_O);
4017
              #Tp cnt = cnt + 1;
4018
            end
4019
            @(posedge Mdc_O);
4020
            check_mii_busy; // wait for read to finish
4021
            // read and check data
4022 274 tadejm
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4023 181 mohor
            if (phy_data !== tmp_data)
4024
            begin
4025
              test_fail("Data was not correctly written into OR read from PHY register - control register");
4026
              fail = fail + 1;
4027
            end
4028 169 mohor
          end
4029 181 mohor
          // check if transfer was a proper length
4030
          if (i2) // without preamble
4031 169 mohor
          begin
4032 181 mohor
            if (cnt != 33) // at this value Mdio_IO is HIGH Z
4033
            begin
4034
              test_fail("New request did not proceed correctly, after scan request");
4035
              fail = fail + 1;
4036
            end
4037 169 mohor
          end
4038 181 mohor
          else // with preamble
4039 169 mohor
          begin
4040 181 mohor
            if (cnt != 65) // at this value Mdio_IO is HIGH Z
4041
            begin
4042
              test_fail("New request did not proceed correctly, after scan request");
4043
              fail = fail + 1;
4044
            end
4045 169 mohor
          end
4046
        end
4047 181 mohor
        #Tp;
4048
        // set delay of writing the command
4049 169 mohor
        if (i2) // without preamble
4050
        begin
4051 181 mohor
          case(i)
4052
            0, 1:               i = i + 1;
4053
            18, 19, 20, 21, 22,
4054
            23, 24, 25, 26, 27,
4055
            28, 29, 30, 31, 32,
4056
            33, 34, 35:         i = i + 1;
4057
            36:                 i = 80;
4058
            default:            i = 18;
4059
          endcase
4060 169 mohor
        end
4061
        else // with preamble
4062
        begin
4063 181 mohor
          case(i)
4064
            0, 1:               i = i + 1;
4065
            50, 51, 52, 53, 54,
4066
            55, 56, 57, 58, 59,
4067
            60, 61, 62, 63, 64,
4068
            65, 66, 67:         i = i + 1;
4069
            68:                 i = 80;
4070
            default:            i = 50;
4071
          endcase
4072 169 mohor
        end
4073 181 mohor
        @(posedge wb_clk);
4074 116 mohor
      end
4075
    end
4076 181 mohor
    // set PHY to normal mode
4077
    #Tp eth_phy.preamble_suppresed(0);
4078
    // MII mode register
4079
    wbm_write(`ETH_MIIMODER, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4080
    if(fail == 0)
4081
      test_ok;
4082
    else
4083
      fail = 0;
4084 169 mohor
  end
4085 116 mohor
 
4086 181 mohor
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
4087
 
4088 169 mohor
end
4089
endtask // test_mii
4090
 
4091
 
4092
task test_mac_full_duplex_transmit;
4093
  input  [31:0]  start_task;
4094
  input  [31:0]  end_task;
4095
  integer        bit_start_1;
4096
  integer        bit_end_1;
4097
  integer        bit_start_2;
4098
  integer        bit_end_2;
4099
  integer        num_of_reg;
4100 209 tadejm
  integer        num_of_frames;
4101
  integer        num_of_bd;
4102 169 mohor
  integer        i_addr;
4103
  integer        i_data;
4104
  integer        i_length;
4105 209 tadejm
  integer        tmp_len;
4106
  integer        tmp_bd;
4107
  integer        tmp_bd_num;
4108 169 mohor
  integer        tmp_data;
4109 209 tadejm
  integer        tmp_ipgt;
4110 194 tadej
  integer        test_num;
4111 169 mohor
  reg    [31:0]  tx_bd_num;
4112
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
4113
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
4114
  integer        i;
4115
  integer        i1;
4116
  integer        i2;
4117
  integer        i3;
4118
  integer        fail;
4119
  integer        speed;
4120 279 mohor
  reg            no_underrun;
4121 209 tadejm
  reg            frame_started;
4122
  reg            frame_ended;
4123
  reg            wait_for_frame;
4124 169 mohor
  reg    [31:0]  addr;
4125
  reg    [31:0]  data;
4126
  reg    [31:0]  tmp;
4127
  reg    [ 7:0]  st_data;
4128
  reg    [15:0]  max_tmp;
4129
  reg    [15:0]  min_tmp;
4130 279 mohor
 
4131 169 mohor
begin
4132
// MAC FULL DUPLEX TRANSMIT TEST
4133
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
4134
$display(" ");
4135
$display("MAC FULL DUPLEX TRANSMIT TEST");
4136
fail = 0;
4137
 
4138
// reset MAC registers
4139
hard_reset;
4140
// reset MAC and MII LOGIC with soft reset
4141 274 tadejm
//reset_mac;
4142
//reset_mii;
4143 169 mohor
// set wb slave response
4144
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
4145
 
4146
  /*
4147
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
4148
  -------------------------------------------------------------------------------------
4149
  set_tx_bd
4150
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
4151
  set_tx_bd_wrap
4152
    (tx_bd_num_end[6:0]);
4153
  set_tx_bd_ready
4154
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4155
  check_tx_bd
4156
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
4157
  clear_tx_bd
4158
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
4159
 
4160
  TASKS for set and control RX buffer descriptors:
4161
  ------------------------------------------------
4162
  set_rx_bd
4163
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
4164
  set_rx_bd_wrap
4165
    (rx_bd_num_end[6:0]);
4166
  set_rx_bd_empty
4167
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4168
  check_rx_bd
4169
    (rx_bd_num_end[6:0], rx_bd_status);
4170
  clear_rx_bd
4171
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
4172
 
4173
  TASKS for set and check TX packets:
4174
  -----------------------------------
4175
  set_tx_packet
4176
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
4177
  check_tx_packet
4178
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
4179
 
4180
  TASKS for set and check RX packets:
4181
  -----------------------------------
4182
  set_rx_packet
4183
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
4184
  check_rx_packet
4185
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
4186
 
4187
  TASKS for append and check CRC to/of TX packet:
4188
  -----------------------------------------------
4189
  append_tx_crc
4190
    (txpnt_wb[31:0], len[15:0], negated_crc);
4191
  check_tx_crc
4192
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
4193
 
4194
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
4195
  --------------------------------------------------------------------------------
4196
  append_rx_crc
4197
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
4198
  */
4199
 
4200 194 tadej
//////////////////////////////////////////////////////////////////////
4201
////                                                              ////
4202
////  test_mac_full_duplex_transmit:                              ////
4203
////                                                              ////
4204
////  0: Test no transmit when all buffers are RX ( 10Mbps ).     ////
4205
////  1: Test no transmit when all buffers are RX ( 100Mbps ).    ////
4206
////  2: Test transmit packets form MINFL to MAXFL sizes at       ////
4207
////     one TX buffer decriptor ( 10Mbps ).                      ////
4208
////  3: Test transmit packets form MINFL to MAXFL sizes at       ////
4209
////     one TX buffer decriptor ( 100Mbps ).                     ////
4210
////                                                              ////
4211
//////////////////////////////////////////////////////////////////////
4212
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
4213 169 mohor
begin
4214
 
4215 194 tadej
  ////////////////////////////////////////////////////////////////////
4216
  ////                                                            ////
4217
  ////  Test no transmit when all buffers are RX ( 10Mbps ).      ////
4218
  ////                                                            ////
4219
  ////////////////////////////////////////////////////////////////////
4220
  if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
4221 169 mohor
  begin
4222 194 tadej
    // TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
4223
    test_name   = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
4224
    `TIME; $display("  TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
4225
 
4226
    // unmask interrupts
4227 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4228 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4229
    // set all buffer descriptors to RX - must be set before TX enable
4230 274 tadejm
    wait (wbm_working == 0);
4231 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4232
    // enable TX, set full-duplex mode, padding and CRC appending
4233 274 tadejm
    wait (wbm_working == 0);
4234 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4235
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4236
 
4237
    // write to phy's control register for 10Mbps
4238
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4239
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4240
    speed = 10;
4241
 
4242
    i = 0;
4243
    while (i < 128)
4244 169 mohor
    begin
4245 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4246 169 mohor
      begin
4247 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4248
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4249 169 mohor
      end
4250 194 tadej
      set_tx_bd_wrap(i);
4251
      fork
4252
        begin
4253
          set_tx_bd_ready(0, i);
4254
          repeat(20) @(negedge mtx_clk);
4255
          #1 disable check_tx_en10;
4256
        end
4257
        begin: check_tx_en10
4258
          wait (MTxEn === 1'b1);
4259
          test_fail("Tramsmit should not start at all");
4260
          fail = fail + 1;
4261
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4262
        end
4263
      join
4264
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4265 169 mohor
      begin
4266 194 tadej
        check_tx_bd(0, tmp);
4267
        #1;
4268
        if (tmp[15] === 1'b0)
4269
        begin
4270
          test_fail("Tramsmit should not start at all");
4271
          fail = fail + 1;
4272
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4273
        end
4274
        if (tmp[8:0] !== 0)
4275
        begin
4276
          test_fail("Tramsmit should not be finished since it should not start at all");
4277
          fail = fail + 1;
4278
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4279
        end
4280
        @(posedge wb_clk);
4281 169 mohor
      end
4282 274 tadejm
      wait (wbm_working == 0);
4283 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4284
      if (tmp[6:0] !== 0)
4285 169 mohor
      begin
4286 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4287 169 mohor
        fail = fail + 1;
4288 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4289 169 mohor
      end
4290 194 tadej
      clear_tx_bd(0, i);
4291
      if ((i < 5) || (i > 124))
4292
        i = i + 1;
4293
      else
4294
        i = i + 120;
4295 116 mohor
    end
4296 194 tadej
    // disable TX
4297 274 tadejm
    wait (wbm_working == 0);
4298 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4299
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4300
    if(fail == 0)
4301
      test_ok;
4302 116 mohor
    else
4303 194 tadej
      fail = 0;
4304 169 mohor
  end
4305 116 mohor
 
4306
 
4307 194 tadej
  ////////////////////////////////////////////////////////////////////
4308
  ////                                                            ////
4309
  ////  Test no transmit when all buffers are RX ( 100Mbps ).     ////
4310
  ////                                                            ////
4311
  ////////////////////////////////////////////////////////////////////
4312
  if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
4313 169 mohor
  begin
4314 194 tadej
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
4315
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
4316
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
4317
 
4318
    // unmask interrupts
4319 274 tadejm
    wait (wbm_working == 0);
4320 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4321 194 tadej
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4322
    // set all buffer descriptors to RX - must be set before TX enable
4323 274 tadejm
    wait (wbm_working == 0);
4324 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4325
    // enable TX, set full-duplex mode, padding and CRC appending
4326 274 tadejm
    wait (wbm_working == 0);
4327 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4328
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4329
 
4330
    // write to phy's control register for 100Mbps
4331
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4332
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4333
    speed = 100;
4334
 
4335
    i = 0;
4336
    while (i < 128)
4337 169 mohor
    begin
4338 194 tadej
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
4339 169 mohor
      begin
4340 194 tadej
        set_tx_packet((`MEMORY_BASE + (i1 * 200)), 100, 0);
4341
        set_tx_bd(i1, i1, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + (i1 * 200)));
4342 169 mohor
      end
4343 194 tadej
      set_tx_bd_wrap(i);
4344
      fork
4345
        begin
4346
          set_tx_bd_ready(0, i);
4347
          repeat(20) @(negedge mtx_clk);
4348
          #1 disable check_tx_en100;
4349
        end
4350
        begin: check_tx_en100
4351
          wait (MTxEn === 1'b1);
4352
          test_fail("Tramsmit should not start at all");
4353
          fail = fail + 1;
4354
          `TIME; $display("*E Transmit of %d packets should not start at all - active MTxEn", i);
4355
        end
4356
      join
4357
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
4358 169 mohor
      begin
4359 194 tadej
        check_tx_bd(0, tmp);
4360
        #1;
4361
        if (tmp[15] === 1'b0)
4362
        begin
4363
          test_fail("Tramsmit should not start at all");
4364
          fail = fail + 1;
4365
          `TIME; $display("*E Transmit of %d packets should not start at all - ready is 0", i);
4366
        end
4367
        if (tmp[8:0] !== 0)
4368
        begin
4369
          test_fail("Tramsmit should not be finished since it should not start at all");
4370
          fail = fail + 1;
4371
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
4372
        end
4373
        @(posedge wb_clk);
4374 169 mohor
      end
4375 274 tadejm
      wait (wbm_working == 0);
4376 194 tadej
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4377
      if (tmp[6:0] !== 0)
4378 169 mohor
      begin
4379 194 tadej
        test_fail("Tramsmit should not get INT since it should not start at all");
4380 169 mohor
        fail = fail + 1;
4381 194 tadej
        `TIME; $display("*E Transmit of should not get INT since it should not start at all");
4382 169 mohor
      end
4383 194 tadej
      clear_tx_bd(0, i);
4384
      if ((i < 5) || (i > 124))
4385
        i = i + 1;
4386
      else
4387
        i = i + 120;
4388 169 mohor
    end
4389 194 tadej
    // disable TX
4390 274 tadejm
    wait (wbm_working == 0);
4391 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4392
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4393
    if(fail == 0)
4394
      test_ok;
4395 169 mohor
    else
4396 194 tadej
      fail = 0;
4397 169 mohor
  end
4398
 
4399
 
4400 194 tadej
  ////////////////////////////////////////////////////////////////////
4401
  ////                                                            ////
4402
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4403
  ////  one TX buffer decriptor ( 10Mbps ).                       ////
4404
  ////                                                            ////
4405
  ////////////////////////////////////////////////////////////////////
4406 209 tadejm
  if (test_num == 2) // without and with padding
4407 169 mohor
  begin
4408 194 tadej
    // TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
4409
    test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
4410
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
4411
 
4412
    max_tmp = 0;
4413
    min_tmp = 0;
4414
    // set one TX buffer descriptor - must be set before TX enable
4415 274 tadejm
    wait (wbm_working == 0);
4416 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4417 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4418 274 tadejm
    wait (wbm_working == 0);
4419 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4420 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4421
    // prepare two packets of MAXFL length
4422 274 tadejm
    wait (wbm_working == 0);
4423 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4424
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4425
    min_tmp = tmp[31:16];
4426 209 tadejm
    st_data = 8'h01;
4427
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4428 194 tadej
    st_data = 8'h10;
4429 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4430 194 tadej
    // check WB INT signal
4431
    if (wb_int !== 1'b0)
4432 169 mohor
    begin
4433 194 tadej
      test_fail("WB INT signal should not be set");
4434
      fail = fail + 1;
4435 169 mohor
    end
4436 194 tadej
 
4437
    // write to phy's control register for 10Mbps
4438
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
4439
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
4440
    speed = 10;
4441
 
4442
    i_length = (min_tmp - 4);
4443
    while (i_length <= (max_tmp - 4))
4444 169 mohor
    begin
4445 194 tadej
      // choose generating carrier sense and collision for first and last 64 lengths of frames
4446
      case (i_length[1:0])
4447
      2'h0: // Interrupt is generated
4448 169 mohor
      begin
4449 194 tadej
        // enable interrupt generation
4450 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4451 194 tadej
        // unmask interrupts
4452 274 tadejm
        wait (wbm_working == 0);
4453 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4454 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4455
        // not detect carrier sense in FD and no collision
4456
        eth_phy.carrier_sense_tx_fd_detect(0);
4457
        eth_phy.collision(0);
4458 169 mohor
      end
4459 194 tadej
      2'h1: // Interrupt is not generated
4460 169 mohor
      begin
4461 194 tadej
        // enable interrupt generation
4462 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4463 194 tadej
        // mask interrupts
4464 274 tadejm
        wait (wbm_working == 0);
4465 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4466
        // detect carrier sense in FD and no collision
4467
        eth_phy.carrier_sense_tx_fd_detect(1);
4468
        eth_phy.collision(0);
4469 169 mohor
      end
4470 194 tadej
      2'h2: // Interrupt is not generated
4471
      begin
4472
        // disable interrupt generation
4473 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4474 194 tadej
        // unmask interrupts
4475 274 tadejm
        wait (wbm_working == 0);
4476 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4477 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4478
        // not detect carrier sense in FD and set collision
4479
        eth_phy.carrier_sense_tx_fd_detect(0);
4480
        eth_phy.collision(1);
4481
      end
4482
      default: // 2'h3: // Interrupt is not generated
4483
      begin
4484
        // disable interrupt generation
4485 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4486 194 tadej
        // mask interrupts
4487 274 tadejm
        wait (wbm_working == 0);
4488 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4489
        // detect carrier sense in FD and set collision
4490
        eth_phy.carrier_sense_tx_fd_detect(1);
4491
        eth_phy.collision(1);
4492
      end
4493
      endcase
4494
      eth_phy.set_tx_mem_addr(max_tmp);
4495
      // set wrap bit
4496
      set_tx_bd_wrap(0);
4497
      set_tx_bd_ready(0, 0);
4498 169 mohor
      #1 check_tx_bd(0, data);
4499 274 tadejm
 
4500
 
4501 194 tadej
      if (i_length < min_tmp) // just first four
4502 169 mohor
      begin
4503 194 tadej
        while (data[15] === 1)
4504
        begin
4505
          #1 check_tx_bd(0, data);
4506
          @(posedge wb_clk);
4507
        end
4508 209 tadejm
        repeat (1) @(posedge wb_clk);
4509 169 mohor
      end
4510 194 tadej
      else if (i_length > (max_tmp - 8)) // just last four
4511 192 tadej
      begin
4512 194 tadej
        tmp = 0;
4513
        wait (MTxEn === 1'b1); // start transmit
4514
        while (tmp < (i_length - 20))
4515
        begin
4516
          #1 tmp = tmp + 1;
4517
          @(posedge wb_clk);
4518
        end
4519
        #1 check_tx_bd(0, data);
4520
        while (data[15] === 1)
4521
        begin
4522
          #1 check_tx_bd(0, data);
4523
          @(posedge wb_clk);
4524
        end
4525 209 tadejm
        repeat (1) @(posedge wb_clk);
4526 192 tadej
      end
4527
      else
4528
      begin
4529 194 tadej
        wait (MTxEn === 1'b1); // start transmit
4530
        #1 check_tx_bd(0, data);
4531
        if (data[15] !== 1)
4532
        begin
4533
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4534
          fail = fail + 1;
4535
        end
4536
        wait (MTxEn === 1'b0); // end transmit
4537
        while (data[15] === 1)
4538
        begin
4539
          #1 check_tx_bd(0, data);
4540
          @(posedge wb_clk);
4541
        end
4542
        repeat (1) @(posedge wb_clk);
4543 192 tadej
      end
4544 274 tadejm
 
4545 279 mohor
      repeat(5) @(posedge mtx_clk);  // Wait some time so PHY stores the CRC
4546 274 tadejm
 
4547 194 tadej
      // check length of a PACKET
4548
      if (eth_phy.tx_len != (i_length + 4))
4549 192 tadej
      begin
4550 194 tadej
        test_fail("Wrong length of the packet out from MAC");
4551 192 tadej
        fail = fail + 1;
4552
      end
4553 194 tadej
      // checking in the following if statement is performed only for first and last 64 lengths
4554
      if ( ((i_length + 4) <= (min_tmp + 64)) || ((i_length + 4) > (max_tmp - 64)) )
4555 192 tadej
      begin
4556 194 tadej
        // check transmitted TX packet data
4557
        if (i_length[0] == 0)
4558
        begin
4559 209 tadejm
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4560 194 tadej
        end
4561
        else
4562
        begin
4563 209 tadejm
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4564 194 tadej
        end
4565
        if (tmp > 0)
4566
        begin
4567
          test_fail("Wrong data of the transmitted packet");
4568
          fail = fail + 1;
4569
        end
4570
        // check transmited TX packet CRC
4571
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4572 274 tadejm
 
4573 194 tadej
        if (tmp > 0)
4574
        begin
4575
          test_fail("Wrong CRC of the transmitted packet");
4576
          fail = fail + 1;
4577
        end
4578 192 tadej
      end
4579 194 tadej
      // check WB INT signal
4580
      if (i_length[1:0] == 2'h0)
4581 192 tadej
      begin
4582 194 tadej
        if (wb_int !== 1'b1)
4583
        begin
4584
          `TIME; $display("*E WB INT signal should be set");
4585
          test_fail("WB INT signal should be set");
4586
          fail = fail + 1;
4587
        end
4588 192 tadej
      end
4589 194 tadej
      else
4590 192 tadej
      begin
4591 194 tadej
        if (wb_int !== 1'b0)
4592
        begin
4593
          `TIME; $display("*E WB INT signal should not be set");
4594
          test_fail("WB INT signal should not be set");
4595
          fail = fail + 1;
4596
        end
4597 192 tadej
      end
4598 194 tadej
      // check TX buffer descriptor of a packet
4599
      check_tx_bd(0, data);
4600
      if (i_length[1] == 1'b0) // interrupt enabled
4601 192 tadej
      begin
4602 194 tadej
        if (data[15:0] !== 16'h7800)
4603
        begin
4604
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4605
          test_fail("TX buffer descriptor status is not correct");
4606
          fail = fail + 1;
4607
        end
4608 192 tadej
      end
4609 194 tadej
      else // interrupt not enabled
4610 192 tadej
      begin
4611 194 tadej
        if (data[15:0] !== 16'h3800)
4612
        begin
4613
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4614
          test_fail("TX buffer descriptor status is not correct");
4615
          fail = fail + 1;
4616
        end
4617 192 tadej
      end
4618 194 tadej
      // clear TX buffer descriptor
4619
      clear_tx_bd(0, 0);
4620
      // check interrupts
4621 274 tadejm
      wait (wbm_working == 0);
4622 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4623
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4624 192 tadej
      begin
4625 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4626
        begin
4627
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4628
          test_fail("Interrupt Transmit Buffer was not set");
4629
          fail = fail + 1;
4630
        end
4631
        if ((data & (~`ETH_INT_TXB)) !== 0)
4632
        begin
4633
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4634
          test_fail("Other interrupts (except Transmit Buffer) were set");
4635
          fail = fail + 1;
4636
        end
4637 192 tadej
      end
4638 194 tadej
      else
4639 192 tadej
      begin
4640 194 tadej
        if (data !== 0)
4641
        begin
4642
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
4643
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4644
          fail = fail + 1;
4645
        end
4646 192 tadej
      end
4647 194 tadej
      // clear interrupts
4648 274 tadejm
      wait (wbm_working == 0);
4649 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4650
      // check WB INT signal
4651
      if (wb_int !== 1'b0)
4652 192 tadej
      begin
4653 194 tadej
        test_fail("WB INT signal should not be set");
4654 192 tadej
        fail = fail + 1;
4655
      end
4656 194 tadej
      // INTERMEDIATE DISPLAYS
4657
      if ((i_length + 4) == (min_tmp + 64))
4658 209 tadejm
      begin
4659 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4660 209 tadejm
        $display("    pads appending to packets is NOT selected");
4661
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4662 194 tadej
                 min_tmp, (min_tmp + 64));
4663 209 tadejm
        // set padding, remain the rest
4664 274 tadejm
        wait (wbm_working == 0);
4665 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4666
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4667
      end
4668 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4669 209 tadejm
      begin
4670 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4671 209 tadejm
        $display("    pads appending to packets is selected");
4672
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4673 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4674 209 tadejm
        // reset padding, remain the rest
4675 274 tadejm
        wait (wbm_working == 0);
4676 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4677
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4678
      end
4679 194 tadej
      else if ((i_length + 4) == max_tmp)
4680 209 tadejm
      begin
4681
        $display("    pads appending to packets is NOT selected");
4682
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4683 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4684 209 tadejm
      end
4685 194 tadej
      // set length (loop variable)
4686
      if ((i_length + 4) < (min_tmp + 64))
4687
        i_length = i_length + 1;
4688
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4689
      begin
4690
        i_length = i_length + 128;
4691
        tmp_data = i_length + 4; // last tmp_data is ending length
4692
      end
4693
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4694
        i_length = max_tmp - (4 + 16);
4695
      else if ((i_length + 4) >= (max_tmp - 16))
4696
        i_length = i_length + 1;
4697
      else
4698
      begin
4699
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
4700
        #10 $stop;
4701
      end
4702 192 tadej
    end
4703 194 tadej
    // disable TX
4704 274 tadejm
    wait (wbm_working == 0);
4705 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4706
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4707
    if(fail == 0)
4708
      test_ok;
4709
    else
4710
      fail = 0;
4711
  end
4712
 
4713
 
4714
  ////////////////////////////////////////////////////////////////////
4715
  ////                                                            ////
4716
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
4717
  ////  one TX buffer decriptor ( 100Mbps ).                      ////
4718
  ////                                                            ////
4719
  ////////////////////////////////////////////////////////////////////
4720 209 tadejm
  if (test_num == 3) // with and without padding
4721 194 tadej
  begin
4722
    // TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
4723
    test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
4724
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
4725
 
4726
    max_tmp = 0;
4727
    min_tmp = 0;
4728
    // set one TX buffer descriptor - must be set before TX enable
4729 274 tadejm
    wait (wbm_working == 0);
4730 194 tadej
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4731 209 tadejm
    // enable TX, set full-duplex mode, NO padding and CRC appending
4732 274 tadejm
    wait (wbm_working == 0);
4733 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4734 194 tadej
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4735
    // prepare two packets of MAXFL length
4736 274 tadejm
    wait (wbm_working == 0);
4737 194 tadej
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4738
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
4739
    min_tmp = tmp[31:16];
4740
    st_data = 8'h5A;
4741 209 tadejm
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
4742 194 tadej
    st_data = 8'h10;
4743 209 tadejm
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
4744 169 mohor
    // check WB INT signal
4745 192 tadej
    if (wb_int !== 1'b0)
4746 169 mohor
    begin
4747
      test_fail("WB INT signal should not be set");
4748
      fail = fail + 1;
4749
    end
4750 194 tadej
 
4751
    // write to phy's control register for 100Mbps
4752
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
4753
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
4754
    speed = 100;
4755 192 tadej
 
4756 194 tadej
    i_length = (min_tmp - 4);
4757
    while (i_length <= (max_tmp - 4))
4758 192 tadej
    begin
4759 194 tadej
      // choose generating carrier sense and collision
4760
      case (i_length[1:0])
4761
      2'h0: // Interrupt is generated
4762 192 tadej
      begin
4763 194 tadej
        // enable interrupt generation
4764 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4765 194 tadej
        // unmask interrupts
4766 274 tadejm
        wait (wbm_working == 0);
4767 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4768 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4769
        // not detect carrier sense in FD and no collision
4770
        eth_phy.carrier_sense_tx_fd_detect(0);
4771
        eth_phy.collision(0);
4772 192 tadej
      end
4773 194 tadej
      2'h1: // Interrupt is not generated
4774 192 tadej
      begin
4775 194 tadej
        // enable interrupt generation
4776 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4777 194 tadej
        // mask interrupts
4778 274 tadejm
        wait (wbm_working == 0);
4779 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4780
        // detect carrier sense in FD and no collision
4781
        eth_phy.carrier_sense_tx_fd_detect(1);
4782
        eth_phy.collision(0);
4783 192 tadej
      end
4784 194 tadej
      2'h2: // Interrupt is not generated
4785
      begin
4786
        // disable interrupt generation
4787 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
4788 194 tadej
        // unmask interrupts
4789 274 tadejm
        wait (wbm_working == 0);
4790 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
4791 194 tadej
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4792
        // not detect carrier sense in FD and set collision
4793
        eth_phy.carrier_sense_tx_fd_detect(0);
4794
        eth_phy.collision(1);
4795
      end
4796
      default: // 2'h3: // Interrupt is not generated
4797
      begin
4798
        // disable interrupt generation
4799 209 tadejm
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
4800 194 tadej
        // mask interrupts
4801 274 tadejm
        wait (wbm_working == 0);
4802 194 tadej
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4803
        // detect carrier sense in FD and set collision
4804
        eth_phy.carrier_sense_tx_fd_detect(1);
4805
        eth_phy.collision(1);
4806
      end
4807
      endcase
4808
      eth_phy.set_tx_mem_addr(max_tmp);
4809
      // set wrap bit
4810
      set_tx_bd_wrap(0);
4811
      set_tx_bd_ready(0, 0);
4812 192 tadej
      #1 check_tx_bd(0, data);
4813 194 tadej
      if (i_length < min_tmp) // just first four
4814 192 tadej
      begin
4815 194 tadej
        while (data[15] === 1)
4816
        begin
4817
          #1 check_tx_bd(0, data);
4818
          @(posedge wb_clk);
4819
        end
4820 209 tadejm
        repeat (1) @(posedge wb_clk);
4821 194 tadej
      end
4822
      else if (i_length > (max_tmp - 8)) // just last four
4823
      begin
4824
        tmp = 0;
4825
        wait (MTxEn === 1'b1); // start transmit
4826
        while (tmp < (i_length - 20))
4827
        begin
4828
          #1 tmp = tmp + 1;
4829
          @(posedge wb_clk);
4830
        end
4831 192 tadej
        #1 check_tx_bd(0, data);
4832 194 tadej
        while (data[15] === 1)
4833
        begin
4834
          #1 check_tx_bd(0, data);
4835
          @(posedge wb_clk);
4836
        end
4837 209 tadejm
        repeat (1) @(posedge wb_clk);
4838 192 tadej
      end
4839 194 tadej
      else
4840
      begin
4841
        wait (MTxEn === 1'b1); // start transmit
4842
        #1 check_tx_bd(0, data);
4843
        if (data[15] !== 1)
4844
        begin
4845
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
4846
          fail = fail + 1;
4847
        end
4848
        wait (MTxEn === 1'b0); // end transmit
4849
        while (data[15] === 1)
4850
        begin
4851
          #1 check_tx_bd(0, data);
4852
          @(posedge wb_clk);
4853
        end
4854
        repeat (1) @(posedge wb_clk);
4855
      end
4856
      // check length of a PACKET
4857
      if (eth_phy.tx_len != (i_length + 4))
4858
      begin
4859
        test_fail("Wrong length of the packet out from MAC");
4860
        fail = fail + 1;
4861
      end
4862 192 tadej
      // check transmitted TX packet data
4863
      if (i_length[0] == 0)
4864
      begin
4865 209 tadejm
        check_tx_packet((`MEMORY_BASE + i_length[1:0]), max_tmp, i_length, tmp);
4866 192 tadej
      end
4867
      else
4868
      begin
4869 209 tadejm
        check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
4870 192 tadej
      end
4871
      if (tmp > 0)
4872
      begin
4873
        test_fail("Wrong data of the transmitted packet");
4874
        fail = fail + 1;
4875
      end
4876
      // check transmited TX packet CRC
4877
      check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
4878
      if (tmp > 0)
4879
      begin
4880
        test_fail("Wrong CRC of the transmitted packet");
4881
        fail = fail + 1;
4882
      end
4883 194 tadej
      // check WB INT signal
4884
      if (i_length[1:0] == 2'h0)
4885 192 tadej
      begin
4886 194 tadej
        if (wb_int !== 1'b1)
4887
        begin
4888
          `TIME; $display("*E WB INT signal should be set");
4889
          test_fail("WB INT signal should be set");
4890
          fail = fail + 1;
4891
        end
4892 192 tadej
      end
4893 194 tadej
      else
4894 192 tadej
      begin
4895 194 tadej
        if (wb_int !== 1'b0)
4896
        begin
4897
          `TIME; $display("*E WB INT signal should not be set");
4898
          test_fail("WB INT signal should not be set");
4899
          fail = fail + 1;
4900
        end
4901 192 tadej
      end
4902 194 tadej
      // check TX buffer descriptor of a packet
4903
      check_tx_bd(0, data);
4904
      if (i_length[1] == 1'b0) // interrupt enabled
4905 192 tadej
      begin
4906 194 tadej
        if (data[15:0] !== 16'h7800)
4907
        begin
4908
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4909
          test_fail("TX buffer descriptor status is not correct");
4910
          fail = fail + 1;
4911
        end
4912 192 tadej
      end
4913 194 tadej
      else // interrupt not enabled
4914 192 tadej
      begin
4915 194 tadej
        if (data[15:0] !== 16'h3800)
4916
        begin
4917
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
4918
          test_fail("TX buffer descriptor status is not correct");
4919
          fail = fail + 1;
4920
        end
4921 192 tadej
      end
4922 194 tadej
      // clear TX buffer descriptor
4923
      clear_tx_bd(0, 0);
4924
      // check interrupts
4925 274 tadejm
      wait (wbm_working == 0);
4926 194 tadej
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4927
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
4928 192 tadej
      begin
4929 194 tadej
        if ((data & `ETH_INT_TXB) !== 1'b1)
4930
        begin
4931
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
4932
          test_fail("Interrupt Transmit Buffer was not set");
4933
          fail = fail + 1;
4934
        end
4935
        if ((data & (~`ETH_INT_TXB)) !== 0)
4936
        begin
4937
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
4938
          test_fail("Other interrupts (except Transmit Buffer) were set");
4939
          fail = fail + 1;
4940
        end
4941 192 tadej
      end
4942 194 tadej
      else
4943 192 tadej
      begin
4944 194 tadej
        if (data !== 0)
4945
        begin
4946
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h", data);
4947
          test_fail("Any of interrupts (except Transmit Buffer) was set");
4948
          fail = fail + 1;
4949
        end
4950 192 tadej
      end
4951 194 tadej
      // clear interrupts
4952 274 tadejm
      wait (wbm_working == 0);
4953 194 tadej
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4954
      // check WB INT signal
4955
      if (wb_int !== 1'b0)
4956 192 tadej
      begin
4957 194 tadej
        test_fail("WB INT signal should not be set");
4958 192 tadej
        fail = fail + 1;
4959
      end
4960 194 tadej
      // INTERMEDIATE DISPLAYS
4961
      if ((i_length + 4) == (min_tmp + 64))
4962 209 tadejm
      begin
4963 194 tadej
        // starting length is min_tmp, ending length is (min_tmp + 64)
4964 209 tadejm
        $display("    pads appending to packets is NOT selected");
4965
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
4966 194 tadej
                 min_tmp, (min_tmp + 64));
4967 209 tadejm
        // set padding, remain the rest
4968 274 tadejm
        wait (wbm_working == 0);
4969 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
4970
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4971
      end
4972 194 tadej
      else if ((i_length + 4) == (max_tmp - 16))
4973 209 tadejm
      begin
4974 194 tadej
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
4975 209 tadejm
        $display("    pads appending to packets is selected");
4976
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
4977 194 tadej
                 (min_tmp + 64 + 128), tmp_data);
4978 209 tadejm
        // reset padding, remain the rest
4979 274 tadejm
        wait (wbm_working == 0);
4980 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
4981
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
4982
      end
4983 194 tadej
      else if ((i_length + 4) == max_tmp)
4984 209 tadejm
      begin
4985
        $display("    pads appending to packets is NOT selected");
4986
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
4987 194 tadej
                 (max_tmp - (4 + 16)), max_tmp);
4988 209 tadejm
      end
4989 194 tadej
      // set length (loop variable)
4990
      if ((i_length + 4) < (min_tmp + 64))
4991
        i_length = i_length + 1;
4992
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
4993
      begin
4994
        i_length = i_length + 128;
4995
        tmp_data = i_length + 4; // last tmp_data is ending length
4996
      end
4997
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
4998
        i_length = max_tmp - (4 + 16);
4999
      else if ((i_length + 4) >= (max_tmp - 16))
5000
        i_length = i_length + 1;
5001 192 tadej
      else
5002 194 tadej
      begin
5003
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5004
        #10 $stop;
5005
      end
5006 179 mohor
    end
5007 194 tadej
    // disable TX
5008 274 tadejm
    wait (wbm_working == 0);
5009 194 tadej
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5010
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5011
    if(fail == 0)
5012
      test_ok;
5013
    else
5014
      fail = 0;
5015 169 mohor
  end
5016
 
5017
 
5018 209 tadejm
  ////////////////////////////////////////////////////////////////////
5019
  ////                                                            ////
5020
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5021
  ////  maximum TX buffer decriptors ( 10Mbps ).                  ////
5022
  ////                                                            ////
5023
  ////////////////////////////////////////////////////////////////////
5024
  if (test_num == 4) // without and with padding
5025
  begin
5026
    // TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
5027
    test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
5028
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
5029
 
5030
    // reset MAC registers
5031
    hard_reset;
5032
    // reset MAC and MII LOGIC with soft reset
5033 274 tadejm
//    reset_mac;
5034
//    reset_mii;
5035 209 tadejm
    // set wb slave response
5036
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5037 192 tadej
 
5038 209 tadejm
    max_tmp = 0;
5039
    min_tmp = 0;
5040
    num_of_frames = 0;
5041
    num_of_bd = 0;
5042
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5043 274 tadejm
    wait (wbm_working == 0);
5044 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5045
    // enable TX, set full-duplex mode, NO padding and CRC appending
5046 274 tadejm
    wait (wbm_working == 0);
5047 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5048
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5049
    // prepare two packets of MAXFL length
5050 274 tadejm
    wait (wbm_working == 0);
5051 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5052
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5053
    min_tmp = tmp[31:16];
5054
    st_data = 8'hA3;
5055
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5056
    st_data = 8'h81;
5057
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5058
    // check WB INT signal
5059
    if (wb_int !== 1'b0)
5060
    begin
5061
      test_fail("WB INT signal should not be set");
5062
      fail = fail + 1;
5063
    end
5064
 
5065
    // write to phy's control register for 10Mbps
5066
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5067
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5068
    speed = 10;
5069
 
5070
    i_length = (min_tmp - 4);
5071
    while (i_length <= (max_tmp - 4))
5072
    begin
5073
      // choose generating carrier sense and collision
5074
      case (i_length[1:0])
5075
      2'h0: // Interrupt is generated
5076
      begin
5077
        // Reset_tx_bd nable interrupt generation
5078
        // unmask interrupts
5079 274 tadejm
        wait (wbm_working == 0);
5080 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5081
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5082
        // not detect carrier sense in FD and no collision
5083
        eth_phy.carrier_sense_tx_fd_detect(0);
5084
        eth_phy.collision(0);
5085
      end
5086
      2'h1: // Interrupt is not generated
5087
      begin
5088
        // set_tx_bd enable interrupt generation
5089
        // mask interrupts
5090 274 tadejm
        wait (wbm_working == 0);
5091 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5092
        // detect carrier sense in FD and no collision
5093
        eth_phy.carrier_sense_tx_fd_detect(1);
5094
        eth_phy.collision(0);
5095
      end
5096
      2'h2: // Interrupt is not generated
5097
      begin
5098
        // set_tx_bd disable the interrupt generation
5099
        // unmask interrupts
5100 274 tadejm
        wait (wbm_working == 0);
5101 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5102
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5103
        // not detect carrier sense in FD and set collision
5104
        eth_phy.carrier_sense_tx_fd_detect(0);
5105
        eth_phy.collision(1);
5106
      end
5107
      default: // 2'h3: // Interrupt is not generated
5108
      begin
5109
        // set_tx_bd disable the interrupt generation
5110
        // mask interrupts
5111 274 tadejm
        wait (wbm_working == 0);
5112 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5113
        // detect carrier sense in FD and set collision
5114
        eth_phy.carrier_sense_tx_fd_detect(1);
5115
        eth_phy.collision(1);
5116
      end
5117
      endcase
5118
      // first destination address on ethernet PHY
5119
      if (i_length[0] == 0)
5120
        eth_phy.set_tx_mem_addr(0);
5121
      else
5122
        eth_phy.set_tx_mem_addr(max_tmp);
5123
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5124
      // number of all frames is 154 (146 without first 8)
5125
      if (num_of_frames < 8)
5126
      begin
5127
        case (i_length[1:0])
5128
        2'h0: // Interrupt is generated
5129
        begin
5130
          // enable interrupt generation
5131
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5132
          // interrupts are unmasked
5133
        end
5134
        2'h1: // Interrupt is not generated
5135
        begin
5136
          // enable interrupt generation
5137
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5138
          // interrupts are masked
5139
        end
5140
        2'h2: // Interrupt is not generated
5141
        begin
5142
          // disable interrupt generation
5143
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5144
          // interrupts are unmasked
5145
        end
5146
        default: // 2'h3: // Interrupt is not generated
5147
        begin
5148
          // disable interrupt generation
5149
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5150
          // interrupts are masked
5151
        end
5152
        endcase
5153
        // set wrap bit
5154
        set_tx_bd_wrap(0);
5155
      end
5156
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5157
      else if ((num_of_frames - 8) == 0)
5158
      begin
5159
        tmp_len = i_length; // length of frame
5160
        tmp_bd_num = 0; // TX BD number
5161
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5162
        begin
5163
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5164
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5165
          if (tmp_len[0] == 0)
5166
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5167
          else
5168
            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));
5169
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5170
          if ((tmp_len + 4) < (min_tmp + 128))
5171
            tmp_len = tmp_len + 1;
5172
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5173
            tmp_len = 256;
5174
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5175
            tmp_len = tmp_len + 128;
5176
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5177
            tmp_len = max_tmp - (4 + 16);
5178
          else if ((tmp_len + 4) >= (max_tmp - 16))
5179
            tmp_len = tmp_len + 1;
5180
          // set TX BD number
5181
          tmp_bd_num = tmp_bd_num + 1;
5182
        end
5183
        // set wrap bit
5184
        set_tx_bd_wrap(127);
5185
      end
5186
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5187
      else if ((num_of_frames - 8) == 20) // 128
5188
      begin
5189
        tmp_len = tmp_len; // length of frame remaines from previous settings
5190
        tmp_bd_num = 0; // TX BD number
5191
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5192
        begin
5193
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5194
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5195
          if (tmp_len[0] == 0)
5196
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5197
          else
5198
            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));
5199
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5200
          if ((tmp_len + 4) < (min_tmp + 128))
5201
            tmp_len = tmp_len + 1;
5202
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5203
            tmp_len = 256;
5204
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5205
            tmp_len = tmp_len + 128;
5206
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5207
            tmp_len = max_tmp - (4 + 16);
5208
          else if ((tmp_len + 4) >= (max_tmp - 16))
5209
            tmp_len = tmp_len + 1;
5210
          // set TX BD number
5211
          tmp_bd_num = tmp_bd_num + 1;
5212
        end
5213
      end
5214
      // set ready bit
5215
      if (num_of_frames < 8)
5216
        set_tx_bd_ready(0, 0);
5217
      else if ((num_of_frames - 8) < 128)
5218
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5219
      else if ((num_of_frames - 136) < 19)
5220
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5221
      // CHECK END OF TRANSMITION
5222
      #1 check_tx_bd(num_of_bd, data);
5223
      if (i_length < min_tmp) // just first four
5224
      begin
5225
        while (data[15] === 1)
5226
        begin
5227
          #1 check_tx_bd(num_of_bd, data);
5228
          @(posedge wb_clk);
5229
        end
5230
        repeat (1) @(posedge wb_clk);
5231
      end
5232
      else if (i_length > (max_tmp - 8)) // just last four
5233
      begin
5234
        tmp = 0;
5235
        wait (MTxEn === 1'b1); // start transmit
5236
        while (tmp < (i_length - 20))
5237
        begin
5238
          #1 tmp = tmp + 1;
5239
          @(posedge wb_clk);
5240
        end
5241
        #1 check_tx_bd(num_of_bd, data);
5242
        while (data[15] === 1)
5243
        begin
5244
          #1 check_tx_bd(num_of_bd, data);
5245
          @(posedge wb_clk);
5246
        end
5247
        repeat (1) @(posedge wb_clk);
5248
      end
5249
      else
5250
      begin
5251
        wait (MTxEn === 1'b1); // start transmit
5252
        #1 check_tx_bd(num_of_bd, data);
5253
        if (data[15] !== 1)
5254
        begin
5255
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5256
          fail = fail + 1;
5257
        end
5258
        wait (MTxEn === 1'b0); // end transmit
5259
        while (data[15] === 1)
5260
        begin
5261
          #1 check_tx_bd(num_of_bd, data);
5262
          @(posedge wb_clk);
5263
        end
5264
        repeat (1) @(posedge wb_clk);
5265
      end
5266
      // check length of a PACKET
5267
      if (eth_phy.tx_len != (i_length + 4))
5268
      begin
5269
        test_fail("Wrong length of the packet out from MAC");
5270
        fail = fail + 1;
5271
      end
5272
        // check transmitted TX packet data
5273
        if (i_length[0] == 0)
5274
        begin
5275
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5276
        end
5277
        else
5278
        begin
5279
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5280
        end
5281
        if (tmp > 0)
5282
        begin
5283
          test_fail("Wrong data of the transmitted packet");
5284
          fail = fail + 1;
5285
        end
5286
        // check transmited TX packet CRC
5287
        if (i_length[0] == 0)
5288
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5289
        else
5290
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5291
        if (tmp > 0)
5292
        begin
5293
          test_fail("Wrong CRC of the transmitted packet");
5294
          fail = fail + 1;
5295
        end
5296
      // check WB INT signal
5297
      if (i_length[1:0] == 2'h0)
5298
      begin
5299
        if (wb_int !== 1'b1)
5300
        begin
5301
          `TIME; $display("*E WB INT signal should be set");
5302
          test_fail("WB INT signal should be set");
5303
          fail = fail + 1;
5304
        end
5305
      end
5306
      else
5307
      begin
5308
        if (wb_int !== 1'b0)
5309
        begin
5310
          `TIME; $display("*E WB INT signal should not be set");
5311
          test_fail("WB INT signal should not be set");
5312
          fail = fail + 1;
5313
        end
5314
      end
5315
      // check TX buffer descriptor of a packet
5316
      check_tx_bd(num_of_bd, data);
5317
      if (i_length[1] == 1'b0) // interrupt enabled
5318
      begin
5319
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5320
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5321
        begin
5322
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5323
          test_fail("TX buffer descriptor status is not correct");
5324
          fail = fail + 1;
5325
        end
5326
      end
5327
      else // interrupt not enabled
5328
      begin
5329
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5330
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5331
        begin
5332
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5333
          test_fail("TX buffer descriptor status is not correct");
5334
          fail = fail + 1;
5335
        end
5336
      end
5337
      // clear first half of 8 frames from TX buffer descriptor 0
5338
      if (num_of_frames < 4)
5339
        clear_tx_bd(num_of_bd, num_of_bd);
5340
      // clear BD with wrap bit
5341
      if (num_of_frames == 140)
5342
        clear_tx_bd(127, 127);
5343
      // check interrupts
5344 274 tadejm
      wait (wbm_working == 0);
5345 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5346
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5347
      begin
5348
        if ((data & `ETH_INT_TXB) !== 1'b1)
5349
        begin
5350
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5351
          test_fail("Interrupt Transmit Buffer was not set");
5352
          fail = fail + 1;
5353
        end
5354
        if ((data & (~`ETH_INT_TXB)) !== 0)
5355
        begin
5356
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5357
          test_fail("Other interrupts (except Transmit Buffer) were set");
5358
          fail = fail + 1;
5359
        end
5360
      end
5361
      else
5362
      begin
5363
        if (data !== 0)
5364
        begin
5365
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5366
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5367
          fail = fail + 1;
5368
        end
5369
      end
5370
      // clear interrupts
5371 274 tadejm
      wait (wbm_working == 0);
5372 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5373
      // check WB INT signal
5374
      if (wb_int !== 1'b0)
5375
      begin
5376
        test_fail("WB INT signal should not be set");
5377
        fail = fail + 1;
5378
      end
5379
      // INTERMEDIATE DISPLAYS
5380
      if ((i_length + 4) == (min_tmp + 7))
5381
      begin
5382
        // starting length is min_tmp, ending length is (min_tmp + 128)
5383
        $display("    pads appending to packets is NOT selected");
5384
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5385
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5386
                 min_tmp, (min_tmp + 7));
5387
        $display("    ->all packets were send from TX BD 0");
5388
        // set padding, remain the rest
5389 274 tadejm
        wait (wbm_working == 0);
5390 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5391
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5392
      end
5393
      else if ((i_length + 4) == (min_tmp + 128))
5394
      begin
5395
        // starting length is min_tmp, ending length is (min_tmp + 128)
5396
        $display("    pads appending to packets is NOT selected");
5397
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5398
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5399
                 (min_tmp + 8), (min_tmp + 128));
5400
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5401
                 1'b0, num_of_bd);
5402
        tmp_bd = num_of_bd + 1;
5403
        // set padding, remain the rest
5404 274 tadejm
        wait (wbm_working == 0);
5405 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5406
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5407
      end
5408
      else if ((i_length + 4) == (max_tmp - 16))
5409
      begin
5410
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5411
        $display("    pads appending to packets is selected");
5412
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5413
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5414
                 (min_tmp + 64 + 128), tmp_data);
5415
        if (tmp_bd > num_of_bd)
5416
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5417
                   tmp_bd, num_of_bd);
5418
        else
5419
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5420
                   tmp_bd, num_of_bd);
5421
        tmp_bd = num_of_bd + 1;
5422
        // reset padding, remain the rest
5423 274 tadejm
        wait (wbm_working == 0);
5424 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5425
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5426
      end
5427
      else if ((i_length + 4) == max_tmp)
5428
      begin
5429
        $display("    pads appending to packets is NOT selected");
5430
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5431
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5432
                 (max_tmp - (4 + 16)), max_tmp);
5433
        if (tmp_bd > num_of_bd)
5434
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5435
                   tmp_bd, num_of_bd);
5436
        else
5437
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5438
                   tmp_bd, num_of_bd);
5439
      end
5440
      // set length (loop variable)
5441
      if ((i_length + 4) < (min_tmp + 128))
5442
        i_length = i_length + 1;
5443
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5444
        i_length = 256;
5445
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5446
      begin
5447
        i_length = i_length + 128;
5448
        tmp_data = i_length + 4; // last tmp_data is ending length
5449
      end
5450
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5451
        i_length = max_tmp - (4 + 16);
5452
      else if ((i_length + 4) >= (max_tmp - 16))
5453
        i_length = i_length + 1;
5454
      else
5455
      begin
5456
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5457
        #10 $stop;
5458
      end
5459
      // the number of frame transmitted
5460
      num_of_frames = num_of_frames + 1;
5461
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5462
        num_of_bd = 0;
5463
      else
5464
        num_of_bd = num_of_bd + 1;
5465
    end
5466
    // disable TX
5467 274 tadejm
    wait (wbm_working == 0);
5468 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5469
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5470
    @(posedge wb_clk);
5471
    if(fail == 0)
5472
      test_ok;
5473
    else
5474
      fail = 0;
5475
  end
5476
 
5477
 
5478
  ////////////////////////////////////////////////////////////////////
5479
  ////                                                            ////
5480
  ////  Test transmit packets form MINFL to MAXFL sizes at        ////
5481
  ////  maximum TX buffer decriptors ( 100Mbps ).                 ////
5482
  ////                                                            ////
5483
  ////////////////////////////////////////////////////////////////////
5484
  if (test_num == 5) // with and without padding
5485
  begin
5486
    // TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
5487
    test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
5488
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
5489
 
5490
    // reset MAC registers
5491
    hard_reset;
5492
    // reset MAC and MII LOGIC with soft reset
5493 274 tadejm
//    reset_mac;
5494
//    reset_mii;
5495 209 tadejm
    // set wb slave response
5496
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5497
 
5498
    max_tmp = 0;
5499
    min_tmp = 0;
5500
    num_of_frames = 0;
5501
    num_of_bd = 0;
5502
    // set maximum TX buffer descriptors (128) - must be set before TX enable
5503 274 tadejm
    wait (wbm_working == 0);
5504 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5505
    // enable TX, set full-duplex mode, NO padding and CRC appending
5506 274 tadejm
    wait (wbm_working == 0);
5507 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5508
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5509
    // prepare two packets of MAXFL length
5510 274 tadejm
    wait (wbm_working == 0);
5511 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5512
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5513
    min_tmp = tmp[31:16];
5514
    st_data = 8'hA5;
5515
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
5516
    st_data = 8'h71;
5517
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
5518
    // check WB INT signal
5519
    if (wb_int !== 1'b0)
5520
    begin
5521
      test_fail("WB INT signal should not be set");
5522
      fail = fail + 1;
5523
    end
5524
 
5525
    // write to phy's control register for 100Mbps
5526
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
5527
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
5528
    speed = 100;
5529
 
5530
    i_length = (min_tmp - 4);
5531
    while (i_length <= (max_tmp - 4))
5532
    begin
5533
      // choose generating carrier sense and collision
5534
      case (i_length[1:0])
5535
      2'h0: // Interrupt is generated
5536
      begin
5537
        // Reset_tx_bd nable interrupt generation
5538
        // unmask interrupts
5539 274 tadejm
        wait (wbm_working == 0);
5540 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5541
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5542
        // not detect carrier sense in FD and no collision
5543
        eth_phy.carrier_sense_tx_fd_detect(0);
5544
        eth_phy.collision(0);
5545
      end
5546
      2'h1: // Interrupt is not generated
5547
      begin
5548
        // set_tx_bd enable interrupt generation
5549
        // mask interrupts
5550 274 tadejm
        wait (wbm_working == 0);
5551 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5552
        // detect carrier sense in FD and no collision
5553
        eth_phy.carrier_sense_tx_fd_detect(1);
5554
        eth_phy.collision(0);
5555
      end
5556
      2'h2: // Interrupt is not generated
5557
      begin
5558
        // set_tx_bd disable the interrupt generation
5559
        // unmask interrupts
5560 274 tadejm
        wait (wbm_working == 0);
5561 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
5562
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5563
        // not detect carrier sense in FD and set collision
5564
        eth_phy.carrier_sense_tx_fd_detect(0);
5565
        eth_phy.collision(1);
5566
      end
5567
      default: // 2'h3: // Interrupt is not generated
5568
      begin
5569
        // set_tx_bd disable the interrupt generation
5570
        // mask interrupts
5571 274 tadejm
        wait (wbm_working == 0);
5572 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5573
        // detect carrier sense in FD and set collision
5574
        eth_phy.carrier_sense_tx_fd_detect(1);
5575
        eth_phy.collision(1);
5576
      end
5577
      endcase
5578
      // first destination address on ethernet PHY
5579
      if (i_length[0] == 0)
5580
        eth_phy.set_tx_mem_addr(0);
5581
      else
5582
        eth_phy.set_tx_mem_addr(max_tmp);
5583
      // first 8 frames are transmitted with TX BD 0 (wrap bit on TX BD 0)
5584
      // number of all frames is 154 (146 without first 8)
5585
      if (num_of_frames < 8)
5586
      begin
5587
        case (i_length[1:0])
5588
        2'h0: // Interrupt is generated
5589
        begin
5590
          // enable interrupt generation
5591
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5592
          // interrupts are unmasked
5593
        end
5594
        2'h1: // Interrupt is not generated
5595
        begin
5596
          // enable interrupt generation
5597
          set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5598
          // interrupts are masked
5599
        end
5600
        2'h2: // Interrupt is not generated
5601
        begin
5602
          // disable interrupt generation
5603
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
5604
          // interrupts are unmasked
5605
        end
5606
        default: // 2'h3: // Interrupt is not generated
5607
        begin
5608
          // disable interrupt generation
5609
          set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
5610
          // interrupts are masked
5611
        end
5612
        endcase
5613
        // set wrap bit
5614
        set_tx_bd_wrap(0);
5615
      end
5616
      // after first 8 number of frames, 128 frames form TX BD 0 to 127 will be transmitted
5617
      else if ((num_of_frames - 8) == 0)
5618
      begin
5619
        tmp_len = i_length; // length of frame
5620
        tmp_bd_num = 0; // TX BD number
5621
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5622
        begin
5623
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5624
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5625
          if (tmp_len[0] == 0)
5626
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5627
          else
5628
            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));
5629
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5630
          if ((tmp_len + 4) < (min_tmp + 128))
5631
            tmp_len = tmp_len + 1;
5632
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5633
            tmp_len = 256;
5634
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5635
            tmp_len = tmp_len + 128;
5636
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5637
            tmp_len = max_tmp - (4 + 16);
5638
          else if ((tmp_len + 4) >= (max_tmp - 16))
5639
            tmp_len = tmp_len + 1;
5640
          // set TX BD number
5641
          tmp_bd_num = tmp_bd_num + 1;
5642
        end
5643
        // set wrap bit
5644
        set_tx_bd_wrap(127);
5645
      end
5646
      // after 128 + first 8 number of frames, 19 frames form TX BD 0 to 18 will be transmitted
5647
      else if ((num_of_frames - 8) == 20) // 128
5648
      begin
5649
        tmp_len = tmp_len; // length of frame remaines from previous settings
5650
        tmp_bd_num = 0; // TX BD number
5651
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
5652
        begin
5653
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
5654
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
5655
          if (tmp_len[0] == 0)
5656
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
5657
          else
5658
            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));
5659
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
5660
          if ((tmp_len + 4) < (min_tmp + 128))
5661
            tmp_len = tmp_len + 1;
5662
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5663
            tmp_len = 256;
5664
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
5665
            tmp_len = tmp_len + 128;
5666
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
5667
            tmp_len = max_tmp - (4 + 16);
5668
          else if ((tmp_len + 4) >= (max_tmp - 16))
5669
            tmp_len = tmp_len + 1;
5670
          // set TX BD number
5671
          tmp_bd_num = tmp_bd_num + 1;
5672
        end
5673
      end
5674
      // set ready bit
5675
      if (num_of_frames < 8)
5676
        set_tx_bd_ready(0, 0);
5677
      else if ((num_of_frames - 8) < 128)
5678
        set_tx_bd_ready((num_of_frames - 8), (num_of_frames - 8));
5679
      else if ((num_of_frames - 136) < 19)
5680
        set_tx_bd_ready((num_of_frames - 136), (num_of_frames - 136));
5681
      // CHECK END OF TRANSMITION
5682
      #1 check_tx_bd(num_of_bd, data);
5683
      if (i_length < min_tmp) // just first four
5684
      begin
5685
        while (data[15] === 1)
5686
        begin
5687
          #1 check_tx_bd(num_of_bd, data);
5688
          @(posedge wb_clk);
5689
        end
5690
        repeat (1) @(posedge wb_clk);
5691
      end
5692
      else if (i_length > (max_tmp - 8)) // just last four
5693
      begin
5694
        tmp = 0;
5695
        wait (MTxEn === 1'b1); // start transmit
5696
        while (tmp < (i_length - 20))
5697
        begin
5698
          #1 tmp = tmp + 1;
5699
          @(posedge wb_clk);
5700
        end
5701
        #1 check_tx_bd(num_of_bd, data);
5702
        while (data[15] === 1)
5703
        begin
5704
          #1 check_tx_bd(num_of_bd, data);
5705
          @(posedge wb_clk);
5706
        end
5707
        repeat (1) @(posedge wb_clk);
5708
      end
5709
      else
5710
      begin
5711
        wait (MTxEn === 1'b1); // start transmit
5712
        #1 check_tx_bd(num_of_bd, data);
5713
        if (data[15] !== 1)
5714
        begin
5715
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
5716
          fail = fail + 1;
5717
        end
5718
        wait (MTxEn === 1'b0); // end transmit
5719
        while (data[15] === 1)
5720
        begin
5721
          #1 check_tx_bd(num_of_bd, data);
5722
          @(posedge wb_clk);
5723
        end
5724
        repeat (1) @(posedge wb_clk);
5725
      end
5726
      // check length of a PACKET
5727
      if (eth_phy.tx_len != (i_length + 4))
5728
      begin
5729
        test_fail("Wrong length of the packet out from MAC");
5730
        fail = fail + 1;
5731
      end
5732
      // checking in the following if statement is performed only for first and last 64 lengths
5733
        // check transmitted TX packet data
5734
        if (i_length[0] == 0)
5735
        begin
5736
          check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
5737
        end
5738
        else
5739
        begin
5740
          check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
5741
        end
5742
        if (tmp > 0)
5743
        begin
5744
          test_fail("Wrong data of the transmitted packet");
5745
          fail = fail + 1;
5746
        end
5747
        // check transmited TX packet CRC
5748
        if (i_length[0] == 0)
5749
          check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
5750
        else
5751
          check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
5752
        if (tmp > 0)
5753
        begin
5754
          test_fail("Wrong CRC of the transmitted packet");
5755
          fail = fail + 1;
5756
        end
5757
      // check WB INT signal
5758
      if (i_length[1:0] == 2'h0)
5759
      begin
5760
        if (wb_int !== 1'b1)
5761
        begin
5762
          `TIME; $display("*E WB INT signal should be set");
5763
          test_fail("WB INT signal should be set");
5764
          fail = fail + 1;
5765
        end
5766
      end
5767
      else
5768
      begin
5769
        if (wb_int !== 1'b0)
5770
        begin
5771
          `TIME; $display("*E WB INT signal should not be set");
5772
          test_fail("WB INT signal should not be set");
5773
          fail = fail + 1;
5774
        end
5775
      end
5776
      // check TX buffer descriptor of a packet
5777
      check_tx_bd(num_of_bd, data);
5778
      if (i_length[1] == 1'b0) // interrupt enabled
5779
      begin
5780
        if ( ((data[15:0] !== 16'h7800) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5781
             ((data[15:0] !== 16'h5800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5782
        begin
5783
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5784
          test_fail("TX buffer descriptor status is not correct");
5785
          fail = fail + 1;
5786
        end
5787
      end
5788
      else // interrupt not enabled
5789
      begin
5790
        if ( ((data[15:0] !== 16'h3800)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
5791
             ((data[15:0] !== 16'h1800) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
5792
        begin
5793
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
5794
          test_fail("TX buffer descriptor status is not correct");
5795
          fail = fail + 1;
5796
        end
5797
      end
5798
      // clear first half of 8 frames from TX buffer descriptor 0
5799
      if (num_of_frames < 4)
5800
        clear_tx_bd(num_of_bd, num_of_bd);
5801
      // clear BD with wrap bit
5802
      if (num_of_frames == 140)
5803
        clear_tx_bd(127, 127);
5804
      // check interrupts
5805 274 tadejm
      wait (wbm_working == 0);
5806 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5807
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
5808
      begin
5809
        if ((data & `ETH_INT_TXB) !== 1'b1)
5810
        begin
5811
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
5812
          test_fail("Interrupt Transmit Buffer was not set");
5813
          fail = fail + 1;
5814
        end
5815
        if ((data & (~`ETH_INT_TXB)) !== 0)
5816
        begin
5817
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
5818
          test_fail("Other interrupts (except Transmit Buffer) were set");
5819
          fail = fail + 1;
5820
        end
5821
      end
5822
      else
5823
      begin
5824
        if (data !== 0)
5825
        begin
5826
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
5827
          test_fail("Any of interrupts (except Transmit Buffer) was set");
5828
          fail = fail + 1;
5829
        end
5830
      end
5831
      // clear interrupts
5832 274 tadejm
      wait (wbm_working == 0);
5833 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5834
      // check WB INT signal
5835
      if (wb_int !== 1'b0)
5836
      begin
5837
        test_fail("WB INT signal should not be set");
5838
        fail = fail + 1;
5839
      end
5840
      // INTERMEDIATE DISPLAYS
5841
      if ((i_length + 4) == (min_tmp + 7))
5842
      begin
5843
        // starting length is min_tmp, ending length is (min_tmp + 128)
5844
        $display("    pads appending to packets is NOT selected");
5845
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
5846
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
5847
                 min_tmp, (min_tmp + 7));
5848
        $display("    ->all packets were send from TX BD 0");
5849
        // set padding, remain the rest
5850 274 tadejm
        wait (wbm_working == 0);
5851 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5852
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5853
      end
5854
      else if ((i_length + 4) == (min_tmp + 128))
5855
      begin
5856
        // starting length is min_tmp, ending length is (min_tmp + 128)
5857
        $display("    pads appending to packets is NOT selected");
5858
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5859
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
5860
                 (min_tmp + 8), (min_tmp + 128));
5861
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5862
                 1'b0, num_of_bd);
5863
        tmp_bd = num_of_bd + 1;
5864
        // set padding, remain the rest
5865 274 tadejm
        wait (wbm_working == 0);
5866 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5867
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5868
      end
5869
      else if ((i_length + 4) == (max_tmp - 16))
5870
      begin
5871
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
5872
        $display("    pads appending to packets is selected");
5873
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5874
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
5875
                 (min_tmp + 64 + 128), tmp_data);
5876
        if (tmp_bd > num_of_bd)
5877
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5878
                   tmp_bd, num_of_bd);
5879
        else
5880
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5881
                   tmp_bd, num_of_bd);
5882
        tmp_bd = num_of_bd + 1;
5883
        // reset padding, remain the rest
5884 274 tadejm
        wait (wbm_working == 0);
5885 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5886
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5887
      end
5888
      else if ((i_length + 4) == max_tmp)
5889
      begin
5890
        $display("    pads appending to packets is NOT selected");
5891
        $display("    using all 128 BDs assigned to TX (wrap at 128th BD - TX BD 127)");
5892
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
5893
                 (max_tmp - (4 + 16)), max_tmp);
5894
        if (tmp_bd > num_of_bd)
5895
          $display("    ->packets were send from TX BD %0d to TX BD 127 and from TX BD 0 to TX BD %0d respectively",
5896
                   tmp_bd, num_of_bd);
5897
        else
5898
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
5899
                   tmp_bd, num_of_bd);
5900
      end
5901
      // set length (loop variable)
5902
      if ((i_length + 4) < (min_tmp + 128))
5903
        i_length = i_length + 1;
5904
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5905
        i_length = 256;
5906
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
5907
      begin
5908
        i_length = i_length + 128;
5909
        tmp_data = i_length + 4; // last tmp_data is ending length
5910
      end
5911
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
5912
        i_length = max_tmp - (4 + 16);
5913
      else if ((i_length + 4) >= (max_tmp - 16))
5914
        i_length = i_length + 1;
5915
      else
5916
      begin
5917
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
5918
        #10 $stop;
5919
      end
5920
      // the number of frame transmitted
5921
      num_of_frames = num_of_frames + 1;
5922
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
5923
        num_of_bd = 0;
5924
      else
5925
        num_of_bd = num_of_bd + 1;
5926
    end
5927
    // disable TX
5928 274 tadejm
    wait (wbm_working == 0);
5929 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
5930
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5931
    @(posedge wb_clk);
5932
    if(fail == 0)
5933
      test_ok;
5934
    else
5935
      fail = 0;
5936
  end
5937
 
5938
 
5939
  ////////////////////////////////////////////////////////////////////
5940
  ////                                                            ////
5941
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
5942
  ////  8 TX buffer decriptors ( 10Mbps ).                        ////
5943
  ////                                                            ////
5944
  ////////////////////////////////////////////////////////////////////
5945
  if (test_num == 6) // 
5946
  begin
5947
    // TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
5948
    test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
5949
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
5950
 
5951
    // reset MAC registers
5952
    hard_reset;
5953
    // reset MAC and MII LOGIC with soft reset
5954 274 tadejm
//    reset_mac;
5955
//    reset_mii;
5956 209 tadejm
    // set wb slave response
5957
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
5958
 
5959
    max_tmp = 0;
5960
    min_tmp = 0;
5961
    // set 8 TX buffer descriptors - must be set before TX enable
5962 274 tadejm
    wait (wbm_working == 0);
5963 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5964
    // enable TX, set full-duplex mode, padding and CRC appending
5965 274 tadejm
    wait (wbm_working == 0);
5966 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
5967
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5968
    // prepare two packets of MAXFL length
5969 274 tadejm
    wait (wbm_working == 0);
5970 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
5971
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
5972
    min_tmp = tmp[31:16];
5973
    st_data = 8'h12;
5974
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
5975
    st_data = 8'h34;
5976
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
5977
    // check WB INT signal
5978
    if (wb_int !== 1'b0)
5979
    begin
5980
      test_fail("WB INT signal should not be set");
5981
      fail = fail + 1;
5982
    end
5983
 
5984
    // write to phy's control register for 10Mbps
5985
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
5986
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
5987
    speed = 10;
5988
 
5989
    frame_started = 0;
5990
    num_of_frames = 0;
5991
    num_of_bd = 0;
5992
    i_length = 0; // 0;
5993
    while (i_length < 70) // (min_tmp - 4))
5994
    begin
5995
      #1;
5996
      // choose generating carrier sense and collision
5997
      case (i_length[1:0])
5998
      2'h0: // Interrupt is generated
5999
      begin
6000
        // Reset_tx_bd nable interrupt generation
6001
        // unmask interrupts
6002 274 tadejm
        wait (wbm_working == 0);
6003 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6004
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6005
        // not detect carrier sense in FD and no collision
6006
        eth_phy.carrier_sense_tx_fd_detect(0);
6007
        eth_phy.collision(0);
6008
      end
6009
      2'h1: // Interrupt is not generated
6010
      begin
6011
        // set_tx_bd enable interrupt generation
6012
        // mask interrupts
6013 274 tadejm
        wait (wbm_working == 0);
6014 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6015
        // detect carrier sense in FD and no collision
6016
        eth_phy.carrier_sense_tx_fd_detect(1);
6017
        eth_phy.collision(0);
6018
      end
6019
      2'h2: // Interrupt is not generated
6020
      begin
6021
        // set_tx_bd disable the interrupt generation
6022
        // unmask interrupts
6023 274 tadejm
        wait (wbm_working == 0);
6024 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6025
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6026
        // not detect carrier sense in FD and set collision
6027
        eth_phy.carrier_sense_tx_fd_detect(0);
6028
        eth_phy.collision(1);
6029
      end
6030
      default: // 2'h3: // Interrupt is not generated
6031
      begin
6032
        // set_tx_bd disable the interrupt generation
6033
        // mask interrupts
6034 274 tadejm
        wait (wbm_working == 0);
6035 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6036
        // detect carrier sense in FD and set collision
6037
        eth_phy.carrier_sense_tx_fd_detect(1);
6038
        eth_phy.collision(1);
6039
      end
6040
      endcase
6041
      #1;
6042
      // first destination address on ethernet PHY
6043
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6044
      // SET packets and wrap bit
6045
      // num_of_frames <= 9 => wrap set to TX BD 0
6046
      if (num_of_frames <= 9)
6047
      begin
6048
        tmp_len = i_length; // length of frame
6049
        tmp_bd_num = 0; // TX BD number
6050
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6051
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6052
        if (tmp_len[0] == 0)
6053
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6054
        else
6055
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6056
        // set wrap bit
6057
        set_tx_bd_wrap(0);
6058
      end
6059
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6060
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6061
      begin
6062
        tmp_len = i_length; // length of frame
6063
        tmp_bd_num = 0; // TX BD number
6064
        while (tmp_bd_num < 4) //
6065
        begin
6066
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6067
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6068
          if (tmp_len[0] == 0)
6069
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6070
          else
6071
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6072
          tmp_len = tmp_len + 1;
6073
          // set TX BD number
6074
          tmp_bd_num = tmp_bd_num + 1;
6075
        end
6076
        // set wrap bit
6077
        set_tx_bd_wrap(3);
6078
      end
6079
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6080
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6081
      begin
6082
        tmp_len = i_length; // length of frame
6083
        tmp_bd_num = 0; // TX BD number
6084
        while (tmp_bd_num < 5) //
6085
        begin
6086
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6087
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6088
          if (tmp_len[0] == 0)
6089
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6090
          else
6091
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6092
          tmp_len = tmp_len + 1;
6093
          // set TX BD number
6094
          tmp_bd_num = tmp_bd_num + 1;
6095
        end
6096
        // set wrap bit
6097
        set_tx_bd_wrap(4);
6098
      end
6099
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6100
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6101
      begin
6102
        tmp_len = i_length; // length of frame
6103
        tmp_bd_num = 0; // TX BD number
6104
        while (tmp_bd_num < 6) //
6105
        begin
6106
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6107
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6108
          if (tmp_len[0] == 0)
6109
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6110
          else
6111
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6112
          tmp_len = tmp_len + 1;
6113
          // set TX BD number
6114
          tmp_bd_num = tmp_bd_num + 1;
6115
        end
6116
        // set wrap bit
6117
        set_tx_bd_wrap(5);
6118
      end
6119
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6120
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6121
      begin
6122
        tmp_len = i_length; // length of frame
6123
        tmp_bd_num = 0; // TX BD number
6124
        while (tmp_bd_num < 7) //
6125
        begin
6126
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6127
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6128
          if (tmp_len[0] == 0)
6129
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6130
          else
6131
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6132
          tmp_len = tmp_len + 1;
6133
          // set TX BD number
6134
          tmp_bd_num = tmp_bd_num + 1;
6135
        end
6136
        // set wrap bit
6137
        set_tx_bd_wrap(6);
6138
      end
6139
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6140
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6141
      begin
6142
        tmp_len = i_length; // length of frame
6143
        tmp_bd_num = 0; // TX BD number
6144
        while (tmp_bd_num < 8) //
6145
        begin
6146
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6147
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6148
          if (tmp_len[0] == 0)
6149
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6150
          else
6151
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6152
          tmp_len = tmp_len + 1;
6153
          // set TX BD number
6154
          tmp_bd_num = tmp_bd_num + 1;
6155
        end
6156
        // set wrap bit
6157
        set_tx_bd_wrap(7);
6158
      end
6159
      #1;
6160
      // SET ready bit
6161
      if (num_of_frames < 10)
6162
        set_tx_bd_ready(0, 0);
6163
      else if (num_of_frames < 14)
6164
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6165
      else if (num_of_frames < 18)
6166
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6167
      else if (num_of_frames < 23)
6168
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6169
      else if (num_of_frames < 28)
6170
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6171
      else if (num_of_frames < 34)
6172
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6173
      else if (num_of_frames < 40)
6174
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6175
      else if (num_of_frames < 47)
6176
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6177
      else if (num_of_frames < 54)
6178
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6179
      else if (num_of_frames < 62)
6180
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6181
      else if (num_of_frames < 70)
6182
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6183
      // CHECK END OF TRANSMITION
6184
      frame_started = 0;
6185
      if (num_of_frames >= 5)
6186
        #1 check_tx_bd(num_of_bd, data);
6187
      fork
6188
      begin: fr_st
6189
        wait (MTxEn === 1'b1); // start transmit
6190
        frame_started = 1;
6191
      end
6192
      begin
6193
        repeat (30) @(posedge mtx_clk);
6194
        if (num_of_frames < 5)
6195
        begin
6196
          if (frame_started == 1)
6197
          begin
6198
            `TIME; $display("*E Frame should NOT start!");
6199
          end
6200
          disable fr_st;
6201
        end
6202
        else
6203
        begin
6204
          if (frame_started == 0)
6205
          begin
6206
            `TIME; $display("*W Frame should start!");
6207
            disable fr_st;
6208
          end
6209
        end
6210
      end
6211
      join
6212
      // check packets larger than 4 bytes
6213
      if (num_of_frames >= 5)
6214
      begin
6215
        wait (MTxEn === 1'b0); // end transmit
6216
        while (data[15] === 1)
6217
        begin
6218
          #1 check_tx_bd(num_of_bd, data);
6219
          @(posedge wb_clk);
6220
        end
6221
        repeat (1) @(posedge wb_clk);
6222
        // check length of a PACKET
6223
        if (i_length <= (min_tmp - 4))
6224
        begin
6225
          if (eth_phy.tx_len != min_tmp)
6226
          begin
6227
            test_fail("Wrong length of the packet out from MAC");
6228
            fail = fail + 1;
6229
          end
6230
        end
6231
        else
6232
        begin
6233
          if (eth_phy.tx_len != (i_length + 4))
6234
          begin
6235
            test_fail("Wrong length of the packet out from MAC");
6236
            fail = fail + 1;
6237
          end
6238
        end
6239
        // check transmitted TX packet data
6240
        if (i_length[0] == 0)
6241
        begin
6242
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6243
        end
6244
        else
6245
        begin
6246
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6247
        end
6248
        if (tmp > 0)
6249
        begin
6250
          test_fail("Wrong data of the transmitted packet");
6251
          fail = fail + 1;
6252
        end
6253
        // check transmited TX packet CRC
6254
        if (num_of_frames < (min_tmp - 4))
6255
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6256
        else
6257
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6258
        if (tmp > 0)
6259
        begin
6260
          test_fail("Wrong CRC of the transmitted packet");
6261
          fail = fail + 1;
6262
        end
6263
      end
6264
      // check WB INT signal
6265
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6266
      begin
6267
        if (wb_int !== 1'b1)
6268
        begin
6269
          `TIME; $display("*E WB INT signal should be set");
6270
          test_fail("WB INT signal should be set");
6271
          fail = fail + 1;
6272
        end
6273
      end
6274
      else
6275
      begin
6276
        if (wb_int !== 1'b0)
6277
        begin
6278
          `TIME; $display("*E WB INT signal should not be set");
6279
          test_fail("WB INT signal should not be set");
6280
          fail = fail + 1;
6281
        end
6282
      end
6283
      // check TX buffer descriptor of a packet
6284
      check_tx_bd(num_of_bd, data);
6285
      if (num_of_frames >= 5)
6286
      begin
6287
        if (i_length[1] == 1'b0) // interrupt enabled
6288
        begin
6289
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6290
               (data[15:0] !== 16'h5800) ) // without wrap bit
6291
          begin
6292
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6293
            test_fail("TX buffer descriptor status is not correct");
6294
            fail = fail + 1;
6295
          end
6296
        end
6297
        else // interrupt not enabled
6298
        begin
6299
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6300
               (data[15:0] !== 16'h1800) ) // without wrap bit
6301
          begin
6302
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6303
            test_fail("TX buffer descriptor status is not correct");
6304
            fail = fail + 1;
6305
          end
6306
        end
6307
      end
6308
      else
6309
      begin
6310
        if (data[15] !== 1'b1)
6311
        begin
6312
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6313
          test_fail("TX buffer descriptor status is not correct");
6314
          fail = fail + 1;
6315
        end
6316
      end
6317
      // clear TX BD with wrap bit
6318
      if (num_of_frames == 63)
6319
        clear_tx_bd(16, 16);
6320
      // check interrupts
6321 274 tadejm
      wait (wbm_working == 0);
6322 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6323
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6324
      begin
6325
        if ((data & `ETH_INT_TXB) !== 1'b1)
6326
        begin
6327
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6328
          test_fail("Interrupt Transmit Buffer was not set");
6329
          fail = fail + 1;
6330
        end
6331
        if ((data & (~`ETH_INT_TXB)) !== 0)
6332
        begin
6333
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6334
          test_fail("Other interrupts (except Transmit Buffer) were set");
6335
          fail = fail + 1;
6336
        end
6337
      end
6338
      else
6339
      begin
6340
        if (data !== 0)
6341
        begin
6342
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6343
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6344
          fail = fail + 1;
6345
        end
6346
      end
6347
      // clear interrupts
6348 274 tadejm
      wait (wbm_working == 0);
6349 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6350
      // check WB INT signal
6351
      if (wb_int !== 1'b0)
6352
      begin
6353
        test_fail("WB INT signal should not be set");
6354
        fail = fail + 1;
6355
      end
6356
      // INTERMEDIATE DISPLAYS
6357
      if (i_length == 3)
6358
      begin
6359
        $display("    pads appending to packets is selected");
6360
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6361
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6362
                 0, 3);
6363
      end
6364
      else if (i_length == 9)
6365
      begin
6366
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6367
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6368
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6369
                 5, 9);
6370
      end
6371
      else if (i_length == 17)
6372
      begin
6373
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6374
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6375
                 10, 17);
6376
      end
6377
      else if (i_length == 27)
6378
      begin
6379
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6380
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6381
                 18, 27);
6382
      end
6383
      else if (i_length == 40)
6384
      begin
6385
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6386
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6387
                 28, 40);
6388
      end
6389
      else if (i_length == 54)
6390
      begin
6391
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6392
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6393
                 41, 54);
6394
      end
6395
      else if (i_length == 69)
6396
      begin
6397
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6398
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6399
                 55, 69);
6400
      end
6401
      // set length (loop variable)
6402
      i_length = i_length + 1;
6403
      // the number of frame transmitted
6404
      num_of_frames = num_of_frames + 1;
6405
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6406
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6407
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6408
          (num_of_frames == 54) || (num_of_frames == 62))
6409
        num_of_bd = 0;
6410
      else
6411
        num_of_bd = num_of_bd + 1;
6412
    end
6413
    // disable TX
6414 274 tadejm
    wait (wbm_working == 0);
6415 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6416
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6417
    @(posedge wb_clk);
6418
    if(fail == 0)
6419
      test_ok;
6420
    else
6421
      fail = 0;
6422
  end
6423
 
6424
 
6425
  ////////////////////////////////////////////////////////////////////
6426
  ////                                                            ////
6427
  ////  Test transmit packets form 0 to (MINFL - 1) sizes at      ////
6428
  ////  8 TX buffer decriptors ( 100Mbps ).                       ////
6429
  ////                                                            ////
6430
  ////////////////////////////////////////////////////////////////////
6431
  if (test_num == 7) // 
6432
  begin
6433
    // TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
6434
    test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
6435
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
6436
 
6437
    // reset MAC registers
6438
    hard_reset;
6439
    // reset MAC and MII LOGIC with soft reset
6440 274 tadejm
//    reset_mac;
6441
//    reset_mii;
6442 209 tadejm
    // set wb slave response
6443
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6444
 
6445
    max_tmp = 0;
6446
    min_tmp = 0;
6447
    // set 8 TX buffer descriptors - must be set before TX enable
6448 274 tadejm
    wait (wbm_working == 0);
6449 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6450
    // enable TX, set full-duplex mode, padding and CRC appending
6451 274 tadejm
    wait (wbm_working == 0);
6452 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6453
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6454
    // prepare two packets of MAXFL length
6455 274 tadejm
    wait (wbm_working == 0);
6456 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6457
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6458
    min_tmp = tmp[31:16];
6459
    st_data = 8'h12;
6460
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6461
    st_data = 8'h34;
6462
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6463
    // check WB INT signal
6464
    if (wb_int !== 1'b0)
6465
    begin
6466
      test_fail("WB INT signal should not be set");
6467
      fail = fail + 1;
6468
    end
6469
 
6470
    // write to phy's control register for 100Mbps
6471
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
6472
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
6473
    speed = 100;
6474
 
6475
    frame_started = 0;
6476
    num_of_frames = 0;
6477
    num_of_bd = 0;
6478
    i_length = 0; // 0;
6479
    while (i_length < 70) // (min_tmp - 4))
6480
    begin
6481
      #1;
6482
      // choose generating carrier sense and collision
6483
      case (i_length[1:0])
6484
      2'h0: // Interrupt is generated
6485
      begin
6486
        // Reset_tx_bd nable interrupt generation
6487
        // unmask interrupts
6488 274 tadejm
        wait (wbm_working == 0);
6489 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6490
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6491
        // not detect carrier sense in FD and no collision
6492
        eth_phy.carrier_sense_tx_fd_detect(0);
6493
        eth_phy.collision(0);
6494
      end
6495
      2'h1: // Interrupt is not generated
6496
      begin
6497
        // set_tx_bd enable interrupt generation
6498
        // mask interrupts
6499 274 tadejm
        wait (wbm_working == 0);
6500 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6501
        // detect carrier sense in FD and no collision
6502
        eth_phy.carrier_sense_tx_fd_detect(1);
6503
        eth_phy.collision(0);
6504
      end
6505
      2'h2: // Interrupt is not generated
6506
      begin
6507
        // set_tx_bd disable the interrupt generation
6508
        // unmask interrupts
6509 274 tadejm
        wait (wbm_working == 0);
6510 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6511
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6512
        // not detect carrier sense in FD and set collision
6513
        eth_phy.carrier_sense_tx_fd_detect(0);
6514
        eth_phy.collision(1);
6515
      end
6516
      default: // 2'h3: // Interrupt is not generated
6517
      begin
6518
        // set_tx_bd disable the interrupt generation
6519
        // mask interrupts
6520 274 tadejm
        wait (wbm_working == 0);
6521 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6522
        // detect carrier sense in FD and set collision
6523
        eth_phy.carrier_sense_tx_fd_detect(1);
6524
        eth_phy.collision(1);
6525
      end
6526
      endcase
6527
      #1;
6528
      // first destination address on ethernet PHY
6529
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
6530
      // SET packets and wrap bit
6531
      // num_of_frames <= 9 => wrap set to TX BD 0
6532
      if (num_of_frames <= 9)
6533
      begin
6534
        tmp_len = i_length; // length of frame
6535
        tmp_bd_num = 0; // TX BD number
6536
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6537
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6538
        if (tmp_len[0] == 0)
6539
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6540
        else
6541
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6542
        // set wrap bit
6543
        set_tx_bd_wrap(0);
6544
      end
6545
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
6546
      else if ((num_of_frames == 10) || (num_of_frames == 14))
6547
      begin
6548
        tmp_len = i_length; // length of frame
6549
        tmp_bd_num = 0; // TX BD number
6550
        while (tmp_bd_num < 4) //
6551
        begin
6552
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6553
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6554
          if (tmp_len[0] == 0)
6555
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6556
          else
6557
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6558
          tmp_len = tmp_len + 1;
6559
          // set TX BD number
6560
          tmp_bd_num = tmp_bd_num + 1;
6561
        end
6562
        // set wrap bit
6563
        set_tx_bd_wrap(3);
6564
      end
6565
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
6566
      else if ((num_of_frames == 18) || (num_of_frames == 23))
6567
      begin
6568
        tmp_len = i_length; // length of frame
6569
        tmp_bd_num = 0; // TX BD number
6570
        while (tmp_bd_num < 5) //
6571
        begin
6572
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6573
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6574
          if (tmp_len[0] == 0)
6575
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6576
          else
6577
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6578
          tmp_len = tmp_len + 1;
6579
          // set TX BD number
6580
          tmp_bd_num = tmp_bd_num + 1;
6581
        end
6582
        // set wrap bit
6583
        set_tx_bd_wrap(4);
6584
      end
6585
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
6586
      else if ((num_of_frames == 28) || (num_of_frames == 34))
6587
      begin
6588
        tmp_len = i_length; // length of frame
6589
        tmp_bd_num = 0; // TX BD number
6590
        while (tmp_bd_num < 6) //
6591
        begin
6592
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6593
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6594
          if (tmp_len[0] == 0)
6595
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6596
          else
6597
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6598
          tmp_len = tmp_len + 1;
6599
          // set TX BD number
6600
          tmp_bd_num = tmp_bd_num + 1;
6601
        end
6602
        // set wrap bit
6603
        set_tx_bd_wrap(5);
6604
      end
6605
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
6606
      else if ((num_of_frames == 40) || (num_of_frames == 47))
6607
      begin
6608
        tmp_len = i_length; // length of frame
6609
        tmp_bd_num = 0; // TX BD number
6610
        while (tmp_bd_num < 7) //
6611
        begin
6612
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6613
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6614
          if (tmp_len[0] == 0)
6615
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6616
          else
6617
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6618
          tmp_len = tmp_len + 1;
6619
          // set TX BD number
6620
          tmp_bd_num = tmp_bd_num + 1;
6621
        end
6622
        // set wrap bit
6623
        set_tx_bd_wrap(6);
6624
      end
6625
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
6626
      else if ((num_of_frames == 54) || (num_of_frames == 62))
6627
      begin
6628
        tmp_len = i_length; // length of frame
6629
        tmp_bd_num = 0; // TX BD number
6630
        while (tmp_bd_num < 8) //
6631
        begin
6632
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
6633
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
6634
          if (tmp_len[0] == 0)
6635
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
6636
          else
6637
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
6638
          tmp_len = tmp_len + 1;
6639
          // set TX BD number
6640
          tmp_bd_num = tmp_bd_num + 1;
6641
        end
6642
        // set wrap bit
6643
        set_tx_bd_wrap(7);
6644
      end
6645
      #1;
6646
      // SET ready bit
6647
      if (num_of_frames < 10)
6648
        set_tx_bd_ready(0, 0);
6649
      else if (num_of_frames < 14)
6650
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
6651
      else if (num_of_frames < 18)
6652
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
6653
      else if (num_of_frames < 23)
6654
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
6655
      else if (num_of_frames < 28)
6656
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
6657
      else if (num_of_frames < 34)
6658
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
6659
      else if (num_of_frames < 40)
6660
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
6661
      else if (num_of_frames < 47)
6662
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
6663
      else if (num_of_frames < 54)
6664
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
6665
      else if (num_of_frames < 62)
6666
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
6667
      else if (num_of_frames < 70)
6668
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
6669
      // CHECK END OF TRANSMITION
6670
      frame_started = 0;
6671
      if (num_of_frames >= 5)
6672
        #1 check_tx_bd(num_of_bd, data);
6673
      fork
6674
      begin: fr_st1
6675
        wait (MTxEn === 1'b1); // start transmit
6676
        frame_started = 1;
6677
      end
6678
      begin
6679 279 mohor
        repeat (50) @(posedge mtx_clk);     // Increased from 30 to 50
6680 209 tadejm
        if (num_of_frames < 5)
6681
        begin
6682
          if (frame_started == 1)
6683
          begin
6684
            `TIME; $display("*E Frame should NOT start!");
6685
          end
6686
          disable fr_st1;
6687
        end
6688
        else
6689
        begin
6690
          if (frame_started == 0)
6691
          begin
6692
            `TIME; $display("*W Frame should start!");
6693
            disable fr_st1;
6694
          end
6695
        end
6696
      end
6697
      join
6698
      // check packets larger than 4 bytes
6699
      if (num_of_frames >= 5)
6700
      begin
6701
        wait (MTxEn === 1'b0); // end transmit
6702
        while (data[15] === 1)
6703
        begin
6704
          #1 check_tx_bd(num_of_bd, data);
6705
          @(posedge wb_clk);
6706
        end
6707
        repeat (1) @(posedge wb_clk);
6708
        // check length of a PACKET
6709
        if (i_length <= (min_tmp - 4))
6710
        begin
6711
          if (eth_phy.tx_len != min_tmp)
6712
          begin
6713
            test_fail("Wrong length of the packet out from MAC");
6714
            fail = fail + 1;
6715
          end
6716
        end
6717
        else
6718
        begin
6719
          if (eth_phy.tx_len != (i_length + 4))
6720
          begin
6721
            test_fail("Wrong length of the packet out from MAC");
6722
            fail = fail + 1;
6723
          end
6724
        end
6725
        // check transmitted TX packet data
6726
        if (i_length[0] == 0)
6727
        begin
6728
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
6729
        end
6730
        else
6731
        begin
6732
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
6733
        end
6734
        if (tmp > 0)
6735
        begin
6736
          test_fail("Wrong data of the transmitted packet");
6737
          fail = fail + 1;
6738
        end
6739
        // check transmited TX packet CRC
6740
        if (num_of_frames < (min_tmp - 4))
6741
          #1 check_tx_crc((num_of_frames * 16), (min_tmp - 4), 1'b0, tmp); // length without CRC
6742
        else
6743
          #1 check_tx_crc((num_of_frames * 16), i_length, 1'b0, tmp); // length without CRC
6744
        if (tmp > 0)
6745
        begin
6746
          test_fail("Wrong CRC of the transmitted packet");
6747
          fail = fail + 1;
6748
        end
6749
      end
6750
      // check WB INT signal
6751
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
6752
      begin
6753
        if (wb_int !== 1'b1)
6754
        begin
6755
          `TIME; $display("*E WB INT signal should be set");
6756
          test_fail("WB INT signal should be set");
6757
          fail = fail + 1;
6758
        end
6759
      end
6760
      else
6761
      begin
6762
        if (wb_int !== 1'b0)
6763
        begin
6764
          `TIME; $display("*E WB INT signal should not be set");
6765
          test_fail("WB INT signal should not be set");
6766
          fail = fail + 1;
6767
        end
6768
      end
6769
      // check TX buffer descriptor of a packet
6770
      check_tx_bd(num_of_bd, data);
6771
      if (num_of_frames >= 5)
6772
      begin
6773
        if (i_length[1] == 1'b0) // interrupt enabled
6774
        begin
6775
          if ( (data[15:0] !== 16'h7800) && // wrap bit
6776
               (data[15:0] !== 16'h5800) ) // without wrap bit
6777
          begin
6778
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6779
            test_fail("TX buffer descriptor status is not correct");
6780
            fail = fail + 1;
6781
          end
6782
        end
6783
        else // interrupt not enabled
6784
        begin
6785
          if ( (data[15:0] !== 16'h3800) && // wrap bit
6786
               (data[15:0] !== 16'h1800) ) // without wrap bit
6787
          begin
6788
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6789
            test_fail("TX buffer descriptor status is not correct");
6790
            fail = fail + 1;
6791
          end
6792
        end
6793
      end
6794
      else
6795
      begin
6796
        if (data[15] !== 1'b1)
6797
        begin
6798
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
6799
          test_fail("TX buffer descriptor status is not correct");
6800
          fail = fail + 1;
6801
        end
6802
      end
6803
      // clear TX BD with wrap bit
6804
      if (num_of_frames == 63)
6805
        clear_tx_bd(16, 16);
6806
      // check interrupts
6807 274 tadejm
      wait (wbm_working == 0);
6808 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6809
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
6810
      begin
6811
        if ((data & `ETH_INT_TXB) !== 1'b1)
6812
        begin
6813
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
6814
          test_fail("Interrupt Transmit Buffer was not set");
6815
          fail = fail + 1;
6816
        end
6817
        if ((data & (~`ETH_INT_TXB)) !== 0)
6818
        begin
6819
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
6820
          test_fail("Other interrupts (except Transmit Buffer) were set");
6821
          fail = fail + 1;
6822
        end
6823
      end
6824
      else
6825
      begin
6826
        if (data !== 0)
6827
        begin
6828
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
6829
          test_fail("Any of interrupts (except Transmit Buffer) was set");
6830
          fail = fail + 1;
6831
        end
6832
      end
6833
      // clear interrupts
6834 274 tadejm
      wait (wbm_working == 0);
6835 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6836
      // check WB INT signal
6837
      if (wb_int !== 1'b0)
6838
      begin
6839
        test_fail("WB INT signal should not be set");
6840
        fail = fail + 1;
6841
      end
6842
      // INTERMEDIATE DISPLAYS
6843
      if (i_length == 3)
6844
      begin
6845
        $display("    pads appending to packets is selected");
6846
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6847
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
6848
                 0, 3);
6849
      end
6850
      else if (i_length == 9)
6851
      begin
6852
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
6853
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
6854
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6855
                 5, 9);
6856
      end
6857
      else if (i_length == 17)
6858
      begin
6859
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
6860
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6861
                 10, 17);
6862
      end
6863
      else if (i_length == 27)
6864
      begin
6865
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
6866
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6867
                 18, 27);
6868
      end
6869
      else if (i_length == 40)
6870
      begin
6871
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
6872
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6873
                 28, 40);
6874
      end
6875
      else if (i_length == 54)
6876
      begin
6877
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
6878
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6879
                 41, 54);
6880
      end
6881
      else if (i_length == 69)
6882
      begin
6883
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
6884
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
6885
                 55, 69);
6886
      end
6887
      // set length (loop variable)
6888
      i_length = i_length + 1;
6889
      // the number of frame transmitted
6890
      num_of_frames = num_of_frames + 1;
6891
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
6892
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
6893
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
6894
          (num_of_frames == 54) || (num_of_frames == 62))
6895
        num_of_bd = 0;
6896
      else
6897
        num_of_bd = num_of_bd + 1;
6898
    end
6899
    // disable TX
6900
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
6901
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6902
    @(posedge wb_clk);
6903
    if(fail == 0)
6904
      test_ok;
6905
    else
6906
      fail = 0;
6907
  end
6908
 
6909
 
6910
  ////////////////////////////////////////////////////////////////////
6911
  ////                                                            ////
6912 243 tadejm
  ////  Test transmit packets (no pads) from 0 to (MINFL - 1)     ////
6913 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 10Mbps ).               ////
6914
  ////                                                            ////
6915
  ////////////////////////////////////////////////////////////////////
6916
  if (test_num == 8) // 
6917
  begin
6918 243 tadejm
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
6919
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
6920
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
6921 279 mohor
 
6922 209 tadejm
    // reset MAC registers
6923
    hard_reset;
6924
    // reset MAC and MII LOGIC with soft reset
6925 274 tadejm
//    reset_mac;
6926
//    reset_mii;
6927 209 tadejm
    // set wb slave response
6928
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
6929
 
6930
    max_tmp = 0;
6931
    min_tmp = 0;
6932
    // set 8 TX buffer descriptors - must be set before TX enable
6933 274 tadejm
    wait (wbm_working == 0);
6934 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6935
    // enable TX, set full-duplex mode, padding and CRC appending
6936 274 tadejm
    wait (wbm_working == 0);
6937 243 tadejm
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
6938
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
6939 209 tadejm
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6940
    // prepare two packets of MAXFL length
6941 274 tadejm
    wait (wbm_working == 0);
6942 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6943
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
6944
    min_tmp = tmp[31:16];
6945
    st_data = 8'h12;
6946
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
6947
    st_data = 8'h34;
6948
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
6949
    // check WB INT signal
6950
    if (wb_int !== 1'b0)
6951
    begin
6952
      test_fail("WB INT signal should not be set");
6953
      fail = fail + 1;
6954
    end
6955
 
6956
    // write to phy's control register for 10Mbps
6957
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
6958
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
6959
    speed = 10;
6960
 
6961
    frame_started = 0;
6962
    num_of_frames = 0;
6963
    num_of_bd = 0;
6964
    i_length = 0; // 0;
6965
    while (i_length < 70) // (min_tmp - 4))
6966
    begin
6967
      #1;
6968
      // choose generating carrier sense and collision
6969
      case (i_length[1:0])
6970
      2'h0: // Interrupt is generated
6971
      begin
6972
        // Reset_tx_bd nable interrupt generation
6973
        // unmask interrupts
6974 274 tadejm
        wait (wbm_working == 0);
6975 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6976
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6977
        // not detect carrier sense in FD and no collision
6978
        eth_phy.carrier_sense_tx_fd_detect(0);
6979
        eth_phy.collision(0);
6980
      end
6981
      2'h1: // Interrupt is not generated
6982
      begin
6983
        // set_tx_bd enable interrupt generation
6984
        // mask interrupts
6985 274 tadejm
        wait (wbm_working == 0);
6986 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6987
        // detect carrier sense in FD and no collision
6988
        eth_phy.carrier_sense_tx_fd_detect(1);
6989
        eth_phy.collision(0);
6990
      end
6991
      2'h2: // Interrupt is not generated
6992
      begin
6993
        // set_tx_bd disable the interrupt generation
6994
        // unmask interrupts
6995 274 tadejm
        wait (wbm_working == 0);
6996 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
6997
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
6998
        // not detect carrier sense in FD and set collision
6999
        eth_phy.carrier_sense_tx_fd_detect(0);
7000
        eth_phy.collision(1);
7001
      end
7002
      default: // 2'h3: // Interrupt is not generated
7003
      begin
7004
        // set_tx_bd disable the interrupt generation
7005
        // mask interrupts
7006 274 tadejm
        wait (wbm_working == 0);
7007 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7008
        // detect carrier sense in FD and set collision
7009
        eth_phy.carrier_sense_tx_fd_detect(1);
7010
        eth_phy.collision(1);
7011
      end
7012
      endcase
7013 243 tadejm
//      // append CRC
7014
//      if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7015
//      begin
7016
//        append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
7017
//      end
7018 209 tadejm
      #1;
7019
      // first destination address on ethernet PHY
7020
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7021
      // SET packets and wrap bit
7022
      // num_of_frames <= 9 => wrap set to TX BD 0
7023 243 tadejm
      if (num_of_frames <= 5)
7024
        begin
7025
          tmp_len = i_length; // length of frame
7026
          tmp_bd_num = 0; // TX BD number
7027
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7028
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7029 274 tadejm
 
7030 243 tadejm
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
7031 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
7032 243 tadejm
          else
7033 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7034 243 tadejm
          // set wrap bit
7035
          set_tx_bd_wrap(0);
7036
        end
7037
        else if (num_of_frames <= 9)
7038
        begin
7039
          tmp_len = i_length; // length of frame
7040
          tmp_bd_num = 0; // TX BD number
7041
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7042
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7043
          if (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
7044 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7045 243 tadejm
          else
7046
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7047
          // set wrap bit
7048
          set_tx_bd_wrap(0);
7049 279 mohor
        end
7050
        // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7051
        else if ((num_of_frames == 10) || (num_of_frames == 14))
7052 209 tadejm
        begin
7053 279 mohor
          tmp_len = i_length; // length of frame
7054
          tmp_bd_num = 0; // TX BD number
7055
          while (tmp_bd_num < 4)
7056
          begin
7057
            // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7058
            // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7059
            if (tmp_len[0] == 0)
7060
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7061
            else
7062
              set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7063
            tmp_len = tmp_len + 1;
7064
            // set TX BD number
7065
            tmp_bd_num = tmp_bd_num + 1;
7066
          end
7067
          // set wrap bit
7068
          set_tx_bd_wrap(3);
7069 209 tadejm
        end
7070
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7071
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7072
      begin
7073
        tmp_len = i_length; // length of frame
7074
        tmp_bd_num = 0; // TX BD number
7075
        while (tmp_bd_num < 5) //
7076
        begin
7077
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7078
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7079
          if (tmp_len[0] == 0)
7080 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7081 243 tadejm
          else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
7082
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
7083
                      ((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
7084 279 mohor
 
7085 209 tadejm
          tmp_len = tmp_len + 1;
7086
          // set TX BD number
7087
          tmp_bd_num = tmp_bd_num + 1;
7088
        end
7089
        // set wrap bit
7090
        set_tx_bd_wrap(4);
7091
      end
7092
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7093
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7094
      begin
7095
        tmp_len = i_length; // length of frame
7096
        tmp_bd_num = 0; // TX BD number
7097
        while (tmp_bd_num < 6) //
7098
        begin
7099
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7100
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7101
          if (tmp_len[0] == 0)
7102 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7103 209 tadejm
          else
7104 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7105 209 tadejm
          tmp_len = tmp_len + 1;
7106
          // set TX BD number
7107
          tmp_bd_num = tmp_bd_num + 1;
7108
        end
7109
        // set wrap bit
7110
        set_tx_bd_wrap(5);
7111
      end
7112
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7113
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7114
      begin
7115
        tmp_len = i_length; // length of frame
7116
        tmp_bd_num = 0; // TX BD number
7117
        while (tmp_bd_num < 7) //
7118
        begin
7119
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7120
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7121
          if (tmp_len[0] == 0)
7122 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7123 209 tadejm
          else
7124 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7125 209 tadejm
          tmp_len = tmp_len + 1;
7126
          // set TX BD number
7127
          tmp_bd_num = tmp_bd_num + 1;
7128
        end
7129
        // set wrap bit
7130
        set_tx_bd_wrap(6);
7131
      end
7132
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7133
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7134
      begin
7135
        tmp_len = i_length; // length of frame
7136
        tmp_bd_num = 0; // TX BD number
7137
        while (tmp_bd_num < 8) //
7138
        begin
7139
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7140
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7141
          if (tmp_len[0] == 0)
7142 279 mohor
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
7143 209 tadejm
          else
7144 243 tadejm
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
7145 209 tadejm
          tmp_len = tmp_len + 1;
7146
          // set TX BD number
7147
          tmp_bd_num = tmp_bd_num + 1;
7148
        end
7149
        // set wrap bit
7150
        set_tx_bd_wrap(7);
7151
      end
7152
      #1;
7153
      // SET ready bit
7154
      if (num_of_frames < 10)
7155
        set_tx_bd_ready(0, 0);
7156
      else if (num_of_frames < 14)
7157
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7158
      else if (num_of_frames < 18)
7159
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7160
      else if (num_of_frames < 23)
7161
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7162
      else if (num_of_frames < 28)
7163
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7164
      else if (num_of_frames < 34)
7165
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7166
      else if (num_of_frames < 40)
7167
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7168
      else if (num_of_frames < 47)
7169
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7170
      else if (num_of_frames < 54)
7171
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7172
      else if (num_of_frames < 62)
7173
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7174
      else if (num_of_frames < 70)
7175
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7176
      // CHECK END OF TRANSMITION
7177
      frame_started = 0;
7178
      if (num_of_frames >= 5)
7179
        #1 check_tx_bd(num_of_bd, data);
7180
      fork
7181
      begin: fr_st2
7182
        wait (MTxEn === 1'b1); // start transmit
7183
        frame_started = 1;
7184
      end
7185
      begin
7186
        repeat (30) @(posedge mtx_clk);
7187
        if (num_of_frames < 5)
7188
        begin
7189
          if (frame_started == 1)
7190
          begin
7191
            `TIME; $display("*E Frame should NOT start!");
7192
          end
7193
          disable fr_st2;
7194
        end
7195
        else
7196
        begin
7197
          if (frame_started == 0)
7198
          begin
7199
            `TIME; $display("*W Frame should start!");
7200
            disable fr_st2;
7201
          end
7202
        end
7203
      end
7204
      join
7205 279 mohor
 
7206
 
7207 209 tadejm
      // check packets larger than 4 bytes
7208
      if (num_of_frames >= 5)
7209
      begin
7210
        wait (MTxEn === 1'b0); // end transmit
7211
        while (data[15] === 1)
7212
        begin
7213
          #1 check_tx_bd(num_of_bd, data);
7214
          @(posedge wb_clk);
7215
        end
7216
        repeat (1) @(posedge wb_clk);
7217 274 tadejm
 
7218
 
7219 279 mohor
        // check length of a PACKET     // Check this if it is OK igor
7220
        if (num_of_frames < 6)
7221
          begin
7222
            if (eth_phy.tx_len != (i_length + 4))
7223
              begin
7224
                `TIME; $display("*E Wrong length of the packet out from MAC");
7225
                test_fail("Wrong length of the packet out from MAC");
7226
                fail = fail + 1;
7227
              end
7228
          end
7229
        else if (num_of_frames != 23) // 6 - 53 except 23
7230
          begin
7231
            if (i_length[0] == 1'b0)
7232
              begin
7233
                if (eth_phy.tx_len != i_length)
7234
                  begin
7235
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7236
                    test_fail("Wrong length of the packet out from MAC");
7237
                    fail = fail + 1;
7238
                  end
7239
              end
7240
            else
7241
              begin
7242
                if (eth_phy.tx_len != (i_length + 4))
7243
                  begin
7244
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7245
                    test_fail("Wrong length of the packet out from MAC");
7246
                    fail = fail + 1;
7247
                  end
7248
              end
7249
          end
7250
        else // num_of_frames == 23
7251
          begin
7252
            if (data[12]) // Padding
7253
              begin
7254
                if (eth_phy.tx_len != (64))
7255
                  begin
7256
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7257
                    test_fail("Wrong length of the packet out from MAC");
7258
                    fail = fail + 1;
7259
                  end
7260
              end
7261
            else
7262
              begin
7263
                if (eth_phy.tx_len != (i_length + 4))
7264
                  begin
7265
                    `TIME; $display("*E Wrong length of the packet out from MAC");
7266
                    test_fail("Wrong length of the packet out from MAC");
7267
                    fail = fail + 1;
7268
                  end
7269
              end
7270
          end
7271
 
7272 209 tadejm
        // check transmitted TX packet data
7273
        if (i_length[0] == 0)
7274
        begin
7275
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7276
        end
7277 243 tadejm
        else if (num_of_frames == 23) // i_length[0] == 1 here
7278
        begin
7279 279 mohor
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7280
          #1 check_tx_packet( 0, (num_of_frames * 16 + i_length), (min_tmp - i_length - 4), tmp);
7281 243 tadejm
        end
7282 209 tadejm
        else
7283
        begin
7284
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7285
        end
7286
        if (tmp > 0)
7287
        begin
7288
          test_fail("Wrong data of the transmitted packet");
7289
          fail = fail + 1;
7290
        end
7291
        // check transmited TX packet CRC
7292 243 tadejm
        #1;
7293
        if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
7294
        begin
7295
        end
7296
        else
7297
          check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7298 209 tadejm
        if (tmp > 0)
7299
        begin
7300
          test_fail("Wrong CRC of the transmitted packet");
7301
          fail = fail + 1;
7302
        end
7303
      end
7304
      // check WB INT signal
7305
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7306
      begin
7307
        if (wb_int !== 1'b1)
7308
        begin
7309
          `TIME; $display("*E WB INT signal should be set");
7310
          test_fail("WB INT signal should be set");
7311
          fail = fail + 1;
7312
        end
7313
      end
7314
      else
7315
      begin
7316
        if (wb_int !== 1'b0)
7317
        begin
7318
          `TIME; $display("*E WB INT signal should not be set");
7319
          test_fail("WB INT signal should not be set");
7320
          fail = fail + 1;
7321
        end
7322
      end
7323
      // check TX buffer descriptor of a packet
7324
      check_tx_bd(num_of_bd, data);
7325 279 mohor
 
7326 209 tadejm
      if (num_of_frames >= 5)
7327
      begin
7328 243 tadejm
        if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
7329 209 tadejm
        begin
7330 243 tadejm
          if ( (data[15:0] !== 16'h6000) &&  // wrap bit
7331
               (data[15:0] !== 16'h4000) )  // without wrap bit
7332 209 tadejm
          begin
7333 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 1: %0h", data[15:0]);
7334 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7335
            fail = fail + 1;
7336
          end
7337
        end
7338 243 tadejm
        else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
7339 209 tadejm
        begin
7340 243 tadejm
          if ( (data[15:0] !== 16'h2000) && // wrap bit
7341
               (data[15:0] !== 16'h0000) ) // without wrap bit
7342
          begin
7343 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 2: %0h", data[15:0]);
7344 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7345
            fail = fail + 1;
7346
          end
7347
        end
7348
        else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
7349
        begin
7350
          if ( (data[15:0] !== 16'h6800) && // wrap bit
7351
               (data[15:0] !== 16'h4800) ) // without wrap bit
7352
          begin
7353 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 3: %0h", data[15:0]);
7354 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7355
            fail = fail + 1;
7356
          end
7357
        end
7358
        else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7359
        begin
7360
          if ( (data[15:0] !== 16'h2800) && // wrap bit
7361
               (data[15:0] !== 16'h0800) ) // without wrap bit
7362
          begin
7363 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 4: %0h", data[15:0]);
7364 243 tadejm
            test_fail("TX buffer descriptor status is not correct");
7365
            fail = fail + 1;
7366
          end
7367
        end
7368
        else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
7369
        begin
7370 209 tadejm
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7371
               (data[15:0] !== 16'h1800) ) // without wrap bit
7372
          begin
7373 279 mohor
            `TIME; $display("*E TX buffer descriptor status is not correct 5: %0h", data[15:0]);
7374 209 tadejm
            test_fail("TX buffer descriptor status is not correct");
7375
            fail = fail + 1;
7376
          end
7377
        end
7378
      end
7379
      else
7380
      begin
7381
        if (data[15] !== 1'b1)
7382
        begin
7383
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7384
          test_fail("TX buffer descriptor status is not correct");
7385
          fail = fail + 1;
7386
        end
7387
      end
7388
      // clear TX BD with wrap bit
7389
      if (num_of_frames == 63)
7390
        clear_tx_bd(16, 16);
7391
      // check interrupts
7392 274 tadejm
      wait (wbm_working == 0);
7393 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7394
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7395
      begin
7396
        if ((data & `ETH_INT_TXB) !== 1'b1)
7397
        begin
7398
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7399
          test_fail("Interrupt Transmit Buffer was not set");
7400
          fail = fail + 1;
7401
        end
7402
        if ((data & (~`ETH_INT_TXB)) !== 0)
7403
        begin
7404
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7405
          test_fail("Other interrupts (except Transmit Buffer) were set");
7406
          fail = fail + 1;
7407
        end
7408
      end
7409
      else
7410
      begin
7411
        if (data !== 0)
7412
        begin
7413
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7414
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7415
          fail = fail + 1;
7416
        end
7417
      end
7418
      // clear interrupts
7419 274 tadejm
      wait (wbm_working == 0);
7420 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7421
      // check WB INT signal
7422
      if (wb_int !== 1'b0)
7423
      begin
7424
        test_fail("WB INT signal should not be set");
7425
        fail = fail + 1;
7426
      end
7427
      // INTERMEDIATE DISPLAYS
7428
      if (i_length == 3)
7429
      begin
7430 279 mohor
        $display("    pads appending to packets is not selected (except for 0x23)");
7431 209 tadejm
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7432
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7433
                 0, 3);
7434
      end
7435
      else if (i_length == 9)
7436
      begin
7437
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7438
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7439
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7440
                 5, 9);
7441
      end
7442
      else if (i_length == 17)
7443
      begin
7444
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7445
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7446
                 10, 17);
7447
      end
7448
      else if (i_length == 27)
7449
      begin
7450
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7451
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7452
                 18, 27);
7453
      end
7454
      else if (i_length == 40)
7455
      begin
7456
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7457
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7458
                 28, 40);
7459
      end
7460
      else if (i_length == 54)
7461
      begin
7462
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7463
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7464
                 41, 54);
7465
      end
7466
      else if (i_length == 69)
7467
      begin
7468
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7469
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7470
                 55, 69);
7471
      end
7472
      // set length (loop variable)
7473
      i_length = i_length + 1;
7474
      // the number of frame transmitted
7475
      num_of_frames = num_of_frames + 1;
7476
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7477
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7478
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7479
          (num_of_frames == 54) || (num_of_frames == 62))
7480
        num_of_bd = 0;
7481
      else
7482
        num_of_bd = num_of_bd + 1;
7483
    end
7484
    // disable TX
7485 274 tadejm
    wait (wbm_working == 0);
7486 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7487
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7488
    @(posedge wb_clk);
7489
    if(fail == 0)
7490
      test_ok;
7491
    else
7492
      fail = 0;
7493
  end
7494
 
7495
 
7496
  ////////////////////////////////////////////////////////////////////
7497
  ////                                                            ////
7498 243 tadejm
  ////  Test transmit packets (no pads) form 0 to (MINFL - 1)     ////
7499 209 tadejm
  ////  sizes at 8 TX buffer decriptors ( 100Mbps ).              ////
7500
  ////                                                            ////
7501
  ////////////////////////////////////////////////////////////////////
7502
  if (test_num == 9) // 
7503
  begin
7504 243 tadejm
    // TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )
7505
    test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
7506
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
7507 209 tadejm
 
7508
    // reset MAC registers
7509
    hard_reset;
7510
    // reset MAC and MII LOGIC with soft reset
7511 274 tadejm
//    reset_mac;
7512
//    reset_mii;
7513 209 tadejm
    // set wb slave response
7514
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7515
 
7516
    max_tmp = 0;
7517
    min_tmp = 0;
7518
    // set 8 TX buffer descriptors - must be set before TX enable
7519 274 tadejm
    wait (wbm_working == 0);
7520 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7521
    // enable TX, set full-duplex mode, padding and CRC appending
7522 274 tadejm
    wait (wbm_working == 0);
7523 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
7524
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7525
    // prepare two packets of MAXFL length
7526 274 tadejm
    wait (wbm_working == 0);
7527 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7528
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
7529
    min_tmp = tmp[31:16];
7530
    st_data = 8'h12;
7531
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
7532
    st_data = 8'h34;
7533
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC
7534
    // check WB INT signal
7535
    if (wb_int !== 1'b0)
7536
    begin
7537
      test_fail("WB INT signal should not be set");
7538
      fail = fail + 1;
7539
    end
7540
 
7541
    // write to phy's control register for 100Mbps
7542
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
7543
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
7544
    speed = 100;
7545
 
7546
    frame_started = 0;
7547
    num_of_frames = 0;
7548
    num_of_bd = 0;
7549
    i_length = 0; // 0;
7550
    while (i_length < 70) // (min_tmp - 4))
7551
    begin
7552
      #1;
7553
      // choose generating carrier sense and collision
7554
      case (i_length[1:0])
7555
      2'h0: // Interrupt is generated
7556
      begin
7557
        // Reset_tx_bd nable interrupt generation
7558
        // unmask interrupts
7559 274 tadejm
        wait (wbm_working == 0);
7560 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7561
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7562
        // not detect carrier sense in FD and no collision
7563
        eth_phy.carrier_sense_tx_fd_detect(0);
7564
        eth_phy.collision(0);
7565
      end
7566
      2'h1: // Interrupt is not generated
7567
      begin
7568
        // set_tx_bd enable interrupt generation
7569
        // mask interrupts
7570 274 tadejm
        wait (wbm_working == 0);
7571 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7572
        // detect carrier sense in FD and no collision
7573
        eth_phy.carrier_sense_tx_fd_detect(1);
7574
        eth_phy.collision(0);
7575
      end
7576
      2'h2: // Interrupt is not generated
7577
      begin
7578
        // set_tx_bd disable the interrupt generation
7579
        // unmask interrupts
7580 274 tadejm
        wait (wbm_working == 0);
7581 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
7582
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7583
        // not detect carrier sense in FD and set collision
7584
        eth_phy.carrier_sense_tx_fd_detect(0);
7585
        eth_phy.collision(1);
7586
      end
7587
      default: // 2'h3: // Interrupt is not generated
7588
      begin
7589
        // set_tx_bd disable the interrupt generation
7590
        // mask interrupts
7591 274 tadejm
        wait (wbm_working == 0);
7592 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7593
        // detect carrier sense in FD and set collision
7594
        eth_phy.carrier_sense_tx_fd_detect(1);
7595
        eth_phy.collision(1);
7596
      end
7597
      endcase
7598
      #1;
7599
      // first destination address on ethernet PHY
7600
      eth_phy.set_tx_mem_addr(num_of_frames * 16);
7601
      // SET packets and wrap bit
7602
      // num_of_frames <= 9 => wrap set to TX BD 0
7603
      if (num_of_frames <= 9)
7604
      begin
7605
        tmp_len = i_length; // length of frame
7606
        tmp_bd_num = 0; // TX BD number
7607
        // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7608
        // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7609
        if (tmp_len[0] == 0)
7610
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7611
        else
7612
          set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7613
        // set wrap bit
7614
        set_tx_bd_wrap(0);
7615
      end
7616
      // 10 <= num_of_frames < 18 => wrap set to TX BD 3
7617
      else if ((num_of_frames == 10) || (num_of_frames == 14))
7618
      begin
7619
        tmp_len = i_length; // length of frame
7620
        tmp_bd_num = 0; // TX BD number
7621
        while (tmp_bd_num < 4) //
7622
        begin
7623
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7624
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7625
          if (tmp_len[0] == 0)
7626
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7627
          else
7628
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7629
          tmp_len = tmp_len + 1;
7630
          // set TX BD number
7631
          tmp_bd_num = tmp_bd_num + 1;
7632
        end
7633
        // set wrap bit
7634
        set_tx_bd_wrap(3);
7635
      end
7636
      // 18 <= num_of_frames < 28 => wrap set to TX BD 4
7637
      else if ((num_of_frames == 18) || (num_of_frames == 23))
7638
      begin
7639
        tmp_len = i_length; // length of frame
7640
        tmp_bd_num = 0; // TX BD number
7641
        while (tmp_bd_num < 5) //
7642
        begin
7643
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7644
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7645
          if (tmp_len[0] == 0)
7646
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7647
          else
7648
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7649
          tmp_len = tmp_len + 1;
7650
          // set TX BD number
7651
          tmp_bd_num = tmp_bd_num + 1;
7652
        end
7653
        // set wrap bit
7654
        set_tx_bd_wrap(4);
7655
      end
7656
      // 28 <= num_of_frames < 40 => wrap set to TX BD 5
7657
      else if ((num_of_frames == 28) || (num_of_frames == 34))
7658
      begin
7659
        tmp_len = i_length; // length of frame
7660
        tmp_bd_num = 0; // TX BD number
7661
        while (tmp_bd_num < 6) //
7662
        begin
7663
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7664
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7665
          if (tmp_len[0] == 0)
7666
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7667
          else
7668
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7669
          tmp_len = tmp_len + 1;
7670
          // set TX BD number
7671
          tmp_bd_num = tmp_bd_num + 1;
7672
        end
7673
        // set wrap bit
7674
        set_tx_bd_wrap(5);
7675
      end
7676
      // 40 <= num_of_frames < 54 => wrap set to TX BD 6
7677
      else if ((num_of_frames == 40) || (num_of_frames == 47))
7678
      begin
7679
        tmp_len = i_length; // length of frame
7680
        tmp_bd_num = 0; // TX BD number
7681
        while (tmp_bd_num < 7) //
7682
        begin
7683
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7684
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7685
          if (tmp_len[0] == 0)
7686
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7687
          else
7688
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7689
          tmp_len = tmp_len + 1;
7690
          // set TX BD number
7691
          tmp_bd_num = tmp_bd_num + 1;
7692
        end
7693
        // set wrap bit
7694
        set_tx_bd_wrap(6);
7695
      end
7696
      // 54 <= num_of_frames < 70 => wrap set to TX BD 7
7697
      else if ((num_of_frames == 54) || (num_of_frames == 62))
7698
      begin
7699
        tmp_len = i_length; // length of frame
7700
        tmp_bd_num = 0; // TX BD number
7701
        while (tmp_bd_num < 8) //
7702
        begin
7703
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
7704
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
7705
          if (tmp_len[0] == 0)
7706
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
7707
          else
7708
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
7709
          tmp_len = tmp_len + 1;
7710
          // set TX BD number
7711
          tmp_bd_num = tmp_bd_num + 1;
7712
        end
7713
        // set wrap bit
7714
        set_tx_bd_wrap(7);
7715
      end
7716
      #1;
7717
      // SET ready bit
7718
      if (num_of_frames < 10)
7719
        set_tx_bd_ready(0, 0);
7720
      else if (num_of_frames < 14)
7721
        set_tx_bd_ready((num_of_frames - 10), (num_of_frames - 10));
7722
      else if (num_of_frames < 18)
7723
        set_tx_bd_ready((num_of_frames - 14), (num_of_frames - 14));
7724
      else if (num_of_frames < 23)
7725
        set_tx_bd_ready((num_of_frames - 18), (num_of_frames - 18));
7726
      else if (num_of_frames < 28)
7727
        set_tx_bd_ready((num_of_frames - 23), (num_of_frames - 23));
7728
      else if (num_of_frames < 34)
7729
        set_tx_bd_ready((num_of_frames - 28), (num_of_frames - 28));
7730
      else if (num_of_frames < 40)
7731
        set_tx_bd_ready((num_of_frames - 34), (num_of_frames - 34));
7732
      else if (num_of_frames < 47)
7733
        set_tx_bd_ready((num_of_frames - 40), (num_of_frames - 40));
7734
      else if (num_of_frames < 54)
7735
        set_tx_bd_ready((num_of_frames - 47), (num_of_frames - 47));
7736
      else if (num_of_frames < 62)
7737
        set_tx_bd_ready((num_of_frames - 54), (num_of_frames - 54));
7738
      else if (num_of_frames < 70)
7739
        set_tx_bd_ready((num_of_frames - 62), (num_of_frames - 62));
7740
      // CHECK END OF TRANSMITION
7741
      frame_started = 0;
7742
      if (num_of_frames >= 5)
7743
        #1 check_tx_bd(num_of_bd, data);
7744
      fork
7745
      begin: fr_st3
7746
        wait (MTxEn === 1'b1); // start transmit
7747
        frame_started = 1;
7748
      end
7749
      begin
7750 279 mohor
        repeat (50) @(posedge mtx_clk);
7751
$display("(%0t) num_of_frames = 0x%0x", $time, num_of_frames);
7752 209 tadejm
        if (num_of_frames < 5)
7753
        begin
7754
          if (frame_started == 1)
7755
          begin
7756
            `TIME; $display("*E Frame should NOT start!");
7757
          end
7758
          disable fr_st3;
7759
        end
7760
        else
7761
        begin
7762
          if (frame_started == 0)
7763
          begin
7764
            `TIME; $display("*W Frame should start!");
7765 279 mohor
#500 $stop;
7766 209 tadejm
            disable fr_st3;
7767
          end
7768
        end
7769
      end
7770
      join
7771
      // check packets larger than 4 bytes
7772
      if (num_of_frames >= 5)
7773
      begin
7774
        wait (MTxEn === 1'b0); // end transmit
7775
        while (data[15] === 1)
7776
        begin
7777
          #1 check_tx_bd(num_of_bd, data);
7778
          @(posedge wb_clk);
7779
        end
7780
        repeat (1) @(posedge wb_clk);
7781
        // check length of a PACKET
7782 279 mohor
        if ((num_of_frames + 4) < 64)
7783
          begin
7784
            if (eth_phy.tx_len != 64)
7785
            begin
7786
              `TIME; $display("*E Wrong length of the packet out from MAC");
7787
              test_fail("Wrong length of the packet out from MAC");
7788
              fail = fail + 1;
7789
            end
7790
          end
7791
        else
7792
          begin
7793 209 tadejm
        if (eth_phy.tx_len != (i_length + 4))
7794
        begin
7795
          `TIME; $display("*E Wrong length of the packet out from MAC");
7796
          test_fail("Wrong length of the packet out from MAC");
7797
          fail = fail + 1;
7798
        end
7799 279 mohor
          end
7800 209 tadejm
        // check transmitted TX packet data
7801
        if (i_length[0] == 0)
7802
        begin
7803
          #1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
7804
        end
7805
        else
7806
        begin
7807
          #1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
7808
        end
7809
        if (tmp > 0)
7810
        begin
7811
          test_fail("Wrong data of the transmitted packet");
7812
          fail = fail + 1;
7813
        end
7814
        // check transmited TX packet CRC
7815
        #1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
7816
        if (tmp > 0)
7817
        begin
7818
          test_fail("Wrong CRC of the transmitted packet");
7819
          fail = fail + 1;
7820
        end
7821
      end
7822
      // check WB INT signal
7823
      if ((i_length[1:0] == 2'h0) && (num_of_frames >= 5))
7824
      begin
7825
        if (wb_int !== 1'b1)
7826
        begin
7827
          `TIME; $display("*E WB INT signal should be set");
7828
          test_fail("WB INT signal should be set");
7829
          fail = fail + 1;
7830
        end
7831
      end
7832
      else
7833
      begin
7834
        if (wb_int !== 1'b0)
7835
        begin
7836
          `TIME; $display("*E WB INT signal should not be set");
7837
          test_fail("WB INT signal should not be set");
7838
          fail = fail + 1;
7839
        end
7840
      end
7841
      // check TX buffer descriptor of a packet
7842
      check_tx_bd(num_of_bd, data);
7843
      if (num_of_frames >= 5)
7844
      begin
7845
        if (i_length[1] == 1'b0) // interrupt enabled
7846
        begin
7847
          if ( (data[15:0] !== 16'h7800) && // wrap bit
7848
               (data[15:0] !== 16'h5800) ) // without wrap bit
7849
          begin
7850
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7851
            test_fail("TX buffer descriptor status is not correct");
7852
            fail = fail + 1;
7853
          end
7854
        end
7855
        else // interrupt not enabled
7856
        begin
7857
          if ( (data[15:0] !== 16'h3800) && // wrap bit
7858
               (data[15:0] !== 16'h1800) ) // without wrap bit
7859
          begin
7860
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7861
            test_fail("TX buffer descriptor status is not correct");
7862
            fail = fail + 1;
7863
          end
7864
        end
7865
      end
7866
      else
7867
      begin
7868
        if (data[15] !== 1'b1)
7869
        begin
7870
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
7871
          test_fail("TX buffer descriptor status is not correct");
7872
          fail = fail + 1;
7873
        end
7874
      end
7875
      // clear TX BD with wrap bit
7876
      if (num_of_frames == 63)
7877
        clear_tx_bd(16, 16);
7878
      // check interrupts
7879 274 tadejm
      wait (wbm_working == 0);
7880 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7881
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
7882
      begin
7883
        if ((data & `ETH_INT_TXB) !== 1'b1)
7884
        begin
7885
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
7886
          test_fail("Interrupt Transmit Buffer was not set");
7887
          fail = fail + 1;
7888
        end
7889
        if ((data & (~`ETH_INT_TXB)) !== 0)
7890
        begin
7891
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
7892
          test_fail("Other interrupts (except Transmit Buffer) were set");
7893
          fail = fail + 1;
7894
        end
7895
      end
7896
      else
7897
      begin
7898
        if (data !== 0)
7899
        begin
7900
          `TIME; $display("*E Any of interrupts (except Transmit Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
7901
          test_fail("Any of interrupts (except Transmit Buffer) was set");
7902
          fail = fail + 1;
7903
        end
7904
      end
7905
      // clear interrupts
7906 274 tadejm
      wait (wbm_working == 0);
7907 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7908
      // check WB INT signal
7909
      if (wb_int !== 1'b0)
7910
      begin
7911
        test_fail("WB INT signal should not be set");
7912
        fail = fail + 1;
7913
      end
7914
      // INTERMEDIATE DISPLAYS
7915
      if (i_length == 3)
7916
      begin
7917
        $display("    pads appending to packets is selected");
7918
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7919
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
7920
                 0, 3);
7921
      end
7922
      else if (i_length == 9)
7923
      begin
7924
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
7925
        $display("    ->packet with length 4 is not transmitted (length increasing by 1 byte)");
7926
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7927
                 5, 9);
7928
      end
7929
      else if (i_length == 17)
7930
      begin
7931
        $display("    using 4 BDs out of 8 BDs assigned to TX (wrap at 4th BD - TX BD 3)");
7932
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7933
                 10, 17);
7934
      end
7935
      else if (i_length == 27)
7936
      begin
7937
        $display("    using 5 BDs out of 8 BDs assigned to TX (wrap at 5th BD - TX BD 4)");
7938
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7939
                 18, 27);
7940
      end
7941
      else if (i_length == 40)
7942
      begin
7943
        $display("    using 6 BDs out of 8 BDs assigned to TX (wrap at 6th BD - TX BD 5)");
7944
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7945
                 28, 40);
7946
      end
7947
      else if (i_length == 54)
7948
      begin
7949
        $display("    using 7 BDs out of 8 BDs assigned to TX (wrap at 7th BD - TX BD 6)");
7950
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7951
                 41, 54);
7952
      end
7953
      else if (i_length == 69)
7954
      begin
7955
        $display("    using 8 BDs out of 8 BDs assigned to TX (wrap at 8th BD - TX BD 7)");
7956
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
7957
                 55, 69);
7958
      end
7959
      // set length (loop variable)
7960
      i_length = i_length + 1;
7961
      // the number of frame transmitted
7962
      num_of_frames = num_of_frames + 1;
7963
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
7964
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
7965
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
7966
          (num_of_frames == 54) || (num_of_frames == 62))
7967
        num_of_bd = 0;
7968
      else
7969
        num_of_bd = num_of_bd + 1;
7970
    end
7971
    // disable TX
7972 274 tadejm
    wait (wbm_working == 0);
7973 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
7974
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
7975
    @(posedge wb_clk);
7976
    if(fail == 0)
7977
      test_ok;
7978
    else
7979
      fail = 0;
7980
  end
7981
 
7982
 
7983
  ////////////////////////////////////////////////////////////////////
7984
  ////                                                            ////
7985
  ////  Test transmit packets across MAXFL value at               ////
7986
  ////  13 TX buffer decriptors ( 10Mbps ).                       ////
7987
  ////                                                            ////
7988
  ////////////////////////////////////////////////////////////////////
7989
  if (test_num == 10) // without and with padding
7990
  begin
7991
    // TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
7992
    test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
7993
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
7994
 
7995
    // reset MAC registers
7996
    hard_reset;
7997
    // set wb slave response
7998
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
7999
 
8000
    max_tmp = 0;
8001
    min_tmp = 0;
8002
    num_of_frames = 0;
8003
    num_of_bd = 0;
8004
    // set 13 TX buffer descriptors - must be set before TX enable
8005 274 tadejm
    wait (wbm_working == 0);
8006 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8007
    // enable TX, set full-duplex mode, NO padding and CRC appending
8008 274 tadejm
    wait (wbm_working == 0);
8009 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8010
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8011
    // prepare a packet of MAXFL + 10 length
8012 274 tadejm
    wait (wbm_working == 0);
8013 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8014
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8015
    min_tmp = tmp[31:16];
8016
    st_data = 8'hA3;
8017
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8018
    // check WB INT signal
8019
    if (wb_int !== 1'b0)
8020
    begin
8021
      test_fail("WB INT signal should not be set");
8022
      fail = fail + 1;
8023
    end
8024
 
8025
    // write to phy's control register for 10Mbps
8026
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8027
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8028
    speed = 10;
8029
 
8030
    i_length = (max_tmp - 5);
8031 279 mohor
    while (num_of_bd <= 3)
8032 209 tadejm
    begin
8033 279 mohor
      // unmask interrupts
8034
      wait (wbm_working == 0);
8035
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8036
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8037
      // not detect carrier sense in FD and no collision
8038
      eth_phy.carrier_sense_tx_fd_detect(0);
8039
      eth_phy.collision(0);
8040 209 tadejm
      // first destination address on ethernet PHY
8041
      eth_phy.set_tx_mem_addr(0);
8042
 
8043 279 mohor
      if (num_of_bd == 0)
8044
      begin
8045
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8046
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8047
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8048
        set_tx_bd_wrap(2);
8049
        set_tx_bd_ready(0, 0);
8050
      end
8051
      else if (num_of_bd == 1)
8052
        set_tx_bd_ready(1, 1);
8053
      else if (num_of_bd == 2)
8054
        set_tx_bd_ready(2, 2);
8055
      else if (num_of_bd == 3)
8056
      begin
8057
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8058
        set_tx_bd_wrap(2);
8059
        set_tx_bd_ready(0, 0);
8060
        i_length = 96;
8061
      end
8062
 
8063 209 tadejm
 
8064
      // CHECK END OF TRANSMITION
8065 279 mohor
      check_tx_bd(num_of_bd, data);
8066
      wait (MTxEn === 1'b1); // start transmit
8067
      check_tx_bd(num_of_bd, data);
8068
      if (data[15] !== 1)
8069
      begin
8070
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8071
        fail = fail + 1;
8072
      end
8073
      wait (MTxEn === 1'b0); // end transmit
8074
      while (data[15] === 1)
8075
      begin
8076
        check_tx_bd(num_of_bd, data);
8077
        @(posedge wb_clk);
8078
      end
8079
      repeat (1) @(posedge wb_clk);
8080 209 tadejm
      // check length of a PACKET
8081 279 mohor
      tmp_len = eth_phy.tx_len;
8082
      #1;
8083
      if (tmp_len != (i_length + 4))
8084 209 tadejm
      begin
8085
        test_fail("Wrong length of the packet out from MAC");
8086
        fail = fail + 1;
8087
      end
8088 279 mohor
 
8089
      // check transmitted TX packet data
8090
      if ((i_length + 4) == 100)
8091
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8092
      else if ((i_length + 4) <= max_tmp)
8093
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8094
      else
8095
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8096
 
8097
      if (tmp > 0)
8098
      begin
8099
        test_fail("Wrong data of the transmitted packet");
8100
        fail = fail + 1;
8101
      end
8102
 
8103
      // check transmited TX packet CRC
8104
      if ((i_length + 4) == 100)
8105
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8106
      else if ((i_length + 4) <= max_tmp)
8107
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8108
 
8109
      if (tmp > 0)
8110
      begin
8111
        test_fail("Wrong CRC of the transmitted packet");
8112
        fail = fail + 1;
8113
      end
8114
 
8115
      if (wb_int !== 1'b1)
8116
      begin
8117
        `TIME; $display("*E WB INT signal should be set");
8118
        test_fail("WB INT signal should be set");
8119
        fail = fail + 1;
8120
      end
8121
 
8122
      check_tx_bd(num_of_bd, data);
8123
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8124
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8125
      begin
8126
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8127
        test_fail("TX buffer descriptor status is not correct");
8128
        fail = fail + 1;
8129
      end
8130
 
8131 209 tadejm
      // check interrupts
8132 274 tadejm
      wait (wbm_working == 0);
8133 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8134 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8135
      begin
8136
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8137
        test_fail("Interrupt Transmit Buffer was not set");
8138
        fail = fail + 1;
8139
      end
8140
      if ((data & (~`ETH_INT_TXB)) !== 0)
8141
      begin
8142
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8143
        test_fail("Other interrupts (except Transmit Buffer) were set");
8144
        fail = fail + 1;
8145
      end
8146
 
8147 209 tadejm
      // clear interrupts
8148 274 tadejm
      wait (wbm_working == 0);
8149 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8150
      // check WB INT signal
8151
      if (wb_int !== 1'b0)
8152
      begin
8153
        test_fail("WB INT signal should not be set");
8154
        fail = fail + 1;
8155
      end
8156 279 mohor
 
8157 209 tadejm
      // INTERMEDIATE DISPLAYS
8158 279 mohor
      if (num_of_bd == 0)
8159
        $display("    ->packet with length %0d sent", (i_length + 4));
8160
      else if (num_of_bd == 1)
8161
        $display("    ->packet with length %0d sent", (i_length + 4));
8162
      else if (num_of_bd == 2)
8163
        $display("    ->packet with length %0d sent", (i_length + 4));
8164
      else if (num_of_bd == 3)
8165
        $display("    ->packet with length %0d sent", (104));
8166 209 tadejm
      // set length (loop variable)
8167
      i_length = i_length + 1;
8168
      // the number of frame transmitted
8169
      num_of_frames = num_of_frames + 1;
8170
      num_of_bd = num_of_bd + 1;
8171
      @(posedge wb_clk);
8172
    end
8173
    // disable TX
8174 274 tadejm
    wait (wbm_working == 0);
8175 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8176
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8177
    @(posedge wb_clk);
8178
    if(fail == 0)
8179
      test_ok;
8180
    else
8181
      fail = 0;
8182
  end
8183
 
8184
 
8185
  ////////////////////////////////////////////////////////////////////
8186
  ////                                                            ////
8187
  ////  Test transmit packets across MAXFL value at               ////
8188 279 mohor
  ////  13 TX buffer decriptors ( 100Mbps ).                       ////
8189 209 tadejm
  ////                                                            ////
8190
  ////////////////////////////////////////////////////////////////////
8191
  if (test_num == 11) // without and with padding
8192
  begin
8193
    // TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8194
    test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8195
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8196 279 mohor
 
8197 209 tadejm
    // reset MAC registers
8198
    hard_reset;
8199
    // set wb slave response
8200
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8201
 
8202
    max_tmp = 0;
8203
    min_tmp = 0;
8204
    num_of_frames = 0;
8205
    num_of_bd = 0;
8206
    // set 13 TX buffer descriptors - must be set before TX enable
8207 274 tadejm
    wait (wbm_working == 0);
8208 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8209
    // enable TX, set full-duplex mode, NO padding and CRC appending
8210 274 tadejm
    wait (wbm_working == 0);
8211 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8212
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8213
    // prepare a packet of MAXFL + 10 length
8214 274 tadejm
    wait (wbm_working == 0);
8215 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8216
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8217
    min_tmp = tmp[31:16];
8218
    st_data = 8'hA3;
8219
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
8220
    // check WB INT signal
8221
    if (wb_int !== 1'b0)
8222
    begin
8223
      test_fail("WB INT signal should not be set");
8224
      fail = fail + 1;
8225
    end
8226 279 mohor
 
8227
    // write to phy's control register for 10Mbps
8228
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8229
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8230 209 tadejm
    speed = 100;
8231
 
8232
    i_length = (max_tmp - 5);
8233 279 mohor
    while (num_of_bd <= 3)
8234 209 tadejm
    begin
8235
      // unmask interrupts
8236 274 tadejm
      wait (wbm_working == 0);
8237 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8238
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8239
      // not detect carrier sense in FD and no collision
8240
      eth_phy.carrier_sense_tx_fd_detect(0);
8241
      eth_phy.collision(0);
8242
      // first destination address on ethernet PHY
8243
      eth_phy.set_tx_mem_addr(0);
8244 279 mohor
 
8245 209 tadejm
      if (num_of_bd == 0)
8246
      begin
8247
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8248
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8249
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8250
        set_tx_bd_wrap(2);
8251
        set_tx_bd_ready(0, 0);
8252
      end
8253
      else if (num_of_bd == 1)
8254
        set_tx_bd_ready(1, 1);
8255
      else if (num_of_bd == 2)
8256
        set_tx_bd_ready(2, 2);
8257 279 mohor
      else if (num_of_bd == 3)
8258
      begin
8259
        set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8260
        set_tx_bd_wrap(2);
8261
        set_tx_bd_ready(0, 0);
8262
        i_length = 96;
8263
      end
8264
 
8265
 
8266 209 tadejm
      // CHECK END OF TRANSMITION
8267
      check_tx_bd(num_of_bd, data);
8268 279 mohor
      wait (MTxEn === 1'b1); // start transmit
8269 209 tadejm
      check_tx_bd(num_of_bd, data);
8270 279 mohor
      if (data[15] !== 1)
8271
      begin
8272
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8273
        fail = fail + 1;
8274
      end
8275
      wait (MTxEn === 1'b0); // end transmit
8276
      while (data[15] === 1)
8277
      begin
8278
        check_tx_bd(num_of_bd, data);
8279
        @(posedge wb_clk);
8280
      end
8281
      repeat (1) @(posedge wb_clk);
8282
      repeat (10) @(posedge mtx_clk);
8283 209 tadejm
      // check length of a PACKET
8284
      tmp_len = eth_phy.tx_len;
8285
      #1;
8286
      if (tmp_len != (i_length + 4))
8287
      begin
8288
        test_fail("Wrong length of the packet out from MAC");
8289
        fail = fail + 1;
8290
      end
8291 279 mohor
 
8292
      // check transmitted TX packet data
8293
      if ((i_length + 4) == 100)
8294
        check_tx_packet(`MEMORY_BASE, 0, 100 - 4, tmp);
8295
      else if ((i_length + 4) <= max_tmp)
8296
        check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8297
      else
8298
        check_tx_packet(`MEMORY_BASE, 0, max_tmp - 4, tmp);
8299
 
8300 209 tadejm
      if (tmp > 0)
8301
      begin
8302
        test_fail("Wrong data of the transmitted packet");
8303
        fail = fail + 1;
8304
      end
8305 279 mohor
 
8306 209 tadejm
      // check transmited TX packet CRC
8307 279 mohor
      if ((i_length + 4) == 100)
8308
        check_tx_crc(0, 100, 1'b0, tmp); // length without CRC
8309
      else if ((i_length + 4) <= max_tmp)
8310
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8311
 
8312 209 tadejm
      if (tmp > 0)
8313
      begin
8314
        test_fail("Wrong CRC of the transmitted packet");
8315
        fail = fail + 1;
8316
      end
8317 279 mohor
 
8318 209 tadejm
      if (wb_int !== 1'b1)
8319
      begin
8320
        `TIME; $display("*E WB INT signal should be set");
8321
        test_fail("WB INT signal should be set");
8322
        fail = fail + 1;
8323
      end
8324 279 mohor
 
8325 209 tadejm
      check_tx_bd(num_of_bd, data);
8326
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8327
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8328
      begin
8329
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8330
        test_fail("TX buffer descriptor status is not correct");
8331
        fail = fail + 1;
8332
      end
8333 279 mohor
 
8334 209 tadejm
      // check interrupts
8335 274 tadejm
      wait (wbm_working == 0);
8336 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8337 279 mohor
      if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
8338 209 tadejm
      begin
8339
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8340
        test_fail("Interrupt Transmit Buffer was not set");
8341
        fail = fail + 1;
8342
      end
8343
      if ((data & (~`ETH_INT_TXB)) !== 0)
8344
      begin
8345
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8346
        test_fail("Other interrupts (except Transmit Buffer) were set");
8347
        fail = fail + 1;
8348
      end
8349 279 mohor
 
8350 209 tadejm
      // clear interrupts
8351 274 tadejm
      wait (wbm_working == 0);
8352 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8353
      // check WB INT signal
8354
      if (wb_int !== 1'b0)
8355
      begin
8356
        test_fail("WB INT signal should not be set");
8357
        fail = fail + 1;
8358
      end
8359 279 mohor
 
8360 209 tadejm
      // INTERMEDIATE DISPLAYS
8361
      if (num_of_bd == 0)
8362
        $display("    ->packet with length %0d sent", (i_length + 4));
8363
      else if (num_of_bd == 1)
8364
        $display("    ->packet with length %0d sent", (i_length + 4));
8365
      else if (num_of_bd == 2)
8366
        $display("    ->packet with length %0d sent", (i_length + 4));
8367 279 mohor
      else if (num_of_bd == 3)
8368
        $display("    ->packet with length %0d sent", (104));
8369 209 tadejm
      // set length (loop variable)
8370
      i_length = i_length + 1;
8371
      // the number of frame transmitted
8372
      num_of_frames = num_of_frames + 1;
8373
      num_of_bd = num_of_bd + 1;
8374
      @(posedge wb_clk);
8375
    end
8376
    // disable TX
8377 274 tadejm
    wait (wbm_working == 0);
8378 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8379
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8380
    @(posedge wb_clk);
8381
    if(fail == 0)
8382
      test_ok;
8383
    else
8384
      fail = 0;
8385
  end
8386
 
8387
 
8388 279 mohor
 
8389
 
8390 209 tadejm
  ////////////////////////////////////////////////////////////////////
8391
  ////                                                            ////
8392
  ////  Test transmit packets across changed MAXFL value at       ////
8393
  ////  47 TX buffer decriptors ( 10Mbps ).                       ////
8394
  ////                                                            ////
8395
  ////////////////////////////////////////////////////////////////////
8396
  if (test_num == 12) // without and with padding
8397
  begin
8398
    // TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
8399
    test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
8400
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
8401
 
8402
    // reset MAC registers
8403
    hard_reset;
8404
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8405
 
8406
    max_tmp = 0;
8407
    min_tmp = 0;
8408
    num_of_frames = 0;
8409
    num_of_bd = 0;
8410
    // set 47 TX buffer descriptors - must be set before TX enable
8411 274 tadejm
    wait (wbm_working == 0);
8412 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8413
    // prepare a packet of MAXFL + 10 length
8414 274 tadejm
    wait (wbm_working == 0);
8415 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8416
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8417
    min_tmp = tmp[31:16];
8418
    // change MAXFL value
8419
    max_tmp = min_tmp + 53;
8420 274 tadejm
    wait (wbm_working == 0);
8421 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8422
    st_data = 8'h62;
8423
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8424 274 tadejm
    wait (wbm_working == 0);
8425 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8426
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8427
    // check WB INT signal
8428
    if (wb_int !== 1'b0)
8429
    begin
8430
      test_fail("WB INT signal should not be set");
8431
      fail = fail + 1;
8432
    end
8433
 
8434
    // write to phy's control register for 10Mbps
8435
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8436
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8437
    speed = 10;
8438
 
8439
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8440
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8441
    begin
8442 274 tadejm
      wait (wbm_working == 0);
8443 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8444
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8445
      // not detect carrier sense in FD and no collision
8446
      eth_phy.carrier_sense_tx_fd_detect(0);
8447
      eth_phy.collision(0);
8448
      // first destination address on ethernet PHY
8449
      eth_phy.set_tx_mem_addr(0);
8450
      // prepare BDs
8451
      if (num_of_bd == 0)
8452
      begin
8453
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8454
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8455
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8456
        set_tx_bd_wrap(2);
8457
        set_tx_bd_ready(0, 0);
8458
      end
8459
      else if (num_of_bd == 1)
8460
        set_tx_bd_ready(1, 1);
8461
      else if (num_of_bd == 2)
8462
        set_tx_bd_ready(2, 2);
8463
      // CHECK END OF TRANSMITION
8464
      check_tx_bd(num_of_bd, data);
8465
        wait (MTxEn === 1'b1); // start transmit
8466
      check_tx_bd(num_of_bd, data);
8467
        if (data[15] !== 1)
8468
        begin
8469
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8470
          fail = fail + 1;
8471
        end
8472
        wait (MTxEn === 1'b0); // end transmit
8473
        while (data[15] === 1)
8474
        begin
8475
      check_tx_bd(num_of_bd, data);
8476
          @(posedge wb_clk);
8477
        end
8478 279 mohor
        repeat (5) @(posedge mtx_clk);
8479 209 tadejm
      // check length of a PACKET
8480
      tmp_len = eth_phy.tx_len;
8481
      #1;
8482
      if (tmp_len != (i_length + 4))
8483
      begin
8484
        test_fail("Wrong length of the packet out from MAC");
8485
        fail = fail + 1;
8486
      end
8487
      // checking packet
8488
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8489
      if (tmp > 0)
8490
      begin
8491
        test_fail("Wrong data of the transmitted packet");
8492
        fail = fail + 1;
8493
      end
8494
      // check transmited TX packet CRC
8495 279 mohor
      if (num_of_bd !== 2)
8496
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8497 209 tadejm
      if (tmp > 0)
8498
      begin
8499
        test_fail("Wrong CRC of the transmitted packet");
8500
        fail = fail + 1;
8501
      end
8502
      // check WB INT signal
8503
      if (wb_int !== 1'b1)
8504
      begin
8505
        `TIME; $display("*E WB INT signal should be set");
8506
        test_fail("WB INT signal should be set");
8507
        fail = fail + 1;
8508
      end
8509
      // check TX buffer descriptor of a packet
8510
      check_tx_bd(num_of_bd, data);
8511
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8512
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8513
      begin
8514
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8515
        test_fail("TX buffer descriptor status is not correct");
8516
        fail = fail + 1;
8517
      end
8518
      // check interrupts
8519 274 tadejm
      wait (wbm_working == 0);
8520 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8521
      if ((data & `ETH_INT_TXB) !== 1'b1)
8522
      begin
8523
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8524
        test_fail("Interrupt Transmit Buffer was not set");
8525
        fail = fail + 1;
8526
      end
8527
      if ((data & (~`ETH_INT_TXB)) !== 0)
8528
      begin
8529
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8530
        test_fail("Other interrupts (except Transmit Buffer) were set");
8531
        fail = fail + 1;
8532
      end
8533
      // clear interrupts
8534 274 tadejm
      wait (wbm_working == 0);
8535 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8536
      // check WB INT signal
8537
      if (wb_int !== 1'b0)
8538
      begin
8539
        test_fail("WB INT signal should not be set");
8540
        fail = fail + 1;
8541
      end
8542
      // INTERMEDIATE DISPLAYS
8543
      if (num_of_bd == 0)
8544
        $display("    ->packet with length %0d sent", (i_length + 4));
8545
      else if (num_of_bd == 1)
8546
        $display("    ->packet with length %0d sent", (i_length + 4));
8547
      else if (num_of_bd == 2)
8548
        $display("    ->packet with length %0d sent", (i_length + 4));
8549
      // set length (loop variable)
8550
      i_length = i_length + 1;
8551
      // the number of frame transmitted
8552
      num_of_frames = num_of_frames + 1;
8553
      num_of_bd = num_of_bd + 1;
8554
      @(posedge wb_clk);
8555
    end
8556
    // disable TX
8557 274 tadejm
    wait (wbm_working == 0);
8558 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8559
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8560
    @(posedge wb_clk);
8561
    if(fail == 0)
8562
      test_ok;
8563
    else
8564
      fail = 0;
8565
  end
8566
 
8567
 
8568
  ////////////////////////////////////////////////////////////////////
8569
  ////                                                            ////
8570
  ////  Test transmit packets across changed MAXFL value at       ////
8571
  ////  47 TX buffer decriptors ( 100Mbps ).                      ////
8572
  ////                                                            ////
8573
  ////////////////////////////////////////////////////////////////////
8574
  if (test_num == 13) // without and with padding
8575
  begin
8576
    // TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
8577
    test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
8578
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
8579
 
8580
    // reset MAC registers
8581
    hard_reset;
8582
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8583
 
8584
    max_tmp = 0;
8585
    min_tmp = 0;
8586
    num_of_frames = 0;
8587
    num_of_bd = 0;
8588
    // set 47 TX buffer descriptors - must be set before TX enable
8589 274 tadejm
    wait (wbm_working == 0);
8590 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8591
    // prepare a packet of MAXFL + 10 length
8592 274 tadejm
    wait (wbm_working == 0);
8593 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8594
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8595
    min_tmp = tmp[31:16];
8596
    // change MAXFL value
8597
    max_tmp = min_tmp + 53;
8598 274 tadejm
    wait (wbm_working == 0);
8599 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8600
    st_data = 8'h62;
8601
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
8602 274 tadejm
    wait (wbm_working == 0);
8603 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
8604
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8605
    // check WB INT signal
8606
    if (wb_int !== 1'b0)
8607
    begin
8608
      test_fail("WB INT signal should not be set");
8609
      fail = fail + 1;
8610
    end
8611
 
8612 279 mohor
    // write to phy's control register for 10Mbps
8613
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 reset - speed 100
8614
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8615 209 tadejm
    speed = 100;
8616
 
8617
    i_length = (max_tmp - 5); // (max_tmp - 1); // not (max_tmp - 5) because NO automatic CRC appending
8618
    while (i_length <= (max_tmp - 3)) // (max_tmp + 1)) // (max_tmp) is the limit
8619
    begin
8620 274 tadejm
      wait (wbm_working == 0);
8621 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8622
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8623
      // not detect carrier sense in FD and no collision
8624
      eth_phy.carrier_sense_tx_fd_detect(0);
8625
      eth_phy.collision(0);
8626
      // first destination address on ethernet PHY
8627
      eth_phy.set_tx_mem_addr(0);
8628
      // prepare BDs
8629
      if (num_of_bd == 0)
8630
      begin
8631
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8632
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8633
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8634
        set_tx_bd_wrap(2);
8635
        set_tx_bd_ready(0, 0);
8636
      end
8637
      else if (num_of_bd == 1)
8638
        set_tx_bd_ready(1, 1);
8639
      else if (num_of_bd == 2)
8640
        set_tx_bd_ready(2, 2);
8641
      // CHECK END OF TRANSMITION
8642
      check_tx_bd(num_of_bd, data);
8643
        wait (MTxEn === 1'b1); // start transmit
8644
      check_tx_bd(num_of_bd, data);
8645
        if (data[15] !== 1)
8646
        begin
8647
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8648
          fail = fail + 1;
8649
        end
8650
        wait (MTxEn === 1'b0); // end transmit
8651
        while (data[15] === 1)
8652
        begin
8653
      check_tx_bd(num_of_bd, data);
8654
          @(posedge wb_clk);
8655
        end
8656 279 mohor
        repeat (5) @(posedge mtx_clk);
8657 209 tadejm
      // check length of a PACKET
8658
      tmp_len = eth_phy.tx_len;
8659
      #1;
8660
      if (tmp_len != (i_length + 4))
8661
      begin
8662
        test_fail("Wrong length of the packet out from MAC");
8663
        fail = fail + 1;
8664
      end
8665
      // checking packet
8666
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8667
      if (tmp > 0)
8668
      begin
8669
        test_fail("Wrong data of the transmitted packet");
8670
        fail = fail + 1;
8671
      end
8672
      // check transmited TX packet CRC
8673 279 mohor
      if (num_of_bd !== 2)
8674
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8675 209 tadejm
      if (tmp > 0)
8676
      begin
8677
        test_fail("Wrong CRC of the transmitted packet");
8678
        fail = fail + 1;
8679
      end
8680
      // check WB INT signal
8681
      if (wb_int !== 1'b1)
8682
      begin
8683
        `TIME; $display("*E WB INT signal should be set");
8684
        test_fail("WB INT signal should be set");
8685
        fail = fail + 1;
8686
      end
8687
      // check TX buffer descriptor of a packet
8688
      check_tx_bd(num_of_bd, data);
8689
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8690
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8691
      begin
8692
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8693
        test_fail("TX buffer descriptor status is not correct");
8694
        fail = fail + 1;
8695
      end
8696
      // check interrupts
8697 274 tadejm
      wait (wbm_working == 0);
8698 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8699
      if ((data & `ETH_INT_TXB) !== 1'b1)
8700
      begin
8701
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8702
        test_fail("Interrupt Transmit Buffer was not set");
8703
        fail = fail + 1;
8704
      end
8705
      if ((data & (~`ETH_INT_TXB)) !== 0)
8706
      begin
8707
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8708
        test_fail("Other interrupts (except Transmit Buffer) were set");
8709
        fail = fail + 1;
8710
      end
8711
      // clear interrupts
8712 274 tadejm
      wait (wbm_working == 0);
8713 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8714
      // check WB INT signal
8715
      if (wb_int !== 1'b0)
8716
      begin
8717
        test_fail("WB INT signal should not be set");
8718
        fail = fail + 1;
8719
      end
8720
      // INTERMEDIATE DISPLAYS
8721
      if (num_of_bd == 0)
8722
        $display("    ->packet with length %0d sent", (i_length + 4));
8723
      else if (num_of_bd == 1)
8724
        $display("    ->packet with length %0d sent", (i_length + 4));
8725
      else if (num_of_bd == 2)
8726
        $display("    ->packet with length %0d sent", (i_length + 4));
8727
      // set length (loop variable)
8728
      i_length = i_length + 1;
8729
      // the number of frame transmitted
8730
      num_of_frames = num_of_frames + 1;
8731
      num_of_bd = num_of_bd + 1;
8732
      @(posedge wb_clk);
8733
    end
8734
    // disable TX
8735 274 tadejm
    wait (wbm_working == 0);
8736 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8737
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8738
    @(posedge wb_clk);
8739
    if(fail == 0)
8740
      test_ok;
8741
    else
8742
      fail = 0;
8743
  end
8744
 
8745
 
8746
  ////////////////////////////////////////////////////////////////////
8747
  ////                                                            ////
8748
  ////  Test transmit packets across changed MINFL value at       ////
8749
  ////  7 TX buffer decriptors ( 10Mbps ).                        ////
8750
  ////                                                            ////
8751
  ////////////////////////////////////////////////////////////////////
8752
  if (test_num == 14) // without and with padding
8753
  begin
8754
    // TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
8755
    test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
8756
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
8757
 
8758
    // reset MAC registers
8759
    hard_reset;
8760 279 mohor
 
8761 209 tadejm
    // set wb slave response
8762
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8763
 
8764
    max_tmp = 0;
8765
    min_tmp = 0;
8766
    num_of_frames = 0;
8767
    num_of_bd = 0;
8768
    // set 7 TX buffer descriptors - must be set before TX enable
8769 274 tadejm
    wait (wbm_working == 0);
8770 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8771
    // prepare a packet of MAXFL + 10 length
8772 274 tadejm
    wait (wbm_working == 0);
8773 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8774
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8775
    min_tmp = tmp[31:16];
8776 279 mohor
 
8777 209 tadejm
    // change MINFL value
8778
    min_tmp = max_tmp - 177;
8779 274 tadejm
    wait (wbm_working == 0);
8780 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8781
    st_data = 8'h62;
8782
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8783
    // enable TX, set full-duplex mode, padding and CRC appending
8784 274 tadejm
    wait (wbm_working == 0);
8785 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8786
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8787
    // check WB INT signal
8788
    if (wb_int !== 1'b0)
8789
    begin
8790
      test_fail("WB INT signal should not be set");
8791
      fail = fail + 1;
8792
    end
8793
 
8794
    // write to phy's control register for 10Mbps
8795
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
8796
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
8797
    speed = 10;
8798
 
8799
    i_length = (min_tmp - 5);
8800
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8801
    begin
8802
      // Reset_tx_bd nable interrupt generation
8803
      // unmask interrupts
8804 274 tadejm
      wait (wbm_working == 0);
8805 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8806
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8807
      // not detect carrier sense in FD and no collision
8808
      eth_phy.carrier_sense_tx_fd_detect(0);
8809
      eth_phy.collision(0);
8810
      // first destination address on ethernet PHY
8811
      eth_phy.set_tx_mem_addr(0);
8812
      // prepare BDs
8813
      if (num_of_bd == 0)
8814
      begin
8815
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8816
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8817
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8818
        set_tx_bd_wrap(2);
8819
        set_tx_bd_ready(0, 0);
8820
      end
8821
      else if (num_of_bd == 1)
8822
        set_tx_bd_ready(1, 1);
8823
      else if (num_of_bd == 2)
8824
        set_tx_bd_ready(2, 2);
8825
      // CHECK END OF TRANSMITION
8826
      check_tx_bd(num_of_bd, data);
8827
        wait (MTxEn === 1'b1); // start transmit
8828
      check_tx_bd(num_of_bd, data);
8829
        if (data[15] !== 1)
8830
        begin
8831
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8832
          fail = fail + 1;
8833
        end
8834
        wait (MTxEn === 1'b0); // end transmit
8835
        while (data[15] === 1)
8836
        begin
8837
      check_tx_bd(num_of_bd, data);
8838
          @(posedge wb_clk);
8839
        end
8840
        repeat (1) @(posedge wb_clk);
8841
      // check length of a PACKET
8842
      tmp_len = eth_phy.tx_len;
8843
      #1;
8844
      if (tmp_len != (i_length + 4))
8845
      begin
8846
        test_fail("Wrong length of the packet out from MAC");
8847
        fail = fail + 1;
8848
      end
8849
      // checking packet
8850
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
8851
      if (tmp > 0)
8852
      begin
8853
        test_fail("Wrong data of the transmitted packet");
8854
        fail = fail + 1;
8855
      end
8856
      // check transmited TX packet CRC
8857 279 mohor
      if (num_of_bd !== 0)  // First packet is padded and CRC does not match.
8858
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
8859
      else
8860
        tmp = 0;
8861 209 tadejm
      if (tmp > 0)
8862
      begin
8863
        test_fail("Wrong CRC of the transmitted packet");
8864
        fail = fail + 1;
8865
      end
8866
      // check WB INT signal
8867
      if (wb_int !== 1'b1)
8868
      begin
8869
        `TIME; $display("*E WB INT signal should be set");
8870
        test_fail("WB INT signal should be set");
8871
        fail = fail + 1;
8872
      end
8873
      // check TX buffer descriptor of a packet
8874
      check_tx_bd(num_of_bd, data);
8875
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
8876
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
8877
      begin
8878
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
8879
        test_fail("TX buffer descriptor status is not correct");
8880
        fail = fail + 1;
8881
      end
8882
      // check interrupts
8883 274 tadejm
      wait (wbm_working == 0);
8884 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8885
      if ((data & `ETH_INT_TXB) !== 1'b1)
8886
      begin
8887
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
8888
        test_fail("Interrupt Transmit Buffer was not set");
8889
        fail = fail + 1;
8890
      end
8891
      if ((data & (~`ETH_INT_TXB)) !== 0)
8892
      begin
8893
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
8894
        test_fail("Other interrupts (except Transmit Buffer) were set");
8895
        fail = fail + 1;
8896
      end
8897
      // clear interrupts
8898 274 tadejm
      wait (wbm_working == 0);
8899 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8900
      // check WB INT signal
8901
      if (wb_int !== 1'b0)
8902
      begin
8903
        test_fail("WB INT signal should not be set");
8904
        fail = fail + 1;
8905
      end
8906
      // INTERMEDIATE DISPLAYS
8907
      if (num_of_bd == 0)
8908
        $display("    ->packet with length %0d sent", (i_length + 4));
8909
      else if (num_of_bd == 1)
8910
        $display("    ->packet with length %0d sent", (i_length + 4));
8911
      else if (num_of_bd == 2)
8912
        $display("    ->packet with length %0d sent", (i_length + 4));
8913
      // set length (loop variable)
8914
      i_length = i_length + 1;
8915
      // the number of frame transmitted
8916
      num_of_frames = num_of_frames + 1;
8917
      num_of_bd = num_of_bd + 1;
8918
      @(posedge wb_clk);
8919
    end
8920
    // disable TX
8921 274 tadejm
    wait (wbm_working == 0);
8922 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
8923
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8924
    @(posedge wb_clk);
8925
    if(fail == 0)
8926
      test_ok;
8927
    else
8928
      fail = 0;
8929
  end
8930
 
8931
 
8932
  ////////////////////////////////////////////////////////////////////
8933
  ////                                                            ////
8934
  ////  Test transmit packets across changed MINFL value at       ////
8935
  ////  7 TX buffer decriptors ( 100Mbps ).                       ////
8936
  ////                                                            ////
8937
  ////////////////////////////////////////////////////////////////////
8938
  if (test_num == 15) // without and with padding
8939
  begin
8940
    // TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
8941
    test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
8942
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
8943
 
8944
    hard_reset;
8945 279 mohor
 
8946 209 tadejm
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
8947
 
8948
    max_tmp = 0;
8949
    min_tmp = 0;
8950
    num_of_frames = 0;
8951
    num_of_bd = 0;
8952
    // set 7 TX buffer descriptors - must be set before TX enable
8953 274 tadejm
    wait (wbm_working == 0);
8954 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8955
    // prepare a packet of MAXFL + 10 length
8956 274 tadejm
    wait (wbm_working == 0);
8957 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8958
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
8959
    min_tmp = tmp[31:16];
8960
    // change MINFL value
8961
    min_tmp = max_tmp - 177;
8962 274 tadejm
    wait (wbm_working == 0);
8963 209 tadejm
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8964
    st_data = 8'h62;
8965
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
8966
    // enable TX, set full-duplex mode, padding and CRC appending
8967 274 tadejm
    wait (wbm_working == 0);
8968 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
8969
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8970
    // check WB INT signal
8971
    if (wb_int !== 1'b0)
8972
    begin
8973
      test_fail("WB INT signal should not be set");
8974
      fail = fail + 1;
8975
    end
8976
 
8977
    // write to phy's control register for 100Mbps
8978
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
8979
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
8980
    speed = 100;
8981
 
8982
    i_length = (min_tmp - 5);
8983
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
8984
    begin
8985
      // Reset_tx_bd nable interrupt generation
8986
      // unmask interrupts
8987 274 tadejm
      wait (wbm_working == 0);
8988 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
8989
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8990
      // not detect carrier sense in FD and no collision
8991
      eth_phy.carrier_sense_tx_fd_detect(0);
8992
      eth_phy.collision(0);
8993
      // first destination address on ethernet PHY
8994
      eth_phy.set_tx_mem_addr(0);
8995
      // prepare BDs
8996
      if (num_of_bd == 0)
8997
      begin
8998
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
8999
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9000
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9001
        set_tx_bd_wrap(2);
9002
        set_tx_bd_ready(0, 0);
9003
      end
9004
      else if (num_of_bd == 1)
9005
        set_tx_bd_ready(1, 1);
9006
      else if (num_of_bd == 2)
9007
        set_tx_bd_ready(2, 2);
9008
      // CHECK END OF TRANSMITION
9009
      check_tx_bd(num_of_bd, data);
9010
        wait (MTxEn === 1'b1); // start transmit
9011
      check_tx_bd(num_of_bd, data);
9012
        if (data[15] !== 1)
9013
        begin
9014
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9015
          fail = fail + 1;
9016
        end
9017
        wait (MTxEn === 1'b0); // end transmit
9018
        while (data[15] === 1)
9019
        begin
9020
      check_tx_bd(num_of_bd, data);
9021
          @(posedge wb_clk);
9022
        end
9023
        repeat (1) @(posedge wb_clk);
9024
      // check length of a PACKET
9025
      tmp_len = eth_phy.tx_len;
9026
      #1;
9027
      if (tmp_len != (i_length + 4))
9028
      begin
9029
        test_fail("Wrong length of the packet out from MAC");
9030
        fail = fail + 1;
9031
      end
9032
      // checking packet
9033
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9034
      if (tmp > 0)
9035
      begin
9036
        test_fail("Wrong data of the transmitted packet");
9037
        fail = fail + 1;
9038
      end
9039
      // check transmited TX packet CRC
9040 279 mohor
      if (num_of_bd !== 0)
9041
        check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9042
      else
9043
        tmp = 0;
9044
 
9045 209 tadejm
      if (tmp > 0)
9046
      begin
9047
        test_fail("Wrong CRC of the transmitted packet");
9048
        fail = fail + 1;
9049
      end
9050
      // check WB INT signal
9051
      if (wb_int !== 1'b1)
9052
      begin
9053
        `TIME; $display("*E WB INT signal should be set");
9054
        test_fail("WB INT signal should be set");
9055
        fail = fail + 1;
9056
      end
9057
      // check TX buffer descriptor of a packet
9058
      check_tx_bd(num_of_bd, data);
9059
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
9060
           ((data[15:0] !== 16'h5800) && (num_of_bd < 2)) )   // without wrap bit
9061
      begin
9062
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9063
        test_fail("TX buffer descriptor status is not correct");
9064
        fail = fail + 1;
9065
      end
9066
      // check interrupts
9067 274 tadejm
      wait (wbm_working == 0);
9068 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9069
      if ((data & `ETH_INT_TXB) !== 1'b1)
9070
      begin
9071
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9072
        test_fail("Interrupt Transmit Buffer was not set");
9073
        fail = fail + 1;
9074
      end
9075
      if ((data & (~`ETH_INT_TXB)) !== 0)
9076
      begin
9077
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9078
        test_fail("Other interrupts (except Transmit Buffer) were set");
9079
        fail = fail + 1;
9080
      end
9081
      // clear interrupts
9082 274 tadejm
      wait (wbm_working == 0);
9083 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9084
      // check WB INT signal
9085
      if (wb_int !== 1'b0)
9086
      begin
9087
        test_fail("WB INT signal should not be set");
9088
        fail = fail + 1;
9089
      end
9090
      // INTERMEDIATE DISPLAYS
9091
      if (num_of_bd == 0)
9092
        $display("    ->packet with length %0d sent", (i_length + 4));
9093
      else if (num_of_bd == 1)
9094
        $display("    ->packet with length %0d sent", (i_length + 4));
9095
      else if (num_of_bd == 2)
9096
        $display("    ->packet with length %0d sent", (i_length + 4));
9097
      // set length (loop variable)
9098
      i_length = i_length + 1;
9099
      // the number of frame transmitted
9100
      num_of_frames = num_of_frames + 1;
9101
      num_of_bd = num_of_bd + 1;
9102
      @(posedge wb_clk);
9103
    end
9104
    // disable TX
9105 274 tadejm
    wait (wbm_working == 0);
9106 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9107
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9108
    @(posedge wb_clk);
9109
    if(fail == 0)
9110
      test_ok;
9111
    else
9112
      fail = 0;
9113
  end
9114
 
9115
 
9116
  ////////////////////////////////////////////////////////////////////
9117
  ////                                                            ////
9118
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9119
  ////  19 TX buffer decriptors ( 10Mbps ).                       ////
9120
  ////                                                            ////
9121
  ////////////////////////////////////////////////////////////////////
9122
  if (test_num == 16) // without and with padding
9123
  begin
9124
    // TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
9125
    test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
9126
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
9127
 
9128
    // reset MAC registers
9129
    hard_reset;
9130
    // reset MAC and MII LOGIC with soft reset
9131 274 tadejm
//    reset_mac;
9132
//    reset_mii;
9133 209 tadejm
    // set wb slave response
9134
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9135
 
9136
    max_tmp = 0;
9137
    min_tmp = 0;
9138
    num_of_frames = 0;
9139
    num_of_bd = 0;
9140
    // set 19 TX buffer descriptors - must be set before TX enable
9141 274 tadejm
    wait (wbm_working == 0);
9142 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9143
    // prepare a packet of 64k - 1 length (16'hFFFF)
9144 274 tadejm
    wait (wbm_working == 0);
9145 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9146
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9147
    min_tmp = tmp[31:16];
9148
    st_data = 8'h8D;
9149
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9150
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9151 274 tadejm
    wait (wbm_working == 0);
9152 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9153
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9154
    // check WB INT signal
9155
    if (wb_int !== 1'b0)
9156
    begin
9157
      test_fail("WB INT signal should not be set");
9158
      fail = fail + 1;
9159
    end
9160
 
9161
    // write to phy's control register for 10Mbps
9162
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9163
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9164
    speed = 10;
9165
 
9166
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9167
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9168
    begin
9169
      $display("   i_length = %0d", i_length);
9170
      // Reset_tx_bd nable interrupt generation
9171
      // unmask interrupts
9172 274 tadejm
      wait (wbm_working == 0);
9173 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9174
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9175
      // not detect carrier sense in FD and no collision
9176
      eth_phy.carrier_sense_tx_fd_detect(0);
9177
      eth_phy.collision(0);
9178
      // first destination address on ethernet PHY
9179
      eth_phy.set_tx_mem_addr(0);
9180
      // prepare BDs
9181
      if (num_of_bd == 0)
9182
      begin
9183
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9184
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9185
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9186
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9187
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9188
        set_tx_bd_wrap(4);
9189
        set_tx_bd_ready(0, 0);
9190
      end
9191
      else if (num_of_bd == 1)
9192
        set_tx_bd_ready(1, 1);
9193
      else if (num_of_bd == 2)
9194
        set_tx_bd_ready(2, 2);
9195
      else if (num_of_bd == 3)
9196
        set_tx_bd_ready(3, 3);
9197
      else if (num_of_bd == 4)
9198
        set_tx_bd_ready(4, 4);
9199
      // CHECK END OF TRANSMITION
9200
      check_tx_bd(num_of_bd, data);
9201
        wait (MTxEn === 1'b1); // start transmit
9202
      check_tx_bd(num_of_bd, data);
9203
        if (data[15] !== 1)
9204
        begin
9205
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9206
          fail = fail + 1;
9207
        end
9208
        wait (MTxEn === 1'b0); // end transmit
9209
        while (data[15] === 1)
9210
        begin
9211
      check_tx_bd(num_of_bd, data);
9212
          @(posedge wb_clk);
9213
        end
9214
        repeat (1) @(posedge wb_clk);
9215
      // check length of a PACKET
9216
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9217
      tmp_len = eth_phy.tx_len;
9218
      #1;
9219
      if (tmp_len != (i_length + 4))
9220
      begin
9221
        test_fail("Wrong length of the packet out from MAC");
9222
        fail = fail + 1;
9223
      end
9224
      // checking packet
9225
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9226
      if (tmp > 0)
9227
      begin
9228
        test_fail("Wrong data of the transmitted packet");
9229
        fail = fail + 1;
9230
      end
9231
      // check transmited TX packet CRC
9232
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9233
      if (tmp > 0)
9234
      begin
9235
        test_fail("Wrong CRC of the transmitted packet");
9236
        fail = fail + 1;
9237
      end
9238
      // check WB INT signal
9239
      if (wb_int !== 1'b1)
9240
      begin
9241
        `TIME; $display("*E WB INT signal should be set");
9242
        test_fail("WB INT signal should be set");
9243
        fail = fail + 1;
9244
      end
9245
      // check TX buffer descriptor of a packet
9246
      check_tx_bd(num_of_bd, data);
9247
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9248
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9249
      begin
9250
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9251
        test_fail("TX buffer descriptor status is not correct");
9252
        fail = fail + 1;
9253
      end
9254
      // check interrupts
9255 274 tadejm
      wait (wbm_working == 0);
9256 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9257
      if ((data & `ETH_INT_TXB) !== 1'b1)
9258
      begin
9259
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9260
        test_fail("Interrupt Transmit Buffer was not set");
9261
        fail = fail + 1;
9262
      end
9263
      if ((data & (~`ETH_INT_TXB)) !== 0)
9264
      begin
9265
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9266
        test_fail("Other interrupts (except Transmit Buffer) were set");
9267
        fail = fail + 1;
9268
      end
9269
      // clear interrupts
9270 274 tadejm
      wait (wbm_working == 0);
9271 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9272
      // check WB INT signal
9273
      if (wb_int !== 1'b0)
9274
      begin
9275
        test_fail("WB INT signal should not be set");
9276
        fail = fail + 1;
9277
      end
9278
      // INTERMEDIATE DISPLAYS
9279
      $display("    ->packet with length %0d sent", (i_length + 4));
9280
      // set length (loop variable)
9281
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9282
        i_length = i_length + 1;
9283
      else if (num_of_bd == 2)
9284
        i_length = (16'hFFFF - 5);
9285
      // the number of frame transmitted
9286
      num_of_frames = num_of_frames + 1;
9287
      num_of_bd = num_of_bd + 1;
9288
      @(posedge wb_clk);
9289
    end
9290
    // disable TX
9291 274 tadejm
    wait (wbm_working == 0);
9292 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9293
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9294
    @(posedge wb_clk);
9295
    if(fail == 0)
9296
      test_ok;
9297
    else
9298
      fail = 0;
9299
  end
9300
 
9301
 
9302
  ////////////////////////////////////////////////////////////////////
9303
  ////                                                            ////
9304
  ////  Test transmit packets across MAXFL with HUGEN at          ////
9305
  ////  19 TX buffer decriptors ( 100Mbps ).                      ////
9306
  ////                                                            ////
9307
  ////////////////////////////////////////////////////////////////////
9308
  if (test_num == 17) // without and with padding
9309
  begin
9310
    // TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
9311
    test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
9312
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
9313
 
9314
    // reset MAC registers
9315
    hard_reset;
9316
    // reset MAC and MII LOGIC with soft reset
9317 274 tadejm
//    reset_mac;
9318
//    reset_mii;
9319 209 tadejm
    // set wb slave response
9320
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9321
 
9322
    max_tmp = 0;
9323
    min_tmp = 0;
9324
    num_of_frames = 0;
9325
    num_of_bd = 0;
9326
    // set 19 TX buffer descriptors - must be set before TX enable
9327 274 tadejm
    wait (wbm_working == 0);
9328 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9329
    // prepare a packet of 64k - 1 length (16'hFFFF)
9330 274 tadejm
    wait (wbm_working == 0);
9331 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9332
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9333
    min_tmp = tmp[31:16];
9334
    st_data = 8'h8D;
9335
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
9336
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
9337 274 tadejm
    wait (wbm_working == 0);
9338 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
9339
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9340
    // check WB INT signal
9341
    if (wb_int !== 1'b0)
9342
    begin
9343
      test_fail("WB INT signal should not be set");
9344
      fail = fail + 1;
9345
    end
9346
 
9347
    // write to phy's control register for 100Mbps
9348
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9349
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9350
    speed = 100;
9351
 
9352
    i_length = (max_tmp - 5); // (max_tmp - 4) is the MAXFL limit
9353
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
9354
    begin
9355
      $display("   i_length = %0d", i_length);
9356
      // Reset_tx_bd nable interrupt generation
9357
      // unmask interrupts
9358 274 tadejm
      wait (wbm_working == 0);
9359 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9360
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9361
      // not detect carrier sense in FD and no collision
9362
      eth_phy.carrier_sense_tx_fd_detect(0);
9363
      eth_phy.collision(0);
9364
      // first destination address on ethernet PHY
9365
      eth_phy.set_tx_mem_addr(0);
9366
      // prepare BDs
9367
      if (num_of_bd == 0)
9368
      begin
9369
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9370
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9371
        set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9372
        set_tx_bd(3, 3, (16'hFFFF - 5), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9373
        set_tx_bd(4, 4, (16'hFFFF - 4), 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9374
        set_tx_bd_wrap(4);
9375
        set_tx_bd_ready(0, 0);
9376
      end
9377
      else if (num_of_bd == 1)
9378
        set_tx_bd_ready(1, 1);
9379
      else if (num_of_bd == 2)
9380
        set_tx_bd_ready(2, 2);
9381
      else if (num_of_bd == 3)
9382
        set_tx_bd_ready(3, 3);
9383
      else if (num_of_bd == 4)
9384
        set_tx_bd_ready(4, 4);
9385
      // CHECK END OF TRANSMITION
9386
      check_tx_bd(num_of_bd, data);
9387
        wait (MTxEn === 1'b1); // start transmit
9388
      check_tx_bd(num_of_bd, data);
9389
        if (data[15] !== 1)
9390
        begin
9391
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9392
          fail = fail + 1;
9393
        end
9394
        wait (MTxEn === 1'b0); // end transmit
9395
        while (data[15] === 1)
9396
        begin
9397
      check_tx_bd(num_of_bd, data);
9398
          @(posedge wb_clk);
9399
        end
9400
        repeat (1) @(posedge wb_clk);
9401
      // check length of a PACKET
9402
      $display("   eth_phy length = %0d", eth_phy.tx_len);
9403
      tmp_len = eth_phy.tx_len;
9404
      #1;
9405
      if (tmp_len != (i_length + 4))
9406
      begin
9407
        test_fail("Wrong length of the packet out from MAC");
9408
        fail = fail + 1;
9409
      end
9410
      // checking packet
9411
      check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
9412
      if (tmp > 0)
9413
      begin
9414
        test_fail("Wrong data of the transmitted packet");
9415
        fail = fail + 1;
9416
      end
9417
      // check transmited TX packet CRC
9418
      check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
9419
      if (tmp > 0)
9420
      begin
9421
        test_fail("Wrong CRC of the transmitted packet");
9422
        fail = fail + 1;
9423
      end
9424
      // check WB INT signal
9425
      if (wb_int !== 1'b1)
9426
      begin
9427
        `TIME; $display("*E WB INT signal should be set");
9428
        test_fail("WB INT signal should be set");
9429
        fail = fail + 1;
9430
      end
9431
      // check TX buffer descriptor of a packet
9432
      check_tx_bd(num_of_bd, data);
9433
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 4)) || // wrap bit
9434
           ((data[15:0] !== 16'h5800) && (num_of_bd < 4)) )   // without wrap bit
9435
      begin
9436
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9437
        test_fail("TX buffer descriptor status is not correct");
9438
        fail = fail + 1;
9439
      end
9440
      // check interrupts
9441 274 tadejm
      wait (wbm_working == 0);
9442 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9443
      if ((data & `ETH_INT_TXB) !== 1'b1)
9444
      begin
9445
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9446
        test_fail("Interrupt Transmit Buffer was not set");
9447
        fail = fail + 1;
9448
      end
9449
      if ((data & (~`ETH_INT_TXB)) !== 0)
9450
      begin
9451
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9452
        test_fail("Other interrupts (except Transmit Buffer) were set");
9453
        fail = fail + 1;
9454
      end
9455
      // clear interrupts
9456 274 tadejm
      wait (wbm_working == 0);
9457 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9458
      // check WB INT signal
9459
      if (wb_int !== 1'b0)
9460
      begin
9461
        test_fail("WB INT signal should not be set");
9462
        fail = fail + 1;
9463
      end
9464
      // INTERMEDIATE DISPLAYS
9465
      $display("    ->packet with length %0d sent", (i_length + 4));
9466
      // set length (loop variable)
9467
      if ((num_of_bd < 2) || (num_of_bd >= 3))
9468
        i_length = i_length + 1;
9469
      else if (num_of_bd == 2)
9470
        i_length = (16'hFFFF - 5);
9471
      // the number of frame transmitted
9472
      num_of_frames = num_of_frames + 1;
9473
      num_of_bd = num_of_bd + 1;
9474
      @(posedge wb_clk);
9475
    end
9476
    // disable TX
9477 274 tadejm
    wait (wbm_working == 0);
9478 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9479
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9480
    @(posedge wb_clk);
9481
    if(fail == 0)
9482
      test_ok;
9483
    else
9484
      fail = 0;
9485
  end
9486
 
9487
 
9488
  ////////////////////////////////////////////////////////////////////
9489
  ////                                                            ////
9490
  ////  Test IPG during Back-to-Back transmit at                  ////
9491
  ////  88 TX buffer decriptors ( 10Mbps ).                       ////
9492
  ////                                                            ////
9493
  ////////////////////////////////////////////////////////////////////
9494
  if (test_num == 18) // without and with padding
9495
  begin
9496
    // TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
9497
    test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
9498
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
9499
 
9500
    // reset MAC registers
9501
    hard_reset;
9502
    // reset MAC and MII LOGIC with soft reset
9503 274 tadejm
//    reset_mac;
9504
//    reset_mii;
9505 209 tadejm
    // set wb slave response
9506
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9507
 
9508
    max_tmp = 0;
9509
    min_tmp = 0;
9510
    num_of_frames = 0;
9511
    num_of_bd = 0;
9512
    tmp_ipgt = 0;
9513
    // set 88 TX buffer descriptors - must be set before TX enable
9514 274 tadejm
    wait (wbm_working == 0);
9515 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9516
    // enable TX, set full-duplex mode, NO padding and CRC appending
9517 274 tadejm
    wait (wbm_working == 0);
9518 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9519
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9520
    // prepare two packets of MAXFL length
9521 274 tadejm
    wait (wbm_working == 0);
9522 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9523
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9524
    min_tmp = tmp[31:16];
9525
    st_data = 8'h29;
9526
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9527
    // check WB INT signal
9528
    if (wb_int !== 1'b0)
9529
    begin
9530
      test_fail("WB INT signal should not be set");
9531
      fail = fail + 1;
9532
    end
9533
 
9534
    // write to phy's control register for 10Mbps
9535
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
9536
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
9537
    speed = 10;
9538
 
9539
    i_length = (min_tmp - 4);
9540
    while (i_length < (max_tmp - 4))
9541
    begin
9542
      // disable TX, set full-duplex mode, NO padding and CRC appending
9543 274 tadejm
      wait (wbm_working == 0);
9544 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9545
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9546
      // set IPGT register
9547 274 tadejm
      wait (wbm_working == 0);
9548 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9549
      // enable TX, set full-duplex mode, NO padding and CRC appending
9550 274 tadejm
      wait (wbm_working == 0);
9551 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9552
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9553
      // Reset_tx_bd enable interrupt generation
9554
      // unmask interrupts
9555 274 tadejm
      wait (wbm_working == 0);
9556 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9557
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9558
      // not detect carrier sense in FD and no collision
9559
      eth_phy.carrier_sense_tx_fd_detect(0);
9560
      eth_phy.collision(0);
9561
      // first destination address on ethernet PHY
9562
      eth_phy.set_tx_mem_addr(0);
9563
      // prepare BDs
9564
      if (num_of_bd == 0)
9565
      begin
9566
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9567
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9568
        set_tx_bd_wrap(1);
9569
        set_tx_bd_ready(0, 0);
9570
        set_tx_bd_ready(1, 1);
9571
      end
9572
      // CHECK END OF TWO TRANSMITIONs
9573
      // wait for first transmit to end
9574
      check_tx_bd(num_of_bd, data);
9575
      wait (MTxEn === 1'b1); // start transmit
9576
      if (data[15] !== 1)
9577
      begin
9578
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9579
        fail = fail + 1;
9580
      end
9581
      wait (MTxEn === 1'b0); // end transmit
9582
      num_of_frames = num_of_frames + 1;
9583
      num_of_bd = num_of_bd + 1;
9584
      #Tp;
9585
      // destination address on ethernet PHY
9586
      eth_phy.set_tx_mem_addr(0);
9587
      i1 = 0;
9588
      i2 = 0;
9589
      // count IPG clock periods
9590
      fork
9591
        begin
9592
          wait (MTxEn === 1'b1); // start second transmit
9593
          #Tp;
9594
          disable count_rising;
9595
          disable count_falling;
9596
        end
9597
        begin: count_rising
9598
          forever
9599
          begin
9600
            @(posedge mtx_clk);
9601
            i1 = i1 + 1;
9602
            #Tp;
9603
          end
9604
        end
9605
        begin: count_falling
9606
          forever
9607
          begin
9608
            @(negedge mtx_clk);
9609
            i2 = i2 + 1;
9610
            #Tp;
9611
          end
9612
        end
9613
      join
9614
      // check IPG length - INTERMEDIATE DISPLAYS
9615
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9616
      begin
9617
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9618
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9619
      end
9620
      else
9621
      begin
9622
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9623
        fail = fail + 1;
9624
        test_fail("IPG is not correct");
9625
      end
9626
      // wait for second transmit to end
9627
      wait (MTxEn === 1'b0); // end second transmit
9628
      while (data[15] === 1)
9629
      begin
9630
        check_tx_bd(num_of_bd, data);
9631
        @(posedge wb_clk);
9632
      end
9633
      repeat (1) @(posedge wb_clk);
9634
      // check length of a second PACKET
9635
      tmp_len = eth_phy.tx_len;
9636
      #1;
9637
      if (tmp_len != (i_length + 4 + 1))
9638
      begin
9639
        test_fail("Wrong length of second packet out from MAC");
9640
        fail = fail + 1;
9641
      end
9642
      // checking second packet
9643
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9644
      if (tmp > 0)
9645
      begin
9646
        test_fail("Wrong data of second transmitted packet");
9647
        fail = fail + 1;
9648
      end
9649
      // check second transmited TX packet CRC
9650
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9651
      if (tmp > 0)
9652
      begin
9653
        test_fail("Wrong CRC of second transmitted packet");
9654
        fail = fail + 1;
9655
      end
9656
      // check WB INT signal
9657
      if (wb_int !== 1'b1)
9658
      begin
9659
        `TIME; $display("*E WB INT signal should be set");
9660
        test_fail("WB INT signal should be set");
9661
        fail = fail + 1;
9662
      end
9663
      // check TX buffer descriptor of a packet
9664
      check_tx_bd(num_of_bd, data);
9665
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9666
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9667
      begin
9668
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9669
        test_fail("TX buffer descriptor status is not correct");
9670
        fail = fail + 1;
9671
      end
9672
      // check interrupts
9673 274 tadejm
      wait (wbm_working == 0);
9674 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9675
      if ((data & `ETH_INT_TXB) !== 1'b1)
9676
      begin
9677
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9678
        test_fail("Interrupt Transmit Buffer was not set");
9679
        fail = fail + 1;
9680
      end
9681
      if ((data & (~`ETH_INT_TXB)) !== 0)
9682
      begin
9683
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9684
        test_fail("Other interrupts (except Transmit Buffer) were set");
9685
        fail = fail + 1;
9686
      end
9687
      // clear interrupts
9688 274 tadejm
      wait (wbm_working == 0);
9689 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9690
      // check WB INT signal
9691
      if (wb_int !== 1'b0)
9692
      begin
9693
        test_fail("WB INT signal should not be set");
9694
        fail = fail + 1;
9695
      end
9696
      // set length (LOOP variable)
9697
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9698
        i_length = i_length + 2;
9699
      else
9700
        i_length = (max_tmp - 4);
9701
      // set IPGT
9702
      if ((tmp_ipgt + 3) < 10)
9703
        tmp_ipgt = tmp_ipgt + 1;
9704
      else if ((tmp_ipgt + 3) < 24)
9705
        tmp_ipgt = tmp_ipgt + 7;
9706
      else if ((tmp_ipgt + 3) == 24)
9707
        tmp_ipgt = 38 - 3;
9708
      else if ((tmp_ipgt + 3) == 38)
9709
        tmp_ipgt = 72 - 3;
9710
      else if ((tmp_ipgt + 3) == 72)
9711
        tmp_ipgt = 130 - 3; // 124 - 3
9712
      // the number of frame transmitted
9713
      num_of_frames = num_of_frames + 1;
9714
      num_of_bd = 0;
9715
      @(posedge wb_clk);
9716
    end
9717
    // disable TX
9718 274 tadejm
    wait (wbm_working == 0);
9719 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9720
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9721
    @(posedge wb_clk);
9722
    if(fail == 0)
9723
      test_ok;
9724
    else
9725
      fail = 0;
9726
  end
9727
 
9728
 
9729
  ////////////////////////////////////////////////////////////////////
9730
  ////                                                            ////
9731
  ////  Test IPG during Back-to-Back transmit at                  ////
9732
  ////  88 TX buffer decriptors ( 100Mbps ).                      ////
9733
  ////                                                            ////
9734
  ////////////////////////////////////////////////////////////////////
9735
  if (test_num == 19) // without and with padding
9736
  begin
9737
    // TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
9738
    test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
9739
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
9740
 
9741
    // reset MAC registers
9742
    hard_reset;
9743
    // reset MAC and MII LOGIC with soft reset
9744 274 tadejm
//    reset_mac;
9745
//    reset_mii;
9746 209 tadejm
    // set wb slave response
9747
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9748
 
9749
    max_tmp = 0;
9750
    min_tmp = 0;
9751
    num_of_frames = 0;
9752
    num_of_bd = 0;
9753
    tmp_ipgt = 0;
9754
    // set 88 TX buffer descriptors - must be set before TX enable
9755 274 tadejm
    wait (wbm_working == 0);
9756 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9757
    // enable TX, set full-duplex mode, NO padding and CRC appending
9758 274 tadejm
    wait (wbm_working == 0);
9759 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9760
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9761
    // prepare two packets of MAXFL length
9762 274 tadejm
    wait (wbm_working == 0);
9763 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9764
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
9765
    min_tmp = tmp[31:16];
9766
    st_data = 8'h29;
9767
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
9768
    // check WB INT signal
9769
    if (wb_int !== 1'b0)
9770
    begin
9771
      test_fail("WB INT signal should not be set");
9772
      fail = fail + 1;
9773
    end
9774
 
9775
    // write to phy's control register for 100Mbps
9776
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
9777
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
9778
    speed = 100;
9779
 
9780
    i_length = (min_tmp - 4);
9781
    while (i_length < (max_tmp - 4))
9782
    begin
9783
      // disable TX, set full-duplex mode, NO padding and CRC appending
9784 274 tadejm
      wait (wbm_working == 0);
9785 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9786
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9787
      // set IPGT register
9788 274 tadejm
      wait (wbm_working == 0);
9789 209 tadejm
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9790
      // enable TX, set full-duplex mode, NO padding and CRC appending
9791 274 tadejm
      wait (wbm_working == 0);
9792 209 tadejm
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9793
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9794
      // Reset_tx_bd enable interrupt generation
9795
      // unmask interrupts
9796 274 tadejm
      wait (wbm_working == 0);
9797 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
9798
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9799
      // not detect carrier sense in FD and no collision
9800
      eth_phy.carrier_sense_tx_fd_detect(0);
9801
      eth_phy.collision(0);
9802
      // first destination address on ethernet PHY
9803
      eth_phy.set_tx_mem_addr(0);
9804
      // prepare BDs
9805
      if (num_of_bd == 0)
9806
      begin
9807
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9808
        set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
9809
        set_tx_bd_wrap(1);
9810
        set_tx_bd_ready(0, 0);
9811
        set_tx_bd_ready(1, 1);
9812
      end
9813
      // CHECK END OF TWO TRANSMITIONs
9814
      // wait for first transmit to end
9815
      check_tx_bd(num_of_bd, data);
9816
      wait (MTxEn === 1'b1); // start transmit
9817
      if (data[15] !== 1)
9818
      begin
9819
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
9820
        fail = fail + 1;
9821
      end
9822
      wait (MTxEn === 1'b0); // end transmit
9823
      num_of_frames = num_of_frames + 1;
9824
      num_of_bd = num_of_bd + 1;
9825
      #Tp;
9826
      // destination address on ethernet PHY
9827
      eth_phy.set_tx_mem_addr(0);
9828
      i1 = 0;
9829
      i2 = 0;
9830
      // count IPG clock periods
9831
      fork
9832
        begin
9833
          wait (MTxEn === 1'b1); // start second transmit
9834
          #Tp;
9835
          disable count_rising1;
9836
          disable count_falling1;
9837
        end
9838
        begin: count_rising1
9839
          forever
9840
          begin
9841
            @(posedge mtx_clk);
9842
            i1 = i1 + 1;
9843
            #Tp;
9844
          end
9845
        end
9846
        begin: count_falling1
9847
          forever
9848
          begin
9849
            @(negedge mtx_clk);
9850
            i2 = i2 + 1;
9851
            #Tp;
9852
          end
9853
        end
9854
      join
9855
      // check IPG length - INTERMEDIATE DISPLAYS
9856
      if((i1 == i2) && (i1 >= (tmp_ipgt + 3)))
9857
      begin
9858
        $display("    ->IPG with %0d mtx_clk periods (min %0d) between packets with lengths %0d and %0d checked",
9859
                  i1, (tmp_ipgt + 3), (i_length + 4), (i_length + 4 + 1));
9860
      end
9861
      else
9862
      begin
9863
        `TIME; $display("*E IPG is not correct: (%0d + %0d) / 2, requested: %d", i1, i2, (tmp_ipgt + 3));
9864
        fail = fail + 1;
9865
        test_fail("IPG is not correct");
9866
      end
9867
      // wait for second transmit to end
9868
      wait (MTxEn === 1'b0); // end second transmit
9869
      while (data[15] === 1)
9870
      begin
9871
        check_tx_bd(num_of_bd, data);
9872
        @(posedge wb_clk);
9873
      end
9874
      repeat (1) @(posedge wb_clk);
9875
      // check length of a second PACKET
9876
      tmp_len = eth_phy.tx_len;
9877
      #1;
9878
      if (tmp_len != (i_length + 4 + 1))
9879
      begin
9880
        test_fail("Wrong length of second packet out from MAC");
9881
        fail = fail + 1;
9882
      end
9883
      // checking second packet
9884
      check_tx_packet(`MEMORY_BASE, 0, (i_length + 1), tmp);
9885
      if (tmp > 0)
9886
      begin
9887
        test_fail("Wrong data of second transmitted packet");
9888
        fail = fail + 1;
9889
      end
9890
      // check second transmited TX packet CRC
9891
      check_tx_crc(0, (i_length + 1), 1'b0, tmp); // length without CRC
9892
      if (tmp > 0)
9893
      begin
9894
        test_fail("Wrong CRC of second transmitted packet");
9895
        fail = fail + 1;
9896
      end
9897
      // check WB INT signal
9898
      if (wb_int !== 1'b1)
9899
      begin
9900
        `TIME; $display("*E WB INT signal should be set");
9901
        test_fail("WB INT signal should be set");
9902
        fail = fail + 1;
9903
      end
9904
      // check TX buffer descriptor of a packet
9905
      check_tx_bd(num_of_bd, data);
9906
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
9907
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
9908
      begin
9909
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
9910
        test_fail("TX buffer descriptor status is not correct");
9911
        fail = fail + 1;
9912
      end
9913
      // check interrupts
9914 274 tadejm
      wait (wbm_working == 0);
9915 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9916
      if ((data & `ETH_INT_TXB) !== 1'b1)
9917
      begin
9918
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
9919
        test_fail("Interrupt Transmit Buffer was not set");
9920
        fail = fail + 1;
9921
      end
9922
      if ((data & (~`ETH_INT_TXB)) !== 0)
9923
      begin
9924
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
9925
        test_fail("Other interrupts (except Transmit Buffer) were set");
9926
        fail = fail + 1;
9927
      end
9928
      // clear interrupts
9929 274 tadejm
      wait (wbm_working == 0);
9930 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9931
      // check WB INT signal
9932
      if (wb_int !== 1'b0)
9933
      begin
9934
        test_fail("WB INT signal should not be set");
9935
        fail = fail + 1;
9936
      end
9937
      // set length (LOOP variable)
9938
      if ((tmp_ipgt + 3) < 130) // tmp_ipgt < 124
9939
        i_length = i_length + 2;
9940
      else
9941
        i_length = (max_tmp - 4);
9942
      // set IPGT
9943
      if ((tmp_ipgt + 3) < 10)
9944
        tmp_ipgt = tmp_ipgt + 1;
9945
      else if ((tmp_ipgt + 3) < 24)
9946
        tmp_ipgt = tmp_ipgt + 7;
9947
      else if ((tmp_ipgt + 3) == 24)
9948
        tmp_ipgt = 38 - 3;
9949
      else if ((tmp_ipgt + 3) == 38)
9950
        tmp_ipgt = 72 - 3;
9951
      else if ((tmp_ipgt + 3) == 72)
9952
        tmp_ipgt = 130 - 3; // 124 - 3
9953
      // the number of frame transmitted
9954
      num_of_frames = num_of_frames + 1;
9955
      num_of_bd = 0;
9956
      @(posedge wb_clk);
9957
    end
9958
    // disable TX
9959 274 tadejm
    wait (wbm_working == 0);
9960 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
9961
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9962
    @(posedge wb_clk);
9963
    if(fail == 0)
9964
      test_ok;
9965
    else
9966
      fail = 0;
9967
  end
9968
 
9969
 
9970
  ////////////////////////////////////////////////////////////////////
9971
  ////                                                            ////
9972
  ////  Test transmit packets after TX under-run on each packet's ////
9973
  ////  byte at 2 TX buffer decriptors ( 10Mbps ).                ////
9974
  ////                                                            ////
9975
  ////////////////////////////////////////////////////////////////////
9976
  if (test_num == 20) // without padding
9977
  begin
9978
    // TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
9979
    test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
9980
    `TIME;
9981
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
9982
 
9983
    // reset MAC registers
9984
    hard_reset;
9985
    // set wb slave response
9986
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
9987
 
9988
    max_tmp = 0;
9989
    min_tmp = 0;
9990
    // set 2 TX buffer descriptors - must be set before TX enable
9991 274 tadejm
    wait (wbm_working == 0);
9992 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9993
    // enable TX, set full-duplex mode, NO padding and CRC appending
9994 274 tadejm
    wait (wbm_working == 0);
9995 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
9996
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
9997
    // prepare a packet of MAXFL length
9998 274 tadejm
    wait (wbm_working == 0);
9999 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10000
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10001
    min_tmp = tmp[31:16];
10002
    st_data = 8'h99;
10003
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10004
    // read IPG value
10005 274 tadejm
    wait (wbm_working == 0);
10006 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10007
    // check WB INT signal
10008
    if (wb_int !== 1'b0)
10009
    begin
10010
      test_fail("WB INT signal should not be set");
10011
      fail = fail + 1;
10012
    end
10013
 
10014
    // write to phy's control register for 10Mbps
10015
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
10016
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10017
    speed = 10;
10018
 
10019 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10020 209 tadejm
    num_of_bd = 0;
10021
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10022 279 mohor
    i_length = 80;
10023 209 tadejm
    while (i_length < (max_tmp - 4))
10024
    begin
10025
      // Reset_tx_bd enable interrupt generation
10026
      // unmask interrupts
10027 274 tadejm
      wait (wbm_working == 0);
10028 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10029
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10030
      // not detect carrier sense in FD and no collision
10031
      eth_phy.carrier_sense_tx_fd_detect(0);
10032
      eth_phy.collision(0);
10033
      // first destination address on ethernet PHY
10034
      eth_phy.set_tx_mem_addr(0);
10035
      // prepare BDs
10036
      if (num_of_bd == 0)
10037
      begin
10038
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10039
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10040
        set_tx_bd_wrap(1);
10041
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10042
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10043 223 tadejm
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10044 209 tadejm
        set_tx_bd_ready(1, 1);
10045
        set_tx_bd_ready(0, 0);
10046
      end
10047
      // frame under-run checking
10048
      frame_started = 0;
10049
      frame_ended = 0;
10050
      wait_for_frame = 0;
10051 279 mohor
      no_underrun = 0;
10052 209 tadejm
      fork
10053
        begin
10054
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10055
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10056 279 mohor
          i = 0;
10057
          while (i <= (num_of_frames[31:2] + 1))
10058
          begin
10059
            @(negedge wb_clk);
10060
            if (eth_ma_wb_ack_i)
10061
            begin
10062
              i = i + 1;
10063
            end
10064
          end
10065 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10066
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10067 223 tadejm
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10068 209 tadejm
          // wait for synchronization and some additional clocks
10069
          wait_for_frame = 1;
10070
          // wait for frame
10071
          wait ((wait_for_frame == 0) || (frame_started == 1))
10072
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10073
          begin
10074
            disable check_fr;
10075
          end
10076
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10077
          begin
10078
            disable wait_fr;
10079 279 mohor
            if (frame_ended == 1)
10080
            begin
10081
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10082
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10083
              no_underrun = 1;
10084
            end
10085
            else
10086
            begin
10087
              wait (frame_ended == 1);
10088
              $display("(%0t) under-run on %0d. byte",
10089
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10090
              no_underrun = 0;
10091
            end
10092 209 tadejm
          end
10093
          repeat (2) @(posedge wb_clk);
10094
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10095
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10096 223 tadejm
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10097 209 tadejm
        end
10098
        begin: wait_fr
10099
          wait (wait_for_frame == 1)
10100
          begin
10101
            // wait for synchronization and some additional clocks
10102
            repeat (3) @(posedge wb_clk);
10103
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10104
            repeat (2) @(posedge wb_clk);
10105
            repeat (2) @(posedge mtx_clk);
10106
            wait_for_frame = 0;
10107
          end
10108
        end
10109
        begin: check_fr
10110
          // wait for frame to start
10111
          @(posedge MTxEn);
10112
          frame_started = 1;
10113
          // wait for frame to end due to under-run
10114
          @(negedge MTxEn);
10115
          frame_ended = 1;
10116
        end
10117
      join
10118 279 mohor
 
10119
      repeat (5) @ (posedge mtx_clk);
10120
 
10121 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10122
      if (frame_ended == 0)
10123
      begin
10124
        // WAIT FOR FIRST TRANSMIT
10125
        check_tx_bd(num_of_bd, data);
10126
        wait (MTxEn === 1'b1); // start first transmit
10127
        if (data[15] !== 1)
10128
        begin
10129
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10130
          fail = fail + 1;
10131
        end
10132
        wait (MTxEn === 1'b0); // end first transmit
10133
        while (data[15] === 1)
10134
        begin
10135
          check_tx_bd(num_of_bd, data);
10136
          @(posedge wb_clk);
10137
        end
10138
        repeat (1) @(posedge wb_clk);
10139
        // CHECK FIRST FRAME
10140
        // check length of a first PACKET
10141
        tmp_len = eth_phy.tx_len;
10142 279 mohor
 
10143 209 tadejm
        #1;
10144
        if (tmp_len != (i_length + 4))
10145
        begin
10146 223 tadejm
          `TIME; $display("*E Wrong length of first packet out from MAC");
10147
          test_fail("Wrong length of first packet out from MAC");
10148 209 tadejm
          fail = fail + 1;
10149
        end
10150
        // checking first packet
10151
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10152
        if (tmp > 0)
10153
        begin
10154 223 tadejm
          `TIME; $display("*E Wrong data of first transmitted packet");
10155
          test_fail("Wrong data of first transmitted packet");
10156 209 tadejm
          fail = fail + 1;
10157
        end
10158
        // check first transmited TX packet CRC
10159
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10160
        if (tmp > 0)
10161
        begin
10162 223 tadejm
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10163
          test_fail("Wrong CRC of first transmitted packet");
10164 209 tadejm
          fail = fail + 1;
10165
        end
10166
        // check WB INT signal
10167
        if (wb_int !== 1'b1)
10168
        begin
10169
          `TIME; $display("*E WB INT signal should be set");
10170
          test_fail("WB INT signal should be set");
10171
          fail = fail + 1;
10172
        end
10173
        // check TX buffer descriptor of a packet
10174
        check_tx_bd(num_of_bd, data);
10175
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10176
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10177
        begin
10178
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10179
          test_fail("TX buffer descriptor status is not correct");
10180
          fail = fail + 1;
10181
        end
10182
        // check interrupts
10183 274 tadejm
        wait (wbm_working == 0);
10184 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10185
        if ((data & `ETH_INT_TXB) !== 1'b1)
10186
        begin
10187
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10188
          test_fail("Interrupt Transmit Buffer was not set");
10189
          fail = fail + 1;
10190
        end
10191
        if ((data & (~`ETH_INT_TXB)) !== 0)
10192
        begin
10193
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10194
          test_fail("Other interrupts (except Transmit Buffer) were set");
10195
          fail = fail + 1;
10196
        end
10197
        // clear interrupts
10198 274 tadejm
        wait (wbm_working == 0);
10199 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10200
        // check WB INT signal
10201
        if (wb_int !== 1'b0)
10202
        begin
10203
          test_fail("WB INT signal should not be set");
10204
          fail = fail + 1;
10205
        end
10206
      end
10207 279 mohor
      else // if (frame_ended == 1)
10208 223 tadejm
      begin
10209
        // CHECK FIRST FRAME
10210
        // check length of a first PACKET
10211 279 mohor
 
10212
        if (no_underrun)
10213 223 tadejm
        begin
10214 279 mohor
          // CHECK FIRST FRAME, without under-run !!!
10215
          // check length of a first PACKET
10216
          tmp_len = eth_phy.tx_len;
10217
          #1;
10218
          if (tmp_len != (i_length + 4))
10219
          begin
10220
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10221
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10222
            fail = fail + 1;
10223
          end
10224 223 tadejm
        end
10225 279 mohor
        else
10226
        begin
10227
          // CHECK FIRST FRAME, on which under-run occure !!!
10228
          // check length of a first PACKET
10229
          tmp_len = eth_phy.tx_len_err;
10230
          #1;
10231
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10232
          begin
10233
            `TIME; $display("*E Wrong length of first packet out from MAC");
10234
            test_fail("Wrong length of first packet out from MAC");
10235
            fail = fail + 1;
10236
          end
10237
        end
10238 223 tadejm
        // checking first packet
10239 279 mohor
        if (no_underrun)
10240
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10241
        else
10242
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10243 223 tadejm
        if (tmp > 0)
10244
        begin
10245
          `TIME; $display("*E Wrong data of first transmitted packet");
10246
          test_fail("Wrong data of first transmitted packet");
10247
          fail = fail + 1;
10248
        end
10249
        // check WB INT signal
10250
        if (wb_int !== 1'b1)
10251
        begin
10252
          `TIME; $display("*E WB INT signal should be set");
10253
          test_fail("WB INT signal should be set");
10254
          fail = fail + 1;
10255
        end
10256 279 mohor
 
10257 223 tadejm
        // check TX buffer descriptor of a packet
10258
        check_tx_bd(num_of_bd, data);
10259 279 mohor
        if (no_underrun)
10260 223 tadejm
        begin
10261 279 mohor
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10262
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10263
          begin
10264
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10265
            test_fail("TX buffer descriptor status is not correct");
10266
            fail = fail + 1;
10267
          end
10268 223 tadejm
        end
10269 279 mohor
        else
10270
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10271
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10272
          begin
10273
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10274
            test_fail("TX buffer descriptor status is not correct");
10275
            fail = fail + 1;
10276
          end
10277
 
10278 223 tadejm
        // check interrupts
10279 274 tadejm
        wait (wbm_working == 0);
10280 223 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10281 279 mohor
 
10282
        if (no_underrun)
10283 223 tadejm
        begin
10284 279 mohor
          if ((data & `ETH_INT_TXB) !== 2'b01)
10285
          begin
10286
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10287
            test_fail("Interrupt Transmit Buffer was not set");
10288
            fail = fail + 1;
10289
          end
10290
          if ((data & (~`ETH_INT_TXB)) !== 0)
10291
          begin
10292
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10293
            test_fail("Other interrupts (except Transmit Buffer) were set");
10294
            fail = fail + 1;
10295
          end
10296 223 tadejm
        end
10297 279 mohor
        else
10298 223 tadejm
        begin
10299 279 mohor
          if ((data & `ETH_INT_TXE) !== 2'b10)
10300
          begin
10301
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10302
            test_fail("Interrupt Transmit Error was not set");
10303
            fail = fail + 1;
10304
          end
10305
          if ((data & (~`ETH_INT_TXE)) !== 0)
10306
          begin
10307
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10308
            test_fail("Other interrupts (except Transmit Buffer) were set");
10309
            fail = fail + 1;
10310
          end
10311 223 tadejm
        end
10312 279 mohor
 
10313 223 tadejm
        // clear interrupts
10314 274 tadejm
        wait (wbm_working == 0);
10315 223 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10316
        // check WB INT signal
10317
        if (wb_int !== 1'b0)
10318
        begin
10319
          test_fail("WB INT signal should not be set");
10320
          fail = fail + 1;
10321
        end
10322
      end
10323 209 tadejm
      num_of_bd = num_of_bd + 1;
10324
      // destination address on ethernet PHY
10325
      eth_phy.set_tx_mem_addr(0);
10326 223 tadejm
      // WAIT FOR SECOND TRANSMIT
10327 209 tadejm
      check_tx_bd(num_of_bd, data);
10328
      wait (MTxEn === 1'b1); // start first transmit
10329
      if (data[15] !== 1)
10330
      begin
10331
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10332
        fail = fail + 1;
10333
      end
10334
      wait (MTxEn === 1'b0); // end first transmit
10335
      while (data[15] === 1)
10336
      begin
10337
        check_tx_bd(num_of_bd, data);
10338
        @(posedge wb_clk);
10339
      end
10340
      repeat (1) @(posedge wb_clk);
10341
      // CHECK SECOND FRAME
10342
      // check length of a second PACKET
10343
      tmp_len = eth_phy.tx_len;
10344
      #1;
10345
      if (tmp_len != (i_length + 4))
10346
      begin
10347 223 tadejm
        `TIME; $display("*E Wrong length of second packet out from MAC");
10348 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10349
        fail = fail + 1;
10350
      end
10351
      // checking second packet
10352
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10353
      if (tmp > 0)
10354
      begin
10355 223 tadejm
        `TIME; $display("*E Wrong data of second transmitted packet");
10356 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10357
        fail = fail + 1;
10358
      end
10359
      // check second transmited TX packet CRC
10360
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10361
      if (tmp > 0)
10362
      begin
10363 223 tadejm
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10364 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10365
        fail = fail + 1;
10366
      end
10367
      // check WB INT signal
10368
      if (wb_int !== 1'b1)
10369
      begin
10370
        `TIME; $display("*E WB INT signal should be set");
10371
        test_fail("WB INT signal should be set");
10372
        fail = fail + 1;
10373
      end
10374
      // check TX buffer descriptor of a packet
10375
      check_tx_bd(num_of_bd, data);
10376
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10377
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10378
      begin
10379
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10380
        test_fail("TX buffer descriptor status is not correct");
10381
        fail = fail + 1;
10382
      end
10383
      // check interrupts
10384 274 tadejm
      wait (wbm_working == 0);
10385 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10386
      if ((data & `ETH_INT_TXB) !== 1'b1)
10387
      begin
10388
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10389
        test_fail("Interrupt Transmit Buffer was not set");
10390
        fail = fail + 1;
10391
      end
10392
      if ((data & (~`ETH_INT_TXB)) !== 0)
10393
      begin
10394
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10395
        test_fail("Other interrupts (except Transmit Buffer) were set");
10396
        fail = fail + 1;
10397
      end
10398
      // clear interrupts
10399 274 tadejm
      wait (wbm_working == 0);
10400 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10401
      // check WB INT signal
10402
      if (wb_int !== 1'b0)
10403
      begin
10404
        test_fail("WB INT signal should not be set");
10405
        fail = fail + 1;
10406
      end
10407
      // set initial value
10408
      i_data = i_data - 1;
10409 279 mohor
      // the number of frames transmitted
10410 209 tadejm
      num_of_frames = num_of_frames + 1;
10411
      num_of_bd = 0;
10412
      // set length (LOOP variable)
10413 223 tadejm
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10414 209 tadejm
        i_length = (max_tmp - 4);
10415
      @(posedge wb_clk);
10416
    end
10417
    // disable TX
10418 274 tadejm
    wait (wbm_working == 0);
10419 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10420
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10421
    @(posedge wb_clk);
10422
    if(fail == 0)
10423
      test_ok;
10424
    else
10425
      fail = 0;
10426
  end
10427
 
10428
 
10429
  ////////////////////////////////////////////////////////////////////
10430
  ////                                                            ////
10431
  ////  Test transmit packets after TX under-run on each packet's ////
10432
  ////  byte at 2 TX buffer decriptors ( 100Mbps ).               ////
10433
  ////                                                            ////
10434
  ////////////////////////////////////////////////////////////////////
10435
  if (test_num == 21) // without padding
10436
  begin
10437
    // TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
10438
    test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
10439
    `TIME;
10440
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
10441
 
10442
    // reset MAC registers
10443
    hard_reset;
10444
    // set wb slave response
10445
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10446
 
10447
    max_tmp = 0;
10448
    min_tmp = 0;
10449
    // set 2 TX buffer descriptors - must be set before TX enable
10450 274 tadejm
    wait (wbm_working == 0);
10451 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10452
    // enable TX, set full-duplex mode, NO padding and CRC appending
10453 274 tadejm
    wait (wbm_working == 0);
10454 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
10455
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10456
    // prepare a packet of MAXFL length
10457 274 tadejm
    wait (wbm_working == 0);
10458 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10459
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
10460
    min_tmp = tmp[31:16];
10461
    st_data = 8'h99;
10462
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
10463
    // read IPG value
10464 274 tadejm
    wait (wbm_working == 0);
10465 209 tadejm
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10466
    // check WB INT signal
10467
    if (wb_int !== 1'b0)
10468
    begin
10469
      test_fail("WB INT signal should not be set");
10470
      fail = fail + 1;
10471
    end
10472
 
10473
    // write to phy's control register for 100Mbps
10474
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
10475 279 mohor
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
10476 209 tadejm
    speed = 100;
10477
 
10478 279 mohor
    num_of_frames = 60; // (0..3) => start under-run on first word
10479 209 tadejm
    num_of_bd = 0;
10480
    i_data = 3; // (3) => one BYTE read in first word - FIRST byte
10481 279 mohor
    i_length = 80;
10482 209 tadejm
    while (i_length < (max_tmp - 4))
10483
    begin
10484
      // Reset_tx_bd enable interrupt generation
10485
      // unmask interrupts
10486 274 tadejm
      wait (wbm_working == 0);
10487 209 tadejm
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
10488
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10489
      // not detect carrier sense in FD and no collision
10490
      eth_phy.carrier_sense_tx_fd_detect(0);
10491
      eth_phy.collision(0);
10492
      // first destination address on ethernet PHY
10493
      eth_phy.set_tx_mem_addr(0);
10494
      // prepare BDs
10495
      if (num_of_bd == 0)
10496
      begin
10497
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
10498
        set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
10499
        set_tx_bd_wrap(1);
10500
        // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10501
        //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10502 279 mohor
        #1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10503 209 tadejm
        set_tx_bd_ready(1, 1);
10504
        set_tx_bd_ready(0, 0);
10505
      end
10506
      // frame under-run checking
10507
      frame_started = 0;
10508
      frame_ended = 0;
10509
      wait_for_frame = 0;
10510 279 mohor
      no_underrun = 0;
10511 209 tadejm
      fork
10512
        begin
10513
          // for every 4 frames bytes 1, 2, 3 and 4 respectively are read in first word => 1 ACK
10514
          // in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
10515 279 mohor
          i = 0;
10516
          while (i <= (num_of_frames[31:2] + 1))
10517
          begin
10518
            @(negedge wb_clk);
10519
            if (eth_ma_wb_ack_i)
10520
            begin
10521
              i = i + 1;
10522
            end
10523
          end
10524 209 tadejm
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10525
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10526 279 mohor
          #1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
10527 209 tadejm
          // wait for synchronization and some additional clocks
10528
          wait_for_frame = 1;
10529
          // wait for frame
10530
          wait ((wait_for_frame == 0) || (frame_started == 1))
10531
          if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
10532
          begin
10533
            disable check_fr1;
10534
          end
10535
          else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
10536
          begin
10537
            disable wait_fr1;
10538 279 mohor
            if (frame_ended == 1)
10539
            begin
10540
              $display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
10541
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
10542
              no_underrun = 1;
10543
            end
10544
            else
10545
            begin
10546
              wait (frame_ended == 1);
10547
              $display("(%0t) under-run on %0d. byte",
10548
                        $time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
10549
              no_underrun = 0;
10550
            end
10551 209 tadejm
          end
10552
          repeat (2) @(posedge wb_clk);
10553
          // set wb slave response: ACK (response), wbs_waits[2:0] (waits before response), 
10554
          //                       wbs_retries[7:0] (RTYs before ACK if RTY response selected)
10555 279 mohor
          wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
10556 209 tadejm
        end
10557
        begin: wait_fr1
10558
          wait (wait_for_frame == 1)
10559
          begin
10560
            // wait for synchronization and some additional clocks
10561
            repeat (3) @(posedge wb_clk);
10562
            repeat (2 * tmp_ipgt) @(posedge mtx_clk);
10563
            repeat (2) @(posedge wb_clk);
10564
            repeat (2) @(posedge mtx_clk);
10565
            wait_for_frame = 0;
10566
          end
10567
        end
10568
        begin: check_fr1
10569
          // wait for frame to start
10570
          @(posedge MTxEn);
10571
          frame_started = 1;
10572
          // wait for frame to end due to under-run
10573
          @(negedge MTxEn);
10574
          frame_ended = 1;
10575
        end
10576
      join
10577 279 mohor
 
10578
      repeat (5) @ (posedge mtx_clk);
10579
 
10580 209 tadejm
      // wait for first transmit to end, if under-run didn't happen
10581
      if (frame_ended == 0)
10582
      begin
10583
        // WAIT FOR FIRST TRANSMIT
10584
        check_tx_bd(num_of_bd, data);
10585
        wait (MTxEn === 1'b1); // start first transmit
10586
        if (data[15] !== 1)
10587
        begin
10588
          test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10589
          fail = fail + 1;
10590
        end
10591
        wait (MTxEn === 1'b0); // end first transmit
10592
        while (data[15] === 1)
10593
        begin
10594
          check_tx_bd(num_of_bd, data);
10595
          @(posedge wb_clk);
10596
        end
10597 279 mohor
        repeat (10) @(posedge wb_clk);
10598 209 tadejm
        // CHECK FIRST FRAME
10599
        // check length of a first PACKET
10600
        tmp_len = eth_phy.tx_len;
10601 279 mohor
 
10602 209 tadejm
        #1;
10603
        if (tmp_len != (i_length + 4))
10604
        begin
10605 279 mohor
          `TIME; $display("*E Wrong length of first packet out from MAC");
10606
          test_fail("Wrong length of first packet out from MAC");
10607 209 tadejm
          fail = fail + 1;
10608
        end
10609
        // checking first packet
10610
        check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
10611
        if (tmp > 0)
10612
        begin
10613 279 mohor
          `TIME; $display("*E Wrong data of first transmitted packet");
10614
          test_fail("Wrong data of first transmitted packet");
10615 209 tadejm
          fail = fail + 1;
10616
        end
10617
        // check first transmited TX packet CRC
10618
        check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10619
        if (tmp > 0)
10620
        begin
10621 279 mohor
          `TIME; $display("*E Wrong CRC of first transmitted packet");
10622
          test_fail("Wrong CRC of first transmitted packet");
10623 209 tadejm
          fail = fail + 1;
10624
        end
10625
        // check WB INT signal
10626
        if (wb_int !== 1'b1)
10627
        begin
10628
          `TIME; $display("*E WB INT signal should be set");
10629
          test_fail("WB INT signal should be set");
10630
          fail = fail + 1;
10631
        end
10632
        // check TX buffer descriptor of a packet
10633
        check_tx_bd(num_of_bd, data);
10634
        if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10635
             ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10636
        begin
10637
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10638
          test_fail("TX buffer descriptor status is not correct");
10639
          fail = fail + 1;
10640
        end
10641
        // check interrupts
10642 274 tadejm
        wait (wbm_working == 0);
10643 209 tadejm
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10644
        if ((data & `ETH_INT_TXB) !== 1'b1)
10645
        begin
10646
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10647
          test_fail("Interrupt Transmit Buffer was not set");
10648
          fail = fail + 1;
10649
        end
10650
        if ((data & (~`ETH_INT_TXB)) !== 0)
10651
        begin
10652
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10653
          test_fail("Other interrupts (except Transmit Buffer) were set");
10654
          fail = fail + 1;
10655
        end
10656
        // clear interrupts
10657 274 tadejm
        wait (wbm_working == 0);
10658 209 tadejm
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10659
        // check WB INT signal
10660
        if (wb_int !== 1'b0)
10661
        begin
10662
          test_fail("WB INT signal should not be set");
10663
          fail = fail + 1;
10664
        end
10665
      end
10666 279 mohor
      else // if (frame_ended == 1)
10667
      begin
10668
        // CHECK FIRST FRAME
10669
        // check length of a first PACKET
10670
 
10671
        if (no_underrun)
10672
        begin
10673
          // CHECK FIRST FRAME, without under-run !!!
10674
          // check length of a first PACKET
10675
          tmp_len = eth_phy.tx_len;
10676
          #1;
10677
          if (tmp_len != (i_length + 4))
10678
          begin
10679
            `TIME; $display("*E Wrong length of first packet out from MAC (no under-run)");
10680
            test_fail("Wrong length of first packet out from MAC (no under-run)");
10681
            fail = fail + 1;
10682
          end
10683
        end
10684
        else
10685
        begin
10686
          // CHECK FIRST FRAME, on which under-run occure !!!
10687
          // check length of a first PACKET
10688
          tmp_len = eth_phy.tx_len_err-1;   // -1 because synchronization at 100 Mbps is slover then at 10 Mbps (wb_clk remains the same)
10689
          #1;
10690
          if (tmp_len != ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])))
10691
          begin
10692
            `TIME; $display("*E Wrong length of first packet out from MAC");
10693
            test_fail("Wrong length of first packet out from MAC");
10694
            fail = fail + 1;
10695
          end
10696
        end
10697
        // checking first packet
10698
        if (no_underrun)
10699
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);    // only received are checked
10700
        else
10701
          check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
10702
        if (tmp > 0)
10703
        begin
10704
          `TIME; $display("*E Wrong data of first transmitted packet");
10705
          test_fail("Wrong data of first transmitted packet");
10706
          fail = fail + 1;
10707
        end
10708
        // check WB INT signal
10709
        if (wb_int !== 1'b1)
10710
        begin
10711
          `TIME; $display("*E WB INT signal should be set");
10712
          test_fail("WB INT signal should be set");
10713
          fail = fail + 1;
10714
        end
10715
 
10716
        // check TX buffer descriptor of a packet
10717
        check_tx_bd(num_of_bd, data);
10718
        if (no_underrun)
10719
        begin
10720
          if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // under-run, wrap bit
10721
               ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // under-run, without wrap bit
10722
          begin
10723
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10724
            test_fail("TX buffer descriptor status is not correct");
10725
            fail = fail + 1;
10726
          end
10727
        end
10728
        else
10729
          if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
10730
               ((data[15:0] !== 16'h5900) && (num_of_bd < 1)) )   // under-run, without wrap bit
10731
          begin
10732
            `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10733
            test_fail("TX buffer descriptor status is not correct");
10734
            fail = fail + 1;
10735
          end
10736
 
10737
        // check interrupts
10738
        wait (wbm_working == 0);
10739
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10740
 
10741
        if (no_underrun)
10742
        begin
10743
          if ((data & `ETH_INT_TXB) !== 2'b01)
10744
          begin
10745
            `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10746
            test_fail("Interrupt Transmit Buffer was not set");
10747
            fail = fail + 1;
10748
          end
10749
          if ((data & (~`ETH_INT_TXB)) !== 0)
10750
          begin
10751
            `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10752
            test_fail("Other interrupts (except Transmit Buffer) were set");
10753
            fail = fail + 1;
10754
          end
10755
        end
10756
        else
10757
        begin
10758
          if ((data & `ETH_INT_TXE) !== 2'b10)
10759
          begin
10760
            `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
10761
            test_fail("Interrupt Transmit Error was not set");
10762
            fail = fail + 1;
10763
          end
10764
          if ((data & (~`ETH_INT_TXE)) !== 0)
10765
          begin
10766
            `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
10767
            test_fail("Other interrupts (except Transmit Buffer) were set");
10768
            fail = fail + 1;
10769
          end
10770
        end
10771
 
10772
        // clear interrupts
10773
        wait (wbm_working == 0);
10774
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10775
        // check WB INT signal
10776
        if (wb_int !== 1'b0)
10777
        begin
10778
          test_fail("WB INT signal should not be set");
10779
          fail = fail + 1;
10780
        end
10781
      end
10782 209 tadejm
      num_of_bd = num_of_bd + 1;
10783
      // destination address on ethernet PHY
10784
      eth_phy.set_tx_mem_addr(0);
10785 279 mohor
      // WAIT FOR SECOND TRANSMIT
10786 209 tadejm
      check_tx_bd(num_of_bd, data);
10787
      wait (MTxEn === 1'b1); // start first transmit
10788
      if (data[15] !== 1)
10789
      begin
10790
        test_fail("Wrong buffer descriptor's ready bit read out from MAC");
10791
        fail = fail + 1;
10792
      end
10793
      wait (MTxEn === 1'b0); // end first transmit
10794
      while (data[15] === 1)
10795
      begin
10796
        check_tx_bd(num_of_bd, data);
10797
        @(posedge wb_clk);
10798
      end
10799
      repeat (1) @(posedge wb_clk);
10800
      // CHECK SECOND FRAME
10801
      // check length of a second PACKET
10802
      tmp_len = eth_phy.tx_len;
10803
      #1;
10804
      if (tmp_len != (i_length + 4))
10805
      begin
10806 279 mohor
        `TIME; $display("*E Wrong length of second packet out from MAC");
10807 209 tadejm
        test_fail("Wrong length of second packet out from MAC");
10808
        fail = fail + 1;
10809
      end
10810
      // checking second packet
10811
      check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
10812
      if (tmp > 0)
10813
      begin
10814 279 mohor
        `TIME; $display("*E Wrong data of second transmitted packet");
10815 209 tadejm
        test_fail("Wrong data of second transmitted packet");
10816
        fail = fail + 1;
10817
      end
10818
      // check second transmited TX packet CRC
10819
      check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
10820
      if (tmp > 0)
10821
      begin
10822 279 mohor
        `TIME; $display("*E Wrong CRC of second transmitted packet");
10823 209 tadejm
        test_fail("Wrong CRC of second transmitted packet");
10824
        fail = fail + 1;
10825
      end
10826
      // check WB INT signal
10827
      if (wb_int !== 1'b1)
10828
      begin
10829
        `TIME; $display("*E WB INT signal should be set");
10830
        test_fail("WB INT signal should be set");
10831
        fail = fail + 1;
10832
      end
10833
      // check TX buffer descriptor of a packet
10834
      check_tx_bd(num_of_bd, data);
10835
      if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 1)) || // wrap bit
10836
           ((data[15:0] !== 16'h5800) && (num_of_bd < 1)) )   // without wrap bit
10837
      begin
10838
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
10839
        test_fail("TX buffer descriptor status is not correct");
10840
        fail = fail + 1;
10841
      end
10842
      // check interrupts
10843 274 tadejm
      wait (wbm_working == 0);
10844 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10845
      if ((data & `ETH_INT_TXB) !== 1'b1)
10846
      begin
10847
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
10848
        test_fail("Interrupt Transmit Buffer was not set");
10849
        fail = fail + 1;
10850
      end
10851
      if ((data & (~`ETH_INT_TXB)) !== 0)
10852
      begin
10853
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
10854
        test_fail("Other interrupts (except Transmit Buffer) were set");
10855
        fail = fail + 1;
10856
      end
10857
      // clear interrupts
10858 274 tadejm
      wait (wbm_working == 0);
10859 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10860
      // check WB INT signal
10861
      if (wb_int !== 1'b0)
10862
      begin
10863
        test_fail("WB INT signal should not be set");
10864
        fail = fail + 1;
10865
      end
10866
      // set initial value
10867
      i_data = i_data - 1;
10868 279 mohor
      // the number of frames transmitted
10869 209 tadejm
      num_of_frames = num_of_frames + 1;
10870
      num_of_bd = 0;
10871
      // set length (LOOP variable)
10872 279 mohor
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
10873 209 tadejm
        i_length = (max_tmp - 4);
10874
      @(posedge wb_clk);
10875
    end
10876
    // disable TX
10877 274 tadejm
    wait (wbm_working == 0);
10878 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
10879
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
10880
    @(posedge wb_clk);
10881
    if(fail == 0)
10882
      test_ok;
10883
    else
10884
      fail = 0;
10885
  end
10886
 
10887 194 tadej
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
10888 169 mohor
 
10889
end
10890
endtask // test_mac_full_duplex_transmit
10891
 
10892
 
10893 209 tadejm
task test_mac_full_duplex_receive;
10894
  input  [31:0]  start_task;
10895
  input  [31:0]  end_task;
10896
  integer        bit_start_1;
10897
  integer        bit_end_1;
10898
  integer        bit_start_2;
10899
  integer        bit_end_2;
10900
  integer        num_of_reg;
10901
  integer        num_of_frames;
10902
  integer        num_of_bd;
10903
  integer        i_addr;
10904
  integer        i_data;
10905
  integer        i_length;
10906
  integer        tmp_len;
10907
  integer        tmp_bd;
10908
  integer        tmp_bd_num;
10909
  integer        tmp_data;
10910
  integer        tmp_ipgt;
10911
  integer        test_num;
10912
  reg    [31:0]  tx_bd_num;
10913
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
10914
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
10915
  integer        i;
10916
  integer        i1;
10917
  integer        i2;
10918
  integer        i3;
10919
  integer        fail;
10920
  integer        speed;
10921
  reg            frame_started;
10922
  reg            frame_ended;
10923
  reg            wait_for_frame;
10924 243 tadejm
  reg            check_frame;
10925
  reg            stop_checking_frame;
10926
  reg            first_fr_received;
10927 209 tadejm
  reg    [31:0]  addr;
10928
  reg    [31:0]  data;
10929
  reg    [31:0]  tmp;
10930
  reg    [ 7:0]  st_data;
10931
  reg    [15:0]  max_tmp;
10932
  reg    [15:0]  min_tmp;
10933
begin
10934
// MAC FULL DUPLEX RECEIVE TEST
10935
test_heading("MAC FULL DUPLEX RECEIVE TEST");
10936
$display(" ");
10937
$display("MAC FULL DUPLEX RECEIVE TEST");
10938
fail = 0;
10939
 
10940
// reset MAC registers
10941
hard_reset;
10942
// reset MAC and MII LOGIC with soft reset
10943 274 tadejm
//reset_mac;
10944
//reset_mii;
10945 209 tadejm
// set wb slave response
10946
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
10947
 
10948
  /*
10949
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
10950
  -------------------------------------------------------------------------------------
10951
  set_tx_bd
10952
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
10953
  set_tx_bd_wrap
10954
    (tx_bd_num_end[6:0]);
10955
  set_tx_bd_ready
10956
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10957
  check_tx_bd
10958
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
10959
  clear_tx_bd
10960
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
10961
 
10962
  TASKS for set and control RX buffer descriptors:
10963
  ------------------------------------------------
10964
  set_rx_bd
10965
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
10966
  set_rx_bd_wrap
10967
    (rx_bd_num_end[6:0]);
10968
  set_rx_bd_empty
10969
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10970
  check_rx_bd
10971
    (rx_bd_num_end[6:0], rx_bd_status);
10972
  clear_rx_bd
10973
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
10974
 
10975
  TASKS for set and check TX packets:
10976
  -----------------------------------
10977
  set_tx_packet
10978
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
10979
  check_tx_packet
10980
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
10981
 
10982
  TASKS for set and check RX packets:
10983
  -----------------------------------
10984
  set_rx_packet
10985
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
10986
  check_rx_packet
10987
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
10988
 
10989
  TASKS for append and check CRC to/of TX packet:
10990
  -----------------------------------------------
10991
  append_tx_crc
10992
    (txpnt_wb[31:0], len[15:0], negated_crc);
10993
  check_tx_crc
10994
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
10995
 
10996
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
10997
  --------------------------------------------------------------------------------
10998
  append_rx_crc
10999
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
11000
  */
11001
 
11002
//////////////////////////////////////////////////////////////////////
11003
////                                                              ////
11004
////  test_mac_full_duplex_receive:                               ////
11005
////                                                              ////
11006
////  0: Test no receive when all buffers are TX ( 10Mbps ).      ////
11007
////  1: Test no receive when all buffers are TX ( 100Mbps ).     ////
11008 243 tadejm
////  2: Test receive packet synchronization with receive         ////
11009
////     disable/enable ( 10Mbps ).                               ////
11010
////  3: Test receive packet synchronization with receive         ////
11011
////     disable/enable ( 100Mbps ).                              ////
11012
////  4: Test receive packets form MINFL to MAXFL sizes at        ////
11013 209 tadejm
////     one RX buffer decriptor ( 10Mbps ).                      ////
11014 243 tadejm
////  5: Test receive packets form MINFL to MAXFL sizes at        ////
11015 209 tadejm
////     one RX buffer decriptor ( 100Mbps ).                     ////
11016
////                                                              ////
11017
//////////////////////////////////////////////////////////////////////
11018
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
11019
begin
11020
 
11021
  ////////////////////////////////////////////////////////////////////
11022
  ////                                                            ////
11023
  ////  Test no receive when all buffers are TX ( 10Mbps ).       ////
11024
  ////                                                            ////
11025
  ////////////////////////////////////////////////////////////////////
11026
  if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
11027
  begin
11028
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
11029
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
11030
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
11031
 
11032
    // unmask interrupts
11033 274 tadejm
    wait (wbm_working == 0);
11034 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11035
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11036
    // set all buffer descriptors to TX - must be set before RX enable
11037 274 tadejm
    wait (wbm_working == 0);
11038 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11039 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11040 274 tadejm
    wait (wbm_working == 0);
11041 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11042
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11043
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11044
 
11045
    // write to phy's control register for 10Mbps
11046
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11047
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11048
    speed = 10;
11049
 
11050
    i = 0;
11051
    while (i < 128)
11052
    begin
11053
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11054
      begin
11055
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11056
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11057
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11058
      end
11059
      set_rx_bd_wrap(i);
11060
      set_rx_bd_empty(0, i);
11061
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11062
      begin
11063
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11064
        repeat(10) @(posedge mrx_clk);
11065
      end
11066
      @(posedge mrx_clk);
11067
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11068
      begin
11069
        check_rx_bd(0, tmp);
11070
        #1;
11071
        if (tmp[15] === 1'b0)
11072
        begin
11073
          test_fail("Receive should not start at all");
11074
          fail = fail + 1;
11075
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11076
        end
11077
        if (tmp[7:0] !== 0)
11078
        begin
11079
          test_fail("Receive should not be finished since it should not start at all");
11080
          fail = fail + 1;
11081
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11082
        end
11083
        @(posedge wb_clk);
11084
      end
11085 274 tadejm
      wait (wbm_working == 0);
11086 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11087
      if (tmp[6:0] !== 0)
11088
      begin
11089
        test_fail("Receive should not get INT since it should not start at all");
11090
        fail = fail + 1;
11091
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11092
      end
11093
      clear_rx_bd(0, i);
11094
      if ((i < 5) || (i > 124))
11095
        i = i + 1;
11096
      else
11097
        i = i + 120;
11098
    end
11099
    // disable RX
11100 274 tadejm
    wait (wbm_working == 0);
11101 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11102
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11103
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11104
    if(fail == 0)
11105
      test_ok;
11106
    else
11107
      fail = 0;
11108
  end
11109
 
11110
 
11111
  ////////////////////////////////////////////////////////////////////
11112
  ////                                                            ////
11113
  ////  Test no receive when all buffers are TX ( 100Mbps ).      ////
11114
  ////                                                            ////
11115
  ////////////////////////////////////////////////////////////////////
11116
  if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
11117
  begin
11118
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
11119
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
11120
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
11121
 
11122
    // unmask interrupts
11123 274 tadejm
    wait (wbm_working == 0);
11124 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11125
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11126
    // set all buffer descriptors to TX - must be set before RX enable
11127 274 tadejm
    wait (wbm_working == 0);
11128 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11129 223 tadejm
    // enable RX, set full-duplex mode, receive small, NO correct IFG
11130 274 tadejm
    wait (wbm_working == 0);
11131 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11132
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11133
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11134
 
11135
    // write to phy's control register for 100Mbps
11136
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11137
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11138
    speed = 100;
11139
 
11140
    i = 0;
11141
    while (i < 128)
11142
    begin
11143
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11144
      begin
11145
        set_rx_packet((i1 * 50), 10, 1'b0, 48'h1234_5678_8765, 48'h0011_2233_4455, 16'h0101, 8'h0);
11146
        append_rx_crc((i1 * 50), 10, 1'b0, 1'b0);
11147
        set_rx_bd(i1, i1, 1'b1, (`MEMORY_BASE + (i1 * 50)));
11148
      end
11149
      set_rx_bd_wrap(i);
11150
      set_rx_bd_empty(0, i);
11151
      for (i1 = 0; i1 <= i; i1 = i1 + 1)
11152
      begin
11153
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, (i1 * 50), 14, 1'b0);
11154
        repeat(10) @(posedge mrx_clk);
11155
      end
11156
      @(posedge mrx_clk);
11157
      for (i2 = 0; i2 < 20; i2 = i2 + 1)
11158
      begin
11159
        check_rx_bd(0, tmp);
11160
        #1;
11161
        if (tmp[15] === 1'b0)
11162
        begin
11163
          test_fail("Receive should not start at all");
11164
          fail = fail + 1;
11165
          `TIME; $display("*E Receive of %d packets should not start at all - empty is 0", i);
11166
        end
11167
        if (tmp[7:0] !== 0)
11168
        begin
11169
          test_fail("Receive should not be finished since it should not start at all");
11170
          fail = fail + 1;
11171
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
11172
        end
11173
        @(posedge wb_clk);
11174
      end
11175 274 tadejm
      wait (wbm_working == 0);
11176 209 tadejm
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11177
      if (tmp[6:0] !== 0)
11178
      begin
11179
        test_fail("Receive should not get INT since it should not start at all");
11180
        fail = fail + 1;
11181
        `TIME; $display("*E Receive of should not get INT since it should not start at all");
11182
      end
11183
      clear_rx_bd(0, i);
11184
      if ((i < 5) || (i > 124))
11185
        i = i + 1;
11186
      else
11187
        i = i + 120;
11188
    end
11189
    // disable RX
11190 274 tadejm
    wait (wbm_working == 0);
11191 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11192
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11193
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11194
    if(fail == 0)
11195
      test_ok;
11196
    else
11197
      fail = 0;
11198
  end
11199
 
11200
 
11201
  ////////////////////////////////////////////////////////////////////
11202
  ////                                                            ////
11203 243 tadejm
  ////  Test receive packet synchronization with receive          ////
11204
  ////  disable/enable ( 10Mbps ).                                ////
11205
  ////                                                            ////
11206
  ////////////////////////////////////////////////////////////////////
11207
  if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
11208
  begin
11209
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
11210
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
11211
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
11212
 
11213
    // unmask interrupts
11214 274 tadejm
    wait (wbm_working == 0);
11215 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11216
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11217
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11218 274 tadejm
    wait (wbm_working == 0);
11219 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11220
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11221 274 tadejm
    wait (wbm_working == 0);
11222 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11223
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11224
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11225
    // prepare two packets of MAXFL length
11226 274 tadejm
    wait (wbm_working == 0);
11227 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11228
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11229
    min_tmp = tmp[31:16];
11230
    st_data = 8'h0F;
11231
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11232
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11233
    st_data = 8'h1A;
11234
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11235
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11236
    // check WB INT signal
11237
    if (wb_int !== 1'b0)
11238
    begin
11239
      test_fail("WB INT signal should not be set");
11240
      fail = fail + 1;
11241
    end
11242
 
11243
    // write to phy's control register for 10Mbps
11244
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11245
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11246
    speed = 10;
11247
 
11248
    frame_started = 0;
11249
    frame_ended = 0;
11250
    wait_for_frame = 0;
11251
    check_frame = 0;
11252
    stop_checking_frame = 0;
11253
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11254
 
11255
    num_of_frames = 0; // 
11256
    num_of_bd = 0;
11257
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11258
    while (i_length < (max_tmp - 4))
11259
    begin
11260
      // choose generating carrier sense and collision 
11261
      case (num_of_frames[1:0])
11262
      2'h0: // Interrupt is generated
11263
      begin
11264
        // enable interrupt generation
11265
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11266
        // not detect carrier sense in FD and no collision
11267
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11268
        eth_phy.collision(0);
11269
      end
11270
      2'h1: // Interrupt is generated
11271
      begin
11272
        // enable interrupt generation
11273
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11274
        // detect carrier sense in FD and no collision
11275
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11276
        eth_phy.collision(0);
11277
      end
11278
      2'h2: // Interrupt is generated
11279
      begin
11280
        // disable interrupt generation
11281
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11282
        // not detect carrier sense in FD and set collision
11283
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11284
        eth_phy.collision(1);
11285
      end
11286
      default: // 2'h3: // Interrupt is generated
11287
      begin
11288
        // disable interrupt generation
11289
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11290
        // detect carrier sense in FD and set collision
11291
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11292
        eth_phy.collision(1);
11293
      end
11294
      endcase
11295
      // set wrap bit
11296
      set_rx_bd_wrap(118);
11297
      set_rx_bd_empty(118, 118);
11298
      check_frame = 0;
11299
      stop_checking_frame = 0;
11300
      tmp_data = 0;
11301
      fork
11302
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11303
          if (num_of_frames[0] == 1'b0)
11304
          begin
11305
            repeat(1) @(posedge wb_clk);
11306
            if (num_of_frames[1] == 1'b0)
11307
            begin
11308
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11309
            end
11310
            else
11311
            begin
11312
              @(posedge mrx_clk);
11313
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11314
            end
11315
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11316
            wbm_init_waits = 4'h0;
11317
            wbm_subseq_waits = 4'h0;
11318 274 tadejm
            #1 wait (wbm_working == 0);
11319
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11320 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11321
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11322
          end
11323
        end
11324
        begin // send a packet from PHY RX
11325
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11326
          if (num_of_frames[1] == 1'b0)
11327
          begin
11328
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11329
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11330
          end
11331
          else
11332
          begin
11333
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11334
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11335
          end
11336
        end
11337
        begin: send_packet0
11338
          wait (MRxDV === 1'b1); // start transmit
11339
          wait (MRxDV === 1'b0); // end transmit
11340
          check_frame = 1;
11341
          repeat(10) @(posedge mrx_clk);
11342
          repeat(15) @(posedge wb_clk);
11343
          stop_checking_frame = 1;
11344
        end
11345
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11346
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11347
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11348
          begin
11349
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11350
          end
11351
          else if (MRxDV === 1'b1)
11352
          begin
11353
            while (eth_sl_wb_ack_o === 1'b0)
11354
            begin
11355
              @(posedge wb_clk);
11356
              tmp_data = tmp_data + 1;
11357
            end
11358
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11359
          end
11360
          else if (eth_sl_wb_ack_o === 1'b1)
11361
          begin
11362
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11363
            while (MRxDV === 1'b0)
11364
            begin
11365
              @(posedge wb_clk);
11366
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11367
            end
11368
          end
11369
        end
11370
        begin // check packet
11371
          wait (check_frame == 1);
11372
          check_rx_bd(118, tmp_bd);
11373
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11374
          begin
11375
            #1 check_rx_bd(118, tmp_bd);
11376
            @(posedge wb_clk);
11377
          end
11378
          if (num_of_frames[0] == 1'b0)
11379
          begin
11380
            if (tmp_bd[15] === 1)
11381
            begin
11382
              if (first_fr_received == 1)
11383
              begin
11384
                first_fr_received = 0;
11385
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11386
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11387
                $display("    From this moment:");
11388
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11389
                if (tmp_data[31])
11390
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11391
                else
11392
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11393
              end
11394
            end
11395
          end
11396
          if (stop_checking_frame == 0)
11397
            disable send_packet0;
11398
        end
11399
      join
11400
      // ONLY IF packet was received!
11401
      if (tmp_bd[15] === 0)
11402
      begin
11403
        // check length of a PACKET
11404
        if (tmp_bd[31:16] != (i_length + 4))
11405
        begin
11406
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11407
                          tmp_bd[31:16], (i_length + 4));
11408
          test_fail("Wrong length of the packet out from PHY");
11409
          fail = fail + 1;
11410
        end
11411
        // check received RX packet data and CRC
11412
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11413
        begin
11414
          if (num_of_frames[1] == 1'b0)
11415
          begin
11416
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11417
          end
11418
          else
11419
          begin
11420
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11421
          end
11422
          if (tmp > 0)
11423
          begin
11424
            `TIME; $display("*E Wrong data of the received packet");
11425
            test_fail("Wrong data of the received packet");
11426
            fail = fail + 1;
11427
          end
11428
        end
11429
        else // if PREVIOUS RX buffer descriptor was ready
11430
        begin
11431
          if (num_of_frames[1] == 1'b0)
11432
          begin
11433
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11434
          end
11435
          else
11436
          begin
11437
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11438
          end
11439
          if (tmp > 0)
11440
          begin
11441
            `TIME; $display("*E Wrong data of the received packet");
11442
            test_fail("Wrong data of the received packet");
11443
            fail = fail + 1;
11444
          end
11445
        end
11446
      end
11447
      // check WB INT signal
11448
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11449
      begin
11450
        if (wb_int !== 1'b0)
11451
        begin
11452
          `TIME; $display("*E WB INT signal should not be set");
11453
          test_fail("WB INT signal should not be set");
11454
          fail = fail + 1;
11455
        end
11456
      end
11457
      else
11458
      begin
11459
        if (wb_int !== 1'b1)
11460
        begin
11461
          `TIME; $display("*E WB INT signal should be set");
11462
          test_fail("WB INT signal should be set");
11463
          fail = fail + 1;
11464
        end
11465
      end
11466
      // check RX buffer descriptor of a packet - only 15 LSBits
11467
      check_rx_bd(118, data);
11468
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11469
      begin
11470
        if (data[15:0] !== 16'hE000)
11471
        begin
11472
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11473
          test_fail("RX buffer descriptor status is not correct");
11474
          fail = fail + 1;
11475
        end
11476
      end
11477
      else // interrupt enabled
11478
      begin
11479 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
11480 243 tadejm
        begin
11481
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11482
          test_fail("RX buffer descriptor status is not correct");
11483
          fail = fail + 1;
11484
        end
11485
      end
11486
      // check interrupts
11487 274 tadejm
      wait (wbm_working == 0);
11488 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11489
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11490
      begin
11491
        if (data !== 0)
11492
        begin
11493
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11494
          test_fail("Any of interrupts was set");
11495
          fail = fail + 1;
11496
        end
11497
      end
11498
      else
11499
      begin
11500
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11501
        begin
11502
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11503
          test_fail("Interrupt Receive Buffer was not set");
11504
          fail = fail + 1;
11505
        end
11506
        if ((data & (~`ETH_INT_RXB)) !== 0)
11507
        begin
11508
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11509
          test_fail("Other interrupts (except Receive Buffer) were set");
11510
          fail = fail + 1;
11511
        end
11512
      end
11513
      // clear interrupts
11514 274 tadejm
      wait (wbm_working == 0);
11515 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11516
      // check WB INT signal
11517
      if (wb_int !== 1'b0)
11518
      begin
11519
        test_fail("WB INT signal should not be set");
11520
        fail = fail + 1;
11521
      end
11522
      // disable RX after two packets
11523
      if (num_of_frames[0] == 1'b1)
11524
      begin
11525
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11526 274 tadejm
        wait (wbm_working == 0);
11527 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11528
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11529
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11530
      end
11531
      // the number of frame transmitted
11532
      num_of_frames = num_of_frames + 1;
11533
      num_of_bd = 0;
11534
      // set length (LOOP variable)
11535
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11536
        i_length = (max_tmp - 4);
11537
      @(posedge wb_clk);
11538
    end
11539
    // disable RX
11540 274 tadejm
    wait (wbm_working == 0);
11541 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11542
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11543
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11544
    if(fail == 0)
11545
      test_ok;
11546
    else
11547
      fail = 0;
11548
  end
11549
 
11550
 
11551
  ////////////////////////////////////////////////////////////////////
11552
  ////                                                            ////
11553
  ////  Test receive packet synchronization with receive          ////
11554
  ////  disable/enable ( 100Mbps ).                               ////
11555
  ////                                                            ////
11556
  ////////////////////////////////////////////////////////////////////
11557
  if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
11558
  begin
11559
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
11560
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
11561
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
11562
 
11563
    // unmask interrupts
11564 274 tadejm
    wait (wbm_working == 0);
11565 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11566
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11567
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
11568 274 tadejm
    wait (wbm_working == 0);
11569 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11570
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11571 274 tadejm
    wait (wbm_working == 0);
11572 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11573
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11574
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11575
    // prepare two packets of MAXFL length
11576 274 tadejm
    wait (wbm_working == 0);
11577 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11578
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11579
    min_tmp = tmp[31:16];
11580
    st_data = 8'h0F;
11581
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11582
    append_rx_crc(0, (min_tmp + 1), 1'b0, 1'b0);
11583
    st_data = 8'h1A;
11584
    set_rx_packet(max_tmp, (min_tmp + 1), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11585
    append_rx_crc(max_tmp, (min_tmp + 1), 1'b0, 1'b0);
11586
    // check WB INT signal
11587
    if (wb_int !== 1'b0)
11588
    begin
11589
      test_fail("WB INT signal should not be set");
11590
      fail = fail + 1;
11591
    end
11592
 
11593
    // write to phy's control register for 100Mbps
11594
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
11595
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
11596
    speed = 100;
11597
 
11598
    frame_started = 0;
11599
    frame_ended = 0;
11600
    wait_for_frame = 0;
11601
    check_frame = 0;
11602
    stop_checking_frame = 0;
11603
    first_fr_received = 1; // at the beginning the first frame of each two will be received!
11604
 
11605
    num_of_frames = 0; // 
11606
    num_of_bd = 0;
11607
    i_length = (min_tmp + 1); // 5 bytes longer than MINFL
11608
    while (i_length < (max_tmp - 4))
11609
    begin
11610
      // choose generating carrier sense and collision 
11611
      case (num_of_frames[1:0])
11612
      2'h0: // Interrupt is generated
11613
      begin
11614
        // enable interrupt generation
11615
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11616
        // not detect carrier sense in FD and no collision
11617
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11618
        eth_phy.collision(0);
11619
      end
11620
      2'h1: // Interrupt is generated
11621
      begin
11622
        // enable interrupt generation
11623
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11624
        // detect carrier sense in FD and no collision
11625
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11626
        eth_phy.collision(0);
11627
      end
11628
      2'h2: // Interrupt is generated
11629
      begin
11630
        // disable interrupt generation
11631
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11632
        // not detect carrier sense in FD and set collision
11633
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11634
        eth_phy.collision(1);
11635
      end
11636
      default: // 2'h3: // Interrupt is generated
11637
      begin
11638
        // disable interrupt generation
11639
        set_rx_bd(118, 118, 1'b1, (`MEMORY_BASE + num_of_frames[1:0]));
11640
        // detect carrier sense in FD and set collision
11641
        eth_phy.no_carrier_sense_rx_fd_detect(1);
11642
        eth_phy.collision(1);
11643
      end
11644
      endcase
11645
//if (first_fr_received == 0)
11646
//begin
11647
//  check_rx_bd(118, data);
11648 274 tadejm
//  wait (wbm_working == 0);
11649 243 tadejm
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11650
//  $display("RX BD set : %h, %h", data, tmp);
11651
//end
11652
      // set wrap bit
11653
      set_rx_bd_wrap(118);
11654
      set_rx_bd_empty(118, 118);
11655
      check_frame = 0;
11656
      stop_checking_frame = 0;
11657
      tmp_data = 0;
11658
      fork
11659
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
11660
          if (num_of_frames[0] == 1'b0)
11661
          begin
11662
            repeat(1) @(posedge wb_clk);
11663
            if (num_of_frames[1] == 1'b0)
11664
            begin
11665
              repeat (num_of_frames[31:2]) @(posedge mrx_clk); // for every (second) frame enable receiver one clock later
11666
            end
11667
            else
11668
            begin
11669
              @(posedge mrx_clk);
11670
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
11671
            end
11672
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11673
            wbm_init_waits = 4'h0;
11674
            wbm_subseq_waits = 4'h0;
11675 274 tadejm
            #1 wait (wbm_working == 0);
11676
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11677 243 tadejm
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
11678
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
11679
$display("mama 2, num_of_frames=%0h", num_of_frames);
11680
          end
11681
        end
11682
        begin // send a packet from PHY RX
11683
          repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
11684
          if (num_of_frames[1] == 1'b0)
11685
          begin
11686
            set_rx_addr_type(0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E);
11687
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
11688
          end
11689
          else
11690
          begin
11691
            set_rx_addr_type((max_tmp), 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E);
11692
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
11693
          end
11694
        end
11695
        begin: send_packet1
11696
          wait (MRxDV === 1'b1); // start transmit
11697
          wait (MRxDV === 1'b0); // end transmit
11698
          check_frame = 1;
11699
$display("mama 3");
11700
          repeat(10) @(posedge mrx_clk);
11701
          repeat(15) @(posedge wb_clk);
11702
          stop_checking_frame = 1;
11703
        end
11704
        begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
11705
          @(posedge eth_sl_wb_ack_o or posedge MRxDV);
11706
$display("mama 4");
11707
          if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
11708
          begin
11709
            tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11710
$display("mama 4_1");
11711
          end
11712
          else if (MRxDV === 1'b1)
11713
          begin
11714
            while (eth_sl_wb_ack_o === 1'b0)
11715
            begin
11716
              @(posedge wb_clk);
11717
              tmp_data = tmp_data + 1;
11718
            end
11719
            tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
11720
$display("mama 4_2");
11721
          end
11722
          else if (eth_sl_wb_ack_o === 1'b1)
11723
          begin
11724
            @(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
11725
            while (MRxDV === 1'b0)
11726
            begin
11727
              @(posedge wb_clk);
11728
              tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
11729
            end
11730
$display("mama 4_3");
11731
          end
11732
        end
11733
        begin // check packet
11734
          wait (check_frame == 1);
11735
          check_rx_bd(118, tmp_bd);
11736
          while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
11737
          begin
11738
            #1 check_rx_bd(118, tmp_bd);
11739
            @(posedge wb_clk);
11740
          end
11741
$display("mama 5, tmp_bd=%0h", tmp_bd);
11742
          if (num_of_frames[0] == 1'b0)
11743
          begin
11744
            if (tmp_bd[15] === 1)
11745
            begin
11746
              if (first_fr_received == 1)
11747
              begin
11748
                first_fr_received = 0;
11749
                $display("    %0d packets (without this one) are checked - packets are received by two in a set",
11750
                         num_of_frames); // +1 due to start with 0 AND -1 because this packet is excluded
11751
                $display("    From this moment:");
11752
                $display("    first one of two packets (including this one) is not accepted due to late RX enable");
11753
                if (tmp_data[31])
11754
                  $display("    ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
11755
                else
11756
                  $display("    ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
11757
              end
11758
              // check FB, etc.
11759
 
11760
            end
11761
            else // (tmp_bd[15] === 0)
11762
            begin // check FB, packet, etc.
11763
 
11764
            end
11765
$display("mama 5_1");
11766
          end
11767
          else // (num_of_frames[0] == 1'b1)
11768
          begin
11769
            if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
11770
            begin // check NOTHING
11771
 
11772
            end
11773
            else // (tmp_bd[15] === 0)
11774
            begin // check FB, packet, etc.
11775
 
11776
            end
11777
$display("mama 5_2");
11778
          end
11779
          if (stop_checking_frame == 0)
11780
            disable send_packet1;
11781
        end
11782
      join
11783
      // ONLY IF packet was received!
11784
$display("mama 6");
11785
      if (tmp_bd[15] === 0)
11786
      begin
11787
        // check length of a PACKET
11788
        if (tmp_bd[31:16] != (i_length + 4))
11789
        begin
11790
          `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
11791
                          tmp_bd[31:16], (i_length + 4));
11792
          test_fail("Wrong length of the packet out from PHY");
11793
          fail = fail + 1;
11794
        end
11795
        // check received RX packet data and CRC
11796
        if (first_fr_received == 0) // if PREVIOUS RX buffer descriptor was not ready, pointer address is -1
11797
        begin
11798
          if (num_of_frames[1] == 1'b0)
11799
          begin
11800
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11801
          end
11802
          else
11803
          begin
11804
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0] - 1'b1), (i_length + 4), 1'b0, 1'b0, tmp);
11805
          end
11806
          if (tmp > 0)
11807
          begin
11808
            `TIME; $display("*E Wrong data of the received packet");
11809
            test_fail("Wrong data of the received packet");
11810
            fail = fail + 1;
11811
          end
11812
        end
11813
        else // if PREVIOUS RX buffer descriptor was ready
11814
        begin
11815
          if (num_of_frames[1] == 1'b0)
11816
          begin
11817
            check_rx_packet(0, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11818
          end
11819
          else
11820
          begin
11821
            check_rx_packet(max_tmp, (`MEMORY_BASE + num_of_frames[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
11822
          end
11823
          if (tmp > 0)
11824
          begin
11825
            `TIME; $display("*E Wrong data of the received packet");
11826
            test_fail("Wrong data of the received packet");
11827
            fail = fail + 1;
11828
          end
11829
        end
11830
      end
11831
      // check WB INT signal
11832
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11833
      begin
11834
        if (wb_int !== 1'b0)
11835
        begin
11836
          `TIME; $display("*E WB INT signal should not be set");
11837
          test_fail("WB INT signal should not be set");
11838
          fail = fail + 1;
11839
        end
11840
      end
11841
      else
11842
      begin
11843
        if (wb_int !== 1'b1)
11844
        begin
11845
          `TIME; $display("*E WB INT signal should be set");
11846
          test_fail("WB INT signal should be set");
11847
          fail = fail + 1;
11848
        end
11849
      end
11850
      // check RX buffer descriptor of a packet - only 15 LSBits
11851
      check_rx_bd(118, data);
11852
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11853
      begin
11854
        if (data[15:0] !== 16'hE000)
11855
        begin
11856
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11857
          test_fail("RX buffer descriptor status is not correct");
11858
          fail = fail + 1;
11859
        end
11860
      end
11861
      else // interrupt enabled
11862
      begin
11863 279 mohor
        if ((data[15:0] !== 16'h6000) && (data[15:0] !== 16'h6080)) // because of promiscuous
11864 243 tadejm
        begin
11865
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
11866
          test_fail("RX buffer descriptor status is not correct");
11867
          fail = fail + 1;
11868
        end
11869
      end
11870
      // check interrupts
11871 274 tadejm
      wait (wbm_working == 0);
11872 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11873
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
11874
      begin
11875
        if (data !== 0)
11876
        begin
11877
          `TIME; $display("*E Any of interrupts was set, interrupt reg: %0h, len: %0h", data, num_of_frames[1:0]);
11878
          test_fail("Any of interrupts was set");
11879
          fail = fail + 1;
11880
        end
11881
      end
11882
      else
11883
      begin
11884
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
11885
        begin
11886
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
11887
          test_fail("Interrupt Receive Buffer was not set");
11888
          fail = fail + 1;
11889
        end
11890
        if ((data & (~`ETH_INT_RXB)) !== 0)
11891
        begin
11892
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
11893
          test_fail("Other interrupts (except Receive Buffer) were set");
11894
          fail = fail + 1;
11895
        end
11896
      end
11897
      // clear interrupts
11898 274 tadejm
      wait (wbm_working == 0);
11899 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11900
      // check WB INT signal
11901
      if (wb_int !== 1'b0)
11902
      begin
11903
        test_fail("WB INT signal should not be set");
11904
        fail = fail + 1;
11905
      end
11906
      // disable RX after two packets
11907
      if (num_of_frames[0] == 1'b1)
11908
      begin
11909
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
11910 274 tadejm
        wait (wbm_working == 0);
11911 243 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
11912
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
11913
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
11914
      end
11915
      // the number of frame transmitted
11916
      num_of_frames = num_of_frames + 1;
11917
      num_of_bd = 0;
11918
      // set length (LOOP variable)
11919
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
11920
        i_length = (max_tmp - 4);
11921
      @(posedge wb_clk);
11922
    end
11923
    // disable RX
11924 274 tadejm
    wait (wbm_working == 0);
11925 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
11926
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11927
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11928
    if(fail == 0)
11929
      test_ok;
11930
    else
11931
      fail = 0;
11932
  end
11933
 
11934
 
11935
  ////////////////////////////////////////////////////////////////////
11936
  ////                                                            ////
11937 209 tadejm
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
11938
  ////  one RX buffer decriptor ( 10Mbps ).                       ////
11939
  ////                                                            ////
11940
  ////////////////////////////////////////////////////////////////////
11941 243 tadejm
  if (test_num == 4) // 
11942 209 tadejm
  begin
11943 243 tadejm
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
11944
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
11945
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
11946 209 tadejm
 
11947
    // unmask interrupts
11948 274 tadejm
    wait (wbm_working == 0);
11949 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11950
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11951
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
11952 274 tadejm
    wait (wbm_working == 0);
11953 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11954
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
11955 274 tadejm
    wait (wbm_working == 0);
11956 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
11957
              `ETH_MODER_PRO | `ETH_MODER_BRO,
11958
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11959
    // prepare two packets of MAXFL length
11960 274 tadejm
    wait (wbm_working == 0);
11961 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11962
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
11963
    min_tmp = tmp[31:16];
11964
    st_data = 8'h0F;
11965
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
11966
    st_data = 8'h1A;
11967
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
11968
    // check WB INT signal
11969
    if (wb_int !== 1'b0)
11970
    begin
11971
      test_fail("WB INT signal should not be set");
11972
      fail = fail + 1;
11973
    end
11974
 
11975
    // write to phy's control register for 10Mbps
11976
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
11977
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
11978
    speed = 10;
11979
 
11980
    i_length = (min_tmp - 4);
11981
    while (i_length <= (max_tmp - 4))
11982
    begin
11983
      // choose generating carrier sense and collision for first and last 64 lengths of frames
11984
      case (i_length[1:0])
11985
      2'h0: // Interrupt is generated
11986
      begin
11987
        // enable interrupt generation
11988
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
11989
        // unmask interrupts
11990 274 tadejm
        wait (wbm_working == 0);
11991 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
11992
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
11993
        // not detect carrier sense in FD and no collision
11994
        eth_phy.no_carrier_sense_rx_fd_detect(0);
11995
        eth_phy.collision(0);
11996
      end
11997
      2'h1: // Interrupt is not generated
11998
      begin
11999
        // enable interrupt generation
12000
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12001
        // mask interrupts
12002 274 tadejm
        wait (wbm_working == 0);
12003 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12004
        // detect carrier sense in FD and no collision
12005
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12006
        eth_phy.collision(0);
12007
      end
12008
      2'h2: // Interrupt is not generated
12009
      begin
12010
        // disable interrupt generation
12011
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12012
        // unmask interrupts
12013 274 tadejm
        wait (wbm_working == 0);
12014 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12015
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12016
        // not detect carrier sense in FD and set collision
12017
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12018
        eth_phy.collision(1);
12019
      end
12020
      default: // 2'h3: // Interrupt is not generated
12021
      begin
12022
        // disable interrupt generation
12023
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12024
        // mask interrupts
12025 274 tadejm
        wait (wbm_working == 0);
12026 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12027
        // detect carrier sense in FD and set collision
12028
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12029
        eth_phy.collision(1);
12030
      end
12031
      endcase
12032
      if (i_length[0] == 1'b0)
12033
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12034
      else
12035
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12036
      // set wrap bit
12037
      set_rx_bd_wrap(127);
12038
      set_rx_bd_empty(127, 127);
12039
      fork
12040
        begin
12041
          if (i_length[0] == 1'b0)
12042
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12043
          else
12044
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12045
          repeat(10) @(posedge mrx_clk);
12046
        end
12047
        begin
12048
          #1 check_rx_bd(127, data);
12049
          if (i_length < min_tmp) // just first four
12050
          begin
12051
            while (data[15] === 1)
12052
            begin
12053
              #1 check_rx_bd(127, data);
12054
              @(posedge wb_clk);
12055
            end
12056
            repeat (1) @(posedge wb_clk);
12057
          end
12058
          else
12059
          begin
12060
            wait (MRxDV === 1'b1); // start transmit
12061
            #1 check_rx_bd(127, data);
12062
            if (data[15] !== 1)
12063
            begin
12064
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12065
              fail = fail + 1;
12066
            end
12067
            wait (MRxDV === 1'b0); // end transmit
12068
            while (data[15] === 1)
12069
            begin
12070
              #1 check_rx_bd(127, data);
12071
              @(posedge wb_clk);
12072
            end
12073
            repeat (1) @(posedge wb_clk);
12074
          end
12075
        end
12076
      join
12077
      // check length of a PACKET
12078
      if (data[31:16] != (i_length + 4))
12079
      begin
12080
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12081
                        data[31:16], (i_length + 4));
12082
        test_fail("Wrong length of the packet out from PHY");
12083
        fail = fail + 1;
12084
      end
12085
      // checking in the following if statement is performed only for first and last 64 lengths
12086
      // check received RX packet data and CRC
12087
      if (i_length[0] == 1'b0)
12088
      begin
12089
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12090
      end
12091
      else
12092
      begin
12093
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12094
      end
12095
      if (tmp > 0)
12096
      begin
12097
        `TIME; $display("*E Wrong data of the received packet");
12098
        test_fail("Wrong data of the received packet");
12099
        fail = fail + 1;
12100
      end
12101
      // check WB INT signal
12102
      if (i_length[1:0] == 2'h0)
12103
      begin
12104
        if (wb_int !== 1'b1)
12105
        begin
12106
          `TIME; $display("*E WB INT signal should be set");
12107
          test_fail("WB INT signal should be set");
12108
          fail = fail + 1;
12109
        end
12110
      end
12111
      else
12112
      begin
12113
        if (wb_int !== 1'b0)
12114
        begin
12115
          `TIME; $display("*E WB INT signal should not be set");
12116
          test_fail("WB INT signal should not be set");
12117
          fail = fail + 1;
12118
        end
12119
      end
12120
      // check RX buffer descriptor of a packet
12121
      check_rx_bd(127, data);
12122
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
12123
      begin
12124 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12125
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12126 209 tadejm
        begin
12127
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12128
          test_fail("RX buffer descriptor status is not correct");
12129
          fail = fail + 1;
12130
        end
12131
      end
12132
      else // interrupt not enabled
12133
      begin
12134 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12135
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12136 209 tadejm
        begin
12137
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12138
          test_fail("RX buffer descriptor status is not correct");
12139
          fail = fail + 1;
12140
        end
12141
      end
12142
      // clear RX buffer descriptor for first 4 frames
12143
      if (i_length < min_tmp)
12144
        clear_rx_bd(127, 127);
12145
      // check interrupts
12146 274 tadejm
      wait (wbm_working == 0);
12147 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12148
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12149
      begin
12150
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12151
        begin
12152
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12153
          test_fail("Interrupt Receive Buffer was not set");
12154
          fail = fail + 1;
12155
        end
12156
        if ((data & (~`ETH_INT_RXB)) !== 0)
12157
        begin
12158
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12159
          test_fail("Other interrupts (except Receive Buffer) were set");
12160
          fail = fail + 1;
12161
        end
12162
      end
12163
      else
12164
      begin
12165
        if (data !== 0)
12166
        begin
12167
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12168
          test_fail("Any of interrupts (except Receive Buffer) was set");
12169
          fail = fail + 1;
12170
        end
12171
      end
12172
      // clear interrupts
12173 274 tadejm
      wait (wbm_working == 0);
12174 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12175
      // check WB INT signal
12176
      if (wb_int !== 1'b0)
12177
      begin
12178
        test_fail("WB INT signal should not be set");
12179
        fail = fail + 1;
12180
      end
12181
      // INTERMEDIATE DISPLAYS
12182
      if ((i_length + 4) == (min_tmp + 64))
12183
      begin
12184
        // starting length is min_tmp, ending length is (min_tmp + 64)
12185
        $display("    receive small packets is NOT selected");
12186
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12187
                 min_tmp, (min_tmp + 64));
12188
        // set receive small, remain the rest
12189 274 tadejm
        wait (wbm_working == 0);
12190 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12191
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12192
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12193
      end
12194
      else if ((i_length + 4) == (max_tmp - 16))
12195
      begin
12196
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12197
        $display("    receive small packets is selected");
12198
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12199
                 (min_tmp + 64 + 128), tmp_data);
12200
        // reset receive small, remain the rest
12201 274 tadejm
        wait (wbm_working == 0);
12202 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12203
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12204
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12205
      end
12206
      else if ((i_length + 4) == max_tmp)
12207
      begin
12208
        $display("    receive small packets is NOT selected");
12209
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12210
                 (max_tmp - (4 + 16)), max_tmp);
12211
      end
12212
      // set length (loop variable)
12213
      if ((i_length + 4) < (min_tmp + 64))
12214
        i_length = i_length + 1;
12215
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12216
      begin
12217
        i_length = i_length + 128;
12218
        tmp_data = i_length + 4; // last tmp_data is ending length
12219
      end
12220
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12221
        i_length = max_tmp - (4 + 16);
12222
      else if ((i_length + 4) >= (max_tmp - 16))
12223
        i_length = i_length + 1;
12224
      else
12225
      begin
12226
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12227
        #10 $stop;
12228
      end
12229
    end
12230
    // disable RX
12231 274 tadejm
    wait (wbm_working == 0);
12232 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12233
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12234
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12235
    if(fail == 0)
12236
      test_ok;
12237
    else
12238
      fail = 0;
12239
  end
12240
 
12241
 
12242
  ////////////////////////////////////////////////////////////////////
12243
  ////                                                            ////
12244
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12245
  ////  one RX buffer decriptor ( 100Mbps ).                      ////
12246
  ////                                                            ////
12247
  ////////////////////////////////////////////////////////////////////
12248 243 tadejm
  if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
12249 209 tadejm
  begin
12250 243 tadejm
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
12251
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
12252
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
12253 209 tadejm
 
12254
    // unmask interrupts
12255 274 tadejm
    wait (wbm_working == 0);
12256 209 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12257
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12258
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
12259 274 tadejm
    wait (wbm_working == 0);
12260 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12261
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12262 274 tadejm
    wait (wbm_working == 0);
12263 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12264
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12265
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12266
    // prepare two packets of MAXFL length
12267 274 tadejm
    wait (wbm_working == 0);
12268 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12269
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12270
    min_tmp = tmp[31:16];
12271
    st_data = 8'h0F;
12272
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12273
    st_data = 8'h1A;
12274
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12275
    // check WB INT signal
12276
    if (wb_int !== 1'b0)
12277
    begin
12278
      test_fail("WB INT signal should not be set");
12279
      fail = fail + 1;
12280
    end
12281
 
12282
    // write to phy's control register for 100Mbps
12283
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
12284
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
12285
    speed = 100;
12286
 
12287
    i_length = (min_tmp - 4);
12288
    while (i_length <= (max_tmp - 4))
12289
    begin
12290
      // choose generating carrier sense and collision for first and last 64 lengths of frames
12291
      case (i_length[1:0])
12292
      2'h0: // Interrupt is generated
12293
      begin
12294
        // enable interrupt generation
12295
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12296
        // unmask interrupts
12297 274 tadejm
        wait (wbm_working == 0);
12298 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12299
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12300
        // not detect carrier sense in FD and no collision
12301
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12302
        eth_phy.collision(0);
12303
      end
12304
      2'h1: // Interrupt is not generated
12305
      begin
12306
        // enable interrupt generation
12307
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12308
        // mask interrupts
12309 274 tadejm
        wait (wbm_working == 0);
12310 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12311
        // detect carrier sense in FD and no collision
12312
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12313
        eth_phy.collision(0);
12314
      end
12315
      2'h2: // Interrupt is not generated
12316
      begin
12317
        // disable interrupt generation
12318
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12319
        // unmask interrupts
12320 274 tadejm
        wait (wbm_working == 0);
12321 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12322
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12323
        // not detect carrier sense in FD and set collision
12324
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12325
        eth_phy.collision(1);
12326
      end
12327
      default: // 2'h3: // Interrupt is not generated
12328
      begin
12329
        // disable interrupt generation
12330
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12331
        // mask interrupts
12332 274 tadejm
        wait (wbm_working == 0);
12333 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12334
        // detect carrier sense in FD and set collision
12335
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12336
        eth_phy.collision(1);
12337
      end
12338
      endcase
12339
      if (i_length[0] == 1'b0)
12340
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12341
      else
12342
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12343
      // set wrap bit
12344
      set_rx_bd_wrap(127);
12345
      set_rx_bd_empty(127, 127);
12346
      fork
12347
        begin
12348
          if (i_length[0] == 1'b0)
12349
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12350
          else
12351
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12352
          repeat(10) @(posedge mrx_clk);
12353
        end
12354
        begin
12355
          #1 check_rx_bd(127, data);
12356
          if (i_length < min_tmp) // just first four
12357
          begin
12358
            while (data[15] === 1)
12359
            begin
12360
              #1 check_rx_bd(127, data);
12361
              @(posedge wb_clk);
12362
            end
12363
            repeat (1) @(posedge wb_clk);
12364
          end
12365
          else
12366
          begin
12367
            wait (MRxDV === 1'b1); // start transmit
12368
            #1 check_rx_bd(127, data);
12369
            if (data[15] !== 1)
12370
            begin
12371
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12372
              fail = fail + 1;
12373
            end
12374
            wait (MRxDV === 1'b0); // end transmit
12375
            while (data[15] === 1)
12376
            begin
12377
              #1 check_rx_bd(127, data);
12378
              @(posedge wb_clk);
12379
            end
12380
            repeat (1) @(posedge wb_clk);
12381
          end
12382
        end
12383
      join
12384
      // check length of a PACKET
12385
      if (data[31:16] != (i_length + 4))
12386
      begin
12387
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12388
                        data[31:16], (i_length + 4));
12389
        test_fail("Wrong length of the packet out from PHY");
12390
        fail = fail + 1;
12391
      end
12392
      // checking in the following if statement is performed only for first and last 64 lengths
12393
      // check received RX packet data and CRC
12394
      if (i_length[0] == 1'b0)
12395
      begin
12396
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12397
      end
12398
      else
12399
      begin
12400
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12401
      end
12402
      if (tmp > 0)
12403
      begin
12404
        `TIME; $display("*E Wrong data of the received packet");
12405
        test_fail("Wrong data of the received packet");
12406
        fail = fail + 1;
12407
      end
12408
      // check WB INT signal
12409
      if (i_length[1:0] == 2'h0)
12410
      begin
12411
        if (wb_int !== 1'b1)
12412
        begin
12413
          `TIME; $display("*E WB INT signal should be set");
12414
          test_fail("WB INT signal should be set");
12415
          fail = fail + 1;
12416
        end
12417
      end
12418
      else
12419
      begin
12420
        if (wb_int !== 1'b0)
12421
        begin
12422
          `TIME; $display("*E WB INT signal should not be set");
12423
          test_fail("WB INT signal should not be set");
12424
          fail = fail + 1;
12425
        end
12426
      end
12427
      // check RX buffer descriptor of a packet
12428
      check_rx_bd(127, data);
12429
      if (i_length[1] == 1'b0) // interrupt enabled 
12430
      begin
12431 281 mohor
        if ( ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b0)) ||
12432
             ((data[15:0] !== 16'h6080) && (i_length[0] == 1'b1)) )
12433 209 tadejm
        begin
12434
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12435
          test_fail("RX buffer descriptor status is not correct");
12436
          fail = fail + 1;
12437
        end
12438
      end
12439
      else // interrupt not enabled
12440
      begin
12441 281 mohor
        if ( ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b0)) ||
12442
             ((data[15:0] !== 16'h2080) && (i_length[0] == 1'b1)) )
12443 209 tadejm
        begin
12444
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12445
          test_fail("RX buffer descriptor status is not correct");
12446
          fail = fail + 1;
12447
        end
12448
      end
12449
      // clear RX buffer descriptor for first 4 frames
12450
      if (i_length < min_tmp)
12451
        clear_rx_bd(127, 127);
12452
      // check interrupts
12453 274 tadejm
      wait (wbm_working == 0);
12454 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12455
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12456
      begin
12457
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12458
        begin
12459
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12460
          test_fail("Interrupt Receive Buffer was not set");
12461
          fail = fail + 1;
12462
        end
12463
        if ((data & (~`ETH_INT_RXB)) !== 0)
12464
        begin
12465
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12466
          test_fail("Other interrupts (except Receive Buffer) were set");
12467
          fail = fail + 1;
12468
        end
12469
      end
12470
      else
12471
      begin
12472
        if (data !== 0)
12473
        begin
12474
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12475
          test_fail("Any of interrupts (except Receive Buffer) was set");
12476
          fail = fail + 1;
12477
        end
12478
      end
12479
      // clear interrupts
12480 274 tadejm
      wait (wbm_working == 0);
12481 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12482
      // check WB INT signal
12483
      if (wb_int !== 1'b0)
12484
      begin
12485
        test_fail("WB INT signal should not be set");
12486
        fail = fail + 1;
12487
      end
12488
      // INTERMEDIATE DISPLAYS
12489
      if ((i_length + 4) == (min_tmp + 64))
12490
      begin
12491
        // starting length is min_tmp, ending length is (min_tmp + 64)
12492
        $display("    receive small packets is NOT selected");
12493
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12494
                 min_tmp, (min_tmp + 64));
12495
        // set receive small, remain the rest
12496 274 tadejm
        wait (wbm_working == 0);
12497 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12498
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12499
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12500
      end
12501
      else if ((i_length + 4) == (max_tmp - 16))
12502
      begin
12503
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12504
        $display("    receive small packets is selected");
12505
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12506
                 (min_tmp + 64 + 128), tmp_data);
12507
        // reset receive small, remain the rest
12508 274 tadejm
        wait (wbm_working == 0);
12509 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12510
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12511
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12512
      end
12513
      else if ((i_length + 4) == max_tmp)
12514
      begin
12515
        $display("    receive small packets is NOT selected");
12516
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12517
                 (max_tmp - (4 + 16)), max_tmp);
12518
      end
12519
      // set length (loop variable)
12520
      if ((i_length + 4) < (min_tmp + 64))
12521
        i_length = i_length + 1;
12522
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
12523
      begin
12524
        i_length = i_length + 128;
12525
        tmp_data = i_length + 4; // last tmp_data is ending length
12526
      end
12527
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12528
        i_length = max_tmp - (4 + 16);
12529
      else if ((i_length + 4) >= (max_tmp - 16))
12530
        i_length = i_length + 1;
12531
      else
12532
      begin
12533
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12534
        #10 $stop;
12535
      end
12536
    end
12537
    // disable RX
12538 274 tadejm
    wait (wbm_working == 0);
12539 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12540
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12541
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12542
    if(fail == 0)
12543
      test_ok;
12544
    else
12545
      fail = 0;
12546
  end
12547
 
12548
 
12549
  ////////////////////////////////////////////////////////////////////
12550
  ////                                                            ////
12551
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
12552
  ////  maximum RX buffer decriptors ( 10Mbps ).                  ////
12553
  ////                                                            ////
12554
  ////////////////////////////////////////////////////////////////////
12555 243 tadejm
  if (test_num == 6) // 
12556 209 tadejm
  begin
12557 243 tadejm
    // TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
12558
    test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
12559
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
12560 209 tadejm
 
12561
    // reset MAC registers
12562
    hard_reset;
12563
    // reset MAC and MII LOGIC with soft reset
12564 274 tadejm
//    reset_mac;
12565
//    reset_mii;
12566 209 tadejm
    // set wb slave response
12567
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
12568
 
12569
    max_tmp = 0;
12570
    min_tmp = 0;
12571
    num_of_frames = 0;
12572
    num_of_bd = 0;
12573
    // set maximum RX buffer descriptors (128) - must be set before RX enable
12574 274 tadejm
    wait (wbm_working == 0);
12575 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12576
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
12577 274 tadejm
    wait (wbm_working == 0);
12578 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12579
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12580
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12581
    // prepare two packets of MAXFL length
12582 274 tadejm
    wait (wbm_working == 0);
12583 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12584
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
12585
    min_tmp = tmp[31:16];
12586
    st_data = 8'hAC;
12587
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
12588
    st_data = 8'h35;
12589
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
12590
    // check WB INT signal
12591
    if (wb_int !== 1'b0)
12592
    begin
12593
      test_fail("WB INT signal should not be set");
12594
      fail = fail + 1;
12595
    end
12596
 
12597
    // write to phy's control register for 10Mbps
12598
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
12599
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
12600
    speed = 10;
12601
 
12602
    i_length = (min_tmp - 4);
12603
    while (i_length <= (max_tmp - 4))
12604
    begin
12605
      // append CRC to packet
12606
      if (i_length[0] == 1'b0)
12607
        append_rx_crc (0, i_length, 1'b0, 1'b0);
12608
      else
12609
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
12610
      // choose generating carrier sense and collision
12611
      case (i_length[1:0])
12612
      2'h0: // Interrupt is generated
12613
      begin
12614
        // Reset_tx_bd nable interrupt generation
12615
        // unmask interrupts
12616 274 tadejm
        wait (wbm_working == 0);
12617 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12618
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12619
        // not detect carrier sense in FD and no collision
12620
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12621
        eth_phy.collision(0);
12622
      end
12623
      2'h1: // Interrupt is not generated
12624
      begin
12625
        // set_tx_bd enable interrupt generation
12626
        // mask interrupts
12627 274 tadejm
        wait (wbm_working == 0);
12628 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12629
        // detect carrier sense in FD and no collision
12630
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12631
        eth_phy.collision(0);
12632
      end
12633
      2'h2: // Interrupt is not generated
12634
      begin
12635
        // set_tx_bd disable the interrupt generation
12636
        // unmask interrupts
12637 274 tadejm
        wait (wbm_working == 0);
12638 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
12639
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12640
        // not detect carrier sense in FD and set collision
12641
        eth_phy.no_carrier_sense_rx_fd_detect(0);
12642
        eth_phy.collision(1);
12643
      end
12644
      default: // 2'h3: // Interrupt is not generated
12645
      begin
12646
        // set_tx_bd disable the interrupt generation
12647
        // mask interrupts
12648 274 tadejm
        wait (wbm_working == 0);
12649 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12650
        // detect carrier sense in FD and set collision
12651
        eth_phy.no_carrier_sense_rx_fd_detect(1);
12652
        eth_phy.collision(1);
12653
      end
12654
      endcase
12655
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
12656
      // number of all frames is 154 (146 without first 8)
12657
      if (num_of_frames < 8)
12658
      begin
12659
        case (i_length[1:0])
12660
        2'h0: // Interrupt is generated
12661
        begin
12662
          // enable interrupt generation
12663
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
12664
          // interrupts are unmasked
12665
        end
12666
        2'h1: // Interrupt is not generated
12667
        begin
12668
          // enable interrupt generation
12669
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12670
          // interrupts are masked
12671
        end
12672
        2'h2: // Interrupt is not generated
12673
        begin
12674
          // disable interrupt generation
12675
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
12676
          // interrupts are unmasked
12677
        end
12678
        default: // 2'h3: // Interrupt is not generated
12679
        begin
12680
          // disable interrupt generation
12681
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
12682
          // interrupts are masked
12683
        end
12684
        endcase
12685
        // set wrap bit
12686
        set_rx_bd_wrap(0);
12687
      end
12688
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
12689
      else if ((num_of_frames - 8) == 0)
12690
      begin
12691
        tmp_len = i_length; // length of frame
12692
        tmp_bd_num = 0; // RX BD number
12693
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12694
        begin
12695
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12696
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12697
          if (tmp_len[0] == 0)
12698
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12699
          else
12700
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12701
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12702
          if ((tmp_len + 4) < (min_tmp + 128))
12703
            tmp_len = tmp_len + 1;
12704
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12705
            tmp_len = 256;
12706
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12707
            tmp_len = tmp_len + 128;
12708
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12709
            tmp_len = max_tmp - (4 + 16);
12710
          else if ((tmp_len + 4) >= (max_tmp - 16))
12711
            tmp_len = tmp_len + 1;
12712
          // set RX BD number
12713
          tmp_bd_num = tmp_bd_num + 1;
12714
        end
12715
        // set wrap bit
12716
        set_rx_bd_wrap(127);
12717
      end
12718
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
12719
      else if ((num_of_frames - 8) == 20) // 128
12720
      begin
12721
        tmp_len = tmp_len; // length of frame remaines from previous settings
12722
        tmp_bd_num = 0; // TX BD number
12723
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
12724
        begin
12725
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
12726
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
12727
          if (tmp_len[0] == 0)
12728
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
12729
          else
12730
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
12731
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
12732
          if ((tmp_len + 4) < (min_tmp + 128))
12733
            tmp_len = tmp_len + 1;
12734
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12735
            tmp_len = 256;
12736
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
12737
            tmp_len = tmp_len + 128;
12738
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
12739
            tmp_len = max_tmp - (4 + 16);
12740
          else if ((tmp_len + 4) >= (max_tmp - 16))
12741
            tmp_len = tmp_len + 1;
12742
          // set TX BD number
12743
          tmp_bd_num = tmp_bd_num + 1;
12744
        end
12745
      end
12746
      // set empty bit
12747
      if (num_of_frames < 8)
12748
        set_rx_bd_empty(0, 0);
12749
      else if ((num_of_frames - 8) < 128)
12750
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
12751
      else if ((num_of_frames - 136) < 19)
12752
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
12753
      // CHECK END OF RECEIVE
12754
      fork
12755
        begin
12756
          if (i_length[0] == 1'b0)
12757
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
12758
          else
12759
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
12760
          repeat(10) @(posedge mrx_clk);
12761
        end
12762
        begin
12763
          #1 check_rx_bd(num_of_bd, data);
12764
          if (i_length < min_tmp) // just first four
12765
          begin
12766
            while (data[15] === 1)
12767
            begin
12768
              #1 check_rx_bd(num_of_bd, data);
12769
              @(posedge wb_clk);
12770
            end
12771
            repeat (1) @(posedge wb_clk);
12772
          end
12773
          else
12774
          begin
12775
            wait (MRxDV === 1'b1); // start transmit
12776
            #1 check_rx_bd(num_of_bd, data);
12777
            if (data[15] !== 1)
12778
            begin
12779
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
12780
              fail = fail + 1;
12781
            end
12782
            wait (MRxDV === 1'b0); // end transmit
12783
            while (data[15] === 1)
12784
            begin
12785
              #1 check_rx_bd(num_of_bd, data);
12786
              @(posedge wb_clk);
12787
            end
12788
            repeat (1) @(posedge wb_clk);
12789
          end
12790
        end
12791
      join
12792
      // check length of a PACKET
12793
      if (data[31:16] != (i_length + 4))
12794
      begin
12795
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
12796
                        data[31:16], (i_length + 4));
12797
        test_fail("Wrong length of the packet out from PHY");
12798
        fail = fail + 1;
12799
      end
12800
      // checking in the following if statement is performed only for first and last 64 lengths
12801
      // check received RX packet data and CRC
12802
      if (i_length[0] == 1'b0)
12803
      begin
12804
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
12805
      end
12806
      else
12807
      begin
12808
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
12809
      end
12810
      if (tmp > 0)
12811
      begin
12812
        `TIME; $display("*E Wrong data of the received packet");
12813
        test_fail("Wrong data of the received packet");
12814
        fail = fail + 1;
12815
      end
12816
      // check WB INT signal
12817
      if (i_length[1:0] == 2'h0)
12818
      begin
12819
        if (wb_int !== 1'b1)
12820
        begin
12821
          `TIME; $display("*E WB INT signal should be set");
12822
          test_fail("WB INT signal should be set");
12823
          fail = fail + 1;
12824
        end
12825
      end
12826
      else
12827
      begin
12828
        if (wb_int !== 1'b0)
12829
        begin
12830
          `TIME; $display("*E WB INT signal should not be set");
12831
          test_fail("WB INT signal should not be set");
12832
          fail = fail + 1;
12833
        end
12834
      end
12835
      // check RX buffer descriptor of a packet
12836
      check_rx_bd(num_of_bd, data);
12837
      if (i_length[1] == 1'b0) // interrupt enabled
12838
      begin
12839 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12840
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12841 209 tadejm
        begin
12842
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12843
          test_fail("RX buffer descriptor status is not correct");
12844
          fail = fail + 1;
12845
        end
12846
      end
12847
      else // interrupt not enabled
12848
      begin
12849 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
12850
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
12851 209 tadejm
        begin
12852
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
12853
          test_fail("RX buffer descriptor status is not correct");
12854
          fail = fail + 1;
12855
        end
12856
      end
12857
      // clear first half of 8 frames from RX buffer descriptor 0
12858
      if (num_of_frames < 4)
12859
        clear_rx_bd(num_of_bd, num_of_bd);
12860
      // clear BD with wrap bit
12861
      if (num_of_frames == 140)
12862
        clear_rx_bd(127, 127);
12863
      // check interrupts
12864 274 tadejm
      wait (wbm_working == 0);
12865 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12866
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
12867
      begin
12868
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
12869
        begin
12870
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
12871
          test_fail("Interrupt Receive Buffer was not set");
12872
          fail = fail + 1;
12873
        end
12874
        if ((data & (~`ETH_INT_RXB)) !== 0)
12875
        begin
12876
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
12877
          test_fail("Other interrupts (except Receive Buffer) were set");
12878
          fail = fail + 1;
12879
        end
12880
      end
12881
      else
12882
      begin
12883
        if (data !== 0)
12884
        begin
12885
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
12886
          test_fail("Any of interrupts (except Receive Buffer) was set");
12887
          fail = fail + 1;
12888
        end
12889
      end
12890
      // clear interrupts
12891 274 tadejm
      wait (wbm_working == 0);
12892 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12893
      // check WB INT signal
12894
      if (wb_int !== 1'b0)
12895
      begin
12896
        test_fail("WB INT signal should not be set");
12897
        fail = fail + 1;
12898
      end
12899
      // INTERMEDIATE DISPLAYS
12900
      if ((i_length + 4) == (min_tmp + 7))
12901
      begin
12902
        // starting length is min_tmp, ending length is (min_tmp + 128)
12903
        $display("    receive small packets is NOT selected");
12904
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
12905
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
12906
                 min_tmp, (min_tmp + 7));
12907
        $display("    ->all packets were received on RX BD 0");
12908
        // reset receive small, remain the rest
12909 274 tadejm
        wait (wbm_working == 0);
12910 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12911
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12912
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12913
      end
12914
      else if ((i_length + 4) == (min_tmp + 128))
12915
      begin
12916
        // starting length is min_tmp, ending length is (min_tmp + 128)
12917
        $display("    receive small packets is NOT selected");
12918
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12919
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
12920
                 (min_tmp + 8), (min_tmp + 128));
12921
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
12922
                 1'b0, num_of_bd);
12923
        tmp_bd = num_of_bd + 1;
12924
        // set receive small, remain the rest
12925 274 tadejm
        wait (wbm_working == 0);
12926 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12927
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12928
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12929
      end
12930
      else if ((i_length + 4) == (max_tmp - 16))
12931
      begin
12932
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
12933
        $display("    receive small packets is selected");
12934
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12935
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
12936
                 (min_tmp + 64 + 128), tmp_data);
12937
        if (tmp_bd > num_of_bd)
12938
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12939
                   tmp_bd, num_of_bd);
12940
        else
12941
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12942
                   tmp_bd, num_of_bd);
12943
        tmp_bd = num_of_bd + 1;
12944
        // reset receive small, remain the rest
12945 274 tadejm
        wait (wbm_working == 0);
12946 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
12947
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
12948
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12949
      end
12950
      else if ((i_length + 4) == max_tmp)
12951
      begin
12952
        $display("    receive small packets is NOT selected");
12953
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
12954
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
12955
                 (max_tmp - (4 + 16)), max_tmp);
12956
        if (tmp_bd > num_of_bd)
12957
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
12958
                   tmp_bd, num_of_bd);
12959
        else
12960
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
12961
                   tmp_bd, num_of_bd);
12962
      end
12963
      // set length (loop variable)
12964
      if ((i_length + 4) < (min_tmp + 128))
12965
        i_length = i_length + 1;
12966
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12967
        i_length = 256;
12968
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
12969
      begin
12970
        i_length = i_length + 128;
12971
        tmp_data = i_length + 4; // last tmp_data is ending length
12972
      end
12973
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
12974
        i_length = max_tmp - (4 + 16);
12975
      else if ((i_length + 4) >= (max_tmp - 16))
12976
        i_length = i_length + 1;
12977
      else
12978
      begin
12979
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
12980
        #10 $stop;
12981
      end
12982
      // the number of frame transmitted
12983
      num_of_frames = num_of_frames + 1;
12984
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
12985
        num_of_bd = 0;
12986
      else
12987
        num_of_bd = num_of_bd + 1;
12988
    end
12989
    // disable RX
12990 274 tadejm
    wait (wbm_working == 0);
12991 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
12992
              `ETH_MODER_PRO | `ETH_MODER_BRO,
12993
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
12994
    @(posedge wb_clk);
12995
    if(fail == 0)
12996
      test_ok;
12997
    else
12998
      fail = 0;
12999
  end
13000
 
13001
 
13002
  ////////////////////////////////////////////////////////////////////
13003
  ////                                                            ////
13004
  ////  Test receive packets form MINFL to MAXFL sizes at         ////
13005
  ////  maximum RX buffer decriptors ( 100Mbps ).                 ////
13006
  ////                                                            ////
13007
  ////////////////////////////////////////////////////////////////////
13008 243 tadejm
  if (test_num == 7) // 
13009 209 tadejm
  begin
13010 243 tadejm
    // TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
13011
    test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
13012
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
13013 209 tadejm
 
13014
    // reset MAC registers
13015
    hard_reset;
13016
    // reset MAC and MII LOGIC with soft reset
13017 274 tadejm
//    reset_mac;
13018
//    reset_mii;
13019 209 tadejm
    // set wb slave response
13020
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13021
 
13022
    max_tmp = 0;
13023
    min_tmp = 0;
13024
    num_of_frames = 0;
13025
    num_of_bd = 0;
13026
    // set maximum RX buffer descriptors (128) - must be set before RX enable
13027 274 tadejm
    wait (wbm_working == 0);
13028 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13029
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
13030 274 tadejm
    wait (wbm_working == 0);
13031 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13032
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13033
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13034
    // prepare two packets of MAXFL length
13035 274 tadejm
    wait (wbm_working == 0);
13036 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13037
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13038
    min_tmp = tmp[31:16];
13039
    st_data = 8'hAC;
13040
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13041
    st_data = 8'h35;
13042
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13043
    // check WB INT signal
13044
    if (wb_int !== 1'b0)
13045
    begin
13046
      test_fail("WB INT signal should not be set");
13047
      fail = fail + 1;
13048
    end
13049
 
13050
    // write to phy's control register for 100Mbps
13051
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
13052
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
13053
    speed = 100;
13054
 
13055
    i_length = (min_tmp - 4);
13056
    while (i_length <= (max_tmp - 4))
13057
    begin
13058
      // append CRC to packet
13059
      if (i_length[0] == 1'b0)
13060
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13061
      else
13062
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13063
      // choose generating carrier sense and collision
13064
      case (i_length[1:0])
13065
      2'h0: // Interrupt is generated
13066
      begin
13067
        // Reset_tx_bd nable interrupt generation
13068
        // unmask interrupts
13069 274 tadejm
        wait (wbm_working == 0);
13070 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13071
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13072
        // not detect carrier sense in FD and no collision
13073
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13074
        eth_phy.collision(0);
13075
      end
13076
      2'h1: // Interrupt is not generated
13077
      begin
13078
        // set_tx_bd enable interrupt generation
13079
        // mask interrupts
13080 274 tadejm
        wait (wbm_working == 0);
13081 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13082
        // detect carrier sense in FD and no collision
13083
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13084
        eth_phy.collision(0);
13085
      end
13086
      2'h2: // Interrupt is not generated
13087
      begin
13088
        // set_tx_bd disable the interrupt generation
13089
        // unmask interrupts
13090 274 tadejm
        wait (wbm_working == 0);
13091 209 tadejm
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13092
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13093
        // not detect carrier sense in FD and set collision
13094
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13095
        eth_phy.collision(1);
13096
      end
13097
      default: // 2'h3: // Interrupt is not generated
13098
      begin
13099
        // set_tx_bd disable the interrupt generation
13100
        // mask interrupts
13101 274 tadejm
        wait (wbm_working == 0);
13102 209 tadejm
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13103
        // detect carrier sense in FD and set collision
13104
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13105
        eth_phy.collision(1);
13106
      end
13107
      endcase
13108
      // first 8 frames are received with RX BD 0 (wrap bit on RX BD 0)
13109
      // number of all frames is 154 (146 without first 8)
13110
      if (num_of_frames < 8)
13111
      begin
13112
        case (i_length[1:0])
13113
        2'h0: // Interrupt is generated
13114
        begin
13115
          // enable interrupt generation
13116
          set_rx_bd(0, 0, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13117
          // interrupts are unmasked
13118
        end
13119
        2'h1: // Interrupt is not generated
13120
        begin
13121
          // enable interrupt generation
13122
          set_rx_bd(0, 0, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13123
          // interrupts are masked
13124
        end
13125
        2'h2: // Interrupt is not generated
13126
        begin
13127
          // disable interrupt generation
13128
          set_rx_bd(0, 0, 1'b0, (`MEMORY_BASE + i_length[1:0]));
13129
          // interrupts are unmasked
13130
        end
13131
        default: // 2'h3: // Interrupt is not generated
13132
        begin
13133
          // disable interrupt generation
13134
          set_rx_bd(0, 0, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13135
          // interrupts are masked
13136
        end
13137
        endcase
13138
        // set wrap bit
13139
        set_rx_bd_wrap(0);
13140
      end
13141
      // after first 8 number of frames, 128 frames form RX BD 0 to 127 will be received
13142
      else if ((num_of_frames - 8) == 0)
13143
      begin
13144
        tmp_len = i_length; // length of frame
13145
        tmp_bd_num = 0; // RX BD number
13146
        while (tmp_bd_num < 128) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13147
        begin
13148
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13149
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13150
          if (tmp_len[0] == 0)
13151
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13152
          else
13153
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13154
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13155
          if ((tmp_len + 4) < (min_tmp + 128))
13156
            tmp_len = tmp_len + 1;
13157
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13158
            tmp_len = 256;
13159
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13160
            tmp_len = tmp_len + 128;
13161
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13162
            tmp_len = max_tmp - (4 + 16);
13163
          else if ((tmp_len + 4) >= (max_tmp - 16))
13164
            tmp_len = tmp_len + 1;
13165
          // set RX BD number
13166
          tmp_bd_num = tmp_bd_num + 1;
13167
        end
13168
        // set wrap bit
13169
        set_rx_bd_wrap(127);
13170
      end
13171
      // after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
13172
      else if ((num_of_frames - 8) == 20) // 128
13173
      begin
13174
        tmp_len = tmp_len; // length of frame remaines from previous settings
13175
        tmp_bd_num = 0; // TX BD number
13176
        while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
13177
        begin
13178
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
13179
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13180
          if (tmp_len[0] == 0)
13181
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], (`MEMORY_BASE + tmp_len[1:0]));
13182
          else
13183
            set_rx_bd(tmp_bd_num, tmp_bd_num, !tmp_len[1], ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13184
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13185
          if ((tmp_len + 4) < (min_tmp + 128))
13186
            tmp_len = tmp_len + 1;
13187
          else if ( ((tmp_len + 4) == (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13188
            tmp_len = 256;
13189
          else if ( ((tmp_len + 4) > (min_tmp + 128)) && ((tmp_len + 4) <= (max_tmp - 256)) )
13190
            tmp_len = tmp_len + 128;
13191
          else if ( ((tmp_len + 4) > (max_tmp - 256)) && ((tmp_len + 4) < (max_tmp - 16)) )
13192
            tmp_len = max_tmp - (4 + 16);
13193
          else if ((tmp_len + 4) >= (max_tmp - 16))
13194
            tmp_len = tmp_len + 1;
13195
          // set TX BD number
13196
          tmp_bd_num = tmp_bd_num + 1;
13197
        end
13198
      end
13199
      // set empty bit
13200
      if (num_of_frames < 8)
13201
        set_rx_bd_empty(0, 0);
13202
      else if ((num_of_frames - 8) < 128)
13203
        set_rx_bd_empty((num_of_frames - 8), (num_of_frames - 8));
13204
      else if ((num_of_frames - 136) < 19)
13205
        set_rx_bd_empty((num_of_frames - 136), (num_of_frames - 136));
13206
      // CHECK END OF RECEIVE
13207
      fork
13208
        begin
13209
          if (i_length[0] == 1'b0)
13210
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13211
          else
13212
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13213
          repeat(10) @(posedge mrx_clk);
13214
        end
13215
        begin
13216
          #1 check_rx_bd(num_of_bd, data);
13217
          if (i_length < min_tmp) // just first four
13218
          begin
13219
            while (data[15] === 1)
13220
            begin
13221
              #1 check_rx_bd(num_of_bd, data);
13222
              @(posedge wb_clk);
13223
            end
13224
            repeat (1) @(posedge wb_clk);
13225
          end
13226
          else
13227
          begin
13228
            wait (MRxDV === 1'b1); // start transmit
13229
            #1 check_rx_bd(num_of_bd, data);
13230
            if (data[15] !== 1)
13231
            begin
13232
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
13233
              fail = fail + 1;
13234
            end
13235
            wait (MRxDV === 1'b0); // end transmit
13236
            while (data[15] === 1)
13237
            begin
13238
              #1 check_rx_bd(num_of_bd, data);
13239
              @(posedge wb_clk);
13240
            end
13241
            repeat (1) @(posedge wb_clk);
13242
          end
13243
        end
13244
      join
13245
      // check length of a PACKET
13246
      if (data[31:16] != (i_length + 4))
13247
      begin
13248
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13249
                        data[31:16], (i_length + 4));
13250
        test_fail("Wrong length of the packet out from PHY");
13251
        fail = fail + 1;
13252
      end
13253
      // check received RX packet data and CRC
13254
      if (i_length[0] == 1'b0)
13255
      begin
13256
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13257
      end
13258
      else
13259
      begin
13260
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13261
      end
13262
      if (tmp > 0)
13263
      begin
13264
        `TIME; $display("*E Wrong data of the received packet");
13265
        test_fail("Wrong data of the received packet");
13266
        fail = fail + 1;
13267
      end
13268
      // check WB INT signal
13269
      if (i_length[1:0] == 2'h0)
13270
      begin
13271
        if (wb_int !== 1'b1)
13272
        begin
13273
          `TIME; $display("*E WB INT signal should be set");
13274
          test_fail("WB INT signal should be set");
13275
          fail = fail + 1;
13276
        end
13277
      end
13278
      else
13279
      begin
13280
        if (wb_int !== 1'b0)
13281
        begin
13282
          `TIME; $display("*E WB INT signal should not be set");
13283
          test_fail("WB INT signal should not be set");
13284
          fail = fail + 1;
13285
        end
13286
      end
13287
      // check RX buffer descriptor of a packet
13288
      check_rx_bd(num_of_bd, data);
13289
      if (i_length[1] == 1'b0) // interrupt enabled
13290
      begin
13291 281 mohor
        if ( ((data[15:0] !== 16'h6080) && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13292
             ((data[15:0] !== 16'h4080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13293 209 tadejm
        begin
13294
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13295
          test_fail("RX buffer descriptor status is not correct");
13296
          fail = fail + 1;
13297
        end
13298
      end
13299
      else // interrupt not enabled
13300
      begin
13301 281 mohor
        if ( ((data[15:0] !== 16'h2080)  && ((num_of_frames < 8) || ((num_of_frames - 8) == 127))) || // wrap bit
13302
             ((data[15:0] !== 16'h0080) && (num_of_frames >= 8) && ((num_of_frames - 8) != 127)) ) // without wrap bit
13303 209 tadejm
        begin
13304
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
13305
          test_fail("RX buffer descriptor status is not correct");
13306
          fail = fail + 1;
13307
        end
13308
      end
13309
      // clear first half of 8 frames from RX buffer descriptor 0
13310
      if (num_of_frames < 4)
13311
        clear_rx_bd(num_of_bd, num_of_bd);
13312
      // clear BD with wrap bit
13313
      if (num_of_frames == 140)
13314
        clear_rx_bd(127, 127);
13315
      // check interrupts
13316 274 tadejm
      wait (wbm_working == 0);
13317 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13318
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
13319
      begin
13320
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13321
        begin
13322
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13323
          test_fail("Interrupt Receive Buffer was not set");
13324
          fail = fail + 1;
13325
        end
13326
        if ((data & (~`ETH_INT_RXB)) !== 0)
13327
        begin
13328
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13329
          test_fail("Other interrupts (except Receive Buffer) were set");
13330
          fail = fail + 1;
13331
        end
13332
      end
13333
      else
13334
      begin
13335
        if (data !== 0)
13336
        begin
13337
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
13338
          test_fail("Any of interrupts (except Receive Buffer) was set");
13339
          fail = fail + 1;
13340
        end
13341
      end
13342
      // clear interrupts
13343 274 tadejm
      wait (wbm_working == 0);
13344 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13345
      // check WB INT signal
13346
      if (wb_int !== 1'b0)
13347
      begin
13348
        test_fail("WB INT signal should not be set");
13349
        fail = fail + 1;
13350
      end
13351
      // INTERMEDIATE DISPLAYS
13352
      if ((i_length + 4) == (min_tmp + 7))
13353
      begin
13354
        // starting length is min_tmp, ending length is (min_tmp + 128)
13355
        $display("    receive small packets is NOT selected");
13356
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
13357
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
13358
                 min_tmp, (min_tmp + 7));
13359
        $display("    ->all packets were received on RX BD 0");
13360
        // reset receive small, remain the rest
13361 274 tadejm
        wait (wbm_working == 0);
13362 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13363
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13364
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13365
      end
13366
      else if ((i_length + 4) == (min_tmp + 128))
13367
      begin
13368
        // starting length is min_tmp, ending length is (min_tmp + 128)
13369
        $display("    receive small packets is NOT selected");
13370
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13371
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13372
                 (min_tmp + 8), (min_tmp + 128));
13373
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
13374
                 1'b0, num_of_bd);
13375
        tmp_bd = num_of_bd + 1;
13376
        // set receive small, remain the rest
13377 274 tadejm
        wait (wbm_working == 0);
13378 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13379
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13380
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13381
      end
13382
      else if ((i_length + 4) == (max_tmp - 16))
13383
      begin
13384
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
13385
        $display("    receive small packets is selected");
13386
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13387
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
13388
                 (min_tmp + 64 + 128), tmp_data);
13389
        if (tmp_bd > num_of_bd)
13390
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13391
                   tmp_bd, num_of_bd);
13392
        else
13393
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13394
                   tmp_bd, num_of_bd);
13395
        tmp_bd = num_of_bd + 1;
13396
        // reset receive small, remain the rest
13397 274 tadejm
        wait (wbm_working == 0);
13398 209 tadejm
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
13399
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
13400
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13401
      end
13402
      else if ((i_length + 4) == max_tmp)
13403
      begin
13404
        $display("    receive small packets is NOT selected");
13405
        $display("    using all 128 BDs assigned to RX (wrap at 128th BD - RX BD 127)");
13406
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
13407
                 (max_tmp - (4 + 16)), max_tmp);
13408
        if (tmp_bd > num_of_bd)
13409
          $display("    ->packets were received from RX BD %0d to RX BD 127 and from RX BD 0 to RX BD %0d respectively",
13410
                   tmp_bd, num_of_bd);
13411
        else
13412
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
13413
                   tmp_bd, num_of_bd);
13414
      end
13415
      // set length (loop variable)
13416
      if ((i_length + 4) < (min_tmp + 128))
13417
        i_length = i_length + 1;
13418
      else if ( ((i_length + 4) == (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13419
        i_length = 256;
13420
      else if ( ((i_length + 4) > (min_tmp + 128)) && ((i_length + 4) <= (max_tmp - 256)) )
13421
      begin
13422
        i_length = i_length + 128;
13423
        tmp_data = i_length + 4; // last tmp_data is ending length
13424
      end
13425
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
13426
        i_length = max_tmp - (4 + 16);
13427
      else if ((i_length + 4) >= (max_tmp - 16))
13428
        i_length = i_length + 1;
13429
      else
13430
      begin
13431
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
13432
        #10 $stop;
13433
      end
13434
      // the number of frame transmitted
13435
      num_of_frames = num_of_frames + 1;
13436
      if ((num_of_frames <= 8) || ((num_of_frames - 8) == 128))
13437
        num_of_bd = 0;
13438
      else
13439
        num_of_bd = num_of_bd + 1;
13440
    end
13441
    // disable RX
13442 274 tadejm
    wait (wbm_working == 0);
13443 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13444
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13445
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13446
    @(posedge wb_clk);
13447
    if(fail == 0)
13448
      test_ok;
13449
    else
13450
      fail = 0;
13451
  end
13452
 
13453
 
13454
  ////////////////////////////////////////////////////////////////////
13455
  ////                                                            ////
13456 243 tadejm
  ////  Test receive packets form 0 to (MINFL + 12) sizes at       ////
13457 209 tadejm
  ////  8 RX buffer decriptors ( 10Mbps ).                        ////
13458
  ////                                                            ////
13459
  ////////////////////////////////////////////////////////////////////
13460 243 tadejm
  if (test_num == 8) // 
13461 209 tadejm
  begin
13462 243 tadejm
    // TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
13463
    test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
13464
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
13465 209 tadejm
 
13466
    // reset MAC registers
13467
    hard_reset;
13468
    // reset MAC and MII LOGIC with soft reset
13469 274 tadejm
//    reset_mac;
13470
//    reset_mii;
13471 209 tadejm
    // set wb slave response
13472
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
13473
 
13474
    max_tmp = 0;
13475
    min_tmp = 0;
13476
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
13477 274 tadejm
    wait (wbm_working == 0);
13478 209 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13479
    // enable RX, set full-duplex mode, receive small, NO correct IFG
13480 274 tadejm
    wait (wbm_working == 0);
13481 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
13482
              `ETH_MODER_PRO | `ETH_MODER_BRO,
13483
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13484
    // prepare two packets of MAXFL length
13485 274 tadejm
    wait (wbm_working == 0);
13486 209 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13487
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
13488
    min_tmp = tmp[31:16];
13489
    st_data = 8'hAC;
13490
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
13491
    st_data = 8'h35;
13492
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
13493
    // check WB INT signal
13494
    if (wb_int !== 1'b0)
13495
    begin
13496
      test_fail("WB INT signal should not be set");
13497
      fail = fail + 1;
13498
    end
13499 243 tadejm
    // unmask interrupts
13500 274 tadejm
    wait (wbm_working == 0);
13501 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
13502
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13503 209 tadejm
 
13504
    // write to phy's control register for 10Mbps
13505
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
13506
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
13507
    speed = 10;
13508
 
13509 243 tadejm
    frame_ended = 0;
13510
    num_of_frames = 0;// 0; // 10;
13511
    num_of_bd = 120;
13512
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
13513
    while ((i_length + 4) < 78) // (min_tmp - 4))
13514 209 tadejm
    begin
13515 243 tadejm
      // append CRC to packet
13516
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
13517
        append_rx_crc (0, i_length, 1'b0, 1'b0);
13518
      else if (num_of_frames > 4)
13519
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
13520 209 tadejm
      // choose generating carrier sense and collision
13521
      case (i_length[1:0])
13522 243 tadejm
      2'h0:
13523 209 tadejm
      begin
13524
        // not detect carrier sense in FD and no collision
13525 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13526 209 tadejm
        eth_phy.collision(0);
13527
      end
13528 243 tadejm
      2'h1:
13529 209 tadejm
      begin
13530
        // detect carrier sense in FD and no collision
13531 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13532 209 tadejm
        eth_phy.collision(0);
13533
      end
13534 243 tadejm
      2'h2:
13535 209 tadejm
      begin
13536
        // not detect carrier sense in FD and set collision
13537 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(0);
13538 209 tadejm
        eth_phy.collision(1);
13539
      end
13540 243 tadejm
      default: // 2'h3:
13541 209 tadejm
      begin
13542
        // detect carrier sense in FD and set collision
13543 243 tadejm
        eth_phy.no_carrier_sense_rx_fd_detect(1);
13544 209 tadejm
        eth_phy.collision(1);
13545
      end
13546
      endcase
13547
      #1;
13548 243 tadejm
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
13549 209 tadejm
      if (num_of_frames <= 9)
13550
      begin
13551 243 tadejm
        case (i_length[1:0])
13552
        2'h0: // Interrupt is generated
13553
        begin
13554
          // enable interrupt generation
13555
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13556
        end
13557
        2'h1: // Interrupt is generated
13558
        begin
13559
          // enable interrupt generation
13560
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13561
        end
13562
        2'h2: // Interrupt is generated
13563
        begin
13564
          // enable interrupt generation
13565
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
13566
        end
13567
        default: // 2'h3: // Interrupt is generated
13568
        begin
13569
          // enable interrupt generation
13570
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
13571
        end
13572
        endcase
13573 209 tadejm
        // set wrap bit
13574 243 tadejm
        set_rx_bd_wrap(120);
13575 209 tadejm
      end
13576 243 tadejm
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
13577 209 tadejm
      else if ((num_of_frames == 10) || (num_of_frames == 14))
13578
      begin
13579
        tmp_len = i_length; // length of frame
13580 243 tadejm
        tmp_bd_num = 120; // RX BD number
13581
        while (tmp_bd_num < 124) // 
13582 209 tadejm
        begin
13583
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13584
          if (tmp_len[0] == 0)
13585 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13586 209 tadejm
          else
13587 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13588
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13589 209 tadejm
          tmp_len = tmp_len + 1;
13590 243 tadejm
          // set RX BD number
13591 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13592
        end
13593
        // set wrap bit
13594 243 tadejm
        set_rx_bd_wrap(123);
13595 209 tadejm
      end
13596 243 tadejm
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
13597 209 tadejm
      else if ((num_of_frames == 18) || (num_of_frames == 23))
13598
      begin
13599
        tmp_len = i_length; // length of frame
13600 243 tadejm
        tmp_bd_num = 120; // RX BD number
13601
        while (tmp_bd_num < 125) // 
13602 209 tadejm
        begin
13603
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13604
          if (tmp_len[0] == 0)
13605 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13606 209 tadejm
          else
13607 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13608
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13609 209 tadejm
          tmp_len = tmp_len + 1;
13610 243 tadejm
          // set RX BD number
13611 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13612
        end
13613
        // set wrap bit
13614 243 tadejm
        set_rx_bd_wrap(124);
13615 209 tadejm
      end
13616 243 tadejm
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
13617 209 tadejm
      else if ((num_of_frames == 28) || (num_of_frames == 34))
13618
      begin
13619
        tmp_len = i_length; // length of frame
13620 243 tadejm
        tmp_bd_num = 120; // RX BD number
13621
        while (tmp_bd_num < 126) // 
13622 209 tadejm
        begin
13623
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13624
          if (tmp_len[0] == 0)
13625 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13626 209 tadejm
          else
13627 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13628
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13629 209 tadejm
          tmp_len = tmp_len + 1;
13630 243 tadejm
          // set RX BD number
13631 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13632
        end
13633
        // set wrap bit
13634 243 tadejm
        set_rx_bd_wrap(125);
13635 209 tadejm
      end
13636 243 tadejm
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
13637 209 tadejm
      else if ((num_of_frames == 40) || (num_of_frames == 47))
13638
      begin
13639
        tmp_len = i_length; // length of frame
13640 243 tadejm
        tmp_bd_num = 120; // RX BD number
13641
        while (tmp_bd_num < 127) // 
13642 209 tadejm
        begin
13643
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13644
          if (tmp_len[0] == 0)
13645 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13646 209 tadejm
          else
13647 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13648
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13649 209 tadejm
          tmp_len = tmp_len + 1;
13650 243 tadejm
          // set RX BD number
13651 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13652
        end
13653
        // set wrap bit
13654 243 tadejm
        set_rx_bd_wrap(126);
13655 209 tadejm
      end
13656 243 tadejm
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
13657 209 tadejm
      else if ((num_of_frames == 54) || (num_of_frames == 62))
13658
      begin
13659
        tmp_len = i_length; // length of frame
13660 243 tadejm
        tmp_bd_num = 120; // RX BD number
13661
        while (tmp_bd_num < 128) // 
13662 209 tadejm
        begin
13663
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13664
          if (tmp_len[0] == 0)
13665 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13666 209 tadejm
          else
13667 243 tadejm
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13668
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13669 209 tadejm
          tmp_len = tmp_len + 1;
13670 243 tadejm
          // set RX BD number
13671 209 tadejm
          tmp_bd_num = tmp_bd_num + 1;
13672
        end
13673
        // set wrap bit
13674 243 tadejm
        set_rx_bd_wrap(127);
13675 209 tadejm
      end
13676 243 tadejm
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
13677
      else if (num_of_frames == 70)
13678
      begin
13679
        tmp_len = i_length; // length of frame
13680
        tmp_bd_num = 120; // RX BD number
13681
        while (tmp_bd_num < 128) // 
13682
        begin
13683
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
13684
          if (tmp_len[0] == 0)
13685
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
13686
          else
13687
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
13688
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
13689
          tmp_len = tmp_len + 1;
13690
          // set RX BD number
13691
          tmp_bd_num = tmp_bd_num + 1;
13692
        end
13693
        // set wrap bit
13694
        set_rx_bd_wrap(127);
13695
      end
13696 209 tadejm
      #1;
13697 243 tadejm
      // SET empty bit
13698 209 tadejm
      if (num_of_frames < 10)
13699 243 tadejm
        set_rx_bd_empty(120, 120);
13700 209 tadejm
      else if (num_of_frames < 14)
13701 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
13702 209 tadejm
      else if (num_of_frames < 18)
13703 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
13704 209 tadejm
      else if (num_of_frames < 23)
13705 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
13706 209 tadejm
      else if (num_of_frames < 28)
13707 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
13708 209 tadejm
      else if (num_of_frames < 34)
13709 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
13710 209 tadejm
      else if (num_of_frames < 40)
13711 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
13712 209 tadejm
      else if (num_of_frames < 47)
13713 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
13714 209 tadejm
      else if (num_of_frames < 54)
13715 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
13716 209 tadejm
      else if (num_of_frames < 62)
13717 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
13718 209 tadejm
      else if (num_of_frames < 70)
13719 243 tadejm
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
13720
      else if (num_of_frames < 78)
13721
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
13722
      // CHECK END OF RECEIVE
13723 252 tadejm
      // receive just preamble between some packets
13724
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
13725
      begin
13726
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
13727
        @(posedge mrx_clk);
13728
        wait (MRxDV === 1'b0); // end receive
13729
        repeat(10) @(posedge mrx_clk);
13730
        repeat(15) @(posedge wb_clk);
13731
      end
13732
      // receiving frames and checking end of them
13733 243 tadejm
      frame_ended = 0;
13734
      check_frame = 0;
13735 209 tadejm
      fork
13736
        begin
13737 243 tadejm
          if (i_length[0] == 1'b0)
13738
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
13739
          else
13740
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
13741
          repeat(10) @(posedge mrx_clk);
13742
        end
13743
        begin: fr_end1
13744
          wait (MRxDV === 1'b1); // start receive
13745
          #1 check_rx_bd(num_of_bd, data);
13746
          if (data[15] !== 1)
13747 209 tadejm
          begin
13748 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
13749
            fail = fail + 1;
13750 209 tadejm
          end
13751 243 tadejm
          wait (MRxDV === 1'b0); // end receive
13752
          while ((data[15] === 1) && (check_frame == 0))
13753
          begin
13754
            #1 check_rx_bd(num_of_bd, data);
13755
            @(posedge wb_clk);
13756
          end
13757
          if (data[15] === 0)
13758
            frame_ended = 1;
13759
          repeat (1) @(posedge wb_clk);
13760 209 tadejm
        end
13761 243 tadejm
        begin
13762
          wait (MRxDV === 1'b1); // start receive
13763
          wait (MRxDV === 1'b0); // end receive
13764
          repeat(10) @(posedge mrx_clk);
13765
          repeat(15) @(posedge wb_clk);
13766
          check_frame = 1;
13767
        end
13768
      join
13769
      // check length of a PACKET
13770
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
13771
           ((data[31:16] != 0) && (num_of_frames < 3)) )
13772
      begin
13773
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
13774
                        data[31:16], (i_length + 4));
13775
        test_fail("Wrong length of the packet out from PHY");
13776
        fail = fail + 1;
13777
      end
13778
      // check received RX packet data and CRC
13779
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
13780
      begin                                           // CRC has 4 bytes for itself
13781
        if (i_length[0] == 1'b0)
13782
        begin
13783
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
13784
        end
13785 209 tadejm
        else
13786
        begin
13787 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
13788 209 tadejm
        end
13789 243 tadejm
        if (tmp > 0)
13790
        begin
13791
          `TIME; $display("*E Wrong data of the received packet");
13792
          test_fail("Wrong data of the received packet");
13793
          fail = fail + 1;
13794
        end
13795 209 tadejm
      end
13796 243 tadejm
      // check WB INT signal
13797
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
13798
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
13799
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
13800
        begin
13801
          `TIME; $display("*E WB INT signal should be set");
13802
          test_fail("WB INT signal should be set");
13803
          fail = fail + 1;
13804
        end
13805
      end
13806
      else
13807
      begin
13808
        if (wb_int !== 1'b0)
13809
        begin
13810
          `TIME; $display("*E WB INT signal should not be set");
13811
          test_fail("WB INT signal should not be set");
13812
          fail = fail + 1;
13813
        end
13814
      end
13815
      // check RX buffer descriptor of a packet
13816 254 mohor
      // check RX buffer descriptor of a packet
13817 243 tadejm
      if (num_of_frames >= min_tmp)
13818
      begin
13819 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
13820
             (data[15:0] !== 16'h4080) ) // without wrap bit
13821 243 tadejm
        begin
13822
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13823
          test_fail("RX buffer descriptor status is not correct");
13824
          fail = fail + 1;
13825
        end
13826
      end
13827 254 mohor
      else if (num_of_frames > 6)
13828 243 tadejm
      begin
13829 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
13830
             (data[15:0] !== 16'h4084) ) // without wrap bit
13831
        begin
13832
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13833
          test_fail("RX buffer descriptor status is not correct");
13834
          fail = fail + 1;
13835
        end
13836
      end
13837
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
13838
      begin
13839 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
13840
             (data[15:0] !== 16'h4004) ) // without wrap bit
13841
        begin
13842
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13843
          test_fail("RX buffer descriptor status is not correct");
13844
          fail = fail + 1;
13845
        end
13846
      end
13847 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
13848 243 tadejm
      begin
13849
        if ( (data[15:0] !== 16'h6006) && // wrap bit
13850
             (data[15:0] !== 16'h4006) ) // without wrap bit
13851
        begin
13852
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13853
          test_fail("RX buffer descriptor status is not correct");
13854
          fail = fail + 1;
13855
        end
13856
      end
13857
      else
13858
      begin
13859
        if (data[15] !== 1'b1)
13860
        begin
13861
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
13862
          test_fail("RX buffer descriptor status is not correct");
13863
          fail = fail + 1;
13864
        end
13865
      end
13866
      // check interrupts
13867 274 tadejm
      wait (wbm_working == 0);
13868 243 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13869 209 tadejm
      if (num_of_frames >= 5)
13870
      begin
13871 243 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
13872 209 tadejm
        begin
13873 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
13874
          test_fail("Interrupt Receive Buffer was not set");
13875
          fail = fail + 1;
13876 209 tadejm
        end
13877 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
13878 209 tadejm
        begin
13879 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
13880
          test_fail("Other interrupts (except Receive Buffer) were set");
13881
          fail = fail + 1;
13882 209 tadejm
        end
13883 243 tadejm
      end
13884
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
13885
      begin
13886
        if (data) // Checking if any interrupt is pending)
13887 209 tadejm
        begin
13888 243 tadejm
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
13889
          test_fail("Interrupts were set");
13890
          fail = fail + 1;
13891
        end
13892
      end
13893
      else
13894
      begin
13895
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
13896
        begin
13897
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
13898
          test_fail("Interrupt Receive Buffer Error was not set");
13899
          fail = fail + 1;
13900
        end
13901
        if ((data & (~`ETH_INT_RXE)) !== 0)
13902
        begin
13903
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
13904
          test_fail("Other interrupts (except Receive Buffer Error) were set");
13905
          fail = fail + 1;
13906
        end
13907
      end
13908
      // clear interrupts
13909 274 tadejm
      wait (wbm_working == 0);
13910 243 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13911
      // check WB INT signal
13912
      if (wb_int !== 1'b0)
13913
      begin
13914
        test_fail("WB INT signal should not be set");
13915
        fail = fail + 1;
13916
      end
13917
      // INTERMEDIATE DISPLAYS
13918
      if (num_of_frames == 3)
13919
      begin
13920
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13921
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
13922
                 0, 3);
13923
      end
13924
      else if (num_of_frames == 9)
13925
      begin
13926
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
13927
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
13928
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13929
                 5, 9);
13930
      end
13931
      else if (num_of_frames == 17)
13932
      begin
13933
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
13934
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13935
                 10, 17);
13936
      end
13937
      else if (num_of_frames == 27)
13938
      begin
13939
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
13940
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13941
                 18, 27);
13942
      end
13943
      else if (num_of_frames == 40)
13944
      begin
13945
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
13946
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13947
                 28, 40);
13948
      end
13949
      else if (num_of_frames == 54)
13950
      begin
13951
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
13952
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13953
                 41, 54);
13954
      end
13955
      else if (num_of_frames == 69)
13956
      begin
13957
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13958
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13959
                 55, 69);
13960
      end
13961
      else if (num_of_frames == 69)
13962
      begin
13963
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13964
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13965
                 55, 69);
13966
      end
13967
      else if (num_of_frames == 77)
13968
      begin
13969
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
13970
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
13971
                 70, 77);
13972
      end
13973
      // set length (loop variable)
13974
      i_length = i_length + 1;
13975
      // the number of frame transmitted
13976
      num_of_frames = num_of_frames + 1;
13977
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
13978
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
13979
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
13980
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
13981
        num_of_bd = 120;
13982
      else
13983
        num_of_bd = num_of_bd + 1;
13984
    end
13985
    // disable RX
13986 274 tadejm
    wait (wbm_working == 0);
13987 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
13988
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
13989
    @(posedge wb_clk);
13990
    if(fail == 0)
13991
      test_ok;
13992
    else
13993
      fail = 0;
13994
  end
13995
 
13996
 
13997
  ////////////////////////////////////////////////////////////////////
13998
  ////                                                            ////
13999
  ////  Test receive packets form 0 to (MINFL + 12) sizes at      ////
14000
  ////  8 RX buffer decriptors ( 100Mbps ).                       ////
14001
  ////                                                            ////
14002
  ////////////////////////////////////////////////////////////////////
14003
  if (test_num == 9) // 
14004
  begin
14005
    // TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
14006
    test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
14007
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
14008
 
14009
    // reset MAC registers
14010
    hard_reset;
14011
    // reset MAC and MII LOGIC with soft reset
14012 274 tadejm
//    reset_mac;
14013
//    reset_mii;
14014 243 tadejm
    // set wb slave response
14015
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14016
 
14017
    max_tmp = 0;
14018
    min_tmp = 0;
14019
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
14020 274 tadejm
    wait (wbm_working == 0);
14021 243 tadejm
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14022
    // enable RX, set full-duplex mode, receive small, NO correct IFG
14023 274 tadejm
    wait (wbm_working == 0);
14024 243 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
14025
              `ETH_MODER_PRO | `ETH_MODER_BRO,
14026
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14027
    // prepare two packets of MAXFL length
14028 274 tadejm
    wait (wbm_working == 0);
14029 243 tadejm
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14030
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
14031
    min_tmp = tmp[31:16];
14032
    st_data = 8'hAC;
14033
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
14034
    st_data = 8'h35;
14035
    set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
14036
    // check WB INT signal
14037
    if (wb_int !== 1'b0)
14038
    begin
14039
      test_fail("WB INT signal should not be set");
14040
      fail = fail + 1;
14041
    end
14042
    // unmask interrupts
14043 274 tadejm
    wait (wbm_working == 0);
14044 243 tadejm
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14045
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14046
 
14047
    // write to phy's control register for 100Mbps
14048
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
14049
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
14050
    speed = 100;
14051
 
14052
    frame_ended = 0;
14053 252 tadejm
    num_of_frames = 0;// 0; // 10;
14054 243 tadejm
    num_of_bd = 120;
14055
    i_length = 0 - 4;// (0 - 4); // 6; // 4 less due to CRC
14056
    while ((i_length + 4) < 78) // (min_tmp - 4))
14057
    begin
14058
      // append CRC to packet
14059 252 tadejm
      if ((i_length[0] == 1'b0) && (num_of_frames > 4))
14060 243 tadejm
        append_rx_crc (0, i_length, 1'b0, 1'b0);
14061 252 tadejm
      else if (num_of_frames > 4)
14062 243 tadejm
        append_rx_crc (max_tmp, i_length, 1'b0, 1'b0);
14063
      // choose generating carrier sense and collision
14064
      case (i_length[1:0])
14065
      2'h0:
14066
      begin
14067
        // not detect carrier sense in FD and no collision
14068
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14069
        eth_phy.collision(0);
14070
      end
14071
      2'h1:
14072
      begin
14073
        // detect carrier sense in FD and no collision
14074
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14075
        eth_phy.collision(0);
14076
      end
14077
      2'h2:
14078
      begin
14079
        // not detect carrier sense in FD and set collision
14080
        eth_phy.no_carrier_sense_rx_fd_detect(0);
14081
        eth_phy.collision(1);
14082
      end
14083
      default: // 2'h3:
14084
      begin
14085
        // detect carrier sense in FD and set collision
14086
        eth_phy.no_carrier_sense_rx_fd_detect(1);
14087
        eth_phy.collision(1);
14088
      end
14089
      endcase
14090
      #1;
14091
      // first 10 frames are received with RX BD 120 (wrap bit on RX BD 120)
14092
      if (num_of_frames <= 9)
14093
      begin
14094
        case (i_length[1:0])
14095
        2'h0: // Interrupt is generated
14096
        begin
14097
          // enable interrupt generation
14098
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14099
        end
14100
        2'h1: // Interrupt is generated
14101
        begin
14102
          // enable interrupt generation
14103
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14104
        end
14105
        2'h2: // Interrupt is generated
14106
        begin
14107
          // enable interrupt generation
14108
          set_rx_bd(120, 120, 1'b1, (`MEMORY_BASE + i_length[1:0]));
14109
        end
14110
        default: // 2'h3: // Interrupt is generated
14111
        begin
14112
          // enable interrupt generation
14113
          set_rx_bd(120, 120, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
14114
        end
14115
        endcase
14116
        // set wrap bit
14117
        set_rx_bd_wrap(120);
14118
      end
14119
      // 10 <= num_of_frames < 18 => wrap set to TX BD 123
14120
      else if ((num_of_frames == 10) || (num_of_frames == 14))
14121
      begin
14122
        tmp_len = i_length; // length of frame
14123
        tmp_bd_num = 120; // RX BD number
14124
        while (tmp_bd_num < 124) // 
14125
        begin
14126
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14127
          if (tmp_len[0] == 0)
14128
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14129
          else
14130
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14131
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14132
          tmp_len = tmp_len + 1;
14133
          // set RX BD number
14134
          tmp_bd_num = tmp_bd_num + 1;
14135
        end
14136
        // set wrap bit
14137
        set_rx_bd_wrap(123);
14138
      end
14139
      // 18 <= num_of_frames < 28 => wrap set to RX BD 124
14140
      else if ((num_of_frames == 18) || (num_of_frames == 23))
14141
      begin
14142
        tmp_len = i_length; // length of frame
14143
        tmp_bd_num = 120; // RX BD number
14144
        while (tmp_bd_num < 125) // 
14145
        begin
14146
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14147
          if (tmp_len[0] == 0)
14148
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14149
          else
14150
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14151
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14152
          tmp_len = tmp_len + 1;
14153
          // set RX BD number
14154
          tmp_bd_num = tmp_bd_num + 1;
14155
        end
14156
        // set wrap bit
14157
        set_rx_bd_wrap(124);
14158
      end
14159
      // 28 <= num_of_frames < 40 => wrap set to RX BD 125
14160
      else if ((num_of_frames == 28) || (num_of_frames == 34))
14161
      begin
14162
        tmp_len = i_length; // length of frame
14163
        tmp_bd_num = 120; // RX BD number
14164
        while (tmp_bd_num < 126) // 
14165
        begin
14166
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14167
          if (tmp_len[0] == 0)
14168
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14169
          else
14170
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14171
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14172
          tmp_len = tmp_len + 1;
14173
          // set RX BD number
14174
          tmp_bd_num = tmp_bd_num + 1;
14175
        end
14176
        // set wrap bit
14177
        set_rx_bd_wrap(125);
14178
      end
14179
      // 40 <= num_of_frames < 54 => wrap set to RX BD 126
14180
      else if ((num_of_frames == 40) || (num_of_frames == 47))
14181
      begin
14182
        tmp_len = i_length; // length of frame
14183
        tmp_bd_num = 120; // RX BD number
14184
        while (tmp_bd_num < 127) // 
14185
        begin
14186
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14187
          if (tmp_len[0] == 0)
14188
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14189
          else
14190
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14191
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14192
          tmp_len = tmp_len + 1;
14193
          // set RX BD number
14194
          tmp_bd_num = tmp_bd_num + 1;
14195
        end
14196
        // set wrap bit
14197
        set_rx_bd_wrap(126);
14198
      end
14199
      // 54 <= num_of_frames < 70 => wrap set to RX BD 127
14200
      else if ((num_of_frames == 54) || (num_of_frames == 62))
14201
      begin
14202
        tmp_len = i_length; // length of frame
14203
        tmp_bd_num = 120; // RX BD number
14204
        while (tmp_bd_num < 128) // 
14205
        begin
14206
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14207
          if (tmp_len[0] == 0)
14208
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14209
          else
14210
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14211
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14212
          tmp_len = tmp_len + 1;
14213
          // set RX BD number
14214
          tmp_bd_num = tmp_bd_num + 1;
14215
        end
14216
        // set wrap bit
14217
        set_rx_bd_wrap(127);
14218
      end
14219
      // 70 <= num_of_frames < 78 => wrap set to RX BD 127
14220
      else if (num_of_frames == 70)
14221
      begin
14222
        tmp_len = i_length; // length of frame
14223
        tmp_bd_num = 120; // RX BD number
14224
        while (tmp_bd_num < 128) // 
14225
        begin
14226
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
14227
          if (tmp_len[0] == 0)
14228
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, (`MEMORY_BASE + tmp_len[1:0]));
14229
          else
14230
            set_rx_bd(tmp_bd_num, tmp_bd_num, 1'b1, ((`MEMORY_BASE + tmp_len[1:0]) + max_tmp));
14231
          // set length (loop variable) - THE SAME AS AT THE END OF THIS TASK !!!
14232
          tmp_len = tmp_len + 1;
14233
          // set RX BD number
14234
          tmp_bd_num = tmp_bd_num + 1;
14235
        end
14236
        // set wrap bit
14237
        set_rx_bd_wrap(127);
14238
      end
14239
      #1;
14240
      // SET empty bit
14241
      if (num_of_frames < 10)
14242
        set_rx_bd_empty(120, 120);
14243
      else if (num_of_frames < 14)
14244
        set_rx_bd_empty((120 + num_of_frames - 10), (120 + num_of_frames - 10));
14245
      else if (num_of_frames < 18)
14246
        set_rx_bd_empty((120 + num_of_frames - 14), (120 + num_of_frames - 14));
14247
      else if (num_of_frames < 23)
14248
        set_rx_bd_empty((120 + num_of_frames - 18), (120 + num_of_frames - 18));
14249
      else if (num_of_frames < 28)
14250
        set_rx_bd_empty((120 + num_of_frames - 23), (120 + num_of_frames - 23));
14251
      else if (num_of_frames < 34)
14252
        set_rx_bd_empty((120 + num_of_frames - 28), (120 + num_of_frames - 28));
14253
      else if (num_of_frames < 40)
14254
        set_rx_bd_empty((120 + num_of_frames - 34), (120 + num_of_frames - 34));
14255
      else if (num_of_frames < 47)
14256
        set_rx_bd_empty((120 + num_of_frames - 40), (120 + num_of_frames - 40));
14257
      else if (num_of_frames < 54)
14258
        set_rx_bd_empty((120 + num_of_frames - 47), (120 + num_of_frames - 47));
14259
      else if (num_of_frames < 62)
14260
        set_rx_bd_empty((120 + num_of_frames - 54), (120 + num_of_frames - 54));
14261
      else if (num_of_frames < 70)
14262
        set_rx_bd_empty((120 + num_of_frames - 62), (120 + num_of_frames - 62));
14263
      else if (num_of_frames < 78)
14264
        set_rx_bd_empty((120 + num_of_frames - 70), (120 + num_of_frames - 70));
14265
      // CHECK END OF RECEIVE
14266 252 tadejm
      // receive just preamble between some packets
14267
      if ((num_of_frames == 0) || (num_of_frames == 4) || (num_of_frames == 9))
14268
      begin
14269
        #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h6, 8'h55, 0, 0, 1'b0);
14270
        @(posedge mrx_clk);
14271
        wait (MRxDV === 1'b0); // end receive
14272
        repeat(10) @(posedge mrx_clk);
14273
        repeat(15) @(posedge wb_clk);
14274
      end
14275
      // receiving frames and checking end of them
14276 243 tadejm
      frame_ended = 0;
14277
      check_frame = 0;
14278
      fork
14279
        begin
14280
          if (i_length[0] == 1'b0)
14281
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
14282
          else
14283
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, max_tmp, (i_length + 4), 1'b0);
14284
          repeat(10) @(posedge mrx_clk);
14285
        end
14286 254 mohor
        begin: fr_end2
14287 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14288
          #1 check_rx_bd(num_of_bd, data);
14289
          if (data[15] !== 1)
14290 209 tadejm
          begin
14291 243 tadejm
            test_fail("Wrong buffer descriptor's empty bit read out from MAC");
14292 209 tadejm
            fail = fail + 1;
14293
          end
14294 243 tadejm
          wait (MRxDV === 1'b0); // end receive
14295
          while ((data[15] === 1) && (check_frame == 0))
14296
          begin
14297
            #1 check_rx_bd(num_of_bd, data);
14298
            @(posedge wb_clk);
14299
          end
14300
          if (data[15] === 0)
14301
            frame_ended = 1;
14302
          repeat (1) @(posedge wb_clk);
14303 209 tadejm
        end
14304
        begin
14305 243 tadejm
          wait (MRxDV === 1'b1); // start receive
14306
          wait (MRxDV === 1'b0); // end receive
14307
          repeat(10) @(posedge mrx_clk);
14308
          repeat(15) @(posedge wb_clk);
14309
          check_frame = 1;
14310 209 tadejm
        end
14311 243 tadejm
      join
14312
      // check length of a PACKET
14313 252 tadejm
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
14314
           ((data[31:16] != 0) && (num_of_frames < 3)) )
14315 243 tadejm
      begin
14316
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
14317
                        data[31:16], (i_length + 4));
14318
        test_fail("Wrong length of the packet out from PHY");
14319
        fail = fail + 1;
14320
      end
14321
      // check received RX packet data and CRC
14322 252 tadejm
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
14323
      begin                                           // CRC has 4 bytes for itself
14324 243 tadejm
        if (i_length[0] == 1'b0)
14325 209 tadejm
        begin
14326 243 tadejm
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
14327 209 tadejm
        end
14328 243 tadejm
        else
14329 209 tadejm
        begin
14330 243 tadejm
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
14331 209 tadejm
        end
14332
        if (tmp > 0)
14333
        begin
14334 243 tadejm
          `TIME; $display("*E Wrong data of the received packet");
14335
          test_fail("Wrong data of the received packet");
14336 209 tadejm
          fail = fail + 1;
14337
        end
14338
      end
14339
      // check WB INT signal
14340 252 tadejm
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
14341
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
14342
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
14343 209 tadejm
        begin
14344
          `TIME; $display("*E WB INT signal should be set");
14345
          test_fail("WB INT signal should be set");
14346
          fail = fail + 1;
14347
        end
14348
      end
14349 252 tadejm
      else
14350 209 tadejm
      begin
14351
        if (wb_int !== 1'b0)
14352
        begin
14353
          `TIME; $display("*E WB INT signal should not be set");
14354
          test_fail("WB INT signal should not be set");
14355
          fail = fail + 1;
14356
        end
14357
      end
14358 243 tadejm
      // check RX buffer descriptor of a packet
14359
      if (num_of_frames >= min_tmp)
14360
      begin
14361 254 mohor
        if ( (data[15:0] !== 16'h6080) && // wrap bit
14362
             (data[15:0] !== 16'h4080) ) // without wrap bit
14363 209 tadejm
        begin
14364 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14365
          test_fail("RX buffer descriptor status is not correct");
14366
          fail = fail + 1;
14367 209 tadejm
        end
14368 243 tadejm
      end
14369 254 mohor
      else if (num_of_frames > 6)
14370 243 tadejm
      begin
14371 254 mohor
        if ( (data[15:0] !== 16'h6084) && // wrap bit
14372
             (data[15:0] !== 16'h4084) ) // without wrap bit
14373
        begin
14374
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14375
          test_fail("RX buffer descriptor status is not correct");
14376
          fail = fail + 1;
14377
        end
14378
      end
14379
      else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
14380
      begin
14381 243 tadejm
        if ( (data[15:0] !== 16'h6004) && // wrap bit
14382
             (data[15:0] !== 16'h4004) ) // without wrap bit
14383 209 tadejm
        begin
14384 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14385
          test_fail("RX buffer descriptor status is not correct");
14386
          fail = fail + 1;
14387 209 tadejm
        end
14388
      end
14389 254 mohor
      else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
14390 243 tadejm
      begin
14391
        if ( (data[15:0] !== 16'h6006) && // wrap bit
14392
             (data[15:0] !== 16'h4006) ) // without wrap bit
14393
        begin
14394
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14395
          test_fail("RX buffer descriptor status is not correct");
14396
          fail = fail + 1;
14397
        end
14398
      end
14399 209 tadejm
      else
14400
      begin
14401
        if (data[15] !== 1'b1)
14402
        begin
14403 243 tadejm
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
14404
          test_fail("RX buffer descriptor status is not correct");
14405 209 tadejm
          fail = fail + 1;
14406
        end
14407
      end
14408
      // check interrupts
14409 274 tadejm
      wait (wbm_working == 0);
14410 209 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14411 252 tadejm
      if (num_of_frames >= 5)
14412 209 tadejm
      begin
14413 252 tadejm
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
14414 209 tadejm
        begin
14415 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
14416
          test_fail("Interrupt Receive Buffer was not set");
14417 209 tadejm
          fail = fail + 1;
14418
        end
14419 243 tadejm
        if ((data & (~`ETH_INT_RXB)) !== 0)
14420 209 tadejm
        begin
14421 243 tadejm
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
14422
          test_fail("Other interrupts (except Receive Buffer) were set");
14423 209 tadejm
          fail = fail + 1;
14424
        end
14425
      end
14426 252 tadejm
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
14427
      begin
14428
        if (data) // Checking if any interrupt is pending)
14429
        begin
14430
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
14431
          test_fail("Interrupts were set");
14432
          fail = fail + 1;
14433
        end
14434
      end
14435 209 tadejm
      else
14436
      begin
14437 252 tadejm
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
14438 209 tadejm
        begin
14439 243 tadejm
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
14440
          test_fail("Interrupt Receive Buffer Error was not set");
14441 209 tadejm
          fail = fail + 1;
14442
        end
14443 243 tadejm
        if ((data & (~`ETH_INT_RXE)) !== 0)
14444
        begin
14445
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
14446
          test_fail("Other interrupts (except Receive Buffer Error) were set");
14447
          fail = fail + 1;
14448
        end
14449 209 tadejm
      end
14450
      // clear interrupts
14451 274 tadejm
      wait (wbm_working == 0);
14452 209 tadejm
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14453
      // check WB INT signal
14454
      if (wb_int !== 1'b0)
14455
      begin
14456
        test_fail("WB INT signal should not be set");
14457
        fail = fail + 1;
14458
      end
14459
      // INTERMEDIATE DISPLAYS
14460 243 tadejm
      if (num_of_frames == 3)
14461 209 tadejm
      begin
14462 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14463
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
14464 209 tadejm
                 0, 3);
14465
      end
14466 243 tadejm
      else if (num_of_frames == 9)
14467 209 tadejm
      begin
14468 243 tadejm
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
14469
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
14470 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14471
                 5, 9);
14472
      end
14473 243 tadejm
      else if (num_of_frames == 17)
14474 209 tadejm
      begin
14475 243 tadejm
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
14476 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14477
                 10, 17);
14478
      end
14479 243 tadejm
      else if (num_of_frames == 27)
14480 209 tadejm
      begin
14481 243 tadejm
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
14482 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14483
                 18, 27);
14484
      end
14485 243 tadejm
      else if (num_of_frames == 40)
14486 209 tadejm
      begin
14487 243 tadejm
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
14488 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14489
                 28, 40);
14490
      end
14491 243 tadejm
      else if (num_of_frames == 54)
14492 209 tadejm
      begin
14493 243 tadejm
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
14494 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14495
                 41, 54);
14496
      end
14497 243 tadejm
      else if (num_of_frames == 69)
14498 209 tadejm
      begin
14499 243 tadejm
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14500 209 tadejm
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14501
                 55, 69);
14502
      end
14503 243 tadejm
      else if (num_of_frames == 69)
14504
      begin
14505
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14506
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14507
                 55, 69);
14508
      end
14509
      else if (num_of_frames == 77)
14510
      begin
14511
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
14512
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
14513
                 70, 77);
14514
      end
14515 209 tadejm
      // set length (loop variable)
14516
      i_length = i_length + 1;
14517
      // the number of frame transmitted
14518
      num_of_frames = num_of_frames + 1;
14519
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
14520
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
14521
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
14522 243 tadejm
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
14523
        num_of_bd = 120;
14524 209 tadejm
      else
14525
        num_of_bd = num_of_bd + 1;
14526
    end
14527 243 tadejm
    // disable RX
14528 274 tadejm
    wait (wbm_working == 0);
14529 209 tadejm
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
14530
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14531
    @(posedge wb_clk);
14532
    if(fail == 0)
14533
      test_ok;
14534
    else
14535
      fail = 0;
14536
  end
14537
 
14538
 
14539 243 tadejm
  ////////////////////////////////////////////////////////////////////
14540
  ////                                                            ////
14541
  ////  Test receive packet synchronization with receive          ////
14542
  ////  disable/enable ( 10Mbps ).                                ////
14543
  ////                                                            ////
14544
  ////////////////////////////////////////////////////////////////////
14545
  if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
14546
  begin
14547
    // TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14548
    test_name   = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14549
    `TIME; $display("  TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14550 209 tadejm
 
14551 243 tadejm
 
14552
 
14553
 
14554
 
14555
 
14556
  end
14557
 
14558
 
14559
  ////////////////////////////////////////////////////////////////////
14560
  ////                                                            ////
14561
  ////  Test receive packet synchronization with receive          ////
14562
  ////  disable/enable ( 10Mbps ).                                ////
14563
  ////                                                            ////
14564
  ////////////////////////////////////////////////////////////////////
14565
  if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
14566
  begin
14567
    // TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14568
    test_name   = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14569
    `TIME; $display("  TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14570
 
14571
 
14572
 
14573
 
14574
 
14575
 
14576
  end
14577
 
14578
 
14579
  ////////////////////////////////////////////////////////////////////
14580
  ////                                                            ////
14581
  ////  Test receive packet synchronization with receive          ////
14582
  ////  disable/enable ( 10Mbps ).                                ////
14583
  ////                                                            ////
14584
  ////////////////////////////////////////////////////////////////////
14585
  if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
14586
  begin
14587
    // TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14588
    test_name   = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14589
    `TIME; $display("  TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14590
 
14591
 
14592
 
14593
 
14594
 
14595
 
14596
  end
14597
 
14598
 
14599
  ////////////////////////////////////////////////////////////////////
14600
  ////                                                            ////
14601
  ////  Test receive packet synchronization with receive          ////
14602
  ////  disable/enable ( 10Mbps ).                                ////
14603
  ////                                                            ////
14604
  ////////////////////////////////////////////////////////////////////
14605
  if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
14606
  begin
14607
    // TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
14608
    test_name   = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
14609
    `TIME; $display("  TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
14610
 
14611
 
14612
 
14613
 
14614
 
14615
 
14616
  end
14617
 
14618
 
14619
 
14620 209 tadejm
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
14621
 
14622
end
14623
endtask // test_mac_full_duplex_receive
14624
 
14625
 
14626 263 mohor
task test_mac_full_duplex_flow_control;
14627 209 tadejm
  input  [31:0]  start_task;
14628
  input  [31:0]  end_task;
14629
  integer        bit_start_1;
14630
  integer        bit_end_1;
14631
  integer        bit_start_2;
14632
  integer        bit_end_2;
14633
  integer        num_of_reg;
14634
  integer        num_of_frames;
14635 274 tadejm
  integer        num_of_rx_frames;
14636 209 tadejm
  integer        num_of_bd;
14637
  integer        i_addr;
14638
  integer        i_data;
14639
  integer        i_length;
14640
  integer        tmp_len;
14641
  integer        tmp_bd;
14642
  integer        tmp_bd_num;
14643
  integer        tmp_data;
14644
  integer        tmp_ipgt;
14645
  integer        test_num;
14646 274 tadejm
  integer        rx_len;
14647
  integer        tx_len;
14648 209 tadejm
  reg    [31:0]  tx_bd_num;
14649 274 tadejm
  reg    [31:0]  rx_bd_num;
14650 209 tadejm
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
14651
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
14652
  integer        i;
14653
  integer        i1;
14654
  integer        i2;
14655
  integer        i3;
14656
  integer        fail;
14657
  integer        speed;
14658 260 mohor
  integer        mac_hi_addr;
14659
  integer        mac_lo_addr;
14660 209 tadejm
  reg            frame_started;
14661
  reg            frame_ended;
14662
  reg            wait_for_frame;
14663
  reg    [31:0]  addr;
14664
  reg    [31:0]  data;
14665
  reg    [31:0]  tmp;
14666
  reg    [ 7:0]  st_data;
14667
  reg    [15:0]  max_tmp;
14668
  reg    [15:0]  min_tmp;
14669 263 mohor
  reg            PassAll;
14670
  reg            RxFlow;
14671 266 mohor
  reg            enable_irq_in_rxbd;
14672 267 mohor
  reg    [15:0]  pause_value;
14673 274 tadejm
 
14674 209 tadejm
begin
14675 263 mohor
// MAC FULL DUPLEX FLOW CONTROL TEST
14676
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
14677 209 tadejm
$display(" ");
14678 263 mohor
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
14679 209 tadejm
fail = 0;
14680
 
14681
// reset MAC registers
14682
hard_reset;
14683
// reset MAC and MII LOGIC with soft reset
14684 274 tadejm
//reset_mac;
14685
//reset_mii;
14686 209 tadejm
// set wb slave response
14687
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14688
 
14689
  /*
14690
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
14691
  -------------------------------------------------------------------------------------
14692
  set_tx_bd
14693
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
14694
  set_tx_bd_wrap
14695
    (tx_bd_num_end[6:0]);
14696
  set_tx_bd_ready
14697
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14698
  check_tx_bd
14699
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
14700
  clear_tx_bd
14701
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
14702
 
14703
  TASKS for set and control RX buffer descriptors:
14704
  ------------------------------------------------
14705
  set_rx_bd
14706
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
14707
  set_rx_bd_wrap
14708
    (rx_bd_num_end[6:0]);
14709
  set_rx_bd_empty
14710
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14711
  check_rx_bd
14712
    (rx_bd_num_end[6:0], rx_bd_status);
14713
  clear_rx_bd
14714
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
14715
 
14716
  TASKS for set and check TX packets:
14717
  -----------------------------------
14718
  set_tx_packet
14719
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
14720
  check_tx_packet
14721
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
14722
 
14723
  TASKS for set and check RX packets:
14724
  -----------------------------------
14725
  set_rx_packet
14726
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
14727
  check_rx_packet
14728
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
14729
 
14730
  TASKS for append and check CRC to/of TX packet:
14731
  -----------------------------------------------
14732
  append_tx_crc
14733
    (txpnt_wb[31:0], len[15:0], negated_crc);
14734
  check_tx_crc
14735
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
14736
 
14737
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
14738
  --------------------------------------------------------------------------------
14739
  append_rx_crc
14740
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
14741
  */
14742
 
14743
//////////////////////////////////////////////////////////////////////
14744
////                                                              ////
14745 263 mohor
////  test_mac_full_duplex_flow_control:                          ////
14746 209 tadejm
////                                                              ////
14747
////  0: Test                                                     ////
14748
////                                                              ////
14749
//////////////////////////////////////////////////////////////////////
14750 260 mohor
 
14751 209 tadejm
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
14752
begin
14753
 
14754
  ////////////////////////////////////////////////////////////////////
14755
  ////                                                            ////
14756 254 mohor
  ////  Test inserts control frames while transmitting normal     ////
14757
  ////  frames. Using 4 TX buffer decriptors ( 10Mbps ).          ////
14758 209 tadejm
  ////                                                            ////
14759
  ////////////////////////////////////////////////////////////////////
14760 254 mohor
  if (test_num == 0) // 
14761 209 tadejm
  begin
14762 254 mohor
    // TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )
14763
    test_name = "TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )";
14764
    `TIME; $display("  TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )");
14765 260 mohor
 
14766 254 mohor
    // reset MAC completely
14767
    hard_reset;
14768
    // set wb slave response
14769
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
14770
    max_tmp = 0;
14771
    min_tmp = 0;
14772
    // set 4 TX buffer descriptors - must be set before TX enable
14773
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14774
    // enable TX, set full-duplex mode, padding and CRC appending
14775
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
14776
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14777
    // enable TX flow control
14778
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14779 260 mohor
    // Set MAC address
14780
    mac_hi_addr = 32'h00000001;
14781
    mac_lo_addr = 32'h02030405;
14782
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14783
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14784 254 mohor
    // prepare two packets of MAXFL length
14785
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14786
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
14787
    min_tmp = tmp[31:16];
14788 260 mohor
    st_data = 8'h34;
14789 254 mohor
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
14790 260 mohor
    st_data = 8'h56;
14791 254 mohor
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
14792
    // check WB INT signal
14793
    if (wb_int !== 1'b0)
14794
    begin
14795
      test_fail("WB INT signal should not be set");
14796
      fail = fail + 1;
14797
    end
14798
 
14799
    // write to phy's control register for 10Mbps
14800
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
14801
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
14802
    speed = 10;
14803
 
14804
    frame_started = 0;
14805
    num_of_frames = 0;
14806
    num_of_bd = 0;
14807
    i_length = 0; // 0;
14808 260 mohor
    // Initialize one part of memory with data of control packet
14809
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
14810
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
14811
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
14812
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
14813
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
14814
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
14815
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
14816
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
14817
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
14818
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
14819
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
14820
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
14821
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
14822
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
14823
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
14824
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
14825 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14826
    // In the following section, control frame will be sent while no other transmission is in progress.//
14827
    // TXC interrupt won't be unmasked.                                                                //
14828
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14829 274 tadejm
    // check interrupts
14830 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14831
    if(data)
14832
      begin
14833
        test_fail("IRQ already pending!");
14834
        fail = fail + 1;
14835
        `TIME; $display("*E IRQ already pending!");
14836
      end
14837
    if (wb_int)
14838
    begin
14839
      test_fail("WB INT signal should not be set!");
14840
      fail = fail + 1;
14841
      `TIME; $display("*E WB INT signal should not be set!");
14842
    end
14843 260 mohor
    // first destination address on ethernet PHY
14844
    eth_phy.set_tx_mem_addr(0);
14845
    // Request sending the control frame with pause value = 0x1111
14846
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14847 274 tadejm
    // wait for transmission to come over
14848 254 mohor
    wait (MTxEn === 1'b1); // start transmit
14849
    wait (MTxEn === 1'b0); // end transmit
14850
    repeat(10) @ (posedge wb_clk);  // wait some time
14851
    repeat(10) @ (posedge mtx_clk); // wait some time
14852 274 tadejm
    // check interrupt
14853 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14854
    if(data !== `ETH_INT_TXC)
14855
      begin
14856
        test_fail("TXC IRQ should be set!");
14857
        fail = fail + 1;
14858
        `TIME; $display("*E TXC IRQ should be set!");
14859
      end
14860
    if (wb_int)
14861
    begin
14862
      test_fail("WB INT signal should not be set because TXC irq is masked!");
14863
      fail = fail + 1;
14864
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
14865
    end
14866
    // Clear TXC interrupt
14867
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14868
    if (wb_int)
14869
    begin
14870
      test_fail("WB INT signal should not be set!");
14871
      fail = fail + 1;
14872
      `TIME; $display("*E WB INT signal should not be set!");
14873
    end
14874 274 tadejm
    // check transmited TX packet
14875 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
14876
    if (tmp > 0)
14877
    begin
14878
      $display("Wrong data of the transmitted packet");
14879
      test_fail("Wrong data of the transmitted packet");
14880
      fail = fail + 1;
14881
    end
14882
    // check transmited TX packet CRC
14883
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
14884
    if (tmp > 0)
14885
    begin
14886
      $display("Wrong CRC of the transmitted packet");
14887
      test_fail("Wrong CRC of the transmitted packet");
14888
      fail = fail + 1;
14889
    end
14890 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14891
    // In the following section, control frame will be sent while no other transmission is in progress.//
14892
    // TXC interrupt is unmasked.                                                                      //
14893
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14894
    // unmask all interrupts
14895
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14896
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14897 274 tadejm
    // check interrupts
14898 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14899
    if(data)
14900
      begin
14901
        test_fail("IRQ already pending!");
14902
        fail = fail + 1;
14903
        `TIME; $display("*E IRQ already pending!");
14904
      end
14905
    if (wb_int)
14906
    begin
14907
      test_fail("WB INT signal should not be set!");
14908
      fail = fail + 1;
14909
      `TIME; $display("*E WB INT signal should not be set!");
14910
    end
14911
    // unmask only TXC interrupts
14912
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14913 260 mohor
    // first destination address on ethernet PHY
14914
    eth_phy.set_tx_mem_addr(0);
14915
    // Request sending the control frame with pause value = 0x2222
14916
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
14917
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14918 274 tadejm
    // wait for transmit to come over
14919 254 mohor
    wait (MTxEn === 1'b1); // start transmit
14920
    wait (MTxEn === 1'b0); // end transmit
14921
    repeat(10) @ (posedge wb_clk);  // wait some time
14922
    repeat(10) @ (posedge mtx_clk); // wait some time
14923 274 tadejm
    // check INT
14924 254 mohor
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14925
    if(data !== `ETH_INT_TXC)
14926
      begin
14927
        test_fail("TXC IRQ should be set!");
14928
        fail = fail + 1;
14929
        `TIME; $display("*E TXC IRQ should be set!");
14930
      end
14931
    if (!wb_int)
14932
    begin
14933
      test_fail("WB INT signal should be set!");
14934
      fail = fail + 1;
14935
      `TIME; $display("*E WB INT signal should be set!");
14936
    end
14937
    // Clear TXC interrupt
14938
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14939
    if (wb_int)
14940
    begin
14941
      test_fail("WB INT signal should not be set!");
14942
      fail = fail + 1;
14943
      `TIME; $display("*E WB INT signal should not be set!");
14944
    end
14945 274 tadejm
    // check transmited TX packet
14946 260 mohor
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
14947
    if (tmp > 0)
14948
    begin
14949
      $display("Wrong data of the transmitted packet");
14950
      test_fail("Wrong data of the transmitted packet");
14951
      fail = fail + 1;
14952
    end
14953
    // check transmited TX packet CRC
14954
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
14955
    if (tmp > 0)
14956
    begin
14957
      $display("Wrong CRC of the transmitted packet");
14958
      test_fail("Wrong CRC of the transmitted packet");
14959
      fail = fail + 1;
14960
    end
14961 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14962 260 mohor
    // In the following section, control frame sending is requested while no other transmission        //
14963
    // is in progress. TXC interrupt is unmasked.                                                      //
14964 254 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14965
    // unmask all interrupts
14966
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
14967
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14968
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14969
    if(data)
14970
      begin
14971
        test_fail("IRQ already pending!");
14972
        fail = fail + 1;
14973
        `TIME; $display("*E IRQ already pending!");
14974
      end
14975
    if (wb_int)
14976
    begin
14977
      test_fail("WB INT signal should not be set!");
14978
      fail = fail + 1;
14979
      `TIME; $display("*E WB INT signal should not be set!");
14980
    end
14981 260 mohor
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14982
    // In the following section, control frame request and data send request are both set. At the      //
14983
    // beginning control frame request will be faster than data send request, later the opposite.      //
14984
    /////////////////////////////////////////////////////////////////////////////////////////////////////
14985
    for (i=0; i<32; i=i+1)
14986
    begin
14987
      // Request sending the control frame with pause value = 0x5678
14988
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
14989
      set_tx_bd_wrap(0);
14990
      // first destination address on ethernet PHY
14991
      eth_phy.set_tx_mem_addr(0);
14992
      set_tx_bd_ready(0, 0);
14993 274 tadejm
      // wait for transmission to start  
14994 260 mohor
      wait (MTxEn === 1'b1); // start transmit
14995
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
14996
      // Send control frame request
14997
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
14998
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
14999 274 tadejm
      // wait until transmission is over  
15000 260 mohor
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15001
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15002
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15003
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15004
      // first destination address on ethernet PHY
15005
      eth_phy.set_tx_mem_addr(0);
15006 274 tadejm
      // check interrupt depending on which packet was sent
15007 260 mohor
      if(tmp_len == 64)  // Control frame
15008 254 mohor
      begin
15009 260 mohor
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15010
        if(data !== `ETH_INT_TXC)
15011
        begin
15012
          test_fail("TXC IRQ should be set!");
15013
          fail = fail + 1;
15014
          `TIME; $display("*E TXC IRQ should be set!");
15015
          `TIME; $display("ETH_INT = 0x%0x", data);
15016
        end
15017
      end
15018
      else
15019
      begin
15020
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15021
        if(data !== `ETH_INT_TXB)
15022
        begin
15023
          test_fail("TXB IRQ should be set!");
15024
          fail = fail + 1;
15025
          `TIME; $display("*E TXB IRQ should be set!");
15026
          `TIME; $display("ETH_INT = 0x%0x", data);
15027
        end
15028
      end
15029 274 tadejm
      // check transmited TX packet
15030 260 mohor
      if(tmp_len == 64)  // Control frame
15031
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15032
      else
15033
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15034
      if (tmp > 0)
15035
      begin
15036
        $display("Wrong data of the transmitted packet");
15037
        test_fail("Wrong data of the transmitted packet");
15038 254 mohor
        fail = fail + 1;
15039
      end
15040 260 mohor
      // check transmited TX packet CRC
15041
      if(tmp_len == 64)  // Control frame
15042
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15043
      else
15044
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15045
 
15046
      if (tmp > 0)
15047 254 mohor
      begin
15048 260 mohor
        $display("Wrong CRC of the transmitted packet");
15049
        test_fail("Wrong CRC of the transmitted packet");
15050
        fail = fail + 1;
15051
      end
15052 274 tadejm
      // wait for control frame to transmit
15053 260 mohor
      wait (MTxEn === 1'b1); // start transmit of the control frame
15054
      wait (MTxEn === 1'b0); // end transmit of the control frame
15055
      repeat(10) @ (posedge wb_clk);  // wait some time
15056
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15057 274 tadejm
      // check interrupts  
15058 260 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15059
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15060
      begin
15061 254 mohor
        test_fail("TXC and TXB IRQ should be set!");
15062
        fail = fail + 1;
15063 260 mohor
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15064 254 mohor
      end
15065 260 mohor
      if (!wb_int)
15066
      begin
15067
        test_fail("WB INT signal should be set!");
15068
        fail = fail + 1;
15069
        `TIME; $display("*E WB INT signal should be set!");
15070
      end
15071
      // Clear TXC and TXB interrupt
15072
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15073
      if (wb_int)
15074
      begin
15075
        test_fail("WB INT signal should not be set!");
15076
        fail = fail + 1;
15077
        `TIME; $display("*E WB INT signal should not be set!");
15078
      end
15079
      if(tmp_len == 64)  // Control frame
15080
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15081
      else
15082
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15083
      if (tmp > 0)
15084
      begin
15085
        $display("Wrong data of the transmitted packet");
15086
        test_fail("Wrong data of the transmitted packet");
15087
        fail = fail + 1;
15088
      end
15089
      // check transmited TX packet CRC
15090
      if(tmp_len == 64)  // Control frame
15091
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15092
      else
15093
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15094
      if (tmp > 0)
15095
      begin
15096
        $display("Wrong CRC of the transmitted packet");
15097
        test_fail("Wrong CRC of the transmitted packet");
15098
        fail = fail + 1;
15099
      end
15100
    end // for loop
15101
    if(fail == 0)
15102
      test_ok;
15103
    else
15104
      fail = 0;
15105
  end
15106 254 mohor
 
15107
 
15108 274 tadejm
  ////////////////////////////////////////////////////////////////////
15109
  ////                                                            ////
15110
  ////  Test inserts control frames while transmitting normal     ////
15111
  ////  frames. Using 4 TX buffer decriptors ( 100Mbps ).         ////
15112
  ////                                                            ////
15113
  ////////////////////////////////////////////////////////////////////
15114 263 mohor
  if (test_num == 1) // 
15115
  begin
15116
    // TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
15117
    test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
15118
    `TIME; $display("  TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
15119 274 tadejm
 
15120
    // reset MAC completely
15121
    hard_reset;
15122
    // set wb slave response
15123
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
15124
    max_tmp = 0;
15125
    min_tmp = 0;
15126
    // set 4 TX buffer descriptors - must be set before TX enable
15127
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15128
    // enable TX, set full-duplex mode, padding and CRC appending
15129
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
15130
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15131
    // enable TX flow control
15132
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15133
    // Set MAC address
15134
    mac_hi_addr = 32'h00000001;
15135
    mac_lo_addr = 32'h02030405;
15136
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15137
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15138
    // prepare two packets of MAXFL length
15139
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15140
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
15141
    min_tmp = tmp[31:16];
15142
    st_data = 8'h34;
15143
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15144
    st_data = 8'h56;
15145
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
15146
    // check WB INT signal
15147
    if (wb_int !== 1'b0)
15148
    begin
15149
      test_fail("WB INT signal should not be set");
15150
      fail = fail + 1;
15151
    end
15152
 
15153
    // write to phy's control register for 100Mbps
15154
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
15155
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
15156
    speed = 100;
15157
 
15158
    frame_started = 0;
15159
    num_of_frames = 0;
15160
    num_of_bd = 0;
15161
    i_length = 0; // 0;
15162
    // Initialize one part of memory with data of control packet
15163
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
15164
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
15165
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
15166
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
15167
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
15168
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
15169
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
15170
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
15171
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
15172
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
15173
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
15174
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
15175
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
15176
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
15177
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
15178
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
15179
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15180
    // In the following section, control frame will be sent while no other transmission is in progress.//
15181
    // TXC interrupt won't be unmasked.                                                                //
15182
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15183
    // check interrupts
15184
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15185
    if(data)
15186
      begin
15187
        test_fail("IRQ already pending!");
15188
        fail = fail + 1;
15189
        `TIME; $display("*E IRQ already pending!");
15190
      end
15191
    if (wb_int)
15192
    begin
15193
      test_fail("WB INT signal should not be set!");
15194
      fail = fail + 1;
15195
      `TIME; $display("*E WB INT signal should not be set!");
15196
    end
15197
    // first destination address on ethernet PHY
15198
    eth_phy.set_tx_mem_addr(0);
15199
    // Request sending the control frame with pause value = 0x1111
15200
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15201
    // wait for transmission to come over
15202
    wait (MTxEn === 1'b1); // start transmit
15203
    wait (MTxEn === 1'b0); // end transmit
15204
    repeat(10) @ (posedge wb_clk);  // wait some time
15205
    repeat(10) @ (posedge mtx_clk); // wait some time
15206
    // check interrupt
15207
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15208
    if(data !== `ETH_INT_TXC)
15209
      begin
15210
        test_fail("TXC IRQ should be set!");
15211
        fail = fail + 1;
15212
        `TIME; $display("*E TXC IRQ should be set!");
15213
      end
15214
    if (wb_int)
15215
    begin
15216
      test_fail("WB INT signal should not be set because TXC irq is masked!");
15217
      fail = fail + 1;
15218
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
15219
    end
15220
    // Clear TXC interrupt
15221
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15222
    if (wb_int)
15223
    begin
15224
      test_fail("WB INT signal should not be set!");
15225
      fail = fail + 1;
15226
      `TIME; $display("*E WB INT signal should not be set!");
15227
    end
15228
    // check transmited TX packet
15229
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15230
    if (tmp > 0)
15231
    begin
15232
      $display("Wrong data of the transmitted packet");
15233
      test_fail("Wrong data of the transmitted packet");
15234
      fail = fail + 1;
15235
    end
15236
    // check transmited TX packet CRC
15237
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15238
    if (tmp > 0)
15239
    begin
15240
      $display("Wrong CRC of the transmitted packet");
15241
      test_fail("Wrong CRC of the transmitted packet");
15242
      fail = fail + 1;
15243
    end
15244
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15245
    // In the following section, control frame will be sent while no other transmission is in progress.//
15246
    // TXC interrupt is unmasked.                                                                      //
15247
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15248
    // unmask all interrupts
15249
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15250
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15251
    // check interrupts
15252
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15253
    if(data)
15254
      begin
15255
        test_fail("IRQ already pending!");
15256
        fail = fail + 1;
15257
        `TIME; $display("*E IRQ already pending!");
15258
      end
15259
    if (wb_int)
15260
    begin
15261
      test_fail("WB INT signal should not be set!");
15262
      fail = fail + 1;
15263
      `TIME; $display("*E WB INT signal should not be set!");
15264
    end
15265
    // unmask only TXC interrupts
15266
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15267
    // first destination address on ethernet PHY
15268
    eth_phy.set_tx_mem_addr(0);
15269
    // Request sending the control frame with pause value = 0x2222
15270
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
15271
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15272
    // wait for transmit to come over
15273
    wait (MTxEn === 1'b1); // start transmit
15274
    wait (MTxEn === 1'b0); // end transmit
15275
    repeat(10) @ (posedge wb_clk);  // wait some time
15276
    repeat(10) @ (posedge mtx_clk); // wait some time
15277
    // check INT
15278
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15279
    if(data !== `ETH_INT_TXC)
15280
      begin
15281
        test_fail("TXC IRQ should be set!");
15282
        fail = fail + 1;
15283
        `TIME; $display("*E TXC IRQ should be set!");
15284
      end
15285
    if (!wb_int)
15286
    begin
15287
      test_fail("WB INT signal should be set!");
15288
      fail = fail + 1;
15289
      `TIME; $display("*E WB INT signal should be set!");
15290
    end
15291
    // Clear TXC interrupt
15292
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15293
    if (wb_int)
15294
    begin
15295
      test_fail("WB INT signal should not be set!");
15296
      fail = fail + 1;
15297
      `TIME; $display("*E WB INT signal should not be set!");
15298
    end
15299
    // check transmited TX packet
15300
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15301
    if (tmp > 0)
15302
    begin
15303
      $display("Wrong data of the transmitted packet");
15304
      test_fail("Wrong data of the transmitted packet");
15305
      fail = fail + 1;
15306
    end
15307
    // check transmited TX packet CRC
15308
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15309
    if (tmp > 0)
15310
    begin
15311
      $display("Wrong CRC of the transmitted packet");
15312
      test_fail("Wrong CRC of the transmitted packet");
15313
      fail = fail + 1;
15314
    end
15315
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15316
    // In the following section, control frame sending is requested while no other transmission        //
15317
    // is in progress. TXC interrupt is unmasked.                                                      //
15318
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15319
    // unmask all interrupts
15320
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15321
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15322
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15323
    if(data)
15324
      begin
15325
        test_fail("IRQ already pending!");
15326
        fail = fail + 1;
15327
        `TIME; $display("*E IRQ already pending!");
15328
      end
15329
    if (wb_int)
15330
    begin
15331
      test_fail("WB INT signal should not be set!");
15332
      fail = fail + 1;
15333
      `TIME; $display("*E WB INT signal should not be set!");
15334
    end
15335
 
15336
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15337
    // In the following section, control frame request and data send request are both set. At the      //
15338
    // beginning control frame request will be faster than data send request, later the opposite.      //
15339
    /////////////////////////////////////////////////////////////////////////////////////////////////////
15340
    for (i=0; i<32; i=i+1)
15341
    begin
15342
      // Request sending the control frame with pause value = 0x5678
15343
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
15344
      set_tx_bd_wrap(0);
15345
      // first destination address on ethernet PHY
15346
      eth_phy.set_tx_mem_addr(0);
15347
      set_tx_bd_ready(0, 0);
15348
      // wait for transmission to start  
15349
      wait (MTxEn === 1'b1); // start transmit
15350
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
15351
      // Send control frame request
15352
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
15353
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15354
      // wait until transmission is over  
15355
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
15356
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15357
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
15358
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
15359
      // first destination address on ethernet PHY
15360
      eth_phy.set_tx_mem_addr(0);
15361
      // check interrupt depending on which packet was sent
15362
 
15363
      if(tmp_len == 64)  // Control frame
15364
      begin
15365
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15366
        if(data !== `ETH_INT_TXC)
15367
        begin
15368
          test_fail("TXC IRQ should be set!");
15369
          fail = fail + 1;
15370
          `TIME; $display("*E TXC IRQ should be set!");
15371
          `TIME; $display("ETH_INT = 0x%0x", data);
15372
        end
15373
      end
15374
      else
15375
      begin
15376
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15377
        if(data !== `ETH_INT_TXB)
15378
        begin
15379
          test_fail("TXB IRQ should be set!");
15380
          fail = fail + 1;
15381
          `TIME; $display("*E TXB IRQ should be set!");
15382
          `TIME; $display("ETH_INT = 0x%0x", data);
15383
        end
15384
      end
15385
      // check transmited TX packet
15386
      if(tmp_len == 64)  // Control frame
15387
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15388
      else
15389
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15390
      if (tmp > 0)
15391
      begin
15392
        $display("Wrong data of the transmitted packet");
15393
        test_fail("Wrong data of the transmitted packet");
15394
        fail = fail + 1;
15395
      end
15396
      // check transmited TX packet CRC
15397
      if(tmp_len == 64)  // Control frame
15398
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15399
      else
15400
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15401
 
15402
      if (tmp > 0)
15403
      begin
15404
        $display("Wrong CRC of the transmitted packet");
15405
        test_fail("Wrong CRC of the transmitted packet");
15406
        fail = fail + 1;
15407
      end
15408
      // wait for control frame to transmit
15409
      wait (MTxEn === 1'b1); // start transmit of the control frame
15410
      wait (MTxEn === 1'b0); // end transmit of the control frame
15411
      repeat(10) @ (posedge wb_clk);  // wait some time
15412
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
15413
      // check interrupts  
15414
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15415
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
15416
      begin
15417
        test_fail("TXC and TXB IRQ should be set!");
15418
        fail = fail + 1;
15419
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
15420
      end
15421
      if (!wb_int)
15422
      begin
15423
        test_fail("WB INT signal should be set!");
15424
        fail = fail + 1;
15425
        `TIME; $display("*E WB INT signal should be set!");
15426
      end
15427
      // Clear TXC and TXB interrupt
15428
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15429
      if (wb_int)
15430
      begin
15431
        test_fail("WB INT signal should not be set!");
15432
        fail = fail + 1;
15433
        `TIME; $display("*E WB INT signal should not be set!");
15434
      end
15435
      if(tmp_len == 64)  // Control frame
15436
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
15437
      else
15438
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
15439
      if (tmp > 0)
15440
      begin
15441
        $display("Wrong data of the transmitted packet");
15442
        test_fail("Wrong data of the transmitted packet");
15443
        fail = fail + 1;
15444
      end
15445
      // check transmited TX packet CRC
15446
      if(tmp_len == 64)  // Control frame
15447
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
15448
      else
15449
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
15450
      if (tmp > 0)
15451
      begin
15452
        $display("Wrong CRC of the transmitted packet");
15453
        test_fail("Wrong CRC of the transmitted packet");
15454
        fail = fail + 1;
15455
      end
15456
    end // for loop
15457
    if(fail == 0)
15458
      test_ok;
15459
    else
15460
      fail = 0;
15461 263 mohor
  end
15462 254 mohor
 
15463 274 tadejm
 
15464 260 mohor
  ////////////////////////////////////////////////////////////////////
15465
  ////                                                            ////
15466 267 mohor
  ////  Receive control frames with PASSALL option turned on and  ////
15467
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
15468 260 mohor
  ////                                                            ////
15469
  ////////////////////////////////////////////////////////////////////
15470 263 mohor
  if (test_num == 2) // 
15471 260 mohor
  begin
15472 267 mohor
    // TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
15473
    test_name   = "TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )";
15474
    `TIME; $display("  TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )");
15475 254 mohor
 
15476 260 mohor
    // unmask interrupts
15477
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15478
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15479
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
15480
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15481
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
15482 267 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
15483 260 mohor
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15484
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15485 263 mohor
    // enable RX_FLOW control
15486
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15487 260 mohor
    // prepare one packet of 100 bytes long
15488 267 mohor
//    st_data = 8'h1A;
15489
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
15490
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
15491
    st_data = 8'h01;
15492
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
15493
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
15494
    set_tx_bd_wrap(0);
15495 260 mohor
    // check WB INT signal
15496
    if (wb_int !== 1'b0)
15497
    begin
15498
      test_fail("WB INT signal should not be set");
15499
      fail = fail + 1;
15500
    end
15501 274 tadejm
 
15502 260 mohor
    // write to phy's control register for 10Mbps
15503
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
15504
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
15505
    speed = 10;
15506 254 mohor
 
15507 266 mohor
    // RXB and RXC interrupts masked
15508
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
15509
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15510
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
15511
    for (i=0; i<3; i=i+1)
15512
    begin
15513 274 tadejm
      pause_value = i+2;
15514 267 mohor
      set_rx_control_packet(0, pause_value);  // CRC already appended
15515 266 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15516
      case (i)
15517
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
15518
      begin
15519
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
15520
        // enable interrupt generation
15521
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15522
        // Set PASSALL = 0 and RXFLOW = 0
15523
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15524
      end
15525
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
15526
      begin
15527
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
15528
        // enable interrupt generation
15529
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15530
        // Set PASSALL = 0 and RXFLOW = 0
15531
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15532
      end
15533
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
15534
      begin
15535
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
15536
        // enable interrupt generation
15537
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
15538
        // Set PASSALL = 0 and RXFLOW = 0
15539
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15540
      end
15541
      default:
15542
      begin
15543
        $display("*E We should never get here !!!");
15544
        test_fail("We should never get here !!!");
15545
        fail = fail + 1;
15546
      end
15547
      endcase
15548
      // not detect carrier sense in FD and no collision
15549
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15550
      eth_phy.collision(0);
15551
      // set wrap bit and empty bit
15552
      set_rx_bd_wrap(127);
15553
      set_rx_bd_empty(127, 127);
15554 274 tadejm
      // transmit
15555 266 mohor
      fork
15556
        begin
15557
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15558
          repeat(10) @(posedge mrx_clk);
15559
        end
15560
        begin
15561
          wait (MRxDV === 1'b1); // start transmit
15562
          #1 check_rx_bd(127, data);
15563
          if (data[15] !== 1)
15564
          begin
15565
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15566
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15567
            fail = fail + 1;
15568
          end
15569 267 mohor
          wait (MRxDV === 1'b0); // received pause frame
15570
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
15571
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
15572
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
15573
                                 // and RxFlow enabled.
15574
          // When we exit the while loop, status frame is received
15575
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
15576
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
15577 266 mohor
        end
15578
      join
15579
      #1 check_rx_bd(127, data);
15580
      // Checking buffer descriptor
15581
      if(PassAll)
15582
      begin
15583
        if(enable_irq_in_rxbd)
15584
        begin
15585
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15586
          begin
15587
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15588
            $display("RxBD = 0x%0x", data);
15589
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15590
            fail = fail + 1;
15591
          end
15592
        end
15593
        else
15594
        begin
15595
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
15596
          begin
15597
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15598
            $display("RxBD = 0x%0x", data);
15599
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15600
            fail = fail + 1;
15601
          end
15602
        end
15603
      end
15604
      else
15605
      begin
15606
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
15607
        begin
15608
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15609
          $display("RxBD = 0x%0x", data);
15610
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15611
          fail = fail + 1;
15612
        end
15613
      end
15614
      // Checking if interrupt was generated
15615
      if (wb_int)
15616
      begin
15617
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
15618
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
15619
        fail = fail + 1;
15620
      end
15621
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15622
      if(RxFlow)
15623
      begin
15624
        if(data !== (`ETH_INT_RXC))
15625
        begin
15626
          test_fail("RXC is not set or multiple IRQs active!");
15627
          fail = fail + 1;
15628
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15629
        end
15630
        // Clear RXC interrupt
15631
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
15632
      end
15633
      else if(enable_irq_in_rxbd)
15634
      begin
15635
        if(data !== (`ETH_INT_RXB))
15636
        begin
15637
          test_fail("RXB is not set or multiple IRQs active!");
15638
          fail = fail + 1;
15639
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15640
        end
15641
        // Clear RXC interrupt
15642
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
15643
      end
15644
      else
15645
      begin
15646
        if(data !== 0)
15647
        begin
15648
          test_fail("Some IRQs is active!");
15649
          fail = fail + 1;
15650
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
15651
        end
15652
      end
15653 267 mohor
      if(RxFlow)
15654
        begin
15655
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
15656
            begin
15657
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
15658
              test_fail("Transmission should not be started because pause frame was received.");
15659
              fail = fail + 1;
15660
            end
15661
          while(pause_value)
15662
            begin
15663
              pause_value=pause_value-1;
15664
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
15665
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
15666
                begin
15667
                  `TIME; $display("*E Transmission should be started because pause passed.");
15668
                  test_fail("Transmission should be started because pause passed.");
15669
                  fail = fail + 1;
15670
                end
15671
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
15672
                begin
15673
                  `TIME; $display("*E Transmission should still be paused.");
15674
                  test_fail("Transmission should still be paused.");
15675
                  fail = fail + 1;
15676
                end
15677
            end
15678
        end
15679
      else
15680
        begin
15681
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
15682
            begin
15683
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
15684
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
15685
              fail = fail + 1;
15686
            end
15687
        end
15688
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
15689
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15690
      if(data !== (`ETH_INT_TXB))
15691
        begin
15692
          test_fail("TXB is not set or multiple IRQs active!");
15693
          fail = fail + 1;
15694
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15695
        end
15696
        // Clear TXB interrupt
15697
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
15698 266 mohor
    end
15699
    // End: Test is irq is set while RXB and RXC interrupts are masked.
15700
 
15701
    // Now all interrupts are unmasked. Performing tests again.
15702 263 mohor
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15703
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15704 260 mohor
    for (i=0; i<4; i=i+1)
15705 254 mohor
    begin
15706 267 mohor
      pause_value = i+1;
15707
      set_rx_control_packet(0, pause_value);  // CRC already appended
15708 260 mohor
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15709
      case (i)
15710 263 mohor
      0: // PASSALL = 0, RXFLOW = 0
15711 254 mohor
      begin
15712 263 mohor
        PassAll=0; RxFlow=0;
15713 260 mohor
        // enable interrupt generation
15714 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15715
        // Set PASSALL = 0 and RXFLOW = 0
15716
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15717 254 mohor
      end
15718 263 mohor
      1: // PASSALL = 0, RXFLOW = 1
15719 254 mohor
      begin
15720 263 mohor
        PassAll=0; RxFlow=1;
15721 260 mohor
        // enable interrupt generation
15722 263 mohor
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15723
        // Set PASSALL = 0 and RXFLOW = 0
15724
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15725 254 mohor
      end
15726 263 mohor
      2: // PASSALL = 1, RXFLOW = 0
15727 254 mohor
      begin
15728 263 mohor
        PassAll=1; RxFlow=0;
15729
        // enable interrupt generation
15730
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15731
        // Set PASSALL = 0 and RXFLOW = 0
15732
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15733 254 mohor
      end
15734 263 mohor
      default: // 3: PASSALL = 1, RXFLOW = 1
15735 254 mohor
      begin
15736 263 mohor
        PassAll=1; RxFlow=1;
15737
        // enable interrupt generation
15738
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15739
        // Set PASSALL = 1 and RXFLOW = 1
15740
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15741 254 mohor
      end
15742
      endcase
15743 263 mohor
      // not detect carrier sense in FD and no collision
15744
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15745
      eth_phy.collision(0);
15746
      // set wrap bit and empty bit
15747 260 mohor
      set_rx_bd_wrap(127);
15748
      set_rx_bd_empty(127, 127);
15749 274 tadejm
      // transmit
15750 260 mohor
      fork
15751 254 mohor
        begin
15752 260 mohor
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15753
          repeat(10) @(posedge mrx_clk);
15754 254 mohor
        end
15755
        begin
15756 260 mohor
          #1 check_rx_bd(127, data);
15757
          wait (MRxDV === 1'b1); // start transmit
15758 263 mohor
          #1 check_rx_bd(127, data);
15759 260 mohor
          if (data[15] !== 1)
15760
          begin
15761 263 mohor
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15762 260 mohor
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15763
            fail = fail + 1;
15764
          end
15765
          wait (MRxDV === 1'b0); // end transmit
15766 263 mohor
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
15767
          repeat (100) @(posedge wb_clk); // status/irq is written.
15768 267 mohor
 
15769
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
15770
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
15771 254 mohor
        end
15772 260 mohor
      join
15773 263 mohor
      #1 check_rx_bd(127, data);
15774
      // Checking buffer descriptor
15775
      if(PassAll)
15776 254 mohor
      begin
15777 263 mohor
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15778
        begin
15779
          $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15780
          $display("RxBD = 0x%0x", data);
15781
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15782
          fail = fail + 1;
15783
        end
15784 254 mohor
      end
15785 260 mohor
      else
15786 254 mohor
      begin
15787 263 mohor
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
15788
        begin
15789
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15790
          $display("RxBD = 0x%0x", data);
15791
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
15792
          fail = fail + 1;
15793
        end
15794 254 mohor
      end
15795 263 mohor
      // Checking if interrupt was generated
15796
      if(RxFlow || PassAll)
15797 254 mohor
      begin
15798 263 mohor
        if (!wb_int)
15799 254 mohor
        begin
15800
          `TIME; $display("*E WB INT signal should be set");
15801
          test_fail("WB INT signal should be set");
15802
          fail = fail + 1;
15803
        end
15804
      end
15805
      else
15806
      begin
15807 263 mohor
        if (wb_int)
15808 254 mohor
        begin
15809
          `TIME; $display("*E WB INT signal should not be set");
15810
          test_fail("WB INT signal should not be set");
15811
          fail = fail + 1;
15812
        end
15813
      end
15814 274 tadejm
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15815
      if(RxFlow)
15816
      begin
15817
        if(data !== (`ETH_INT_RXC))
15818
        begin
15819
          test_fail("RXC is not set or multiple IRQs active!");
15820
          fail = fail + 1;
15821
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15822
        end
15823
        // Clear RXC interrupt
15824
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
15825
      end
15826
      else if(PassAll)
15827
      begin
15828
        if(data !== (`ETH_INT_RXB))
15829
        begin
15830
          test_fail("RXB is not set or multiple IRQs active!");
15831
          fail = fail + 1;
15832
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
15833
        end
15834
        // Clear RXB interrupt
15835
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
15836
      end
15837
      else
15838
      begin
15839
        if(data !== 0)
15840
        begin
15841
          test_fail("No interrupt should be set!");
15842
          fail = fail + 1;
15843
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
15844
        end
15845
      end
15846
    end
15847
    // disable RX
15848
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
15849
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15850
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15851
    if(fail == 0)
15852
      test_ok;
15853
    else
15854
      fail = 0;
15855
  end
15856 263 mohor
 
15857 274 tadejm
 
15858
  ////////////////////////////////////////////////////////////////////
15859
  ////                                                            ////
15860
  ////  Receive control frames with PASSALL option turned on and  ////
15861
  ////  off. Using only one RX buffer decriptor ( 100Mbps ).      ////
15862
  ////                                                            ////
15863
  ////////////////////////////////////////////////////////////////////
15864
  if (test_num == 3) // 
15865
  begin
15866
    // TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )
15867
    test_name   = "TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )";
15868
    `TIME; $display("  TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )");
15869
 
15870
    // unmask interrupts
15871
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
15872
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15873
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
15874
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15875
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
15876
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
15877
              `ETH_MODER_PRO | `ETH_MODER_BRO,
15878
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15879
    // enable RX_FLOW control
15880
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15881
    // prepare one packet of 100 bytes long
15882
//    st_data = 8'h1A;
15883
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
15884
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
15885
    st_data = 8'h01;
15886
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
15887
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
15888
    set_tx_bd_wrap(0);
15889
    // check WB INT signal
15890
    if (wb_int !== 1'b0)
15891
    begin
15892
      test_fail("WB INT signal should not be set");
15893
      fail = fail + 1;
15894
    end
15895
 
15896
    // write to phy's control register for 100Mbps
15897
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
15898
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
15899
    speed = 100;
15900
 
15901
    // RXB and RXC interrupts masked
15902
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
15903
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15904
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
15905
    for (i=0; i<3; i=i+1)
15906
    begin
15907
      pause_value = i+2;
15908
      set_rx_control_packet(0, pause_value);  // CRC already appended
15909
      // choose generating carrier sense and collision for first and last 64 lengths of frames
15910
      case (i)
15911
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
15912
      begin
15913
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
15914
        // enable interrupt generation
15915
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15916
        // Set PASSALL = 0 and RXFLOW = 0
15917
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15918
      end
15919
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
15920
      begin
15921
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
15922
        // enable interrupt generation
15923
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
15924
        // Set PASSALL = 0 and RXFLOW = 0
15925
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15926
      end
15927
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
15928
      begin
15929
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
15930
        // enable interrupt generation
15931
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
15932
        // Set PASSALL = 0 and RXFLOW = 0
15933
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
15934
      end
15935
      default:
15936
      begin
15937
        `TIME; $display("*E We should never get here !!!");
15938
        test_fail("We should never get here !!!");
15939
        fail = fail + 1;
15940
      end
15941
      endcase
15942
      // not detect carrier sense in FD and no collision
15943
      eth_phy.no_carrier_sense_rx_fd_detect(0);
15944
      eth_phy.collision(0);
15945
      // set wrap bit and empty bit
15946
      set_rx_bd_wrap(127);
15947
      set_rx_bd_empty(127, 127);
15948
      // transmit
15949
      fork
15950
        begin
15951
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
15952
          repeat(10) @(posedge mrx_clk);
15953
        end
15954
        begin
15955
          wait (MRxDV === 1'b1); // start transmit
15956
          #1 check_rx_bd(127, data);
15957
          if (data[15] !== 1)
15958
          begin
15959
            `TIME; $display("*E Wrong buffer descriptor's ready bit read out from MAC");
15960
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
15961
            fail = fail + 1;
15962
          end
15963
          wait (MRxDV === 1'b0); // received pause frame
15964
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
15965
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
15966
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
15967
                                 // and RxFlow enabled.
15968
          // When we exit the while loop, status frame is received
15969
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
15970
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
15971
        end
15972
      join
15973
      #1 check_rx_bd(127, data);
15974
      // Checking buffer descriptor
15975
      if(PassAll)
15976
      begin
15977
        if(enable_irq_in_rxbd)
15978
        begin
15979
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
15980
          begin
15981
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15982
            $display("RxBD = 0x%0x", data);
15983
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15984
            fail = fail + 1;
15985
          end
15986
        end
15987
        else
15988
        begin
15989
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
15990
          begin
15991
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15992
            $display("RxBD = 0x%0x", data);
15993
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
15994
            fail = fail + 1;
15995
          end
15996
        end
15997
      end
15998
      else
15999
      begin
16000
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16001
        begin
16002
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16003
          $display("RxBD = 0x%0x", data);
16004
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16005
          fail = fail + 1;
16006
        end
16007
      end
16008
      // Checking if interrupt was generated
16009
      if (wb_int)
16010
      begin
16011
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
16012
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
16013
        fail = fail + 1;
16014
      end
16015 263 mohor
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16016
      if(RxFlow)
16017 254 mohor
      begin
16018 263 mohor
        if(data !== (`ETH_INT_RXC))
16019 254 mohor
        begin
16020 263 mohor
          test_fail("RXC is not set or multiple IRQs active!");
16021 260 mohor
          fail = fail + 1;
16022 263 mohor
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16023 254 mohor
        end
16024 263 mohor
        // Clear RXC interrupt
16025
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16026 254 mohor
      end
16027 274 tadejm
      else if(enable_irq_in_rxbd)
16028
      begin
16029
        if(data !== (`ETH_INT_RXB))
16030
        begin
16031
          test_fail("RXB is not set or multiple IRQs active!");
16032
          fail = fail + 1;
16033
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16034
        end
16035
        // Clear RXC interrupt
16036
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16037
      end
16038
      else
16039
      begin
16040
        if(data !== 0)
16041
        begin
16042
          test_fail("Some IRQs is active!");
16043
          fail = fail + 1;
16044
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
16045
        end
16046
      end
16047
      if(RxFlow)
16048
        begin
16049
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
16050
            begin
16051
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
16052
              test_fail("Transmission should not be started because pause frame was received.");
16053
              fail = fail + 1;
16054
            end
16055
          while(pause_value)
16056
            begin
16057
              pause_value=pause_value-1;
16058
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
16059
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
16060
                begin
16061
                  `TIME; $display("*E Transmission should be started because pause passed.");
16062
                  test_fail("Transmission should be started because pause passed.");
16063
                  fail = fail + 1;
16064
                end
16065
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
16066
                begin
16067
                  `TIME; $display("*E Transmission should still be paused.");
16068
                  test_fail("Transmission should still be paused.");
16069
                  fail = fail + 1;
16070
                end
16071
            end
16072
        end
16073
      else
16074
        begin
16075
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
16076
            begin
16077
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
16078
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
16079
              fail = fail + 1;
16080
            end
16081
        end
16082
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
16083
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16084
      if(data !== (`ETH_INT_TXB))
16085
        begin
16086
          test_fail("TXB is not set or multiple IRQs active!");
16087
          fail = fail + 1;
16088
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16089
        end
16090
        // Clear TXB interrupt
16091
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
16092
    end
16093
    // End: Test is irq is set while RXB and RXC interrupts are masked.
16094
 
16095
    // Now all interrupts are unmasked. Performing tests again.
16096
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16097
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16098
    for (i=0; i<4; i=i+1)
16099
    begin
16100
      pause_value = i+1;
16101
      set_rx_control_packet(0, pause_value);  // CRC already appended
16102
      // choose generating carrier sense and collision for first and last 64 lengths of frames
16103
      case (i)
16104
      0: // PASSALL = 0, RXFLOW = 0
16105
      begin
16106
        PassAll=0; RxFlow=0;
16107
        // enable interrupt generation
16108
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16109
        // Set PASSALL = 0 and RXFLOW = 0
16110
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16111
      end
16112
      1: // PASSALL = 0, RXFLOW = 1
16113
      begin
16114
        PassAll=0; RxFlow=1;
16115
        // enable interrupt generation
16116
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16117
        // Set PASSALL = 0 and RXFLOW = 0
16118
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16119
      end
16120
      2: // PASSALL = 1, RXFLOW = 0
16121
      begin
16122
        PassAll=1; RxFlow=0;
16123
        // enable interrupt generation
16124
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16125
        // Set PASSALL = 0 and RXFLOW = 0
16126
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16127
      end
16128
      default: // 3: PASSALL = 1, RXFLOW = 1
16129
      begin
16130
        PassAll=1; RxFlow=1;
16131
        // enable interrupt generation
16132
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
16133
        // Set PASSALL = 1 and RXFLOW = 1
16134
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16135
      end
16136
      endcase
16137
      // not detect carrier sense in FD and no collision
16138
      eth_phy.no_carrier_sense_rx_fd_detect(0);
16139
      eth_phy.collision(0);
16140
      // set wrap bit and empty bit
16141
      set_rx_bd_wrap(127);
16142
      set_rx_bd_empty(127, 127);
16143
      // transmit
16144
      fork
16145
        begin
16146
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
16147
          repeat(10) @(posedge mrx_clk);
16148
        end
16149
        begin
16150
          #1 check_rx_bd(127, data);
16151
          wait (MRxDV === 1'b1); // start transmit
16152
          #1 check_rx_bd(127, data);
16153
          if (data[15] !== 1)
16154
          begin
16155
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
16156
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16157
            fail = fail + 1;
16158
          end
16159
          wait (MRxDV === 1'b0); // end transmit
16160
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
16161
          repeat (100) @(posedge wb_clk); // status/irq is written.
16162
 
16163
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
16164
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
16165
        end
16166
      join
16167
      #1 check_rx_bd(127, data);
16168
      // Checking buffer descriptor
16169
      if(PassAll)
16170
      begin
16171
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
16172
        begin
16173
          `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16174
          $display("RxBD = 0x%0x", data);
16175
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
16176
          fail = fail + 1;
16177
        end
16178
      end
16179
      else
16180
      begin
16181
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
16182
        begin
16183
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16184
          $display("RxBD = 0x%0x", data);
16185
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
16186
          fail = fail + 1;
16187
        end
16188
      end
16189
      // Checking if interrupt was generated
16190
 
16191
      if(RxFlow | PassAll)
16192
      begin
16193
        if (!wb_int)
16194
        begin
16195
          `TIME; $display("*E WB INT signal should be set");
16196
          test_fail("WB INT signal should be set");
16197
          fail = fail + 1;
16198
        end
16199
      end
16200
      else
16201
      begin
16202
        if (wb_int)
16203
        begin
16204
          `TIME; $display("*E WB INT signal should not be set");
16205
          test_fail("WB INT signal should not be set");
16206
          fail = fail + 1;
16207
        end
16208
      end
16209
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16210
      if(RxFlow)
16211
      begin
16212
        if(data !== (`ETH_INT_RXC))
16213
        begin
16214
          test_fail("RXC is not set or multiple IRQs active!");
16215
          fail = fail + 1;
16216
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16217
        end
16218
        // Clear RXC interrupt
16219
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
16220
      end
16221 263 mohor
      else if(PassAll)
16222 254 mohor
      begin
16223 263 mohor
        if(data !== (`ETH_INT_RXB))
16224 254 mohor
        begin
16225 263 mohor
          test_fail("RXB is not set or multiple IRQs active!");
16226 254 mohor
          fail = fail + 1;
16227 263 mohor
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
16228 254 mohor
        end
16229 263 mohor
        // Clear RXB interrupt
16230
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
16231 254 mohor
      end
16232
      else
16233
      begin
16234 263 mohor
        if(data !== 0)
16235 254 mohor
        begin
16236 263 mohor
          test_fail("No interrupt should be set!");
16237 254 mohor
          fail = fail + 1;
16238 263 mohor
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
16239 254 mohor
        end
16240
      end
16241
    end
16242 274 tadejm
    // disable RX
16243
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16244
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16245
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16246
    if(fail == 0)
16247
      test_ok;
16248
    else
16249
      fail = 0;
16250
  end
16251 266 mohor
 
16252 274 tadejm
 
16253
  ////////////////////////////////////////////////////////////////////
16254
  ////                                                            ////
16255
  ////  Receive control frames with PASSALL option turned on and  ////
16256
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
16257
  ////                                                            ////
16258
  ////////////////////////////////////////////////////////////////////
16259
  if (test_num == 4) // 
16260
  begin
16261
    // TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
16262
    test_name   = "TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )";
16263
    `TIME; $display("  TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )");
16264
 
16265
    // unmask interrupts
16266
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16267
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16268
    // set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
16269
    wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16270
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
16271
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
16272
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16273
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16274
    // enable flow control
16275
 
16276
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
16277
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16278
    // prepare one RX and one TX packet of 100 bytes long
16279
    rx_len = 100; // length of frame without CRC
16280
    st_data = 8'h1A;
16281
    set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
16282
    append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
16283
    tx_len = 64; // length of frame without CRC
16284
    st_data = 8'h01;
16285
    set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
16286
    // set TX and RX Buffer Descriptors 
16287
    tx_bd_num = 0; // tx BDs go from 0 to 0
16288
    rx_bd_num = 1; // rx BDs go from 1 to 1
16289
    // check WB INT signal
16290
    if (wb_int !== 1'b0)
16291
    begin
16292
      test_fail("WB INT signal should not be set");
16293
      fail = fail + 1;
16294
    end
16295
 
16296
    // set EQUAL mrx_clk to mtx_clk!
16297
//    eth_phy.set_mrx_equal_mtx = 1'b1;
16298 263 mohor
 
16299 274 tadejm
    // write to phy's control register for 10Mbps
16300
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
16301
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
16302
    speed = 10;
16303
 
16304
    // TXB and RXB interrupts masked
16305
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY | `ETH_INT_TXC | `ETH_INT_RXC,
16306
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16307
 
16308
    tmp_len = 0;
16309
    num_of_frames = 0;
16310
    num_of_rx_frames = 0;
16311
//    num_of_iter = 0;
16312
    // TX frame loop & RX frame loop work independently
16313
 
16314
 
16315
    fork
16316
      // TX frame loop
16317
      while (num_of_frames < 400)
16318
      begin
16319
        eth_phy.set_tx_mem_addr(64 + num_of_frames);
16320
        // set tx bd
16321
          // wait for WB master if it is working
16322
          @(posedge wb_clk);
16323
          while (wbm_working)
16324
          begin
16325
            @(posedge wb_clk);
16326
          end
16327
        set_tx_bd(0, 0, tx_len, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
16328
        set_tx_bd_wrap(0);
16329
        set_tx_bd_ready(0, 0);
16330
        check_tx_bd(0, data);
16331
        // check frame
16332
        i = 0;
16333
        while((i < 100) && (MTxEn === 1'b0)) // wait for start of TX frame!
16334
        begin
16335
          @(posedge mtx_clk);
16336
          i = i + 1;
16337
        end
16338
        if (MTxEn != 1'b1)
16339
        begin
16340
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't start transmitting the packet", num_of_frames);
16341
          test_fail("MAC TX didn't start transmitting the packet");
16342
          fail = fail + 1;
16343
          #10000 $stop;
16344
        end
16345
 
16346
        repeat (30) @(posedge mtx_clk); // waiting some time so PHY clears the tx_len
16347
 
16348
        wait ((MTxEn === 1'b0) || (eth_phy.tx_len > (tx_len + 4))) // wait for end of TX frame
16349
        if (MTxEn != 1'b0)
16350
        begin
16351
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't stop transmitting the packet", num_of_frames);
16352
          test_fail("MAC TX didn't stop transmitting the packet");
16353
          fail = fail + 1;
16354
          #10000 $stop;
16355
        end
16356
        tmp_len = eth_phy.tx_len;
16357
          // wait for WB master if it is working
16358
          @(posedge wb_clk);
16359
          while (wbm_working)
16360
          begin
16361
            @(posedge wb_clk);
16362
          end
16363
        check_tx_bd(0, data);
16364
        while (data[15] === 1)
16365
        begin
16366
            // wait for WB master if it is working
16367
            @(posedge wb_clk);
16368
            while (wbm_working)
16369
            begin
16370
              @(posedge wb_clk);
16371
            end
16372
          check_tx_bd(0, data);
16373
        end
16374
        repeat (1) @(posedge wb_clk);
16375
        // check length of a PACKET
16376
        if (tmp_len != (tx_len + 4))
16377
        begin
16378
          `TIME; $display("*E Tx Frame %0d: Wrong length of the packet out from MAC (%0d instead of %0d)", num_of_frames,
16379
                          tmp_len, (tx_len + 4));
16380
          test_fail("Wrong length of the packet out from MAC");
16381
          fail = fail + 1;
16382
        end
16383
        // check transmitted TX packet data
16384
        check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
16385
        if (tmp > 0)
16386
        begin
16387
          `TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
16388
          test_fail("Wrong data of the transmitted packet");
16389
          fail = fail + 1;
16390
        end
16391
        // check transmited TX packet CRC
16392
        check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
16393
        if (tmp > 0)
16394
        begin
16395
          `TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
16396
          test_fail("Wrong CRC of the transmitted packet");
16397
          fail = fail + 1;
16398
        end
16399
        // check WB INT signal
16400
        if (wb_int !== 1'b0)
16401
        begin
16402
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16403
          test_fail("WB INT signal should not be set");
16404
          fail = fail + 1;
16405
        end
16406
        // check TX buffer descriptor of a packet
16407
          // wait for WB master if it is working
16408
          @(posedge wb_clk);
16409
          while (wbm_working)
16410
          begin
16411
            @(posedge wb_clk);
16412
          end
16413
        check_tx_bd(0, data);
16414
        if (data[15:0] !== 16'h7800)
16415
        begin
16416
          `TIME; $display("*E Tx Frame %0d: TX buffer descriptor status is not correct: %0h", num_of_frames, data[15:0]);
16417
          test_fail("TX buffer descriptor status is not correct");
16418
          fail = fail + 1;
16419
        end
16420
        // check interrupts
16421
          // wait for WB master if it is working
16422
          @(posedge wb_clk);
16423
          while (wbm_working)
16424
          begin
16425
            @(posedge wb_clk);
16426
          end
16427
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16428
        if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
16429
        begin
16430
          `TIME; $display("*E Tx Frame %0d: Interrupt Transmit Buffer was not set, interrupt reg: %0h", num_of_frames, data);
16431
          test_fail("Interrupt Transmit Buffer was not set");
16432
          fail = fail + 1;
16433
        end
16434
        if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
16435
        begin
16436
          `TIME; $display("*E Tx Frame %0d: Other interrupts (except Tx and Rx Buffer) were set, interrupt reg: %0h",
16437
                          num_of_frames, data);
16438
          test_fail("Other interrupts (except Transmit Buffer) were set");
16439
          fail = fail + 1;
16440
        end
16441
        // clear interrupts (except RXB)
16442
          // wait for WB master if it is working
16443
          @(posedge wb_clk);
16444
          while (wbm_working)
16445
          begin
16446
            @(posedge wb_clk);
16447
          end
16448
        wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16449
        // check WB INT signal
16450
        if (wb_int !== 1'b0)
16451
        begin
16452
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
16453
          test_fail("WB INT signal should not be set");
16454
          fail = fail + 1;
16455
        end
16456
        // Displays
16457
        if (num_of_frames[2:0] == 3'b111)
16458
        begin
16459
          `TIME; $display("   ->8 frames transmitted");
16460
        end
16461
        // set length (loop variable)
16462
        num_of_frames = num_of_frames + 1;
16463
      end // TX frame loop
16464
      // RX frame loop
16465
      while (num_of_rx_frames < 400)
16466
      begin
16467
        // set rx bd
16468
          // wait for WB master if it is working
16469
          @(posedge wb_clk);
16470
          #1;
16471
          while (wbm_working)
16472
          begin
16473
            @(posedge wb_clk);
16474
            #1;
16475
          end
16476
        set_rx_bd(1, 1, 1'b1, (`MEMORY_BASE + 200 + num_of_rx_frames));
16477
        set_rx_bd_wrap(1);
16478
        set_rx_bd_empty(1, 1);
16479
        // check frame
16480
        fork
16481
          begin
16482
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
16483
            repeat(10) @(posedge mrx_clk);
16484
          end
16485
          begin
16486
            wait (MRxDV === 1'b1); // start receive
16487
              // wait for WB master if it is working
16488
              @(posedge wb_clk);
16489
              #1;
16490
              while (wbm_working)
16491
              begin
16492
                @(posedge wb_clk);
16493
                #1;
16494
              end
16495
            check_rx_bd(1, data);
16496
            if (data[15] !== 1)
16497
            begin
16498
              `TIME; $display("*E Rx Frame %0d: Wrong buffer descriptor's ready bit read out from MAC", num_of_rx_frames);
16499
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
16500
              fail = fail + 1;
16501
            end
16502
            wait (MRxDV === 1'b0); // end receive
16503
 
16504
            while (data[15] === 1)
16505
            begin
16506
                // wait for WB master if it is working
16507
                @(posedge wb_clk);
16508
                #1;
16509
                while (wbm_working)
16510
                begin
16511
                  @(posedge wb_clk);
16512
                  #1;
16513
                end
16514
              check_rx_bd(1, data);
16515
            end
16516
            repeat (1) @(posedge wb_clk);
16517
          end
16518
        join
16519
        // check length of a PACKET
16520
 
16521
        // Additional read because simulator was not working OK.
16522
        // wait for WB master if it is working
16523
        @(posedge wb_clk);
16524
        #1;
16525
        while (wbm_working)
16526
        begin
16527
          @(posedge wb_clk);
16528
          #1;
16529
        end
16530
        check_rx_bd(1, data);
16531
 
16532
        if (data[31:16] != (rx_len + 4))
16533
        begin
16534
          `TIME; $display("*E Rx Frame %0d: Wrong length of the packet written to MAC's register (%0d instead of %0d)",
16535
                          num_of_rx_frames, data[31:16], (rx_len + 4));
16536
          test_fail("Wrong length of the packet out from PHY");
16537
          fail = fail + 1;
16538
        end
16539
        // check received RX packet data and CRC
16540
        check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
16541
        if (tmp > 0)
16542
        begin
16543
          `TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
16544
          test_fail("Wrong data of the received packet");
16545
          fail = fail + 1;
16546
        end
16547
        // check WB INT signal
16548
        if (wb_int !== 1'b0)
16549
        begin
16550
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16551
          test_fail("WB INT signal should not be set");
16552
          fail = fail + 1;
16553
        end
16554
        // check RX buffer descriptor of a packet
16555
          // wait for WB master if it is working
16556
          @(posedge wb_clk);
16557
          #1;
16558
          while (wbm_working)
16559
          begin
16560
            @(posedge wb_clk);
16561
            #1;
16562
          end
16563
        check_rx_bd(1, data);
16564
        if (data[15:0] !== 16'h6080)
16565
        begin
16566
          `TIME; $display("*E Rx Frame %0d: RX buffer descriptor status is not correct: %0h", num_of_rx_frames, data[15:0]);
16567
          test_fail("RX buffer descriptor status is not correct");
16568
          fail = fail + 1;
16569
        end
16570
        // check interrupts
16571
          // wait for WB master if it is working
16572
          @(posedge wb_clk);
16573
          #1;
16574
          while (wbm_working)
16575
          begin
16576
            @(posedge wb_clk);
16577
            #1;
16578
          end
16579
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16580
 
16581
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
16582
        begin
16583
          `TIME; $display("*E Rx Frame %0d: Interrupt Receive Buffer was not set, interrupt reg: %0h",
16584
                          num_of_rx_frames, data);
16585
          test_fail("Interrupt Receive Buffer was not set");
16586
          fail = fail + 1;
16587
        end
16588
        if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
16589
        begin
16590
          `TIME; $display("*E Rx Frame %0d: Other interrupts (except Rx and Tx Buffer) were set, interrupt reg: %0h",
16591
                          num_of_rx_frames, data);
16592
          test_fail("Other interrupts (except Receive Buffer) were set");
16593
          fail = fail + 1;
16594
        end
16595
        // clear interrupts (except TXB)
16596
          // wait for WB master if it is working
16597
          @(posedge wb_clk);
16598
          #1;
16599
          while (wbm_working)
16600
          begin
16601
            @(posedge wb_clk);
16602
            #1;
16603
          end
16604
        wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16605
        // check WB INT signal
16606
        if (wb_int !== 1'b0)
16607
        begin
16608
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
16609
          test_fail("WB INT signal should not be set");
16610
          fail = fail + 1;
16611
        end
16612
        // Displays
16613
        if (num_of_rx_frames[2:0] == 3'b111)
16614
        begin
16615
          `TIME; $display("   ->8 frames received");
16616
        end
16617
        // set length (loop variable)
16618
        num_of_rx_frames = num_of_rx_frames + 1;
16619
      end // RX frame loop
16620
    join
16621
    // disable TX & RX
16622
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_PAD | `ETH_MODER_CRCEN |
16623
              `ETH_MODER_IFG | `ETH_MODER_PRO | `ETH_MODER_BRO,
16624
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16625
    // set DIFFERENT mrx_clk to mtx_clk!
16626
//    eth_phy.set_mrx_equal_mtx = 1'b0;
16627
    if(fail == 0)
16628
      test_ok;
16629
    else
16630
      fail = 0;
16631
  end
16632
 
16633
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
16634
 
16635
end
16636
endtask // test_mac_full_duplex_flow_control
16637
 
16638
 
16639
task test_mac_half_duplex_flow;
16640
  input  [31:0]  start_task;
16641
  input  [31:0]  end_task;
16642
  integer        bit_start_1;
16643
  integer        bit_end_1;
16644
  integer        bit_start_2;
16645
  integer        bit_end_2;
16646
  integer        num_of_reg;
16647
  integer        num_of_frames;
16648
  integer        num_of_bd;
16649
  integer        num_of_iter;
16650
  integer        i_addr;
16651
  integer        i_data;
16652
  integer        i_length;
16653
  integer        tmp_len;
16654
  integer        tmp_bd;
16655
  integer        tmp_bd_num;
16656
  integer        tmp_data;
16657
  integer        tmp_ipgt;
16658
  integer        test_num;
16659
  reg    [31:0]  tx_bd_num;
16660
  reg    [31:0]  rx_bd_num;
16661
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
16662
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
16663
  integer        i;
16664
  integer        i1;
16665
  integer        i2;
16666
  integer        i3;
16667
  integer        fail;
16668
  integer        speed;
16669
  integer        mac_hi_addr;
16670
  integer        mac_lo_addr;
16671
  reg            frame_started;
16672
  reg            frame_ended;
16673
  reg            check_rx_frame;
16674
  reg            wait_for_tx_frame;
16675
  reg    [31:0]  addr;
16676
  reg    [31:0]  data;
16677
  reg    [31:0]  tmp;
16678
  reg    [ 7:0]  st_data;
16679
  reg    [15:0]  max_tmp;
16680
  reg    [15:0]  min_tmp;
16681
begin
16682
// MAC HALF DUPLEX FLOW TEST
16683
test_heading("MAC HALF DUPLEX FLOW TEST");
16684
$display(" ");
16685
$display("MAC HALF DUPLEX FLOW TEST");
16686
fail = 0;
16687
 
16688
// reset MAC registers
16689
hard_reset;
16690
// reset MAC and MII LOGIC with soft reset
16691
//reset_mac;
16692
//reset_mii;
16693
// set wb slave response
16694
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
16695
 
16696
  /*
16697
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
16698
  -------------------------------------------------------------------------------------
16699
  set_tx_bd
16700
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
16701
  set_tx_bd_wrap
16702
    (tx_bd_num_end[6:0]);
16703
  set_tx_bd_ready
16704
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16705
  check_tx_bd
16706
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
16707
  clear_tx_bd
16708
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
16709
 
16710
  TASKS for set and control RX buffer descriptors:
16711
  ------------------------------------------------
16712
  set_rx_bd
16713
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
16714
  set_rx_bd_wrap
16715
    (rx_bd_num_end[6:0]);
16716
  set_rx_bd_empty
16717
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16718
  check_rx_bd
16719
    (rx_bd_num_end[6:0], rx_bd_status);
16720
  clear_rx_bd
16721
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
16722
 
16723
  TASKS for set and check TX packets:
16724
  -----------------------------------
16725
  set_tx_packet
16726
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
16727
  check_tx_packet
16728
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
16729
 
16730
  TASKS for set and check RX packets:
16731
  -----------------------------------
16732
  set_rx_packet
16733
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
16734
  check_rx_packet
16735
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
16736
 
16737
  TASKS for append and check CRC to/of TX packet:
16738
  -----------------------------------------------
16739
  append_tx_crc
16740
    (txpnt_wb[31:0], len[15:0], negated_crc);
16741
  check_tx_crc
16742
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
16743
 
16744
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
16745
  --------------------------------------------------------------------------------
16746
  append_rx_crc
16747
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
16748
  */
16749
 
16750
//////////////////////////////////////////////////////////////////////
16751
////                                                              ////
16752
////  test_mac_half_duplex_flow:                                  ////
16753
////                                                              ////
16754
////  0: Test                                                     ////
16755
////                                                              ////
16756
//////////////////////////////////////////////////////////////////////
16757
 
16758
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
16759
begin
16760
 
16761
  ////////////////////////////////////////////////////////////////////
16762
  ////                                                            ////
16763
  ////  Test collision and late collision while transmitting and  ////
16764
  ////  receiving normal frames. Using 4 TX and RX buffer         ////
16765
  ////  decriptors ( 10Mbps ).                                    ////
16766
  ////                                                            ////
16767
  ////////////////////////////////////////////////////////////////////
16768
  if (test_num == 0) // 
16769
  begin
16770
    // TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )
16771
    //         
16772
    test_name = "TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )";
16773
    `TIME; $display("  TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )");
16774
 
16775
    // reset MAC completely
16776
    hard_reset;
16777
    // set wb slave response
16778
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
16779
 
16780
    max_tmp = 0;
16781
    min_tmp = 0;
16782
    // set 4 TX buffer descriptors (4 TX and 4 RX BDs will be used) - must be set before TX/RX enable
16783
    wait (wbm_working == 0);
16784
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16785
    // enable TX and RX, set half-duplex mode, receive small, NO correct IFG
16786
    wait (wbm_working == 0);
16787
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_RXEN | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
16788
              `ETH_MODER_PRO | `ETH_MODER_BRO,
16789
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16790
    // prepare two packets of MAXFL length for TX and RX
16791
    wait (wbm_working == 0);
16792
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16793
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
16794
    min_tmp = tmp[31:16];
16795
    st_data = 8'h17;
16796
    set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
16797
    append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
16798
    st_data = 8'h92;
16799
    set_tx_packet(`MEMORY_BASE, (min_tmp), st_data); // length without CRC
16800
    append_tx_crc (`MEMORY_BASE, (min_tmp), 1'b0);
16801
 
16802
    // check WB INT signal
16803
    if (wb_int !== 1'b0)
16804
    begin
16805
      test_fail("WB INT signal should not be set");
16806
      fail = fail + 1;
16807
    end
16808
    // unmask interrupts
16809
    wait (wbm_working == 0);
16810
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
16811
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16812
 
16813
    // write to phy's control register for 10Mbps
16814
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
16815
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
16816
    speed = 10;
16817
 
16818
    // set TX and RX Buffer Descriptors 
16819
    tx_bd_num = 0; // tx BDs go from 0 to 3
16820
    rx_bd_num = 4; // rx BDs go from 4 to 7
16821
    set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
16822
    set_tx_bd_wrap(3);
16823
    set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
16824
    set_rx_bd_wrap(7);
16825
    set_rx_bd_empty(4, 7);
16826
 
16827
//    frame_ended = 0;
16828
    tmp_len = 0;
16829
    num_of_frames = 0;// 0; // 10;
16830
    num_of_iter = 0;
16831
//    num_of_bd = 0;
16832
//    i_length = 0;// (0 - 4); // 6; // 4 less due to CRC
16833
    while (num_of_frames < 80)
16834
    begin
16835
      // change COLLVALID bits in COLLCONF register
16836
      if ((num_of_frames == 0) && (num_of_iter == 0))
16837
      begin
16838
        wait (wbm_working == 0);
16839
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16840
        tmp[5:0] = 6'h00; // 6'b00_0000 ->  0 + 1 =  1 byte from preamble
16841
        wait (wbm_working == 0);
16842
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16843
        $display("    Collision window is set to 1 byte after preamble and SFD");
16844
      end
16845
      else if ((num_of_frames == 0) && (num_of_iter == 1))
16846
      begin
16847
        wait (wbm_working == 0);
16848
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16849
        tmp[5:0] = 6'h15; // 6'b01_0101 -> 21 + 1 = 22 bytes from preamble
16850
        wait (wbm_working == 0);
16851
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16852
        $display("    Collision window is set to 22 bytes after preamble and SFD");
16853
      end
16854
      else if ((num_of_frames == 0) && (num_of_iter == 2))
16855
      begin
16856
        wait (wbm_working == 0);
16857
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16858
        tmp[5:0] = 6'h2A; // 6'b10_1010 -> 42 + 1 = 43 bytes from preamble
16859
        wait (wbm_working == 0);
16860
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16861
        $display("    Collision window is set to 43 bytes after preamble and SFD");
16862
      end
16863
      else if ((num_of_frames == 0) && (num_of_iter == 3))
16864
      begin
16865
        wait (wbm_working == 0);
16866
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16867
        tmp[5:0] = 6'h3F; // 6'b11_1111 -> 63 + 1 = 64 bytes from preamble
16868
        wait (wbm_working == 0);
16869
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
16870
        $display("    Collision window is set to 64 bytes after preamble and SFD");
16871
      end
16872
 
16873
 
16874
//wire          MRxDV;    // This goes to PHY
16875
//wire          MRxErr;   // This goes to PHY
16876
//wire          MColl;    // This goes to PHY
16877
//wire          MCrs;     // This goes to PHY
16878
//wire          MTxEn;
16879
//wire          MTxErr;
16880
      // CHECK END OF RECEIVE WHILE TRANSMITTING
16881
      frame_ended = 0;
16882
      check_rx_frame = 0;
16883
      fork
16884
        // send frames
16885
        begin // start with RX frame
16886
          repeat(num_of_frames) @(posedge mrx_clk);
16887
          #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (min_tmp + 4), 1'b0);
16888
          repeat(10) @(posedge mrx_clk);
16889
        end
16890
        begin // start with TX frame 
16891
          repeat(2) @(posedge mrx_clk);
16892
          repeat(2) @(posedge wb_clk);
16893
          #1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
16894
        end
16895
        // observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
16896
        begin
16897
          wait (MCrs || MTxEn);
16898
          #1;
16899
          if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
16900
            wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
16901
          else
16902
          begin
16903
            i = 0;
16904
            while (MColl == 1'b0) // wait for Collision to occure
16905
            begin
16906
              repeat(2) @(posedge mtx_clk); // counting bytes
16907
              #1 i = i + 1'b1;
16908
            end
16909
            i = i - 8; // subtract preamble and SFD (bytes) - Late Collision is measured from SFD!
16910
            tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
16911
            //wait (MTxEn == 1'b0); // wait for TX frame to end
16912
            repeat(10) @(posedge mrx_clk);
16913
            repeat(8) @(posedge wb_clk);
16914
            #1 check_tx_bd(tx_bd_num, data);
16915
            if (data[15] === 0) // if transmit is aborted, then it was Late Collision
16916
            begin
16917
              wait_for_tx_frame = 1'b0; // don't wait for retransmission of TX frame
16918
              $display("    ->Late Collision occured on %0d. byte after frame and SFD", i);
16919
            end
16920
            else
16921
              wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
16922
          end
16923
        end
16924
        // check if RX frame is accepted
16925
        begin
16926
          wait (MRxDV === 1'b1); // start receive
16927
          wait (MRxDV === 1'b0); // end receive
16928
          repeat(10) @(posedge mrx_clk);
16929
          repeat(8) @(posedge wb_clk);
16930
          #1 check_rx_bd(rx_bd_num, data);
16931
          if (data[15] === 0)
16932
          begin
16933
            check_rx_frame = 1'b1; // RX frame accepted and must be checked
16934
            if ((i + 8) == 0) // add preamble and SFD length (bytes)
16935
              $display("    ->RX frame, which started before or at beginning of TX frame, was accepted");
16936
            else
16937
              $display("    ->RX frame, which started %0d byte(s) after beginning of TX frame, was accepted", (i + 8));
16938
          end
16939
          else
16940
            check_rx_frame = 1'b0; // RX frame rejected
16941
          repeat(1) @(posedge wb_clk);
16942
        end
16943
      join
16944
 
16945
 
16946
 
16947
      // check length of a PACKET
16948
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
16949
           ((data[31:16] != 0) && (num_of_frames < 3)) )
16950
      begin
16951
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
16952
                        data[31:16], (i_length + 4));
16953
        test_fail("Wrong length of the packet out from PHY");
16954
        fail = fail + 1;
16955
      end
16956
      // check received RX packet data and CRC
16957
//if ((num_of_frames == 5))
16958
//begin                                           // CRC has 4 bytes for itself
16959
//  if (i_length[0] == 1'b1)
16960
//  begin
16961
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
16962
//  end
16963
//  else
16964
//  begin
16965
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
16966
//  end
16967
//  if (tmp > 0)
16968
//  begin
16969
//    `TIME; $display("*E Wrong data of the received packet");
16970
//    test_fail("Wrong data of the received packet");
16971
//    fail = fail + 1;
16972
//  end
16973
//end
16974
//else
16975
//if ((num_of_frames == 10))
16976
//begin                                           // CRC has 4 bytes for itself
16977
//  if (i_length[0] == 1'b1)
16978
//  begin
16979
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
16980
//  end
16981
//  else
16982
//  begin
16983
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
16984
//  end
16985
//  if (tmp > 0)
16986
//  begin
16987
//    `TIME; $display("*E Wrong data of the received packet");
16988
//    test_fail("Wrong data of the received packet");
16989
//    fail = fail + 1;
16990
//  end
16991
//end
16992
//else
16993
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
16994
      begin                                           // CRC has 4 bytes for itself
16995
        if (i_length[0] == 1'b0)
16996
        begin
16997
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
16998
        end
16999
        else
17000
        begin
17001
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17002
        end
17003
        if (tmp > 0)
17004
        begin
17005
          `TIME; $display("*E Wrong data of the received packet");
17006
          test_fail("Wrong data of the received packet");
17007
          fail = fail + 1;
17008
        end
17009
      end
17010
 
17011
      // check WB INT signal
17012
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
17013
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
17014
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
17015
        begin
17016
          `TIME; $display("*E WB INT signal should be set");
17017
          test_fail("WB INT signal should be set");
17018
          fail = fail + 1;
17019
        end
17020
      end
17021
      else
17022
      begin
17023
        if (wb_int !== 1'b0)
17024
        begin
17025
          `TIME; $display("*E WB INT signal should not be set");
17026
          test_fail("WB INT signal should not be set");
17027
          fail = fail + 1;
17028
        end
17029
      end
17030
 
17031
      // check RX buffer descriptor of a packet
17032
      if (num_of_frames >= min_tmp)
17033
      begin
17034
        if ( (data[15:0] !== 16'h6000) && // wrap bit
17035
             (data[15:0] !== 16'h4000) ) // without wrap bit
17036
        begin
17037
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17038
          test_fail("RX buffer descriptor status is not correct");
17039
          fail = fail + 1;
17040
        end
17041
      end
17042
      else if (num_of_frames > 4)
17043
      begin
17044
        if ( (data[15:0] !== 16'h6004) && // wrap bit
17045
             (data[15:0] !== 16'h4004) ) // without wrap bit
17046
        begin
17047
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17048
          test_fail("RX buffer descriptor status is not correct");
17049
          fail = fail + 1;
17050
        end
17051
      end
17052
      else if (num_of_frames > 2)
17053
      begin
17054
        if ( (data[15:0] !== 16'h6006) && // wrap bit
17055
             (data[15:0] !== 16'h4006) ) // without wrap bit
17056
        begin
17057
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17058
          test_fail("RX buffer descriptor status is not correct");
17059
          fail = fail + 1;
17060
        end
17061
      end
17062
      else
17063
      begin
17064
        if (data[15] !== 1'b1)
17065
        begin
17066
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
17067
          test_fail("RX buffer descriptor status is not correct");
17068
          fail = fail + 1;
17069
        end
17070
      end
17071
      // check interrupts
17072
      wait (wbm_working == 0);
17073
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17074
      if (num_of_frames >= 5)
17075
      begin
17076
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17077
        begin
17078
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17079
          test_fail("Interrupt Receive Buffer was not set");
17080
          fail = fail + 1;
17081
        end
17082
        if ((data & (~`ETH_INT_RXB)) !== 0)
17083
        begin
17084
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17085
          test_fail("Other interrupts (except Receive Buffer) were set");
17086
          fail = fail + 1;
17087
        end
17088
      end
17089
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
17090
      begin
17091
        if (data) // Checking if any interrupt is pending)
17092
        begin
17093
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
17094
          test_fail("Interrupts were set");
17095
          fail = fail + 1;
17096
        end
17097
      end
17098
      else
17099
      begin
17100
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
17101
        begin
17102
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
17103
          test_fail("Interrupt Receive Buffer Error was not set");
17104
          fail = fail + 1;
17105
        end
17106
        if ((data & (~`ETH_INT_RXE)) !== 0)
17107
        begin
17108
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
17109
          test_fail("Other interrupts (except Receive Buffer Error) were set");
17110
          fail = fail + 1;
17111
        end
17112
      end
17113
      // clear interrupts
17114
      wait (wbm_working == 0);
17115
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17116
      // check WB INT signal
17117
      if (wb_int !== 1'b0)
17118
      begin
17119
        test_fail("WB INT signal should not be set");
17120
        fail = fail + 1;
17121
      end
17122
      // INTERMEDIATE DISPLAYS
17123
      if (num_of_frames == 3)
17124
      begin
17125
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17126
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
17127
                 0, 3);
17128
      end
17129
      else if (num_of_frames == 9)
17130
      begin
17131
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
17132
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
17133
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17134
                 5, 9);
17135
      end
17136
      else if (num_of_frames == 17)
17137
      begin
17138
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
17139
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17140
                 10, 17);
17141
      end
17142
      else if (num_of_frames == 27)
17143
      begin
17144
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
17145
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17146
                 18, 27);
17147
      end
17148
      else if (num_of_frames == 40)
17149
      begin
17150
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
17151
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17152
                 28, 40);
17153
      end
17154
      else if (num_of_frames == 54)
17155
      begin
17156
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
17157
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17158
                 41, 54);
17159
      end
17160
      else if (num_of_frames == 69)
17161
      begin
17162
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17163
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17164
                 55, 69);
17165
      end
17166
      else if (num_of_frames == 69)
17167
      begin
17168
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17169
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17170
                 55, 69);
17171
      end
17172
      else if (num_of_frames == 77)
17173
      begin
17174
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
17175
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
17176
                 70, 77);
17177
      end
17178
      // set length (loop variable)
17179
      i_length = i_length + 1;
17180
      // the number of frame transmitted
17181
      num_of_frames = num_of_frames + 1;
17182
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
17183
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
17184
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
17185
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
17186
        num_of_bd = 120;
17187
      else
17188
        num_of_bd = num_of_bd + 1;
17189
    end
17190 260 mohor
    // disable RX
17191 274 tadejm
    wait (wbm_working == 0);
17192
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
17193
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17194
    @(posedge wb_clk);
17195
    if(fail == 0)
17196
      test_ok;
17197
    else
17198
      fail = 0;
17199
  end
17200
 
17201
 
17202
  ////////////////////////////////////////////////////////////////////
17203
  ////                                                            ////
17204
  ////  Receive control frames with PASSALL option turned off     ////
17205
  ////  Using only one RX buffer decriptor ( 10Mbps ).            ////
17206
  ////                                                            ////
17207
  ////////////////////////////////////////////////////////////////////
17208
  if (test_num == 1) // 
17209
  begin
17210
    // TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
17211
    test_name   = "TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
17212
    `TIME; $display("  TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
17213
 
17214
    // unmask interrupts
17215
    wait (wbm_working == 0);
17216
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17217
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17218
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
17219
    wait (wbm_working == 0);
17220
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17221
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
17222
    wait (wbm_working == 0);
17223
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17224
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17225
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17226
    // prepare one control (PAUSE)packet
17227
    st_data = 8'h00;
17228
    set_rx_packet(0, 60, 1'b0, 48'h0180_c200_0001, 48'h0708_090A_0B0C, 16'h8808, st_data); // length without CRC
17229
    // prepare one packet of 100 bytes long
17230
    st_data = 8'h1A;
17231
    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
17232
    // check WB INT signal
17233
    if (wb_int !== 1'b0)
17234
    begin
17235
      test_fail("WB INT signal should not be set");
17236
      fail = fail + 1;
17237
    end
17238
 
17239
    // write to phy's control register for 10Mbps
17240
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
17241
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
17242
    speed = 10;
17243
 
17244
    for (i=0; i<4; i=i+1)
17245
    begin
17246
      // choose generating carrier sense and collision for first and last 64 lengths of frames
17247
      case (i)
17248
      0: // Interrupt is generated
17249
      begin
17250
        // enable interrupt generation
17251
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i));
17252
        // unmask interrupts
17253
        wait (wbm_working == 0);
17254
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17255
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17256
        // not detect carrier sense in FD and no collision
17257
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17258
        eth_phy.collision(0);
17259
      end
17260
      1: // Interrupt is not generated
17261
      begin
17262
        // enable interrupt generation
17263
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i) + 64));
17264
        // mask interrupts
17265
        wait (wbm_working == 0);
17266
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17267
        // detect carrier sense in FD and no collision
17268
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17269
        eth_phy.collision(0);
17270
      end
17271
      2: // Interrupt is not generated
17272
      begin
17273
        // disable interrupt generation
17274
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i));
17275
        // unmask interrupts
17276
        wait (wbm_working == 0);
17277
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
17278
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17279
        // not detect carrier sense in FD and set collision
17280
        eth_phy.no_carrier_sense_rx_fd_detect(0);
17281
        eth_phy.collision(1);
17282
      end
17283
      default: // 3: // Interrupt is not generated
17284
      begin
17285
        // disable interrupt generation
17286
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i) + 64));
17287
        // mask interrupts
17288
        wait (wbm_working == 0);
17289
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17290
        // detect carrier sense in FD and set collision
17291
        eth_phy.no_carrier_sense_rx_fd_detect(1);
17292
        eth_phy.collision(1);
17293
      end
17294
      endcase
17295
 
17296
      append_rx_crc (64, 100, 1'b0, 1'b0); // To the second (data) packet
17297
      // set wrap bit
17298
      set_rx_bd_wrap(127);
17299
      set_rx_bd_empty(127, 127);
17300
      fork
17301
        begin
17302
          if (i[0] == 1'b0)
17303
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
17304
          else
17305
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 64, 104, 1'b0);
17306
          repeat(10) @(posedge mrx_clk);
17307
$display("1111");
17308
        end
17309
        begin
17310
          #1 check_rx_bd(127, data);
17311
$display("aaaa");
17312
          wait (MRxDV === 1'b1); // start transmit
17313
$display("bbbb");
17314
          #1 check_rx_bd(127, data);
17315
          if (data[15] !== 1)
17316
          begin
17317
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
17318
            fail = fail + 1;
17319
          end
17320
          wait (MRxDV === 1'b0); // end transmit
17321
$display("cccc");
17322
          while (data[15] === 1)
17323
          begin
17324
            #1 check_rx_bd(127, data);
17325
            @(posedge wb_clk);
17326
          end
17327
          repeat (1) @(posedge wb_clk);
17328
$display("2222");
17329
        end
17330
      join
17331
$display("dddd");
17332
      // check length of a PACKET
17333
      if (data[31:16] != (i_length + 4))
17334
      begin
17335
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
17336
                        data[31:16], (i_length + 4));
17337
        test_fail("Wrong length of the packet out from PHY");
17338
        fail = fail + 1;
17339
      end
17340
      // checking in the following if statement is performed only for first and last 64 lengths
17341
      // check received RX packet data and CRC
17342
      if (i_length[0] == 1'b0)
17343
      begin
17344
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
17345
      end
17346
      else
17347
      begin
17348
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
17349
      end
17350
      if (tmp > 0)
17351
      begin
17352
        `TIME; $display("*E Wrong data of the received packet");
17353
        test_fail("Wrong data of the received packet");
17354
        fail = fail + 1;
17355
      end
17356
      // check WB INT signal
17357
      if (i_length[1:0] == 2'h0)
17358
      begin
17359
        if (wb_int !== 1'b1)
17360
        begin
17361
          `TIME; $display("*E WB INT signal should be set");
17362
          test_fail("WB INT signal should be set");
17363
          fail = fail + 1;
17364
        end
17365
      end
17366
      else
17367
      begin
17368
        if (wb_int !== 1'b0)
17369
        begin
17370
          `TIME; $display("*E WB INT signal should not be set");
17371
          test_fail("WB INT signal should not be set");
17372
          fail = fail + 1;
17373
        end
17374
      end
17375
      // check RX buffer descriptor of a packet
17376
      check_rx_bd(127, data);
17377
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
17378
      begin
17379
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
17380
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
17381
        begin
17382
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17383
          test_fail("RX buffer descriptor status is not correct");
17384
          fail = fail + 1;
17385
        end
17386
      end
17387
      else // interrupt not enabled
17388
      begin
17389
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
17390
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
17391
        begin
17392
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
17393
          test_fail("RX buffer descriptor status is not correct");
17394
          fail = fail + 1;
17395
        end
17396
      end
17397
      // clear RX buffer descriptor for first 4 frames
17398
      if (i_length < min_tmp)
17399
        clear_rx_bd(127, 127);
17400
      // check interrupts
17401
      wait (wbm_working == 0);
17402
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17403
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
17404
      begin
17405
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
17406
        begin
17407
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
17408
          test_fail("Interrupt Receive Buffer was not set");
17409
          fail = fail + 1;
17410
        end
17411
        if ((data & (~`ETH_INT_RXB)) !== 0)
17412
        begin
17413
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
17414
          test_fail("Other interrupts (except Receive Buffer) were set");
17415
          fail = fail + 1;
17416
        end
17417
      end
17418
      else
17419
      begin
17420
        if (data !== 0)
17421
        begin
17422
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
17423
          test_fail("Any of interrupts (except Receive Buffer) was set");
17424
          fail = fail + 1;
17425
        end
17426
      end
17427
      // clear interrupts
17428
      wait (wbm_working == 0);
17429
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17430
      // check WB INT signal
17431
      if (wb_int !== 1'b0)
17432
      begin
17433
        test_fail("WB INT signal should not be set");
17434
        fail = fail + 1;
17435
      end
17436
      // INTERMEDIATE DISPLAYS
17437
      if ((i_length + 4) == (min_tmp + 64))
17438
      begin
17439
        // starting length is min_tmp, ending length is (min_tmp + 64)
17440
        $display("    receive small packets is NOT selected");
17441
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
17442
                 min_tmp, (min_tmp + 64));
17443
        // set receive small, remain the rest
17444
        wait (wbm_working == 0);
17445
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17446
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17447
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17448
      end
17449
      else if ((i_length + 4) == (max_tmp - 16))
17450
      begin
17451
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
17452
        $display("    receive small packets is selected");
17453
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
17454
                 (min_tmp + 64 + 128), tmp_data);
17455
        // reset receive small, remain the rest
17456
        wait (wbm_working == 0);
17457
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
17458
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
17459
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17460
      end
17461
      else if ((i_length + 4) == max_tmp)
17462
      begin
17463
        $display("    receive small packets is NOT selected");
17464
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
17465
                 (max_tmp - (4 + 16)), max_tmp);
17466
      end
17467
      // set length (loop variable)
17468
      if ((i_length + 4) < (min_tmp + 64))
17469
        i_length = i_length + 1;
17470
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
17471
      begin
17472
        i_length = i_length + 128;
17473
        tmp_data = i_length + 4; // last tmp_data is ending length
17474
      end
17475
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
17476
        i_length = max_tmp - (4 + 16);
17477
      else if ((i_length + 4) >= (max_tmp - 16))
17478
        i_length = i_length + 1;
17479
      else
17480
      begin
17481
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
17482
        #10 $stop;
17483
      end
17484
    end
17485
    // disable RX
17486
    wait (wbm_working == 0);
17487 260 mohor
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
17488
              `ETH_MODER_PRO | `ETH_MODER_BRO,
17489 254 mohor
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17490
    if(fail == 0)
17491
      test_ok;
17492
    else
17493
      fail = 0;
17494 209 tadejm
  end
17495
 
17496
 
17497
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
17498
 
17499 260 mohor
 
17500 209 tadejm
end
17501 274 tadejm
endtask // test_mac_half_duplex_flow
17502 209 tadejm
 
17503
 
17504 169 mohor
//////////////////////////////////////////////////////////////
17505
// WB Behavioral Models Basic tasks
17506
//////////////////////////////////////////////////////////////
17507
 
17508
task wbm_write;
17509
  input  [31:0] address_i;
17510
  input  [((`MAX_BLK_SIZE * 32) - 1):0] data_i;
17511
  input  [3:0]  sel_i;
17512
  input  [31:0] size_i;
17513
  input  [3:0]  init_waits_i;
17514
  input  [3:0]  subseq_waits_i;
17515
 
17516
  reg `WRITE_STIM_TYPE write_data;
17517
  reg `WB_TRANSFER_FLAGS flags;
17518
  reg `WRITE_RETURN_TYPE write_status;
17519
  integer i;
17520
begin
17521 274 tadejm
  wbm_working = 1;
17522
 
17523 169 mohor
  write_status = 0;
17524
 
17525
  flags                    = 0;
17526
  flags`WB_TRANSFER_SIZE   = size_i;
17527
  flags`INIT_WAITS         = init_waits_i;
17528
  flags`SUBSEQ_WAITS       = subseq_waits_i;
17529
 
17530
  write_data               = 0;
17531
  write_data`WRITE_DATA    = data_i[31:0];
17532
  write_data`WRITE_ADDRESS = address_i;
17533
  write_data`WRITE_SEL     = sel_i;
17534
 
17535
  for (i = 0; i < size_i; i = i + 1)
17536
  begin
17537
    wb_master.blk_write_data[i] = write_data;
17538
    data_i                      = data_i >> 32;
17539
    write_data`WRITE_DATA       = data_i[31:0];
17540
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
17541 116 mohor
  end
17542
 
17543 169 mohor
  wb_master.wb_block_write(flags, write_status);
17544 116 mohor
 
17545 169 mohor
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
17546
  begin
17547
    `TIME;
17548
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
17549
  end
17550 274 tadejm
 
17551
  @(posedge wb_clk);
17552
  #3;
17553
  wbm_working = 0;
17554
  #1;
17555 169 mohor
end
17556
endtask // wbm_write
17557 116 mohor
 
17558 169 mohor
task wbm_read;
17559
  input  [31:0] address_i;
17560
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
17561
  input  [3:0]  sel_i;
17562
  input  [31:0] size_i;
17563
  input  [3:0]  init_waits_i;
17564
  input  [3:0]  subseq_waits_i;
17565
 
17566
  reg `READ_RETURN_TYPE read_data;
17567
  reg `WB_TRANSFER_FLAGS flags;
17568
  reg `READ_RETURN_TYPE read_status;
17569
  integer i;
17570
begin
17571 274 tadejm
  wbm_working = 1;
17572
 
17573 169 mohor
  read_status = 0;
17574
  data_o      = 0;
17575
 
17576
  flags                  = 0;
17577
  flags`WB_TRANSFER_SIZE = size_i;
17578
  flags`INIT_WAITS       = init_waits_i;
17579
  flags`SUBSEQ_WAITS     = subseq_waits_i;
17580
 
17581
  read_data              = 0;
17582
  read_data`READ_ADDRESS = address_i;
17583
  read_data`READ_SEL     = sel_i;
17584
 
17585
  for (i = 0; i < size_i; i = i + 1)
17586 116 mohor
  begin
17587 169 mohor
    wb_master.blk_read_data_in[i] = read_data;
17588
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
17589
  end
17590
 
17591
  wb_master.wb_block_read(flags, read_status);
17592
 
17593
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
17594
  begin
17595
    `TIME;
17596
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
17597
  end
17598
 
17599
  for (i = 0; i < size_i; i = i + 1)
17600
  begin
17601
    data_o       = data_o << 32;
17602
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
17603
    data_o[31:0] = read_data`READ_DATA;
17604
  end
17605 274 tadejm
 
17606
  @(posedge wb_clk);
17607
  #3;
17608
  wbm_working = 0;
17609
  #1;
17610 169 mohor
end
17611
endtask // wbm_read
17612
 
17613
 
17614
//////////////////////////////////////////////////////////////
17615
// Ethernet Basic tasks
17616
//////////////////////////////////////////////////////////////
17617
 
17618
task hard_reset; //  MAC registers
17619
begin
17620
  // reset MAC registers
17621
  @(posedge wb_clk);
17622
  #2 wb_rst = 1'b1;
17623
  repeat(2) @(posedge wb_clk);
17624
  #2 wb_rst = 1'b0;
17625
end
17626
endtask // hard_reset
17627
 
17628
task reset_mac; //  MAC module
17629
  reg [31:0] tmp;
17630
  reg [31:0] tmp_no_rst;
17631
begin
17632
  // read MODER register first
17633
  wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17634
  // set reset bit - write back to MODER register with RESET bit
17635
  wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17636
  // clear reset bit - write back to MODER register without RESET bit
17637
  tmp_no_rst = `ETH_MODER_RST;
17638
  tmp_no_rst = ~tmp_no_rst;
17639
  wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17640
end
17641
endtask // reset_mac
17642
 
17643
task set_tx_bd;
17644
  input  [6:0]  tx_bd_num_start;
17645
  input  [6:0]  tx_bd_num_end;
17646
  input  [15:0] len;
17647
  input         irq;
17648
  input         pad;
17649
  input         crc;
17650
  input  [31:0] txpnt;
17651
 
17652
  integer       i;
17653
  integer       bd_status_addr, bd_ptr_addr;
17654
//  integer       buf_addr;
17655
begin
17656
  for(i = tx_bd_num_start; i <= tx_bd_num_end; i = i + 1)
17657
  begin
17658
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
17659
    bd_status_addr = `TX_BD_BASE + i * 8;
17660
    bd_ptr_addr = bd_status_addr + 4;
17661
    // initialize BD - status
17662
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
17663
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17664
    // initialize BD - pointer
17665
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17666
  end
17667
end
17668
endtask // set_tx_bd
17669
 
17670
task set_tx_bd_wrap;
17671
  input  [6:0]  tx_bd_num_end;
17672
  integer       bd_status_addr, tmp;
17673
begin
17674
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17675
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17676
  // set wrap bit to this BD - this BD should be last-one
17677
  wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17678
end
17679
endtask // set_tx_bd_wrap
17680
 
17681
task set_tx_bd_ready;
17682
  input  [6:0]  tx_nd_num_strat;
17683
  input  [6:0]  tx_bd_num_end;
17684
  integer       i;
17685
  integer       bd_status_addr, tmp;
17686
begin
17687
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17688
  begin
17689
    bd_status_addr = `TX_BD_BASE + i * 8;
17690
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17691
    // set empty bit to this BD - this BD should be ready
17692
    wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17693
  end
17694
end
17695
endtask // set_tx_bd_ready
17696
 
17697
task check_tx_bd;
17698
  input  [6:0]  tx_bd_num_end;
17699
  output [31:0] tx_bd_status;
17700
  integer       bd_status_addr, tmp;
17701
begin
17702
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
17703
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17704 274 tadejm
  tx_bd_status = tmp;
17705 169 mohor
end
17706
endtask // check_tx_bd
17707
 
17708
task clear_tx_bd;
17709
  input  [6:0]  tx_nd_num_strat;
17710
  input  [6:0]  tx_bd_num_end;
17711
  integer       i;
17712
  integer       bd_status_addr, bd_ptr_addr;
17713
begin
17714
  for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
17715
  begin
17716
    bd_status_addr = `TX_BD_BASE + i * 8;
17717
    bd_ptr_addr = bd_status_addr + 4;
17718
    // clear BD - status
17719
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17720
    // clear BD - pointer
17721
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17722
  end
17723
end
17724
endtask // clear_tx_bd
17725
 
17726
task set_rx_bd;
17727
  input  [6:0]  rx_bd_num_strat;
17728
  input  [6:0]  rx_bd_num_end;
17729
  input         irq;
17730
  input  [31:0] rxpnt;
17731
//  input  [6:0]  rxbd_num;
17732
  integer       i;
17733
  integer       bd_status_addr, bd_ptr_addr;
17734
//  integer       buf_addr;
17735
begin
17736
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17737
  begin
17738
//    buf_addr = `RX_BUF_BASE + i * 32'h600;
17739 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17740
//    bd_ptr_addr = bd_status_addr + 4; 
17741
    bd_status_addr = `TX_BD_BASE + i * 8;
17742
    bd_ptr_addr = bd_status_addr + 4;
17743 116 mohor
 
17744 169 mohor
    // initialize BD - status
17745
//    wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
17746
    wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
17747
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17748
    // initialize BD - pointer
17749
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17750
    wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
17751
  end
17752
end
17753
endtask // set_rx_bd
17754 116 mohor
 
17755 169 mohor
task set_rx_bd_wrap;
17756
  input  [6:0]  rx_bd_num_end;
17757
  integer       bd_status_addr, tmp;
17758
begin
17759 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
17760
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
17761 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17762
  // set wrap bit to this BD - this BD should be last-one
17763
  wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17764
end
17765
endtask // set_rx_bd_wrap
17766 116 mohor
 
17767 169 mohor
task set_rx_bd_empty;
17768
  input  [6:0]  rx_bd_num_strat;
17769
  input  [6:0]  rx_bd_num_end;
17770
  integer       i;
17771
  integer       bd_status_addr, tmp;
17772
begin
17773
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17774
  begin
17775 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17776
    bd_status_addr = `TX_BD_BASE + i * 8;
17777 169 mohor
    wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17778
    // set empty bit to this BD - this BD should be ready
17779
    wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17780 116 mohor
  end
17781 169 mohor
end
17782
endtask // set_rx_bd_empty
17783 116 mohor
 
17784 169 mohor
task check_rx_bd;
17785
  input  [6:0]  rx_bd_num_end;
17786
  output [31:0] rx_bd_status;
17787
  integer       bd_status_addr, tmp;
17788
begin
17789 209 tadejm
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
17790
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
17791 169 mohor
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17792 274 tadejm
  rx_bd_status = tmp;
17793 169 mohor
end
17794
endtask // check_rx_bd
17795 116 mohor
 
17796 169 mohor
task clear_rx_bd;
17797
  input  [6:0]  rx_bd_num_strat;
17798
  input  [6:0]  rx_bd_num_end;
17799
  integer       i;
17800
  integer       bd_status_addr, bd_ptr_addr;
17801
begin
17802
  for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
17803
  begin
17804 209 tadejm
//    bd_status_addr = `RX_BD_BASE + i * 8;
17805
    bd_status_addr = `TX_BD_BASE + i * 8;
17806 169 mohor
    bd_ptr_addr = bd_status_addr + 4;
17807
    // clear BD - status
17808
    wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17809
    // clear BD - pointer
17810
    wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
17811
  end
17812
end
17813
endtask // clear_rx_bd
17814 116 mohor
 
17815 169 mohor
task set_tx_packet;
17816
  input  [31:0] txpnt;
17817
  input  [15:0] len;
17818
  input  [7:0]  eth_start_data;
17819
  integer       i, sd;
17820
  integer       buffer;
17821
  reg           delta_t;
17822
begin
17823
  buffer = txpnt;
17824
  sd = eth_start_data;
17825
  delta_t = 0;
17826 116 mohor
 
17827 169 mohor
  // First write might not be word allign.
17828
  if(buffer[1:0] == 1)
17829
  begin
17830
    wb_slave.wr_mem(buffer - 1, {8'h0, sd[7:0], sd[7:0] + 3'h1, sd[7:0] + 3'h2}, 4'h7);
17831
    sd = sd + 3;
17832
    i = 3;
17833
  end
17834
  else if(buffer[1:0] == 2)
17835
  begin
17836
    wb_slave.wr_mem(buffer - 2, {16'h0, sd[7:0], sd[7:0] + 3'h1}, 4'h3);
17837
    sd = sd + 2;
17838
    i = 2;
17839
  end
17840
  else if(buffer[1:0] == 3)
17841
  begin
17842
    wb_slave.wr_mem(buffer - 3, {24'h0, sd[7:0]}, 4'h1);
17843
    sd = sd + 1;
17844
    i = 1;
17845
  end
17846
  else
17847
    i = 0;
17848
  delta_t = !delta_t;
17849 116 mohor
 
17850 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not written
17851
  begin
17852
    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);
17853
    sd = sd + 4;
17854
  end
17855
  delta_t = !delta_t;
17856
 
17857
  // Last word
17858
  if((len - i) == 3)
17859 116 mohor
  begin
17860 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);
17861
  end
17862
  else if((len - i) == 2)
17863
  begin
17864
    wb_slave.wr_mem(buffer + i, {sd[7:0], sd[7:0] + 3'h1, 16'h0}, 4'hC);
17865
  end
17866
  else if((len - i) == 1)
17867
  begin
17868
    wb_slave.wr_mem(buffer + i, {sd[7:0], 24'h0}, 4'h8);
17869
  end
17870
  else if((len - i) == 4)
17871
  begin
17872
    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);
17873
  end
17874
  else
17875
    $display("(%0t)(%m) ERROR", $time);
17876
  delta_t = !delta_t;
17877
end
17878
endtask // set_tx_packet
17879
 
17880
task check_tx_packet;
17881
  input  [31:0] txpnt_wb;  // source
17882
  input  [31:0] txpnt_phy; // destination
17883
  input  [15:0] len;
17884
  output [31:0] failure;
17885
  integer       i, data_wb, data_phy;
17886
  reg    [31:0] addr_wb, addr_phy;
17887
  reg    [31:0] failure;
17888
  reg           delta_t;
17889
begin
17890
  addr_wb = txpnt_wb;
17891
  addr_phy = txpnt_phy;
17892
  delta_t = 0;
17893
  failure = 0;
17894 209 tadejm
  #1;
17895 169 mohor
  // First write might not be word allign.
17896
  if(addr_wb[1:0] == 1)
17897
  begin
17898
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
17899
    data_phy[31:24] = 0;
17900
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0]];
17901
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
17902
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
17903
    i = 3;
17904
    if (data_phy[23:0] !== data_wb[23:0])
17905
    begin
17906
      `TIME;
17907 209 tadejm
      $display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
17908
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17909 169 mohor
      failure = 1;
17910
    end
17911
  end
17912
  else if (addr_wb[1:0] == 2)
17913
  begin
17914
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
17915
    data_phy[31:16] = 0;
17916
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
17917
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
17918
    i = 2;
17919
    if (data_phy[15:0] !== data_wb[15:0])
17920
    begin
17921
      `TIME;
17922 209 tadejm
      $display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
17923
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17924 169 mohor
      failure = 1;
17925
    end
17926
  end
17927
  else if (addr_wb[1:0] == 3)
17928
  begin
17929
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
17930
    data_phy[31: 8] = 0;
17931
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
17932
    i = 1;
17933
    if (data_phy[7:0] !== data_wb[7:0])
17934
    begin
17935
      `TIME;
17936 209 tadejm
      $display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
17937
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17938 169 mohor
      failure = 1;
17939
    end
17940
  end
17941
  else
17942
    i = 0;
17943
  delta_t = !delta_t;
17944 209 tadejm
  #1;
17945 169 mohor
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
17946
  begin
17947
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
17948
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17949
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17950
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
17951
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
17952 279 mohor
 
17953 169 mohor
    if (data_phy[31:0] !== data_wb[31:0])
17954
    begin
17955
      `TIME;
17956 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]);
17957
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17958 169 mohor
      failure = failure + 1;
17959
    end
17960
  end
17961
  delta_t = !delta_t;
17962 209 tadejm
  #1;
17963 169 mohor
  // Last word
17964
  if((len - i) == 3)
17965
  begin
17966
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
17967
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17968
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17969
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
17970
    data_phy[ 7: 0] = 0;
17971
    if (data_phy[31:8] !== data_wb[31:8])
17972
    begin
17973
      `TIME;
17974 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]);
17975
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17976 169 mohor
      failure = failure + 1;
17977
    end
17978
  end
17979
  else if((len - i) == 2)
17980
  begin
17981
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
17982
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17983
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
17984
    data_phy[15: 8] = 0;
17985
    data_phy[ 7: 0] = 0;
17986
    if (data_phy[31:16] !== data_wb[31:16])
17987
    begin
17988
      `TIME;
17989 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]);
17990
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
17991 169 mohor
      failure = failure + 1;
17992
    end
17993
  end
17994
  else if((len - i) == 1)
17995
  begin
17996
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'h8);
17997
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
17998
    data_phy[23:16] = 0;
17999
    data_phy[15: 8] = 0;
18000
    data_phy[ 7: 0] = 0;
18001
    if (data_phy[31:24] !== data_wb[31:24])
18002
    begin
18003
      `TIME;
18004 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]);
18005
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18006 169 mohor
      failure = failure + 1;
18007
    end
18008
  end
18009
  else if((len - i) == 4)
18010
  begin
18011
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18012
    data_phy[31:24] = eth_phy.tx_mem[addr_phy[21:0] + i];
18013
    data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
18014
    data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
18015
    data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
18016
    if (data_phy[31:0] !== data_wb[31:0])
18017
    begin
18018
      `TIME;
18019 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]);
18020
      $display("     address phy: %0h, address wb: %0h", addr_phy, addr_wb);
18021 169 mohor
      failure = failure + 1;
18022
    end
18023
  end
18024
  else
18025
    $display("(%0t)(%m) ERROR", $time);
18026
  delta_t = !delta_t;
18027
end
18028
endtask // check_tx_packet
18029
 
18030
task set_rx_packet;
18031
  input  [31:0] rxpnt;
18032
  input  [15:0] len;
18033
  input         plus_dribble_nibble; // if length is longer for one nibble
18034
  input  [47:0] eth_dest_addr;
18035
  input  [47:0] eth_source_addr;
18036
  input  [15:0] eth_type_len;
18037
  input  [7:0]  eth_start_data;
18038
  integer       i, sd;
18039
  reg    [47:0] dest_addr;
18040
  reg    [47:0] source_addr;
18041
  reg    [15:0] type_len;
18042
  reg    [21:0] buffer;
18043
  reg           delta_t;
18044
begin
18045
  buffer = rxpnt[21:0];
18046
  dest_addr = eth_dest_addr;
18047
  source_addr = eth_source_addr;
18048
  type_len = eth_type_len;
18049
  sd = eth_start_data;
18050
  delta_t = 0;
18051
  for(i = 0; i < len; i = i + 1)
18052
  begin
18053
    if (i < 6)
18054
    begin
18055
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18056
      dest_addr = dest_addr << 8;
18057
    end
18058
    else if (i < 12)
18059
    begin
18060
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18061
      source_addr = source_addr << 8;
18062
    end
18063
    else if (i < 14)
18064
    begin
18065
      eth_phy.rx_mem[buffer] = type_len[15:8];
18066
      type_len = type_len << 8;
18067
    end
18068
    else
18069
    begin
18070
      eth_phy.rx_mem[buffer] = sd[7:0];
18071
      sd = sd + 1;
18072
    end
18073
    buffer = buffer + 1;
18074
  end
18075
  delta_t = !delta_t;
18076
  if (plus_dribble_nibble)
18077
    eth_phy.rx_mem[buffer] = {4'h0, 4'hD /*sd[3:0]*/};
18078
  delta_t = !delta_t;
18079
end
18080
endtask // set_rx_packet
18081
 
18082 267 mohor
task set_rx_control_packet;
18083
  input  [31:0] rxpnt;
18084
  input  [15:0] PauseTV;
18085
  integer       i;
18086
  reg    [47:0] dest_addr;
18087
  reg    [47:0] source_addr;
18088
  reg    [15:0] type_len;
18089
  reg    [21:0] buffer;
18090
  reg           delta_t;
18091
  reg    [15:0] PTV;
18092
  reg    [15:0] opcode;
18093
begin
18094
  buffer = rxpnt[21:0];
18095
  dest_addr = 48'h0180_c200_0001;
18096
  source_addr = 48'h0708_090A_0B0C;
18097
  type_len = 16'h8808;
18098
  opcode = 16'h0001;
18099
  PTV = PauseTV;
18100
  delta_t = 0;
18101
  for(i = 0; i < 60; i = i + 1)
18102
  begin
18103
    if (i < 6)
18104
    begin
18105
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18106
      dest_addr = dest_addr << 8;
18107
    end
18108
    else if (i < 12)
18109
    begin
18110
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18111
      source_addr = source_addr << 8;
18112
    end
18113
    else if (i < 14)
18114
    begin
18115
      eth_phy.rx_mem[buffer] = type_len[15:8];
18116
      type_len = type_len << 8;
18117
    end
18118
    else if (i < 16)
18119
    begin
18120
      eth_phy.rx_mem[buffer] = opcode[15:8];
18121
      opcode = opcode << 8;
18122
    end
18123
    else if (i < 18)
18124
    begin
18125
      eth_phy.rx_mem[buffer] = PTV[15:8];
18126
      PTV = PTV << 8;
18127
    end
18128
    else
18129
    begin
18130
      eth_phy.rx_mem[buffer] = 0;
18131
    end
18132
    buffer = buffer + 1;
18133
  end
18134
  delta_t = !delta_t;
18135
  append_rx_crc (rxpnt, 60, 1'b0, 1'b0); // CRC for control packet
18136
end
18137
endtask // set_rx_control_packet
18138
 
18139 243 tadejm
task set_rx_addr_type;
18140
  input  [31:0] rxpnt;
18141
  input  [47:0] eth_dest_addr;
18142
  input  [47:0] eth_source_addr;
18143
  input  [15:0] eth_type_len;
18144
  integer       i;
18145
  reg    [47:0] dest_addr;
18146
  reg    [47:0] source_addr;
18147
  reg    [15:0] type_len;
18148
  reg    [21:0] buffer;
18149
  reg           delta_t;
18150
begin
18151
  buffer = rxpnt[21:0];
18152
  dest_addr = eth_dest_addr;
18153
  source_addr = eth_source_addr;
18154
  type_len = eth_type_len;
18155
  delta_t = 0;
18156
  for(i = 0; i < 14; i = i + 1)
18157
  begin
18158
    if (i < 6)
18159
    begin
18160
      eth_phy.rx_mem[buffer] = dest_addr[47:40];
18161
      dest_addr = dest_addr << 8;
18162
    end
18163
    else if (i < 12)
18164
    begin
18165
      eth_phy.rx_mem[buffer] = source_addr[47:40];
18166
      source_addr = source_addr << 8;
18167
    end
18168
    else // if (i < 14)
18169
    begin
18170
      eth_phy.rx_mem[buffer] = type_len[15:8];
18171
      type_len = type_len << 8;
18172
    end
18173
    buffer = buffer + 1;
18174
  end
18175
  delta_t = !delta_t;
18176
end
18177
endtask // set_rx_addr_type
18178
 
18179 169 mohor
task check_rx_packet;
18180
  input  [31:0] rxpnt_phy; // source
18181
  input  [31:0] rxpnt_wb;  // destination
18182
  input  [15:0] len;
18183
  input         plus_dribble_nibble; // if length is longer for one nibble
18184
  input         successful_dribble_nibble; // if additional nibble is stored into memory
18185
  output [31:0] failure;
18186
  integer       i, data_wb, data_phy;
18187
  reg    [31:0] addr_wb, addr_phy;
18188
  reg    [31:0] failure;
18189
  reg    [21:0] buffer;
18190
  reg           delta_t;
18191
begin
18192
  addr_phy = rxpnt_phy;
18193
  addr_wb = rxpnt_wb;
18194
  delta_t = 0;
18195
  failure = 0;
18196
 
18197
  // First write might not be word allign.
18198
  if(addr_wb[1:0] == 1)
18199
  begin
18200
    wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
18201
    data_phy[31:24] = 0;
18202
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
18203
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18204
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
18205
    i = 3;
18206
    if (data_phy[23:0] !== data_wb[23:0])
18207
    begin
18208
      `TIME;
18209 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18210
      $display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
18211 169 mohor
      failure = 1;
18212
    end
18213
  end
18214
  else if (addr_wb[1:0] == 2)
18215
  begin
18216
    wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
18217
    data_phy[31:16] = 0;
18218
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
18219
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
18220
    i = 2;
18221
    if (data_phy[15:0] !== data_wb[15:0])
18222
    begin
18223
      `TIME;
18224 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18225
      $display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
18226 169 mohor
      failure = 1;
18227
    end
18228
  end
18229
  else if (addr_wb[1:0] == 3)
18230
  begin
18231
    wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
18232
    data_phy[31: 8] = 0;
18233
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
18234
    i = 1;
18235
    if (data_phy[7:0] !== data_wb[7:0])
18236
    begin
18237
      `TIME;
18238 243 tadejm
      $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18239
      $display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
18240 169 mohor
      failure = 1;
18241
    end
18242
  end
18243
  else
18244
    i = 0;
18245
  delta_t = !delta_t;
18246
 
18247
  for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
18248
  begin
18249
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18250
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18251
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18252
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18253
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18254
    if (data_phy[31:0] !== data_wb[31:0])
18255
    begin
18256
      `TIME;
18257 243 tadejm
      if (i == 0)
18258
        $display("   addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
18259
      $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]);
18260 169 mohor
      failure = failure + 1;
18261
    end
18262
  end
18263
  delta_t = !delta_t;
18264
 
18265
  // Last word
18266
  if((len - i) == 3)
18267
  begin
18268
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18269
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18270
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18271
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18272
    if (plus_dribble_nibble)
18273
      data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18274
    else
18275
      data_phy[ 7: 0] = 0;
18276
    if (data_phy[31:8] !== data_wb[31:8])
18277
    begin
18278
      `TIME;
18279 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]);
18280 169 mohor
      failure = failure + 1;
18281
    end
18282
    if (plus_dribble_nibble && successful_dribble_nibble)
18283
    begin
18284
      if (data_phy[3:0] !== data_wb[3:0])
18285 116 mohor
      begin
18286 169 mohor
        `TIME;
18287 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18288 169 mohor
        failure = failure + 1;
18289 116 mohor
      end
18290 169 mohor
    end
18291
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18292
    begin
18293
      if (data_phy[3:0] === data_wb[3:0])
18294 116 mohor
      begin
18295 169 mohor
        `TIME;
18296 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
18297 169 mohor
        failure = failure + 1;
18298 116 mohor
      end
18299 169 mohor
    end
18300
  end
18301
  else if((len - i) == 2)
18302
  begin
18303
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
18304
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18305
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18306
    if (plus_dribble_nibble)
18307
      data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18308
    else
18309
      data_phy[15: 8] = 0;
18310
    data_phy[ 7: 0] = 0;
18311
    if (data_phy[31:16] !== data_wb[31:16])
18312
    begin
18313
      `TIME;
18314 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]);
18315 169 mohor
      failure = failure + 1;
18316
    end
18317
    if (plus_dribble_nibble && successful_dribble_nibble)
18318
    begin
18319
      if (data_phy[11:8] !== data_wb[11:8])
18320
      begin
18321
        `TIME;
18322 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18323 169 mohor
        failure = failure + 1;
18324
      end
18325
    end
18326
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18327
    begin
18328
      if (data_phy[11:8] === data_wb[11:8])
18329
      begin
18330
        `TIME;
18331 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
18332 169 mohor
        failure = failure + 1;
18333
      end
18334
    end
18335
  end
18336
  else if((len - i) == 1)
18337
  begin
18338
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
18339
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18340
    if (plus_dribble_nibble)
18341
      data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18342
    else
18343
      data_phy[23:16] = 0;
18344
    data_phy[15: 8] = 0;
18345
    data_phy[ 7: 0] = 0;
18346
    if (data_phy[31:24] !== data_wb[31:24])
18347
    begin
18348
      `TIME;
18349 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]);
18350 169 mohor
      failure = failure + 1;
18351
    end
18352
    if (plus_dribble_nibble && successful_dribble_nibble)
18353
    begin
18354
      if (data_phy[19:16] !== data_wb[19:16])
18355
      begin
18356
        `TIME;
18357 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18358 169 mohor
        failure = failure + 1;
18359
      end
18360
    end
18361
    else if (plus_dribble_nibble && !successful_dribble_nibble)
18362
    begin
18363
      if (data_phy[19:16] === data_wb[19:16])
18364
      begin
18365
        `TIME;
18366 243 tadejm
        $display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
18367 169 mohor
        failure = failure + 1;
18368
      end
18369
    end
18370
  end
18371
  else if((len - i) == 4)
18372
  begin
18373
    wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
18374
    data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
18375
    data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
18376
    data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
18377
    data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
18378
    if (data_phy[31:0] !== data_wb[31:0])
18379
    begin
18380
      `TIME;
18381 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]);
18382 169 mohor
      failure = failure + 1;
18383
    end
18384
    if (plus_dribble_nibble)
18385
    begin
18386
      wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
18387
      data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
18388
      if (successful_dribble_nibble)
18389
      begin
18390
        if (data_phy[27:24] !== data_wb[27:24])
18391
        begin
18392
          `TIME;
18393 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18394 169 mohor
          failure = failure + 1;
18395
        end
18396
      end
18397
      else
18398
      begin
18399
        if (data_phy[27:24] === data_wb[27:24])
18400
        begin
18401
          `TIME;
18402 243 tadejm
          $display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
18403 169 mohor
          failure = failure + 1;
18404
        end
18405
      end
18406
    end
18407
  end
18408
  else
18409
    $display("(%0t)(%m) ERROR", $time);
18410
  delta_t = !delta_t;
18411
end
18412
endtask // check_rx_packet
18413 116 mohor
 
18414 169 mohor
//////////////////////////////////////////////////////////////
18415
// Ethernet CRC Basic tasks
18416
//////////////////////////////////////////////////////////////
18417
 
18418
task append_tx_crc;
18419
  input  [31:0] txpnt_wb;  // source
18420
  input  [15:0] len; // length in bytes without CRC
18421
  input         negated_crc; // if appended CRC is correct or not
18422
  reg    [31:0] crc;
18423
  reg    [31:0] addr_wb;
18424
  reg           delta_t;
18425
begin
18426 243 tadejm
  addr_wb = txpnt_wb + {16'h0, len};
18427 169 mohor
  delta_t = 0;
18428
  // calculate CRC from prepared packet
18429
  paralel_crc_mac(txpnt_wb, {16'h0, len}, 1'b0, crc);
18430
  if (negated_crc)
18431
    crc = ~crc;
18432
  delta_t = !delta_t;
18433
 
18434
  // Write might not be word allign.
18435
  if (addr_wb[1:0] == 1)
18436
  begin
18437
    wb_slave.wr_mem(addr_wb - 1, {8'h0, crc[7:0], crc[15:8], crc[23:16]}, 4'h7);
18438
    wb_slave.wr_mem(addr_wb + 3, {crc[31:24], 24'h0}, 4'h8);
18439 116 mohor
  end
18440 169 mohor
  else if (addr_wb[1:0] == 2)
18441
  begin
18442
    wb_slave.wr_mem(addr_wb - 2, {16'h0, crc[7:0], crc[15:8]}, 4'h3);
18443
    wb_slave.wr_mem(addr_wb + 2, {crc[23:16], crc[31:24], 16'h0}, 4'hC);
18444
  end
18445
  else if (addr_wb[1:0] == 3)
18446
  begin
18447
    wb_slave.wr_mem(addr_wb - 3, {24'h0, crc[7:0]}, 4'h1);
18448
    wb_slave.wr_mem(addr_wb + 1, {crc[15:8], crc[23:16], crc[31:24], 8'h0}, 4'hE);
18449
  end
18450
  else
18451
  begin
18452
    wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
18453
  end
18454
  delta_t = !delta_t;
18455
end
18456
endtask // append_tx_crc
18457 116 mohor
 
18458 169 mohor
task check_tx_crc; // used to check crc added to TX packets by MAC
18459
  input  [31:0] txpnt_phy; // destination
18460
  input  [15:0] len; // length in bytes without CRC
18461
  input         negated_crc; // if appended CRC is correct or not
18462
  output [31:0] failure;
18463
  reg    [31:0] failure;
18464
  reg    [31:0] crc_calc;
18465
  reg    [31:0] crc;
18466
  reg    [31:0] addr_phy;
18467
  reg           delta_t;
18468
begin
18469
  addr_phy = txpnt_phy;
18470
  failure = 0;
18471
  // calculate CRC from sent packet
18472
//  serial_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18473
//#10;
18474
  paralel_crc_phy_tx(addr_phy, {16'h0, len}, 1'b0, crc_calc);
18475 209 tadejm
  #1;
18476 169 mohor
  addr_phy = addr_phy + len;
18477
  // Read CRC - BIG endian
18478
  crc[31:24] = eth_phy.tx_mem[addr_phy[21:0]];
18479
  crc[23:16] = eth_phy.tx_mem[addr_phy[21:0] + 1];
18480
  crc[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 2];
18481
  crc[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 3];
18482
 
18483
  delta_t = !delta_t;
18484
  if (negated_crc)
18485
  begin
18486
    if ((~crc_calc) !== crc)
18487
    begin
18488
      `TIME;
18489
      $display("*E Negated CRC was not successfuly transmitted!");
18490
      failure = failure + 1;
18491
    end
18492
  end
18493
  else
18494
  begin
18495
    if (crc_calc !== crc)
18496
    begin
18497
      `TIME;
18498 209 tadejm
      $display("*E Transmitted CRC was not correct; crc_calc: %0h, crc_mem: %0h", crc_calc, crc);
18499 169 mohor
      failure = failure + 1;
18500
    end
18501
  end
18502
  delta_t = !delta_t;
18503
end
18504
endtask // check_tx_crc
18505
 
18506
task append_rx_crc;
18507
  input  [31:0] rxpnt_phy; // source
18508
  input  [15:0] len; // length in bytes without CRC
18509
  input         plus_dribble_nibble; // if length is longer for one nibble
18510
  input         negated_crc; // if appended CRC is correct or not
18511
  reg    [31:0] crc;
18512
  reg    [7:0]  tmp;
18513
  reg    [31:0] addr_phy;
18514
  reg           delta_t;
18515
begin
18516
  addr_phy = rxpnt_phy + len;
18517
  delta_t = 0;
18518
  // calculate CRC from prepared packet
18519
  paralel_crc_phy_rx(rxpnt_phy, {16'h0, len}, plus_dribble_nibble, crc);
18520
  if (negated_crc)
18521
    crc = ~crc;
18522
  delta_t = !delta_t;
18523
 
18524
  if (plus_dribble_nibble)
18525
  begin
18526
    tmp = eth_phy.rx_mem[addr_phy];
18527 209 tadejm
    eth_phy.rx_mem[addr_phy]     = {crc[27:24], tmp[3:0]};
18528
    eth_phy.rx_mem[addr_phy + 1] = {crc[19:16], crc[31:28]};
18529
    eth_phy.rx_mem[addr_phy + 2] = {crc[11:8], crc[23:20]};
18530
    eth_phy.rx_mem[addr_phy + 3] = {crc[3:0], crc[15:12]};
18531
    eth_phy.rx_mem[addr_phy + 4] = {4'h0, crc[7:4]};
18532 169 mohor
  end
18533
  else
18534
  begin
18535 209 tadejm
    eth_phy.rx_mem[addr_phy]     = crc[31:24];
18536
    eth_phy.rx_mem[addr_phy + 1] = crc[23:16];
18537
    eth_phy.rx_mem[addr_phy + 2] = crc[15:8];
18538
    eth_phy.rx_mem[addr_phy + 3] = crc[7:0];
18539 169 mohor
  end
18540
end
18541
endtask // append_rx_crc
18542
 
18543
// paralel CRC checking for PHY TX
18544
task paralel_crc_phy_tx;
18545
  input  [31:0] start_addr; // start address
18546
  input  [31:0] len; // length of frame in Bytes without CRC length
18547
  input         plus_dribble_nibble; // if length is longer for one nibble
18548
  output [31:0] crc_out;
18549
  reg    [21:0] addr_cnt; // only 22 address lines
18550
  integer       word_cnt;
18551
  integer       nibble_cnt;
18552
  reg    [31:0] load_reg;
18553
  reg           delta_t;
18554
  reg    [31:0] crc_next;
18555
  reg    [31:0] crc;
18556
  reg           crc_error;
18557
  reg     [3:0] data_in;
18558
  integer       i;
18559
begin
18560
  #1 addr_cnt = start_addr[21:0];
18561
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18562
  crc = 32'hFFFF_FFFF; // INITIAL value
18563
  delta_t = 0;
18564
  // length must include 4 bytes of ZEROs, to generate CRC
18565
  // get number of nibbles from Byte length (2^1 = 2)
18566
  if (plus_dribble_nibble)
18567
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18568
  else
18569
    nibble_cnt = ((len + 4) << 1);
18570
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18571
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18572
  addr_cnt = addr_cnt + 1;
18573
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18574
  addr_cnt = addr_cnt + 1;
18575
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18576
  addr_cnt = addr_cnt + 1;
18577
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18578
  addr_cnt = addr_cnt + 1;
18579
  while (nibble_cnt > 0)
18580
  begin
18581
    // wait for delta time
18582
    delta_t = !delta_t;
18583
    // shift data in
18584
 
18585
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18586
      data_in[3:0] = 4'h0;
18587
    else
18588
 
18589
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18590
    crc_next[0]  = (data_in[0] ^ crc[28]);
18591
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18592
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18593
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18594
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18595
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18596
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18597
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18598
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18599
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18600
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18601
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18602
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18603
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18604
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18605
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18606
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18607
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18608
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18609
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18610
    crc_next[20] =  crc[16];
18611
    crc_next[21] =  crc[17];
18612
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18613
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18614
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18615
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18616
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18617
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18618
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18619
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18620
    crc_next[30] =  crc[26];
18621
    crc_next[31] =  crc[27];
18622
 
18623
    crc = crc_next;
18624
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18625
    case (nibble_cnt)
18626
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18627
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18628
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18629
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18630
    default: crc_out = crc_out;
18631
    endcase
18632
    // wait for delta time
18633
    delta_t = !delta_t;
18634
    // increment address and load new data
18635
    if ((word_cnt+3) == 7)//4)
18636
    begin
18637
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18638
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18639
      addr_cnt = addr_cnt + 1;
18640
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18641
      addr_cnt = addr_cnt + 1;
18642
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18643
      addr_cnt = addr_cnt + 1;
18644
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18645
      addr_cnt = addr_cnt + 1;
18646
    end
18647
    // set new load bit position
18648
    if((word_cnt+3) == 31)
18649
      word_cnt = 16;
18650
    else if ((word_cnt+3) == 23)
18651
      word_cnt = 8;
18652
    else if ((word_cnt+3) == 15)
18653
      word_cnt = 0;
18654
    else if ((word_cnt+3) == 7)
18655
      word_cnt = 24;
18656
    else
18657
      word_cnt = word_cnt + 4;// - 4;
18658
    // decrement nibble counter
18659
    nibble_cnt = nibble_cnt - 1;
18660
    // wait for delta time
18661
    delta_t = !delta_t;
18662
  end // while
18663
  #1;
18664
end
18665
endtask // paralel_crc_phy_tx
18666
 
18667
// paralel CRC calculating for PHY RX
18668
task paralel_crc_phy_rx;
18669
  input  [31:0] start_addr; // start address
18670
  input  [31:0] len; // length of frame in Bytes without CRC length
18671
  input         plus_dribble_nibble; // if length is longer for one nibble
18672 209 tadejm
  output [31:0] crc_out;
18673 169 mohor
  reg    [21:0] addr_cnt; // only 22 address lines
18674
  integer       word_cnt;
18675 209 tadejm
  integer       nibble_cnt;
18676 169 mohor
  reg    [31:0] load_reg;
18677
  reg           delta_t;
18678 209 tadejm
  reg    [31:0] crc_next;
18679
  reg    [31:0] crc;
18680
  reg           crc_error;
18681
  reg     [3:0] data_in;
18682
  integer       i;
18683 169 mohor
begin
18684
  #1 addr_cnt = start_addr[21:0];
18685 209 tadejm
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18686
  crc = 32'hFFFF_FFFF; // INITIAL value
18687 169 mohor
  delta_t = 0;
18688
  // length must include 4 bytes of ZEROs, to generate CRC
18689 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
18690 169 mohor
  if (plus_dribble_nibble)
18691 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18692 169 mohor
  else
18693 209 tadejm
    nibble_cnt = ((len + 4) << 1);
18694
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18695 169 mohor
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
18696
  addr_cnt = addr_cnt + 1;
18697
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
18698
  addr_cnt = addr_cnt + 1;
18699 209 tadejm
  load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
18700 169 mohor
  addr_cnt = addr_cnt + 1;
18701 209 tadejm
  load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
18702
  addr_cnt = addr_cnt + 1;
18703
  while (nibble_cnt > 0)
18704 169 mohor
  begin
18705
    // wait for delta time
18706
    delta_t = !delta_t;
18707
    // shift data in
18708 209 tadejm
 
18709
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18710
      data_in[3:0] = 4'h0;
18711 169 mohor
    else
18712 209 tadejm
 
18713
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18714
    crc_next[0]  = (data_in[0] ^ crc[28]);
18715
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18716
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18717
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18718
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18719
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18720
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18721
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18722
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18723
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18724
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18725
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18726
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18727
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18728
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18729
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18730
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18731
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18732
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18733
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18734
    crc_next[20] =  crc[16];
18735
    crc_next[21] =  crc[17];
18736
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18737
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18738
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18739
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18740
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18741
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18742
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18743
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18744
    crc_next[30] =  crc[26];
18745
    crc_next[31] =  crc[27];
18746
 
18747
    crc = crc_next;
18748
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18749
    case (nibble_cnt)
18750
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18751
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18752
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18753
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18754
    default: crc_out = crc_out;
18755
    endcase
18756 169 mohor
    // wait for delta time
18757
    delta_t = !delta_t;
18758
    // increment address and load new data
18759 209 tadejm
    if ((word_cnt+3) == 7)//4)
18760 169 mohor
    begin
18761 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18762 169 mohor
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
18763
      addr_cnt = addr_cnt + 1;
18764
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
18765
      addr_cnt = addr_cnt + 1;
18766 209 tadejm
      load_reg[15: 8] = eth_phy.rx_mem[addr_cnt];
18767 169 mohor
      addr_cnt = addr_cnt + 1;
18768 209 tadejm
      load_reg[ 7: 0] = eth_phy.rx_mem[addr_cnt];
18769
      addr_cnt = addr_cnt + 1;
18770 169 mohor
    end
18771
    // set new load bit position
18772 209 tadejm
    if((word_cnt+3) == 31)
18773 169 mohor
      word_cnt = 16;
18774 209 tadejm
    else if ((word_cnt+3) == 23)
18775 169 mohor
      word_cnt = 8;
18776 209 tadejm
    else if ((word_cnt+3) == 15)
18777 169 mohor
      word_cnt = 0;
18778 209 tadejm
    else if ((word_cnt+3) == 7)
18779 169 mohor
      word_cnt = 24;
18780
    else
18781 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
18782
    // decrement nibble counter
18783
    nibble_cnt = nibble_cnt - 1;
18784 169 mohor
    // wait for delta time
18785
    delta_t = !delta_t;
18786
  end // while
18787
  #1;
18788
end
18789
endtask // paralel_crc_phy_rx
18790
 
18791
// paralel CRC checking for MAC
18792
task paralel_crc_mac;
18793
  input  [31:0] start_addr; // start address
18794
  input  [31:0] len; // length of frame in Bytes without CRC length
18795
  input         plus_dribble_nibble; // if length is longer for one nibble
18796 209 tadejm
  output [31:0] crc_out;
18797
 
18798
  reg    [21:0] addr_cnt; // only 22 address lines
18799 169 mohor
  integer       word_cnt;
18800 209 tadejm
  integer       nibble_cnt;
18801 169 mohor
  reg    [31:0] load_reg;
18802
  reg           delta_t;
18803 209 tadejm
  reg    [31:0] crc_next;
18804
  reg    [31:0] crc;
18805
  reg           crc_error;
18806
  reg     [3:0] data_in;
18807
  integer       i;
18808 169 mohor
begin
18809
  #1 addr_cnt = start_addr[19:0];
18810
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
18811
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
18812
  if (addr_cnt[1:0] == 2'h1)
18813
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18814
  else if (addr_cnt[1:0] == 2'h2)
18815
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18816
  else if (addr_cnt[1:0] == 2'h3)
18817
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18818
  else
18819
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
18820 209 tadejm
  crc = 32'hFFFF_FFFF; // INITIAL value
18821 169 mohor
  delta_t = 0;
18822
  // length must include 4 bytes of ZEROs, to generate CRC
18823 209 tadejm
  // get number of nibbles from Byte length (2^1 = 2)
18824 169 mohor
  if (plus_dribble_nibble)
18825 209 tadejm
    nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
18826 169 mohor
  else
18827 209 tadejm
    nibble_cnt = ((len + 4) << 1);
18828 169 mohor
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
18829 209 tadejm
  addr_cnt = addr_cnt + 4;
18830
  while (nibble_cnt > 0)
18831 169 mohor
  begin
18832
    // wait for delta time
18833
    delta_t = !delta_t;
18834
    // shift data in
18835 209 tadejm
 
18836
    if(nibble_cnt <= 8) // for additional 8 nibbles shift ZEROs in!
18837
      data_in[3:0] = 4'h0;
18838 169 mohor
    else
18839 209 tadejm
 
18840
      data_in[3:0] = {load_reg[word_cnt], load_reg[word_cnt+1], load_reg[word_cnt+2], load_reg[word_cnt+3]};
18841
    crc_next[0]  = (data_in[0] ^ crc[28]);
18842
    crc_next[1]  = (data_in[1] ^ data_in[0] ^ crc[28]    ^ crc[29]);
18843
    crc_next[2]  = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]);
18844
    crc_next[3]  = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]);
18845
    crc_next[4]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[0];
18846
    crc_next[5]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[1];
18847
    crc_next[6]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[ 2];
18848
    crc_next[7]  = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[3];
18849
    crc_next[8]  = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[4];
18850
    crc_next[9]  = (data_in[2] ^ data_in[1] ^ crc[29]    ^ crc[30]) ^ crc[5];
18851
    crc_next[10] = (data_in[3] ^ data_in[2] ^ data_in[0] ^ crc[28]  ^ crc[30] ^ crc[31]) ^ crc[6];
18852
    crc_next[11] = (data_in[3] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[31]) ^ crc[7];
18853
    crc_next[12] = (data_in[2] ^ data_in[1] ^ data_in[0] ^ crc[28]  ^ crc[29] ^ crc[30]) ^ crc[8];
18854
    crc_next[13] = (data_in[3] ^ data_in[2] ^ data_in[1] ^ crc[29]  ^ crc[30] ^ crc[31]) ^ crc[9];
18855
    crc_next[14] = (data_in[3] ^ data_in[2] ^ crc[30]    ^ crc[31]) ^ crc[10];
18856
    crc_next[15] = (data_in[3] ^ crc[31])   ^ crc[11];
18857
    crc_next[16] = (data_in[0] ^ crc[28])   ^ crc[12];
18858
    crc_next[17] = (data_in[1] ^ crc[29])   ^ crc[13];
18859
    crc_next[18] = (data_in[2] ^ crc[30])   ^ crc[14];
18860
    crc_next[19] = (data_in[3] ^ crc[31])   ^ crc[15];
18861
    crc_next[20] =  crc[16];
18862
    crc_next[21] =  crc[17];
18863
    crc_next[22] = (data_in[0] ^ crc[28])   ^ crc[18];
18864
    crc_next[23] = (data_in[1] ^ data_in[0] ^ crc[29]    ^ crc[28]) ^ crc[19];
18865
    crc_next[24] = (data_in[2] ^ data_in[1] ^ crc[30]    ^ crc[29]) ^ crc[20];
18866
    crc_next[25] = (data_in[3] ^ data_in[2] ^ crc[31]    ^ crc[30]) ^ crc[21];
18867
    crc_next[26] = (data_in[3] ^ data_in[0] ^ crc[31]    ^ crc[28]) ^ crc[22];
18868
    crc_next[27] = (data_in[1] ^ crc[29])   ^ crc[23];
18869
    crc_next[28] = (data_in[2] ^ crc[30])   ^ crc[24];
18870
    crc_next[29] = (data_in[3] ^ crc[31])   ^ crc[25];
18871
    crc_next[30] =  crc[26];
18872
    crc_next[31] =  crc[27];
18873
 
18874
    crc = crc_next;
18875
    crc_error = crc[31:0] != 32'hc704dd7b;  // CRC not equal to magic number
18876
    case (nibble_cnt)
18877
    9: crc_out = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
18878
                  !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
18879
                  !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
18880
                  !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
18881
    default: crc_out = crc_out;
18882
    endcase
18883 169 mohor
    // wait for delta time
18884
    delta_t = !delta_t;
18885 209 tadejm
    // increment address and load new data
18886
    if ((word_cnt+3) == 7)//4)
18887 169 mohor
    begin
18888 209 tadejm
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18889
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
18890 169 mohor
      addr_cnt = addr_cnt + 4;
18891
    end
18892 209 tadejm
    // set new load bit position
18893
    if((word_cnt+3) == 31)
18894 169 mohor
      word_cnt = 16;
18895 209 tadejm
    else if ((word_cnt+3) == 23)
18896 169 mohor
      word_cnt = 8;
18897 209 tadejm
    else if ((word_cnt+3) == 15)
18898 169 mohor
      word_cnt = 0;
18899 209 tadejm
    else if ((word_cnt+3) == 7)
18900 169 mohor
      word_cnt = 24;
18901
    else
18902 209 tadejm
      word_cnt = word_cnt + 4;// - 4;
18903
    // decrement nibble counter
18904
    nibble_cnt = nibble_cnt - 1;
18905 169 mohor
    // wait for delta time
18906
    delta_t = !delta_t;
18907
  end // while
18908
  #1;
18909
end
18910
endtask // paralel_crc_mac
18911
 
18912
// serial CRC checking for PHY TX
18913
task serial_crc_phy_tx;
18914
  input  [31:0] start_addr; // start address
18915
  input  [31:0] len; // length of frame in Bytes without CRC length
18916
  input         plus_dribble_nibble; // if length is longer for one nibble
18917
  output [31:0] crc;
18918
  reg    [21:0] addr_cnt; // only 22 address lines
18919
  integer       word_cnt;
18920
  integer       bit_cnt;
18921
  reg    [31:0] load_reg;
18922
  reg    [31:0] crc_shift_reg;
18923
  reg    [31:0] crc_store_reg;
18924
  reg           delta_t;
18925
begin
18926
  #1 addr_cnt = start_addr[21:0];
18927
  word_cnt = 24; // 27; // start of the frame - nibble granularity (MSbit first)
18928
  crc_store_reg = 32'hFFFF_FFFF; // INITIAL value
18929
  delta_t = 0;
18930
  // length must include 4 bytes of ZEROs, to generate CRC
18931
  // get number of bits from Byte length (2^3 = 8)
18932
  if (plus_dribble_nibble)
18933
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
18934
  else
18935
    bit_cnt = ((len + 4) << 3);
18936
  // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
18937
  load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
18938
  addr_cnt = addr_cnt + 1;
18939
  load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
18940
  addr_cnt = addr_cnt + 1;
18941
  load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
18942
  addr_cnt = addr_cnt + 1;
18943
  load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
18944
  addr_cnt = addr_cnt + 1;
18945
#1;
18946
  while (bit_cnt > 0)
18947
  begin
18948
    // wait for delta time
18949
    delta_t = !delta_t;
18950
#1;
18951
    // shift data in
18952
 
18953
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
18954
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
18955
    else
18956
 
18957
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
18958
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
18959
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
18960
    crc_shift_reg[3]  = crc_store_reg[2];
18961
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
18962
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
18963
    crc_shift_reg[6]  = crc_store_reg[5];
18964
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
18965
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
18966
    crc_shift_reg[9]  = crc_store_reg[8];
18967
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
18968
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
18969
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
18970
    crc_shift_reg[13] = crc_store_reg[12];
18971
    crc_shift_reg[14] = crc_store_reg[13];
18972
    crc_shift_reg[15] = crc_store_reg[14];
18973
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
18974
    crc_shift_reg[17] = crc_store_reg[16];
18975
    crc_shift_reg[18] = crc_store_reg[17];
18976
    crc_shift_reg[19] = crc_store_reg[18];
18977
    crc_shift_reg[20] = crc_store_reg[19];
18978
    crc_shift_reg[21] = crc_store_reg[20];
18979
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
18980
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
18981
    crc_shift_reg[24] = crc_store_reg[23];
18982
    crc_shift_reg[25] = crc_store_reg[24];
18983
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
18984
    crc_shift_reg[27] = crc_store_reg[26];
18985
    crc_shift_reg[28] = crc_store_reg[27];
18986
    crc_shift_reg[29] = crc_store_reg[28];
18987
    crc_shift_reg[30] = crc_store_reg[29];
18988
    crc_shift_reg[31] = crc_store_reg[30];
18989
    // wait for delta time
18990
    delta_t = !delta_t;
18991
 
18992
    // store previous data
18993
    crc_store_reg = crc_shift_reg;
18994
 
18995
    // put CRC out
18996
    case (bit_cnt)
18997
    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:
18998
    begin
18999
      crc = crc_store_reg;
19000
      crc = {!crc[24], !crc[25], !crc[26], !crc[27], !crc[28], !crc[29], !crc[30], !crc[31],
19001
             !crc[16], !crc[17], !crc[18], !crc[19], !crc[20], !crc[21], !crc[22], !crc[23],
19002
             !crc[ 8], !crc[ 9], !crc[10], !crc[11], !crc[12], !crc[13], !crc[14], !crc[15],
19003
             !crc[ 0], !crc[ 1], !crc[ 2], !crc[ 3], !crc[ 4], !crc[ 5], !crc[ 6], !crc[ 7]};
19004
    end
19005
    default: crc = crc;
19006
    endcase
19007
 
19008
    // increment address and load new data
19009
#1;
19010
    if (word_cnt == 7)//4)
19011
    begin
19012
      // because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
19013
      load_reg[31:24] = eth_phy.tx_mem[addr_cnt];
19014
//      load_reg[31:24] = {load_reg[28], load_reg[29], load_reg[30], load_reg[31], 
19015
//                         load_reg[24], load_reg[25], load_reg[26], load_reg[27]};
19016
      addr_cnt = addr_cnt + 1;
19017
      load_reg[23:16] = eth_phy.tx_mem[addr_cnt];
19018
//      load_reg[23:16] = {load_reg[20], load_reg[21], load_reg[22], load_reg[23], 
19019
//                         load_reg[16], load_reg[17], load_reg[18], load_reg[19]};
19020
      addr_cnt = addr_cnt + 1;
19021
      load_reg[15: 8] = eth_phy.tx_mem[addr_cnt];
19022
//      load_reg[15: 8] = {load_reg[12], load_reg[13], load_reg[14], load_reg[15], 
19023
//                         load_reg[ 8], load_reg[ 9], load_reg[10], load_reg[11]};
19024
      addr_cnt = addr_cnt + 1;
19025
      load_reg[ 7: 0] = eth_phy.tx_mem[addr_cnt];
19026
//      load_reg[ 7: 0] = {load_reg[ 4], load_reg[ 5], load_reg[ 6], load_reg[ 7], 
19027
//                         load_reg[ 0], load_reg[ 1], load_reg[ 2], load_reg[ 3]};
19028
      addr_cnt = addr_cnt + 1;
19029
    end
19030
#1;
19031
    // set new load bit position
19032
    if(word_cnt == 31)
19033
      word_cnt = 16;
19034
    else if (word_cnt == 23)
19035
      word_cnt = 8;
19036
    else if (word_cnt == 15)
19037
      word_cnt = 0;
19038
    else if (word_cnt == 7)
19039
      word_cnt = 24;
19040
 
19041
//   if(word_cnt == 24)
19042
//     word_cnt = 31;
19043
//   else if (word_cnt == 28)
19044
//     word_cnt = 19;
19045
//   else if (word_cnt == 16)
19046
//     word_cnt = 23;
19047
//   else if (word_cnt == 20)
19048
//     word_cnt = 11;
19049
//   else if(word_cnt == 8)
19050
//     word_cnt = 15;
19051
//   else if (word_cnt == 12)
19052
//     word_cnt = 3;
19053
//   else if (word_cnt == 0)
19054
//     word_cnt = 7;
19055
//   else if (word_cnt == 4)
19056
//     word_cnt = 27;
19057
    else
19058
      word_cnt = word_cnt + 1;// - 1;
19059
#1;
19060
    // decrement bit counter
19061
    bit_cnt = bit_cnt - 1;
19062
#1;
19063
    // wait for delta time
19064
    delta_t = !delta_t;
19065
  end // while
19066
 
19067
  #1;
19068
end
19069
endtask // serial_crc_phy_tx
19070
 
19071
// serial CRC calculating for PHY RX
19072
task serial_crc_phy_rx;
19073
  input  [31:0] start_addr; // start address
19074
  input  [31:0] len; // length of frame in Bytes without CRC length
19075
  input         plus_dribble_nibble; // if length is longer for one nibble
19076
  output [31:0] crc;
19077
  reg    [21:0] addr_cnt; // only 22 address lines
19078
  integer       word_cnt;
19079
  integer       bit_cnt;
19080
  reg    [31:0] load_reg;
19081
  reg    [31:0] crc_shift_reg;
19082
  reg    [31:0] crc_store_reg;
19083
  reg           delta_t;
19084
begin
19085
  #1 addr_cnt = start_addr[21:0];
19086
  word_cnt = 24; // start of the frame
19087
  crc_shift_reg = 0;
19088
  delta_t = 0;
19089
  // length must include 4 bytes of ZEROs, to generate CRC
19090
  // get number of bits from Byte length (2^3 = 8)
19091
  if (plus_dribble_nibble)
19092
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19093
  else
19094
    bit_cnt = ((len + 4) << 3);
19095
  load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19096
  addr_cnt = addr_cnt + 1;
19097
  load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19098
  addr_cnt = addr_cnt + 1;
19099
  load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19100
  addr_cnt = addr_cnt + 1;
19101
  load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19102
 
19103
  while (bit_cnt > 0)
19104
  begin
19105
    // wait for delta time
19106
    delta_t = !delta_t;
19107
    // store previous data
19108
    crc_store_reg = crc_shift_reg;
19109
    // shift data in
19110
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19111
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19112
    else
19113
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19114
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19115
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19116
    crc_shift_reg[3]  = crc_store_reg[2];
19117
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19118
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19119
    crc_shift_reg[6]  = crc_store_reg[5];
19120
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19121
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19122
    crc_shift_reg[9]  = crc_store_reg[8];
19123
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19124
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19125
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19126
    crc_shift_reg[13] = crc_store_reg[12];
19127
    crc_shift_reg[14] = crc_store_reg[13];
19128
    crc_shift_reg[15] = crc_store_reg[14];
19129
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19130
    crc_shift_reg[17] = crc_store_reg[16];
19131
    crc_shift_reg[18] = crc_store_reg[17];
19132
    crc_shift_reg[19] = crc_store_reg[18];
19133
    crc_shift_reg[20] = crc_store_reg[19];
19134
    crc_shift_reg[21] = crc_store_reg[20];
19135
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19136
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19137
    crc_shift_reg[24] = crc_store_reg[23];
19138
    crc_shift_reg[25] = crc_store_reg[24];
19139
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19140
    crc_shift_reg[27] = crc_store_reg[26];
19141
    crc_shift_reg[28] = crc_store_reg[27];
19142
    crc_shift_reg[29] = crc_store_reg[28];
19143
    crc_shift_reg[30] = crc_store_reg[29];
19144
    crc_shift_reg[31] = crc_store_reg[30];
19145
    // wait for delta time
19146
    delta_t = !delta_t;
19147
    // increment address and load new data
19148
    if (word_cnt == 7)
19149
    begin
19150
      addr_cnt = addr_cnt + 1;
19151
      load_reg[31:24] = eth_phy.rx_mem[addr_cnt];
19152
      addr_cnt = addr_cnt + 1;
19153
      load_reg[23:16] = eth_phy.rx_mem[addr_cnt];
19154
      addr_cnt = addr_cnt + 1;
19155
      load_reg[15:8]  = eth_phy.rx_mem[addr_cnt];
19156
      addr_cnt = addr_cnt + 1;
19157
      load_reg[7:0]   = eth_phy.rx_mem[addr_cnt];
19158
    end
19159
    // set new load bit position
19160
    if(word_cnt == 31)
19161
      word_cnt = 16;
19162
    else if (word_cnt == 23)
19163
      word_cnt = 8;
19164
    else if (word_cnt == 15)
19165
      word_cnt = 0;
19166
    else if (word_cnt == 7)
19167
      word_cnt = 24;
19168
    else
19169
      word_cnt = word_cnt + 1;
19170
    // decrement bit counter
19171
    bit_cnt = bit_cnt - 1;
19172
    // wait for delta time
19173
    delta_t = !delta_t;
19174
  end // while
19175
 
19176
  // put CRC out
19177
  crc = crc_shift_reg;
19178
  #1;
19179
end
19180
endtask // serial_crc_phy_rx
19181
 
19182
// serial CRC checking for MAC
19183
task serial_crc_mac;
19184
  input  [31:0] start_addr; // start address
19185
  input  [31:0] len; // length of frame in Bytes without CRC length
19186
  input         plus_dribble_nibble; // if length is longer for one nibble
19187
  output [31:0] crc;
19188
  reg    [19:0] addr_cnt; // only 20 address lines
19189
  integer       word_cnt;
19190
  integer       bit_cnt;
19191
  reg    [31:0] load_reg;
19192
  reg    [31:0] crc_shift_reg;
19193
  reg    [31:0] crc_store_reg;
19194
  reg           delta_t;
19195
begin
19196
  #1 addr_cnt = start_addr[19:0];
19197
  // set starting point depending with which byte frame starts (e.g. if addr_cnt[1:0] == 0, then
19198
  //   MSB of the packet must be written to the LSB of Big ENDIAN Word [31:24])
19199
  if (addr_cnt[1:0] == 2'h1)
19200
    word_cnt = 16; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19201
  else if (addr_cnt[1:0] == 2'h2)
19202
    word_cnt = 8; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19203
  else if (addr_cnt[1:0] == 2'h3)
19204
    word_cnt = 0; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19205
  else
19206
    word_cnt = 24; // start of the frame for Big ENDIAN Bytes (Litle ENDIAN bits)
19207
 
19208
  crc_shift_reg = 0;
19209
  delta_t = 0;
19210
  // length must include 4 bytes of ZEROs, to generate CRC
19211
  // get number of bits from Byte length (2^3 = 8)
19212
  if (plus_dribble_nibble)
19213
    bit_cnt = ((len + 4) << 3) + 3'h4; // one nibble longer
19214
  else
19215
    bit_cnt = ((len + 4) << 3);
19216
  load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19217
 
19218
  while (bit_cnt > 0)
19219
  begin
19220
    // wait for delta time
19221
    delta_t = !delta_t;
19222
    // store previous data
19223
    crc_store_reg = crc_shift_reg;
19224
    // shift data in
19225
    if(bit_cnt <= 32) // for additional 32 bits shift ZEROs in!
19226
     crc_shift_reg[0] = 1'b0               ^ crc_store_reg[31];
19227
    else
19228
     crc_shift_reg[0] = load_reg[word_cnt] ^ crc_store_reg[31];
19229
    crc_shift_reg[1]  = crc_store_reg[0]   ^ crc_store_reg[31];
19230
    crc_shift_reg[2]  = crc_store_reg[1]   ^ crc_store_reg[31];
19231
    crc_shift_reg[3]  = crc_store_reg[2];
19232
    crc_shift_reg[4]  = crc_store_reg[3]   ^ crc_store_reg[31];
19233
    crc_shift_reg[5]  = crc_store_reg[4]   ^ crc_store_reg[31];
19234
    crc_shift_reg[6]  = crc_store_reg[5];
19235
    crc_shift_reg[7]  = crc_store_reg[6]   ^ crc_store_reg[31];
19236
    crc_shift_reg[8]  = crc_store_reg[7]   ^ crc_store_reg[31];
19237
    crc_shift_reg[9]  = crc_store_reg[8];
19238
    crc_shift_reg[10] = crc_store_reg[9]   ^ crc_store_reg[31];
19239
    crc_shift_reg[11] = crc_store_reg[10]  ^ crc_store_reg[31];
19240
    crc_shift_reg[12] = crc_store_reg[11]  ^ crc_store_reg[31];
19241
    crc_shift_reg[13] = crc_store_reg[12];
19242
    crc_shift_reg[14] = crc_store_reg[13];
19243
    crc_shift_reg[15] = crc_store_reg[14];
19244
    crc_shift_reg[16] = crc_store_reg[15]  ^ crc_store_reg[31];
19245
    crc_shift_reg[17] = crc_store_reg[16];
19246
    crc_shift_reg[18] = crc_store_reg[17];
19247
    crc_shift_reg[19] = crc_store_reg[18];
19248
    crc_shift_reg[20] = crc_store_reg[19];
19249
    crc_shift_reg[21] = crc_store_reg[20];
19250
    crc_shift_reg[22] = crc_store_reg[21]  ^ crc_store_reg[31];
19251
    crc_shift_reg[23] = crc_store_reg[22]  ^ crc_store_reg[31];
19252
    crc_shift_reg[24] = crc_store_reg[23];
19253
    crc_shift_reg[25] = crc_store_reg[24];
19254
    crc_shift_reg[26] = crc_store_reg[25]  ^ crc_store_reg[31];
19255
    crc_shift_reg[27] = crc_store_reg[26];
19256
    crc_shift_reg[28] = crc_store_reg[27];
19257
    crc_shift_reg[29] = crc_store_reg[28];
19258
    crc_shift_reg[30] = crc_store_reg[29];
19259
    crc_shift_reg[31] = crc_store_reg[30];
19260
    // wait for delta time
19261
    delta_t = !delta_t;
19262
    // increment address and load new data for Big ENDIAN Bytes (Litle ENDIAN bits)
19263
    if (word_cnt == 7)
19264
    begin
19265
      addr_cnt = addr_cnt + 4;
19266
      load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
19267
    end
19268
    // set new load bit position for Big ENDIAN Bytes (Litle ENDIAN bits)
19269
    if(word_cnt == 31)
19270
      word_cnt = 16;
19271
    else if (word_cnt == 23)
19272
      word_cnt = 8;
19273
    else if (word_cnt == 15)
19274
      word_cnt = 0;
19275
    else if (word_cnt == 7)
19276
      word_cnt = 24;
19277
    else
19278
      word_cnt = word_cnt + 1;
19279
    // decrement bit counter
19280
    bit_cnt = bit_cnt - 1;
19281
    // wait for delta time
19282
    delta_t = !delta_t;
19283
  end // while
19284
 
19285
  // put CRC out
19286
  crc = crc_shift_reg;
19287
  #1;
19288
end
19289
endtask // serial_crc_mac
19290
 
19291
//////////////////////////////////////////////////////////////
19292
// MIIM Basic tasks
19293
//////////////////////////////////////////////////////////////
19294
 
19295
task reset_mii; //  MII module
19296
  reg [31:0] tmp;
19297
  reg [31:0] tmp_no_rst;
19298
begin
19299
  // read MII mode register first
19300
  wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19301
  // set reset bit - write back to MII mode register with RESET bit
19302
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19303
  // clear reset bit - write back to MII mode register without RESET bit
19304
  tmp_no_rst = `ETH_MIIMODER_RST;
19305
  tmp_no_rst = ~tmp_no_rst;
19306
  wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19307
end
19308
endtask // reset_mii
19309
 
19310
task mii_set_clk_div; // set clock divider for MII clock
19311
  input [7:0]  clk_div;
19312
begin
19313
  // MII mode register
19314
  wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19315
end
19316
endtask // mii_set_clk_div
19317
 
19318
 
19319
task check_mii_busy; // MII - check if BUSY
19320
  reg [31:0] tmp;
19321
begin
19322
  @(posedge wb_clk);
19323
  // MII read status register
19324
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19325
  while(tmp[`ETH_MIISTATUS_BUSY] !== 1'b0) //`ETH_MIISTATUS_BUSY
19326
  begin
19327
    @(posedge wb_clk);
19328
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19329
  end
19330
end
19331
endtask // check_mii_busy
19332
 
19333
 
19334
task check_mii_scan_valid; // MII - check if SCAN data are valid
19335
  reg [31:0] tmp;
19336
begin
19337
  @(posedge wb_clk);
19338
  // MII read status register
19339
  wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19340
  while(tmp[`ETH_MIISTATUS_NVALID] !== 1'b0) //`ETH_MIISTATUS_NVALID
19341
  begin
19342
    @(posedge wb_clk);
19343
    wbm_read(`ETH_MIISTATUS, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19344
  end
19345
end
19346
endtask // check_mii_scan_valid
19347
 
19348
 
19349
task mii_write_req; // requests write to MII
19350
  input [4:0]  phy_addr;
19351
  input [4:0]  reg_addr;
19352
  input [15:0] data_in;
19353
begin
19354
  // MII address, PHY address = 1, command register address = 0
19355
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19356
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19357
  // MII TX data
19358
  wbm_write(`ETH_MIITX_DATA, {16'h0000, data_in}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19359
  // MII command
19360
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_WCTRLDATA, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19361
  @(posedge wb_clk);
19362
end
19363
endtask // mii_write_req
19364
 
19365
 
19366
task mii_read_req; // requests read from MII
19367
  input [4:0]  phy_addr;
19368
  input [4:0]  reg_addr;
19369
begin
19370
  // MII address, PHY address = 1, command register address = 0
19371
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19372
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19373
  // MII command
19374
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_RSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19375
  @(posedge wb_clk);
19376
end
19377
endtask // mii_read_req
19378
 
19379
 
19380
task mii_scan_req; // requests scan from MII
19381
  input [4:0]  phy_addr;
19382
  input [4:0]  reg_addr;
19383
begin
19384
  // MII address, PHY address = 1, command register address = 0
19385
  wbm_write(`ETH_MIIADDRESS, (`ETH_MIIADDRESS_FIAD & phy_addr) | (`ETH_MIIADDRESS_RGAD & (reg_addr << 8)),
19386
            4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19387
  // MII command
19388
  wbm_write(`ETH_MIICOMMAND, `ETH_MIICOMMAND_SCANSTAT, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19389
  @(posedge wb_clk);
19390
end
19391
endtask // mii_scan_req
19392
 
19393
 
19394
task mii_scan_finish; // finish scan from MII
19395
begin
19396
  // MII command
19397
  wbm_write(`ETH_MIICOMMAND, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
19398
  @(posedge wb_clk);
19399
end
19400
endtask // mii_scan_finish
19401
 
19402
//////////////////////////////////////////////////////////////
19403
// Log files and memory tasks
19404
//////////////////////////////////////////////////////////////
19405
 
19406
task clear_memories;
19407
  reg    [22:0]  adr_i;
19408
  reg            delta_t;
19409
begin
19410
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
19411
  begin
19412
    eth_phy.rx_mem[adr_i[21:0]] = 0;
19413
    eth_phy.tx_mem[adr_i[21:0]] = 0;
19414
    wb_slave.wb_memory[adr_i[21:2]] = 0;
19415
  end
19416
end
19417
endtask // clear_memories
19418
 
19419 243 tadejm
task clear_buffer_descriptors;
19420
  reg    [8:0]  adr_i;
19421
  reg            delta_t;
19422
begin
19423
  delta_t = 0;
19424
  for (adr_i = 0; adr_i < 256; adr_i = adr_i + 1)
19425
  begin
19426
    wbm_write((`TX_BD_BASE + {adr_i[7:0], 2'b0}), 32'h0, 4'hF, 1, 4'h1, 4'h1);
19427
    delta_t = !delta_t;
19428
  end
19429
end
19430
endtask // clear_buffer_descriptors
19431
 
19432 169 mohor
task test_note;
19433
  input [799:0] test_note ;
19434
  reg   [799:0] display_note ;
19435
begin
19436
  display_note = test_note;
19437
  while ( display_note[799:792] == 0 )
19438
    display_note = display_note << 8 ;
19439
  $fdisplay( tb_log_file, " " ) ;
19440
  $fdisplay( tb_log_file, "NOTE: %s", display_note ) ;
19441
  $fdisplay( tb_log_file, " " ) ;
19442
end
19443
endtask // test_note
19444
 
19445
task test_heading;
19446
  input [799:0] test_heading ;
19447
  reg   [799:0] display_test ;
19448
begin
19449
  display_test = test_heading;
19450
  while ( display_test[799:792] == 0 )
19451
    display_test = display_test << 8 ;
19452
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19453
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19454
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
19455
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19456
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
19457
  $fdisplay( tb_log_file, " " ) ;
19458
end
19459
endtask // test_heading
19460
 
19461
 
19462
task test_fail ;
19463
  input [7999:0] failure_reason ;
19464
//  reg   [8007:0] display_failure ;
19465
  reg   [7999:0] display_failure ;
19466
  reg   [799:0] display_test ;
19467
begin
19468
  tests_failed = tests_failed + 1 ;
19469
 
19470
  display_failure = failure_reason; // {failure_reason, "!"} ;
19471
  while ( display_failure[7999:7992] == 0 )
19472
    display_failure = display_failure << 8 ;
19473
 
19474
  display_test = test_name ;
19475
  while ( display_test[799:792] == 0 )
19476
    display_test = display_test << 8 ;
19477
 
19478
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19479
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19480
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19481
  $fdisplay( tb_log_file, "    *FAILED* because") ;
19482
  $fdisplay( tb_log_file, "    %s", display_failure ) ;
19483
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19484
  $fdisplay( tb_log_file, " " ) ;
19485
 
19486
 `ifdef STOP_ON_FAILURE
19487
    #20 $stop ;
19488
 `endif
19489
end
19490
endtask // test_fail
19491
 
19492
 
19493
task test_ok ;
19494
  reg [799:0] display_test ;
19495
begin
19496
  tests_successfull = tests_successfull + 1 ;
19497
 
19498
  display_test = test_name ;
19499
  while ( display_test[799:792] == 0 )
19500
    display_test = display_test << 8 ;
19501
 
19502
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19503
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
19504
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
19505
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
19506
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
19507
  $fdisplay( tb_log_file, " " ) ;
19508
end
19509
endtask // test_ok
19510
 
19511
 
19512
task test_summary;
19513
begin
19514
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19515
  $fdisplay(tb_log_file, "Tests performed:   %d", tests_successfull + tests_failed) ;
19516
  $fdisplay(tb_log_file, "Failed tests   :   %d", tests_failed) ;
19517
  $fdisplay(tb_log_file, "Successfull tests: %d", tests_successfull) ;
19518
  $fdisplay(tb_log_file, "**************************** Ethernet MAC test summary **********************************") ;
19519
  $fclose(tb_log_file) ;
19520
end
19521
endtask // test_summary
19522
 
19523
 
19524 116 mohor
endmodule

powered by: WebSVN 2.1.0

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