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

Subversion Repositories sd_card_controller

[/] [sd_card_controller/] [trunk/] [bench/] [verilog/] [sd_controller_top_tb.sv] - Blame information for rev 3

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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