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

Subversion Repositories ac97

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

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

powered by: WebSVN 2.1.0

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