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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [bench/] [verilog/] [test_bench_top.v] - Blame information for rev 14

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

Line No. Rev Author Line
1 4 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Top Level Test Bench                                       ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000 Rudolf Usselmann                         ////
15
////                    rudi@asics.ws                            ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39
//
40 14 rudi
//  $Id: test_bench_top.v,v 1.4 2001-11-11 01:52:02 rudi Exp $
41 4 rudi
//
42 14 rudi
//  $Date: 2001-11-11 01:52:02 $
43
//  $Revision: 1.4 $
44 4 rudi
//  $Author: rudi $
45
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50 14 rudi
//               Revision 1.3  2001/09/02 02:29:43  rudi
51
//
52
//               Fixed the TMS register setup to be tight and correct.
53
//
54 10 rudi
//               Revision 1.2  2001/08/10 08:16:21  rudi
55
//
56
//               - Changed IO names to be more clear.
57
//               - Uniquifyed define names to be core specific.
58
//               - Removed "Refresh Early" configuration
59
//
60 8 rudi
//               Revision 1.1  2001/07/29 07:34:40  rudi
61
//
62
//
63
//               1) Changed Directory Structure
64
//               2) Fixed several minor bugs
65
//
66 4 rudi
//               Revision 1.2  2001/06/03 11:34:18  rudi
67
//               *** empty log message ***
68
//
69
//               Revision 1.1.1.1  2001/05/13 09:36:32  rudi
70
//               Created Directory Structure
71
//
72
//
73
//
74
//                        
75
 
76
`include "mc_defines.v"
77
 
78
module test;
79
 
80
reg             clk;
81
reg             rst;
82
 
83
// IO Prototypes
84
 
85
wire    [31:0]   wb_data_i;
86
wire    [31:0]   wb_data_o;
87
wire    [31:0]   wb_addr_i;
88
wire    [3:0]    wb_sel_i;
89
wire            wb_we_i;
90
wire            wb_cyc_i;
91
wire            wb_stb_i;
92
wire            wb_ack_o;
93
wire            wb_err_o;
94
wire            wb_rty_o;
95
 
96
reg             susp_req, resume_req;
97
wire            suspended;
98
wire    [31:0]   poc;
99
 
100
reg             mc_clk;
101
reg             mc_br;
102
wire            mc_bg;
103
wire            mc_ack;
104
wire    [23:0]   mc_addr;
105
wire    [31:0]   mc_data_i;
106
wire    [31:0]   mc_data_o;
107
wire    [3:0]    mc_dp_i;
108
wire    [3:0]    mc_dp_o;
109
wire            mc_data_oe;
110
wire    [3:0]    mc_dqm;
111
wire            mc_oe_;
112
wire            mc_we_;
113
wire            mc_cas_;
114
wire            mc_ras_;
115
wire            mc_cke_;
116
wire    [7:0]    mc_cs_;
117
wire            mc_sts;
118
wire            mc_rp_;
119
wire            mc_vpen;
120
wire            mc_adsc_;
121
wire            mc_adv_;
122
wire            mc_zz;
123
wire            mc_c_oe;
124
 
125
 
126
// Test Bench Variables
127
reg     [31:0]   wd_cnt;
128
integer         error_cnt;
129
integer         verbose;
130
integer         poc_mode;
131
reg             wb_err_check_dis;
132 10 rudi
integer         LVL;
133 4 rudi
 
134
integer cyc_cnt;
135
integer ack_cnt;
136
 
137
// Misc Variables
138
 
139
integer         n,m;
140
 
141
reg     [31:0]   data;
142
 
143
reg     [31:0]   buffer32;
144
integer         del, size;
145
reg     [7:0]    mode;
146
reg     [2:0]    bs;
147
integer         sz_inc;
148
integer         read, write;
149
integer         done;
150
integer         adr;
151
 
152
/////////////////////////////////////////////////////////////////////
153
//
154
// Defines 
155
//
156
 
157
`define MEM_BASE        32'h0000_0000
158
`define MEM_BASE1       32'h0400_0000
159
`define MEM_BASE2       32'h0800_0000
160
`define MEM_BASE3       32'h0c00_0000
161
`define MEM_BASE4       32'h1000_0000
162
`define MEM_BASE5       32'h1400_0000
163
`define MEM_BASE6       32'h1800_0000
164 14 rudi
`define REG_BASE        32'h6000_0000
165 4 rudi
 
166
`define CSR             8'h00
167
`define POC             8'h04
168
`define BA_MASK         8'h08
169
 
170
`define CSC0            8'h10
171
`define TMS0            8'h14
172
`define CSC1            8'h18
173
`define TMS1            8'h1c
174
`define CSC2            8'h20
175
`define TMS2            8'h24
176
`define CSC3            8'h28
177
`define TMS3            8'h2c
178
`define CSC4            8'h30
179
`define TMS4            8'h34
180
`define CSC5            8'h38
181
`define TMS5            8'h3c
182
`define CSC6            8'h40
183
`define TMS6            8'h44
184
`define CSC7            8'h48
185
`define TMS7            8'h4c
186
 
187
/////////////////////////////////////////////////////////////////////
188
//
189
// Simulation Initialization and Start up Section
190
//
191
 
192
`define SDRAM0          1
193
`define SRAM            1
194
`define MULTI_SDRAM     1
195
`define FLASH           1
196
`define MICRON          1
197
 
198
initial
199
   begin
200
        $display("\n\n");
201
        $display("*****************************************************");
202
        $display("* WISHBONE Memory Controller Simulation started ... *");
203
        $display("*****************************************************");
204
        $display("\n");
205
`ifdef WAVES
206
        $shm_open("waves");
207
        $shm_probe("AS",test,"AS");
208
        $display("INFO: Signal dump enabled ...\n\n");
209
`endif
210
        poc_mode = 1;
211
        #1;
212
        poc_mode = 0;
213
        wb_err_check_dis=0;
214
        cyc_cnt = 0;
215
        ack_cnt = 0;
216
        wd_cnt = 0;
217
        error_cnt = 0;
218
        clk = 1;
219
        mc_clk = 0;
220 14 rudi
        rst = 1;
221 4 rudi
        susp_req = 0;
222
        resume_req = 0;
223
        verbose = 1;
224
        mc_br = 0;
225
 
226 10 rudi
        repeat(11)      @(posedge clk);
227
        #1;
228 14 rudi
        rst = 0;
229 4 rudi
        repeat(10)      @(posedge clk);
230
 
231
        // HERE IS WHERE THE TEST CASES GO ...
232
 
233
if(0)    // Full Regression Run
234
   begin
235
$display(" ......................................................");
236
$display(" :                                                    :");
237
$display(" :    Long Regression Run ...                         :");
238
$display(" :....................................................:");
239
        verbose = 0;
240
`ifdef FLASH
241
        boot(0);
242
`endif
243
 
244
        m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0000_0000);
245
        sdram_wr1(0);
246
        sdram_rd1(0);
247
        sdram_rd2(0);
248
        sdram_wr2(0);
249
        sdram_rd3(0);
250
        sdram_wr3(0);
251
        sdram_rd4(0);
252
        sdram_wr4(0);
253
        sdram_wp(0);
254
        sdram_rmw1(0);
255
        sdram_rmw2(0);
256
 
257
`ifdef MULTI_SDRAM
258
        sdram_rd5(0);
259
        sdram_wr5(0);
260
`endif
261
 
262
`ifdef FLASH
263
        asc_rdwr1(0);
264
`endif
265
 
266
`ifdef SRAM
267
        sram_rd1;
268
        sram_wr1;
269
        sram_wp;
270
        sram_rmw1;
271
        sram_rmw2;
272
`endif
273
 
274
        scs_rdwr1(0);
275
 
276
   end
277
else
278
if(0)    // Quick Regression Run
279
   begin
280
$display(" ......................................................");
281
$display(" :                                                    :");
282
$display(" :    Short Regression Run ...                        :");
283
$display(" :....................................................:");
284
        verbose = 0;
285
`ifdef FLASH
286
        boot(2);
287
`endif
288
        m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0000_0000);
289 8 rudi
 
290 4 rudi
        sdram_rd1(2);
291
        sdram_wr1(2);
292
 
293
        sdram_rd2(2);
294
        sdram_wr2(2);
295
 
296
        sdram_rd3(2);
297
        sdram_wr3(2);
298
 
299
        sdram_rd4(2);
300
        sdram_wr4(2);
301
 
302
        sdram_wp(2);
303
        sdram_rmw1(2);
304
        sdram_rmw2(2);
305
 
306
`ifdef MULTI_SDRAM
307
        sdram_rd5(2);
308
        sdram_wr5(2);
309
`endif
310
 
311 10 rudi
 
312 4 rudi
`ifdef FLASH
313
        asc_rdwr1(2);
314
`endif
315
 
316
`ifdef SRAM
317
        sram_rd1;
318
        sram_wr1;
319
        sram_wp;
320
        sram_rmw1;
321
        sram_rmw2;
322
`endif
323 14 rudi
        //scs_rdwr1(2);
324 4 rudi
 
325 14 rudi
        mc_reset;
326 4 rudi
   end
327 14 rudi
//else
328 8 rudi
if(1)   // Suspend resume testing
329 4 rudi
begin
330
$display(" ......................................................");
331
$display(" :                                                    :");
332
$display(" :    Suspend Resume Testing ...                      :");
333
$display(" :....................................................:");
334
 
335
        verbose = 0;
336
        done = 0;
337 14 rudi
        LVL = 2;
338 10 rudi
 
339 4 rudi
        fork
340
 
341
           begin
342 10 rudi
 
343 4 rudi
`ifdef FLASH
344 10 rudi
                boot(LVL);
345 4 rudi
`endif
346
                m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0000_0000);
347 10 rudi
 
348 4 rudi
                while(susp_req | suspended)     @(posedge clk);
349 10 rudi
                sdram_rd1(LVL);
350 4 rudi
                while(susp_req | suspended)     @(posedge clk);
351 10 rudi
                sdram_wr1(LVL);
352 4 rudi
                while(susp_req | suspended)     @(posedge clk);
353 10 rudi
                sdram_rd2(LVL);
354
 
355
 
356 4 rudi
                while(susp_req | suspended)     @(posedge clk);
357 10 rudi
                sdram_wr2(LVL);
358
 
359 4 rudi
                while(susp_req | suspended)     @(posedge clk);
360 10 rudi
                sdram_rd3(LVL);
361 4 rudi
                while(susp_req | suspended)     @(posedge clk);
362 10 rudi
                sdram_wr3(LVL);
363 4 rudi
                while(susp_req | suspended)     @(posedge clk);
364 10 rudi
                sdram_rd4(LVL);
365 4 rudi
                while(susp_req | suspended)     @(posedge clk);
366 10 rudi
                sdram_wr4(LVL);
367 4 rudi
 
368
                while(susp_req | suspended)     @(posedge clk);
369 10 rudi
                sdram_wp(LVL);
370 4 rudi
                while(susp_req | suspended)     @(posedge clk);
371 10 rudi
                sdram_rmw1(LVL);
372 4 rudi
                while(susp_req | suspended)     @(posedge clk);
373 10 rudi
                sdram_rmw2(LVL);
374 4 rudi
 
375
`ifdef MULTI_SDRAM
376
                while(susp_req | suspended)     @(posedge clk);
377 10 rudi
                sdram_rd5(LVL);
378 4 rudi
                while(susp_req | suspended)     @(posedge clk);
379 10 rudi
                sdram_wr5(LVL);
380 4 rudi
`endif
381
 
382 14 rudi
 
383 4 rudi
`ifdef FLASH
384
                while(susp_req | suspended)     @(posedge clk);
385 10 rudi
                asc_rdwr1(LVL);
386 4 rudi
`endif
387
 
388
`ifdef SRAM
389 14 rudi
 
390 4 rudi
                while(susp_req | suspended)     @(posedge clk);
391
                sram_rd1;
392
                while(susp_req | suspended)     @(posedge clk);
393
                sram_wr1;
394
                while(susp_req | suspended)     @(posedge clk);
395
                sram_wp;
396
                while(susp_req | suspended)     @(posedge clk);
397 10 rudi
                sram_wp;
398
                while(susp_req | suspended)     @(posedge clk);
399 4 rudi
                sram_rmw1;
400 10 rudi
 
401 4 rudi
                while(susp_req | suspended)     @(posedge clk);
402 10 rudi
                sram_rmw1;
403
                while(susp_req | suspended)     @(posedge clk);
404 4 rudi
                sram_rmw2;
405
`endif
406 14 rudi
                //while(susp_req | suspended)   @(posedge clk);
407
                //scs_rdwr1(LVL);
408 4 rudi
 
409 10 rudi
 
410 4 rudi
                done = 1;
411
           end
412
 
413
           begin
414
                repeat(50)      @(posedge clk);
415
                while(!done)
416
                   begin
417
                        repeat(40)      @(posedge clk);
418
                        susp_res;
419
                   end
420
           end
421
        join
422 14 rudi
 
423
        mc_reset;
424 4 rudi
end
425 10 rudi
//else
426 14 rudi
if(0)    // Bus Request testing
427 4 rudi
begin
428
$display(" ......................................................");
429
$display(" :                                                    :");
430
$display(" :    Bus Request/Grant Testing ...                   :");
431
$display(" :....................................................:");
432
        verbose = 0;
433
        done = 0;
434 14 rudi
        LVL = 2;
435 4 rudi
        fork
436
 
437
           begin
438
`ifdef FLASH
439 10 rudi
                boot(LVL);
440 4 rudi
`endif
441
                m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0000_0000);
442 10 rudi
                sdram_rd1(LVL);
443
                sdram_wr1(LVL);
444
                sdram_rd1(LVL);
445
                sdram_wr1(LVL);
446
                sdram_rd3(LVL);
447
                sdram_wr3(LVL);
448
                sdram_rd4(LVL);
449
                sdram_wr4(LVL);
450
                sdram_wp(LVL);
451
                sdram_rmw1(LVL);
452
                sdram_rmw2(LVL);
453 4 rudi
 
454
`ifdef MULTI_SDRAM
455 10 rudi
                sdram_rd5(LVL);
456
                sdram_wr5(LVL);
457 4 rudi
`endif
458
 
459
`ifdef FLASH
460 10 rudi
                asc_rdwr1(LVL);
461 4 rudi
`endif
462
 
463
`ifdef SRAM
464
                sram_rd1;
465
                sram_wr1;
466
                sram_wp;
467
                sram_rmw1;
468
                sram_rmw2;
469
`endif
470 14 rudi
                //scs_rdwr1(LVL);
471 4 rudi
 
472
                done = 1;
473
           end
474
 
475
           begin
476
                repeat(50)      @(posedge clk);
477
                while(!done)
478
                   begin
479
                        repeat(40)      @(posedge clk);
480
                        bus_req;
481
                   end
482
           end
483
 
484
        join
485
end
486
else
487
if(1)   // Debug Tests
488
   begin
489
$display(" ......................................................");
490
$display(" :                                                    :");
491
$display(" :    Test Debug Testing ...                          :");
492
$display(" :....................................................:");
493 10 rudi
        //verbose = 0;
494 4 rudi
        //boot(2);
495
 
496
`define CSR             8'h00
497
`define POC             8'h04
498
`define BA_MASK         8'h08
499
 
500 14 rudi
`define CSR_MASK        32'hff00_07fe
501
`define BAM_MASK        32'h0000_07ff
502
`define CSC_MASK        32'hffff_ffff
503
`define TMS_MASK        32'hffff_ffff
504
 
505
        m0.wb_wr1(`REG_BASE + `CSR,     4'hf, 32'hffff_ffff);
506
        m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'hffff_ffff);
507
        m0.wb_wr1(`REG_BASE + `CSC0,    4'hf, 32'hffff_ffff);
508
        m0.wb_wr1(`REG_BASE + `TMS0,    4'hf, 32'hffff_ffff);
509
        m0.wb_wr1(`REG_BASE + `CSC1,    4'hf, 32'hffff_ffff);
510
        m0.wb_wr1(`REG_BASE + `TMS1,    4'hf, 32'hffff_ffff);
511
        m0.wb_wr1(`REG_BASE + `CSC2,    4'hf, 32'hffff_ffff);
512
        m0.wb_wr1(`REG_BASE + `TMS2,    4'hf, 32'hffff_ffff);
513
        m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'hffff_ffff);
514
        m0.wb_wr1(`REG_BASE + `TMS3,    4'hf, 32'hffff_ffff);
515
 
516
        m0.wb_rd1(`REG_BASE + `CSR,     4'hf, data);
517
        m0.wb_rd1(`REG_BASE + `BA_MASK, 4'hf, data);
518
        m0.wb_rd1(`REG_BASE + `CSC0,    4'hf, data);
519
        m0.wb_rd1(`REG_BASE + `TMS0,    4'hf, data);
520
        m0.wb_rd1(`REG_BASE + `CSC1,    4'hf, data);
521
        m0.wb_rd1(`REG_BASE + `TMS1,    4'hf, data);
522
        m0.wb_rd1(`REG_BASE + `CSC2,    4'hf, data);
523
        m0.wb_rd1(`REG_BASE + `TMS2,    4'hf, data);
524
        m0.wb_rd1(`REG_BASE + `CSC3,    4'hf, data);
525
        m0.wb_rd1(`REG_BASE + `TMS3,    4'hf, data);
526
 
527
 
528
 
529
 
530
 
531 4 rudi
        m0.wb_wr1(`REG_BASE + `CSC3,    4'hf, 32'h0000_0000);
532 14 rudi
        //sdram_rd1(2);
533
        //sdram_wr1(2);
534
        //asc_rdwr1(2);
535 8 rudi
        //sram_rd1;
536 14 rudi
        //sram_wr1;
537 8 rudi
        //sram_rmw1;
538 4 rudi
        //sram_rmw2;
539 8 rudi
        //sram_wp;
540 4 rudi
 
541
        //scs_rdwr1(2);
542
 
543
        //asc_rdwr1(2);
544
        //asc_rdwr1_x(2);
545
 
546 10 rudi
        //sdram_wp(2);
547
        //sdram_rmw1(2);
548 8 rudi
        //sdram_rmw2(2);
549
 
550 10 rudi
        //sdram_rd2(2);
551
        //sdram_wr2(2);
552 14 rudi
 
553
        //sdram_bo;
554
        //sdram_rd1b(2);
555
 
556
        //sdram_rd1(2);
557
        //sdram_wr1(2);
558
 
559
        //sdram_rd5(2);
560
        //sdram_wr5(2);
561 4 rudi
/*
562
        sdram_rd1(2);
563 10 rudi
        sdram_wr1(2);
564
        sdram_rd2(2);
565
        sdram_wr2(2);
566
        sdram_rd3(2);
567
        sdram_wr3(2);
568
        sdram_rd4(2);
569
        sdram_wr4(2);
570
        sdram_rd5(2);
571
        sdram_wr5(2);
572 14 rudi
 
573 10 rudi
        sdram_wp(2);
574
        sdram_rmw1(2);
575 14 rudi
        sdram_rmw2(2);
576
 
577 10 rudi
*/
578 4 rudi
 
579
 
580 14 rudi
 
581 4 rudi
        repeat(100)     @(posedge clk);
582
        $finish;
583
   end
584 14 rudi
else
585 4 rudi
   begin
586
 
587
        //
588
        // TEST DEVELOPMENT AREA
589
        //
590 10 rudi
        $display("\n\n");
591
        $display("*****************************************************");
592
        $display("*** Test Development ...                          ***");
593 14 rudi
        $display("*****************************************************\n"                                                             );
594 4 rudi
 
595
 
596 10 rudi
        show_errors;
597
        $display("*****************************************************");
598
        $display("*** Test DONE ...                                 ***");
599
        $display("*****************************************************\n\n");
600
   end
601 4 rudi
 
602 10 rudi
        repeat(100)     @(posedge clk);
603
        $finish;
604 4 rudi
 
605 10 rudi
end     // End of Initial
606 4 rudi
 
607
 
608 10 rudi
/////////////////////////////////////////////////////////////////////
609
//
610
// Clock Generation
611
//
612 4 rudi
 
613 10 rudi
always #2.5     clk = ~clk;
614 4 rudi
 
615 10 rudi
always @(posedge clk)
616
        mc_clk <= ~mc_clk;
617 4 rudi
 
618 10 rudi
/////////////////////////////////////////////////////////////////////
619
//
620
// IO Monitors
621
//
622 4 rudi
 
623 10 rudi
`define STD     10
624
always @(posedge clk)
625
        if((wb_ack_o === 1'bx) & ($time > `STD) )
626
           begin
627
                $display("ERROR: Wishbone ACK unknown (%t)", $time);
628
                error_cnt = error_cnt + 1;
629
           end
630 4 rudi
 
631 10 rudi
always @(posedge clk)
632
        if( (wb_err_o === 1'bx) & ($time > `STD) )
633 4 rudi
 
634 10 rudi
           begin
635
                $display("ERROR: Wishbone ERR unknown (%t)", $time);
636
                error_cnt = error_cnt + 1;
637
           end
638 4 rudi
 
639 10 rudi
always @(posedge clk)
640
        if( (mc_ras_ === 1'bx) & ($time > `STD) )
641 4 rudi
 
642 10 rudi
           begin
643
                $display("ERROR: MC RAS unknown (%t)", $time);
644
                error_cnt = error_cnt + 1;
645
           end
646 4 rudi
 
647 10 rudi
always @(posedge clk)
648
        if( (mc_cas_ === 1'bx) & ($time > `STD) )
649 4 rudi
 
650
           begin
651 10 rudi
                $display("ERROR: MC CAS unknown (%t)", $time);
652
                error_cnt = error_cnt + 1;
653
           end
654 4 rudi
 
655 10 rudi
always @(posedge clk)
656
        if( (mc_we_ === 1'bx) & ($time > `STD) )
657 4 rudi
 
658 10 rudi
           begin
659
                $display("ERROR: MC WE unknown (%t)", $time);
660
                error_cnt = error_cnt + 1;
661
           end
662 4 rudi
 
663 10 rudi
always @(posedge clk)
664
        if( ((|mc_cs_) === 1'bx) & ($time > `STD) )
665 4 rudi
 
666 10 rudi
           begin
667
                $display("ERROR: MC CS unknown (%t)", $time);
668
                error_cnt = error_cnt + 1;
669 4 rudi
           end
670
 
671 10 rudi
always @(error_cnt)
672
        if(error_cnt > 25)      #500 $finish;
673 4 rudi
 
674
/////////////////////////////////////////////////////////////////////
675
//
676
// IO Buffers
677
//
678
 
679
wire    [31:0]   mc_dq;
680
wire    [3:0]    mc_dqp;
681
wire    [23:0]   _mc_addr;
682
wire    [3:0]    _mc_dqm;
683
wire            _mc_oe_;
684
wire            _mc_we_;
685
wire            _mc_cas_;
686
wire            _mc_ras_;
687
wire            _mc_cke_;
688
wire    [7:0]    _mc_cs_;
689
wire            _mc_rp_;
690
wire            _mc_vpen;
691
wire            _mc_adsc_;
692
wire            _mc_adv_;
693
wire            _mc_zz;
694
reg     [31:0]   rst_dq_val;
695
 
696
always @(poc_mode)
697
        case(poc_mode)
698
           0: rst_dq_val = {28'hzzz_zzzz, 2'b10, 2'b00};
699
           1: rst_dq_val = {28'hzzz_zzzz, 2'b10, 2'b01};
700
           2: rst_dq_val = {28'hzzz_zzzz, 2'b10, 2'b10};
701
         //  3: rst_dq_val = {28'hzzzz_zzzz, 2'b10, 2'b11};
702
           default: rst_dq_val = 32'hzzzz_zzzz;
703
        endcase
704
 
705 14 rudi
/*
706
assign #1 mc_dq = mc_data_oe ? mc_data_o : (rst ? rst_dq_val : 32'hzzzz_zzzz);
707 10 rudi
assign #1 mc_data_i = mc_dq;
708 4 rudi
 
709 10 rudi
assign #1 mc_dqp = mc_data_oe ? mc_dp_o : 4'hz;
710
assign #1 mc_dp_i = mc_dqp;
711 4 rudi
 
712 10 rudi
assign #1 mc_addr = mc_c_oe ? _mc_addr : 24'bz;
713
assign #1 mc_dqm = mc_c_oe ? _mc_dqm : 4'bz;
714
assign #1 mc_oe_ = mc_c_oe ? _mc_oe_ : 1'bz;
715
assign #1 mc_we_ = mc_c_oe ? _mc_we_ : 1'bz;
716
assign #1 mc_cas_ = mc_c_oe ? _mc_cas_ : 1'bz;
717
assign #1 mc_ras_ = mc_c_oe ? _mc_ras_ : 1'bz;
718
assign #1 mc_cke_ = mc_c_oe ? _mc_cke_ : 1'bz;
719
assign #1 mc_cs_ = mc_c_oe ? _mc_cs_ : 8'bz;
720
assign #1 mc_rp_ = mc_c_oe ? _mc_rp_ : 1'bz;
721
assign #1 mc_vpen = mc_c_oe ? _mc_vpen : 1'bz;
722
assign #1 mc_adsc_ = mc_c_oe ? _mc_adsc_ : 1'bz;
723
assign #1 mc_adv_ = mc_c_oe ? _mc_adv_ : 1'bz;
724
assign #1 mc_zz = mc_c_oe ? _mc_zz : 1'bz;
725 14 rudi
*/
726 4 rudi
 
727 14 rudi
 
728
assign  mc_dq = mc_data_oe ? mc_data_o : (rst ? rst_dq_val : 32'hzzzz_zzzz);
729
assign  mc_data_i = mc_dq;
730
 
731
assign  mc_dqp = mc_data_oe ? mc_dp_o : 4'hz;
732
assign  mc_dp_i = mc_dqp;
733
 
734
assign  mc_addr = mc_c_oe ? _mc_addr : 24'bz;
735
assign  mc_dqm = mc_c_oe ? _mc_dqm : 4'bz;
736
assign  mc_oe_ = mc_c_oe ? _mc_oe_ : 1'bz;
737
assign  mc_we_ = mc_c_oe ? _mc_we_ : 1'bz;
738
assign  mc_cas_ = mc_c_oe ? _mc_cas_ : 1'bz;
739
assign  mc_ras_ = mc_c_oe ? _mc_ras_ : 1'bz;
740
assign  #1.5 mc_cke_ = mc_c_oe ? _mc_cke_ : 1'bz;
741
assign  mc_cs_ = mc_c_oe ? _mc_cs_ : 8'bz;
742
assign  mc_rp_ = mc_c_oe ? _mc_rp_ : 1'bz;
743
assign  mc_vpen = mc_c_oe ? _mc_vpen : 1'bz;
744
assign  mc_adsc_ = mc_c_oe ? _mc_adsc_ : 1'bz;
745
assign  mc_adv_ = mc_c_oe ? _mc_adv_ : 1'bz;
746
assign  mc_zz = mc_c_oe ? _mc_zz : 1'bz;
747
 
748
 
749
 
750
 
751 4 rudi
pullup p0(mc_cas_);
752
pullup p1(mc_ras_);
753
pullup p2(mc_oe_);
754
pullup p3(mc_we_);
755
pullup p4(mc_cke_);
756
pullup p5(mc_adsc_);
757
pullup p6(mc_adv_);
758
pullup p70(mc_cs_[0]);
759
pullup p71(mc_cs_[1]);
760
pullup p72(mc_cs_[2]);
761
pullup p73(mc_cs_[3]);
762
pullup p74(mc_cs_[4]);
763
pullup p75(mc_cs_[5]);
764
pullup p76(mc_cs_[6]);
765
pullup p77(mc_cs_[7]);
766
pullup p8(mc_rp_);
767
 
768
 
769
/////////////////////////////////////////////////////////////////////
770
//
771
// WISHBONE Memory Controller IP Core
772
//
773
mc_top  u0(
774 8 rudi
                .clk_i(         clk             ),
775
                .rst_i(         rst             ),
776 4 rudi
                .wb_data_i(     wb_data_i       ),
777
                .wb_data_o(     wb_data_o       ),
778
                .wb_addr_i(     wb_addr_i       ),
779
                .wb_sel_i(      wb_sel_i        ),
780
                .wb_we_i(       wb_we_i         ),
781
                .wb_cyc_i(      wb_cyc_i        ),
782
                .wb_stb_i(      wb_stb_i        ),
783
                .wb_ack_o(      wb_ack_o        ),
784
                .wb_err_o(      wb_err_o        ),
785 8 rudi
                .susp_req_i(    susp_req        ),
786
                .resume_req_i(  resume_req      ),
787
                .suspended_o(   suspended       ),
788
                .poc_o(         poc             ),
789
                .mc_clk_i(      mc_clk          ),
790
                .mc_br_pad_i(   mc_br           ),
791
                .mc_bg_pad_o(   mc_bg           ),
792
                .mc_ack_pad_i(  mc_ack          ),
793
                .mc_addr_pad_o( _mc_addr        ),
794
                .mc_data_pad_i( mc_data_i       ),
795
                .mc_data_pad_o( mc_data_o       ),
796
                .mc_dp_pad_i(   mc_dp_i         ),
797
                .mc_dp_pad_o(   mc_dp_o         ),
798
                .mc_doe_pad_doe_o(mc_data_oe    ),
799
                .mc_dqm_pad_o(  _mc_dqm         ),
800
                .mc_oe_pad_o_(  _mc_oe_         ),
801
                .mc_we_pad_o_(  _mc_we_         ),
802
                .mc_cas_pad_o_( _mc_cas_        ),
803
                .mc_ras_pad_o_( _mc_ras_        ),
804
                .mc_cke_pad_o_( _mc_cke_        ),
805
                .mc_cs_pad_o_(  _mc_cs_         ),
806
                .mc_sts_pad_i(  mc_sts          ),
807
                .mc_rp_pad_o_(  _mc_rp_         ),
808
                .mc_vpen_pad_o( _mc_vpen        ),
809
                .mc_adsc_pad_o_(_mc_adsc_       ),
810
                .mc_adv_pad_o_( _mc_adv_        ),
811
                .mc_zz_pad_o(   _mc_zz          ),
812
                .mc_coe_pad_coe_o(mc_c_oe       )
813 4 rudi
                );
814
 
815
/////////////////////////////////////////////////////////////////////
816
//
817
// WISHBONE Master Model
818
//
819
 
820
wb_mast m0(     .clk(           clk             ),
821 14 rudi
                .rst(           ~rst            ),
822 4 rudi
                .adr(           wb_addr_i       ),
823
                .din(           wb_data_o       ),
824
                .dout(          wb_data_i       ),
825
                .cyc(           wb_cyc_i        ),
826
                .stb(           wb_stb_i        ),
827
                .sel(           wb_sel_i        ),
828
                .we(            wb_we_i         ),
829
                .ack(           wb_ack_o        ),
830
                .err(           wb_err_o        ),
831
                .rty(           wb_rty_o        )
832
                );
833
 
834
/////////////////////////////////////////////////////////////////////
835
//
836
// Sync. CS Device Model
837
//
838
 
839
sync_cs_dev s0(
840
                .clk(           mc_clk          ),
841
                .addr(          mc_addr[15:0]    ),
842
                .dq(            mc_dq           ),
843
                .cs_(           mc_cs_[5]       ),
844
                .we_(           mc_we_          ),
845
                .oe_(           mc_oe_          ),
846
                .ack_(          mc_ack          )
847
                );
848
 
849
 
850
/////////////////////////////////////////////////////////////////////
851
//
852
// Memory Models
853
//
854
 
855
`ifdef SDRAM0
856
//      Model:  MT48LC2M32B2 (2Meg x 32 x 4 Banks)
857
mt48lc2m32b2 sdram0(
858
                .Dq(            mc_dq           ),
859
                .Addr(          mc_addr[10:0]    ),
860
                .Ba(            mc_addr[14:13]  ),
861
                .Clk(           mc_clk          ),
862
                .Cke(           mc_cke_         ),
863
                .Cs_n(          mc_cs_[0]        ),
864
                .Ras_n(         mc_ras_         ),
865
                .Cas_n(         mc_cas_         ),
866
                .We_n(          mc_we_          ),
867
                .Dqm(           mc_dqm          )
868
                );
869
 
870
wire    [27:0]   dq_tmp;
871
mt48lc2m32b2 sdram0p(
872
                .Dq(            {dq_tmp, mc_dqp}),
873
                .Addr(          mc_addr[10:0]    ),
874
                .Ba(            mc_addr[14:13]  ),
875
                .Clk(           mc_clk          ),
876
                .Cke(           mc_cke_         ),
877
                .Cs_n(          mc_cs_[0]        ),
878
                .Ras_n(         mc_ras_         ),
879
                .Cas_n(         mc_cas_         ),
880
                .We_n(          mc_we_          ),
881
                .Dqm(           mc_dqm          )
882
                );
883
 
884
task fill_mem;
885
input   size;
886
 
887
integer         size, n;
888
reg     [31:0]   data;
889
 
890
begin
891
sdram0.mem_fill(size);
892
 
893
for(n=0;n<size;n=n+1)
894
   begin
895
        data = sdram0.Bank0[n];
896
        sdram0p.Bank0[n] = {28'h0, ^data[31:24], ^data[23:16], ^data[15:8], ^data[7:0] };
897
        data = sdram0.Bank1[n];
898
        sdram0p.Bank1[n] = {28'h0, ^data[31:24], ^data[23:16], ^data[15:8], ^data[7:0] };
899
        data = sdram0.Bank2[n];
900
        sdram0p.Bank2[n] = {28'h0, ^data[31:24], ^data[23:16], ^data[15:8], ^data[7:0] };
901
        data = sdram0.Bank3[n];
902
        sdram0p.Bank3[n] = {28'h0, ^data[31:24], ^data[23:16], ^data[15:8], ^data[7:0] };
903
   end
904
 
905
 
906
end
907
endtask
908
 
909
 
910
`endif
911
 
912
 
913
`ifdef MULTI_SDRAM
914
//      Model:  MT48LC2M32B2 (2Meg x 32 x 4 Banks)
915
 
916
mt48lc2m32b2 sdram1(
917
                .Dq(            mc_dq           ),
918
                .Addr(          mc_addr[10:0]    ),
919
                .Ba(            mc_addr[14:13]  ),
920
                .Clk(           mc_clk          ),
921
                .Cke(           mc_cke_         ),
922
                .Cs_n(          mc_cs_[1]       ),
923
                .Ras_n(         mc_ras_         ),
924
                .Cas_n(         mc_cas_         ),
925
                .We_n(          mc_we_          ),
926
                .Dqm(           mc_dqm          )
927
                );
928
 
929
//      Model:  MT48LC2M32B2 (2Meg x 32 x 4 Banks)
930
mt48lc2m32b2 sdram2(
931
                .Dq(            mc_dq           ),
932
                .Addr(          mc_addr[10:0]    ),
933
                .Ba(            mc_addr[14:13]  ),
934
                .Clk(           mc_clk          ),
935
                .Cke(           mc_cke_         ),
936
                .Cs_n(          mc_cs_[2]       ),
937
                .Ras_n(         mc_ras_         ),
938
                .Cas_n(         mc_cas_         ),
939
                .We_n(          mc_we_          ),
940
                .Dqm(           mc_dqm          )
941
                );
942
 
943
 
944 14 rudi
mt48lc16m16a2 sdram1a(
945 4 rudi
                .Dq(            mc_dq[15:0]      ),
946 14 rudi
                .Addr(          mc_addr[12:0]    ),
947 4 rudi
                .Ba(            mc_addr[14:13]  ),
948
                .Clk(           mc_clk          ),
949
                .Cke(           mc_cke_         ),
950 14 rudi
                .Cs_n(          mc_cs_[5]       ),
951 4 rudi
                .Ras_n(         mc_ras_         ),
952
                .Cas_n(         mc_cas_         ),
953
                .We_n(          mc_we_          ),
954
                .Dqm(           mc_dqm[1:0]      )
955
                );
956
 
957 14 rudi
mt48lc16m16a2 sdram1b(
958 4 rudi
                .Dq(            mc_dq[31:16]    ),
959 14 rudi
                .Addr(          mc_addr[12:0]    ),
960 4 rudi
                .Ba(            mc_addr[14:13]  ),
961
                .Clk(           mc_clk          ),
962
                .Cke(           mc_cke_         ),
963 14 rudi
                .Cs_n(          mc_cs_[5]       ),
964 4 rudi
                .Ras_n(         mc_ras_         ),
965
                .Cas_n(         mc_cas_         ),
966
                .We_n(          mc_we_          ),
967
                .Dqm(           mc_dqm[3:2]     )
968
                );
969
 
970 14 rudi
/*
971 4 rudi
mt48lc8m8a2 sdram2a(
972
                .Dq(            mc_dq[07:00]    ),
973
                .Addr(          mc_addr[11:0]   ),
974
                .Ba(            mc_addr[14:13]  ),
975
                .Clk(           mc_clk          ),
976
                .Cke(           mc_cke_         ),
977
                .Cs_n(          mc_cs_[2]       ),
978
                .Ras_n(         mc_ras_         ),
979
                .Cas_n(         mc_cas_         ),
980
                .We_n(          mc_we_          ),
981
                .Dqm(           mc_dqm[0]       )
982
                );
983
 
984
mt48lc8m8a2 sdram2b(
985
                .Dq(            mc_dq[15:08]    ),
986
                .Addr(          mc_addr[11:0]   ),
987
                .Ba(            mc_addr[14:13]  ),
988
                .Clk(           mc_clk          ),
989
                .Cke(           mc_cke_         ),
990
                .Cs_n(          mc_cs_[2]       ),
991
                .Ras_n(         mc_ras_         ),
992
                .Cas_n(         mc_cas_         ),
993
                .We_n(          mc_we_          ),
994
                .Dqm(           mc_dqm[1]       )
995
                );
996
 
997
mt48lc8m8a2 sdram2c(
998
                .Dq(            mc_dq[23:16]    ),
999
                .Addr(          mc_addr[11:0]   ),
1000
                .Ba(            mc_addr[14:13]  ),
1001
                .Clk(           mc_clk          ),
1002
                .Cke(           mc_cke_         ),
1003
                .Cs_n(          mc_cs_[2]       ),
1004
                .Ras_n(         mc_ras_         ),
1005
                .Cas_n(         mc_cas_         ),
1006
                .We_n(          mc_we_          ),
1007
                .Dqm(           mc_dqm[2]       )
1008
                );
1009
 
1010
mt48lc8m8a2 sdram2d(
1011
                .Dq(            mc_dq[31:24]    ),
1012
                .Addr(          mc_addr[11:0]   ),
1013
                .Ba(            mc_addr[14:13]  ),
1014
                .Clk(           mc_clk          ),
1015
                .Cke(           mc_cke_         ),
1016
                .Cs_n(          mc_cs_[2]       ),
1017
                .Ras_n(         mc_ras_         ),
1018
                .Cas_n(         mc_cas_         ),
1019
                .We_n(          mc_we_          ),
1020
                .Dqm(           mc_dqm[3]       )
1021
                );
1022
*/
1023
 
1024
`endif
1025
 
1026
`ifdef FLASH
1027
IntelAdvBoot f1(
1028
                .dq(    mc_dq[15:0]      ),
1029
                .addr(  mc_addr[19:0]    ),
1030
                .ceb(   mc_cs_[3]       ),
1031
                .oeb(   mc_oe_          ),
1032
                .web(   mc_we_          ),
1033
                .rpb(   mc_rp_          ),
1034
                .wpb(   1'b0            ),
1035
                .vpp(   3300            ),
1036
                .vcc(   3300            )
1037
                );
1038
`endif
1039
 
1040
 
1041
`ifdef SRAM
1042
 
1043
`ifdef MICRON
1044
mt58l1my18d sram0a(
1045
                .Dq(            {mc_dqp[1],
1046
                                mc_dq[15:8],
1047
                                mc_dqp[0],
1048
                                mc_dq[7:0]}      ),
1049
 
1050
                .Addr(          mc_addr[19:0]    ),
1051
                .Mode(          1'b0            ),
1052
                .Adv_n(         mc_adv_         ),
1053
                .Clk(           mc_clk          ),
1054
                .Adsc_n(        mc_adsc_        ),
1055
                .Adsp_n(        1'b1            ),
1056
 
1057
                .Bwa_n(         mc_dqm[0]        ),
1058
                .Bwb_n(         mc_dqm[1]       ),
1059
                .Bwe_n(         mc_we_          ),
1060
                .Gw_n(          1'b1            ),
1061
 
1062
                .Ce_n(          mc_cs_[4]       ),
1063
                .Ce2(           1'b1            ),
1064
                .Ce2_n(         1'b0            ),
1065
                .Oe_n(          mc_oe_          ),
1066
                .Zz(            mc_zz           )
1067
                );
1068
 
1069
 
1070
mt58l1my18d sram0b(
1071
                .Dq(            {mc_dqp[3],
1072
                                mc_dq[31:24],
1073
                                mc_dqp[2],
1074
                                mc_dq[23:16]}   ),
1075
 
1076
                .Addr(          mc_addr[19:0]    ),
1077
                .Mode(          1'b0            ),
1078
                .Adv_n(         mc_adv_         ),
1079
                .Clk(           mc_clk          ),
1080
                .Adsc_n(        mc_adsc_        ),
1081
                .Adsp_n(        1'b1            ),
1082
 
1083
                .Bwa_n(         mc_dqm[2]       ),
1084
                .Bwb_n(         mc_dqm[3]       ),
1085
                .Bwe_n(         mc_we_          ),
1086
                .Gw_n(          1'b1            ),
1087
 
1088
                .Ce_n(          mc_cs_[4]       ),
1089
                .Ce2(           1'b1            ),
1090
                .Ce2_n(         1'b0            ),
1091
                .Oe_n(          mc_oe_          ),
1092
                .Zz(            mc_zz           )
1093
                );
1094
 
1095
`else
1096
 
1097
idt71t67802s133 sram0a(
1098
                .A(     mc_addr[18:0]    ),
1099
                .D(     mc_dq[15:0]      ),
1100
                .DP(    mc_dqp[1:0]      ),
1101
                .oe_(   mc_oe_          ),
1102
                .ce_(   mc_cs_[4]       ),
1103
                .cs0(   1'b1            ),
1104
                .cs1_(  1'b0            ),
1105
                .lbo_(  1'b0            ),
1106
 
1107
                .gw_(   1'b1            ),
1108
                .bwe_(  mc_we_          ),
1109
                .bw2_(  mc_dqm[1]       ),
1110
                .bw1_(  mc_dqm[0]        ),
1111
 
1112
                .adsp_( 1'b1            ),
1113
                .adsc_( mc_adsc_        ),
1114
                .adv_(  mc_adv_         ),
1115
                .clk(   mc_clk          )
1116
                );
1117
 
1118
idt71t67802s133 sram0b(
1119
                .A(     mc_addr[18:0]    ),
1120
                .D(     mc_dq[31:16]    ),
1121
                .DP(    mc_dqp[3:2]     ),
1122
                .oe_(   mc_oe_          ),
1123
                .ce_(   mc_cs_[4]       ),
1124
                .cs0(   1'b1            ),
1125
                .cs1_(  1'b0            ),
1126
                .lbo_(  1'b0            ),
1127
 
1128
                .gw_(   1'b1            ),
1129
                .bwe_(  mc_we_          ),
1130
                .bw2_(  mc_dqm[3]       ),
1131
                .bw1_(  mc_dqm[2]       ),
1132
 
1133
                .adsp_( 1'b1            ),
1134
                .adsc_( mc_adsc_        ),
1135
                .adv_(  mc_adv_         ),
1136
                .clk(   mc_clk          )
1137
                );
1138
`endif
1139
 
1140
`endif
1141
 
1142
`include "tests.v"
1143
`include "test_lib.v"
1144
 
1145
endmodule
1146
 

powered by: WebSVN 2.1.0

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