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 61

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

powered by: WebSVN 2.1.0

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