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

Subversion Repositories vga_lcd

[/] [vga_lcd/] [tags/] [rel_19/] [bench/] [verilog/] [tests.v] - Blame information for rev 38

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

Line No. Rev Author Line
1 16 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Tests Library                                              ////
4
////                                                             ////
5
////                                                             ////
6 29 rherveille
////  Authors: Rudolf Usselmann, Richard Herveille               ////
7
////           rudi@asics.ws,    richard@asics.ws                ////
8 16 rudi
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/vga_lcd/   ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2001 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 38 rherveille
//  $Id: tests.v,v 1.5 2002-04-20 09:57:55 rherveille Exp $
41 16 rudi
//
42 38 rherveille
//  $Date: 2002-04-20 09:57:55 $
43
//  $Revision: 1.5 $
44 24 rherveille
//  $Author: rherveille $
45 16 rudi
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50
//
51
//
52
//
53
//                        
54
 
55
 
56
task show_errors;
57
 
58
begin
59
 
60
$display("\n");
61
$display("     +--------------------+");
62
$display("     |  Total ERRORS: %0d   |", error_cnt);
63
$display("     +--------------------+");
64
 
65
end
66
endtask
67
 
68
 
69
task reg_test;
70
 
71
reg     [31:0]   data;
72
reg     [31:0]   pattern;
73
integer         n;
74
 
75
begin
76
$display("\n\n");
77
$display("*****************************************************");
78
$display("*** Register Test                                 ***");
79
$display("*****************************************************\n");
80
 
81
        // Check reset Values
82
        $display("Testing Reset Values ...");
83
        check( `CTRL,  0, 32'h0000_ffff, "CTRL ");
84
        check( `STAT,  0, 32'h0000_0073, "STAT ");
85
        check( `HTIM,  0, 32'hffff_ffff, "HTIM ");
86
        check( `VTIM,  0, 32'hffff_ffff, "VTIM ");
87
        check( `HVLEN, 0, 32'hffff_ffff, "HVLEN");
88
        check( `VBARA, 0, 32'hffff_ffff, "VBARA");
89
        check( `VBARB, 0, 32'hffff_ffff, "VBARB");
90
 
91
        $display("Testing Pattern R/W ...");
92
for(n=0;n<6;n=n+1)
93 24 rherveille
        begin
94
                case(n)
95
                  0: pattern = 32'h0000_0000;
96
                  1: pattern = 32'hffff_ffff;
97
                  2: pattern = 32'haaaa_aaaa;
98
                  3: pattern = 32'h5555_5555;
99
                  4: pattern = 32'hcccc_cccc;
100
                  5: pattern = 32'h3333_3333;
101
                endcase
102 16 rudi
 
103 24 rherveille
                m0.wb_wr1( `CTRL, 4'hf, pattern );
104
                check( `CTRL,  pattern, 32'h0000_ffff, "CTRL ");
105 16 rudi
 
106 24 rherveille
                m0.wb_wr1( `HTIM, 4'hf, pattern );
107
                check( `HTIM,  pattern, 32'hffff_ffff, "HTIM ");
108 16 rudi
 
109 24 rherveille
                m0.wb_wr1( `VTIM, 4'hf, pattern );
110
                check( `VTIM,  pattern, 32'hffff_ffff, "VTIM ");
111 16 rudi
 
112 24 rherveille
                m0.wb_wr1( `HVLEN, 4'hf, pattern );
113
                check( `HVLEN, pattern, 32'hffff_ffff, "HVLEN");
114 16 rudi
 
115 24 rherveille
                m0.wb_wr1( `VBARA, 4'hf, pattern );
116
                check( `VBARA, pattern, 32'hffff_fffc, "VBARA");
117 16 rudi
 
118 24 rherveille
                m0.wb_wr1( `VBARB, 4'hf, pattern );
119
                check( `VBARB, pattern, 32'hffff_fffc, "VBARB");
120 16 rudi
 
121 24 rherveille
        end
122 16 rudi
 
123
repeat(10)      @(posedge clk);
124
 
125
show_errors;
126
$display("*****************************************************");
127
$display("*** Test DONE ...                                 ***");
128
$display("*****************************************************\n\n");
129
 
130
end
131
endtask
132
 
133
 
134
 
135
task check;
136
input   [31:0]   addr;
137
input   [31:0]   edata;
138
input   [31:0]   mask;
139
input   [39:0]   name;
140
 
141
reg     [31:0]   data;
142
begin
143
 
144
m0.wb_rd1( addr, 4'hf, data );
145
if(( (data & mask) != (edata & mask)) | ((^data) === 1'bx) )
146
   begin
147
        $display("ERROR: %s Reg: Value Mismatch. Expected %h, Got %h (%0t)",
148
                name, edata & mask, data, $time);
149
        error_cnt = error_cnt + 1;
150
   end
151
 
152
end
153
endtask
154
 
155
 
156
 
157
 
158
task tim_test;
159
 
160
integer         mode;
161
 
162
begin
163
$display("\n\n");
164
$display("*****************************************************");
165
$display("*** Timing Test                                   ***");
166
$display("*****************************************************\n");
167
 
168
        s0.fill_mem(0);
169
 
170
        repeat(10)      @(posedge clk);
171
 
172
        m0.wb_wr1( `VBARA, 4'hf, 0 );
173
        m0.wb_wr1( `VBARB, 4'hf, 0 );
174
        m0.wb_wr1( `CTRL,  4'hf, 32'h0000_0000);
175
        repeat(10)      @(posedge clk);
176
mode = 4;
177
 
178
for(mode=0;mode<6;mode=mode+1)
179
   begin
180
        scen = 0;
181
        $display("Mode: %0d", mode);
182
 
183
        case(mode)
184 38 rherveille
                0:
185
                begin
186
                        thsync = 0;
187
                        thgdel = 0;
188
                        thgate = 340;
189
                        thlen = 345;
190 16 rudi
 
191 38 rherveille
                        tvsync = 0;
192
                        tvgdel = 0;
193
                        tvgate = 240;
194
                        tvlen = 245;
195 16 rudi
 
196 38 rherveille
                        hpol = 0;
197
                        vpol = 0;
198
                        cpol = 0;
199
                        bpol = 0;
200
                end
201 16 rudi
 
202 38 rherveille
                1:
203
                begin
204
                        thsync = 18;
205
                        thgdel = 18;
206
                        thgate = 340;
207
                        thlen = 390;
208 16 rudi
 
209 38 rherveille
                        tvsync = 18;
210
                        tvgdel = 18;
211
                        tvgate = 240;
212
                        tvlen = 290;
213 16 rudi
 
214 38 rherveille
                        hpol = 1;
215
                        vpol = 0;
216
                        cpol = 0;
217
                        bpol = 0;
218
                end
219 16 rudi
 
220 38 rherveille
                2:
221
                begin
222
                        thsync = 1;
223
                        thgdel = 1;
224
                        thgate = 640;
225
                        thlen = 643;
226 16 rudi
 
227 38 rherveille
                        tvsync = 1;
228
                        tvgdel = 1;
229
                        tvgate = 480;
230
                        tvlen = 483;
231 16 rudi
 
232 38 rherveille
                        hpol = 0;
233
                        vpol = 1;
234
                        cpol = 0;
235
                        bpol = 0;
236
                end
237 16 rudi
 
238 38 rherveille
                3:
239
                begin
240
                        thsync = 0;
241
                        thgdel = 2;
242
                        thgate = 800;
243
                        thlen = 804;
244 16 rudi
 
245 38 rherveille
                        tvsync = 0;
246
                        tvgdel = 2;
247
                        tvgate = 600;
248
                        tvlen = 604;
249 16 rudi
 
250 38 rherveille
                        hpol = 0;
251
                        vpol = 0;
252
                        cpol = 1;
253
                        bpol = 0;
254
                end
255 16 rudi
 
256 38 rherveille
                4:
257
                begin
258
                        thsync = 3;
259
                        thgdel = 2;
260
                        thgate = 800;
261
                        thlen = 806;
262 16 rudi
 
263 38 rherveille
                        tvsync = 2;
264
                        tvgdel = 2;
265
                        tvgate = 600;
266
                        tvlen = 606;
267 16 rudi
 
268 38 rherveille
                        hpol = 0;
269
                        vpol = 0;
270
                        cpol = 0;
271
                        bpol = 1;
272
                end
273 16 rudi
 
274 38 rherveille
                5:
275
                begin
276
                        thsync = 6;
277
                        thgdel = 2;
278
                        thgate = 800;
279
                        thlen = 810;
280 16 rudi
 
281 38 rherveille
                        tvsync = 4;
282
                        tvgdel = 2;
283
                        tvgate = 600;
284
                        tvlen = 607;
285 16 rudi
 
286 38 rherveille
                        hpol = 1;
287
                        vpol = 1;
288
                        cpol = 1;
289
                        bpol = 1;
290
                end
291 16 rudi
        endcase
292
 
293
/*
294
        thsync = 0;
295
        thgdel = 0;
296
        thgate = 64;
297
        thlen = 70;
298
 
299
        tvsync = 0;
300
        tvgdel = 0;
301
        tvgate = 64;
302
        tvlen = 70;
303
 
304
        hpol = 0;
305
        vpol = 0;
306
        cpol = 0;
307
        bpol = 0;
308
*/
309
 
310
 
311
        m0.wb_wr1( `HTIM,  4'hf, {thsync, thgdel, thgate} );
312
        m0.wb_wr1( `VTIM,  4'hf, {tvsync, tvgdel, tvgate} );
313
        m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
314
        m0.wb_wr1( `CTRL,  4'hf, {
315
                                16'h0,
316
                                bpol, cpol,
317
                                vpol, hpol,
318
                                1'b0,   // PC
319
                                2'h0,   // CD
320
                                2'h0,   // VBL
321
                                2'h0,   // Reserved
322
                                5'h01   // Bank Switch, INT, VideoEn
323
                                });
324
 
325
        repeat(2) @(posedge vsync);
326
        scen = 1;
327
        repeat(4) @(posedge vsync);
328
   end
329
 
330
scen = 0;
331
repeat(10)      @(posedge clk);
332
 
333
show_errors;
334
$display("*****************************************************");
335
$display("*** Test DONE ...                                 ***");
336
$display("*****************************************************\n\n");
337
 
338
end
339
endtask
340
 
341
 
342
 
343
 
344
task pd1_test;
345
 
346
integer         mode;
347
integer         n, p, l;
348
reg     [31:0]   pn;
349
reg     [31:0]   pra, paa, tmp;
350
reg     [23:0]   pd;
351
reg     [1:0]    cd;
352
reg             pc;
353
reg     [31:0]   data;
354 24 rherveille
reg [31:0] cbar;
355 16 rudi
reg     [7:0]    vbl;
356
 
357
begin
358
 
359
$display("\n\n");
360
$display("*****************************************************");
361
$display("*** Pixel Data Test 1                             ***");
362
$display("*****************************************************\n");
363
 
364
        m0.wb_wr1( `VBARA, 4'hf, 0 );
365
        m0.wb_wr1( `VBARB, 4'hf, 123456 );
366
 
367 24 rherveille
        cbar = 32'h0000_0800;
368 16 rudi
 
369
        thsync = 0;
370
        thgdel = 0;
371 24 rherveille
        thgate = 320;
372 16 rudi
        thlen = 345;
373
 
374
        tvsync = 0;
375
        tvgdel = 0;
376
        tvgate = 240;
377
        tvlen = 245;
378
 
379
        thsync = 39;
380
        thgdel = 124;
381
        thgate = 646;
382
        thlen = 832;
383
 
384
        tvsync = 2;
385
        tvgdel = 25;
386
        tvgate = 484;
387
        tvlen = 520;
388
 
389
        thsync = 6;
390
        thgdel = 20;
391
        thgate = 319;
392
        thlen = 390;
393
 
394
        tvsync = 1;
395
        tvgdel = 8;
396
        tvgate = 239;
397
        tvlen = 280;
398
 
399
/*
400
        thsync = 0;
401
        thgdel = 0;
402
        thgate = 63;
403
        thlen = 70;
404
 
405
        tvsync = 0;
406
        tvgdel = 0;
407
        tvgate = 32;
408
        tvlen = 36;
409
 
410
        thsync = 119;
411
        thgdel = 61;
412
        thgate = 805;
413
        thlen  = 1038;
414
 
415
        tvsync = 5;
416
        tvgdel = 20;
417
        tvgate = 600;
418
        tvlen  = 665;
419
 
420
*/
421
 
422
        hpol = 0;
423
        vpol = 0;
424
        cpol = 0;
425
        bpol = 0;
426
 
427
        m0.wb_wr1( `HTIM,  4'hf, {thsync, thgdel, thgate} );
428
        m0.wb_wr1( `VTIM,  4'hf, {tvsync, tvgdel, tvgate} );
429
        m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
430
 
431 24 rherveille
mode = 2;
432
vbl = 0;
433 16 rudi
 
434
for(vbl=0;vbl<4;vbl=vbl+1)
435
for(mode=0;mode<4;mode=mode+1)
436
   begin
437
 
438
        // -------------------------------
439
        // Turn Off VGA before Mode Change
440
 
441
        m0.wb_wr1( `CTRL,  4'hf, {
442
                                16'h0,  // Reserved
443
                                bpol, cpol,
444
                                vpol, hpol,
445
                                pc,     // 1'b0,        // PC
446
                                cd,     // 2'h2,        // CD
447
                                2'h0,   // VBL
448
                                1'b0,   // CBSWE
449
                                1'b0,   // VBSWE
450 24 rherveille
                                1'b0, // CBSIE
451
                                1'b0,   // VBSIE
452 16 rudi
                                1'b0,   // HIE
453
                                1'b0,   // VIE
454
                                1'b0    // Video Enable
455
                                });
456
 
457
        s0.fill_mem(1);
458
 
459
`ifdef USE_VC
460
// Fill internal Color Lookup Table
461
repeat(10)      @(posedge clk);
462
for(n=0;n<512;n=n+1)
463
   begin
464
        //m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
465
        data = s0.mem[ cbar[31:2] + n];
466 24 rherveille
        m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
467 16 rudi
   end
468
repeat(10)      @(posedge clk);
469
`endif
470
 
471
        case(mode)
472
           0:
473
             begin
474
                cd = 2'h2;
475
                pc = 1'b0;
476
             end
477
           1:
478
             begin
479
                cd = 2'h0;
480
                pc = 1'b0;
481
             end
482
           2:
483
             begin
484
                cd = 2'h0;
485
                pc = 1'b1;
486
             end
487
           3:
488
             begin
489
                cd = 2'h1;
490
                pc = 1'b0;
491
             end
492
        endcase
493
 
494
        //repeat(50) @(posedge clk);
495
 
496
        // -------------------------------
497
        // Turn VGA back On ...
498
        m0.wb_wr1( `CTRL,  4'hf, {
499
                                16'h0,  // Reserved
500
                                bpol, cpol,
501
                                vpol, hpol,
502
                                pc,     // 1'b0,        // PC
503
                                cd,     // 2'h2,        // CD
504
                                vbl[1:0],        // VBL
505
                                1'b0,   // Reserved
506
                                1'b0,   // CBSWE
507
                                1'b0,   // VBSWE
508
                                1'b0,   // BSIE
509
                                1'b0,   // HIE
510
                                1'b0,   // VIE
511
                                1'b1    // Video Enable
512
                                });
513
 
514
        $display("VBL: %0d, Mode: %0d", vbl, mode);
515
        repeat(2) @(posedge vsync);
516
 
517
        // For Each Line
518 38 rherveille
        for(l=0;l<tvgate;l=l+1)
519 16 rudi
        // For each Pixel
520
        for(p=0;p<thgate+1;p=p+1)
521
           begin
522
                while(blanc)    @(posedge pclk);  // wait for viewable data
523
 
524
                //$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
525
 
526
                // Depending on Mode, determine pixel data
527
                // pixel number = line * (thgate + 1) + p
528
                pn = l * (thgate + 1) + p;
529
 
530
                case(mode)
531
                   0:    // 24 bit/pixel mode
532
                   begin
533
                        pra = pn[31:2] * 3;     // Pixel relative Address
534
                        paa = pra + 0;           // Pixel Absolute Address
535
 
536
                        // Pixel Data
537
                        case(pn[1:0])
538
                           0:
539
                             begin
540
                                tmp = s0.mem[paa];
541
                                pd = tmp[31:8];
542
                             end
543
                           1:
544
                             begin
545
                                tmp = s0.mem[paa];
546
                                pd[23:16] = tmp[7:0];
547
                                tmp = s0.mem[paa+1];
548
                                pd[15:0] = tmp[31:16];
549
                             end
550
                           2:
551
                             begin
552
                                tmp = s0.mem[paa+1];
553
                                pd[23:8] = tmp[15:0];
554
                                tmp = s0.mem[paa+2];
555
                                pd[7:0] = tmp[31:24];
556
                             end
557
                           3:
558
                             begin
559
                                tmp = s0.mem[paa+2];
560
                                pd = tmp[23:0];
561
                             end
562
                        endcase
563
                   end
564
 
565
                   1:   // 8 bit/pixel grayscale mode
566
                   begin
567
                        pra = pn[31:2];         // Pixel relative Address
568
                        paa = pra + 0;           // Pixel Absolute Address
569
                        case(pn[1:0])
570
                           0:
571
                             begin
572
                                tmp = s0.mem[paa];
573
                                pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
574
                             end
575
                           1:
576
                             begin
577
                                tmp = s0.mem[paa];
578
                                pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
579
                             end
580
                           2:
581
                             begin
582
                                tmp = s0.mem[paa];
583
                                pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
584
                             end
585
                           3:
586
                             begin
587
                                tmp = s0.mem[paa];
588
                                pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
589
                             end
590
                        endcase
591
                   end
592
 
593
                   2:   // 8 bit/pixel Pseudo Color mode
594
                   begin
595
                        pra = pn[31:2];         // Pixel relative Address
596
                        paa = pra + 0;           // Pixel Absolute Address
597
                        case(pn[1:0])
598
                           0:
599
                             begin
600
                                tmp = s0.mem[paa];
601
                                tmp = s0.mem[cbar[31:2] + tmp[31:24]];
602
                                pd = tmp[23:0];
603
                             end
604
                           1:
605
                             begin
606
                                tmp = s0.mem[paa];
607
                                tmp = s0.mem[cbar[31:2] + tmp[23:16]];
608
                                pd = tmp[23:0];
609
                             end
610
                           2:
611
                             begin
612
                                tmp = s0.mem[paa];
613
                                tmp = s0.mem[cbar[31:2] + tmp[15:8]];
614
                                pd = tmp[23:0];
615
                             end
616
                           3:
617
                             begin
618
                                tmp = s0.mem[paa];
619
                                tmp = s0.mem[cbar[31:2] + tmp[7:0]];
620
                                pd = tmp[23:0];
621
                             end
622
                        endcase
623
                   end
624
 
625
                   3:   // 16 bit/pixel mode
626
                   begin
627
                        pra = pn[31:1];         // Pixel relative Address
628
                        paa = pra + 0;           // Pixel Absolute Address
629
                        case(pn[0])
630
                           0:
631
                             begin
632
                                tmp = s0.mem[paa];
633
                                tmp[15:0] = tmp[31:16];
634
                                pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
635
                             end
636
                           1:
637
                             begin
638
                                tmp = s0.mem[paa];
639
                                pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
640
                             end
641
                        endcase
642
                   end
643
 
644
                endcase
645
 
646
                if(pd !== {red, green, blue} )
647
                   begin
648
                        $display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",
649
                                pd, red, green, blue);
650
                        $display("       pixel=%0d, line=%0d, (%0t)",p,l,$time);
651
                        error_cnt = error_cnt + 1;
652
                   end
653
 
654
                @(posedge pclk);
655
 
656
           end
657
   end
658
 
659
show_errors;
660
$display("*****************************************************");
661
$display("*** Test DONE ...                                 ***");
662
$display("*****************************************************\n\n");
663
 
664
end
665
endtask
666
 
667
 
668
 
669
task pd2_test;
670
 
671
integer         mode;
672
integer         p, l;
673
reg     [31:0]   pn;
674
reg     [31:0]   pra, paa, tmp;
675
reg     [23:0]   pd;
676
reg     [1:0]    cd;
677
reg             pc;
678
reg     [31:0]   cbar;
679
reg     [31:0]   vbase;
680
reg     [31:0]   cbase;
681
reg     [31:0]   vbara;
682
reg     [31:0]   vbarb;
683
reg     [7:0]    bank, vbl;
684
 
685
begin
686
 
687
$display("\n\n");
688
$display("*****************************************************");
689
$display("*** Pixel Data Test 2                             ***");
690
$display("*****************************************************\n");
691
 
692 24 rherveille
        s0.fill_mem(1);
693 16 rudi
 
694
        repeat(10)      @(posedge clk);
695
 
696
        vbara = 32'h0000_0000;
697
        vbarb = 32'h0040_0000;
698 24 rherveille
        cbar  = 32'h0000_0800;
699 16 rudi
 
700
        m0.wb_wr1( `VBARA, 4'hf, vbara );
701
        m0.wb_wr1( `VBARB, 4'hf, vbarb );
702
 
703
        thsync = 6;
704
        thgdel = 20;
705
        thgate = 319;
706
        thlen = 390;
707
 
708
        tvsync = 1;
709
        tvgdel = 8;
710 38 rherveille
//      tvgate = 239;
711
        tvgate = 240;
712 16 rudi
        tvlen = 280;
713
 
714
/*
715
        thsync = 0;
716
        thgdel = 0;
717
        thgate = 63;
718
        thlen = 70;
719
 
720
        tvsync = 0;
721
        tvgdel = 0;
722
        tvgate = 32;
723
        tvlen = 36;
724
 
725
*/
726
 
727
/*
728
        thsync = 39;
729
        thgdel = 124;
730
        thgate = 645;
731
        thlen = 832;
732
 
733
        tvsync = 2;
734
        tvgdel = 25;
735
        tvgate = 483;
736
        tvlen = 520;
737
*/
738
 
739
        hpol = 0;
740
        vpol = 0;
741
        cpol = 0;
742
        bpol = 0;
743
 
744
        m0.wb_wr1( `HTIM,  4'hf, {thsync, thgdel, thgate} );
745
        m0.wb_wr1( `VTIM,  4'hf, {tvsync, tvgdel, tvgate} );
746
        m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
747
 
748 24 rherveille
 
749 16 rudi
`ifdef USE_VC
750
// Fill internal Color Lookup Table
751
repeat(10)      @(posedge clk);
752
for(n=0;n<512;n=n+1)
753
   begin
754
        //m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
755
        data = s0.mem[ cbar[31:2] + n];
756 24 rherveille
        m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
757 16 rudi
   end
758
repeat(10)      @(posedge clk);
759
`endif
760
 
761
 
762 29 rherveille
vbl = 0;
763 38 rherveille
mode = 1;
764 16 rudi
 
765 26 rherveille
for(vbl=0;vbl<4;vbl=vbl+1)
766 29 rherveille
for(mode=0;mode<=4;mode=mode+1)
767 16 rudi
   begin
768
 
769
        m0.wb_wr1( `CTRL,  4'hf, 32'h0);
770
        repeat(100) @(posedge clk);
771
 
772 26 rherveille
                case(mode)
773
                0:
774
                begin
775
                        cd = 2'h2;
776
                        pc = 1'b0;
777
                end
778
 
779
                1:
780
                begin
781
                        cd = 2'h0;
782
                        pc = 1'b0;
783
                end
784
 
785
                2:
786
                begin
787
                        cd = 2'h0;
788
                        pc = 1'b1;
789
                end
790
 
791
                3:
792
                begin
793
                        cd = 2'h1;
794
                        pc = 1'b0;
795
                end
796
 
797
                4:
798
                begin
799
                        cd = 2'h3;
800
                        pc = 1'b0;
801
                end
802 16 rudi
        endcase
803
 
804
        m0.wb_wr1( `CTRL,  4'hf, {
805
                                16'h0,  // Reserved
806
                                bpol, cpol,
807
                                vpol, hpol,
808
                                pc,     // 1'b0,        // PC
809
                                cd,     // 2'h2,        // CD
810
                                vbl[1:0],// VBL
811
                                1'b1,   // CBSWE
812
                                1'b1,   // VBSWE
813 24 rherveille
                                1'b0, // CBSIE
814
                                1'b0,   // VBSIE
815 16 rudi
                                1'b0,   // HIE
816
                                1'b0,   // VIE
817
                                1'b1    // Video Enable
818 26 rherveille
                                }
819
        );
820 16 rudi
 
821
bank = 0;
822
 
823
//for(bank=0;bank<3;bank=bank+1)
824
for(bank=0;bank<2;bank=bank+1)
825
   begin
826
 
827
        $display("VBL: %0d, Mode: %0d Screen: %0d", vbl, mode, bank);
828
        @(posedge vsync);
829
 
830
        error_cnt=0;
831
        // For Each Line
832 38 rherveille
//      for(l=0;l<tvgate+1;l=l+1)
833
        for(l=0; l<tvgate;l=l+1)
834 16 rudi
        // For each Pixel
835
        for(p=0;p<thgate+1;p=p+1)
836
           begin
837
                while(blanc)    @(posedge pclk);  // wait for viewable data
838
 
839
                //$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
840
 
841
                if(bank[0])      vbase = vbarb[31:2];
842
                else            vbase = vbara[31:2];
843
                if(bank[0])      cbase = cbar | 32'h0000_0400;
844
                else            cbase = cbar;
845
 
846
                // Depending on Mode, determine pixel data
847
                // pixel number = line * (thgate + 1) + p
848
                pn = l * (thgate + 1) + p;
849
 
850
                case(mode)
851 26 rherveille
                        0:       // 24 bit/pixel mode
852
                        begin
853
                                pra = pn[31:2] * 3;     // Pixel relative Address
854
                                paa = pra + vbase;      // Pixel Absolute Address
855 16 rudi
 
856 26 rherveille
                                // Pixel Data
857
                                case(pn[1:0])
858
                                        0:
859
                                        begin
860
                                                tmp = s0.mem[paa];
861
                                                pd = tmp[31:8];
862
                                        end
863 16 rudi
 
864 26 rherveille
                                        1:
865
                                        begin
866
                                                tmp = s0.mem[paa];
867
                                                pd[23:16] = tmp[7:0];
868
                                                tmp = s0.mem[paa+1];
869
                                                pd[15:0] = tmp[31:16];
870
                                        end
871 16 rudi
 
872 26 rherveille
                                        2:
873
                                        begin
874
                                                tmp = s0.mem[paa+1];
875
                                                pd[23:8] = tmp[15:0];
876
                                                tmp = s0.mem[paa+2];
877
                                                pd[7:0] = tmp[31:24];
878
                                        end
879
 
880
                                        3:
881
                                        begin
882
                                                tmp = s0.mem[paa+2];
883
                                                pd = tmp[23:0];
884
                                        end
885
                                endcase
886
                        end
887
 
888
                        1:      // 8 bit/pixel grayscale mode
889
                        begin
890
                                pra = pn[31:2];         // Pixel relative Address
891
                                paa = pra + vbase;      // Pixel Absolute Address
892
 
893
                                case(pn[1:0])
894
                                        0:
895
                                        begin
896
                                                tmp = s0.mem[paa];
897
                                                pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
898
                                        end
899
 
900
                                        1:
901
                                        begin
902
                                                tmp = s0.mem[paa];
903
                                                pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
904
                                        end
905
 
906
                                        2:
907
                                        begin
908
                                                tmp = s0.mem[paa];
909
                                                pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
910
                                        end
911
 
912
                                        3:
913
                                        begin
914
                                                tmp = s0.mem[paa];
915
                                                pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
916
                                        end
917
                                endcase
918
                        end
919
 
920
                        2:      // 8 bit/pixel Pseudo Color mode
921
                        begin
922
                                pra = pn[31:2];         // Pixel relative Address
923
                                paa = pra + vbase;      // Pixel Absolute Address
924
 
925
                                case(pn[1:0])
926
                                        0:
927
                                        begin
928
                                                tmp = s0.mem[paa];
929
                                                tmp = s0.mem[cbase[31:2] + tmp[31:24]];
930
                                                pd = tmp[23:0];
931
                                        end
932
 
933
                                        1:
934
                                        begin
935
                                                tmp = s0.mem[paa];
936
                                                tmp = s0.mem[cbase[31:2] + tmp[23:16]];
937
                                                pd = tmp[23:0];
938
                                        end
939
 
940
                                        2:
941
                                        begin
942
                                                tmp = s0.mem[paa];
943
                                                tmp = s0.mem[cbase[31:2] + tmp[15:8]];
944
                                                pd = tmp[23:0];
945
                                        end
946
 
947
                                        3:
948
                                        begin
949
                                                tmp = s0.mem[paa];
950
                                                tmp = s0.mem[cbase[31:2] + tmp[7:0]];
951
                                                pd = tmp[23:0];
952
                                        end
953
                                endcase
954
                        end
955
 
956
                        3:      // 16 bit/pixel mode
957
                        begin
958
                                pra = pn[31:1];         // Pixel relative Address
959
                                paa = pra + vbase;      // Pixel Absolute Address
960
 
961
                                case(pn[0])
962
                                        0:
963
                                        begin
964
                                                tmp = s0.mem[paa];
965
                                                tmp[15:0] = tmp[31:16];
966
                                                pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
967
                                        end
968
 
969
                                        1:
970
                                        begin
971
                                                tmp = s0.mem[paa];
972
                                                pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
973
                                        end
974
                                endcase
975
                        end
976
 
977
                        4:      // 32 bit/pixel mode
978
                        begin
979
                                pra = pn[31:0];          // Pixel relative Address
980
                                paa = pra + vbase;      // Pixel Absolute Address
981
 
982 16 rudi
                                tmp = s0.mem[paa];
983
                                pd = tmp[23:0];
984 26 rherveille
                        end
985 16 rudi
 
986
                endcase
987
 
988
                if(pd !== {red, green, blue} )
989
                   begin
990
                        $display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",
991
                                pd, red, green, blue);
992
                        $display("       pixel=%0d, line=%0d, (%0t)",p,l,$time);
993
                        error_cnt = error_cnt + 1;
994
                        if(error_cnt > 10)      $stop;
995
                   end
996
 
997
                @(posedge pclk);
998
 
999
           end
1000
   end
1001
end
1002
 
1003
show_errors;
1004
$display("*****************************************************");
1005
$display("*** Test DONE ...                                 ***");
1006
$display("*****************************************************\n\n");
1007
 
1008
end
1009
endtask
1010
 
1011
 
1012
 
1013
task ur_test;
1014
 
1015
integer         mode;
1016
integer         n, p, l;
1017
reg     [31:0]   pn;
1018
reg     [31:0]   pra, paa, tmp;
1019
reg     [23:0]   pd;
1020
reg     [1:0]    cd;
1021
reg             pc;
1022
reg     [31:0]   cbar;
1023
reg     [31:0]   data;
1024
reg     [7:0]    vbl;
1025
 
1026
begin
1027
 
1028
$display("\n\n");
1029
$display("*****************************************************");
1030
$display("*** FIFO Underrun Test 1                          ***");
1031
$display("*****************************************************\n");
1032
 
1033
        s0.delay=5;
1034
        int_warn = 0;
1035
 
1036
        m0.wb_wr1( `VBARA, 4'hf, 0 );
1037
        m0.wb_wr1( `VBARB, 4'hf, 123456 );
1038
 
1039 24 rherveille
        cbar = 32'h0000_0800;
1040 16 rudi
 
1041
        thsync = 0;
1042
        thgdel = 0;
1043
        thgate = 340;
1044
        thlen = 345;
1045
 
1046
        tvsync = 0;
1047
        tvgdel = 0;
1048
        tvgate = 240;
1049
        tvlen = 245;
1050
 
1051
        thsync = 39;
1052
        thgdel = 124;
1053
        thgate = 646;
1054
        thlen = 832;
1055
 
1056
        tvsync = 2;
1057
        tvgdel = 25;
1058
        tvgate = 484;
1059
        tvlen = 520;
1060
 
1061
        thsync = 6;
1062
        thgdel = 20;
1063
        thgate = 319;
1064
        thlen = 390;
1065
 
1066
        tvsync = 1;
1067
        tvgdel = 8;
1068
        tvgate = 239;
1069
        tvlen = 280;
1070
 
1071
/*
1072
        thsync = 0;
1073
        thgdel = 0;
1074
        thgate = 63;
1075
        thlen = 70;
1076
 
1077
        tvsync = 0;
1078
        tvgdel = 0;
1079
        tvgate = 32;
1080
        tvlen = 36;
1081
 
1082
        thsync = 119;
1083
        thgdel = 61;
1084
        thgate = 805;
1085
        thlen  = 1038;
1086
 
1087
        tvsync = 5;
1088
        tvgdel = 20;
1089
        tvgate = 600;
1090
        tvlen  = 665;
1091
 
1092
*/
1093
 
1094
        hpol = 0;
1095
        vpol = 0;
1096
        cpol = 0;
1097
        bpol = 0;
1098
 
1099
        m0.wb_wr1( `HTIM,  4'hf, {thsync, thgdel, thgate} );
1100
        m0.wb_wr1( `VTIM,  4'hf, {tvsync, tvgdel, tvgate} );
1101
        m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
1102
 
1103
        mode = 2;
1104
 
1105
        // -------------------------------
1106
        // Turn Off VGA before Mode Change
1107
 
1108
        m0.wb_wr1( `CTRL,  4'hf, 32'h0000_0000);
1109
 
1110
        s0.fill_mem(1);
1111
 
1112
`ifdef USE_VC
1113
// Fill internal Color Lookup Table
1114
repeat(10)      @(posedge clk);
1115
for(n=0;n<512;n=n+1)
1116
   begin
1117
        //m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
1118
        data = s0.mem[ cbar[31:2] + n];
1119
        m0.wb_wr1( 32'h8000_0000 + (n*4), 4'hf, data );
1120
   end
1121
repeat(10)      @(posedge clk);
1122
`endif
1123
 
1124
        case(mode)
1125
           0:
1126
             begin
1127
                cd = 2'h2;
1128
                pc = 1'b0;
1129
             end
1130
           1:
1131
             begin
1132
                cd = 2'h0;
1133
                pc = 1'b0;
1134
             end
1135
           2:
1136
             begin
1137
                cd = 2'h0;
1138
                pc = 1'b1;
1139
             end
1140
           3:
1141
             begin
1142
                cd = 2'h1;
1143
                pc = 1'b0;
1144
             end
1145
        endcase
1146
 
1147
        // -------------------------------
1148
        // Turn VGA back On ...
1149
        m0.wb_wr1( `CTRL,  4'hf, {
1150
                                16'h0,  // Reserved
1151
                                bpol, cpol,
1152
                                vpol, hpol,
1153
                                pc,     // 1'b0,        // PC
1154
                                cd,     // 2'h2,        // CD
1155
                                2'b00,  // VBL
1156
                                1'b0,   // Reserved
1157
                                1'b0,   // CBSWE
1158
                                1'b0,   // VBSWE
1159
                                1'b0,   // BSIE
1160
                                1'b0,   // HIE
1161
                                1'b0,   // VIE
1162
                                1'b1    // Video Enable
1163
                                });
1164
 
1165
        while(!int)     @(posedge clk);
1166
        m0.wb_rd1( `STAT,  4'hf, data);
1167
        if(data[1] !== 1'b1)
1168
           begin
1169
                $display("ERROR: Did not get Line FIFO Interrupt. (%0t)",
1170
                        $time);
1171
           end
1172
 
1173
show_errors;
1174
$display("*****************************************************");
1175
$display("*** Test DONE ...                                 ***");
1176
$display("*****************************************************\n\n");
1177
 
1178
m0.wb_wr1( `CTRL,  4'hf, 32'h0000_0000);
1179
int_warn = 1;
1180
s0.delay=1;
1181
repeat(10) @(posedge clk);
1182
 
1183
end
1184
endtask
1185
 
1186
 
1187 24 rherveille
 
1188
 
1189
 
1190
 
1191
 
1192
 
1193
 
1194
 
1195
 
1196
 
1197
 
1198
 
1199
 
1200
 
1201
 
1202
 
1203
 
1204
 
1205
 
1206
 
1207
 
1208
 
1209
 
1210
 
1211
 
1212
 
1213
 
1214
 
1215
 
1216
 
1217
 
1218
 
1219
 
1220
 
1221
 
1222
 
1223
 
1224
 
1225
 
1226
 
1227
 
1228
 
1229
 
1230
 
1231
 
1232
 
1233
 
1234
 
1235 38 rherveille
 
1236
 
1237
 
1238
 
1239
 
1240
 
1241
 
1242
 
1243
 
1244
 
1245
 
1246
 
1247
 
1248 29 rherveille
 
1249
 
1250
 
1251
 
1252
 
1253
 
1254
 
1255
 
1256
 
1257
 
1258
 
1259
 
1260
 
1261
 
1262
 
1263
 
1264 26 rherveille
 
1265
 
1266
 
1267
 
1268
 
1269 24 rherveille
 
1270
 
1271
 
1272
 
1273
 
1274
 
1275
 
1276
 
1277
 
1278
 
1279
 
1280
 
1281
 
1282
 
1283
 
1284
 
1285
 
1286
 
1287
 
1288
 
1289
 
1290
 
1291
 

powered by: WebSVN 2.1.0

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