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

Subversion Repositories ac97

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

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

powered by: WebSVN 2.1.0

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