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

Subversion Repositories gpio

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

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

powered by: WebSVN 2.1.0

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