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

Subversion Repositories gpio

[/] [gpio/] [trunk/] [bench/] [verilog/] [tb_tasks.v] - Blame information for rev 21

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

Line No. Rev Author Line
1 8 lampret
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  GPIO Testbench Tasks                                        ////
4
////                                                              ////
5
////  This file is part of the GPIO project                       ////
6
////  http://www.opencores.org/cores/gpio/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Testbench tasks.                                            ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   Nothing                                                    ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47 21 lampret
// Revision 1.4  2001/11/15 02:26:32  lampret
48
// Updated timing and fixed some typing errors.
49
//
50 18 lampret
// Revision 1.3  2001/09/18 16:37:55  lampret
51
// Changed VCD output location.
52
//
53 13 lampret
// Revision 1.2  2001/09/18 15:43:27  lampret
54
// Changed gpio top level into gpio_top. Changed defines.v into gpio_defines.v.
55
//
56 12 lampret
// Revision 1.1  2001/08/21 21:39:27  lampret
57
// Changed directory structure, port names and drfines.
58
//
59 8 lampret
// Revision 1.2  2001/07/14 20:37:23  lampret
60
// Test bench improvements.
61
//
62
// Revision 1.1  2001/06/05 07:45:22  lampret
63
// Added initial RTL and test benches. There are still some issues with these files.
64
//
65
//
66
 
67
`include "timescale.v"
68 12 lampret
`include "gpio_defines.v"
69 8 lampret
`include "tb_defines.v"
70
 
71
module tb_tasks;
72
 
73
integer nr_failed;
74
integer ints_disabled;
75
integer ints_working;
76
integer local_errs;
77
 
78
parameter sh_addr = `GPIO_ADDRLH+1;
79
 
80
//
81
// Count/report failed tests
82
//
83
task failed;
84
begin
85
        $display("FAILED !!!");
86
        nr_failed = nr_failed + 1;
87
end
88
endtask
89
 
90
//
91
// Set RGPIO_OUT register
92
//
93
task setout;
94
input   [31:0] val;
95
 
96
begin
97
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_OUT<<sh_addr, val, 4'b1111);
98
end
99
 
100
endtask
101
 
102
//
103
// Set RGPIO_OE register
104
//
105
task setoe;
106
input   [31:0] val;
107
 
108
begin
109
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_OE<<sh_addr, val, 4'b1111);
110
end
111
 
112
endtask
113
 
114
//
115
// Set RGPIO_INTE register
116
//
117
task setinte;
118
input   [31:0] val;
119
 
120
begin
121
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_INTE<<sh_addr, val, 4'b1111);
122
end
123
 
124
endtask
125
 
126
//
127
// Set RGPIO_PTRIG register
128
//
129
task setptrig;
130
input   [31:0] val;
131
 
132
begin
133
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_PTRIG<<sh_addr, val, 4'b1111);
134
end
135
 
136
endtask
137
 
138
//
139
// Set RGPIO_AUX register
140
//
141
task setaux;
142
input   [31:0] val;
143
 
144
begin
145
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_AUX<<sh_addr, val, 4'b1111);
146
end
147
 
148
endtask
149
 
150
//
151
// Set RGPIO_CTRL register
152
//
153
task setctrl;
154
input   [31:0] val;
155
 
156
begin
157
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_CTRL<<sh_addr, val, 4'b1111);
158
end
159
 
160
endtask
161
 
162
//
163 21 lampret
// Set RGPIO_INTS register
164
//
165
task setints;
166
input   [31:0] val;
167
 
168
begin
169
        #100 tb_top.wb_master.wr(`GPIO_RGPIO_INTS<<sh_addr, val, 4'b1111);
170
end
171
 
172
endtask
173
 
174
//
175 8 lampret
// Display RGPIO_IN register
176
//
177
task showin;
178
 
179
reg     [31:0] tmp;
180
begin
181
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_IN<<sh_addr, tmp);
182
        $write(" RGPIO_IN: %h", tmp);
183
end
184
 
185
endtask
186
 
187
//
188
// Display RGPIO_OUT register
189
//
190
task showout;
191
 
192
reg     [31:0] tmp;
193
begin
194
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_OUT<<sh_addr, tmp);
195
        $write(" RGPIO_OUT: %h", tmp);
196
end
197
 
198
endtask
199
 
200
 
201
//
202
// Display RGPIO_OE register
203
//
204
task showoe;
205
 
206
reg     [31:0] tmp;
207
begin
208
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_OE<<sh_addr, tmp);
209
        $write(" RGPIO_OE:%h", tmp);
210
end
211
 
212
endtask
213
 
214
//
215
// Display RGPIO_INTE register
216
//
217
task showinte;
218
 
219
reg     [31:0] tmp;
220
begin
221
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_INTE<<sh_addr, tmp);
222
        $write(" RGPIO_INTE:%h", tmp);
223
end
224
 
225
endtask
226
 
227
//
228
// Display RGPIO_PTRIG register
229
//
230
task showptrig;
231
 
232
reg     [31:0] tmp;
233
begin
234
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_PTRIG<<sh_addr, tmp);
235
        $write(" RGPIO_PTRIG:%h", tmp);
236
end
237
 
238
endtask
239
 
240
//
241
// Display RGPIO_AUX register
242
//
243
task showaux;
244
 
245
reg     [31:0] tmp;
246
begin
247
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_AUX<<sh_addr, tmp);
248
        $write(" RGPIO_AUX:%h", tmp);
249
end
250
 
251
endtask
252
 
253
//
254
// Display RGPIO_CTRL register
255
//
256
task showctrl;
257
 
258
reg     [31:0] tmp;
259
begin
260
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_CTRL<<sh_addr, tmp);
261
        $write(" RGPIO_CTRL: %h", tmp);
262
end
263
 
264
endtask
265
 
266
//
267 21 lampret
// Display RGPIO_INTS register
268
//
269
task showints;
270
 
271
reg     [31:0] tmp;
272
begin
273
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_INTS<<sh_addr, tmp);
274
        $write(" RGPIO_INTS:%h", tmp);
275
end
276
 
277
endtask
278
 
279
//
280 8 lampret
// Compare parameter with RGPIO_IN register
281
//
282
task comp_in;
283
input   [31:0]   val;
284
output          ret;
285
 
286
reg     [31:0]   tmp;
287
reg             ret;
288
begin
289
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_IN<<sh_addr, tmp);
290
 
291
        if (tmp == val)
292
                ret = 1;
293
        else
294
                ret = 0;
295
end
296
 
297
endtask
298
 
299
//
300
// Get RGPIO_IN register
301
//
302
task getin;
303
output  [31:0]   tmp;
304
 
305
begin
306
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_IN<<sh_addr, tmp);
307
end
308
 
309
endtask
310
 
311
//
312
// Get RGPIO_OUT register
313
//
314
task getout;
315
output  [31:0]   tmp;
316
 
317
begin
318
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_OUT<<sh_addr, tmp);
319
end
320
 
321
endtask
322
 
323
//
324
// Get RGPIO_OE register
325
//
326
task getoe;
327
output  [31:0]   tmp;
328
 
329
begin
330
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_OE<<sh_addr, tmp);
331
end
332
 
333
endtask
334
 
335
//
336
// Get RGPIO_INTE register
337
//
338
task getinte;
339
output  [31:0]   tmp;
340
 
341
begin
342
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_INTE<<sh_addr, tmp);
343
end
344
 
345
endtask
346
 
347
//
348
// Get RGPIO_PTRIG register
349
//
350
task getptrig;
351
output  [31:0]   tmp;
352
 
353
begin
354
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_PTRIG<<sh_addr, tmp);
355
end
356
 
357
endtask
358
 
359
//
360
// Get RGPIO_AUX register
361
//
362
task getaux;
363
output  [31:0]   tmp;
364
 
365
begin
366
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_AUX<<sh_addr, tmp);
367
end
368
 
369
endtask
370
 
371
//
372
// Get RGPIO_CTRL register
373
//
374
task getctrl;
375
output  [31:0]   tmp;
376
 
377
begin
378
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_CTRL<<sh_addr, tmp);
379
end
380
 
381
endtask
382
 
383
//
384 21 lampret
// Get RGPIO_INTS register
385
//
386
task getints;
387
output  [31:0]   tmp;
388
 
389
begin
390
        #100 tb_top.wb_master.rd(`GPIO_RGPIO_INTS<<sh_addr, tmp);
391
end
392
 
393
endtask
394
 
395
//
396 8 lampret
// Calculate a random and make it narrow to fit on GPIO I/O pins
397
//
398
task random_gpio;
399
output  [31:0]   tmp;
400
 
401
begin
402
        tmp = $random & ((1<<`GPIO_IOS)-1);
403
end
404
 
405
endtask
406
 
407
//
408
// Test operation of control bit RGPIO_CTRL[ECLK]
409
//
410
task test_eclk;
411
integer         l1, l2, l3;
412 18 lampret
integer         r1, r2, r3;
413 8 lampret
begin
414
 
415 18 lampret
        // Set external clock to low state
416
        tb_top.gpio_mon.set_gpioeclk(0);
417
        @(posedge tb_top.clk);
418
        @(posedge tb_top.clk);
419
 
420 8 lampret
        //
421
        // Phase 1
422
        //
423
        // GPIO uses WISHBONE clock to latch gpio_in
424
        //
425
 
426
        // Put something on gpio_in pins
427
        random_gpio(r1);
428
        tb_top.gpio_mon.set_gpioin(r1);
429
 
430
        // Reset GPIO_CTRL
431
        setctrl(0);
432
 
433
        // Wait for time to advance
434 18 lampret
        @(posedge tb_top.clk);
435
        @(posedge tb_top.clk);
436 8 lampret
 
437
        // Read GPIO_RGPIO_IN
438
        getin(l1);
439
 
440
        //
441
        // Phase 2
442
        //
443
        // GPIO uses external clock to latch gpio_in
444
        //
445
 
446 18 lampret
        // Set GPIO to use external clock, NEC bit cleared
447 8 lampret
        setctrl(1 << `GPIO_RGPIO_CTRL_ECLK);
448
 
449
        // Put something else on gpio_in pins
450
        random_gpio(r2);
451
        tb_top.gpio_mon.set_gpioin(r2);
452
 
453 18 lampret
        // Make an external posedge clock pulse
454
        tb_top.gpio_mon.set_gpioeclk(0);
455
        @(posedge tb_top.clk);
456
        @(posedge tb_top.clk);
457
        tb_top.gpio_mon.set_gpioeclk(1);
458
        @(posedge tb_top.clk);
459
        @(posedge tb_top.clk);
460 8 lampret
 
461 18 lampret
        // Read RGPIO_IN
462 8 lampret
        getin(l2);
463
 
464 18 lampret
        //
465
        // Phase 3
466
        //
467
        // Change GPIO inputs and WB clock but not external clock.
468
        // RGPIO_IN should not change.
469
        //
470 8 lampret
 
471 18 lampret
        // Put something else on gpio_in pins
472
        random_gpio(r3);
473
        tb_top.gpio_mon.set_gpioin(r3);
474
 
475
        // Wait for WB clock
476
        @(posedge tb_top.clk);
477
        @(posedge tb_top.clk);
478
 
479
        // Read RGPIO_IN
480 8 lampret
        getin(l3);
481
 
482
        //
483 18 lampret
        // Phase 4
484 8 lampret
        //
485
        // Compare phases
486
        //
487 18 lampret
        if (l1 == r1 && l2 == r2 && l2 == l3)
488 8 lampret
                $write(".");
489
        else
490
                local_errs = local_errs + 1;
491
end
492
endtask
493
 
494
//
495
// Test operation of control bit RGPIO_CTRL[NEC]
496
//
497
task test_nec;
498
integer         l1, l2;
499 18 lampret
integer         r1, r2;
500 8 lampret
begin
501
        //
502
        // Phase 1
503
        //
504
        // Compare RGPIO_IN before and after negative edge
505
        //
506
 
507 18 lampret
        // Set external clock to low state
508
        tb_top.gpio_mon.set_gpioeclk(0);
509
        @(posedge tb_top.clk);
510
        @(posedge tb_top.clk);
511 8 lampret
 
512
        // Set GPIO to use external clock and set RGPIO_CTRL[NEC]
513
        setctrl(1 << `GPIO_RGPIO_CTRL_ECLK | 1 << `GPIO_RGPIO_CTRL_NEC);
514
 
515 18 lampret
        // Put random on gpio inputs
516
        random_gpio(r1);
517
        tb_top.gpio_mon.set_gpioin(r1);
518
 
519
        // Advance time by making an external negedge clock pulse
520
        tb_top.gpio_mon.set_gpioeclk(1);
521
        @(posedge tb_top.clk);
522
        @(posedge tb_top.clk);
523
        tb_top.gpio_mon.set_gpioeclk(0);
524
        @(posedge tb_top.clk);
525
        @(posedge tb_top.clk);
526
 
527 8 lampret
        // Put something on gpio_in pins
528
        random_gpio(r2);
529
        tb_top.gpio_mon.set_gpioin(r2);
530
 
531 18 lampret
        // Make an external posedge clock pulse
532
        tb_top.gpio_mon.set_gpioeclk(0);
533
        @(posedge tb_top.clk);
534
        @(posedge tb_top.clk);
535
        tb_top.gpio_mon.set_gpioeclk(1);
536
        @(posedge tb_top.clk);
537
        @(posedge tb_top.clk);
538 8 lampret
 
539 18 lampret
        // Read RGPIO_IN (should be the same as r1)
540 8 lampret
        getin(l1);
541
 
542 18 lampret
        // Make an external negedge clock pulse
543 8 lampret
        tb_top.gpio_mon.set_gpioeclk(1);
544 18 lampret
        @(posedge tb_top.clk);
545
        @(posedge tb_top.clk);
546 8 lampret
        tb_top.gpio_mon.set_gpioeclk(0);
547 18 lampret
        @(posedge tb_top.clk);
548
        @(posedge tb_top.clk);
549 8 lampret
 
550 18 lampret
        // Read RGPIO_IN (should be the same as r2)
551 8 lampret
        getin(l2);
552
 
553
        //
554
        // Phase 2
555
        //
556
        // Compare phases
557
        //
558 18 lampret
//      $display("l1 %h  l2 %h  r1 %h  r2 %h", l1, l2, r1, r2);
559
        if (l1 == r1 && l2 == r2)
560 8 lampret
                $write(".");
561
        else
562
                local_errs = local_errs + 1;
563
end
564
endtask
565
 
566
//
567
// Test input polled mode, output mode and bidirectional
568
//
569
task test_simple;
570
integer         l1, l2, l3, l4;
571
integer         i, err;
572
begin
573
        $write("  Testing input mode ...");
574
 
575
        //
576
        // Phase 1
577
        //
578
        // Compare RGPIO_IN and gpio_in
579
        //
580
 
581
        // Set GPIO to use WB clock
582
        setctrl(0);
583
 
584
        err = 0;
585
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i +1) begin
586
                // Put something on gpio_in pins
587
                random_gpio(l1);
588
                tb_top.gpio_mon.set_gpioin(l1);
589
 
590
                // Advance time
591 18 lampret
                @(posedge tb_top.clk);
592
                @(posedge tb_top.clk);
593 8 lampret
 
594
                // Read GPIO_RGPIO_IN
595
                getin(l2);
596
 
597
                // Compare gpio_in and RGPIO_IN. Should be equal.
598
                if (l1 != l2)
599
                        err = err + 1;
600
        end
601
 
602
        // Phase 2
603
        //
604
        // Output result for previous test
605
        //
606
        if (!err)
607
                $display(" OK");
608
        else
609
                failed;
610
 
611
        $write("  Testing output mode ...");
612
 
613
        //
614
        // Phase 3
615
        //
616
        // Compare RGPIO_OUT and gpio_out
617
        //
618
 
619
        err = 0;
620
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i +1) begin
621
                // Put something in RGPIO_OUT pins
622
                l1 = $random;
623
                setout(l1);
624
 
625
                // Advance time
626 18 lampret
                @(posedge tb_top.clk);
627
                @(posedge tb_top.clk);
628 8 lampret
 
629
                // Read gpio_out
630
                tb_top.gpio_mon.get_gpioout(l2);
631
 
632
                // Compare gpio_out and RGPIO_OUT. Should be equal.
633
                if (l1 != l2)
634
                        err = err + 1;
635
        end
636
 
637
        // Phase 4
638
        //
639
        // Output result for previous test
640
        //
641
        if (!err)
642
                $display(" OK");
643
        else
644
                failed;
645
 
646
        $write("  Testing bidirectional I/O ...");
647
 
648
        //
649
        // Phase 5
650
        //
651
        // Compare RGPIO_OE and gpio_oen
652
        //
653
 
654
        err = 0;
655
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i +1) begin
656
                // Put something in RGPIO_OE pins
657
                l1 = $random;
658
                setoe(l1);
659
 
660
                // Advance time
661 18 lampret
                @(posedge tb_top.clk);
662
                @(posedge tb_top.clk);
663 8 lampret
 
664
                // Read gpio_oen
665
                tb_top.gpio_mon.get_gpiooen(l2);
666
 
667
                // Compare gpio_oen and RGPIO_OE. Should be exactly opposite.
668
                if (l1 != ~l2)
669
                        err = err + 1;
670
        end
671
 
672
        // Phase 6
673
        //
674
        // Output result for previous test
675
        //
676
        if (!err)
677
                $display(" OK");
678
        else
679
                failed;
680
 
681
        $write("  Testing auxiliary feature ...");
682
 
683
        //
684
        // Phase 7
685
        //
686
        // Compare RGPIO_OUT, gpio_out, RGPIO_AUX and gpio_aux
687
        //
688
 
689
        err = 0;
690
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i +1) begin
691
                // Put something on gpio_aux pins
692
                l1 = $random;
693
                tb_top.gpio_mon.set_gpioaux(l1);
694
 
695
                // Put something in RGPIO_AUX pins
696
                l2 = $random;
697
                setaux(l2);
698
 
699
                // Put something in RGPIO_OUT pins
700
                l3 = $random;
701
                setout(l3);
702
 
703
                // Advance time
704 18 lampret
                @(posedge tb_top.clk);
705
                @(posedge tb_top.clk);
706 8 lampret
 
707
                // Read gpio_out
708
                tb_top.gpio_mon.get_gpioout(l4);
709
 
710
                // Compare gpio_out, RGPIO_OUT, RGPIO_AUX and gpio_aux.
711
                // RGPIO_AUX specifies which gpio_aux bits and RGPIO_OUT 
712
                // bits are present on gpio_out and where
713
                if ((l1 & l2 | l3 & ~l2) != l4)
714
                        err = err + 1;
715
        end
716
 
717
        // Phase 8
718
        //
719
        // Output result for previous test
720
        //
721
        if (!err)
722
                $display(" OK");
723
        else
724
                failed;
725
 
726
end
727
endtask
728
 
729
//
730
// Test interrupts
731
//
732
task test_ints;
733 21 lampret
integer         l1, l2, l3, l4;
734 8 lampret
integer         i, rnd, err;
735
integer         r1;
736
begin
737
 
738 18 lampret
        $write("  Testing control bit RGPIO_CTRL[INTE] and RGPIO_CTRL[INT] ...");
739 8 lampret
 
740
        //
741
        // Phase 1
742
        //
743
        // Generate patterns on inputs in interrupt mode
744
        //
745
 
746
        // Disable spurious interrupt monitor
747
        ints_disabled = 0;
748
 
749
        err = 0;
750
        for( i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i + 1) begin
751
 
752
                // Set gpio_in pins
753
                r1 = ((1<<`GPIO_IOS)-1) & 'hffffffff;
754
                tb_top.gpio_mon.set_gpioin(r1);
755
 
756
                // Low level triggering
757
                setptrig(0);
758 21 lampret
 
759
                // Clear RGPIO_INTS
760
                setints(0);
761 8 lampret
 
762
                // Enable interrupts in RGPIO_CTRL
763
                setctrl(1 << `GPIO_RGPIO_CTRL_INTE);
764
 
765
                // Enable interrupts in RGPIO_INTE
766
                setinte(r1);
767
 
768
                // Advance time
769 18 lampret
                @(posedge tb_top.clk);
770
                @(posedge tb_top.clk);
771 8 lampret
 
772
                // Sample interrupt request. Should be zero.
773 12 lampret
                l1 = tb_top.gpio_top.wb_inta_o;
774 8 lampret
 
775
                // Clear gpio_in pins
776
                tb_top.gpio_mon.set_gpioin(0);
777
 
778
                // Advance time
779 18 lampret
                @(posedge tb_top.clk);
780
                @(posedge tb_top.clk);
781 21 lampret
                @(posedge tb_top.clk);
782 8 lampret
 
783
                // Sample interrupt request. Should be one.
784 12 lampret
                l2 = tb_top.gpio_top.wb_inta_o;
785 8 lampret
 
786
                // Clear interrupt request
787
                setctrl(0);
788
 
789
                // Advance time
790 18 lampret
                @(posedge tb_top.clk);
791
                @(posedge tb_top.clk);
792 8 lampret
 
793
                // Sample interrupt request. Should be zero.
794 12 lampret
                l3 = tb_top.gpio_top.wb_inta_o;
795 8 lampret
 
796 21 lampret
                // Get RGPIO_INTS. Should be nonzero.
797
                getints(l4);
798
 
799 8 lampret
                // Check for errors
800 21 lampret
                if (l1 || !l2 || l3 || (l4 != r1)) begin
801
                        $display("l1 %h  l2 %h  l3 %h  l4 %h", l1, l2, l3, l4);
802 8 lampret
                        err = err +1;
803 21 lampret
                end
804 8 lampret
        end
805
 
806
        // Enable spurious interrupt monitor
807
        ints_disabled = 1;
808
 
809
        // Phase 2
810
        //
811
        // Check results
812
        //
813
        if (!err)
814
                $display(" OK");
815
        else
816
                failed;
817
end
818
endtask
819
 
820
//
821
// Test ptrig
822
//
823
task test_ptrig;
824
integer         l1, l2, l3;
825
integer         i, rnd, err;
826
integer         r1;
827
begin
828
        $write("  Testing ptrig features ...");
829
 
830
        //
831
        // Phase 1
832
        //
833
        // Generate patterns on inputs in interrupt mode
834
        //
835
 
836
        // Disable spurious interrupt monitor
837
        ints_disabled = 0;
838
 
839
        err = 0;
840
        for( i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i + 1) begin
841
 
842
                // Set bits to one
843
                r1 = ((1<<`GPIO_IOS)-1) & 'hffffffff;
844
 
845
                // Set gpio_in pins
846
                tb_top.gpio_mon.set_gpioin('h00000000);
847
 
848 21 lampret
                // Clear old interrupts
849
                setints(0);
850
 
851 8 lampret
                // High level triggering
852
                setptrig('hffffffff);
853
 
854
                // Enable interrupts in RGPIO_CTRL
855
                setctrl(1 << `GPIO_RGPIO_CTRL_INTE);
856
 
857
                // Enable interrupts in RGPIO_INTE
858
                setinte(r1);
859
 
860
                // Advance time
861 18 lampret
                @(posedge tb_top.clk);
862
                @(posedge tb_top.clk);
863 8 lampret
 
864
                // Sample interrupt request. Should be zero.
865 12 lampret
                l1 = tb_top.gpio_top.wb_inta_o;
866 8 lampret
 
867
                // Clear gpio_in pins
868
                tb_top.gpio_mon.set_gpioin('hffffffff);
869
 
870
                // Advance time
871 18 lampret
                @(posedge tb_top.clk);
872
                @(posedge tb_top.clk);
873 21 lampret
                @(posedge tb_top.clk);
874 8 lampret
 
875
                // Sample interrupt request. Should be one.
876 12 lampret
                l2 = tb_top.gpio_top.wb_inta_o;
877 8 lampret
 
878
                // Clear interrupt request
879
                setctrl(0);
880 21 lampret
                setints(0);
881 8 lampret
 
882
                // Advance time
883 18 lampret
                @(posedge tb_top.clk);
884
                @(posedge tb_top.clk);
885 8 lampret
 
886
                // Sample interrupt request. Should be zero.
887 12 lampret
                l3 = tb_top.gpio_top.wb_inta_o;
888 8 lampret
 
889
                // Check for errors
890
                if (l1 || !l2 || l3)
891
                        err = err +1;
892
        end
893
 
894
        // Enable spurious interrupt monitor
895
        ints_disabled = 1;
896
 
897
        // Phase 2
898
        //
899
        // Check results
900
        //
901
        if (!err)
902
                $display(" OK");
903
        else
904
                failed;
905
end
906
endtask
907
 
908
//
909
// Do continues check for interrupts
910
//
911 12 lampret
always @(posedge tb_top.gpio_top.wb_inta_o)
912 8 lampret
        if (ints_disabled) begin
913
                $display("Spurious interrupt detected. ");
914
                failed;
915
                ints_working = 9876;
916
                $display;
917
        end
918
 
919
//
920
// Start of testbench test tasks
921
//
922
integer         i;
923
initial begin
924 21 lampret
`ifdef GPIO_DUMP_VCD
925 13 lampret
        $dumpfile("../out/tb_top.vcd");
926 8 lampret
        $dumpvars(0);
927
`endif
928
        nr_failed = 0;
929
        ints_disabled = 1;
930
        ints_working = 0;
931
        tb_top.gpio_mon.set_gpioin(0);
932
        tb_top.gpio_mon.set_gpioaux(0);
933
        tb_top.gpio_mon.set_gpioeclk(0);
934
        $display;
935
        $display("###");
936
        $display("### GPIO IP Core Verification ###");
937
        $display("###");
938
        $display;
939
        $display("I. Testing correct operation of RGPIO_CTRL control bits");
940
        $display;
941
 
942
 
943
        $write("  Testing control bit RGPIO_CTRL[ECLK] ...");
944
        local_errs = 0;
945
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i + 1)
946
                test_eclk;
947
        if (local_errs == 0)
948
                $display(" OK");
949
        else
950
                failed;
951
 
952
 
953
        $write("  Testing control bit RGPIO_CTRL[NEC] ...");
954
        local_errs = 0;
955
        for (i = 0; i < 10 * `GPIO_VERIF_INTENSITY; i = i + 1)
956
                test_nec;
957
        if (local_errs == 0)
958
                $display(" OK");
959
        else
960
                failed;
961
 
962
        test_ints;
963
 
964
        $display;
965
        $display("II. Testing modes of operation ...");
966
        $display;
967
 
968
        test_simple;
969
        test_ptrig;
970
 
971
        $display;
972
        $display("###");
973
        $display("### FAILED TESTS: %d ###", nr_failed);
974
        $display("###");
975
        $display;
976
        $finish;
977
end
978
 
979
endmodule

powered by: WebSVN 2.1.0

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