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 136

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

powered by: WebSVN 2.1.0

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