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

Subversion Repositories gpio

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

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

powered by: WebSVN 2.1.0

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