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

Subversion Repositories gpio

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

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

powered by: WebSVN 2.1.0

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