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 28

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

powered by: WebSVN 2.1.0

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