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

Subversion Repositories gpio

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

powered by: WebSVN 2.1.0

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