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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [bench/] [verilog/] [tests.v] - Blame information for rev 8

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

Line No. Rev Author Line
1 4 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Top Level Test Bench                                       ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000 Rudolf Usselmann                         ////
15
////                    rudi@asics.ws                            ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39
//
40 8 rudi
//  $Id: tests.v,v 1.2 2001-08-10 08:16:21 rudi Exp $
41 4 rudi
//
42 8 rudi
//  $Date: 2001-08-10 08:16:21 $
43
//  $Revision: 1.2 $
44 4 rudi
//  $Author: rudi $
45
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50 8 rudi
//               Revision 1.1  2001/07/29 07:34:40  rudi
51
//
52
//
53
//               1) Changed Directory Structure
54
//               2) Fixed several minor bugs
55
//
56 4 rudi
//               Revision 1.1.1.1  2001/05/13 09:36:38  rudi
57
//               Created Directory Structure
58
//
59
//
60
//
61
//                        
62
 
63
 
64
task sdram_rd1;
65
input           quick;
66
 
67
integer         quick;
68
integer         n;
69
integer         del, size;
70
reg     [7:0]    mode;
71
reg     [2:0]    bs;
72
integer         sz_inc;
73
integer         sz_max, del_max;
74
integer         write;
75
 
76
begin
77
$display("\n\n");
78
$display("*****************************************************");
79
$display("*** SDRAM Size, Delay & Mode Read test 1 ...      ***");
80
$display("*****************************************************\n");
81
 
82
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
83
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
84
 
85
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
86
                                        1'd0,   // Wr. Burst Len (1=Single)
87
                                        2'd0,   // Op Mode
88
                                        3'd2,   // CL
89
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
90
                                        3'd3    // Burst Length
91
                                        });
92
 
93
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821);
94
 
95
case(quick)
96
 0: sz_max = 64;
97
 1: sz_max = 32;
98
 2: sz_max = 16;
99
endcase
100
 
101
case(quick)
102
 0: del_max = 16;
103
 1: del_max = 8;
104
 2: del_max = 4;
105
endcase
106
 
107 8 rudi
size = 8;
108 4 rudi
del = 0;
109 8 rudi
mode = 8;
110 4 rudi
write = 1;
111
//force sdram0.Debug = 1;
112
 
113
for(mode=0;mode<10;mode=mode+1)
114
begin
115
        sdram0.mem_fill(1024);
116
 
117
        case(mode[3:1])
118
           0: bs = 0;
119
           1: bs = 1;
120
           2: bs = 2;
121
           3: bs = 3;
122
           4: bs = 7;
123
        endcase
124
 
125
        case(mode[3:1])
126
           0: sz_inc = 1;
127
           1: sz_inc = 2;
128
           2: sz_inc = 4;
129
           3: sz_inc = 8;
130
           4: sz_inc = 1;
131
        endcase
132
 
133
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
134
                                        1'd0,           // Wr. Burst Len (1=Single)
135
                                        2'd0,           // Op Mode
136
                                        3'd2+mode[0],    // CL
137
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
138
                                        3'd0+bs         // Burst Length
139
                                        });
140
 
141
if(!verbose)    $display("Mode: %b", mode);
142
for(del=0;del<del_max;del=del+1)
143
for(size=sz_inc;size<sz_max;size=size+sz_inc)
144
   begin
145
        m0.mem_fill;
146
 
147
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
148
 
149
        if(write)       m0.wb_wr_mult(`MEM_BASE +        0, 4'hf, del, size);
150
        m0.wb_rd_mult(`MEM_BASE +        0, 4'hf, del, size);
151
 
152
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
153
        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
154
 
155
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
156
        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
157
 
158
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
159
        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
160
 
161
        for(n=0;n<(size*4);n=n+1)
162
           begin
163
                if((sdram0.Bank0[n] !== m0.rd_mem[n]) |
164
                        (|sdram0.Bank0[n] === 1'bx) |
165
                        (|m0.rd_mem[n] === 1'bx)         )
166
                   begin
167
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
168
                        n, sdram0.Bank0[n], m0.rd_mem[n],  $time);
169
                        error_cnt = error_cnt + 1;
170
                   end
171
           end
172
   end
173
 
174
end
175
 
176
show_errors;
177
$display("*****************************************************");
178
$display("*** Test DONE ...                                 ***");
179
$display("*****************************************************\n\n");
180
end
181
endtask
182
 
183
 
184
 
185
task sdram_wr1;
186
input           quick;
187
 
188
integer         quick;
189
integer         n;
190
integer         del, size;
191
reg     [7:0]    mode;
192
reg     [2:0]    bs;
193
integer         sz_inc;
194
integer         sz_max, del_max;
195
integer         read;
196
 
197
begin
198
$display("\n\n");
199
$display("*****************************************************");
200
$display("*** SDRAM Size, Delay & Mode Write test 1 ...     ***");
201
$display("*****************************************************\n");
202
 
203
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
204
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
205
 
206
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
207
                                        1'd0,   // Wr. Burst Len (1=Single)
208
                                        2'd0,   // Op Mode
209
                                        3'd2,   // CL
210
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
211
                                        3'd3    // Burst Length
212
                                        });
213
 
214
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821);
215
 
216
case(quick)
217
 0: sz_max = 64;
218
 1: sz_max = 32;
219
 2: sz_max = 16;
220
endcase
221
 
222
case(quick)
223
 0: del_max = 16;
224
 1: del_max = 8;
225
 2: del_max = 4;
226
endcase
227
 
228
size = 2;
229
del = 2;
230
mode = 0;
231
read = 1;
232
//force sdram0.Debug = 1;
233
 
234
for(mode=0;mode<20;mode=mode+1)
235
begin
236
        sdram0.mem_fill(1024);
237
 
238
        case(mode[4:2])
239
           0: bs = 0;
240
           1: bs = 1;
241
           2: bs = 2;
242
           3: bs = 3;
243
           4: bs = 7;
244
        endcase
245
 
246
        if(mode[1])
247
           sz_inc = 1;
248
        else
249
                case(mode[4:2])
250
                   0: sz_inc = 1;
251
                   1: sz_inc = 2;
252
                   2: sz_inc = 4;
253
                   3: sz_inc = 8;
254
                   4: sz_inc = 1;
255
                endcase
256
 
257
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
258
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
259
                                        2'd0,           // Op Mode
260
                                        3'd2+mode[0],    // CL
261
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
262
                                        3'd0+bs         // Burst Length
263
                                        });
264
 
265
if(!verbose)    $display("Mode: %b", mode);
266
 
267
for(del=0;del<del_max;del=del+1)
268
for(size=sz_inc;size<sz_max;size=size+sz_inc)
269
   begin
270
        m0.mem_fill;
271
 
272
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
273
 
274
        m0.wb_wr_mult(`MEM_BASE +        0, 4'hf, del, size);
275
        if(read)        m0.wb_rd_mult(`MEM_BASE +        0, 4'hf, del, size);
276
 
277
        m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
278
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
279
 
280
        m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
281
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
282
 
283
        m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
284
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
285
 
286
        repeat(10)      @(posedge clk);
287
 
288
        for(n=0;n< (size*4);n=n+1)
289
           begin
290
                if((sdram0.Bank0[n] !== m0.wr_mem[n]) |
291
                        (|sdram0.Bank0[n] === 1'bx) |
292
                        (|m0.wr_mem[n] === 1'bx)         )
293
                   begin
294
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
295
                        n, sdram0.Bank0[n], m0.wr_mem[n],  $time);
296
                        error_cnt = error_cnt + 1;
297
                   end
298
           end
299
   end
300
 
301
end
302
 
303
show_errors;
304
$display("*****************************************************");
305
$display("*** Test DONE ...                                 ***");
306
$display("*****************************************************\n\n");
307
end
308
endtask
309
 
310
 
311
task sdram_rd2;
312
input           quick;
313
 
314
integer         quick;
315
integer         n,m,adr;
316
integer         del, size;
317
reg     [7:0]    mode;
318
reg     [2:0]    bs;
319
integer         sz_inc;
320
integer         sz_max, del_max;
321
reg     [2:0]    bas;
322
reg     [31:0]   data;
323
integer         page_size;
324
 
325
begin
326
 
327
$display("\n\n");
328
$display("*****************************************************");
329
$display("*** SDRAM Size, Delay & Mode Read test 2 ...      ***");
330
$display("*** Different Row and Bank                        ***");
331
$display("*****************************************************\n");
332
 
333
page_size = 256; // 64 mbit x 32 SDRAM
334
 
335
case(quick)
336
 0: sz_max = 32;
337
 1: sz_max = 32;
338
 2: sz_max = 16;
339
endcase
340
 
341
case(quick)
342
 0: del_max = 16;
343
 1: del_max = 8;
344
 2: del_max = 4;
345
endcase
346
 
347
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
348
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
349
 
350
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
351
                                        1'd0,   // Wr. Burst Len (1=Single)
352
                                        2'd0,   // Op Mode
353
                                        3'd2,   // CL
354
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
355
                                        3'd3    // Burst Length
356
                                        });
357
 
358
bas = 0;
359
for(bas=0;bas<2;bas=bas+1)
360
begin
361
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821 | (bas[0]<<9));
362
 
363
size = 33;
364
del = 0;
365
mode = 0;
366
 
367
//force sdram0.Debug = 1;
368
 
369
for(mode=0;mode<10;mode=mode+1)
370
begin
371
        sdram0.mem_fill(1024);
372
 
373
        case(mode[3:1])
374
           0: bs = 0;
375
           1: bs = 1;
376
           2: bs = 2;
377
           3: bs = 3;
378
           4: bs = 7;
379
        endcase
380
 
381
        case(mode[3:1])
382
           0: sz_inc = 1;
383
           1: sz_inc = 2;
384
           2: sz_inc = 4;
385
           3: sz_inc = 8;
386
           4: sz_inc = 1;
387
        endcase
388
 
389
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
390
                                        1'd0,           // Wr. Burst Len (1=Single)
391
                                        2'd0,           // Op Mode
392
                                        3'd2+mode[0],    // CL
393
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
394
                                        3'd0+bs         // Burst Length
395
                                        });
396
 
397
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
398
 
399
for(del=0;del<del_max;del=del+1)
400
for(size=sz_inc;size<sz_max;size=size+sz_inc)
401
   begin
402
        m0.mem_fill;
403
 
404
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
405
                                bas, mode,  size, del);
406
 
407
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
408
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
409
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
410
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
411
 
412
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
413
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
414
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
415
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
416
 
417
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
418
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
419
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
420
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
421
 
422
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
423
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
424
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
425
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
426
 
427
        for(m=0;m<4;m=m+1)
428
        for(n=0;n<(size*2);n=n+1)
429
           begin
430
                adr = (m * page_size) + (m*size*2) + n;
431
 
432
                if(bas[0])       data = sdram0.Bank0[adr];
433
                else
434
                case(m)
435
                   0: data = sdram0.Bank0[n];
436
                   1: data = sdram0.Bank1[n+1*size*2];
437
                   2: data = sdram0.Bank2[n+2*size*2];
438
                   3: data = sdram0.Bank3[n+3*size*2];
439
                endcase
440
 
441
                if((data !== m0.rd_mem[(m*size*2)+n]) | (|data === 1'bx) |
442
                        (|m0.rd_mem[(m*size*2)+n] === 1'bx) )
443
                   begin
444
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
445
                        (m*size*2)+n, data, m0.rd_mem[(m*size*2)+n],  $time);
446
                        error_cnt = error_cnt + 1;
447
                   end
448
 
449
           end
450
   end
451
 
452
end
453
end
454
 
455
show_errors;
456
$display("*****************************************************");
457
$display("*** Test DONE ...                                 ***");
458
$display("*****************************************************\n\n");
459
end
460
endtask
461
 
462
 
463
 
464
 
465
task sdram_wr2;
466
input           quick;
467
 
468
integer         quick;
469
integer         n,m,adr;
470
integer         del, size;
471
reg     [7:0]    mode;
472
reg     [2:0]    bs;
473
integer         sz_inc;
474
integer         sz_max, del_max;
475
integer         read;
476
reg     [2:0]    bas;
477
reg     [31:0]   data;
478
integer         page_size;
479
 
480
begin
481
$display("\n\n");
482
$display("*****************************************************");
483
$display("*** SDRAM Size, Delay & Mode Write test 2 ...     ***");
484
$display("*** Different Row and Bank                        ***");
485
$display("*****************************************************\n");
486
 
487
page_size = 256; // 64 mbit x 32 SDRAM
488
 
489
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
490
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
491
 
492
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
493
                                        1'd0,   // Wr. Burst Len (1=Single)
494
                                        2'd0,   // Op Mode
495
                                        3'd2,   // CL
496
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
497
                                        3'd3    // Burst Length
498
                                        });
499
 
500
bas = 0;
501
for(bas=0;bas<2;bas=bas+1)
502
begin
503
 
504
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821 | (bas[0]<<9));
505
 
506
case(quick)
507
 0: sz_max = 32;
508
 1: sz_max = 32;
509
 2: sz_max = 16;
510
endcase
511
 
512
case(quick)
513
 0: del_max = 16;
514
 1: del_max = 8;
515
 2: del_max = 4;
516
endcase
517
 
518
size = 4;
519
del = 2;
520
mode = 4;
521
read = 1;
522
//force sdram0.Debug = 1;
523
 
524
for(mode=0;mode<20;mode=mode+1)
525
begin
526
        sdram0.mem_fill(1024);
527
 
528
        case(mode[4:2])
529
           0: bs = 0;
530
           1: bs = 1;
531
           2: bs = 2;
532
           3: bs = 3;
533
           4: bs = 7;
534
        endcase
535
 
536
        if(mode[1])
537
           sz_inc = 1;
538
        else
539
                case(mode[4:2])
540
                   0: sz_inc = 1;
541
                   1: sz_inc = 2;
542
                   2: sz_inc = 4;
543
                   3: sz_inc = 8;
544
                   4: sz_inc = 1;
545
                endcase
546
 
547
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {         // 22'h3fff_ff,
548
 
549
                                        4'd0,           // RESERVED [31:28]
550
                                        4'd7,           // Trfc [27:24]
551
                                        4'd2,           // Trp [23:20]
552
                                        3'd2,           // Trcd [19:17]
553
                                        2'd2,           // Twr [16:15]
554
                                        5'd0,           // RESERVED [14:10]
555
 
556
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
557
                                        2'd0,           // Op Mode
558
                                        3'd2+mode[0],    // CL
559
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
560
                                        3'd0+bs         // Burst Length
561
                                        });
562
 
563
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
564
 
565
for(del=0;del<del_max;del=del+1)
566
for(size=sz_inc;size<sz_max;size=size+sz_inc)
567
   begin
568
        m0.mem_fill;
569
 
570
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
571
                                bas, mode,  size, del);
572
 
573
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
574
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
575
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
576
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
577
 
578
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
579
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
580
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
581
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
582
 
583
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
584
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
585
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
586
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
587
 
588
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
589
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
590
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
591
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
592
 
593
        repeat(10)      @(posedge clk);
594
 
595
        for(m=0;m<4;m=m+1)
596
        for(n=0;n<size*2;n=n+1)
597
           begin
598
                adr = (m * page_size) + (m*size*2) + n;
599
 
600
                if(bas[0])       data = sdram0.Bank0[adr];
601
                else
602
                case(m)
603
                   0: data = sdram0.Bank0[n];
604
                   1: data = sdram0.Bank1[n+1*size*2];
605
                   2: data = sdram0.Bank2[n+2*size*2];
606
                   3: data = sdram0.Bank3[n+3*size*2];
607
                endcase
608
 
609
                if((data !== m0.wr_mem[(m*size*2)+n]) | (|data === 1'bx) |
610
                        (|m0.wr_mem[(m*size*2)+n] === 1'bx) )
611
                   begin
612
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
613
                        (m*size*2)+n, data, m0.wr_mem[(m*size*2)+n],  $time);
614
                        error_cnt = error_cnt + 1;
615
                   end
616
 
617
           end
618
 
619
   end
620
end
621
end
622
 
623
show_errors;
624
$display("*****************************************************");
625
$display("*** Test DONE ...                                 ***");
626
$display("*****************************************************\n\n");
627
end
628
endtask
629
 
630
 
631
 
632
task sdram_rd3;
633
input           quick;
634
 
635
integer         quick;
636
integer         n;
637
integer         del, size;
638
reg     [7:0]    mode;
639
reg     [2:0]    bs;
640
integer         sz_inc;
641
integer         sz_max, del_max;
642
integer         sbs, write;
643
 
644
begin
645
 
646
$display("\n\n");
647
$display("*****************************************************");
648
$display("*** SDRAM Size, Delay & Mode Read test 3 ...      ***");
649
$display("*** Keep Row Open Active                          ***");
650
$display("*****************************************************\n");
651
 
652
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
653
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
654
 
655
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
656
                                        1'd0,   // Wr. Burst Len (1=Single)
657
                                        2'd0,   // Op Mode
658
                                        3'd2,   // CL
659
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
660
                                        3'd3    // Burst Length
661
                                        });
662
 
663
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421);
664
 
665
case(quick)
666
 0: sz_max = 65;
667
 1: sz_max = 33;
668
 2: sz_max = 17;
669
endcase
670
 
671
case(quick)
672
 0: del_max = 16;
673
 1: del_max = 8;
674
 2: del_max = 4;
675
endcase
676
 
677
size = 4;
678
del = 0;
679
mode = 8;
680
write = 1;
681
//force sdram0.Debug = 1;
682
 
683
for(mode=0;mode<10;mode=mode+1)
684
begin
685
        sdram0.mem_fill(1024);
686
 
687
        case(mode[3:1])
688
           0: bs = 0;
689
           1: bs = 1;
690
           2: bs = 2;
691
           3: bs = 3;
692
           4: bs = 7;
693
        endcase
694
 
695
        case(mode[3:1])
696
           0: sbs = 1;
697
           1: sbs = 2;
698
           2: sbs = 4;
699
           3: sbs = 8;
700
           4: sbs = 1024;
701
        endcase
702
 
703
        case(mode[3:1])
704
           0: sz_inc = 1;
705
           1: sz_inc = 2;
706
           2: sz_inc = 4;
707
           3: sz_inc = 8;
708
           4: sz_inc = 1;
709
        endcase
710
 
711
/*
712
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
713
                                        1'd0,           // Wr. Burst Len (1=Single)
714
                                        2'd0,           // Op Mode
715
                                        3'd2+mode[0],   // CL
716
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
717
                                        3'd0+bs         // Burst Length
718
                                        });
719
*/
720
 
721
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {
722
 
723
                                        4'd0,           // RESERVED [31:28]
724
                                        4'd5,           // Trfc [27:24]
725
                                        4'd1,           // Trp [23:20]
726
                                        3'd1,           // Trcd [19:17]
727
                                        2'd1,           // Twr [16:15]
728
                                        5'd0,           // RESERVED [14:10]
729
 
730
                                        1'd0,           // Wr. Burst Len (1=Single)
731
                                        2'd0,           // Op Mode
732
                                        3'd2+mode[0],    // CL
733
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
734
                                        3'd0+bs         // Burst Length
735
                                        });
736
 
737
 
738
if(!verbose)    $display("Mode: %b", mode);
739
//repeat(200)   @(posedge clk);
740
 
741
//$display("\n\n");
742
 
743
for(del=0;del<del_max;del=del+1)
744
for(size=sz_inc;size<sz_max;size=size+sz_inc)
745
   begin
746
        m0.mem_fill;
747
 
748
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
749
        //if(verbose)   $display("Mode: %b, SDRAM BS: %0d, Tx Size: %0d, Delay: %0d",
750
        //              mode, sbs,  size, del);
751
 
752
//bw_clear;
753
        if(write)       m0.wb_wr_mult(`MEM_BASE +        0, 4'hf, del, size);
754
        m0.wb_rd_mult(`MEM_BASE +        0, 4'hf, del, size);
755
 
756
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
757
        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
758
 
759
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
760
        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
761
 
762
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
763
        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
764
 
765
//bw_report;
766
 
767
        for(n=0;n<(size*4);n=n+1)
768
           begin
769
                if((sdram0.Bank0[n] !== m0.rd_mem[n]) |
770
                        (|sdram0.Bank0[n] === 1'bx) |
771
                        (|m0.rd_mem[n] === 1'bx)         )
772
                   begin
773
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
774
                        n, sdram0.Bank0[n], m0.rd_mem[n],  $time);
775
                        error_cnt = error_cnt + 1;
776
                   end
777
 
778
           end
779
   end
780
 
781
end
782
 
783
show_errors;
784
$display("*****************************************************");
785
$display("*** Test DONE ...                                 ***");
786
$display("*****************************************************\n\n");
787
end
788
endtask
789
 
790
 
791
 
792
task sdram_wr3;
793
input           quick;
794
 
795
integer         quick;
796
integer         n;
797
integer         del, size;
798
reg     [7:0]    mode;
799
reg     [2:0]    bs;
800
integer         sz_inc;
801
integer         sz_max, del_max;
802
integer         sbs, read;
803
 
804
begin
805
$display("\n\n");
806
$display("*****************************************************");
807
$display("*** SDRAM Size, Delay & Mode Write test 3 ...     ***");
808
$display("*** Keep Row Open Active                          ***");
809
$display("*****************************************************\n");
810
 
811
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
812
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
813
 
814
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
815
                                        1'd0,   // Wr. Burst Len (1=Single)
816
                                        2'd0,   // Op Mode
817
                                        3'd2,   // CL
818
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
819
                                        3'd3    // Burst Length
820
                                        });
821
 
822
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421);
823
 
824
case(quick)
825
 0: sz_max = 64;
826
 1: sz_max = 32;
827
 2: sz_max = 16;
828
endcase
829
 
830
case(quick)
831
 0: del_max = 16;
832
 1: del_max = 8;
833
 2: del_max = 4;
834
endcase
835
 
836
size = 8;
837
del = 0;
838
mode = 16;
839
read = 0;
840
//force sdram0.Debug = 1;
841
 
842
for(mode=0;mode<20;mode=mode+1)
843
begin
844
 
845
        sdram0.mem_fill(1024);
846
 
847
        case(mode[4:2])
848
           0: bs = 0;
849
           1: bs = 1;
850
           2: bs = 2;
851
           3: bs = 3;
852
           4: bs = 7;
853
        endcase
854
 
855
        case(mode[4:2])
856
           0: sbs = 1;
857
           1: sbs = 2;
858
           2: sbs = 4;
859
           3: sbs = 8;
860
           4: sbs = 1024;
861
        endcase
862
 
863
        if(mode[1])
864
           sz_inc = 1;
865
        else
866
                case(mode[4:2])
867
                   0: sz_inc = 1;
868
                   1: sz_inc = 2;
869
                   2: sz_inc = 4;
870
                   3: sz_inc = 8;
871
                   4: sz_inc = 1;
872
                endcase
873
 
874
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {
875
 
876
                                        4'd0,           // RESERVED [31:28]
877
                                        4'd5,           // Trfc [27:24]
878
                                        4'd1,           // Trp [23:20]
879
                                        3'd1,           // Trcd [19:17]
880
                                        2'd1,           // Twr [16:15]
881
                                        5'd0,           // RESERVED [14:10]
882
 
883
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
884
                                        2'd0,           // Op Mode
885
                                        3'd2+mode[0],    // CL
886
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
887
                                        3'd0+bs         // Burst Length
888
                                        });
889
 
890
if(!verbose)    $display("Mode: %b", mode);
891
 
892
for(del=0;del<del_max;del=del+1)
893
for(size=sz_inc;size<sz_max;size=size+sz_inc)
894
   begin
895
        m0.mem_fill;
896
//bw_clear;
897
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
898
 
899
        m0.wb_wr_mult(`MEM_BASE +        0, 4'hf, del, size);
900
        if(read)        m0.wb_rd_mult(`MEM_BASE +        0, 4'hf, del, size);
901
 
902
        m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
903
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
904
 
905
        m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
906
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
907
 
908
        m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
909
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
910
 
911
//bw_report;
912
        repeat(10)      @(posedge clk);
913
 
914
        for(n=0;n< (size*4);n=n+1)
915
           begin
916
                if((sdram0.Bank0[n] !== m0.wr_mem[n]) |
917
                        (|sdram0.Bank0[n] === 1'bx) |
918
                        (|m0.wr_mem[n] === 1'bx)         )
919
                   begin
920
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
921
                        n, sdram0.Bank0[n], m0.wr_mem[n],  $time);
922
                        error_cnt = error_cnt + 1;
923
                   end
924
           end
925
   end
926
 
927
end
928
 
929
show_errors;
930
$display("*****************************************************");
931
$display("*** Test DONE ...                                 ***");
932
$display("*****************************************************\n\n");
933
end
934
endtask
935
 
936
 
937
 
938
task sdram_rd4;
939
input           quick;
940
 
941
integer         quick;
942
integer         n,m,adr;
943
integer         del, size;
944
reg     [7:0]    mode;
945
reg     [2:0]    bs;
946
integer         sz_inc;
947
integer         sz_max, del_max;
948
reg     [2:0]    bas;
949
reg     [31:0]   data;
950
integer         page_size;
951
integer         write;
952
 
953
begin
954
 
955
$display("\n\n");
956
$display("*****************************************************");
957
$display("*** SDRAM Size, Delay & Mode Read test 4 ...      ***");
958
$display("*** KRO & Different Row and Bank                  ***");
959
$display("*****************************************************\n");
960
 
961
page_size = 256; // 64 mbit x 32 SDRAM
962
 
963
case(quick)
964
 0: sz_max = 32;
965
 1: sz_max = 32;
966
 2: sz_max = 16;
967
endcase
968
 
969
case(quick)
970
 0: del_max = 16;
971
 1: del_max = 8;
972
 2: del_max = 4;
973
endcase
974
 
975
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
976
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
977
 
978
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
979
                                        1'd0,   // Wr. Burst Len (1=Single)
980
                                        2'd0,   // Op Mode
981
                                        3'd2,   // CL
982
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
983
                                        3'd3    // Burst Length
984
                                        });
985
 
986
bas = 0;
987
for(bas=0;bas<2;bas=bas+1)
988
begin
989
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421 | (bas[0]<<9));
990
 
991
size = 2;
992
del = 0;
993
mode = 8;
994
write = 1;
995
//force sdram0.Debug = 1;
996
 
997
for(mode=0;mode<10;mode=mode+1)
998
begin
999
        sdram0.mem_fill(1024);
1000
 
1001
        case(mode[3:1])
1002
           0: bs = 0;
1003
           1: bs = 1;
1004
           2: bs = 2;
1005
           3: bs = 3;
1006
           4: bs = 7;
1007
        endcase
1008
 
1009
        case(mode[3:1])
1010
           0: sz_inc = 1;
1011
           1: sz_inc = 2;
1012
           2: sz_inc = 4;
1013
           3: sz_inc = 8;
1014
           4: sz_inc = 1;
1015
        endcase
1016
 
1017
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1018
                                        1'd0,           // Wr. Burst Len (1=Single)
1019
                                        2'd0,           // Op Mode
1020
                                        3'd2+mode[0],    // CL
1021
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1022
                                        3'd0+bs         // Burst Length
1023
                                        });
1024
 
1025
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
1026
 
1027
for(del=0;del<del_max;del=del+1)
1028
for(size=sz_inc;size<sz_max;size=size+sz_inc)
1029
   begin
1030
        m0.mem_fill;
1031
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
1032
                                bas, mode,  size, del);
1033
 
1034
        if(write)
1035
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1036
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1037
        if(write)
1038
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1039
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1040
 
1041
        if(write)
1042
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1043
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1044
        if(write)
1045
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1046
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1047
 
1048
        if(write)
1049
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1050
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1051
        if(write)
1052
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1053
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1054
 
1055
        if(write)
1056
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1057
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1058
        if(write)
1059
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1060
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1061
 
1062
        for(m=0;m<4;m=m+1)
1063
        for(n=0;n<(size*2);n=n+1)
1064
           begin
1065
                adr = (m * page_size) + (m*(size*2)) + n;
1066
 
1067
                if(bas[0])       data = sdram0.Bank0[adr];
1068
                else
1069
                case(m)
1070
                   0: data = sdram0.Bank0[n];
1071
                   1: data = sdram0.Bank1[n+1*size*2];
1072
                   2: data = sdram0.Bank2[n+2*size*2];
1073
                   3: data = sdram0.Bank3[n+3*size*2];
1074
                endcase
1075
 
1076
                if((data !== m0.rd_mem[(m*size*2)+n]) | (|data === 1'bx) |
1077
                        (|m0.rd_mem[(m*size*2)+n] === 1'bx) )
1078
                   begin
1079
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1080
                        (m*size*2)+n, data, m0.rd_mem[(m*size*2)+n],  $time);
1081
                        error_cnt = error_cnt + 1;
1082
                   end
1083
 
1084
           end
1085
   end
1086
end
1087
 
1088
end
1089
 
1090
show_errors;
1091
$display("*****************************************************");
1092
$display("*** Test DONE ...                                 ***");
1093
$display("*****************************************************\n\n");
1094
end
1095
endtask
1096
 
1097
 
1098
 
1099
 
1100
task sdram_wr4;
1101
input           quick;
1102
 
1103
integer         quick;
1104
integer         n,m,adr;
1105
integer         del, size;
1106
reg     [7:0]    mode;
1107
reg     [2:0]    bs;
1108
integer         sz_inc;
1109
integer         sz_max, del_max;
1110
integer         read;
1111
reg     [2:0]    bas;
1112
reg     [31:0]   data;
1113
integer         page_size;
1114
 
1115
begin
1116
$display("\n\n");
1117
$display("*****************************************************");
1118
$display("*** SDRAM Size, Delay & Mode Write test 4 ...     ***");
1119
$display("*** KRO & Different Row and Bank                  ***");
1120
$display("*****************************************************\n");
1121
 
1122
//force sdram0.Debug = 1;
1123
 
1124
page_size = 256; // 64 mbit x 32 SDRAM
1125
 
1126
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
1127
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
1128
 
1129
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1130
                                        1'd0,   // Wr. Burst Len (1=Single)
1131
                                        2'd0,   // Op Mode
1132
                                        3'd2,   // CL
1133
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1134
                                        3'd3    // Burst Length
1135
                                        });
1136
 
1137
bas = 0;
1138
for(bas=0;bas<2;bas=bas+1)
1139
begin
1140
 
1141
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421 | (bas[0]<<9));
1142
 
1143
case(quick)
1144
 0: sz_max = 32;
1145
 1: sz_max = 32;
1146
 2: sz_max = 16;
1147
endcase
1148
 
1149
case(quick)
1150
 0: del_max = 16;
1151
 1: del_max = 8;
1152
 2: del_max = 4;
1153
endcase
1154
 
1155
size = 15;
1156
del = 0;
1157
mode = 19;
1158
read = 1;
1159
 
1160
for(mode=0;mode<20;mode=mode+1)
1161
begin
1162
 
1163
        sdram0.mem_fill(1024);
1164
 
1165
        case(mode[4:2])
1166
           0: bs = 0;
1167
           1: bs = 1;
1168
           2: bs = 2;
1169
           3: bs = 3;
1170
           4: bs = 7;
1171
        endcase
1172
 
1173
        if(mode[1])
1174
           sz_inc = 1;
1175
        else
1176
                case(mode[4:2])
1177
                   0: sz_inc = 1;
1178
                   1: sz_inc = 2;
1179
                   2: sz_inc = 4;
1180
                   3: sz_inc = 8;
1181
                   4: sz_inc = 1;
1182
                endcase
1183
 
1184
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1185
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
1186
                                        2'd0,           // Op Mode
1187
                                        3'd2+mode[0],    // CL
1188
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1189
                                        3'd0+bs         // Burst Length
1190
                                        });
1191
 
1192
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
1193
 
1194
for(del=0;del<del_max;del=del+1)
1195
for(size=sz_inc;size<sz_max;size=size+sz_inc)
1196
   begin
1197
        m0.mem_fill;
1198
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
1199
                                bas, mode,  size, del);
1200
 
1201
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1202
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1203
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1204
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1205
 
1206
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1207
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1208
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1209
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1210
 
1211
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1212
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1213
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1214
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1215
 
1216
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1217
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1218
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1219
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1220
 
1221
        repeat(20)      @(posedge clk);
1222
 
1223
        for(m=0;m<4;m=m+1)
1224
        for(n=0;n<(size*2);n=n+1)
1225
           begin
1226
                adr = (m * page_size) + (m*size*2) + n;
1227
 
1228
                if(bas[0])       data = sdram0.Bank0[adr];
1229
                else
1230
                case(m)
1231
                   0: data = sdram0.Bank0[n];
1232
                   1: data = sdram0.Bank1[n+1*size*2];
1233
                   2: data = sdram0.Bank2[n+2*size*2];
1234
                   3: data = sdram0.Bank3[n+3*size*2];
1235
                endcase
1236
 
1237
                if((data !== m0.wr_mem[(m*size*2)+n]) | (|data === 1'bx) |
1238
                        (|m0.wr_mem[(m*size*2)+n] === 1'bx) )
1239
                   begin
1240
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1241
                        (m*size*2)+n, data, m0.wr_mem[(m*size*2)+n],  $time);
1242
                        error_cnt = error_cnt + 1;
1243
                   end
1244
 
1245
           end
1246
 
1247
   end
1248
 
1249
end
1250
end
1251
 
1252
show_errors;
1253
$display("*****************************************************");
1254
$display("*** Test DONE ...                                 ***");
1255
$display("*****************************************************\n\n");
1256
end
1257
endtask
1258
 
1259
 
1260
 
1261
`ifdef MULTI_SDRAM
1262
 
1263
task sdram_rd5;
1264
input           quick;
1265
 
1266
integer         quick;
1267
integer         s,n,m,adr;
1268
integer         del, size;
1269
reg     [7:0]    mode;
1270
reg     [2:0]    bs;
1271
integer         sz_inc;
1272
integer         sz_max, del_max;
1273
reg     [2:0]    bas;
1274
reg     [31:0]   data;
1275
integer         page_size;
1276
integer         write;
1277
 
1278
begin
1279
 
1280
$display("\n\n");
1281
$display("*****************************************************");
1282
$display("*** SDRAM Size, Delay & Mode Read test 5 ...      ***");
1283
$display("*** KRO & Different Row and Bank and CS           ***");
1284
$display("*****************************************************\n");
1285
 
1286
page_size = 256; // 64 mbit x 32 SDRAM
1287
 
1288
case(quick)
1289
 0: sz_max = 32;
1290
 1: sz_max = 32;
1291
 2: sz_max = 16;
1292
endcase
1293
 
1294
case(quick)
1295
 0: del_max = 16;
1296
 1: del_max = 8;
1297
 2: del_max = 4;
1298
endcase
1299
 
1300
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
1301
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
1302
 
1303
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1304
                                        1'd0,   // Wr. Burst Len (1=Single)
1305
                                        2'd0,   // Op Mode
1306
                                        3'd2,   // CL
1307
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1308
                                        3'd3    // Burst Length
1309
                                        });
1310
 
1311
m0.wb_wr1(`REG_BASE + `TMS1,    4'hf, {22'h3fff_ff,
1312
                                        1'd0,   // Wr. Burst Len (1=Single)
1313
                                        2'd0,   // Op Mode
1314
                                        3'd2,   // CL
1315
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1316
                                        3'd3    // Burst Length
1317
                                        });
1318
 
1319
m0.wb_wr1(`REG_BASE + `TMS2,    4'hf, {22'h3fff_ff,
1320
                                        1'd0,   // Wr. Burst Len (1=Single)
1321
                                        2'd0,   // Op Mode
1322
                                        3'd2,   // CL
1323
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1324
                                        3'd3    // Burst Length
1325
                                        });
1326
 
1327
bas = 1;
1328
for(bas=0;bas<2;bas=bas+1)
1329
begin
1330
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421 | (bas[0]<<9));
1331
m0.wb_wr1(`REG_BASE + `CSC1,    4'hf, 32'h0020_0021 | (bas[0]<<9));
1332
m0.wb_wr1(`REG_BASE + `CSC2,    4'hf, 32'h0040_0421 | (bas[0]<<9));
1333
 
1334
size = 1;
1335
del = 0;
1336
mode = 0;
1337
write = 1;
1338
if(0)
1339
   begin
1340
        force sdram0.Debug = 1;
1341
        force sdram1.Debug = 1;
1342
        force sdram2.Debug = 1;
1343
   end
1344
 
1345
for(mode=0;mode<10;mode=mode+1)
1346
begin
1347
        sdram0.mem_fill(1024);
1348
        sdram1.mem_fill(1024);
1349
        sdram2.mem_fill(1024);
1350
 
1351
        case(mode[3:1])
1352
           0: bs = 0;
1353
           1: bs = 1;
1354
           2: bs = 2;
1355
           3: bs = 3;
1356
           4: bs = 7;
1357
        endcase
1358
 
1359
        case(mode[3:1])
1360
           0: sz_inc = 1;
1361
           1: sz_inc = 2;
1362
           2: sz_inc = 4;
1363
           3: sz_inc = 8;
1364
           4: sz_inc = 1;
1365
        endcase
1366
 
1367
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1368
                                        1'd0,           // Wr. Burst Len (1=Single)
1369
                                        2'd0,           // Op Mode
1370
                                        3'd2+mode[0],    // CL
1371
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1372
                                        3'd0+bs         // Burst Length
1373
                                        });
1374
 
1375
        m0.wb_wr1(`REG_BASE + `TMS1,    4'hf, {22'h3fff_ff,
1376
                                        1'd0,           // Wr. Burst Len (1=Single)
1377
                                        2'd0,           // Op Mode
1378
                                        3'd2+mode[0],    // CL
1379
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1380
                                        3'd0+bs         // Burst Length
1381
                                        });
1382
 
1383
        m0.wb_wr1(`REG_BASE + `TMS2,    4'hf, {22'h3fff_ff,
1384
                                        1'd0,           // Wr. Burst Len (1=Single)
1385
                                        2'd0,           // Op Mode
1386
                                        3'd3-mode[0],    // CL
1387
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1388
                                        3'd0+bs         // Burst Length
1389
                                        });
1390
 
1391
 
1392
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
1393
 
1394
for(del=0;del<del_max;del=del+1)
1395
for(size=sz_inc;size<sz_max;size=size+sz_inc)
1396
   begin
1397
        m0.mem_fill;
1398
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
1399
                                bas, mode,  size, del);
1400
 
1401
        if(write)
1402
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1403
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1404
        if(write)
1405
        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1406
        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1407
        if(write)
1408
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1409
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1410
        if(write)
1411
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1412
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1413
        if(write)
1414
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1415
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1416
        if(write)
1417
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1418
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1419
 
1420
        if(write)
1421
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1422
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1423
        if(write)
1424
        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1425
        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1426
        if(write)
1427
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1428
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1429
        if(write)
1430
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1431
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1432
        if(write)
1433
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1434
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1435
        if(write)
1436
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1437
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1438
 
1439
        if(write)
1440
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1441
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1442
        if(write)
1443
        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1444
        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1445
        if(write)
1446
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1447
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1448
        if(write)
1449
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1450
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1451
        if(write)
1452
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1453
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1454
        if(write)
1455
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1456
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1457
 
1458
        if(write)
1459
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1460
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1461
        if(write)
1462
        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1463
        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1464
        if(write)
1465
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1466
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1467
        if(write)
1468
        m0.wb_wr_mult(`MEM_BASE1 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1469
        m0.wb_rd_mult(`MEM_BASE1 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1470
        if(write)
1471
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1472
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1473
        if(write)
1474
        m0.wb_wr_mult(`MEM_BASE2 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1475
        m0.wb_rd_mult(`MEM_BASE2 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1476
 
1477
        for(m=0;m<4;m=m+1)
1478
        for(s=0;s<3;s=s+1)
1479
        for(n=0;n<(size*2);n=n+1)
1480
           begin
1481
                adr = (m * page_size) + (m*(size*2)) + n;
1482
 
1483
                case(s)
1484
                   0:    if(bas[0])       data = sdram0.Bank0[adr];
1485
                        else
1486
                        case(m)
1487
                           0: data = sdram0.Bank0[n];
1488
                           1: data = sdram0.Bank1[n+1*size*2];
1489
                           2: data = sdram0.Bank2[n+2*size*2];
1490
                           3: data = sdram0.Bank3[n+3*size*2];
1491
                        endcase
1492
                   1:   if(bas[0])       data = sdram1.Bank0[adr];
1493
                        else
1494
                        case(m)
1495
                           0: data = sdram1.Bank0[n];
1496
                           1: data = sdram1.Bank1[n+1*size*2];
1497
                           2: data = sdram1.Bank2[n+2*size*2];
1498
                           3: data = sdram1.Bank3[n+3*size*2];
1499
                        endcase
1500
                   2:   if(bas[0])       data = sdram2.Bank0[adr];
1501
                        else
1502
                        case(m)
1503
                           0: data = sdram2.Bank0[n];
1504
                           1: data = sdram2.Bank1[n+1*size*2];
1505
                           2: data = sdram2.Bank2[n+2*size*2];
1506
                           3: data = sdram2.Bank3[n+3*size*2];
1507
                        endcase
1508
                endcase
1509
 
1510
                if((data !== m0.rd_mem[(m*size*6)+(s*size*2)+n]) | (|data === 1'bx) |
1511
                        (|m0.rd_mem[(m*size*6)+(s*size*2)+n] === 1'bx) )
1512
                   begin
1513
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1514
                        (m*size*2)+n, data, m0.rd_mem[(m*size*2)+n],  $time);
1515
                        error_cnt = error_cnt + 1;
1516
                   end
1517
 
1518
           end
1519
   end
1520
end
1521
 
1522
end
1523
 
1524
show_errors;
1525
$display("*****************************************************");
1526
$display("*** Test DONE ...                                 ***");
1527
$display("*****************************************************\n\n");
1528
end
1529
endtask
1530
 
1531
 
1532
 
1533
 
1534
task sdram_wr5;
1535
input           quick;
1536
 
1537
integer         quick;
1538
integer         s,n,m,adr;
1539
integer         del, size;
1540
reg     [7:0]    mode;
1541
reg     [2:0]    bs;
1542
integer         sz_inc;
1543
integer         sz_max, del_max;
1544
integer         read;
1545
reg     [2:0]    bas;
1546
reg     [31:0]   data;
1547
integer         page_size;
1548
 
1549
begin
1550
$display("\n\n");
1551
$display("*****************************************************");
1552
$display("*** SDRAM Size, Delay & Mode Write test 5 ...     ***");
1553
$display("*** KRO & Different Row and Bank and CS           ***");
1554
$display("*****************************************************\n");
1555
 
1556
page_size = 256; // 64 mbit x 32 SDRAM
1557
 
1558
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
1559
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
1560
 
1561
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1562
                                        1'd0,   // Wr. Burst Len (1=Single)
1563
                                        2'd0,   // Op Mode
1564
                                        3'd2,   // CL
1565
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1566
                                        3'd3    // Burst Length
1567
                                        });
1568
 
1569
m0.wb_wr1(`REG_BASE + `TMS1,    4'hf, {22'h3fff_ff,
1570
                                        1'd0,   // Wr. Burst Len (1=Single)
1571
                                        2'd0,   // Op Mode
1572
                                        3'd2,   // CL
1573
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1574
                                        3'd3    // Burst Length
1575
                                        });
1576
 
1577
m0.wb_wr1(`REG_BASE + `TMS2,    4'hf, {22'h3fff_ff,
1578
                                        1'd0,   // Wr. Burst Len (1=Single)
1579
                                        2'd0,   // Op Mode
1580
                                        3'd2,   // CL
1581
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
1582
                                        3'd3    // Burst Length
1583
                                        });
1584
 
1585
bas = 1;
1586
for(bas=0;bas<2;bas=bas+1)
1587
begin
1588
 
1589
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0421 | (bas[0]<<9));
1590
m0.wb_wr1(`REG_BASE + `CSC1,    4'hf, 32'h0020_0421 | (bas[0]<<9));
1591
m0.wb_wr1(`REG_BASE + `CSC2,    4'hf, 32'h0040_0421 | (bas[0]<<9));
1592
 
1593
case(quick)
1594
 0: sz_max = 32;
1595
 1: sz_max = 32;
1596
 2: sz_max = 16;
1597
endcase
1598
 
1599
case(quick)
1600
 0: del_max = 16;
1601
 1: del_max = 8;
1602
 2: del_max = 4;
1603
endcase
1604
 
1605
size = 5;
1606
del = 0;
1607
mode = 0;
1608
read = 1;
1609
 
1610
if(0)
1611
   begin
1612
        force sdram0.Debug = 1;
1613
        force sdram1.Debug = 1;
1614
        force sdram2.Debug = 1;
1615
   end
1616
 
1617
for(mode=0;mode<20;mode=mode+1)
1618
begin
1619
 
1620
        sdram0.mem_fill(1024);
1621
        sdram1.mem_fill(1024);
1622
        sdram2.mem_fill(1024);
1623
 
1624
        case(mode[4:2])
1625
           0: bs = 0;
1626
           1: bs = 1;
1627
           2: bs = 2;
1628
           3: bs = 3;
1629
           4: bs = 7;
1630
        endcase
1631
 
1632
        if(mode[1])
1633
           sz_inc = 1;
1634
        else
1635
                case(mode[4:2])
1636
                   0: sz_inc = 1;
1637
                   1: sz_inc = 2;
1638
                   2: sz_inc = 4;
1639
                   3: sz_inc = 8;
1640
                   4: sz_inc = 1;
1641
                endcase
1642
 
1643
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
1644
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
1645
                                        2'd0,           // Op Mode
1646
                                        3'd2+mode[0],    // CL
1647
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1648
                                        3'd0+bs         // Burst Length
1649
                                        });
1650
 
1651
 
1652
        m0.wb_wr1(`REG_BASE + `TMS1,    4'hf, {22'h3fff_ff,
1653
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
1654
                                        2'd0,           // Op Mode
1655
                                        3'd3-mode[0],    // CL
1656
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1657
                                        3'd0+bs         // Burst Length
1658
                                        });
1659
 
1660
 
1661
        m0.wb_wr1(`REG_BASE + `TMS2,    4'hf, {22'h3fff_ff,
1662
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
1663
                                        2'd0,           // Op Mode
1664
                                        3'd2+mode[0],    // CL
1665
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
1666
                                        3'd0+bs         // Burst Length
1667
                                        });
1668
 
1669
if(!verbose)    $display("BAS: %0d, Mode: %b", bas, mode);
1670
 
1671
//for(del=0;del<del_max;del=del+1)
1672
for(size=sz_inc;size<sz_max;size=size+sz_inc)
1673
   begin
1674
        m0.mem_fill;
1675
        if(verbose)     $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
1676
                                bas, mode,  size, del);
1677
 
1678
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1679
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1680
                        m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1681
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
1682
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1683
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1684
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1685
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1686
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1687
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*0*4) + size*0*4, 4'hf, del, size);
1688
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1689
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*0*4) + size*1*4, 4'hf, del, size);
1690
 
1691
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1692
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1693
                        m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1694
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
1695
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1696
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1697
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1698
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1699
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1700
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*1*4) + size*2*4, 4'hf, del, size);
1701
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1702
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*1*4) + size*3*4, 4'hf, del, size);
1703
 
1704
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1705
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1706
                        m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1707
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
1708
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1709
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1710
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1711
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1712
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1713
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*2*4) + size*4*4, 4'hf, del, size);
1714
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1715
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*2*4) + size*5*4, 4'hf, del, size);
1716
 
1717
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1718
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1719
                        m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1720
        if(read)        m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size);
1721
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1722
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1723
                        m0.wb_wr_mult(`MEM_BASE1 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1724
        if(read)        m0.wb_rd_mult(`MEM_BASE1 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1725
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1726
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*3*4) + size*6*4, 4'hf, del, size);
1727
                        m0.wb_wr_mult(`MEM_BASE2 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1728
        if(read)        m0.wb_rd_mult(`MEM_BASE2 + (page_size*3*4) + size*7*4, 4'hf, del, size);
1729
 
1730
 
1731
 
1732
        repeat(20)      @(posedge clk);
1733
 
1734
        for(m=0;m<4;m=m+1)
1735
        for(s=0;s<3;s=s+1)
1736
        for(n=0;n<(size*2);n=n+1)
1737
           begin
1738
                adr = (m * page_size) + (m*size*2) + n;
1739
 
1740
/*
1741
                case(s)
1742
                   0:   if(bas[0])      data = sdram0.Bank0[adr];
1743
                        else
1744
                        case(m)
1745
                           0: data = sdram0.Bank0[n];
1746
                           1: data = sdram0.Bank1[n+1*size*2];
1747
                           2: data = sdram0.Bank2[n+2*size*2];
1748
                           3: data = sdram0.Bank3[n+3*size*2];
1749
                        endcase
1750
                   1:   if(bas[0])      data = {sdram1b.Bank0[adr],sdram1a.Bank0[adr]};
1751
                        else
1752
                        case(m)
1753
                           0: data = {sdram1b.Bank0[n],sdram1a.Bank0[n]};
1754
                           1: data = {sdram1b.Bank1[n+1*size*2],sdram1a.Bank1[n+1*size*2]};
1755
                           2: data = {sdram1b.Bank2[n+2*size*2],sdram1a.Bank2[n+2*size*2]};
1756
                           3: data = {sdram1b.Bank3[n+3*size*2],sdram1a.Bank3[n+3*size*2]};
1757
                        endcase
1758
                   2:   if(bas[0])      data = {sdram2d.Bank0[adr],
1759
                                                sdram2c.Bank0[adr],
1760
                                                sdram2b.Bank0[adr],
1761
                                                sdram2a.Bank0[adr]};
1762
                        else
1763
                        case(m)
1764
                           0: data = {  sdram2a.Bank0[n],
1765
                                        sdram2b.Bank0[n],
1766
                                        sdram2c.Bank0[n],
1767
                                        sdram2d.Bank0[n] };
1768
                           1: data = {  sdram2a.Bank1[n+1*size*2],
1769
                                        sdram2b.Bank1[n+1*size*2],
1770
                                        sdram2c.Bank1[n+1*size*2],
1771
                                        sdram2d.Bank1[n+1*size*2] };
1772
                           2: data = {  sdram2a.Bank2[n+2*size*2],
1773
                                        sdram2b.Bank2[n+2*size*2],
1774
                                        sdram2c.Bank2[n+2*size*2],
1775
                                        sdram2d.Bank2[n+2*size*2] };
1776
                           3: data = {  sdram2a.Bank3[n+3*size*2],
1777
                                        sdram2b.Bank3[n+3*size*2],
1778
                                        sdram2c.Bank3[n+3*size*2],
1779
                                        sdram2d.Bank3[n+3*size*2] };
1780
                        endcase
1781
                endcase
1782
 
1783
*/
1784
 
1785
 
1786
 
1787
 
1788
                case(s)
1789
                   0:    if(bas[0])       data = sdram0.Bank0[adr];
1790
                        else
1791
                        case(m)
1792
                           0: data = sdram0.Bank0[n];
1793
                           1: data = sdram0.Bank1[n+1*size*2];
1794
                           2: data = sdram0.Bank2[n+2*size*2];
1795
                           3: data = sdram0.Bank3[n+3*size*2];
1796
                        endcase
1797
                   1:   if(bas[0])       data = sdram1.Bank0[adr];
1798
                        else
1799
                        case(m)
1800
                           0: data = sdram1.Bank0[n];
1801
                           1: data = sdram1.Bank1[n+1*size*2];
1802
                           2: data = sdram1.Bank2[n+2*size*2];
1803
                           3: data = sdram1.Bank3[n+3*size*2];
1804
                        endcase
1805
                   2:   if(bas[0])       data = sdram2.Bank0[adr];
1806
                        else
1807
                        case(m)
1808
                           0: data = sdram2.Bank0[n];
1809
                           1: data = sdram2.Bank1[n+1*size*2];
1810
                           2: data = sdram2.Bank2[n+2*size*2];
1811
                           3: data = sdram2.Bank3[n+3*size*2];
1812
                        endcase
1813
                endcase
1814
 
1815
 
1816
 
1817
 
1818
                if((data !== m0.wr_mem[(m*size*6)+(s*size*2)+n]) | (|data === 1'bx) |
1819
                        (|m0.wr_mem[(m*size*6)+(s*size*2)+n] === 1'bx) )
1820
                   begin
1821
                        $display("ERROR: WR Data[%0d-%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1822
                        s, (m*size*2)+n, data, m0.wr_mem[(m*size*2)+n],  $time);
1823
                        error_cnt = error_cnt + 1;
1824
                   end
1825
 
1826
           end
1827
 
1828
   end
1829
 
1830
end
1831
end
1832
 
1833
show_errors;
1834
$display("*****************************************************");
1835
$display("*** Test DONE ...                                 ***");
1836
$display("*****************************************************\n\n");
1837
end
1838
endtask
1839
 
1840
`endif
1841
 
1842
 
1843
task    asc_rdwr1;
1844
input           quick;
1845
 
1846
integer         quick;
1847
integer         x,s,n,m,adr;
1848
integer         del, size;
1849
reg     [7:0]    mode;
1850
reg     [2:0]    bs;
1851
integer         sz_inc;
1852
integer         sz_max, del_max;
1853
integer         read;
1854
reg     [2:0]    bas;
1855
reg     [31:0]   data;
1856
 
1857
begin
1858
 
1859
$display("\n\n");
1860
$display("*****************************************************");
1861
$display("*** ASC Read/Write Test 1 ...                     ***");
1862
$display("*****************************************************\n");
1863
 
1864
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
1865
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
1866
 
1867
        m0.wb_wr1(`REG_BASE + `TMS3,    4'hf, 32'hffff_f40a);
1868
 
1869
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0025);   // 32 bit bus
1870
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0005);   // 8 bit bus
1871
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0015);   // 16 bit bus
1872
 
1873
case(quick)
1874
 0: sz_max = 32;
1875
 1: sz_max = 32;
1876
 2: sz_max = 16;
1877
endcase
1878
 
1879
case(quick)
1880
 0: del_max = 16;
1881
 1: del_max = 8;
1882
 2: del_max = 4;
1883
endcase
1884
 
1885
size = 1;
1886
del = 0;
1887
mode = 0;
1888
read = 1;
1889
write = 0;
1890
 
1891
 
1892
for(mode=0;mode<3;mode=mode+1)
1893
begin
1894
 
1895
repeat(1)       @(posedge clk);
1896
 
1897
 
1898
case(mode)
1899
   0:    m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0060_0025);   // 32 bit bus
1900
   1:   m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0060_0005);   // 8 bit bus
1901
   2:   m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0060_0015);   // 16 bit bus
1902
endcase
1903
 
1904
 
1905
repeat(10)      @(posedge clk);
1906
if(!verbose)    $display("Mode: %b", mode);
1907
 
1908
//for(del=0;del<del_max;del=del+1)
1909
//for(size=1;size<sz_max;size=size+1)
1910
   begin
1911
        m0.mem_fill;
1912
        for(n=0;n<1024;n=n+1)
1913
                m0.wr_mem[n] = 32'hffff_ffff;
1914
 
1915
        if(verbose)     $display("Mode: %0d, Size: %0d, Delay: %0d", mode,  size, del);
1916
 
1917
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
1918
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
1919
 
1920
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
1921
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
1922
 
1923
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
1924
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
1925
 
1926
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
1927
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
1928
 
1929
        repeat(10)      @(posedge clk);
1930
 
1931
        x = 0;
1932
        for(n=0;n<(size*4);n=n+1)
1933
           begin
1934
 
1935
                case(mode)
1936
                   0:    data = {16'hzzzz, n[15:0]};
1937
                   1:
1938
                        begin
1939
                                data[31:24] = x[7:0]+3;
1940
                                data[23:16] = x[7:0]+2;
1941
                                data[15:08] = x[7:0]+1;
1942
                                data[07:00] = x[7:0]+0;
1943
                        end
1944
 
1945
                   2:   begin
1946
                                data[31:16] = x[15:0]+1;
1947
                                data[15:00] = x[15:0]+0;
1948
                        end
1949
                endcase
1950
 
1951
                case(mode)
1952
                   0:    x = x + 1;
1953
                   1:   x = x + 4;
1954
                   2:   x = x + 2;
1955
                endcase
1956
 
1957
                //$display("INFO: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1958
                //      n, data, m0.rd_mem[n],  $time);
1959
 
1960
                if(data !== m0.rd_mem[n])
1961
                   begin
1962
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
1963
                        n, data, m0.rd_mem[n],  $time);
1964
                        error_cnt = error_cnt + 1;
1965
                   end
1966
           end
1967
 
1968
   end
1969
 
1970
end
1971
 
1972
show_errors;
1973
$display("*****************************************************");
1974
$display("*** Test DONE ...                                 ***");
1975
$display("*****************************************************\n\n");
1976
 
1977
end
1978
endtask
1979
 
1980
 
1981
task    asc_rdwr1_x;
1982
input           quick;
1983
 
1984
integer         quick;
1985
integer         x,s,n,m,adr;
1986
integer         del, size;
1987
reg     [7:0]    mode;
1988
reg     [2:0]    bs;
1989
integer         sz_inc;
1990
integer         sz_max, del_max;
1991
integer         read;
1992
reg     [2:0]    bas;
1993
reg     [31:0]   data;
1994
 
1995
begin
1996
 
1997
$display("\n\n");
1998
$display("*****************************************************");
1999
$display("*** ASC Read/Write Test 1 X ...                   ***");
2000
$display("*****************************************************\n");
2001
 
2002
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2003
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2004
 
2005
        m0.wb_wr1(`REG_BASE + `TMS3,    4'hf, 32'h0005_2004);
2006
        m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0060_0005);
2007
 
2008
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0025);   // 32 bit bus
2009
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0005);   // 8 bit bus
2010
        //m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0060_0015);   // 16 bit bus
2011
 
2012
case(quick)
2013
 0: sz_max = 32;
2014
 1: sz_max = 32;
2015
 2: sz_max = 16;
2016
endcase
2017
 
2018
case(quick)
2019
 0: del_max = 16;
2020
 1: del_max = 8;
2021
 2: del_max = 4;
2022
endcase
2023
 
2024
size = 1;
2025
del = 0;
2026
mode = 1;
2027
read = 1;
2028
write = 0;
2029
 
2030
 
2031
//for(mode=0;mode<8;mode=mode+1)
2032
begin
2033
 
2034
repeat(1)       @(posedge clk);
2035
 
2036
 
2037
//m0.wb_wr1(`REG_BASE + `CSC3,  4'hf, 32'h0081_0005);
2038
 
2039
        //m0.wb_wr1(`REG_BASE + `TMS3,  4'hf, 32'h0000_2004 + (mode<<16));
2040
        m0.wb_wr1(`REG_BASE + `TMS3,    4'hf, 32'h0001_200a);
2041
 
2042
repeat(10)      @(posedge clk);
2043
if(!verbose)    $display("Mode: %b", mode);
2044
 
2045
//for(del=0;del<del_max;del=del+1)
2046
//for(size=1;size<sz_max;size=size+1)
2047
   begin
2048
        m0.mem_fill;
2049
        for(n=0;n<1024;n=n+1)
2050
                m0.wr_mem[n] = 32'hffff_ffff;
2051
 
2052
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
2053
 
2054
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
2055
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
2056
 
2057
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
2058
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
2059
 
2060
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
2061
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
2062
 
2063
        if(write)       m0.wb_wr_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
2064
        if(read)        m0.wb_rd_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
2065
 
2066
        repeat(10)      @(posedge clk);
2067
 
2068
        x = 0;
2069
 
2070
        for(n=0;n<(size*4);n=n+1)
2071
           begin
2072
 
2073
                case(mode)
2074
                   0:    data = {16'hzzzz, n[15:0]};
2075
                   1:
2076
                        begin
2077
                                data[31:24] = x[7:0]+3;
2078
                                data[23:16] = x[7:0]+2;
2079
                                data[15:08] = x[7:0]+1;
2080
                                data[07:00] = x[7:0]+0;
2081
                        end
2082
 
2083
                   2:   begin
2084
                                data[31:16] = x[15:0]+1;
2085
                                data[15:00] = x[15:0]+0;
2086
                        end
2087
                endcase
2088
 
2089
                case(mode)
2090
                   0:    x = x + 1;
2091
                   1:   x = x + 4;
2092
                   2:   x = x + 2;
2093
                endcase
2094
 
2095
                //$display("INFO: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2096
                //      n, data, m0.rd_mem[n],  $time);
2097
 
2098
                if(data !== m0.rd_mem[n])
2099
                   begin
2100
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2101
                        n, data, m0.rd_mem[n],  $time);
2102
                        error_cnt = error_cnt + 1;
2103
                   end
2104
           end
2105
 
2106
 
2107
   end
2108
 
2109
end
2110
 
2111
show_errors;
2112
$display("*****************************************************");
2113
$display("*** Test DONE ...                                 ***");
2114
$display("*****************************************************\n\n");
2115
 
2116
end
2117
endtask
2118
 
2119
 
2120
 
2121
 
2122
task    boot;
2123
input           quick;
2124
 
2125
integer         quick;
2126
integer         x,s,n,m,adr;
2127
integer         del, size;
2128
reg     [7:0]    mode;
2129
reg     [2:0]    bs;
2130
integer         sz_inc;
2131
integer         sz_max, del_max;
2132
integer         read;
2133
reg     [2:0]    bas;
2134
reg     [31:0]   data;
2135
 
2136
begin
2137
$display("\n\n");
2138
$display("*****************************************************");
2139
$display("*** ASC Boot Test 1 ...                           ***");
2140
$display("*****************************************************\n");
2141
 
2142
case(quick)
2143
 0: sz_max = 32;
2144
 1: sz_max = 32;
2145
 2: sz_max = 16;
2146
endcase
2147
 
2148
case(quick)
2149
 0: del_max = 16;
2150
 1: del_max = 8;
2151
 2: del_max = 4;
2152
endcase
2153
 
2154
size = 1;
2155
del = 0;
2156
mode = 0;
2157
read = 1;
2158
write = 1;
2159
 
2160
for(mode=0;mode<3;mode=mode+1)
2161
begin
2162
 
2163
repeat(1)       @(posedge clk);
2164
 
2165
case(mode)
2166
   0: begin
2167
        poc_mode = 2;
2168
        mc_reset;
2169
      end
2170
   1: begin
2171
        poc_mode = 0;
2172
        mc_reset;
2173
      end
2174
   2: begin
2175
        poc_mode = 1;
2176
        mc_reset;
2177
      end
2178
endcase
2179
 
2180
repeat(5)       @(posedge clk);
2181
if(!verbose)    $display("Mode: %b", mode);
2182
 
2183
for(del=0;del<del_max;del=del+1)
2184
for(size=1;size<sz_max;size=size+1)
2185
   begin
2186
        m0.mem_fill;
2187
        for(n=0;n<1024;n=n+1)
2188
                m0.wr_mem[n] = 32'hffff_ffff;
2189
 
2190
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
2191
 
2192
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*0*4, 4'hf, del, size);
2193
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*0*4, 4'hf, del, size);
2194
 
2195
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
2196
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
2197
 
2198
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
2199
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
2200
 
2201
        if(write)       m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
2202
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
2203
 
2204
        repeat(10)      @(posedge clk);
2205
 
2206
        x = 0;
2207
        for(n=0;n<(size*4);n=n+1)
2208
           begin
2209
 
2210
                case(mode)
2211
                   0:    data = {16'hzzzz, n[15:0]};
2212
                   1:
2213
                        begin
2214
                                data[31:24] = x[7:0]+3;
2215
                                data[23:16] = x[7:0]+2;
2216
                                data[15:08] = x[7:0]+1;
2217
                                data[07:00] = x[7:0]+0;
2218
                        end
2219
 
2220
                   2:   begin
2221
                                data[31:16] = x[15:0]+1;
2222
                                data[15:00] = x[15:0]+0;
2223
                        end
2224
                endcase
2225
 
2226
                case(mode)
2227
                   0:    x = x + 1;
2228
                   1:   x = x + 4;
2229
                   2:   x = x + 2;
2230
                endcase
2231
 
2232
                //$display("INFO: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2233
                //      n, data, m0.rd_mem[n],  $time);
2234
 
2235
                if(data !== m0.rd_mem[n])
2236
                   begin
2237
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2238
                        n, data, m0.rd_mem[n],  $time);
2239
                        error_cnt = error_cnt + 1;
2240
                   end
2241
           end
2242
   end
2243
end
2244
show_errors;
2245
$display("*****************************************************");
2246
$display("*** Test DONE ...                                 ***");
2247
$display("*****************************************************\n\n");
2248
 
2249
end
2250
endtask
2251
 
2252
 
2253
task sram_rd1;
2254
 
2255
integer         n,m,read,write;
2256 8 rudi
integer         d2, del, size;
2257 4 rudi
reg     [31:0]   data;
2258
begin
2259
 
2260
$display("\n\n");
2261
$display("*****************************************************");
2262
$display("*** SRAM Size & Delay Read Test 1 ...             ***");
2263
$display("*****************************************************\n");
2264
 
2265
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2266
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2267
 
2268
        m0.wb_wr1(`REG_BASE + `TMS4,    4'hf, 32'hffff_ffff);
2269
        m0.wb_wr1(`REG_BASE + `CSC4,    4'hf, 32'h0080_0003);
2270
 
2271 8 rudi
size = 4;
2272 4 rudi
del = 0;
2273
read = 1;
2274
write = 0;
2275
 
2276
sram0a.mem_fill( 256 );
2277
sram0b.mem_fill( 256 );
2278
 
2279
repeat(1)       @(posedge clk);
2280
 
2281
for(del=0;del<16;del=del+1)
2282
for(size=1;size<18;size=size+1)
2283
   begin
2284
        m0.mem_fill;
2285
 
2286
        $display("Size: %0d, Delay: %0d", size, del);
2287
//bw_clear;
2288
 
2289
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2290
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2291
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 4*4, 4'hf, del, size);
2292
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 4*4, 4'hf, del, size);
2293
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 8*4, 4'hf, del, size);
2294
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 8*4, 4'hf, del, size);
2295
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 12*4, 4'hf, del, size);
2296
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 12*4, 4'hf, del, size);
2297
 
2298
//bw_report;
2299
 
2300
        for(m=0;m< 4;m=m+1)
2301
        for(n=0;n< size;n=n+1)
2302
           begin
2303
 
2304
`ifdef MICRON
2305
                data[07:00] = sram0a.bank0[(m*4)+n];
2306
                data[15:08] = sram0a.bank1[(m*4)+n];
2307
                data[23:16] = sram0b.bank0[(m*4)+n];
2308
                data[31:24] = sram0b.bank1[(m*4)+n];
2309
`else
2310
                data[07:00] = sram0a.memb1[(m*4)+n];
2311
                data[15:08] = sram0a.memb2[(m*4)+n];
2312
                data[23:16] = sram0b.memb1[(m*4)+n];
2313
                data[31:24] = sram0b.memb2[(m*4)+n];
2314
`endif
2315
 
2316
                //$display("INFO: Data[%0d]: Expected: %x, Got: %x (%0t)",
2317
                //      (m*4)+n, data, m0.rd_mem[(m*size)+n],  $time);
2318
 
2319
                if(data !== m0.rd_mem[(m*size)+n])
2320
                   begin
2321
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2322
                        (m*4)+n, data, m0.rd_mem[(m*size)+n],  $time);
2323
                        error_cnt = error_cnt + 1;
2324
                   end
2325
 
2326
           end
2327
 
2328
   end
2329
 
2330
show_errors;
2331
$display("*****************************************************");
2332
$display("*** Test DONE ...                                 ***");
2333
$display("*****************************************************\n\n");
2334
 
2335
end
2336
endtask
2337
 
2338
 
2339
 
2340
 
2341
 
2342
task sram_wr1;
2343
 
2344
integer         n,m,read,write;
2345
integer         del, size;
2346
reg     [31:0]   data;
2347
begin
2348
 
2349
$display("\n\n");
2350
$display("*****************************************************");
2351
$display("*** SRAM Size & Delay Write Test 1 ...            ***");
2352
$display("*****************************************************\n");
2353
 
2354
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2355
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2356
 
2357
        m0.wb_wr1(`REG_BASE + `TMS4,    4'hf, 32'hffff_ffff);
2358
        m0.wb_wr1(`REG_BASE + `CSC4,    4'hf, 32'h0080_0803);
2359
 
2360
size = 4;
2361
del = 0;
2362
mode = 0;
2363
read = 1;
2364
write = 1;
2365
 
2366
sram0a.mem_fill( 256 );
2367
sram0b.mem_fill( 256 );
2368
 
2369
repeat(1)       @(posedge clk);
2370
 
2371
for(del=0;del<16;del=del+1)
2372
for(size=1;size<18;size=size+1)
2373
   begin
2374
        m0.mem_fill;
2375
 
2376
        $display("Size: %0d, Delay: %0d", size, del);
2377
//bw_clear;
2378
 
2379
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2380
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2381
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 32*4, 4'hf, del, size);
2382
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 32*4, 4'hf, del, size);
2383
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 64*4, 4'hf, del, size);
2384
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 64*4, 4'hf, del, size);
2385
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 96*4, 4'hf, del, size);
2386
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 96*4, 4'hf, del, size);
2387
 
2388
//bw_report;
2389
 
2390
repeat(10)      @(posedge clk);
2391
 
2392
for(m=0;m< 4;m=m+1)
2393
   for(n=0;n< size;n=n+1)
2394
           begin
2395
 
2396
`ifdef MICRON
2397
                data[07:00] = sram0a.bank0[(m*32)+n];
2398
                data[15:08] = sram0a.bank1[(m*32)+n];
2399
                data[23:16] = sram0b.bank0[(m*32)+n];
2400
                data[31:24] = sram0b.bank1[(m*32)+n];
2401
`else
2402
                data[07:00] = sram0a.memb1[(m*32)+n];
2403
                data[15:08] = sram0a.memb2[(m*32)+n];
2404
                data[23:16] = sram0b.memb1[(m*32)+n];
2405
                data[31:24] = sram0b.memb2[(m*32)+n];
2406
`endif
2407
 
2408
                //$display("INFO: Data[%0d]: Expected: %x, Got: %x (%0t)",
2409
                //      (m*4)+n, data, m0.wr_mem[(m*size)+n],  $time);
2410
 
2411
                if(data !== m0.wr_mem[(m*size)+n])
2412
                   begin
2413
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2414
                        (m*32)+n, data, m0.wr_mem[(m*size)+n],  $time);
2415
                        error_cnt = error_cnt + 1;
2416
                   end
2417
 
2418
           end
2419
 
2420
 
2421
   end
2422
 
2423
show_errors;
2424
$display("*****************************************************");
2425
$display("*** Test DONE ...                                 ***");
2426
$display("*****************************************************\n\n");
2427
 
2428
end
2429
endtask
2430
 
2431
 
2432
 
2433
task    scs_rdwr1;
2434
input           quick;
2435
 
2436
integer         quick;
2437
integer         x,s,n,m,adr;
2438
integer         del, size;
2439
reg     [7:0]    mode;
2440
reg     [2:0]    bs;
2441
integer         sz_inc;
2442
integer         sz_max, del_max;
2443
integer         read;
2444
reg     [2:0]    bas;
2445
reg     [31:0]   data;
2446
 
2447
begin
2448
 
2449
$display("\n\n");
2450
$display("*****************************************************");
2451
$display("*** SCS Read/Write Test 1 ...                     ***");
2452
$display("*****************************************************\n");
2453
 
2454
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2455
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2456
 
2457
        m0.wb_wr1(`REG_BASE + `TMS5,    4'hf, 32'hf03f_4104);
2458
        m0.wb_wr1(`REG_BASE + `CSC5,    4'hf, 32'h00a0_0027);
2459
 
2460
 
2461
case(quick)
2462
 0: sz_max = 32;
2463
 1: sz_max = 32;
2464
 2: sz_max = 16;
2465
endcase
2466
 
2467
case(quick)
2468
 0: del_max = 16;
2469
 1: del_max = 8;
2470
 2: del_max = 4;
2471
endcase
2472
 
2473
size = 1;
2474
del = 0;
2475
mode = 1;
2476
read = 1;
2477
write = 0;
2478
 
2479
 
2480
s0.mem_fill;
2481
 
2482
repeat(5)       @(posedge clk);
2483
 
2484
for(del=0;del<del_max;del=del+1)
2485
for(size=1;size<sz_max;size=size+1)
2486
   begin
2487
        m0.mem_fill;
2488
 
2489
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
2490
 
2491
        if(write)       m0.wb_wr_mult(`MEM_BASE5 + size*0*4, 4'hf, del, size);
2492
        if(read)        m0.wb_rd_mult(`MEM_BASE5 + size*0*4, 4'hf, del, size);
2493
 
2494
        if(write)       m0.wb_wr_mult(`MEM_BASE5 + size*1*4, 4'hf, del, size);
2495
        if(read)        m0.wb_rd_mult(`MEM_BASE5 + size*1*4, 4'hf, del, size);
2496
 
2497
        if(write)       m0.wb_wr_mult(`MEM_BASE5 + size*2*4, 4'hf, del, size);
2498
        if(read)        m0.wb_rd_mult(`MEM_BASE5 + size*2*4, 4'hf, del, size);
2499
 
2500
        if(write)       m0.wb_wr_mult(`MEM_BASE5 + size*3*4, 4'hf, del, size);
2501
        if(read)        m0.wb_rd_mult(`MEM_BASE5 + size*3*4, 4'hf, del, size);
2502
 
2503
        repeat(10)      @(posedge clk);
2504
 
2505
        x = 0;
2506
        for(n=0;n<(size*4);n=n+1)
2507
           begin
2508
 
2509
/*
2510
                case(mode)
2511
                   0:   data = {16'hzzzz, n[15:0]};
2512
                   1:
2513
                        begin
2514
                                data[31:24] = x[7:0]+3;
2515
                                data[23:16] = x[7:0]+2;
2516
                                data[15:08] = x[7:0]+1;
2517
                                data[07:00] = x[7:0]+0;
2518
                        end
2519
 
2520
                   2:   begin
2521
                                data[31:16] = x[15:0]+1;
2522
                                data[15:00] = x[15:0]+0;
2523
                        end
2524
                endcase
2525
 
2526
                case(mode)
2527
                   0:   x = x + 1;
2528
                   1:   x = x + 4;
2529
                   2:   x = x + 2;
2530
                endcase
2531
*/
2532
 
2533
                data = s0.mem[n];
2534
                //$display("INFO: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2535
                //      n, data, m0.rd_mem[n],  $time);
2536
 
2537
                if(data !== m0.rd_mem[n])
2538
                   begin
2539
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2540
                        n, data, m0.rd_mem[n],  $time);
2541
                        error_cnt = error_cnt + 1;
2542
                   end
2543
           end
2544
 
2545
   end
2546
 
2547
 
2548
show_errors;
2549
$display("*****************************************************");
2550
$display("*** Test DONE ...                                 ***");
2551
$display("*****************************************************\n\n");
2552
 
2553
end
2554
endtask
2555
 
2556
 
2557
 
2558
task sdram_wp;
2559
input           quick;
2560
 
2561
integer         quick;
2562
integer         n;
2563
integer         del, size;
2564
reg     [7:0]    mode;
2565
reg     [2:0]    bs;
2566
integer         sz_inc;
2567
integer         sz_max, del_max;
2568
integer         read;
2569
 
2570
begin
2571
$display("\n\n");
2572
$display("*****************************************************");
2573
$display("*** SDRAM Write Protect Test 1 ...                ***");
2574
$display("*****************************************************\n");
2575
 
2576
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6020_0200);
2577
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2578
 
2579
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
2580
                                        1'd0,   // Wr. Burst Len (1=Single)
2581
                                        2'd0,   // Op Mode
2582
                                        3'd2,   // CL
2583
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
2584
                                        3'd3    // Burst Length
2585
                                        });
2586
 
2587
//m0.wb_wr1(`REG_BASE + `CSC0,  4'hf, 32'h0000_0921);
2588
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0121);
2589
 
2590
wb_err_check_dis=1;
2591
case(quick)
2592
 0: sz_max = 64;
2593
 1: sz_max = 32;
2594
 2: sz_max = 16;
2595
endcase
2596
 
2597
case(quick)
2598
 0: del_max = 16;
2599
 1: del_max = 8;
2600
 2: del_max = 4;
2601
endcase
2602
 
2603
size = 1;
2604
del = 0;
2605
mode = 0;
2606
read = 1;
2607
//force sdram0.Debug = 1;
2608
 
2609
for(mode=0;mode<20;mode=mode+1)
2610
begin
2611
        sdram0.mem_fill(1024);
2612
 
2613
        case(mode[4:2])
2614
           0: bs = 0;
2615
           1: bs = 1;
2616
           2: bs = 2;
2617
           3: bs = 3;
2618
           4: bs = 7;
2619
        endcase
2620
 
2621
        if(mode[1])
2622
           sz_inc = 1;
2623
        else
2624
                case(mode[4:2])
2625
                   0: sz_inc = 1;
2626
                   1: sz_inc = 2;
2627
                   2: sz_inc = 4;
2628
                   3: sz_inc = 8;
2629
                   4: sz_inc = 1;
2630
                endcase
2631
 
2632
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
2633
                                        1'd0+mode[1],   // Wr. Burst Len (1=Single)
2634
                                        2'd0,           // Op Mode
2635
                                        3'd2+mode[0],    // CL
2636
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
2637
                                        3'd0+bs         // Burst Length
2638
                                        });
2639
 
2640
if(!verbose)    $display("Mode: %b", mode);
2641
 
2642
for(del=0;del<del_max;del=del+1)
2643
for(size=sz_inc;size<sz_max;size=size+sz_inc)
2644
   begin
2645
        m0.mem_fill;
2646
 
2647
        if(verbose)     $display("Mode: %b, Size: %0d, Delay: %0d", mode,  size, del);
2648
 
2649
        m0.wb_wr_mult(`MEM_BASE +        0, 4'hf, del, size);
2650
        if(read)        m0.wb_rd_mult(`MEM_BASE +        0, 4'hf, del, size);
2651
 
2652
        m0.wb_wr_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
2653
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*1*4, 4'hf, del, size);
2654
 
2655
        m0.wb_wr_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
2656
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*2*4, 4'hf, del, size);
2657
 
2658
        m0.wb_wr_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
2659
        if(read)        m0.wb_rd_mult(`MEM_BASE + size*3*4, 4'hf, del, size);
2660
 
2661
        repeat(10)      @(posedge clk);
2662
 
2663
        for(n=0;n< (size*4);n=n+1)
2664
           begin
2665
                if((sdram0.Bank0[n] == m0.wr_mem[n]) |
2666
                        (|sdram0.Bank0[n] === 1'bx) |
2667
                        (|m0.wr_mem[n] === 1'bx)         )
2668
                   begin
2669
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2670
                        n, sdram0.Bank0[n], m0.wr_mem[n],  $time);
2671
                        error_cnt = error_cnt + 1;
2672
                   end
2673
           end
2674
   end
2675
 
2676
end
2677
 
2678
wb_err_check_dis=0;
2679
show_errors;
2680
$display("*****************************************************");
2681
$display("*** Test DONE ...                                 ***");
2682
$display("*****************************************************\n\n");
2683
end
2684
endtask
2685
 
2686
 
2687
 
2688
 
2689
task sram_wp;
2690
 
2691
integer         n,m,read,write;
2692
integer         del, size;
2693
reg     [31:0]   data;
2694
begin
2695
 
2696
$display("\n\n");
2697
$display("*****************************************************");
2698
$display("*** SRAM Write Protect Test 1 ...                 ***");
2699
$display("*****************************************************\n");
2700
 
2701
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2702
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2703
 
2704
        m0.wb_wr1(`REG_BASE + `TMS4,    4'hf, 32'hffff_ffff);
2705
        m0.wb_wr1(`REG_BASE + `CSC4,    4'hf, 32'h0080_0903);
2706
 
2707
size = 4;
2708
del = 0;
2709
mode = 0;
2710
read = 1;
2711
write = 1;
2712
 
2713
sram0a.mem_fill( 256 );
2714
sram0b.mem_fill( 256 );
2715
 
2716
wb_err_check_dis=1;
2717
repeat(1)       @(posedge clk);
2718
 
2719
for(del=0;del<16;del=del+1)
2720
for(size=1;size<18;size=size+1)
2721
   begin
2722
        m0.mem_fill;
2723
 
2724
        $display("Size: %0d, Delay: %0d", size, del);
2725
//bw_clear;
2726
 
2727
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2728
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 0*4, 4'hf, del, size);
2729
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 32*4, 4'hf, del, size);
2730
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 32*4, 4'hf, del, size);
2731
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 64*4, 4'hf, del, size);
2732
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 64*4, 4'hf, del, size);
2733
        if(write)       m0.wb_wr_mult(`MEM_BASE4 + 96*4, 4'hf, del, size);
2734
        if(read)        m0.wb_rd_mult(`MEM_BASE4 + 96*4, 4'hf, del, size);
2735
 
2736
//bw_report;
2737
 
2738
repeat(10)      @(posedge clk);
2739
 
2740
for(m=0;m< 4;m=m+1)
2741
   for(n=0;n< size;n=n+1)
2742
           begin
2743
 
2744
`ifdef MICRON
2745
                data[07:00] = sram0a.bank0[(m*32)+n];
2746
                data[15:08] = sram0a.bank1[(m*32)+n];
2747
                data[23:16] = sram0b.bank0[(m*32)+n];
2748
                data[31:24] = sram0b.bank1[(m*32)+n];
2749
`else
2750
                data[07:00] = sram0a.memb1[(m*32)+n];
2751
                data[15:08] = sram0a.memb2[(m*32)+n];
2752
                data[23:16] = sram0b.memb1[(m*32)+n];
2753
                data[31:24] = sram0b.memb2[(m*32)+n];
2754
`endif
2755
 
2756
                //$display("INFO: Data[%0d]: Expected: %x, Got: %x (%0t)",
2757
                //      (m*4)+n, data, m0.wr_mem[(m*size)+n],  $time);
2758
 
2759
                if(data == m0.wr_mem[(m*size)+n])
2760
                   begin
2761
                        $display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2762
                        (m*32)+n, data, m0.wr_mem[(m*size)+n],  $time);
2763
                        error_cnt = error_cnt + 1;
2764
                   end
2765
 
2766
           end
2767
 
2768
 
2769
   end
2770
 
2771
wb_err_check_dis=0;
2772
show_errors;
2773
$display("*****************************************************");
2774
$display("*** Test DONE ...                                 ***");
2775
$display("*****************************************************\n\n");
2776
 
2777
end
2778
endtask
2779
 
2780
 
2781
 
2782
task sdram_rmw1;
2783
input           quick;
2784
 
2785
integer         quick;
2786
integer         n,m,adr;
2787
integer         del, size;
2788
reg     [7:0]    mode;
2789
reg     [2:0]    bs;
2790
integer         sz_inc;
2791
integer         sz_max, del_max;
2792
reg     [2:0]    kro;
2793
reg     [31:0]   data;
2794
integer         page_size;
2795
reg     [31:0]   mem0[0:1024];
2796
reg     [31:0]   mem1[0:1024];
2797
reg     [31:0]   mem2[0:1024];
2798
reg     [31:0]   mem3[0:1024];
2799
 
2800
begin
2801
 
2802
$display("\n\n");
2803
$display("*****************************************************");
2804
$display("*** SDRAM Size, Delay & Mode RMW test 1 ...       ***");
2805
$display("*** Different Row and Bank                        ***");
2806
$display("*****************************************************\n");
2807
 
2808
page_size = 256; // 64 mbit x 32 SDRAM
2809
 
2810
case(quick)
2811
 0: sz_max = 32;
2812
 1: sz_max = 32;
2813
 2: sz_max = 16;
2814
endcase
2815
 
2816
case(quick)
2817
 0: del_max = 16;
2818
 1: del_max = 8;
2819
 2: del_max = 4;
2820
endcase
2821
 
2822
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
2823
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
2824
 
2825
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
2826
                                        1'd0,   // Wr. Burst Len (1=Single)
2827
                                        2'd0,   // Op Mode
2828
                                        3'd2,   // CL
2829
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
2830
                                        3'd3    // Burst Length
2831
                                        });
2832
 
2833
kro = 0;
2834
for(kro=0;kro<2;kro=kro+1)       // Don't Need this for this test
2835
begin
2836
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821 | (kro[0]<<10));
2837
 
2838
size = 4;
2839
del = 0;
2840
mode = 4;
2841
 
2842
//force sdram0.Debug = 1;
2843
 
2844
for(mode=0;mode<10;mode=mode+1)
2845
begin
2846
 
2847
        case(mode[3:1])
2848
           0: bs = 0;
2849
           1: bs = 1;
2850
           2: bs = 2;
2851
           3: bs = 3;
2852
           4: bs = 7;
2853
        endcase
2854
 
2855
        case(mode[3:1])
2856
           0: sz_inc = 1;
2857
           1: sz_inc = 2;
2858
           2: sz_inc = 4;
2859
           3: sz_inc = 8;
2860
           4: sz_inc = 1;
2861
        endcase
2862
 
2863
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
2864
                                        1'd0+mode[0],    // Wr. Burst Len (1=Single)
2865
                                        2'd0,           // Op Mode
2866
                                        3'd2,           // CL
2867
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
2868
                                        3'd0+bs         // Burst Length
2869
                                        });
2870
 
2871
repeat(50)      @(posedge clk);
2872
 
2873
if(!verbose)    $display("KRO: %0d, Mode: %b", kro, mode);
2874
 
2875
for(del=0;del<del_max;del=del+1)
2876
for(size=sz_inc;size<sz_max;size=size+sz_inc)
2877
   begin
2878
        m0.mem_fill;
2879
        fill_mem(1024);
2880
        for(m=0;m<4;m=m+1)
2881
        for(n=0;n<(size*2)+1;n=n+1)
2882
                case(m)
2883
                   0: mem0[n] = sdram0.Bank0[n];
2884
                   1: mem1[n] = sdram0.Bank1[n+1*size*2];
2885
                   2: mem2[n] = sdram0.Bank2[n+2*size*2];
2886
                   3: mem3[n] = sdram0.Bank3[n+3*size*2];
2887
                endcase
2888
 
2889
        if(verbose)     $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d",
2890
                                kro, mode,  size, del);
2891
 
2892
        m0.wb_rmw(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size, size);
2893
        m0.wb_rmw(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size, size);
2894
 
2895
        m0.wb_rmw(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size, size);
2896
        m0.wb_rmw(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size, size);
2897
 
2898
        m0.wb_rmw(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size, size);
2899
        m0.wb_rmw(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size, size);
2900
 
2901
        m0.wb_rmw(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size, size);
2902
        m0.wb_rmw(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size, size);
2903
 
2904
        for(m=0;m<4;m=m+1)
2905
        for(n=0;n<(size*2);n=n+1)
2906
           begin
2907
 
2908
                case(m)
2909
                   0: data = mem0[n];
2910
                   1: data = mem1[n];
2911
                   2: data = mem2[n];
2912
                   3: data = mem3[n];
2913
                endcase
2914
 
2915
                if((data !== m0.rd_mem[(m*size*2)+n]) | (|data === 1'bx) |
2916
                        (|m0.rd_mem[(m*size*2)+n] === 1'bx) )
2917
                   begin
2918
                        $display("ERROR: RD Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2919
                        (m*size*2)+n, data, m0.rd_mem[(m*size*2)+n],  $time);
2920
                        error_cnt = error_cnt + 1;
2921
                   end
2922
 
2923
           end
2924
 
2925
        repeat(10)      @(posedge clk);
2926
 
2927
        for(m=0;m<4;m=m+1)
2928
        for(n=0;n<size*2;n=n+1)
2929
           begin
2930
 
2931
                case(m)
2932
                   0: data = sdram0.Bank0[n];
2933
                   1: data = sdram0.Bank1[n+1*size*2];
2934
                   2: data = sdram0.Bank2[n+2*size*2];
2935
                   3: data = sdram0.Bank3[n+3*size*2];
2936
                endcase
2937
 
2938
                if((data !== m0.wr_mem[(m*size*2)+n]) | (|data === 1'bx) |
2939
                        (|m0.wr_mem[(m*size*2)+n] === 1'bx) )
2940
                   begin
2941
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
2942
                        (m*size*2)+n, data, m0.wr_mem[(m*size*2)+n],  $time);
2943
                        error_cnt = error_cnt + 1;
2944
                   end
2945
           end
2946
   end
2947
 
2948
end
2949
end
2950
 
2951
show_errors;
2952
$display("*****************************************************");
2953
$display("*** Test DONE ...                                 ***");
2954
$display("*****************************************************\n\n");
2955
end
2956
endtask
2957
 
2958
 
2959
 
2960
 
2961
task sdram_rmw2;
2962
input           quick;
2963
 
2964
integer         quick;
2965
integer         n,m,adr;
2966
integer         del, size;
2967
reg     [7:0]    mode;
2968
reg     [2:0]    bs;
2969
integer         sz_inc;
2970
integer         sz_max, del_max;
2971
reg     [2:0]    kro;
2972
reg     [31:0]   data, data1;
2973
integer         page_size;
2974
//reg   [31:0]  mem0[0:1024];
2975
//reg   [31:0]  mem1[0:1024];
2976
//reg   [31:0]  mem2[0:1024];
2977
//reg   [31:0]  mem3[0:1024];
2978
 
2979
begin
2980
 
2981
$display("\n\n");
2982
$display("*****************************************************");
2983
$display("*** SDRAM Size, Delay & Mode RMW test 2 ...       ***");
2984
$display("*** Different Row and Bank                        ***");
2985
$display("*****************************************************\n");
2986
 
2987
page_size = 256; // 64 mbit x 32 SDRAM
2988
 
2989
case(quick)
2990
 0: sz_max = 32;
2991
 1: sz_max = 32;
2992
 2: sz_max = 16;
2993
endcase
2994
 
2995
case(quick)
2996
 0: del_max = 16;
2997
 1: del_max = 8;
2998
 2: del_max = 4;
2999
endcase
3000
 
3001
m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
3002
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
3003
 
3004
m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
3005
                                        1'd0,   // Wr. Burst Len (1=Single)
3006
                                        2'd0,   // Op Mode
3007
                                        3'd2,   // CL
3008
                                        1'b0,   // Burst Type (0=Seq;1=Inter)
3009
                                        3'd3    // Burst Length
3010
                                        });
3011
 
3012
kro = 0;
3013
for(kro=0;kro<2;kro=kro+1)       // Don't Need this for this test
3014
begin
3015
m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'h0000_0821 | (kro[0]<<10));
3016
 
3017
size = 4;
3018
del = 2;
3019 8 rudi
mode = 9;
3020 4 rudi
 
3021
//force sdram0.Debug = 1;
3022
 
3023
for(mode=0;mode<10;mode=mode+1)
3024
begin
3025
 
3026
        case(mode[3:1])
3027
           0: bs = 0;
3028
           1: bs = 1;
3029
           2: bs = 2;
3030
           3: bs = 3;
3031
           4: bs = 7;
3032
        endcase
3033
 
3034
        case(mode[3:1])
3035
           0: sz_inc = 1;
3036
           1: sz_inc = 2;
3037
           2: sz_inc = 4;
3038
           3: sz_inc = 8;
3039
           4: sz_inc = 1;
3040
        endcase
3041
 
3042
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, {22'h3fff_ff,
3043
                                        1'd0+mode[0],    // Wr. Burst Len (1=Single)
3044
                                        2'd0,           // Op Mode
3045
                                        3'd2,           // CL
3046
                                        1'b0,           // Burst Type (0=Seq;1=Inter)
3047
                                        3'd0+bs         // Burst Length
3048
                                        });
3049
 
3050
repeat(50)      @(posedge clk);
3051
 
3052
if(!verbose)    $display("KRO: %0d, Mode: %b", kro, mode);
3053
 
3054
for(del=0;del<del_max;del=del+1)
3055
for(size=sz_inc;size<sz_max;size=size+sz_inc)
3056
   begin
3057
        m0.mem_fill;
3058
        fill_mem(1024);
3059
 
3060
 
3061
        if(verbose)     $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d",
3062
                                kro, mode,  size, del);
3063
 
3064
        m0.wb_wmr(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size, size);
3065
        m0.wb_wmr(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size, size);
3066
 
3067
        m0.wb_wmr(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size, size);
3068
        m0.wb_wmr(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size, size);
3069
 
3070
        m0.wb_wmr(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size, size);
3071
        m0.wb_wmr(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size, size);
3072
 
3073
        m0.wb_wmr(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size, size);
3074
        m0.wb_wmr(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size, size);
3075
 
3076
        for(n=0;n<(size*2);n=n+1)
3077
           begin
3078
 
3079
                data = m0.wr_mem[n];
3080
                data1 = m0.rd_mem[n];
3081
 
3082
                if((data !== data1) | (|data === 1'bx) |
3083
                        (|data1 === 1'bx) )
3084
                   begin
3085
                        $display("ERROR: WMR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
3086
                        (m*size*2)+n, data, m0.rd_mem[(m*size*2)+n],  $time);
3087
                        error_cnt = error_cnt + 1;
3088
                   end
3089
 
3090
           end
3091
 
3092
   end
3093
 
3094
end
3095
end
3096
 
3097
show_errors;
3098
$display("*****************************************************");
3099
$display("*** Test DONE ...                                 ***");
3100
$display("*****************************************************\n\n");
3101
end
3102
endtask
3103
 
3104
 
3105
 
3106
task sram_rmw1;
3107
 
3108
integer         n,m,read,write;
3109
integer         del, size;
3110
reg     [31:0]   data;
3111
reg     [31:0]   mem[0:1024];
3112
begin
3113
 
3114
$display("\n\n");
3115
$display("*****************************************************");
3116
$display("*** SRAM Size & Delay RMW Test 1 ...              ***");
3117
$display("*****************************************************\n");
3118
 
3119
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
3120
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
3121
 
3122
        m0.wb_wr1(`REG_BASE + `TMS4,    4'hf, 32'hffff_ffff);
3123
        m0.wb_wr1(`REG_BASE + `CSC4,    4'hf, 32'h0080_0003);
3124
 
3125
size = 1;
3126
del = 0;
3127
 
3128
repeat(1)       @(posedge clk);
3129
 
3130
for(del=0;del<16;del=del+1)
3131
for(size=1;size<18;size=size+1)
3132
   begin
3133
        m0.mem_fill;
3134
        sram0a.mem_fill( 256 );
3135
        sram0b.mem_fill( 256 );
3136
        for(m=0;m<4;m=m+1)
3137
        for(n=0;n<(size*2)+1;n=n+1)
3138
           begin
3139
`ifdef MICRON
3140
                data[07:00] = sram0a.bank0[(m*32)+n];
3141
                data[15:08] = sram0a.bank1[(m*32)+n];
3142
                data[23:16] = sram0b.bank0[(m*32)+n];
3143
                data[31:24] = sram0b.bank1[(m*32)+n];
3144
`else
3145
                data[07:00] = sram0a.memb1[(m*32)+n];
3146
                data[15:08] = sram0a.memb2[(m*32)+n];
3147
                data[23:16] = sram0b.memb1[(m*32)+n];
3148
                data[31:24] = sram0b.memb2[(m*32)+n];
3149
`endif
3150
                mem[(m*32)+n] = data;
3151
           end
3152
 
3153
 
3154
        $display("Size: %0d, Delay: %0d", size, del);
3155
//bw_clear;
3156
 
3157
        m0.wb_rmw(`MEM_BASE4 + 00*4, 4'hf, del, size, size);
3158
        m0.wb_rmw(`MEM_BASE4 + 32*4, 4'hf, del, size, size);
3159
        m0.wb_rmw(`MEM_BASE4 + 64*4, 4'hf, del, size, size);
3160
        m0.wb_rmw(`MEM_BASE4 + 96*4, 4'hf, del, size, size);
3161
 
3162
//bw_report;
3163
 
3164
repeat(10)      @(posedge clk);
3165
 
3166
for(m=0;m< 4;m=m+1)
3167
   for(n=0;n< size;n=n+1)
3168
           begin
3169
 
3170
                data = mem[(m*32)+n];
3171
 
3172
                if(data !== m0.rd_mem[(m*size)+n])
3173
                   begin
3174
                        $display("ERROR: RD Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
3175
                        (m*32)+n, data, m0.rd_mem[(m*size)+n],  $time);
3176
                        error_cnt = error_cnt + 1;
3177
                   end
3178
 
3179
`ifdef MICRON
3180
                data[07:00] = sram0a.bank0[(m*32)+n];
3181
                data[15:08] = sram0a.bank1[(m*32)+n];
3182
                data[23:16] = sram0b.bank0[(m*32)+n];
3183
                data[31:24] = sram0b.bank1[(m*32)+n];
3184
`else
3185
                data[07:00] = sram0a.memb1[(m*32)+n];
3186
                data[15:08] = sram0a.memb2[(m*32)+n];
3187
                data[23:16] = sram0b.memb1[(m*32)+n];
3188
                data[31:24] = sram0b.memb2[(m*32)+n];
3189
`endif
3190
 
3191
                if(data !== m0.wr_mem[(m*size)+n])
3192
                   begin
3193
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
3194
                        (m*32)+n, data, m0.wr_mem[(m*size)+n],  $time);
3195
                        error_cnt = error_cnt + 1;
3196
                   end
3197
 
3198
 
3199
 
3200
 
3201
 
3202
           end
3203
 
3204
   end
3205
 
3206
show_errors;
3207
$display("*****************************************************");
3208
$display("*** Test DONE ...                                 ***");
3209
$display("*****************************************************\n\n");
3210
 
3211
end
3212
endtask
3213
 
3214
 
3215
 
3216
task sram_rmw2;
3217
 
3218
integer         n,m,read,write;
3219
integer         del, size;
3220
reg     [31:0]   data;
3221
reg     [31:0]   mem[0:1024];
3222
begin
3223
 
3224
$display("\n\n");
3225
$display("*****************************************************");
3226
$display("*** SRAM Size & Delay RMW Test 2 ...              ***");
3227
$display("*****************************************************\n");
3228
 
3229
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'h6030_0300);
3230
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
3231
 
3232
        m0.wb_wr1(`REG_BASE + `TMS4,    4'hf, 32'hffff_ffff);
3233
        m0.wb_wr1(`REG_BASE + `CSC4,    4'hf, 32'h0080_0003);
3234
 
3235
size = 4;
3236
del = 2;
3237
 
3238
repeat(1)       @(posedge clk);
3239
 
3240
for(del=0;del<16;del=del+1)
3241
for(size=1;size<18;size=size+1)
3242
   begin
3243
        m0.mem_fill;
3244
        sram0a.mem_fill( 256 );
3245
        sram0b.mem_fill( 256 );
3246
        for(m=0;m<4;m=m+1)
3247
        for(n=0;n<(size*2)+1;n=n+1)
3248
           begin
3249
`ifdef MICRON
3250
                data[07:00] = sram0a.bank0[(m*32)+n];
3251
                data[15:08] = sram0a.bank1[(m*32)+n];
3252
                data[23:16] = sram0b.bank0[(m*32)+n];
3253
                data[31:24] = sram0b.bank1[(m*32)+n];
3254
`else
3255
                data[07:00] = sram0a.memb1[(m*32)+n];
3256
                data[15:08] = sram0a.memb2[(m*32)+n];
3257
                data[23:16] = sram0b.memb1[(m*32)+n];
3258
                data[31:24] = sram0b.memb2[(m*32)+n];
3259
`endif
3260
                mem[(m*32)+n] = data;
3261
           end
3262
 
3263
 
3264
        $display("Size: %0d, Delay: %0d", size, del);
3265
//bw_clear;
3266
 
3267
        m0.wb_wmr(`MEM_BASE4 + 00*4, 4'hf, del, size, size);
3268
        m0.wb_wmr(`MEM_BASE4 + 32*4, 4'hf, del, size, size);
3269
        m0.wb_wmr(`MEM_BASE4 + 64*4, 4'hf, del, size, size);
3270
        m0.wb_wmr(`MEM_BASE4 + 96*4, 4'hf, del, size, size);
3271
 
3272
//bw_report;
3273
 
3274
repeat(10)      @(posedge clk);
3275
 
3276
 
3277
for(m=0;m< 4;m=m+1)
3278
   for(n=0;n< size;n=n+1)
3279
           begin
3280
 
3281
                data = mem[(m*32)+n];
3282
                data = m0.wr_mem[(m*size)+n];
3283
 
3284
                if(data !== m0.rd_mem[(m*size)+n])
3285
                   begin
3286
                        $display("ERROR: RD Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
3287
                        (m*32)+n, data, m0.rd_mem[(m*size)+n],  $time);
3288
                        error_cnt = error_cnt + 1;
3289
                   end
3290
 
3291
/*
3292
`ifdef MICRON
3293
                data[07:00] = sram0a.bank0[(m*32)+n];
3294
                data[15:08] = sram0a.bank1[(m*32)+n];
3295
                data[23:16] = sram0b.bank0[(m*32)+n];
3296
                data[31:24] = sram0b.bank1[(m*32)+n];
3297
`else
3298
                data[07:00] = sram0a.memb1[(m*32)+n];
3299
                data[15:08] = sram0a.memb2[(m*32)+n];
3300
                data[23:16] = sram0b.memb1[(m*32)+n];
3301
                data[31:24] = sram0b.memb2[(m*32)+n];
3302
`endif
3303
 
3304
                if(data !== m0.wr_mem[(m*size)+n])
3305
                   begin
3306
                        $display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
3307
                        (m*32)+n, data, m0.wr_mem[(m*size)+n],  $time);
3308
                        error_cnt = error_cnt + 1;
3309
                   end
3310
*/
3311
 
3312
 
3313
 
3314
 
3315
           end
3316
 
3317
   end
3318
 
3319
show_errors;
3320
$display("*****************************************************");
3321
$display("*** Test DONE ...                                 ***");
3322
$display("*****************************************************\n\n");
3323
 
3324
end
3325
endtask
3326
 
3327
 

powered by: WebSVN 2.1.0

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