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

Subversion Repositories gpio

[/] [gpio/] [tags/] [rel_1/] [bench/] [verilog/] [tb_tasks.v] - Blame information for rev 67

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

powered by: WebSVN 2.1.0

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