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

Subversion Repositories ac97

[/] [ac97/] [trunk/] [bench/] [verilog/] [test_bench_top.v] - Blame information for rev 12

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Top Level Test Bench                                       ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000 Rudolf Usselmann                         ////
15
////                    rudi@asics.ws                            ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39
//
40 12 rudi
//  $Id: test_bench_top.v,v 1.3 2002-03-11 03:21:12 rudi Exp $
41 7 rudi
//
42 12 rudi
//  $Date: 2002-03-11 03:21:12 $
43
//  $Revision: 1.3 $
44 7 rudi
//  $Author: rudi $
45
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50 12 rudi
//               Revision 1.2  2002/03/05 04:44:04  rudi
51
//
52
//               - Fixed the order of the thrash hold bits to match the spec.
53
//               - Many minor synthesis cleanup items ...
54
//
55 10 rudi
//               Revision 1.1  2002/02/13 08:22:32  rudi
56 7 rudi
//
57 10 rudi
//               Added test bench for public release
58 7 rudi
//
59 10 rudi
//
60
//
61 7 rudi
//                        
62
 
63
`include "ac97_defines.v"
64
 
65
module test;
66
 
67
reg             clk;
68
reg             rst;
69
wire    [31:0]   wb_data_i;
70
wire    [31:0]   wb_data_o;
71
wire    [31:0]   wb_addr_i;
72
wire    [3:0]    wb_sel_i;
73
wire            wb_we_i;
74
wire            wb_cyc_i;
75
wire            wb_stb_i;
76
wire            wb_ack_o;
77
wire            wb_err_o;
78
wire            int;
79
wire    [8:0]    dma_req;
80
reg     [8:0]    dma_ack;
81
reg             susp_req;
82
reg             resume_req;
83
wire            suspended;
84
reg             bit_clk;
85
wire            sync;
86
wire            sdata_out;
87
wire            sdata_in;
88
wire            ac97_reset_;
89
 
90
// Test Bench Variables
91
reg             verbose;
92
integer         error_cnt;
93
 
94
// DMA model
95
reg             wb_busy;
96
reg             oc0_dma_en;
97
reg             oc1_dma_en;
98
reg             oc2_dma_en;
99
reg             oc3_dma_en;
100
reg             oc4_dma_en;
101
reg             oc5_dma_en;
102
reg             ic0_dma_en;
103
reg             ic1_dma_en;
104
reg             ic2_dma_en;
105
reg     [31:0]   oc0_mem[0:256];
106
reg     [31:0]   oc1_mem[0:256];
107
reg     [31:0]   oc2_mem[0:256];
108
reg     [31:0]   oc3_mem[0:256];
109
reg     [31:0]   oc4_mem[0:256];
110
reg     [31:0]   oc5_mem[0:256];
111
reg     [31:0]   ic0_mem[0:256];
112
reg     [31:0]   ic1_mem[0:256];
113
reg     [31:0]   ic2_mem[0:256];
114
reg     [31:0]   reg_mem[0:256];
115
integer         oc0_ptr;
116
integer         oc1_ptr;
117
integer         oc2_ptr;
118
integer         oc3_ptr;
119
integer         oc4_ptr;
120
integer         oc5_ptr;
121
integer         ic0_ptr;
122
integer         ic1_ptr;
123
integer         ic2_ptr;
124
 
125 10 rudi
integer         oc0_th;
126
integer         oc1_th;
127
integer         oc2_th;
128
integer         oc3_th;
129
integer         oc4_th;
130
integer         oc5_th;
131
integer         ic0_th;
132
integer         ic1_th;
133
integer         ic2_th;
134
 
135 7 rudi
reg     [31:0]   ints_r;
136
reg             int_chk_en;
137 10 rudi
reg             int_ctrl_en;
138 7 rudi
integer         int_cnt;
139
 
140
integer         n;
141
 
142
// Misc Variables
143
reg     [31:0]   data;
144
reg     [31:0]   data1;
145
reg     [31:0]   data2;
146
reg     [31:0]   tmp;
147 12 rudi
integer         size, frames, m, p;
148 7 rudi
 
149
/////////////////////////////////////////////////////////////////////
150
//
151
// Defines 
152
//
153
 
154
`define CSR             8'h00
155
`define OCC0            8'h04
156
`define OCC1            8'h08
157
`define ICC             8'h0c
158
`define CRAC            8'h10
159
`define INTM            8'h14
160
`define INTS            8'h18
161
 
162
`define OC0             8'h20
163
`define OC1             8'h24
164
`define OC2             8'h28
165
`define OC3             8'h2c
166
`define OC4             8'h30
167
`define OC5             8'h34
168
`define IC0             8'h38
169
`define IC1             8'h3c
170
`define IC2             8'h40
171
 
172
/////////////////////////////////////////////////////////////////////
173
//
174
// Simulation Initialization and Start up Section
175
//
176
 
177
task do_rst;
178
 
179
begin
180
        wb_busy = 0;
181
        oc0_dma_en = 0;
182
        oc1_dma_en = 0;
183
        oc2_dma_en = 0;
184
        oc3_dma_en = 0;
185
        oc4_dma_en = 0;
186
        oc5_dma_en = 0;
187
        ic0_dma_en = 0;
188
        ic1_dma_en = 0;
189
        ic2_dma_en = 0;
190
 
191
        oc0_ptr = 0;
192
        oc1_ptr = 0;
193
        oc2_ptr = 0;
194
        oc3_ptr = 0;
195
        oc4_ptr = 0;
196
        oc5_ptr = 0;
197
        ic0_ptr = 0;
198
        ic1_ptr = 0;
199
        ic2_ptr = 0;
200
 
201
        rst = 0;
202
        repeat(48)      @(posedge clk);
203
        rst = 1;
204
        repeat(48)      @(posedge clk);
205
 
206
end
207
 
208
endtask
209
 
210
initial
211
   begin
212
        $display("\n\n");
213
        $display("*****************************************************");
214
        $display("* WISHBONE Memory Controller Simulation started ... *");
215
        $display("*****************************************************");
216
        $display("\n");
217
`ifdef WAVES
218
        $shm_open("waves");
219
        $shm_probe("AS",test,"AS");
220
        $display("INFO: Signal dump enabled ...\n\n");
221
`endif
222
        //wd_cnt = 0;
223
        int_chk_en = 1;
224 10 rudi
        int_ctrl_en = 0;
225 7 rudi
        int_cnt = 0;
226
        error_cnt = 0;
227
        clk = 1;
228
        bit_clk = 0;
229
        rst = 0;
230
        susp_req = 0;
231
        resume_req = 0;
232
        verbose = 1;
233
        dma_ack = 0;
234
 
235
        wb_busy = 0;
236
        oc0_dma_en = 0;
237
        oc1_dma_en = 0;
238
        oc2_dma_en = 0;
239
        oc3_dma_en = 0;
240
        oc4_dma_en = 0;
241
        oc5_dma_en = 0;
242
        ic0_dma_en = 0;
243
        ic1_dma_en = 0;
244
        ic2_dma_en = 0;
245
 
246
        oc0_ptr = 0;
247
        oc1_ptr = 0;
248
        oc2_ptr = 0;
249
        oc3_ptr = 0;
250
        oc4_ptr = 0;
251
        oc5_ptr = 0;
252
        ic0_ptr = 0;
253
        ic1_ptr = 0;
254
        ic2_ptr = 0;
255
 
256 12 rudi
 
257
        oc0_th = 4;
258
        oc1_th = 4;
259
        oc2_th = 4;
260
        oc3_th = 4;
261
        oc4_th = 4;
262
        oc5_th = 4;
263
        ic0_th = 4;
264
        ic1_th = 4;
265
        ic2_th = 4;
266
 
267
 
268
`ifdef AC97_OUT_FIFO_DEPTH_8
269
        oc0_th = oc0_th * 2;
270
        oc1_th = oc1_th * 2;
271
        oc2_th = oc2_th * 2;
272
        oc3_th = oc3_th * 2;
273
        oc4_th = oc4_th * 2;
274
        oc5_th = oc5_th * 2;
275
`endif
276
 
277
`ifdef AC97_OUT_FIFO_DEPTH_16
278
        oc0_th = oc0_th * 4;
279
        oc1_th = oc1_th * 4;
280
        oc2_th = oc2_th * 4;
281
        oc3_th = oc3_th * 4;
282
        oc4_th = oc4_th * 4;
283
        oc5_th = oc5_th * 4;
284
`endif
285
 
286
`ifdef AC97_IN_FIFO_DEPTH_8
287
        ic0_th = ic0_th * 2;
288
        ic1_th = ic1_th * 2;
289
        ic2_th = ic2_th * 2;
290
`endif
291
 
292
`ifdef AC97_IN_FIFO_DEPTH_16
293
        ic0_th = ic0_th * 4;
294
        ic1_th = ic1_th * 4;
295
        ic2_th = ic2_th * 4;
296
`endif
297
 
298
 
299
 
300 7 rudi
        repeat(48)      @(posedge clk);
301
        rst = 1;
302
        repeat(48)      @(posedge clk);
303
 
304
        // HERE IS WHERE THE TEST CASES GO ...
305
 
306 10 rudi
if(1)   // Full Regression Run
307 7 rudi
   begin
308
$display(" ......................................................");
309
$display(" :                                                    :");
310
$display(" :    Regression Run ...                              :");
311
$display(" :....................................................:");
312
 
313
        basic1;
314
 
315
        do_rst;
316
 
317
        basic2;
318
 
319
        do_rst;
320
 
321
        vsr1;
322
 
323 10 rudi
        vsr_int;
324
 
325 7 rudi
   end
326
else
327
if(1)   // Debug Tests
328
   begin
329
$display(" ......................................................");
330
$display(" :                                                    :");
331
$display(" :    Test Debug Testing ...                          :");
332
$display(" :....................................................:");
333
 
334 10 rudi
        //basic1;
335 7 rudi
 
336 10 rudi
        //do_rst;
337 7 rudi
 
338 10 rudi
        //basic2;
339 7 rudi
 
340 10 rudi
        //do_rst;
341 7 rudi
 
342 10 rudi
        //vsr1;
343 7 rudi
 
344 10 rudi
        vsr_int;
345
 
346 7 rudi
        repeat(100)     @(posedge clk);
347
        $finish;
348
   end
349
else
350
   begin
351
 
352
        //
353
        // TEST DEVELOPMENT AREA
354
        //
355
 
356
$display("\n\n");
357
$display("*****************************************************");
358
$display("*** XXX AC97 I/O Test ...                         ***");
359
$display("*****************************************************\n");
360
 
361
 
362
        wb_busy = 1;
363
        m0.wb_wr1(`INTM,4'hf, 32'h0000_0003);
364
        m0.wb_wr1(`OCC0,4'hf, 32'h7373_7373);
365
        m0.wb_wr1(`OCC1,4'hf, 32'h0000_7373);
366
        m0.wb_wr1(`ICC,4'hf, 32'h0073_7373);
367
        m0.wb_wr1(`OCC0,4'hf, 32'h7272_7272);
368
        m0.wb_wr1(`OCC1,4'hf, 32'h0000_7272);
369
 
370
        wb_busy = 0;
371
        oc0_dma_en = 1;
372
        oc1_dma_en = 1;
373
        oc2_dma_en = 1;
374
        oc3_dma_en = 1;
375
        oc4_dma_en = 1;
376
        oc5_dma_en = 1;
377
        ic0_dma_en = 1;
378
        ic1_dma_en = 1;
379
        ic2_dma_en = 1;
380
 
381
        for(n=0;n<256;n=n+1)
382
           begin
383
                oc0_mem[n] = $random;
384
                oc1_mem[n] = $random;
385
                oc2_mem[n] = $random;
386
                oc3_mem[n] = $random;
387
                oc4_mem[n] = $random;
388
                oc5_mem[n] = $random;
389
                ic0_mem[n] = $random;
390
                ic1_mem[n] = $random;
391
                ic2_mem[n] = $random;
392
           end
393
 
394
        u1.init(0);
395
        frames = 139;
396
 
397
fork
398
        u1.tx1( frames,                                 // Number of frames to process
399
                0,                                       // How many frames before codec is ready
400
                10'b1111_1111_11,                        // Output slots valid bits
401
                10'b1111_1111_11,                        // Input slots valid bits
402
                20'b00_00_00_00_00_00_00_00_00_00,       // Output Slots intervals
403
                20'b00_00_00_00_00_00_00_00_00_00        // Input Slots intervals
404
                );
405
 
406
        begin   // Do a register Write
407
                repeat(2)       @(posedge sync);
408
 
409
                for(n=0;n<75;n=n+1)
410
                   begin
411
                        @(negedge sync);
412
                        repeat(230)     @(posedge bit_clk);
413
 
414
                        repeat(n)       @(posedge bit_clk);
415
 
416
                        while(wb_busy)  @(posedge clk);
417
                        wb_busy = 1;
418
                        m0.wb_wr1(`CRAC,4'hf, {1'b1, 8'h0, n[6:0], 16'h1234 + n[7:0]} );
419
                        wb_busy = 0;
420
 
421
                        while(!int)     @(posedge clk);
422
 
423
                        while(wb_busy)  @(posedge clk);
424
                        wb_busy = 1;
425
                        m0.wb_rd1(`CRAC,4'hf, reg_mem[n] );
426
                        m0.wb_wr1(`CSR, 4'hf, 32'h0000_0001);
427
 
428
                        repeat(10)      @(posedge clk);
429
                        force bit_clk = 0;
430
                        repeat(80)      @(posedge clk);
431
 
432
                        m0.wb_wr1(`CSR, 4'hf, 32'h0000_0002);
433
 
434
                        repeat(300)     @(posedge clk);
435
 
436
                        release bit_clk;
437
 
438
                        wb_busy = 0;
439
 
440
                   end
441
        end
442
join
443
 
444
repeat(300)     @(posedge bit_clk);
445
 
446
        for(n=0;n<75;n=n+1)
447
           begin
448
 
449
                        tmp = u1.is2_mem[n];
450
                        data2 = {16'h0, tmp[19:4]};
451
                        tmp = reg_mem[n];
452
                        data1 = {16'h0, tmp[15:0]};
453
 
454
                if(     (data1 !== data2) |
455
                        (^data1 === 1'hx) |
456
                        (^data2 === 1'hx)
457
                        )
458
                   begin
459
                        $display("ERROR: Register Read Data %0d Mismatch Expected: %h Got: %h",
460
                        n, data2, data1);
461
                        error_cnt = error_cnt + 1;
462
                   end
463
 
464
           end
465
 
466
        size = frames - 4;
467
 
468
        for(n=0;n<size;n=n+1)
469
           begin
470
                data1 = u1.rs3_mem[n];
471
                data = oc0_mem[n[8:1]];
472
 
473
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
474
                else            data2 = {12'h0, data[31:16], 4'h0};
475
 
476
                if(     (data1 !== data2) |
477
                        (^data1 === 1'hx) |
478
                        (^data2 === 1'hx)
479
                        )
480
                   begin
481
                        $display("ERROR: Out. CH0 Sample %0d Mismatch Sent: %h Got: %h",
482
                        n, data2, data1);
483
                        error_cnt = error_cnt + 1;
484
                   end
485
           end
486
 
487
        for(n=0;n<size;n=n+1)
488
           begin
489
                data1 = u1.rs4_mem[n];
490
                data = oc1_mem[n[8:1]];
491
 
492
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
493
                else            data2 = {12'h0, data[31:16], 4'h0};
494
 
495
                if(     (data1 !== data2) |
496
                        (^data1 === 1'hx) |
497
                        (^data2 === 1'hx)
498
                        )
499
                   begin
500
                        $display("ERROR: Out. CH1 Sample %0d Mismatch Sent: %h Got: %h",
501
                        n, data2, data1);
502
                        error_cnt = error_cnt + 1;
503
                   end
504
           end
505
 
506
        for(n=0;n<size;n=n+1)
507
           begin
508
                data1 = u1.rs6_mem[n];
509
                data = oc2_mem[n[8:1]];
510
 
511
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
512
                else            data2 = {12'h0, data[31:16], 4'h0};
513
 
514
                if(     (data1 !== data2) |
515
                        (^data1 === 1'hx) |
516
                        (^data2 === 1'hx)
517
                        )
518
                   begin
519
                        $display("ERROR: Out. CH2 Sample %0d Mismatch Sent: %h Got: %h",
520
                        n, data2, data1);
521
                        error_cnt = error_cnt + 1;
522
                   end
523
           end
524
 
525
        for(n=0;n<size;n=n+1)
526
           begin
527
                data1 = u1.rs7_mem[n];
528
                data = oc3_mem[n[8:1]];
529
 
530
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
531
                else            data2 = {12'h0, data[31:16], 4'h0};
532
 
533
                if(     (data1 !== data2) |
534
                        (^data1 === 1'hx) |
535
                        (^data2 === 1'hx)
536
                        )
537
                   begin
538
                        $display("ERROR: Out. CH3 Sample %0d Mismatch Sent: %h Got: %h",
539
                        n, data2, data1);
540
                        error_cnt = error_cnt + 1;
541
                   end
542
           end
543
 
544
        for(n=0;n<size;n=n+1)
545
           begin
546
                data1 = u1.rs8_mem[n];
547
                data = oc4_mem[n[8:1]];
548
 
549
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
550
                else            data2 = {12'h0, data[31:16], 4'h0};
551
 
552
                if(     (data1 !== data2) |
553
                        (^data1 === 1'hx) |
554
                        (^data2 === 1'hx)
555
                        )
556
                   begin
557
                        $display("ERROR: Out. CH4 Sample %0d Mismatch Sent: %h Got: %h",
558
                        n, data2, data1);
559
                        error_cnt = error_cnt + 1;
560
                   end
561
           end
562
 
563
        for(n=0;n<size;n=n+1)
564
           begin
565
                data1 = u1.rs9_mem[n];
566
                data = oc5_mem[n[8:1]];
567
 
568
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
569
                else            data2 = {12'h0, data[31:16], 4'h0};
570
 
571
                if(     (data1 !== data2) |
572
                        (^data1 === 1'hx) |
573
                        (^data2 === 1'hx)
574
                        )
575
                   begin
576
                        $display("ERROR: Out. CH5 Sample %0d Mismatch Sent: %h Got: %h",
577
                        n, data2, data1);
578
                        error_cnt = error_cnt + 1;
579
                   end
580
           end
581
 
582
        for(n=0;n<size;n=n+1)
583
           begin
584
                data1 = u1.is3_mem[n];
585
                data = ic0_mem[n[8:1]];
586
 
587
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
588
                else            data2 = {12'h0, data[31:16], 4'h0};
589
 
590
                if(     (data1 !== data2) |
591
                        (^data1 === 1'hx) |
592
                        (^data2 === 1'hx)
593
                        )
594
                   begin
595
                        $display("ERROR: In. CH0 Sample %0d Mismatch Sent: %h Got: %h",
596
                        n, data2, data1);
597
                        error_cnt = error_cnt + 1;
598
                   end
599
           end
600
 
601
        for(n=0;n<size;n=n+1)
602
           begin
603
                data1 = u1.is4_mem[n];
604
                data = ic1_mem[n[8:1]];
605
 
606
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
607
                else            data2 = {12'h0, data[31:16], 4'h0};
608
 
609
                if(     (data1 !== data2) |
610
                        (^data1 === 1'hx) |
611
                        (^data2 === 1'hx)
612
                        )
613
                   begin
614
                        $display("ERROR: In. CH1 Sample %0d Mismatch Sent: %h Got: %h",
615
                        n, data2, data1);
616
                        error_cnt = error_cnt + 1;
617
                   end
618
           end
619
 
620
        for(n=0;n<size;n=n+1)
621
           begin
622
                data1 = u1.is6_mem[n];
623
                data = ic2_mem[n[8:1]];
624
 
625
                if(~n[0])        data2 = {12'h0, data[15:0], 4'h0};
626
                else            data2 = {12'h0, data[31:16], 4'h0};
627
 
628
                if(     (data1 !== data2) |
629
                        (^data1 === 1'hx) |
630
                        (^data2 === 1'hx)
631
                        )
632
                   begin
633
                        $display("ERROR: In. CH2 Sample %0d Mismatch Sent: %h Got: %h",
634
                        n, data2, data1);
635
                        error_cnt = error_cnt + 1;
636
                   end
637
           end
638
 
639
show_errors;
640
$display("*****************************************************");
641
$display("*** Test DONE ...                                 ***");
642
$display("*****************************************************\n\n");
643
 
644
 
645
repeat(6000)    @(posedge clk);
646
$finish;
647
 
648
   end
649
 
650
        repeat(100)     @(posedge clk);
651
        $finish;
652
   end
653
 
654
 
655
task wait_sync;
656
 
657
begin
658
 
659
while(!sync)    @(posedge bit_clk);
660
repeat(2)       @(posedge bit_clk);
661
end
662
endtask
663
 
664
/////////////////////////////////////////////////////////////////////
665
//
666
// Simple Interrupt Handler
667
//
668
 
669
always @(posedge clk)
670 10 rudi
begin
671 7 rudi
if(int & int_chk_en)
672
   begin
673
        while(wb_busy)  @(posedge clk);
674
        wb_busy = 1;
675
        m0.wb_rd1(`INTS,4'hf, ints_r);
676
        //$display("INFO: Got Interrupt (%0d). INTS: %h (%t)", int_cnt, ints_r, $time);
677
        wb_busy = 0;
678
        int_cnt = int_cnt + 1;
679
   end
680 10 rudi
if(int & int_ctrl_en)
681
   begin
682 7 rudi
 
683 10 rudi
        while(wb_busy)  @(posedge clk);
684
        wb_busy = 1;
685
        m0.wb_rd1(`INTS,4'hf, ints_r);
686
        //$display("INFO: Got Interrupt (%0d). INTS: %h (%t)", int_cnt, ints_r, $time);
687
 
688
        out_chan_int_handl(ints_r[04:02],0);
689
        out_chan_int_handl(ints_r[07:05],1);
690
        out_chan_int_handl(ints_r[10:08],2);
691
        out_chan_int_handl(ints_r[13:11],3);
692
        out_chan_int_handl(ints_r[16:14],4);
693
        out_chan_int_handl(ints_r[19:17],5);
694
 
695
        in_chan_int_handl(ints_r[22:20],0);
696
        in_chan_int_handl(ints_r[25:23],1);
697
        in_chan_int_handl(ints_r[28:26],2);
698
 
699
        m0.wb_rd1(`INTS,4'hf, ints_r);
700
        wb_busy = 0;
701
        int_cnt = int_cnt + 1;
702
   end
703
end
704
 
705
 
706
task out_chan_int_handl;
707
input   [2:0]    int_r;
708
input           ch;
709
 
710
reg     [2:0]    int_r;
711
integer         ch;
712
integer         p;
713
 
714
begin
715
 
716
        if(int_r[0])     // Output Channel at Thrash hold
717
           begin
718
                case(ch)
719
                0: begin
720
                        for(p=0;p<oc0_th;p=p+1)
721
                                m0.wb_wr1(`OC0,4'hf, oc0_mem[oc0_ptr+p] );
722
                        oc0_ptr = oc0_ptr + oc0_th;
723
                   end
724
                1: begin
725
                        for(p=0;p<oc1_th;p=p+1)
726
                                m0.wb_wr1(`OC1,4'hf, oc1_mem[oc1_ptr+p] );
727
                        oc1_ptr = oc1_ptr + oc1_th;
728
                   end
729
                2: begin
730
                        for(p=0;p<oc2_th;p=p+1)
731
                                m0.wb_wr1(`OC2,4'hf, oc2_mem[oc2_ptr+p] );
732
                        oc2_ptr = oc2_ptr + oc2_th;
733
                   end
734
                3: begin
735
                        for(p=0;p<oc3_th;p=p+1)
736
                                m0.wb_wr1(`OC3,4'hf, oc3_mem[oc3_ptr+p] );
737
                        oc3_ptr = oc3_ptr + oc3_th;
738
                   end
739
                4: begin
740
                        for(p=0;p<oc4_th;p=p+1)
741
                                m0.wb_wr1(`OC4,4'hf, oc4_mem[oc4_ptr+p] );
742
                        oc4_ptr = oc4_ptr + oc4_th;
743
                   end
744
                5: begin
745
                        for(p=0;p<oc5_th;p=p+1)
746
                                m0.wb_wr1(`OC5,4'hf, oc5_mem[oc5_ptr+p] );
747
                        oc5_ptr = oc5_ptr + oc5_th;
748
                   end
749
                endcase
750
           end
751
        if(int_r[1])    // Output Channel FIFO Underrun
752
                $display("ERROR: Output Channel %0d FIFO Underrun", ch);
753
 
754
        if(int_r[2])    // Output Channel FIFO Overun
755
                $display("ERROR: Output Channel %0d FIFO Ovverun", ch);
756
end
757
endtask
758
 
759
 
760
 
761
task in_chan_int_handl;
762
input   [2:0]    int_r;
763
input           ch;
764
 
765
reg     [2:0]    int_r;
766
integer         ch;
767
integer         p;
768
 
769
begin
770
        if(int_r[0])     // Input Channel at Thrash hold
771
           begin
772
                case(ch)
773
                0: begin
774
                        for(p=0;p<ic0_th;p=p+1)
775
                                m0.wb_rd1(`IC0,4'hf, ic0_mem[ic0_ptr+p] );
776
                        ic0_ptr = ic0_ptr + ic0_th;
777
                   end
778
                1: begin
779
                        for(p=0;p<ic1_th;p=p+1)
780
                                m0.wb_rd1(`IC1,4'hf, ic1_mem[ic1_ptr+p] );
781
                        ic1_ptr = ic1_ptr + ic1_th;
782
                   end
783
                2: begin
784
                        for(p=0;p<ic2_th;p=p+1)
785
                                m0.wb_rd1(`IC2,4'hf, ic2_mem[ic2_ptr+p] );
786
                        ic2_ptr = ic2_ptr + ic2_th;
787
                   end
788
                endcase
789
           end
790
        if(int_r[1])    // Input Channel FIFO Underrun
791
                $display("ERROR: Input Channel %0d FIFO Underrun", ch);
792
 
793
        if(int_r[2])    // Input Channel FIFO Overun
794
                $display("ERROR: Input Channel %0d FIFO Ovverun", ch);
795
end
796
endtask
797
 
798
 
799
 
800 7 rudi
/////////////////////////////////////////////////////////////////////
801
//
802
// Simple DMA Engine
803
//
804
 
805
always @(posedge clk)
806
if(oc0_dma_en & dma_req[0])
807
   begin
808
        while(wb_busy)  @(posedge clk);
809
        wb_busy = 1;
810 12 rudi
 
811
        for(p=0;p<oc0_th;p=p+1)
812
                m0.wb_wr1(`OC0,4'hf, oc0_mem[oc0_ptr+p] );
813
        oc0_ptr = oc0_ptr + oc0_th;
814
 
815 7 rudi
        wb_busy = 0;
816
        dma_ack[0] = 1;
817
        @(posedge clk);
818
        #1 dma_ack[0] = 0;
819
   end
820
 
821
 
822
always @(posedge clk)
823
if(oc1_dma_en & dma_req[1])
824
   begin
825
        while(wb_busy)  @(posedge clk);
826
        wb_busy = 1;
827 12 rudi
        for(p=0;p<oc1_th;p=p+1)
828
                m0.wb_wr1(`OC1,4'hf, oc1_mem[oc1_ptr+p] );
829
        oc1_ptr = oc1_ptr + oc1_th;
830 7 rudi
        wb_busy = 0;
831
        dma_ack[1] = 1;
832
        @(posedge clk);
833
        #1 dma_ack[1] = 0;
834
   end
835
 
836
always @(posedge clk)
837
if(oc2_dma_en & dma_req[2])
838
   begin
839
        while(wb_busy)  @(posedge clk);
840
        wb_busy = 1;
841 12 rudi
        for(p=0;p<oc2_th;p=p+1)
842
                m0.wb_wr1(`OC2,4'hf, oc2_mem[oc2_ptr+p] );
843
        oc2_ptr = oc2_ptr + oc2_th;
844 7 rudi
        wb_busy = 0;
845
        dma_ack[2] = 1;
846
        @(posedge clk);
847
        #1 dma_ack[2] = 0;
848
   end
849
 
850
always @(posedge clk)
851
if(oc3_dma_en & dma_req[3])
852
   begin
853
        while(wb_busy)  @(posedge clk);
854
        wb_busy = 1;
855 12 rudi
        for(p=0;p<oc3_th;p=p+1)
856
                m0.wb_wr1(`OC3,4'hf, oc3_mem[oc3_ptr+p] );
857
        oc3_ptr = oc3_ptr + oc3_th;
858 7 rudi
        wb_busy = 0;
859
        dma_ack[3] = 1;
860
        @(posedge clk);
861
        #1 dma_ack[3] = 0;
862
   end
863
 
864
always @(posedge clk)
865
if(oc4_dma_en & dma_req[4])
866
   begin
867
        while(wb_busy)  @(posedge clk);
868
        wb_busy = 1;
869 12 rudi
        for(p=0;p<oc4_th;p=p+1)
870
                m0.wb_wr1(`OC4,4'hf, oc4_mem[oc4_ptr+p] );
871
        oc4_ptr = oc4_ptr + oc4_th;
872 7 rudi
        wb_busy = 0;
873
        dma_ack[4] = 1;
874
        @(posedge clk);
875
        #1 dma_ack[4] = 0;
876
   end
877
 
878
always @(posedge clk)
879
if(oc5_dma_en & dma_req[5])
880
   begin
881
        while(wb_busy)  @(posedge clk);
882
        wb_busy = 1;
883 12 rudi
        for(p=0;p<oc5_th;p=p+1)
884
                m0.wb_wr1(`OC5,4'hf, oc5_mem[oc5_ptr+p] );
885
        oc5_ptr = oc5_ptr + oc5_th;
886 7 rudi
        wb_busy = 0;
887
        dma_ack[5] = 1;
888
        @(posedge clk);
889
        #1 dma_ack[5] = 0;
890
   end
891
 
892
always @(posedge clk)
893
if(ic0_dma_en & dma_req[6])
894
   begin
895
        while(wb_busy)  @(posedge clk);
896
        wb_busy = 1;
897 12 rudi
        for(p=0;p<ic0_th;p=p+1)
898
                m0.wb_rd1(`IC0,4'hf, ic0_mem[ic0_ptr+p] );
899
        ic0_ptr = ic0_ptr + ic0_th;
900 7 rudi
        wb_busy = 0;
901
        dma_ack[6] = 1;
902
        @(posedge clk);
903
        #1 dma_ack[6] = 0;
904
   end
905
 
906
always @(posedge clk)
907
if(ic1_dma_en & dma_req[7])
908
   begin
909
        while(wb_busy)  @(posedge clk);
910
        wb_busy = 1;
911 12 rudi
        for(p=0;p<ic1_th;p=p+1)
912
                m0.wb_rd1(`IC1,4'hf, ic1_mem[ic1_ptr+p] );
913
        ic1_ptr = ic1_ptr + ic1_th;
914 7 rudi
        wb_busy = 0;
915
        dma_ack[7] = 1;
916
        @(posedge clk);
917
        #1 dma_ack[7] = 0;
918
   end
919
 
920
always @(posedge clk)
921
if(ic2_dma_en & dma_req[8])
922
   begin
923
        while(wb_busy)  @(posedge clk);
924
        wb_busy = 1;
925 12 rudi
        for(p=0;p<ic2_th;p=p+1)
926
                m0.wb_rd1(`IC2,4'hf, ic2_mem[ic2_ptr+p] );
927
        ic2_ptr = ic2_ptr + ic2_th;
928 7 rudi
        wb_busy = 0;
929
        dma_ack[8] = 1;
930
        @(posedge clk);
931
        #1 dma_ack[8] = 0;
932
   end
933
 
934
 
935
 
936
 
937
/////////////////////////////////////////////////////////////////////
938
//
939
// Clock Generation
940
//
941
 
942
always #2.5     clk = ~clk;
943 10 rudi
//always #15    clk = ~clk;
944 7 rudi
 
945
always #40.69   bit_clk <= ~bit_clk;
946
 
947
 
948
/////////////////////////////////////////////////////////////////////
949
//
950
// WISHBONE AC 97 Controller IP Core
951
//
952
 
953
ac97_top        u0(
954
                .clk_i(         clk             ),
955
                .rst_i(         rst             ),
956
                .wb_data_i(     wb_data_i       ),
957
                .wb_data_o(     wb_data_o       ),
958
                .wb_addr_i(     wb_addr_i       ),
959
                .wb_sel_i(      wb_sel_i        ),
960
                .wb_we_i(       wb_we_i         ),
961
                .wb_cyc_i(      wb_cyc_i        ),
962
                .wb_stb_i(      wb_stb_i        ),
963
                .wb_ack_o(      wb_ack_o        ),
964
                .wb_err_o(      wb_err_o        ),
965
                .int_o(         int             ),
966
                .dma_req_o(     dma_req         ),
967
                .dma_ack_i(     dma_ack         ),
968
                .suspended_o(   suspended       ),
969
                .bit_clk_pad_i( bit_clk         ),
970
                .sync_pad_o(    sync            ),
971
                .sdata_pad_o(   sdata_out       ),
972
                .sdata_pad_i(   sdata_in        ),
973
                .ac97_reset_pad_o_(     ac97_reset_     )
974
                );
975
 
976
/////////////////////////////////////////////////////////////////////
977
//
978
// WISHBONE Master Model
979
//
980
 
981
wb_mast m0(     .clk(           clk             ),
982
                .rst(           rst             ),
983
                .adr(           wb_addr_i       ),
984
                .din(           wb_data_o       ),
985
                .dout(          wb_data_i       ),
986
                .cyc(           wb_cyc_i        ),
987
                .stb(           wb_stb_i        ),
988
                .sel(           wb_sel_i        ),
989
                .we(            wb_we_i         ),
990
                .ack(           wb_ack_o        ),
991
                .err(           wb_err_o        ),
992
                .rty(                           )
993
                );
994
 
995
/////////////////////////////////////////////////////////////////////
996
//
997
// AC 97 Codec Model
998
//
999
 
1000
 
1001
ac97_codec_top  u1(
1002
                .clk(           bit_clk         ),
1003
                .rst(           rst             ),
1004
                .sync(          sync            ),
1005
                .sdata_out(     sdata_in        ),
1006
                .sdata_in(      sdata_out       )
1007
                );
1008
 
1009
 
1010
 
1011
/////////////////////////////////////////////////////////////////////
1012
//
1013
// Tests and libraries
1014
//
1015
 
1016
 
1017
`include "tests.v"
1018
 
1019
endmodule
1020
 
1021
 

powered by: WebSVN 2.1.0

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