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

Subversion Repositories sdcard_mass_storage_controller

[/] [sdcard_mass_storage_controller/] [trunk/] [bench/] [sdc_dma/] [verilog/] [sd_controller_top_tb.v] - Blame information for rev 135

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

Line No. Rev Author Line
1 135 tac2
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  sd_controller_top_tb.v                                      ////
4
////                                                              ////
5
////  This file is part of the SD IP core project                 ////
6
//// http://www.opencores.org/?do=project&who=sdcard_mass_storage_controller                   ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Adam Edvardsson, adam@opencores.org                   ////
10
////                                                              ////
11
////                                                              ////
12
//////////////////////////////////////////////////////////////////////
13
//// WB Model, ideas and task borrowed from:                    ////
14
//// http://www.opencores.org/projects/ethmac/                    ////
15
////  Author(s):                                                  ////
16
////      - Tadej Markovic, tadej@opencores.org                   ////
17
////      - Igor Mohor,     igorM@opencores.org                   ////
18
//////////////////////////////////////////////////////////////////////
19
////                  
20
                                            ////
21
//// Copyright (C) 2001, 2002 Authors                             ////
22
////                                                              ////
23
//// This source file may be used and distributed without         ////
24
//// restriction provided that this copyright statement is not    ////
25
//// removed from the file and that any derivative work contains  ////
26
//// the original copyright notice and the associated disclaimer. ////
27
////                                                              ////
28
//// This source file is free software; you can redistribute it   ////
29
//// and/or modify it under the terms of the GNU Lesser General   ////
30
//// Public License as published by the Free Software Foundation; ////
31
//// either version 2.1 of the License, or (at your option) any   ////
32
//// later version.                                               ////
33
////                                                              ////
34
//// This source is distributed in the hope that it will be       ////
35
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
36
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
37
//// PURPOSE.  See the GNU Lesser General Public License for more ////
38
//// details.                                                     ////
39
////                                                              ////
40
//// You should have received a copy of the GNU Lesser General    ////
41
//// Public License along with this source; if not, download it   ////
42
//// from http://www.opencores.org/lgpl.shtml                     ////
43
////                                                              ////
44
//////////////////////////////////////////////////////////////////////
45
 
46
 
47
//`define TX_ERROR_TEST
48
`include "wb_model_defines.v"
49
`include "sd_defines.v"
50
`define TIME $display("  Time: %0t", $time)
51
 
52
`define BD_RX 8'h60
53
`define BD_TX 8'h80
54
 
55
`define argument 8'h00
56
`define command 8'h04
57
`define status 8'h08
58
`define resp1 8'h0c
59
`define controller 8'h1c
60
`define block 8'h20
61
`define power 8'h24
62
`define software 8'h28
63
`define timeout 8'h2c
64
`define normal_isr 8'h30
65
`define error_isr 8'h34
66
`define normal_iser 8'h38
67
`define error_iser 8'h3c
68
`define capa 8'h48
69
`define clock_d 8'h4c
70
`define bd_status 8'h50
71
`define bd_isr 8'h54
72
`define bd_iser 8'h58
73
`define bd_rx 8'h60
74
`define bd_tx 8'h80
75
`define  BD_ISR  8'h54
76
`define SD_BASE              32'hd0000000
77
`define CMD2 16'h200
78
`define CMD3 16'h300
79
`define ACMD6 16'h600
80
`define CMD7 16'h700
81
`define CMD8 16'h800
82
`define CMD55 16'h3700
83
`define ACMD41 16'h2900
84
`define CMD8 16'h800
85
 
86
`define RSP_48 16'h2
87
`define RSP_136 16'h1
88
`define CICE 16'h10
89
`define CRCE 16'h08
90
 
91
module sd_controller_top_tb(
92
 
93
);
94
 
95
 
96
 
97
// WISHBONE common
98
reg           wb_clk;     // WISHBONE clock
99
reg           wb_rst;     // WISHBONE reset
100
wire   [31:0]  wbs_sds_dat_i;     // WISHBONE data input
101
wire [31:0]   wbs_sds_dat_o;     // WISHBONE data output
102
     // WISHBONE error output
103
// WISHBONE slave
104
wire   [9:0]  wbs_sds_adr_i;     // WISHBONE address input
105
wire    [3:0]  wbs_sds_sel_i;     // WISHBONE byte select input
106
wire           wbs_sds_we_i;      // WISHBONE write enable input
107
wire           wbs_sds_cyc_i;     // WISHBONE cycle input
108
wire           wbs_sds_stb_i;     // WISHBONE strobe input
109
wire          wbs_sds_ack_o;     // WISHBONE acknowledge output
110
// WISHBONE master
111
wire  [31:0]  wbm_sdm_adr_o;
112
wire   [3:0]  wbm_sdm_sel_o;
113
wire          wbm_sdm_we_o;
114
 
115
wire   [31:0]  wbm_sdm_dat_i;
116
wire  [31:0]  wbm_sdm_dat_o;
117
wire          wbm_sdm_cyc_o;
118
wire          wbm_sdm_stb_o;
119
wire           wbm_sdm_ack_i;
120
wire    [2:0]  wbm_sdm_cti_o;
121
wire    [1:0]       wbm_sdm_bte_o;
122
//Global variables
123
 
124
reg          wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
125
integer      tests_successfull;
126
integer      tests_failed;
127
 
128
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
129
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
130
reg   [3:0]  wbs_waits; // wait cycles befor WB Slave responds
131
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
132
 
133
reg [799:0]  test_name; // used for tb_log_file
134
//SD Card interface
135
 
136
wire sd_cmd_oe;
137
wire sd_dat_oe;
138
wire cmdIn;
139
wire [3:0] datIn;
140
 
141
trireg sd_cmd;
142
tri [3:0] sd_dat;
143
 
144
assign sd_cmd = sd_cmd_oe ? cmdIn: 1'bz;
145
assign sd_dat =  sd_dat_oe  ? datIn : 4'bz;
146
reg succes;
147
sdModel sdModelTB0
148
(
149
.sdClk (sd_clk_pad_o),
150
.cmd (sd_cmd),
151
.dat (sd_dat)
152
 
153
);
154
 
155
 
156
//Instaciate SD-Card controller
157
 
158
sdc_controller sd_controller_top_0
159
        (
160
         .wb_clk_i(wb_clk),
161
         .wb_rst_i(wb_rst),
162
         .wb_dat_i(wbs_sds_dat_i),
163
         .wb_dat_o(wbs_sds_dat_o),
164
         .wb_adr_i(wbs_sds_adr_i[7:0]),
165
         .wb_sel_i(wbs_sds_sel_i),
166
         .wb_we_i(wbs_sds_we_i),
167
         .wb_stb_i(wbs_sds_stb_i),
168
         .wb_cyc_i(wbs_sds_cyc_i),
169
         .wb_ack_o(wbs_sds_ack_o),
170
         .m_wb_adr_o(wbm_sdm_adr_o),
171
         .m_wb_sel_o(wbm_sdm_sel_o),
172
         .m_wb_we_o(wbm_sdm_we_o),
173
         .m_wb_dat_o(wbm_sdm_dat_o),
174
         .m_wb_dat_i(wbm_sdm_dat_i),
175
         .m_wb_cyc_o(wbm_sdm_cyc_o),
176
         .m_wb_stb_o(wbm_sdm_stb_o),
177
         .m_wb_ack_i(wbm_sdm_ack_i),
178
         .m_wb_cti_o(wbm_sdm_cti_o),
179
         .m_wb_bte_o(wbm_sdm_bte_o),
180
         .sd_cmd_dat_i(sd_cmd),
181
   .sd_cmd_out_o (cmdIn ),
182
         .sd_cmd_oe_o (sd_cmd_oe),
183
         .sd_dat_dat_i ( sd_dat  ),  //sd_dat_pad_io),
184
         .sd_dat_out_o (datIn  ) ,
185
   .sd_dat_oe_o ( sd_dat_oe  ),
186
         .sd_clk_o_pad  (sd_clk_pad_o)
187
          `ifdef SD_CLK_SEP
188
   ,sd_clk_i_pad
189
  `endif
190
  `ifdef IRQ_ENABLE
191
   ,.int_a (int_a),
192
    .int_b (int_b),
193
    .int_c (int_c)
194
  `endif
195
         );
196
 
197
integer host_log_file_desc;
198
WB_MASTER_BEHAVIORAL wb_master
199
(
200
    .CLK_I(wb_clk),
201
    .RST_I(wb_rst),
202
    .TAG_I(0), //Not in use
203
    .TAG_O(), //Not in use
204
    .ACK_I(wbs_sds_ack_o),
205
    .ADR_O(wbs_sds_adr_i), // only eth_sl_wb_adr_i[11:2] used
206
    .CYC_O(wbs_sds_cyc_i),
207
    .DAT_I(wbs_sds_dat_o),
208
    .DAT_O(wbs_sds_dat_i),
209
    .ERR_I(0),  //Not in use
210
    .RTY_I(1'b0),  // inactive (1'b0)
211
    .SEL_O(wbs_sds_sel_i),
212
    .STB_O(wbs_sds_stb_i),
213
    .WE_O (wbs_sds_we_i),
214
    .CAB_O()       // NOT USED for now!
215
);
216
integer memory_log_file_desc;
217
 
218
WB_SLAVE_BEHAVIORAL wb_slave
219
(
220
    .CLK_I(wb_clk),
221
    .RST_I(wb_rst),
222
    .ACK_O(wbm_sdm_ack_i),
223
    .ADR_I(wbm_sdm_adr_o),
224
    .CYC_I(wbm_sdm_cyc_o),
225
    .DAT_O(wbm_sdm_dat_i),
226
    .DAT_I(wbm_sdm_dat_o),
227
    .ERR_O(),
228
    .RTY_O(),      // NOT USED for now!
229
    .SEL_I(wbm_sdm_sel_o),
230
    .STB_I(wbm_sdm_stb_o),
231
    .WE_I (wbm_sdm_we_o),
232
    .CAB_I(1'b0)
233
);
234
 
235
 
236
 integer phy_log_file_desc;
237
integer wb_s_mon_log_file_desc ;
238
integer wb_m_mon_log_file_desc ;
239
 
240
/*WB_BUS_MON wb_eth_slave_bus_mon
241
(
242
  // WISHBONE common
243
  .CLK_I(wb_clk),
244
  .RST_I(wb_rst),
245
 
246
  // WISHBONE slave
247
  .ACK_I(wbs_sds_ack_o),
248
  .ADDR_O({24'h0,wbs_sds_adr_i[7:0]}),
249
  .CYC_O(wbs_sds_cyc_i),
250
  .DAT_I(wbs_sds_dat_o),
251
  .DAT_O(wbs_sds_dat_i),
252
  .ERR_I(0),
253
  .RTY_I(1'b0),
254
  .SEL_O(wbs_sds_sel_i),
255
  .STB_O(wbs_sds_stb_i),
256
  .WE_O (wbs_sds_we_i),
257
  .TAG_I(0),
258
`ifdef ETH_WISHBONE_B3
259
  .TAG_O(),
260
`else
261
  .TAG_O(5'h0),
262
`endif
263
  .CAB_O(1'b0),
264
`ifdef ETH_WISHBONE_B3
265
  .check_CTI          (1'b1),
266
`else
267
  .check_CTI          (1'b0),
268
`endif
269
  .log_file_desc (wb_s_mon_log_file_desc)
270
); */
271
 
272
WB_BUS_MON wb_eth_master_bus_mon
273
(
274
  // WISHBONE common
275
  .CLK_I(wb_clk),
276
  .RST_I(wb_rst),
277
 
278
  // WISHBONE master
279
  .ACK_I(wbm_sdm_ack_i),
280
  .ADDR_O(wbm_sdm_adr_o),
281
  .CYC_O(wbm_sdm_cyc_o),
282
  .DAT_I(wbm_sdm_dat_i),
283
  .DAT_O(wbm_sdm_dat_o),
284
  .ERR_I(0),
285
  .RTY_I(1'b0),
286
  .SEL_O(wbm_sdm_sel_o),
287
  .STB_O(wbm_sdm_stb_o),
288
  .WE_O (wbm_sdm_we_o),
289
  .TAG_I(0),
290
  .TAG_O(5'h0),
291
  .CAB_O(1'b0),
292
  .check_CTI(1'b0), // NO need
293
  .log_file_desc(wb_m_mon_log_file_desc)
294
);
295
 
296
reg StartTB;
297
integer card_rca;
298
initial
299
begin
300
  wait(StartTB);
301
  succes = 1'b0;
302
  // Initial global values
303
  tests_successfull = 0;
304
  tests_failed = 0;
305
  wbm_working = 0;
306
  card_rca=0;
307
  wbm_init_waits = 4'h1;
308
  wbm_subseq_waits = 4'h3;
309
  wbs_waits = 4'h1;
310
  wbs_retries = 8'h2;
311
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
312
 
313
  // set DIFFERENT mrx_clk to mtx_clk!
314
//  eth_phy.set_mrx_equal_mtx = 1'b0;
315
 
316
  //  Call tests
317
  //  ----------
318
  //note test T5 only valid when SD is in Testmode (sd_tb_defines.v file)
319
   $display("T0 Start");
320
  test_access_to_reg(0, 1);           // 0 - 1 //Test RW registers  
321
  $display("");
322
  $display("===========================================================================");
323
  $display("T0 test_access_to_reg Completed");
324
  $display("===========================================================================");
325
 
326
 
327
  $display("T1 Start");
328
  test_send_cmd(0, 3);
329
  //   0:  Send CMD0, No Response                               ////
330
   //  1:  Send CMD3, 48-Bit Response, No error check
331
    //2:  Send CMD3, 48-Bit Response, All Error check   
332
  //   3:  Send CMD2, 136-Bit Response 
333
  $display("");
334
  $display("===========================================================================");
335
  $display("T1 test_send_cmd Completed");
336
  $display("===========================================================================");
337
 
338
 
339
 $display("T2 Start");
340
 test_init_sequnce(0, 1);
341
 $display("");
342
 $display("===========================================================================");
343
 $display("T2 test_init_sequence Completed");
344
 $display("===========================================================================");
345
 
346
  $display("T3 Start");
347
  test_send_data(0, 1);
348
  $display("");
349
  $display("===========================================================================");
350
  $display("T3 test_send_data Completed");
351
  $display("===========================================================================");
352
 
353
 // test_send_rec_data
354
  $display("T4 Start");
355
  test_send_rec_data(0, 1);
356
  $display("");
357
  $display("===========================================================================");
358
  $display("T4 test_send_rec_data Completed");
359
  $display("===========================================================================");
360
 
361
  //test_send_rec_data
362
   $display("T5 Start");
363
  test_send_cmd_error_rsp(0, 3);
364
 $display("");
365
 $display("===========================================================================");
366
 $display("T5 test_send_cmd_error_rsp Complete");
367
 $display("===========================================================================");
368
 
369
   //  test_send_rec_data_error_rsp
370
 //test_send_rec_data_error_rsp(0, 1);
371
// $display("");
372
//  $display("===========================================================================");
373
 // $display("T6 test_send_cmd_error_rsp Complete");
374
 // $display("===========================================================================");
375
 $display("All Tests past");
376
  succes = 1'b1;
377
end
378
 
379
 
380
 
381
 
382
 
383
 
384
 
385
 
386
 
387
integer     tb_log_file;
388
 
389
initial
390
begin
391
  tb_log_file = $fopen("../log/sdc_tb.log");
392
  if (tb_log_file < 2)
393
  begin
394
    $display("*E Could not open/create testbench log file in ../log/ directory!");
395
    $finish;
396
  end
397
  $fdisplay(tb_log_file, "========================== SD IP Core Testbench results ===========================");
398
  $fdisplay(tb_log_file, " ");
399
 
400
  phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
401
  if (phy_log_file_desc < 2)
402
  begin
403
    $fdisplay(tb_log_file, "*E Could not open/create sd_tb_phy.log file in ../log/ directory!");
404
    $finish;
405
  end
406
  $fdisplay(phy_log_file_desc, "================ PHY Module  Testbench access log ================");
407
  $fdisplay(phy_log_file_desc, " ");
408
 
409
  memory_log_file_desc = $fopen("../log/sd_tb_memory.log");
410
  if (memory_log_file_desc < 2)
411
  begin
412
    $fdisplay(tb_log_file, "*E Could not open/create sd_tb_memory.log file in ../log/ directory!");
413
    $finish;
414
  end
415
  $fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
416
  $fdisplay(memory_log_file_desc, " ");
417
 
418
  host_log_file_desc = $fopen("../log/eth_tb_host.log");
419
  if (host_log_file_desc < 2)
420
  begin
421
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
422
    $finish;
423
  end
424
  $fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
425
  $fdisplay(host_log_file_desc, " ");
426
 
427
  wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
428
  if (wb_s_mon_log_file_desc < 2)
429
  begin
430
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
431
    $finish;
432
  end
433
  $fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
434
  $fdisplay(wb_s_mon_log_file_desc, " ");
435
  $fdisplay(wb_s_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
436
  $fdisplay(wb_s_mon_log_file_desc, " ");
437
 
438
  wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
439
  if (wb_m_mon_log_file_desc < 2)
440
  begin
441
    $fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
442
    $finish;
443
  end
444
  $fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor  error log =============");
445
  $fdisplay(wb_m_mon_log_file_desc, " ");
446
  $fdisplay(wb_m_mon_log_file_desc, "   Only ERRONEOUS conditions are logged !");
447
  $fdisplay(wb_m_mon_log_file_desc, " ");
448
 
449
  // Reset pulse
450
  wb_rst =  1'b1;
451
  #423 wb_rst =  1'b0;
452
 
453
  // Clear memories
454
  //clear_memories;  
455
 
456
  #423 StartTB  =  1'b1;
457
end
458
 
459
 
460
 
461
 
462
// Generating WB_CLK_I clock
463
always
464
begin
465
  wb_clk=0;
466
//  forever #2.5 WB_CLK_I = ~WB_CLK_I;  // 2*2.5 ns -> 200.0 MHz    
467
//  forever #5 WB_CLK_I = ~WB_CLK_I;  // 2*5 ns -> 100.0 MHz    
468
//  forever #10 WB_CLK_I = ~WB_CLK_I;  // 2*10 ns -> 50.0 MHz    
469
  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
470
//  forever #15 WB_CLK_I = ~WB_CLK_I;  // 2*10 ns -> 33.3 MHz    
471
//  forever #20 WB_CLK_I = ~WB_CLK_I;  // 2*20 ns -> 25 MHz    
472
//  forever #25 WB_CLK_I = ~WB_CLK_I;  // 2*25 ns -> 20.0 MHz
473
//  forever #31.25 WB_CLK_I = ~WB_CLK_I;  // 2*31.25 ns -> 16.0 MHz    
474
//  forever #50 WB_CLK_I = ~WB_CLK_I;  // 2*50 ns -> 10.0 MHz
475
//  forever #55 WB_CLK_I = ~WB_CLK_I;  // 2*55 ns ->  9.1 MHz    
476
end
477
 
478
//TEST Cases
479
//
480
//
481
//
482
 
483
task test_send_cmd;
484
  input  [31:0]  start_task;
485
  input  [31:0]  end_task;
486
  integer        bit_start_1;
487
  integer        bit_end_1;
488
  integer        bit_start_2;
489
  integer        bit_end_2;
490
  integer        num_of_reg;
491
  integer        i_addr;
492
  integer        i_data;
493
  integer        i_length;
494
  integer        tmp_data;
495
  reg    [31:0]  tx_bd_num;
496
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
497
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
498
  integer        i;
499
  integer        i1;
500
  integer        i2;
501
  integer        i3;
502
  integer        fail;
503
  integer        test_num;
504
  reg    [31:0]  addr;
505
  reg    [31:0]  data;
506
  reg     [3:0]  sel;
507
  reg     [3:0]  rand_sel;
508
  reg    [31:0]  data_max;
509
  reg [31:0] rsp;
510
begin
511
// test_send_cmd
512
test_heading("Send CMD");
513
$display(" ");
514
$display("test_send_cmd TEST");
515
fail = 0;
516
 
517
// reset MAC registers
518
hard_reset;
519
 
520
 
521
//////////////////////////////////////////////////////////////////////
522
////                                                          ////
523
////  test_send_cmd:                                          ////
524
////                                                          ////
525
////                                ////
526
///   
527
///   0:  Send CMD3, 48-Bit Response, All Error check   
528
///                         ////
529
///   
530
//////////////////////////////////////////////////////////////////////
531
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
532
begin
533
 
534
  //////////////////////////////////////////////////////////////////////
535
  ////                                                          //// 
536
  //Test 0:  Send CMD, No Response                               ////
537
  //////////////////////////////////////////////////////////////////////
538
  if (test_num == 0) //
539
  begin
540
 
541
    test_name   = "0:  Send CMD, No Response  ";
542
    `TIME; $display("  TEST 0: 0:  Send CMD, No Response  ");
543
      wbm_init_waits = 0;
544
      wbm_subseq_waits = {$random} % 5;
545
     data = 0;
546
     rand_sel = 0;
547
     sel = 4'hF;
548
 
549
      //Reset Core
550
       addr = `SD_BASE + `software ;
551
       data = 1;
552
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
553
      //Setup timeout reg 
554
       addr = `SD_BASE + `timeout  ;
555
       data = 16'hff;
556
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
557
      //Clock divider /2 
558
        addr = `SD_BASE + `clock_d   ;
559
       data = 16'h0;
560
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
561
      //Start Core
562
       addr = `SD_BASE + `software ;
563
       data = 0;
564
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
565
      //Setup settings 
566
       addr = `SD_BASE + `command ;
567
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
568
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
569
      //Argument settings 
570
       addr = `SD_BASE + `argument  ;
571
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
572
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
573
 
574
      //wait for send finnish
575
       addr = `SD_BASE + `normal_isr   ;
576
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
577
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
578
       while (tmp_data != 1)
579
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
580
 
581
 
582
       if (tmp_data[15]) begin
583
         fail = fail + 1;
584
         test_fail_num("Error occured when sending CMD0 in TEST0", i_addr);
585
         `TIME;
586
        $display("Normal status register is not 0x1: %h", tmp_data);
587
       end
588
 
589
 
590
 
591
 
592
    end
593
 
594
 
595
 
596
 
597
 
598
 
599
 
600
 
601
 
602
 
603
  end
604
   if(fail == 0)
605
      test_ok;
606
    else
607
      fail = 0;
608
  end
609
endtask
610
 
611
 
612
 
613
 
614
 
615
 
616
 
617
 
618
task test_send_rec_data_error_rsp;
619
input  [31:0]  start_task;
620
  input  [31:0]  end_task;
621
  integer        bit_start_1;
622
  integer        bit_end_1;
623
  integer        bit_start_2;
624
  integer        bit_end_2;
625
  integer        num_of_reg;
626
  integer        i_addr;
627
  integer        i_data;
628
  integer        i_length;
629
  integer        tmp_data;
630
    integer        resp_data;
631
  reg    [31:0]  tx_bd_num;
632
 
633
 
634
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
635
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
636
  integer        i;
637
  integer        i1;
638
  integer        i2;
639
  integer        i3;
640
  integer        fail;
641
  integer        test_num;
642
  reg    [31:0]  addr;
643
  reg    [31:0]  data;
644
  reg     [3:0]  sel;
645
  reg     [3:0]  rand_sel;
646
  reg    [31:0]  data_max;
647
  reg [31:0] rsp;
648
begin
649
// access_to_reg
650
test_heading("access_to_reg");
651
$display(" ");
652
$display("access_to_reg TEST");
653
fail = 0;
654
resp_data = 0;
655
// reset MAC registers
656
hard_reset;
657
 
658
 
659
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
660
begin
661
 
662
  //////////////////////////////////////////////////////////////////////
663
  ////                                                          //// 
664
  //Test 3.0:  Init sequence, With response check  
665
  //CMD 0. Reset Card
666
  //CMD 8. Get voltage (Only 2.0 Card response to this)            ////
667
  //CMD55. Indicate Next Command are Application specific
668
  //ACMD44. Get Voltage windows
669
  //CMD2. CID reg
670
  //CMD3. Get RCA.
671
  //////////////////////////////////////////////////////////////////////
672
  if (test_num == 0) //
673
  begin
674
 
675
    test_name   = "4.0:  Send data ";
676
    `TIME; $display("  TEST 4.0:   Send data  ");
677
      wbm_init_waits = 0;
678
      wbm_subseq_waits = {$random} % 5;
679
     data = 0;
680
     rand_sel = 0;
681
     sel = 4'hF;
682
 
683
      //Reset Core
684
       addr = `SD_BASE + `software ;
685
       data = 1;
686
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
687
      //Setup timeout reg 
688
       addr = `SD_BASE + `timeout  ;
689
       data = 16'h2ff;
690
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
691
      //Clock divider /2 
692
        addr = `SD_BASE + `clock_d   ;
693
       data = 16'h0;
694
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
695
      //Start Core
696
       addr = `SD_BASE + `software ;
697
       data = 0;
698
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
699
 
700
      //CMD 0 Reset card
701
      //Setup settings 
702
       addr = `SD_BASE + `command ;
703
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
704
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
705
      //Argument settings 
706
       addr = `SD_BASE + `argument  ;
707
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
708
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
709
 
710
      //wait for send finnish
711
       addr = `SD_BASE + `normal_isr   ;
712
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
713
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
714
       while (tmp_data != 1)
715
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
716
        if (tmp_data[15]) begin
717
         fail = fail + 1;
718
         test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
719
         `TIME;
720
        $display("Normal status register is not 0x1: %h", tmp_data);
721
        end
722
 
723
      //CMD 8. Get voltage (Only 2.0 Card response to this)  
724
        addr = `SD_BASE + `command ;
725
       data = `CMD8 | `RSP_48 ;
726
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
727
      //Argument settings 
728
       addr = `SD_BASE + `argument  ;
729
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
730
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
731
 
732
      //wait for send finnish or timeout
733
       addr = `SD_BASE + `normal_isr   ;
734
       data = 0; //CMD index 8, Erro check =0, rsp = 0;
735
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
736
       while (tmp_data != 1) begin
737
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
738
          if (tmp_data[15]) begin
739
             $display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
740
             tmp_data=1;
741
          end
742
       end
743
    resp_data[31]=1; //Just to make it to not skip first 
744
    while (resp_data[31]) begin //Wait until busy is clear in the card
745
         //Send CMD 55      
746
       addr = `SD_BASE + `command ;
747
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
748
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
749
      //Argument settings 
750
       addr = `SD_BASE + `argument  ;
751
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
752
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
753
 
754
      //wait for response or timeout
755
       addr = `SD_BASE + `normal_isr   ;
756
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
757
       while (tmp_data != 1) begin
758
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
759
          if (tmp_data[15]== 1) begin
760
             fail = fail + 1;
761
             addr = `SD_BASE + `error_isr ;
762
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
763
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
764
            `TIME;
765
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
766
          end
767
        end
768
 
769
        //Send ACMD 41      
770
         addr = `SD_BASE + `command ;
771
         data = `ACMD41 | `RSP_48 ;
772
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
773
        //Argument settings 
774
        addr = `SD_BASE + `argument  ;
775
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
776
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
777
        //wait for response or timeout
778
        addr = `SD_BASE + `normal_isr   ;
779
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
780
        while (tmp_data != 1) begin
781
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
782
          if (tmp_data[15]== 1) begin
783
            fail = fail + 1;
784
            addr = `SD_BASE + `error_isr ;
785
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
786
            test_fail_num("Error occured when sending ACMD 41  in TEST 4.0", i_addr);
787
           `TIME;
788
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
789
          end
790
          //Read response data
791
        end
792
        addr = `SD_BASE + `resp1   ;
793
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
794
     end
795
 
796
      //Send CMD 2      
797
       addr = `SD_BASE + `command ;
798
       data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
799
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
800
      //Argument settings 
801
       addr = `SD_BASE + `argument  ;
802
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
803
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
804
 
805
      //wait for response or timeout
806
       addr = `SD_BASE + `normal_isr   ;
807
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
808
       while (tmp_data != 1) begin
809
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
810
          if (tmp_data[15]== 1) begin
811
            fail = fail + 1;
812
            addr = `SD_BASE + `error_isr ;
813
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
814
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
815
            `TIME;
816
             $display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
817
         end
818
      end
819
 
820
 
821
        addr = `SD_BASE + `resp1   ;
822
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
823
        $display("CID reg 1: %h", resp_data);
824
 
825
       //Send CMD 3      
826
       addr = `SD_BASE + `command ;
827
       data = `CMD3 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
828
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
829
      //Argument settings 
830
       addr = `SD_BASE + `argument  ;
831
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
832
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
833
 
834
      //wait for response or timeout
835
       addr = `SD_BASE + `normal_isr   ;
836
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
837
       while (tmp_data != 1) begin
838
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
839
          if (tmp_data[15]== 1) begin
840
            fail = fail + 1;
841
            addr = `SD_BASE + `error_isr ;
842
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
843
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
844
            `TIME;
845
             $display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
846
         end
847
      end
848
        addr = `SD_BASE + `resp1   ;
849
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
850
        card_rca= resp_data [31:16];
851
 
852
        $display("RCA Response: %h", resp_data);
853
        $display("RCA Nr for data transfer: %h", card_rca);
854
 
855
        //Put in transferstate
856
        //Send CMD 7      
857
       addr = `SD_BASE + `command ;
858
       data = `CMD7 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
859
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
860
      //Argument settings 
861
       addr = `SD_BASE + `argument  ;
862
       data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
863
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
864
        //wait for response or timeout
865
       addr = `SD_BASE + `normal_isr   ;
866
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
867
       while (tmp_data != 1) begin
868
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
869
          if (tmp_data[15]== 1) begin
870
            fail = fail + 1;
871
            addr = `SD_BASE + `error_isr ;
872
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
873
            test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
874
            `TIME;
875
             $display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
876
         end
877
      end
878
 
879
       //Set bus width
880
 
881
         //Send CMD 55      
882
       addr = `SD_BASE + `command ;
883
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
884
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
885
      //Argument settings 
886
       addr = `SD_BASE + `argument  ;
887
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
888
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
889
 
890
      //wait for response or timeout
891
       addr = `SD_BASE + `normal_isr   ;
892
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
893
       while (tmp_data != 1) begin
894
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
895
          if (tmp_data[15]== 1) begin
896
             fail = fail + 1;
897
             addr = `SD_BASE + `error_isr ;
898
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
899
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
900
            `TIME;
901
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
902
          end
903
        end
904
 
905
        //Send ACMD 6     
906
         addr = `SD_BASE + `command ;
907
         data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
908
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
909
        //Argument settings 
910
        addr = `SD_BASE + `argument  ;
911
        data = 2; //CMD index 0, Erro check =0, rsp = 0;
912
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
913
        //wait for response or timeout
914
        addr = `SD_BASE + `normal_isr   ;
915
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
916
        while (tmp_data != 1) begin
917
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
918
          if (tmp_data[15]== 1) begin
919
            fail = fail + 1;
920
            addr = `SD_BASE + `error_isr ;
921
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
922
            test_fail_num("Error occured when sending ACMD 6  in TEST 4.0", i_addr);
923
           `TIME;
924
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
925
          end
926
          //Read response data
927
        end
928
 
929
        addr = `SD_BASE + `resp1   ;
930
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
931
        $display("Card status after Bus width set %h", resp_data);
932
       //write data
933
       sdModelTB0.add_wrong_data_crc<=1;
934
        addr = `SD_BASE + `BD_TX  ;
935
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
936
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
937
 
938
        addr = `SD_BASE + `BD_TX  ;
939
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
940
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
941
 
942
 
943
        addr = `SD_BASE + `BD_ISR  ;
944
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
945
 
946
                while (  resp_data[0]  !=1   ) begin
947
                              wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
948
                              if (resp_data[1] ) begin
949
                               test_fail_num("Error in TEST 4.0: Data resend When Writing try >N.  BD_ISR  %h", resp_data);
950
            `TIME;
951
             $display("Error in TEST 4.0: Data resend When Writing try >N.  BD_ISR  %h", resp_data);
952
                              end
953
                              if (resp_data[2] ) begin
954
                                 test_fail_num("Error in TEST 4.0: FIFO underflow/overflow When Writing.  BD_ISR  %h", resp_data);
955
            `TIME;
956
             $display("Error in TEST 4.0: FIFO underflow/overflow When Writing.  BD_ISR  %h", resp_data);
957
                              end
958
            if (resp_data[4] ) begin
959
                                 test_fail_num("Error in TEST 4.0: Command error When Writing.  BD_ISR  %h", resp_data);
960
            `TIME;
961
             $display("Error in TEST 4.0: Command error When Writing.  BD_ISR  %h", resp_data);
962
                              end
963
                              if (resp_data[5] ) begin
964
                                 test_fail_num("Error in TEST 4.0: Data CRC error When Writing.  BD_ISR  %h", resp_data);
965
            `TIME;
966
             $display("Error in TEST 4.0: Data CRC error When Writing.  BD_ISR  %h", resp_data);
967
                              end
968
                              sdModelTB0.add_wrong_data_crc<=0;
969
                            end
970
                            clear_memories;
971
sdModelTB0.add_wrong_data_crc<=1;
972
                             addr = `SD_BASE + `BD_RX  ;
973
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
974
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
975
 
976
        addr = `SD_BASE + `BD_RX  ;
977
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
978
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
979
 
980
 
981
        addr = `SD_BASE + `BD_ISR  ;
982
        data=0;
983
 
984
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
985
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
986
 
987
                while (  resp_data[0]  !=1   ) begin
988
                              wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
989
                              if (resp_data[1] ) begin
990
                               test_fail_num("Error in TEST 4.0 When Reading: Data resend try >N.  BD_ISR  %h", resp_data);
991
            `TIME;
992
             $display("Error in TEST 4.0 When Reading: Data resend try >N.  BD_ISR  %h", resp_data);
993
                              end
994
                               if (resp_data[2] ) begin
995
                                 test_fail_num("Error in TEST 4.0 When Reading: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
996
            `TIME;
997
             $display("Error in TEST 4.0 When Reading: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
998
                              end
999
            if (resp_data[4] ) begin
1000
                                 test_fail_num("Error in TEST 4.0 When Reading: Command error.  BD_ISR  %h", resp_data);
1001
            `TIME;
1002
             $display("Error in TEST 4.0: Command error.  BD_ISR  %h", resp_data);
1003
                              end
1004
                               if (resp_data[5] ) begin
1005
                                 test_fail_num("Error in TEST 4.0: Data CRC error.  BD_ISR  %h", resp_data);
1006
            `TIME;
1007
             $display("Error in TEST 4.0: Data CRC error When Reading.  BD_ISR  %h", resp_data);
1008
                              end
1009
 
1010
 
1011
                            end
1012
 
1013
  end
1014
  end
1015
   if(fail == 0)
1016
      test_ok;
1017
    else
1018
      fail = 0;
1019
 end
1020
endtask
1021
 
1022
 
1023
task test_send_rec_data;
1024
input  [31:0]  start_task;
1025
  input  [31:0]  end_task;
1026
  integer        bit_start_1;
1027
  integer        bit_end_1;
1028
  integer        bit_start_2;
1029
  integer        bit_end_2;
1030
  integer        num_of_reg;
1031
  integer        i_addr;
1032
  integer        i_data;
1033
  integer        i_length;
1034
  integer        tmp_data;
1035
    integer        resp_data;
1036
  reg    [31:0]  tx_bd_num;
1037
 
1038
 
1039
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
1040
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
1041
  integer        i;
1042
  integer        i1;
1043
  integer        i2;
1044
  integer        i3;
1045
  integer        fail;
1046
  integer        test_num;
1047
  reg    [31:0]  addr;
1048
  reg    [31:0]  data;
1049
  reg     [3:0]  sel;
1050
  reg     [3:0]  rand_sel;
1051
  reg    [31:0]  data_max;
1052
  reg [31:0] rsp;
1053
begin
1054
// access_to_reg
1055
 
1056
fail = 0;
1057
resp_data = 0;
1058
// reset MAC registers
1059
hard_reset;
1060
 
1061
 
1062
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1063
begin
1064
 
1065
  //////////////////////////////////////////////////////////////////////
1066
  ////                                                          //// 
1067
  //Test 3.0:  Init sequence, With response check  
1068
  //CMD 0. Reset Card
1069
  //CMD 8. Get voltage (Only 2.0 Card response to this)            ////
1070
  //CMD55. Indicate Next Command are Application specific
1071
  //ACMD44. Get Voltage windows
1072
  //CMD2. CID reg
1073
  //CMD3. Get RCA.
1074
  //////////////////////////////////////////////////////////////////////
1075
  if (test_num == 0) //
1076
  begin
1077
 
1078
    test_name   = "4.0:  Send data ";
1079
    `TIME; $display("  TEST 4.0:   Send data  ");
1080
      wbm_init_waits = 0;
1081
      wbm_subseq_waits = {$random} % 5;
1082
     data = 0;
1083
     rand_sel = 0;
1084
     sel = 4'hF;
1085
 
1086
      //Reset Core
1087
       addr = `SD_BASE + `software ;
1088
       data = 1;
1089
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1090
      //Setup timeout reg 
1091
       addr = `SD_BASE + `timeout  ;
1092
       data = 16'h2ff;
1093
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1094
      //Clock divider /2 
1095
        addr = `SD_BASE + `clock_d   ;
1096
       data = 16'h0;
1097
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1098
      //Start Core
1099
       addr = `SD_BASE + `software ;
1100
       data = 0;
1101
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1102
 
1103
      //CMD 0 Reset card
1104
      //Setup settings 
1105
       addr = `SD_BASE + `command ;
1106
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1107
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1108
      //Argument settings 
1109
       addr = `SD_BASE + `argument  ;
1110
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1111
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1112
 
1113
      //wait for send finnish
1114
       addr = `SD_BASE + `normal_isr   ;
1115
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1116
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1117
       while (tmp_data != 1)
1118
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1119
        if (tmp_data[15]) begin
1120
         fail = fail + 1;
1121
         test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
1122
         `TIME;
1123
        $display("Normal status register is not 0x1: %h", tmp_data);
1124
        end
1125
 
1126
      //CMD 8. Get voltage (Only 2.0 Card response to this)  
1127
        addr = `SD_BASE + `command ;
1128
       data = `CMD8 | `RSP_48 ;
1129
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1130
      //Argument settings 
1131
       addr = `SD_BASE + `argument  ;
1132
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1133
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1134
 
1135
      //wait for send finnish or timeout
1136
       addr = `SD_BASE + `normal_isr   ;
1137
       data = 0; //CMD index 8, Erro check =0, rsp = 0;
1138
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1139
       while (tmp_data != 1) begin
1140
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1141
          if (tmp_data[15]) begin
1142
             $display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
1143
             tmp_data=1;
1144
          end
1145
       end
1146
    resp_data[31]=1; //Just to make it to not skip first 
1147
    while (resp_data[31]) begin //Wait until busy is clear in the card
1148
         //Send CMD 55      
1149
       addr = `SD_BASE + `command ;
1150
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
1151
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1152
      //Argument settings 
1153
       addr = `SD_BASE + `argument  ;
1154
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1155
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1156
 
1157
      //wait for response or timeout
1158
       addr = `SD_BASE + `normal_isr   ;
1159
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1160
       while (tmp_data != 1) begin
1161
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1162
          if (tmp_data[15]== 1) begin
1163
             fail = fail + 1;
1164
             addr = `SD_BASE + `error_isr ;
1165
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1166
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
1167
            `TIME;
1168
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
1169
          end
1170
        end
1171
 
1172
        //Send ACMD 41      
1173
         addr = `SD_BASE + `command ;
1174
         data = `ACMD41 | `RSP_48 ;
1175
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1176
        //Argument settings 
1177
        addr = `SD_BASE + `argument  ;
1178
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1179
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1180
        //wait for response or timeout
1181
        addr = `SD_BASE + `normal_isr   ;
1182
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1183
        while (tmp_data != 1) begin
1184
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1185
          if (tmp_data[15]== 1) begin
1186
            fail = fail + 1;
1187
            addr = `SD_BASE + `error_isr ;
1188
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1189
            test_fail_num("Error occured when sending ACMD 41  in TEST 4.0", i_addr);
1190
           `TIME;
1191
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
1192
          end
1193
          //Read response data
1194
        end
1195
        addr = `SD_BASE + `resp1   ;
1196
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1197
     end
1198
 
1199
      //Send CMD 2      
1200
       addr = `SD_BASE + `command ;
1201
       data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
1202
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1203
      //Argument settings 
1204
       addr = `SD_BASE + `argument  ;
1205
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1206
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1207
 
1208
      //wait for response or timeout
1209
       addr = `SD_BASE + `normal_isr   ;
1210
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1211
       while (tmp_data != 1) begin
1212
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1213
          if (tmp_data[15]== 1) begin
1214
            fail = fail + 1;
1215
            addr = `SD_BASE + `error_isr ;
1216
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1217
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
1218
            `TIME;
1219
             $display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
1220
         end
1221
      end
1222
 
1223
 
1224
        addr = `SD_BASE + `resp1   ;
1225
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1226
        $display("CID reg 1: %h", resp_data);
1227
 
1228
       //Send CMD 3      
1229
       addr = `SD_BASE + `command ;
1230
       data = `CMD3 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
1231
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1232
      //Argument settings 
1233
       addr = `SD_BASE + `argument  ;
1234
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1235
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1236
 
1237
      //wait for response or timeout
1238
       addr = `SD_BASE + `normal_isr   ;
1239
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1240
       while (tmp_data != 1) begin
1241
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1242
          if (tmp_data[15]== 1) begin
1243
            fail = fail + 1;
1244
            addr = `SD_BASE + `error_isr ;
1245
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1246
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
1247
            `TIME;
1248
             $display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
1249
         end
1250
      end
1251
        addr = `SD_BASE + `resp1   ;
1252
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1253
        card_rca= resp_data [31:16];
1254
 
1255
        $display("RCA Response: %h", resp_data);
1256
        $display("RCA Nr for data transfer: %h", card_rca);
1257
 
1258
        //Put in transferstate
1259
        //Send CMD 7      
1260
       addr = `SD_BASE + `command ;
1261
       data = `CMD7 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
1262
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1263
      //Argument settings 
1264
       addr = `SD_BASE + `argument  ;
1265
       data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
1266
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1267
        //wait for response or timeout
1268
       addr = `SD_BASE + `normal_isr   ;
1269
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1270
       while (tmp_data != 1) begin
1271
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1272
          if (tmp_data[15]== 1) begin
1273
            fail = fail + 1;
1274
            addr = `SD_BASE + `error_isr ;
1275
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1276
            test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
1277
            `TIME;
1278
             $display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
1279
         end
1280
      end
1281
 
1282
       //Set bus width
1283
 
1284
         //Send CMD 55      
1285
       addr = `SD_BASE + `command ;
1286
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
1287
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1288
      //Argument settings 
1289
       addr = `SD_BASE + `argument  ;
1290
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1291
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1292
 
1293
      //wait for response or timeout
1294
       addr = `SD_BASE + `normal_isr   ;
1295
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1296
       while (tmp_data != 1) begin
1297
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1298
          if (tmp_data[15]== 1) begin
1299
             fail = fail + 1;
1300
             addr = `SD_BASE + `error_isr ;
1301
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1302
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
1303
            `TIME;
1304
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
1305
          end
1306
        end
1307
 
1308
        //Send ACMD 6     
1309
         addr = `SD_BASE + `command ;
1310
         data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
1311
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1312
        //Argument settings 
1313
        addr = `SD_BASE + `argument  ;
1314
        data = 2; //CMD index 0, Erro check =0, rsp = 0;
1315
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1316
        //wait for response or timeout
1317
        addr = `SD_BASE + `normal_isr   ;
1318
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1319
        while (tmp_data != 1) begin
1320
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1321
          if (tmp_data[15]== 1) begin
1322
            fail = fail + 1;
1323
            addr = `SD_BASE + `error_isr ;
1324
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1325
            test_fail_num("Error occured when sending ACMD 6  in TEST 4.0", i_addr);
1326
           `TIME;
1327
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
1328
          end
1329
          //Read response data
1330
        end
1331
 
1332
        addr = `SD_BASE + `resp1   ;
1333
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1334
        $display("Card status after Bus width set %h", resp_data);
1335
       //write data
1336
 
1337
        addr = `SD_BASE + `BD_TX  ;
1338
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1339
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1340
 
1341
        addr = `SD_BASE + `BD_TX  ;
1342
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1343
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1344
 
1345
 
1346
        addr = `SD_BASE + `BD_ISR  ;
1347
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1348
 
1349
                while (  resp_data[0]  !=1   ) begin
1350
                              wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1351
                              if (resp_data[1] ) begin
1352
                               test_fail_num("Error in TEST 4.0 when writing: Data resend try >N.  BD_ISR  %h", resp_data);
1353
            `TIME;
1354
             $display("Error in TEST 4.0 when writing: Data resend try >N.  BD_ISR  %h", resp_data);
1355
                              end
1356
                              else if (resp_data[2] ) begin
1357
                                 test_fail_num("Error in TEST 4.0 when writing :  FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1358
            `TIME;
1359
             $display("Error in TEST 4.0 when writing: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1360
                              end
1361
            else if (resp_data[4] ) begin
1362
                                 test_fail_num("Error in TEST 4.0 when writing: Command error.  BD_ISR  %h", resp_data);
1363
            `TIME;
1364
             $display("Error in TEST 4.0 when writing: Command error.  BD_ISR  %h", resp_data);
1365
                              end
1366
                              else if (resp_data[5] ) begin
1367
                                 test_fail_num("Error in TEST 4.0 when writing: Data CRC error.  BD_ISR  %h", resp_data);
1368
            `TIME;
1369
             $display("Error in TEST 4.0 when writing: Data CRC error.  BD_ISR  %h", resp_data);
1370
                              end
1371
 
1372
                            end
1373
                            clear_memories;
1374
 
1375
                             addr = `SD_BASE + `BD_RX  ;
1376
        data = 0; //
1377
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1378
 
1379
        addr = `SD_BASE + `BD_RX  ;
1380
        data = 0; //C
1381
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1382
 
1383
 
1384
        addr = `SD_BASE + `BD_ISR  ;
1385
        data=0;
1386
 
1387
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1388
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1389
 
1390
                while (  resp_data[0]  !=1   ) begin
1391
                              wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1392
                              if (resp_data[1] ) begin
1393
                               test_fail_num("Error in TEST 4.0 when reading: Data resend try >N.  BD_ISR  %h", resp_data);
1394
            `TIME;
1395
             $display("Error in TEST 4.0 when reading: Data resend try >N.  BD_ISR  %h", resp_data);
1396
                              end
1397
                              else if (resp_data[2] ) begin
1398
                                 test_fail_num("Error in TEST 4.0 when reading: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1399
            `TIME;
1400
             $display("Error in TEST 4.0 when reading: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1401
                              end
1402
            else if (resp_data[4] ) begin
1403
                                 test_fail_num("Error in TEST 4.0 when reading: Command error.  BD_ISR  %h", resp_data);
1404
            `TIME;
1405
             $display("Error in TEST 4.0 when reading: Command error.  BD_ISR  %h", resp_data);
1406
                              end
1407
                              else if (resp_data[5] ) begin
1408
                                 test_fail_num("Error in TEST 4.0 when reading: Data CRC error.  BD_ISR  %h", resp_data);
1409
            `TIME;
1410
             $display("Error in TEST 4.0 when reading: Data CRC error.  BD_ISR  %h", resp_data);
1411
                              end
1412
 
1413
 
1414
                            end
1415
 
1416
  end
1417
  end
1418
   if(fail == 0)
1419
      test_ok;
1420
    else
1421
      fail = 0;
1422
 end
1423
endtask
1424
 
1425
 
1426
 
1427
 
1428
 
1429
 
1430
 
1431
 
1432
 
1433
task test_send_data;
1434
input  [31:0]  start_task;
1435
  input  [31:0]  end_task;
1436
  integer        bit_start_1;
1437
  integer        bit_end_1;
1438
  integer        bit_start_2;
1439
  integer        bit_end_2;
1440
  integer        num_of_reg;
1441
  integer        i_addr;
1442
  integer        i_data;
1443
  integer        i_length;
1444
  integer        tmp_data;
1445
    integer        resp_data;
1446
  reg    [31:0]  tx_bd_num;
1447
 
1448
 
1449
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
1450
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
1451
  integer        i;
1452
  integer        i1;
1453
  integer        i2;
1454
  integer        i3;
1455
  integer        fail;
1456
  integer        test_num;
1457
  reg    [31:0]  addr;
1458
  reg    [31:0]  data;
1459
  reg     [3:0]  sel;
1460
  reg     [3:0]  rand_sel;
1461
  reg    [31:0]  data_max;
1462
  reg [31:0] rsp;
1463
begin
1464
// access_to_reg
1465
test_heading("access_to_reg");
1466
$display(" ");
1467
$display("access_to_reg TEST");
1468
fail = 0;
1469
resp_data = 0;
1470
// reset MAC registers
1471
hard_reset;
1472
 
1473
 
1474
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1475
begin
1476
 
1477
  //////////////////////////////////////////////////////////////////////
1478
  ////                                                          //// 
1479
  //Test 3.0:  Init sequence, With response check  
1480
  //CMD 0. Reset Card
1481
  //CMD 8. Get voltage (Only 2.0 Card response to this)            ////
1482
  //CMD55. Indicate Next Command are Application specific
1483
  //ACMD44. Get Voltage windows
1484
  //CMD2. CID reg
1485
  //CMD3. Get RCA.
1486
  //////////////////////////////////////////////////////////////////////
1487
  if (test_num == 0) //
1488
  begin
1489
 
1490
    test_name   = "4.0:  Send data ";
1491
    `TIME; $display("  TEST 4.0:   Send data  ");
1492
      wbm_init_waits = 0;
1493
      wbm_subseq_waits = {$random} % 5;
1494
     data = 0;
1495
     rand_sel = 0;
1496
     sel = 4'hF;
1497
 
1498
      //Reset Core
1499
       addr = `SD_BASE + `software ;
1500
       data = 1;
1501
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1502
      //Setup timeout reg 
1503
       addr = `SD_BASE + `timeout  ;
1504
       data = 16'h2ff;
1505
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1506
      //Clock divider /2 
1507
        addr = `SD_BASE + `clock_d   ;
1508
       data = 16'h0;
1509
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1510
      //Start Core
1511
       addr = `SD_BASE + `software ;
1512
       data = 0;
1513
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1514
 
1515
      //CMD 0 Reset card
1516
      //Setup settings 
1517
       addr = `SD_BASE + `command ;
1518
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1519
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1520
      //Argument settings 
1521
       addr = `SD_BASE + `argument  ;
1522
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1523
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1524
 
1525
      //wait for send finnish
1526
       addr = `SD_BASE + `normal_isr   ;
1527
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1528
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1529
       while (tmp_data != 1)
1530
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1531
        if (tmp_data[15]) begin
1532
         fail = fail + 1;
1533
         test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
1534
         `TIME;
1535
        $display("Normal status register is not 0x1: %h", tmp_data);
1536
        end
1537
 
1538
      //CMD 8. Get voltage (Only 2.0 Card response to this)  
1539
        addr = `SD_BASE + `command ;
1540
       data = `CMD8 | `RSP_48 ;
1541
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1542
      //Argument settings 
1543
       addr = `SD_BASE + `argument  ;
1544
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1545
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1546
 
1547
      //wait for send finnish or timeout
1548
       addr = `SD_BASE + `normal_isr   ;
1549
       data = 0; //CMD index 8, Erro check =0, rsp = 0;
1550
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1551
       while (tmp_data != 1) begin
1552
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1553
          if (tmp_data[15]) begin
1554
             $display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
1555
             tmp_data=1;
1556
          end
1557
       end
1558
    resp_data[31]=1; //Just to make it to not skip first 
1559
    while (resp_data[31]) begin //Wait until busy is clear in the card
1560
         //Send CMD 55      
1561
       addr = `SD_BASE + `command ;
1562
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
1563
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1564
      //Argument settings 
1565
       addr = `SD_BASE + `argument  ;
1566
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1567
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1568
 
1569
      //wait for response or timeout
1570
       addr = `SD_BASE + `normal_isr   ;
1571
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1572
       while (tmp_data != 1) begin
1573
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1574
          if (tmp_data[15]== 1) begin
1575
             fail = fail + 1;
1576
             addr = `SD_BASE + `error_isr ;
1577
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1578
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
1579
            `TIME;
1580
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
1581
          end
1582
        end
1583
 
1584
        //Send ACMD 41      
1585
         addr = `SD_BASE + `command ;
1586
         data = `ACMD41 | `RSP_48 ;
1587
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1588
        //Argument settings 
1589
        addr = `SD_BASE + `argument  ;
1590
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1591
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1592
        //wait for response or timeout
1593
        addr = `SD_BASE + `normal_isr   ;
1594
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1595
        while (tmp_data != 1) begin
1596
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1597
          if (tmp_data[15]== 1) begin
1598
            fail = fail + 1;
1599
            addr = `SD_BASE + `error_isr ;
1600
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1601
            test_fail_num("Error occured when sending ACMD 41  in TEST 4.0", i_addr);
1602
           `TIME;
1603
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
1604
          end
1605
          //Read response data
1606
        end
1607
        addr = `SD_BASE + `resp1   ;
1608
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1609
     end
1610
 
1611
      //Send CMD 2      
1612
       addr = `SD_BASE + `command ;
1613
       data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
1614
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1615
      //Argument settings 
1616
       addr = `SD_BASE + `argument  ;
1617
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1618
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1619
 
1620
      //wait for response or timeout
1621
       addr = `SD_BASE + `normal_isr   ;
1622
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1623
       while (tmp_data != 1) begin
1624
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1625
          if (tmp_data[15]== 1) begin
1626
            fail = fail + 1;
1627
            addr = `SD_BASE + `error_isr ;
1628
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1629
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
1630
            `TIME;
1631
             $display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
1632
         end
1633
      end
1634
 
1635
 
1636
        addr = `SD_BASE + `resp1   ;
1637
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1638
        $display("CID reg 1: %h", resp_data);
1639
 
1640
       //Send CMD 3      
1641
       addr = `SD_BASE + `command ;
1642
       data = `CMD3 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
1643
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1644
      //Argument settings 
1645
       addr = `SD_BASE + `argument  ;
1646
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1647
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1648
 
1649
      //wait for response or timeout
1650
       addr = `SD_BASE + `normal_isr   ;
1651
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1652
       while (tmp_data != 1) begin
1653
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1654
          if (tmp_data[15]== 1) begin
1655
            fail = fail + 1;
1656
            addr = `SD_BASE + `error_isr ;
1657
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1658
            test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
1659
            `TIME;
1660
             $display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
1661
         end
1662
      end
1663
        addr = `SD_BASE + `resp1   ;
1664
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1665
        card_rca= resp_data [31:16];
1666
 
1667
        $display("RCA Response: %h", resp_data);
1668
        $display("RCA Nr for data transfer: %h", card_rca);
1669
 
1670
        //Put in transferstate
1671
        //Send CMD 7      
1672
       addr = `SD_BASE + `command ;
1673
       data = `CMD7 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
1674
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1675
      //Argument settings 
1676
       addr = `SD_BASE + `argument  ;
1677
       data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
1678
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1679
        //wait for response or timeout
1680
       addr = `SD_BASE + `normal_isr   ;
1681
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1682
       while (tmp_data != 1) begin
1683
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1684
          if (tmp_data[15]== 1) begin
1685
            fail = fail + 1;
1686
            addr = `SD_BASE + `error_isr ;
1687
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1688
            test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
1689
            `TIME;
1690
             $display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
1691
         end
1692
      end
1693
 
1694
       //Set bus width
1695
 
1696
         //Send CMD 55      
1697
       addr = `SD_BASE + `command ;
1698
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
1699
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1700
      //Argument settings 
1701
       addr = `SD_BASE + `argument  ;
1702
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1703
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1704
 
1705
      //wait for response or timeout
1706
       addr = `SD_BASE + `normal_isr   ;
1707
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1708
       while (tmp_data != 1) begin
1709
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1710
          if (tmp_data[15]== 1) begin
1711
             fail = fail + 1;
1712
             addr = `SD_BASE + `error_isr ;
1713
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1714
             test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
1715
            `TIME;
1716
             $display("Error in TEST 4.0 status reg: %h", tmp_data);
1717
          end
1718
        end
1719
 
1720
        //Send ACMD 6     
1721
         addr = `SD_BASE + `command ;
1722
         data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
1723
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1724
        //Argument settings 
1725
        addr = `SD_BASE + `argument  ;
1726
        data = 2; //CMD index 0, Erro check =0, rsp = 0;
1727
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1728
        //wait for response or timeout
1729
        addr = `SD_BASE + `normal_isr   ;
1730
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1731
        while (tmp_data != 1) begin
1732
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1733
          if (tmp_data[15]== 1) begin
1734
            fail = fail + 1;
1735
            addr = `SD_BASE + `error_isr ;
1736
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1737
            test_fail_num("Error occured when sending ACMD 6  in TEST 4.0", i_addr);
1738
           `TIME;
1739
            $display("Error in TEST 4.0 status reg: %h", tmp_data);
1740
          end
1741
          //Read response data
1742
        end
1743
 
1744
        addr = `SD_BASE + `resp1   ;
1745
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1746
        $display("Card status after Bus width set %h", resp_data);
1747
       //write data
1748
 
1749
        addr = `SD_BASE + `BD_TX  ;
1750
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1751
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1752
 
1753
        addr = `SD_BASE + `BD_TX  ;
1754
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1755
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1756
 
1757
 
1758
        addr = `SD_BASE + `BD_ISR  ;
1759
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1760
 
1761
                while (  resp_data[0]  !=1   ) begin
1762
                              wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1763
                              if (resp_data[1] ) begin
1764
                               test_fail_num("Error in TEST 4.0: Data resend try >N.  BD_ISR  %h", resp_data);
1765
            `TIME;
1766
             $display("Error in TEST 4.0: Data resend try >N.  BD_ISR  %h", resp_data);
1767
                              end
1768
                              else if (resp_data[2] ) begin
1769
                                 test_fail_num("Error in TEST 4.0: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1770
            `TIME;
1771
             $display("Error in TEST 4.0: FIFO underflow/overflow.  BD_ISR  %h", resp_data);
1772
                              end
1773
            else if (resp_data[4] ) begin
1774
                                 test_fail_num("Error in TEST 4.0: Command error.  BD_ISR  %h", resp_data);
1775
            `TIME;
1776
             $display("Error in TEST 4.0: Command error.  BD_ISR  %h", resp_data);
1777
                              end
1778
                              else if (resp_data[5] ) begin
1779
                                 test_fail_num("Error in TEST 4.0: Data CRC error.  BD_ISR  %h", resp_data);
1780
            `TIME;
1781
             $display("Error in TEST 4.0: Data CRC error.  BD_ISR  %h", resp_data);
1782
                              end
1783
 
1784
 
1785
                            end
1786
 
1787
  end
1788
  end
1789
   if(fail == 0)
1790
      test_ok;
1791
    else
1792
      fail = 0;
1793
 end
1794
endtask
1795
 
1796
task test_init_sequnce; //
1797
 input  [31:0]  start_task;
1798
  input  [31:0]  end_task;
1799
  integer        bit_start_1;
1800
  integer        bit_end_1;
1801
  integer        bit_start_2;
1802
  integer        bit_end_2;
1803
  integer        num_of_reg;
1804
  integer        i_addr;
1805
  integer        i_data;
1806
  integer        i_length;
1807
  integer        tmp_data;
1808
    integer        resp_data;
1809
  reg    [31:0]  tx_bd_num;
1810
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
1811
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
1812
  integer        i;
1813
  integer        i1;
1814
  integer        i2;
1815
  integer        i3;
1816
  integer        fail;
1817
  integer        test_num;
1818
  reg    [31:0]  addr;
1819
  reg    [31:0]  data;
1820
  reg     [3:0]  sel;
1821
  reg     [3:0]  rand_sel;
1822
  reg    [31:0]  data_max;
1823
  reg [31:0] rsp;
1824
begin
1825
// access_to_reg
1826
test_heading("access_to_reg");
1827
$display(" ");
1828
$display("access_to_reg TEST");
1829
fail = 0;
1830
resp_data = 0;
1831
// reset MAC registers
1832
hard_reset;
1833
 
1834
 
1835
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
1836
begin
1837
 
1838
  //////////////////////////////////////////////////////////////////////
1839
  ////                                                          //// 
1840
  //Test 3.0:  Init sequence, With response check  
1841
  //CMD 0. Reset Card
1842
  //CMD 8. Get voltage (Only 2.0 Card response to this)            ////
1843
  //CMD55. Indicate Next Command are Application specific
1844
  //ACMD44. Get Voltage windows
1845
  //CMD2. CID reg
1846
  //CMD3. Get RCA.
1847
  //////////////////////////////////////////////////////////////////////
1848
  if (test_num == 0) //
1849
  begin
1850
 
1851
    test_name   = "3.0:  Init Seq, No Response  ";
1852
    `TIME; $display("  TEST 3.0: 0:  Init Seq, No Response  ");
1853
      wbm_init_waits = 0;
1854
      wbm_subseq_waits = {$random} % 5;
1855
     data = 0;
1856
     rand_sel = 0;
1857
     sel = 4'hF;
1858
 
1859
      //Reset Core
1860
       addr = `SD_BASE + `software ;
1861
       data = 1;
1862
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1863
      //Setup timeout reg 
1864
       addr = `SD_BASE + `timeout  ;
1865
       data = 16'h2ff;
1866
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1867
      //Clock divider /2 
1868
        addr = `SD_BASE + `clock_d   ;
1869
       data = 16'h0;
1870
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1871
      //Start Core
1872
       addr = `SD_BASE + `software ;
1873
       data = 0;
1874
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1875
 
1876
      //CMD 0 Reset card
1877
      //Setup settings 
1878
       addr = `SD_BASE + `command ;
1879
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1880
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1881
      //Argument settings 
1882
       addr = `SD_BASE + `argument  ;
1883
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1884
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1885
 
1886
      //wait for send finnish
1887
       addr = `SD_BASE + `normal_isr   ;
1888
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1889
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1890
       while (tmp_data != 1)
1891
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1892
        if (tmp_data[15]) begin
1893
         fail = fail + 1;
1894
         test_fail_num("Error occured when sending CMD0 in TEST0", i_addr);
1895
         `TIME;
1896
        $display("Normal status register is not 0x1: %h", tmp_data);
1897
        end
1898
 
1899
      //CMD 8. Get voltage (Only 2.0 Card response to this)  
1900
        addr = `SD_BASE + `command ;
1901
       data = `CMD8 | `RSP_48 ;
1902
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1903
      //Argument settings 
1904
       addr = `SD_BASE + `argument  ;
1905
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1906
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1907
 
1908
      //wait for send finnish or timeout
1909
       addr = `SD_BASE + `normal_isr   ;
1910
       data = 0; //CMD index 8, Erro check =0, rsp = 0;
1911
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1912
       while (tmp_data != 1) begin
1913
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1914
          if (tmp_data[15]) begin
1915
             $display("V 1.0 Card, Timeout In TEST 3.0 %h", tmp_data);
1916
             tmp_data=1;
1917
          end
1918
       end
1919
    resp_data[31]=1; //Just to make it to not skip first 
1920
    while (resp_data[31]) begin //Wait until busy is clear in the card
1921
         //Send CMD 55      
1922
       addr = `SD_BASE + `command ;
1923
       data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
1924
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1925
      //Argument settings 
1926
       addr = `SD_BASE + `argument  ;
1927
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1928
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1929
 
1930
      //wait for response or timeout
1931
       addr = `SD_BASE + `normal_isr   ;
1932
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1933
       while (tmp_data != 1) begin
1934
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1935
          if (tmp_data[15]== 1) begin
1936
             fail = fail + 1;
1937
             addr = `SD_BASE + `error_isr ;
1938
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1939
             test_fail_num("Error occured when sending CMD55 in TEST 3.0", i_addr);
1940
            `TIME;
1941
             $display("Error in TEST 3.0 status reg: %h", tmp_data);
1942
          end
1943
        end
1944
 
1945
        //Send ACMD 41      
1946
         addr = `SD_BASE + `command ;
1947
         data = `ACMD41 | `RSP_48 ;
1948
         wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1949
        //Argument settings 
1950
        addr = `SD_BASE + `argument  ;
1951
        data = 0; //CMD index 0, Erro check =0, rsp = 0;
1952
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1953
        //wait for response or timeout
1954
        addr = `SD_BASE + `normal_isr   ;
1955
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1956
        while (tmp_data != 1) begin
1957
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1958
          if (tmp_data[15]== 1) begin
1959
            fail = fail + 1;
1960
            addr = `SD_BASE + `error_isr ;
1961
            wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1962
            test_fail_num("Error occured when sending ACMD 41  in TEST 3.0", i_addr);
1963
           `TIME;
1964
            $display("Error in TEST 3.0 status reg: %h", tmp_data);
1965
          end
1966
          //Read response data
1967
        end
1968
        addr = `SD_BASE + `resp1   ;
1969
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1970
     end
1971
 
1972
      //Send CMD 2      
1973
       addr = `SD_BASE + `command ;
1974
       data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
1975
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1976
      //Argument settings 
1977
       addr = `SD_BASE + `argument  ;
1978
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
1979
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
1980
 
1981
      //wait for response or timeout
1982
       addr = `SD_BASE + `normal_isr   ;
1983
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1984
       while (tmp_data != 1) begin
1985
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1986
          if (tmp_data[15]== 1) begin
1987
            fail = fail + 1;
1988
            addr = `SD_BASE + `error_isr ;
1989
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1990
            test_fail_num("Error occured when sending CMD2 in TEST 3.0", i_addr);
1991
            `TIME;
1992
             $display("CMD2 Error in TEST 3.0 status reg: %h", tmp_data);
1993
         end
1994
      end
1995
 
1996
 
1997
        addr = `SD_BASE + `resp1   ;
1998
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
1999
        $display("CID reg 1: %h", resp_data);
2000
 
2001
       //Send CMD 3      
2002
       addr = `SD_BASE + `command ;
2003
       data = `CMD3 |  `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
2004
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2005
      //Argument settings 
2006
       addr = `SD_BASE + `argument  ;
2007
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2008
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2009
 
2010
      //wait for response or timeout
2011
       addr = `SD_BASE + `normal_isr   ;
2012
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2013
       while (tmp_data != 1) begin
2014
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2015
          if (tmp_data[15]== 1) begin
2016
            fail = fail + 1;
2017
            addr = `SD_BASE + `error_isr ;
2018
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2019
            test_fail_num("Error occured when sending CMD2 in TEST 3.0", i_addr);
2020
            `TIME;
2021
             $display("CMD3 Error in TEST 3.0 status reg: %h", tmp_data);
2022
         end
2023
      end
2024
        addr = `SD_BASE + `resp1   ;
2025
        wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2026
        card_rca= resp_data [31:16];
2027
 
2028
        $display("RCA Response: %h", resp_data);
2029
        $display("RCA Nr for data transfer: %h", card_rca);
2030
 
2031
  end
2032
  end
2033
   if(fail == 0)
2034
      test_ok;
2035
    else
2036
      fail = 0;
2037
 end
2038
endtask
2039
 
2040
 
2041
 
2042
 
2043
task test_access_to_reg;
2044
  input  [31:0]  start_task;
2045
  input  [31:0]  end_task;
2046
  integer        bit_start_1;
2047
  integer        bit_end_1;
2048
  integer        bit_start_2;
2049
  integer        bit_end_2;
2050
  integer        num_of_reg;
2051
  integer        i_addr;
2052
  integer        i_data;
2053
  integer        i_length;
2054
  integer        tmp_data;
2055
  reg    [31:0]  tx_bd_num;
2056
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
2057
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
2058
  integer        i;
2059
  integer        i1;
2060
  integer        i2;
2061
  integer        i3;
2062
  integer        fail;
2063
  integer        test_num;
2064
  reg    [31:0]  addr;
2065
  reg    [31:0]  data;
2066
  reg     [3:0]  sel;
2067
  reg     [3:0]  rand_sel;
2068
  reg    [31:0]  data_max;
2069
  reg [31:0] rsp;
2070
begin
2071
// access_to_reg
2072
test_heading("access_to_reg");
2073
$display(" ");
2074
$display("access_to_reg TEST");
2075
fail = 0;
2076
 
2077
// reset MAC registers
2078
hard_reset;
2079
 
2080
 
2081
//////////////////////////////////////////////////////////////////////
2082
////                                                              ////
2083
////  test_access_to_reg:                                          ////
2084
////                                                              ////
2085
////  0:  Read/Write acces register                               ////
2086
///                                             ////
2087
//////////////////////////////////////////////////////////////////////
2088
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
2089
begin
2090
 
2091
  ////////////////////////////////////////////////////////////////////
2092
  ////                                                            ////
2093
  ////  Test all RW register for:                                    ////
2094
  ////  1: Read access (Correct reset values)                     ////                      
2095
  ////  2: Write/Read                       ////
2096
  ////////////////////////////////////////////////////////////////////
2097
  if (test_num == 0) //
2098
  begin
2099
    // TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )
2100
    test_name   = "TEST 0: 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )";
2101
    `TIME; $display("  TEST 0: 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
2102
 
2103
    data = 0;
2104
    rand_sel = 0;
2105
    sel = 0;
2106
 
2107
    for (i = 1; i <= 19; i = i + 1) // num of registers
2108
    begin
2109
      wbm_init_waits = 0;
2110
      wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
2111
      case (i)
2112
      1: begin
2113
         i_addr = `bd_iser;
2114
         rsp = 0;
2115
         data = 32'h0000_00FF;
2116
       end
2117
      2:begin
2118
         i_addr = `command;
2119
         rsp = 0;
2120
         data = 32'h0000_FFFF;
2121
       end
2122
      3:begin
2123
         i_addr = `timeout;
2124
         rsp = 0;
2125
         data = 32'h0000_FFFF;
2126
       end
2127
      4: begin
2128
         i_addr = `normal_iser;
2129
         rsp = 0;
2130
         data = 32'h0000_FFFF;
2131
       end
2132
      5:begin
2133
         i_addr = `error_iser;
2134
         rsp = 0;
2135
         data = 32'h0000_FFFF;
2136
       end
2137
      6: begin
2138
         i_addr = `clock_d;
2139
         rsp = `RESET_CLK_DIV;
2140
         data = 32'h0000_00FF;
2141
       end
2142
 
2143
      19: begin
2144
         i_addr = `argument;
2145
         rsp = 0;
2146
         data = 32'hFFFF_FFFF;
2147
       end
2148
 
2149
       8: begin
2150
         i_addr = `status;
2151
         rsp = 0;
2152
       end
2153
 
2154
      9: begin
2155
         i_addr = `resp1;
2156
         rsp = 0;
2157
       end
2158
 
2159
       10: begin
2160
         i_addr = `controller;
2161
         rsp = 2;
2162
       end
2163
 
2164
       11: begin
2165
         i_addr = `block;
2166
         rsp = 16'h200;
2167
       end
2168
 
2169
        12: begin
2170
         i_addr = `power;
2171
         rsp = 16'h00F;
2172
       end
2173
 
2174
        13: begin
2175
         i_addr = `software;
2176
         rsp = 16'h000;
2177
       end
2178
 
2179
        14: begin
2180
         i_addr = `timeout;
2181
         rsp = 16'hFFFF;
2182
       end
2183
 
2184
        15: begin
2185
         i_addr = `normal_isr;
2186
         rsp = 16'h000;
2187
       end
2188
 
2189
 
2190
 
2191
 
2192
      17: begin
2193
         i_addr = `capa;
2194
         rsp = 16'h000;
2195
       end
2196
      18: begin
2197
         i_addr = `bd_status;
2198
         rsp = 16'h0808;
2199
       end
2200
 
2201
      default : begin
2202
         i_addr = `capa;
2203
         rsp = 16'h000;
2204
       end
2205
 
2206
 
2207
      endcase
2208
      addr = `SD_BASE + i_addr;
2209
      sel = 4'hF;
2210
      wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2211
      if (tmp_data !== rsp)
2212
      begin
2213
        fail = fail + 1;
2214
        test_fail_num("Register %h defaultvalue is not RSP ",i_addr);
2215
        `TIME;
2216
        $display("Wrong defaulte value @ addr %h, tmp_data %h, should b %h", addr, tmp_data,rsp);
2217
      end
2218
 
2219
        // set value to 32'hFFFF_FFFF
2220
      if ( (i<=6) || (i==19) ) begin
2221
        wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2222
        wait (wbm_working == 0);
2223
           wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2224
        if (tmp_data !== data)
2225
        begin
2226
          fail = fail + 1;
2227
          test_fail_num("Register could not be written to FFFF_FFFF", i_addr);
2228
          `TIME;
2229
          $display("Register could not be written to FFFF_FFFF - addr %h, tmp_data %h", addr, tmp_data);
2230
        end
2231
      end
2232
      end
2233
    end
2234
       // Errors were reported previously
2235
  end
2236
   if(fail == 0)
2237
      test_ok;
2238
    else
2239
      fail = 0;
2240
  end
2241
endtask
2242
 
2243
task test_send_cmd_error_rsp;
2244
input  [31:0]  start_task;
2245
  input  [31:0]  end_task;
2246
  integer        bit_start_1;
2247
  integer        bit_end_1;
2248
  integer        bit_start_2;
2249
  integer        bit_end_2;
2250
  integer        num_of_reg;
2251
  integer        i_addr;
2252
  integer        i_data;
2253
  integer        i_length;
2254
  integer        tmp_data;
2255
  reg    [31:0]  tx_bd_num;
2256
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
2257
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
2258
  integer        i;
2259
  integer        i1;
2260
  integer        i2;
2261
  integer        i3;
2262
  integer        fail;
2263
  integer        test_num;
2264
  reg    [31:0]  addr;
2265
  reg    [31:0]  data;
2266
  reg     [3:0]  sel;
2267
  reg     [3:0]  rand_sel;
2268
  reg    [31:0]  data_max;
2269
  reg [31:0] rsp;
2270
begin
2271
// test_send_cmd
2272
test_heading("Send CMD, with simulated bus error on SD_CMD line");
2273
$display(" ");
2274
$display("test_send_cmd_error_rsp");
2275
fail = 0;
2276
 
2277
// reset MAC registers
2278
hard_reset;
2279
sdModelTB0.add_wrong_cmd_crc<=1;
2280
 
2281
 
2282
//sdModelTB0.add_wrong_cmd_indx<=1;
2283
 
2284
//////////////////////////////////////////////////////////////////////
2285
////                                                          ////
2286
////  test_send_cmd:                                          ////
2287
////                                                          ////
2288
////  0:  Send CMD0, No Response                               ////
2289
///   1:  Send CMD3, 48-Bit Response, No error check
2290
///   2:  Send CMD3, 48-Bit Response, All Error check   
2291
///   3:  Send CMD2, 136-Bit Response                          ////
2292
///   
2293
//////////////////////////////////////////////////////////////////////
2294
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
2295
begin
2296
 
2297
  //////////////////////////////////////////////////////////////////////
2298
  ////                                                          //// 
2299
  //Test 5:  Send CMD, with a simulated bus error               ////
2300
  //////////////////////////////////////////////////////////////////////
2301
  if (test_num == 0) //
2302
  begin
2303
 
2304
    test_name   = "0:  Send CMD, No Response  ";
2305
    `TIME; $display("  TEST 5 part 0: Send CMD, No Response  ");
2306
      wbm_init_waits = 0;
2307
      wbm_subseq_waits = {$random} % 5;
2308
     data = 0;
2309
     rand_sel = 0;
2310
     sel = 4'hF;
2311
      //Reset Core
2312
       addr = `SD_BASE + `software ;
2313
       data = 1;
2314
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2315
      //Setup timeout reg 
2316
       addr = `SD_BASE + `timeout  ;
2317
       data = 16'hff;
2318
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2319
      //Clock divider /2 
2320
        addr = `SD_BASE + `clock_d   ;
2321
       data = 16'h0;
2322
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2323
      //Start Core
2324
       addr = `SD_BASE + `software ;
2325
       data = 0;
2326
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2327
       sdModelTB0.add_wrong_cmd_crc<=1;
2328
      //Setup settings 
2329
       addr = `SD_BASE + `command ;
2330
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2331
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2332
      //Argument settings 
2333
       addr = `SD_BASE + `argument  ;
2334
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2335
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2336
      //wait for send finnish
2337
       addr = `SD_BASE + `normal_isr   ;
2338
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2339
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2340
       while (tmp_data != 1)
2341
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2342
 
2343
 
2344
       if (tmp_data[15]) begin
2345
         fail = fail + 1;
2346
         test_fail_num("Error occured when sending CMD0 in TEST5", i_addr);
2347
         `TIME;
2348
        $display("Normal status register is not 0x1: %h", tmp_data);
2349
       end
2350
 
2351
 
2352
 
2353
 
2354
    end
2355
            sdModelTB0.add_wrong_cmd_crc<=1;
2356
            sdModelTB0.add_wrong_cmd_indx<=1;
2357
   //////////////////////////////////////////////////////////////////////
2358
   ////    Prereq: A valid CMD index which responde with 48 bit has to be sent //
2359
   /// Test 1:  Send CMD, 48-Bit Response, No error check             ////
2360
   //////////////////////////////////////////////////////////////////////
2361
    if (test_num == 1) //
2362
    begin
2363
     test_name   = "  TEST 5, part 1:   Send CMD, 48-Bit Response, No error check   ";
2364
    `TIME; $display("  TEST 5, part 1:  Send CMD, 48-Bit Response, No error check  ");
2365
      wbm_init_waits = 0;
2366
      wbm_subseq_waits = {$random} % 5;
2367
     data = 0;
2368
     rand_sel = 0;
2369
     sel = 4'hF;
2370
 
2371
      //Reset Core
2372
       addr = `SD_BASE + `software ;
2373
       data = 1;
2374
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2375
      //Setup timeout reg 
2376
       addr = `SD_BASE + `timeout  ;
2377
       data = 16'h1ff;
2378
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2379
      //Clock divider /2 
2380
        addr = `SD_BASE + `clock_d   ;
2381
       data = 16'h0;
2382
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2383
      //Start Core
2384
       addr = `SD_BASE + `software ;
2385
       data = 0;
2386
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2387
      //Setup settings 
2388
       addr = `SD_BASE + `command ;
2389
       data = `CMD3 | `RSP_48 ; //CMD index 3, Erro check =0, rsp = 48 bit;
2390
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2391
      //Argument settings 
2392
       addr = `SD_BASE + `argument  ;
2393
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2394
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2395
 
2396
      //wait for response or timeout
2397
       addr = `SD_BASE + `normal_isr   ;
2398
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2399
       while (tmp_data != 1) begin
2400
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2401
          if (tmp_data[15]== 1) begin
2402
            fail = fail + 1;
2403
            addr = `SD_BASE + `error_isr ;
2404
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2405
            test_fail_num("Error occured when sending CMD3 in TEST 5", i_addr);
2406
            `TIME;
2407
             $display("Error status reg: %h", tmp_data);
2408
        end
2409
 
2410
      end
2411
 
2412
       if (tmp_data[15]) begin
2413
         fail = fail + 1;
2414
         test_fail_num("Error occured when sending CMD3 in TEST 5", i_addr);
2415
         `TIME;
2416
        $display("Normal status register is not 0x1: %h", tmp_data);
2417
       end
2418
 
2419
    end
2420
     //////////////////////////////////////////////////////////////////////
2421
   ////Prereq: A valid CMD index which responde with 48 bit has to be sent //
2422
   /// Test 2:  Send CMD3, 48-Bit Response, All Error check  enable     ////
2423
   //////////////////////////////////////////////////////////////////////
2424
    if (test_num == 2) //
2425
    begin
2426
     test_name   = " TEST 5, part 2:   Send CMD3, 48-Bit Response, All Error check  enable   ";
2427
    `TIME; $display("  TEST 5, part 2:   Send CMD3, 48-Bit Response, All Error check  enable   ");
2428
      wbm_init_waits = 0;
2429
      wbm_subseq_waits = {$random} % 5;
2430
     data = 0;
2431
     rand_sel = 0;
2432
     sel = 4'hF;
2433
 
2434
      //Reset Core
2435
       addr = `SD_BASE + `software ;
2436
       data = 1;
2437
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2438
      //Setup timeout reg 
2439
       addr = `SD_BASE + `timeout  ;
2440
       data = 16'h1ff;
2441
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2442
      //Clock divider /2 
2443
        addr = `SD_BASE + `clock_d   ;
2444
       data = 16'h0;
2445
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2446
      //Start Core
2447
       addr = `SD_BASE + `software ;
2448
       data = 0;
2449
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2450
      //Setup settings 
2451
       addr = `SD_BASE + `command ;
2452
       data = `CMD3 | `CICE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
2453
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2454
      //Argument settings 
2455
       addr = `SD_BASE + `argument  ;
2456
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2457
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2458
 
2459
      //wait for response or timeout
2460
       addr = `SD_BASE + `normal_isr   ;
2461
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2462
       while (tmp_data == 0) begin
2463
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2464
          if (tmp_data[15]== 1) begin
2465
 
2466
            addr = `SD_BASE + `error_isr ;
2467
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2468
 
2469
            `TIME;
2470
             $display("Bus error catched, Error status reg: %h", tmp_data);
2471
 
2472
        end
2473
 
2474
      end
2475
 
2476
         addr = `SD_BASE + `normal_isr   ;
2477
        wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2478
       if (tmp_data[15]) begin
2479
 
2480
         `TIME;
2481
        $display("Normal status register is  0x1: %h, bus error succesfully captured", tmp_data);
2482
       end
2483
       else begin
2484
          test_fail_num("Bus error wasent captured, Normal status register is: %h",tmp_data);
2485
         `TIME;
2486
          $display("Bus error wasent captured, Normal status register is : %h",tmp_data);
2487
        fail = fail + 1;
2488
       end
2489
 
2490
 
2491
 
2492
 
2493
 
2494
    end
2495
     if (test_num == 3) //
2496
    begin
2497
     test_name   = " Test 5 part 4:   Send CMD2, 136-Bit    ";
2498
    `TIME; $display("  Test 5 part 4:  Send CMD2, 136-Bit    ");
2499
      wbm_init_waits = 0;
2500
      wbm_subseq_waits = {$random} % 5;
2501
     data = 0;
2502
     rand_sel = 0;
2503
     sel = 4'hF;
2504
 
2505
      //Reset Core
2506
       addr = `SD_BASE + `software ;
2507
       data = 1;
2508
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2509
      //Setup timeout reg 
2510
       addr = `SD_BASE + `timeout  ;
2511
       data = 16'h1ff;
2512
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2513
      //Clock divider /2 
2514
        addr = `SD_BASE + `clock_d   ;
2515
       data = 16'h0;
2516
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2517
      //Start Core
2518
       addr = `SD_BASE + `software ;
2519
       data = 0;
2520
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2521
      //Setup settings 
2522
       addr = `SD_BASE + `command ;
2523
       data = `CMD2 | `RSP_136 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
2524
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2525
      //Argument settings 
2526
       addr = `SD_BASE + `argument  ;
2527
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2528
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2529
 
2530
      //wait for response or timeout
2531
       addr = `SD_BASE + `normal_isr   ;
2532
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2533
       while (tmp_data != 1) begin
2534
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2535
          if (tmp_data[15]== 1) begin
2536
            fail = fail + 1;
2537
            addr = `SD_BASE + `error_isr ;
2538
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2539
            test_fail_num("Error occured when sending CMD2 in TEST 5", i_addr);
2540
            `TIME;
2541
             $display("Error status reg: %h", tmp_data);
2542
        end
2543
 
2544
      end
2545
 
2546
       if (tmp_data[15]) begin
2547
         fail = fail + 1;
2548
         test_fail_num("Error occured when sending CMD2 in TEST3", i_addr);
2549
         `TIME;
2550
        $display("Normal status register is not 0x1: %h", tmp_data);
2551
       end
2552
 
2553
 
2554
 
2555
 
2556
 
2557
    end
2558
 
2559
  end
2560
   if(fail == 0)
2561
      test_ok;
2562
    else
2563
      fail = 0;
2564
  end
2565
endtask
2566
////////////////////////////////////////////////////////////////////////////
2567
task IRQ_test_send_cmd;
2568
  input  [31:0]  start_task;
2569
  input  [31:0]  end_task;
2570
  integer        bit_start_1;
2571
  integer        bit_end_1;
2572
  integer        bit_start_2;
2573
  integer        bit_end_2;
2574
  integer        num_of_reg;
2575
  integer        i_addr;
2576
  integer        i_data;
2577
  integer        i_length;
2578
  integer        tmp_data;
2579
  reg    [31:0]  tx_bd_num;
2580
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
2581
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
2582
  integer        i;
2583
  integer        i1;
2584
  integer        i2;
2585
  integer        i3;
2586
  integer        fail;
2587
  integer        test_num;
2588
  reg    [31:0]  addr;
2589
  reg    [31:0]  data;
2590
  reg     [3:0]  sel;
2591
  reg     [3:0]  rand_sel;
2592
  reg    [31:0]  data_max;
2593
  reg [31:0] rsp;
2594
begin
2595
// test_send_cmd
2596
test_heading("IRQ Send CMD");
2597
$display(" ");
2598
$display("IRQ test_send_cmd TEST");
2599
fail = 0;
2600
 
2601
// reset MAC registers
2602
hard_reset;
2603
 
2604
 
2605
//////////////////////////////////////////////////////////////////////
2606
////                                                          ////
2607
////  test_send_cmd:                                          ////
2608
////                                                          ////
2609
////  0:  Send CMD0, No Response                               ////
2610
///   1:  Send CMD3, 48-Bit Response, No error check
2611
///   2:  Send CMD3, 48-Bit Response, All Error check   
2612
///   3:  Send CMD2, 136-Bit Response                          ////
2613
///   
2614
//////////////////////////////////////////////////////////////////////
2615
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
2616
begin
2617
 
2618
  //////////////////////////////////////////////////////////////////////
2619
  ////                                                          //// 
2620
  //Test 0:  Send CMD, No Response                               ////
2621
  //////////////////////////////////////////////////////////////////////
2622
  if (test_num == 0) //
2623
  begin
2624
 
2625
    test_name   = "0:  Send CMD, No Response  ";
2626
    `TIME; $display("  TEST 0: 0:  Send CMD, No Response  ");
2627
      wbm_init_waits = 0;
2628
      wbm_subseq_waits = {$random} % 5;
2629
     data = 0;
2630
     rand_sel = 0;
2631
     sel = 4'hF;
2632
 
2633
      //Reset Core
2634
       addr = `SD_BASE + `software ;
2635
       data = 1;
2636
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2637
      //Setup timeout reg 
2638
       addr = `SD_BASE + `timeout  ;
2639
       data = 16'h80;
2640
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2641
      //Clock divider /2 
2642
        addr = `SD_BASE + `clock_d   ;
2643
       data = 16'h0;
2644
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2645
      //Start Core
2646
       addr = `SD_BASE + `software ;
2647
       data = 0;
2648
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2649
 
2650
      //Enable IRQ_A on Normal Interupt register, Sending complete and Send Fail
2651
       addr = `SD_BASE + `normal_iser ;
2652
       data = 16'h8001;
2653
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2654
 
2655
 
2656
      //Setup settings for command
2657
       addr = `SD_BASE + `command ;
2658
       data = 16'h802; //CMD index 0, Erro check =0, rsp = 0;
2659
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2660
      //Argument settings for command
2661
       addr = `SD_BASE + `argument  ;
2662
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2663
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2664
 
2665
      //wait for send finnish
2666
       addr = `SD_BASE + `normal_isr   ;
2667
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2668
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2669
       while (tmp_data != 1)
2670
         wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2671
 
2672
      //When send finnish check if any error
2673
       addr = `SD_BASE + `error_isr   ;
2674
       data = 0;
2675
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2676
 
2677
       if (tmp_data[15]) begin
2678
         fail = fail + 1;
2679
         test_fail_num("Error occured when sending CMD0", i_addr);
2680
         `TIME;
2681
        $display("Normal status register is not 0x1: %h", tmp_data);
2682
       end
2683
 
2684
 
2685
 
2686
 
2687
    end
2688
 
2689
 
2690
   //////////////////////////////////////////////////////////////////////
2691
   ////    Prereq: A valid CMD index which responde with 48 bit has to be sent //
2692
   /// Test 1:  Send CMD, 48-Bit Response, No error check             ////
2693
   //////////////////////////////////////////////////////////////////////
2694
    if (test_num == 1) //
2695
    begin
2696
     test_name   = "  1:  Send CMD, 48-Bit Response, No error check   ";
2697
    `TIME; $display("  TEST 1:  Send CMD, 48-Bit Response, No error check  ");
2698
      wbm_init_waits = 0;
2699
      wbm_subseq_waits = {$random} % 5;
2700
     data = 0;
2701
     rand_sel = 0;
2702
     sel = 4'hF;
2703
 
2704
      //Reset Core
2705
       addr = `SD_BASE + `software ;
2706
       data = 1;
2707
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2708
      //Setup timeout reg 
2709
       addr = `SD_BASE + `timeout  ;
2710
       data = 16'h1ff;
2711
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2712
      //Clock divider /2 
2713
        addr = `SD_BASE + `clock_d   ;
2714
       data = 16'h0;
2715
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2716
      //Start Core
2717
       addr = `SD_BASE + `software ;
2718
       data = 0;
2719
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2720
      //Setup settings 
2721
       addr = `SD_BASE + `command ;
2722
       data = `CMD3 | `RSP_48 ; //CMD index 3, Erro check =0, rsp = 48 bit;
2723
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2724
      //Argument settings 
2725
       addr = `SD_BASE + `argument  ;
2726
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2727
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2728
 
2729
      //wait for response or timeout
2730
       addr = `SD_BASE + `normal_isr   ;
2731
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2732
       while (tmp_data != 1) begin
2733
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2734
          if (tmp_data[15]== 1) begin
2735
            fail = fail + 1;
2736
            addr = `SD_BASE + `error_isr ;
2737
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2738
            test_fail_num("Error occured when sending CMD3 in TEST 1", i_addr);
2739
            `TIME;
2740
             $display("Error status reg: %h", tmp_data);
2741
        end
2742
 
2743
      end
2744
 
2745
       if (tmp_data[15]) begin
2746
         fail = fail + 1;
2747
         test_fail_num("Error occured when sending CMD3 in TEST 1", i_addr);
2748
         `TIME;
2749
        $display("Normal status register is not 0x1: %h", tmp_data);
2750
       end
2751
 
2752
    end
2753
     //////////////////////////////////////////////////////////////////////
2754
   ////Prereq: A valid CMD index which responde with 48 bit has to be sent //
2755
   /// Test 2:  Send CMD3, 48-Bit Response, All Error check  enable     ////
2756
   //////////////////////////////////////////////////////////////////////
2757
    if (test_num == 2) //
2758
    begin
2759
     test_name   = " 2:  Send CMD3, 48-Bit Response, All Error check  enable   ";
2760
    `TIME; $display("  Test 2:  Send CMD3, 48-Bit Response, All Error check  enable   ");
2761
      wbm_init_waits = 0;
2762
      wbm_subseq_waits = {$random} % 5;
2763
     data = 0;
2764
     rand_sel = 0;
2765
     sel = 4'hF;
2766
 
2767
      //Reset Core
2768
       addr = `SD_BASE + `software ;
2769
       data = 1;
2770
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2771
      //Setup timeout reg 
2772
       addr = `SD_BASE + `timeout  ;
2773
       data = 16'h1ff;
2774
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2775
      //Clock divider /2 
2776
        addr = `SD_BASE + `clock_d   ;
2777
       data = 16'h0;
2778
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2779
      //Start Core
2780
       addr = `SD_BASE + `software ;
2781
       data = 0;
2782
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2783
      //Setup settings 
2784
       addr = `SD_BASE + `command ;
2785
       data = `CMD3 | `CICE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
2786
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2787
      //Argument settings 
2788
       addr = `SD_BASE + `argument  ;
2789
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2790
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2791
 
2792
      //wait for response or timeout
2793
       addr = `SD_BASE + `normal_isr   ;
2794
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2795
       while (tmp_data != 1) begin
2796
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2797
          if (tmp_data[15]== 1) begin
2798
            fail = fail + 1;
2799
            addr = `SD_BASE + `error_isr ;
2800
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2801
            test_fail_num("Error occured when sending CMD3 in TEST 2", i_addr);
2802
            `TIME;
2803
             $display("Error status reg: %h", tmp_data);
2804
        end
2805
 
2806
      end
2807
 
2808
       if (tmp_data[15]) begin
2809
         fail = fail + 1;
2810
         test_fail_num("Error occured when sending CMD3 in TEST2", i_addr);
2811
         `TIME;
2812
        $display("Normal status register is not 0x1: %h", tmp_data);
2813
       end
2814
 
2815
 
2816
 
2817
 
2818
 
2819
    end
2820
     if (test_num == 3) //
2821
    begin
2822
     test_name   = " 3:  Send CMD2, 136-Bit    ";
2823
    `TIME; $display("  Test 3:  Send CMD2, 136-Bit    ");
2824
      wbm_init_waits = 0;
2825
      wbm_subseq_waits = {$random} % 5;
2826
     data = 0;
2827
     rand_sel = 0;
2828
     sel = 4'hF;
2829
 
2830
      //Reset Core
2831
       addr = `SD_BASE + `software ;
2832
       data = 1;
2833
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2834
      //Setup timeout reg 
2835
       addr = `SD_BASE + `timeout  ;
2836
       data = 16'h1ff;
2837
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2838
      //Clock divider /2 
2839
        addr = `SD_BASE + `clock_d   ;
2840
       data = 16'h0;
2841
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2842
      //Start Core
2843
       addr = `SD_BASE + `software ;
2844
       data = 0;
2845
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2846
      //Setup settings 
2847
       addr = `SD_BASE + `command ;
2848
       data = `CMD2 | `RSP_136 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
2849
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2850
      //Argument settings 
2851
       addr = `SD_BASE + `argument  ;
2852
       data = 0; //CMD index 0, Erro check =0, rsp = 0;
2853
       wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
2854
 
2855
      //wait for response or timeout
2856
       addr = `SD_BASE + `normal_isr   ;
2857
       wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2858
       while (tmp_data != 1) begin
2859
          wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2860
          if (tmp_data[15]== 1) begin
2861
            fail = fail + 1;
2862
            addr = `SD_BASE + `error_isr ;
2863
             wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
2864
            test_fail_num("Error occured when sending CMD2 in TEST 3", i_addr);
2865
            `TIME;
2866
             $display("Error status reg: %h", tmp_data);
2867
        end
2868
 
2869
      end
2870
 
2871
       if (tmp_data[15]) begin
2872
         fail = fail + 1;
2873
         test_fail_num("Error occured when sending CMD2 in TEST3", i_addr);
2874
         `TIME;
2875
        $display("Normal status register is not 0x1: %h", tmp_data);
2876
       end
2877
 
2878
 
2879
 
2880
 
2881
 
2882
    end
2883
 
2884
  end
2885
   if(fail == 0)
2886
      test_ok;
2887
    else
2888
      fail = 0;
2889
  end
2890
endtask
2891
 
2892
 
2893
 
2894
 
2895
 
2896
 
2897
 
2898
 
2899
 
2900
 
2901
 
2902
 
2903
 
2904
 
2905
//Tasks
2906
task wbm_write;
2907
  input  [31:0] address_i;
2908
  input  [31:0] data_i;
2909
  input  [3:0]  sel_i;
2910
  input  [31:0] size_i;
2911
  input  [3:0]  init_waits_i;
2912
  input  [3:0]  subseq_waits_i;
2913
 
2914
  reg `WRITE_STIM_TYPE write_data;
2915
  reg `WB_TRANSFER_FLAGS flags;
2916
  reg `WRITE_RETURN_TYPE write_status;
2917
  integer i;
2918
begin
2919
  wbm_working = 1;
2920
 
2921
  write_status = 0;
2922
 
2923
  flags                    = 0;
2924
  flags`WB_TRANSFER_SIZE   = size_i;
2925
  flags`INIT_WAITS         = init_waits_i;
2926
  flags`SUBSEQ_WAITS       = subseq_waits_i;
2927
 
2928
  write_data               = 0;
2929
  write_data`WRITE_DATA    = data_i[31:0];
2930
  write_data`WRITE_ADDRESS = address_i;
2931
  write_data`WRITE_SEL     = sel_i;
2932
 
2933
  for (i = 0; i < size_i; i = i + 1)
2934
  begin
2935
    wb_master.blk_write_data[i] = write_data;
2936
    data_i                      = data_i >> 32;
2937
    write_data`WRITE_DATA       = data_i[31:0];
2938
    write_data`WRITE_ADDRESS    = write_data`WRITE_ADDRESS + 4;
2939
  end
2940
 
2941
  wb_master.wb_block_write(flags, write_status);
2942
 
2943
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
2944
  begin
2945
    `TIME;
2946
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
2947
  end
2948
 
2949
  @(posedge wb_clk);
2950
  #3;
2951
  wbm_working = 0;
2952
  #1;
2953
end
2954
endtask // wbm_write
2955
 
2956
 
2957
task wbm_read;
2958
  input  [31:0] address_i;
2959
  output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
2960
  input  [3:0]  sel_i;
2961
  input  [31:0] size_i;
2962
  input  [3:0]  init_waits_i;
2963
  input  [3:0]  subseq_waits_i;
2964
 
2965
  reg `READ_RETURN_TYPE read_data;
2966
  reg `WB_TRANSFER_FLAGS flags;
2967
  reg `READ_RETURN_TYPE read_status;
2968
  integer i;
2969
begin
2970
  wbm_working = 1;
2971
 
2972
  read_status = 0;
2973
  data_o      = 0;
2974
 
2975
  flags                  = 0;
2976
  flags`WB_TRANSFER_SIZE = size_i;
2977
  flags`INIT_WAITS       = init_waits_i;
2978
  flags`SUBSEQ_WAITS     = subseq_waits_i;
2979
 
2980
  read_data              = 0;
2981
  read_data`READ_ADDRESS = address_i;
2982
  read_data`READ_SEL     = sel_i;
2983
 
2984
  for (i = 0; i < size_i; i = i + 1)
2985
  begin
2986
    wb_master.blk_read_data_in[i] = read_data;
2987
    read_data`READ_ADDRESS        = read_data`READ_ADDRESS + 4;
2988
  end
2989
 
2990
  wb_master.wb_block_read(flags, read_status);
2991
 
2992
  if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
2993
  begin
2994
    `TIME;
2995
    $display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
2996
  end
2997
 
2998
  for (i = 0; i < size_i; i = i + 1)
2999
  begin
3000
    data_o       = data_o << 32;
3001
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
3002
    data_o[31:0] = read_data`READ_DATA;
3003
  end
3004
 
3005
  @(posedge wb_clk);
3006
  #3;
3007
  wbm_working = 0;
3008
  #1;
3009
end
3010
endtask // wbm_read
3011
 
3012
 
3013
task clear_memories;
3014
  reg    [22:0]  adr_i;
3015
  reg            delta_t;
3016
begin
3017
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
3018
  begin
3019
 
3020
    wb_slave.wb_memory[adr_i[21:2]] = 0;
3021
  end
3022
end
3023
endtask // clear_memories
3024
 
3025
task hard_reset; //  MAC registers
3026
begin
3027
  // reset MAC registers
3028
  @(posedge wb_clk);
3029
  #2 wb_rst = 1'b1;
3030
  repeat(2) @(posedge wb_clk);
3031
  #2 wb_rst = 1'b0;
3032
end
3033
endtask // hard_reset
3034
 
3035
task test_fail_num ;
3036
  input [7999:0] failure_reason ;
3037
  input [31:0]   number ;
3038
//  reg   [8007:0] display_failure ;
3039
  reg   [7999:0] display_failure ;
3040
  reg   [799:0] display_test ;
3041
begin
3042
  tests_failed = tests_failed + 1 ;
3043
 
3044
  display_failure = failure_reason; // {failure_reason, "!"} ;
3045
  while ( display_failure[7999:7992] == 0 )
3046
    display_failure = display_failure << 8 ;
3047
 
3048
  display_test = test_name ;
3049
  while ( display_test[799:792] == 0 )
3050
    display_test = display_test << 8 ;
3051
 
3052
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
3053
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
3054
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
3055
  $fdisplay( tb_log_file, "    *FAILED* because") ;
3056
  $fdisplay( tb_log_file, "    %s; %d", display_failure, number ) ;
3057
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
3058
  $fdisplay( tb_log_file, " " ) ;
3059
 
3060
 `ifdef STOP_ON_FAILURE
3061
    #20 $stop ;
3062
 `endif
3063
end
3064
endtask // test_fail_num
3065
 
3066
task test_ok ;
3067
  reg [799:0] display_test ;
3068
begin
3069
  tests_successfull = tests_successfull + 1 ;
3070
 
3071
  display_test = test_name ;
3072
  while ( display_test[799:792] == 0 )
3073
    display_test = display_test << 8 ;
3074
 
3075
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
3076
  $fdisplay( tb_log_file, "    At time: %t ", $time ) ;
3077
  $fdisplay( tb_log_file, "    Test: %s", display_test ) ;
3078
  $fdisplay( tb_log_file, "    reported *SUCCESSFULL*! ") ;
3079
  $fdisplay( tb_log_file, "    *************************************************************************************" ) ;
3080
  $fdisplay( tb_log_file, " " ) ;
3081
end
3082
endtask // test_ok
3083
 
3084
 
3085
task test_heading;
3086
  input [799:0] test_heading ;
3087
  reg   [799:0] display_test ;
3088
begin
3089
  display_test = test_heading;
3090
  while ( display_test[799:792] == 0 )
3091
    display_test = display_test << 8 ;
3092
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
3093
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
3094
  $fdisplay( tb_log_file, "  Heading: %s", display_test ) ;
3095
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
3096
  $fdisplay( tb_log_file, "  ***************************************************************************************" ) ;
3097
  $fdisplay( tb_log_file, " " ) ;
3098
end
3099
endtask // test_heading
3100
 
3101
endmodule

powered by: WebSVN 2.1.0

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