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

Subversion Repositories ac97

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 6 to Rev 7
    Reverse comparison

Rev 6 → Rev 7

/trunk/bench/verilog/wb_mast_model.v
0,0 → 1,582
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE Master Model ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: wb_mast_model.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
//
 
`include "wb_model_defines.v"
 
module wb_mast(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);
 
input clk, rst;
output [31:0] adr;
input [31:0] din;
output [31:0] dout;
output cyc, stb;
output [3:0] sel;
output we;
input ack, err, rty;
 
////////////////////////////////////////////////////////////////////
//
// Local Wires
//
 
parameter mem_size = 4096;
 
reg [31:0] adr;
reg [31:0] dout;
reg cyc, stb;
reg [3:0] sel;
reg we;
 
reg [31:0] rd_mem[mem_size:0];
reg [31:0] wr_mem[mem_size:0];
integer rd_cnt;
integer wr_cnt;
 
////////////////////////////////////////////////////////////////////
//
// Memory Logic
//
 
initial
begin
//adr = 32'hxxxx_xxxx;
//adr = 0;
adr = 32'hffff_ffff;
dout = 32'hxxxx_xxxx;
cyc = 0;
stb = 0;
sel = 4'hx;
we = 1'hx;
rd_cnt = 0;
wr_cnt = 0;
#1;
$display("\nINFO: WISHBONE MASTER MODEL INSTANTIATED (%m)\n");
end
 
 
 
task mem_fill;
 
integer n;
begin
rd_cnt = 0;
wr_cnt = 0;
for(n=0;n<mem_size;n=n+1)
begin
rd_mem[n] = $random;
wr_mem[n] = $random;
end
end
endtask
 
////////////////////////////////////////////////////////////////////
//
// Write 1 Word Task
//
 
task wb_wr1;
input [31:0] a;
input [3:0] s;
input [31:0] d;
 
begin
 
@(posedge clk);
#1;
adr = a;
dout = d;
cyc = 1;
stb = 1;
we=1;
sel = s;
 
@(posedge clk);
while(~ack & ~err) @(posedge clk);
#1;
cyc=0;
stb=0;
adr = 32'hxxxx_xxxx;
//adr = 32'hffff_ffff;
//adr = 0;
dout = 32'hxxxx_xxxx;
we = 1'hx;
sel = 4'hx;
 
end
endtask
 
////////////////////////////////////////////////////////////////////
//
// Write 4 Words Task
//
 
task wb_wr4;
input [31:0] a;
input [3:0] s;
input delay;
input [31:0] d1;
input [31:0] d2;
input [31:0] d3;
input [31:0] d4;
 
integer delay;
 
begin
 
@(posedge clk);
#1;
cyc = 1;
sel = s;
 
repeat(delay)
begin
@(posedge clk);
#1;
end
adr = a;
dout = d1;
stb = 1;
we=1;
while(~ack & ~err) @(posedge clk);
#2;
stb=0;
we=1'bx;
dout = 32'hxxxx_xxxx;
 
 
repeat(delay)
begin
@(posedge clk);
#1;
end
stb=1;
//adr = a+4;
dout = d2;
we=1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
#2;
stb=0;
we=1'bx;
dout = 32'hxxxx_xxxx;
 
repeat(delay)
begin
@(posedge clk);
#1;
end
stb=1;
//adr = a+8;
dout = d3;
we=1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
#2;
stb=0;
we=1'bx;
dout = 32'hxxxx_xxxx;
 
repeat(delay)
begin
@(posedge clk);
#1;
end
stb=1;
//adr = a+12;
dout = d4;
we=1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
#1;
stb=0;
cyc=0;
 
adr = 32'hxxxx_xxxx;
//adr = 0;
//adr = 32'hffff_ffff;
dout = 32'hxxxx_xxxx;
we = 1'hx;
sel = 4'hx;
 
end
endtask
 
 
task wb_wr_mult;
input [31:0] a;
input [3:0] s;
input delay;
input count;
 
integer delay;
integer count;
integer n;
 
begin
 
@(posedge clk);
#1;
cyc = 1;
 
for(n=0;n<count;n=n+1)
begin
repeat(delay)
begin
@(posedge clk);
#1;
end
adr = a + (n*4);
dout = wr_mem[n + wr_cnt];
stb = 1;
we=1;
sel = s;
if(n!=0) @(posedge clk);
while(~ack & ~err) @(posedge clk);
#2;
stb=0;
we=1'bx;
sel = 4'hx;
dout = 32'hxxxx_xxxx;
adr = 32'hxxxx_xxxx;
end
 
cyc=0;
 
adr = 32'hxxxx_xxxx;
//adr = 32'hffff_ffff;
 
wr_cnt = wr_cnt + count;
end
endtask
 
 
task wb_rmw;
input [31:0] a;
input [3:0] s;
input delay;
input rcount;
input wcount;
 
integer delay;
integer rcount;
integer wcount;
integer n;
 
begin
 
@(posedge clk);
#1;
cyc = 1;
we = 0;
sel = s;
repeat(delay) @(posedge clk);
 
for(n=0;n<rcount-1;n=n+1)
begin
adr = a + (n*4);
stb = 1;
while(~ack & ~err) @(posedge clk);
rd_mem[n + rd_cnt] = din;
//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );
#2;
stb=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hxxxx_xxxx;
repeat(delay)
begin
@(posedge clk);
#1;
end
we = 0;
sel = s;
end
 
adr = a+(n*4);
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
rd_mem[n + rd_cnt] = din;
//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );
#1;
stb=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hxxxx_xxxx;
 
rd_cnt = rd_cnt + rcount;
 
//@(posedge clk);
 
 
for(n=0;n<wcount;n=n+1)
begin
repeat(delay)
begin
@(posedge clk);
#1;
end
adr = a + (n*4);
dout = wr_mem[n + wr_cnt];
stb = 1;
we=1;
sel = s;
// if(n!=0)
@(posedge clk);
while(~ack & ~err) @(posedge clk);
#2;
stb=0;
we=1'bx;
sel = 4'hx;
dout = 32'hxxxx_xxxx;
adr = 32'hxxxx_xxxx;
end
 
cyc=0;
 
adr = 32'hxxxx_xxxx;
//adr = 32'hffff_ffff;
 
wr_cnt = wr_cnt + wcount;
end
endtask
 
 
 
////////////////////////////////////////////////////////////////////
//
// Read 1 Word Task
//
 
task wb_rd1;
input [31:0] a;
input [3:0] s;
output [31:0] d;
 
begin
 
@(posedge clk);
#1;
adr = a;
cyc = 1;
stb = 1;
we = 0;
sel = s;
 
//@(posedge clk);
while(~ack & ~err) @(posedge clk);
d = din;
#1;
cyc=0;
stb=0;
//adr = 32'hxxxx_xxxx;
//adr = 0;
adr = 32'hffff_ffff;
dout = 32'hxxxx_xxxx;
we = 1'hx;
sel = 4'hx;
 
end
endtask
 
 
////////////////////////////////////////////////////////////////////
//
// Read 4 Words Task
//
 
 
task wb_rd4;
input [31:0] a;
input [3:0] s;
input delay;
output [31:0] d1;
output [31:0] d2;
output [31:0] d3;
output [31:0] d4;
 
integer delay;
begin
 
@(posedge clk);
#1;
cyc = 1;
we = 0;
sel = s;
repeat(delay) @(posedge clk);
 
adr = a;
stb = 1;
while(~ack & ~err) @(posedge clk);
d1 = din;
#2;
stb=0;
we = 1'hx;
sel = 4'hx;
repeat(delay)
begin
@(posedge clk);
#1;
end
we = 0;
sel = s;
 
//adr = a+4;
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
d2 = din;
#2;
stb=0;
we = 1'hx;
sel = 4'hx;
repeat(delay)
begin
@(posedge clk);
#1;
end
we = 0;
sel = s;
 
 
//adr = a+8;
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
d3 = din;
#2;
stb=0;
we = 1'hx;
sel = 4'hx;
repeat(delay)
begin
@(posedge clk);
#1;
end
we = 0;
sel = s;
 
//adr = a+12;
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
d4 = din;
#1;
stb=0;
cyc=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hffff_ffff;
end
endtask
 
 
 
task wb_rd_mult;
input [31:0] a;
input [3:0] s;
input delay;
input count;
 
integer delay;
integer count;
integer n;
 
begin
 
@(posedge clk);
#1;
cyc = 1;
we = 0;
sel = s;
repeat(delay) @(posedge clk);
 
for(n=0;n<count-1;n=n+1)
begin
adr = a + (n*4);
stb = 1;
while(~ack & ~err) @(posedge clk);
rd_mem[n + rd_cnt] = din;
#2;
stb=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hxxxx_xxxx;
repeat(delay)
begin
@(posedge clk);
#1;
end
we = 0;
sel = s;
end
 
adr = a+(n*4);
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
rd_mem[n + rd_cnt] = din;
#1;
stb=0;
cyc=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hffff_ffff;
adr = 32'hxxxx_xxxx;
 
rd_cnt = rd_cnt + count;
end
endtask
 
endmodule
/trunk/bench/verilog/test_bench_top.v
0,0 → 1,847
/////////////////////////////////////////////////////////////////////
//// ////
//// Top Level Test Bench ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: test_bench_top.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
 
`include "ac97_defines.v"
 
module test;
 
reg clk;
reg rst;
wire [31:0] wb_data_i;
wire [31:0] wb_data_o;
wire [31:0] wb_addr_i;
wire [3:0] wb_sel_i;
wire wb_we_i;
wire wb_cyc_i;
wire wb_stb_i;
wire wb_ack_o;
wire wb_err_o;
wire int;
wire [8:0] dma_req;
reg [8:0] dma_ack;
reg susp_req;
reg resume_req;
wire suspended;
reg bit_clk;
wire sync;
wire sdata_out;
wire sdata_in;
wire ac97_reset_;
 
// Test Bench Variables
reg verbose;
integer error_cnt;
 
// DMA model
reg wb_busy;
reg oc0_dma_en;
reg oc1_dma_en;
reg oc2_dma_en;
reg oc3_dma_en;
reg oc4_dma_en;
reg oc5_dma_en;
reg ic0_dma_en;
reg ic1_dma_en;
reg ic2_dma_en;
reg [31:0] oc0_mem[0:256];
reg [31:0] oc1_mem[0:256];
reg [31:0] oc2_mem[0:256];
reg [31:0] oc3_mem[0:256];
reg [31:0] oc4_mem[0:256];
reg [31:0] oc5_mem[0:256];
reg [31:0] ic0_mem[0:256];
reg [31:0] ic1_mem[0:256];
reg [31:0] ic2_mem[0:256];
reg [31:0] reg_mem[0:256];
integer oc0_ptr;
integer oc1_ptr;
integer oc2_ptr;
integer oc3_ptr;
integer oc4_ptr;
integer oc5_ptr;
integer ic0_ptr;
integer ic1_ptr;
integer ic2_ptr;
 
reg [31:0] ints_r;
reg int_chk_en;
integer int_cnt;
 
integer n;
 
// Misc Variables
reg [31:0] data;
reg [31:0] data1;
reg [31:0] data2;
reg [31:0] tmp;
integer size, frames, m;
 
/////////////////////////////////////////////////////////////////////
//
// Defines
//
 
`define CSR 8'h00
`define OCC0 8'h04
`define OCC1 8'h08
`define ICC 8'h0c
`define CRAC 8'h10
`define INTM 8'h14
`define INTS 8'h18
 
`define OC0 8'h20
`define OC1 8'h24
`define OC2 8'h28
`define OC3 8'h2c
`define OC4 8'h30
`define OC5 8'h34
`define IC0 8'h38
`define IC1 8'h3c
`define IC2 8'h40
 
/////////////////////////////////////////////////////////////////////
//
// Simulation Initialization and Start up Section
//
 
task do_rst;
 
begin
wb_busy = 0;
oc0_dma_en = 0;
oc1_dma_en = 0;
oc2_dma_en = 0;
oc3_dma_en = 0;
oc4_dma_en = 0;
oc5_dma_en = 0;
ic0_dma_en = 0;
ic1_dma_en = 0;
ic2_dma_en = 0;
 
oc0_ptr = 0;
oc1_ptr = 0;
oc2_ptr = 0;
oc3_ptr = 0;
oc4_ptr = 0;
oc5_ptr = 0;
ic0_ptr = 0;
ic1_ptr = 0;
ic2_ptr = 0;
 
rst = 0;
repeat(48) @(posedge clk);
rst = 1;
repeat(48) @(posedge clk);
 
end
 
endtask
 
initial
begin
$display("\n\n");
$display("*****************************************************");
$display("* WISHBONE Memory Controller Simulation started ... *");
$display("*****************************************************");
$display("\n");
`ifdef WAVES
$shm_open("waves");
$shm_probe("AS",test,"AS");
$display("INFO: Signal dump enabled ...\n\n");
`endif
//wd_cnt = 0;
int_chk_en = 1;
int_cnt = 0;
error_cnt = 0;
clk = 1;
bit_clk = 0;
rst = 0;
susp_req = 0;
resume_req = 0;
verbose = 1;
dma_ack = 0;
 
wb_busy = 0;
oc0_dma_en = 0;
oc1_dma_en = 0;
oc2_dma_en = 0;
oc3_dma_en = 0;
oc4_dma_en = 0;
oc5_dma_en = 0;
ic0_dma_en = 0;
ic1_dma_en = 0;
ic2_dma_en = 0;
 
oc0_ptr = 0;
oc1_ptr = 0;
oc2_ptr = 0;
oc3_ptr = 0;
oc4_ptr = 0;
oc5_ptr = 0;
ic0_ptr = 0;
ic1_ptr = 0;
ic2_ptr = 0;
 
repeat(48) @(posedge clk);
rst = 1;
repeat(48) @(posedge clk);
 
// HERE IS WHERE THE TEST CASES GO ...
 
if(0) // Full Regression Run
begin
$display(" ......................................................");
$display(" : :");
$display(" : Regression Run ... :");
$display(" :....................................................:");
 
basic1;
 
do_rst;
 
basic2;
 
do_rst;
 
vsr1;
 
end
else
if(1) // Debug Tests
begin
$display(" ......................................................");
$display(" : :");
$display(" : Test Debug Testing ... :");
$display(" :....................................................:");
 
basic1;
 
do_rst;
 
basic2;
 
do_rst;
 
vsr1;
 
repeat(100) @(posedge clk);
$finish;
end
else
begin
 
//
// TEST DEVELOPMENT AREA
//
 
$display("\n\n");
$display("*****************************************************");
$display("*** XXX AC97 I/O Test ... ***");
$display("*****************************************************\n");
 
 
wb_busy = 1;
m0.wb_wr1(`INTM,4'hf, 32'h0000_0003);
m0.wb_wr1(`OCC0,4'hf, 32'h7373_7373);
m0.wb_wr1(`OCC1,4'hf, 32'h0000_7373);
m0.wb_wr1(`ICC,4'hf, 32'h0073_7373);
m0.wb_wr1(`OCC0,4'hf, 32'h7272_7272);
m0.wb_wr1(`OCC1,4'hf, 32'h0000_7272);
 
wb_busy = 0;
oc0_dma_en = 1;
oc1_dma_en = 1;
oc2_dma_en = 1;
oc3_dma_en = 1;
oc4_dma_en = 1;
oc5_dma_en = 1;
ic0_dma_en = 1;
ic1_dma_en = 1;
ic2_dma_en = 1;
 
for(n=0;n<256;n=n+1)
begin
oc0_mem[n] = $random;
oc1_mem[n] = $random;
oc2_mem[n] = $random;
oc3_mem[n] = $random;
oc4_mem[n] = $random;
oc5_mem[n] = $random;
ic0_mem[n] = $random;
ic1_mem[n] = $random;
ic2_mem[n] = $random;
end
 
u1.init(0);
frames = 139;
 
fork
u1.tx1( frames, // Number of frames to process
0, // How many frames before codec is ready
10'b1111_1111_11, // Output slots valid bits
10'b1111_1111_11, // Input slots valid bits
20'b00_00_00_00_00_00_00_00_00_00, // Output Slots intervals
20'b00_00_00_00_00_00_00_00_00_00 // Input Slots intervals
);
 
begin // Do a register Write
repeat(2) @(posedge sync);
 
for(n=0;n<75;n=n+1)
begin
@(negedge sync);
repeat(230) @(posedge bit_clk);
 
repeat(n) @(posedge bit_clk);
 
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr1(`CRAC,4'hf, {1'b1, 8'h0, n[6:0], 16'h1234 + n[7:0]} );
wb_busy = 0;
 
while(!int) @(posedge clk);
 
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd1(`CRAC,4'hf, reg_mem[n] );
m0.wb_wr1(`CSR, 4'hf, 32'h0000_0001);
 
repeat(10) @(posedge clk);
force bit_clk = 0;
repeat(80) @(posedge clk);
 
m0.wb_wr1(`CSR, 4'hf, 32'h0000_0002);
 
repeat(300) @(posedge clk);
 
release bit_clk;
 
wb_busy = 0;
 
end
end
join
 
repeat(300) @(posedge bit_clk);
 
for(n=0;n<75;n=n+1)
begin
 
tmp = u1.is2_mem[n];
data2 = {16'h0, tmp[19:4]};
tmp = reg_mem[n];
data1 = {16'h0, tmp[15:0]};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Register Read Data %0d Mismatch Expected: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
 
end
 
size = frames - 4;
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs3_mem[n];
data = oc0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs4_mem[n];
data = oc1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs6_mem[n];
data = oc2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs7_mem[n];
data = oc3_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH3 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs8_mem[n];
data = oc4_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH4 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs9_mem[n];
data = oc5_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH5 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is3_mem[n];
data = ic0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is4_mem[n];
data = ic1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is6_mem[n];
data = ic2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
 
repeat(6000) @(posedge clk);
$finish;
 
end
 
repeat(100) @(posedge clk);
$finish;
end
 
 
task wait_sync;
 
begin
 
while(!sync) @(posedge bit_clk);
repeat(2) @(posedge bit_clk);
end
endtask
 
/////////////////////////////////////////////////////////////////////
//
// Simple Interrupt Handler
//
 
always @(posedge clk)
if(int & int_chk_en)
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd1(`INTS,4'hf, ints_r);
//$display("INFO: Got Interrupt (%0d). INTS: %h (%t)", int_cnt, ints_r, $time);
wb_busy = 0;
int_cnt = int_cnt + 1;
end
 
/////////////////////////////////////////////////////////////////////
//
// Simple DMA Engine
//
 
always @(posedge clk)
if(oc0_dma_en & dma_req[0])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC0, 4'hf, 0, oc0_mem[oc0_ptr+0],
oc0_mem[oc0_ptr+1],
oc0_mem[oc0_ptr+2],
oc0_mem[oc0_ptr+3]);
oc0_ptr = oc0_ptr + 4;
wb_busy = 0;
dma_ack[0] = 1;
@(posedge clk);
#1 dma_ack[0] = 0;
end
 
 
always @(posedge clk)
if(oc1_dma_en & dma_req[1])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC1, 4'hf, 0, oc1_mem[oc1_ptr+0],
oc1_mem[oc1_ptr+1],
oc1_mem[oc1_ptr+2],
oc1_mem[oc1_ptr+3]);
oc1_ptr = oc1_ptr + 4;
wb_busy = 0;
dma_ack[1] = 1;
@(posedge clk);
#1 dma_ack[1] = 0;
end
 
always @(posedge clk)
if(oc2_dma_en & dma_req[2])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC2, 4'hf, 0, oc2_mem[oc2_ptr+0],
oc2_mem[oc2_ptr+1],
oc2_mem[oc2_ptr+2],
oc2_mem[oc2_ptr+3]);
oc2_ptr = oc2_ptr + 4;
wb_busy = 0;
dma_ack[2] = 1;
@(posedge clk);
#1 dma_ack[2] = 0;
end
 
always @(posedge clk)
if(oc3_dma_en & dma_req[3])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC3, 4'hf, 0, oc3_mem[oc3_ptr+0],
oc3_mem[oc3_ptr+1],
oc3_mem[oc3_ptr+2],
oc3_mem[oc3_ptr+3]);
oc3_ptr = oc3_ptr + 4;
wb_busy = 0;
dma_ack[3] = 1;
@(posedge clk);
#1 dma_ack[3] = 0;
end
 
always @(posedge clk)
if(oc4_dma_en & dma_req[4])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC4, 4'hf, 0, oc4_mem[oc4_ptr+0],
oc4_mem[oc4_ptr+1],
oc4_mem[oc4_ptr+2],
oc4_mem[oc4_ptr+3]);
oc4_ptr = oc4_ptr + 4;
wb_busy = 0;
dma_ack[4] = 1;
@(posedge clk);
#1 dma_ack[4] = 0;
end
 
always @(posedge clk)
if(oc5_dma_en & dma_req[5])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr4(`OC5, 4'hf, 0, oc5_mem[oc5_ptr+0],
oc5_mem[oc5_ptr+1],
oc5_mem[oc5_ptr+2],
oc5_mem[oc5_ptr+3]);
oc5_ptr = oc5_ptr + 4;
wb_busy = 0;
dma_ack[5] = 1;
@(posedge clk);
#1 dma_ack[5] = 0;
end
 
always @(posedge clk)
if(ic0_dma_en & dma_req[6])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd4(`IC0, 4'hf, 0, ic0_mem[ic0_ptr+0],
ic0_mem[ic0_ptr+1],
ic0_mem[ic0_ptr+2],
ic0_mem[ic0_ptr+3]);
ic0_ptr = ic0_ptr + 4;
wb_busy = 0;
dma_ack[6] = 1;
@(posedge clk);
#1 dma_ack[6] = 0;
end
 
always @(posedge clk)
if(ic1_dma_en & dma_req[7])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd4(`IC1, 4'hf, 0, ic1_mem[ic1_ptr+0],
ic1_mem[ic1_ptr+1],
ic1_mem[ic1_ptr+2],
ic1_mem[ic1_ptr+3]);
ic1_ptr = ic1_ptr + 4;
wb_busy = 0;
dma_ack[7] = 1;
@(posedge clk);
#1 dma_ack[7] = 0;
end
 
always @(posedge clk)
if(ic2_dma_en & dma_req[8])
begin
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd4(`IC2, 4'hf, 0, ic2_mem[ic2_ptr+0],
ic2_mem[ic2_ptr+1],
ic2_mem[ic2_ptr+2],
ic2_mem[ic2_ptr+3]);
ic2_ptr = ic2_ptr + 4;
wb_busy = 0;
dma_ack[8] = 1;
@(posedge clk);
#1 dma_ack[8] = 0;
end
 
 
 
 
/////////////////////////////////////////////////////////////////////
//
// Clock Generation
//
 
always #2.5 clk = ~clk;
 
always #40.69 bit_clk <= ~bit_clk;
 
 
/////////////////////////////////////////////////////////////////////
//
// WISHBONE AC 97 Controller IP Core
//
 
ac97_top u0(
.clk_i( clk ),
.rst_i( rst ),
.wb_data_i( wb_data_i ),
.wb_data_o( wb_data_o ),
.wb_addr_i( wb_addr_i ),
.wb_sel_i( wb_sel_i ),
.wb_we_i( wb_we_i ),
.wb_cyc_i( wb_cyc_i ),
.wb_stb_i( wb_stb_i ),
.wb_ack_o( wb_ack_o ),
.wb_err_o( wb_err_o ),
.int_o( int ),
.dma_req_o( dma_req ),
.dma_ack_i( dma_ack ),
.suspended_o( suspended ),
.bit_clk_pad_i( bit_clk ),
.sync_pad_o( sync ),
.sdata_pad_o( sdata_out ),
.sdata_pad_i( sdata_in ),
.ac97_reset_pad_o_( ac97_reset_ )
);
 
/////////////////////////////////////////////////////////////////////
//
// WISHBONE Master Model
//
 
wb_mast m0( .clk( clk ),
.rst( rst ),
.adr( wb_addr_i ),
.din( wb_data_o ),
.dout( wb_data_i ),
.cyc( wb_cyc_i ),
.stb( wb_stb_i ),
.sel( wb_sel_i ),
.we( wb_we_i ),
.ack( wb_ack_o ),
.err( wb_err_o ),
.rty( )
);
 
/////////////////////////////////////////////////////////////////////
//
// AC 97 Codec Model
//
 
 
ac97_codec_top u1(
.clk( bit_clk ),
.rst( rst ),
.sync( sync ),
.sdata_out( sdata_in ),
.sdata_in( sdata_out )
);
 
 
 
/////////////////////////////////////////////////////////////////////
//
// Tests and libraries
//
 
 
`include "tests.v"
 
endmodule
 
 
/trunk/bench/verilog/ac97_codec_top.v
0,0 → 1,651
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE AC 97 Codec Top Level ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: ac97_codec_top.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
 
`include "ac97_defines.v"
 
module ac97_codec_top(clk, rst,
sync,
sdata_out,
sdata_in
);
 
input clk, rst;
 
// --------------------------------------
// AC97 Codec Interface
input sync;
output sdata_out;
input sdata_in;
 
////////////////////////////////////////////////////////////////////
//
// Local Wires
//
 
wire [15:0] out_slt0;
wire [19:0] out_slt1;
wire [19:0] out_slt2;
wire [19:0] out_slt3;
wire [19:0] out_slt4;
wire [19:0] out_slt5;
wire [19:0] out_slt6;
wire [19:0] out_slt7;
wire [19:0] out_slt8;
wire [19:0] out_slt9;
wire [19:0] out_slt10;
wire [19:0] out_slt11;
wire [19:0] out_slt12;
 
wire [15:0] in_slt0;
wire [19:0] in_slt1;
reg [19:0] in_slt2;
reg [19:0] in_slt3;
reg [19:0] in_slt4;
reg [19:0] in_slt5;
reg [19:0] in_slt6;
reg [19:0] in_slt7;
reg [19:0] in_slt8;
reg [19:0] in_slt9;
reg [19:0] in_slt10;
reg [19:0] in_slt11;
reg [19:0] in_slt12;
 
reg [19:0] smem[0:32];
reg [19:0] rmem[0:32];
 
reg [15:0] s0;
reg [19:0] s1;
 
integer rs1_ptr, rs2_ptr;
integer rs3_ptr, rs4_ptr, rs5_ptr, rs6_ptr, rs7_ptr;
integer rs8_ptr, rs9_ptr, rs10_ptr, rs11_ptr, rs12_ptr;
integer is2_ptr, is3_ptr, is4_ptr, is5_ptr, is6_ptr, is7_ptr;
integer is8_ptr, is9_ptr, is10_ptr, is11_ptr, is12_ptr;
reg [19:0] rslt0;
reg [19:0] rslt1;
reg [19:0] rslt2;
reg [19:0] rs1_mem[0:256];
reg [19:0] rs2_mem[0:256];
reg [19:0] rs3_mem[0:256];
reg [19:0] rs4_mem[0:256];
reg [19:0] rs5_mem[0:256];
reg [19:0] rs6_mem[0:256];
reg [19:0] rs7_mem[0:256];
reg [19:0] rs8_mem[0:256];
reg [19:0] rs9_mem[0:256];
reg [19:0] rs10_mem[0:256];
reg [19:0] rs11_mem[0:256];
reg [19:0] rs12_mem[0:256];
 
reg [19:0] is2_mem[0:256];
reg [19:0] is3_mem[0:256];
reg [19:0] is4_mem[0:256];
reg [19:0] is5_mem[0:256];
reg [19:0] is6_mem[0:256];
reg [19:0] is7_mem[0:256];
reg [19:0] is8_mem[0:256];
reg [19:0] is9_mem[0:256];
reg [19:0] is10_mem[0:256];
reg [19:0] is11_mem[0:256];
reg [19:0] is12_mem[0:256];
 
////////////////////////////////////////////////////////////////////
//
// Misc Logic
//
 
task init;
input mode;
 
integer mode;
begin
 
fill_mem(mode);
clr_ptrs;
 
end
endtask
 
task fill_mem;
input mode;
 
integer mode;
integer n;
 
begin
 
if(mode==0)
for(n=0;n<256;n=n+1)
begin
is2_mem[n] = { 4'h0, n[11:0], 4'h0 };
is3_mem[n] = { 4'h1, n[11:0], 4'h0 };
is4_mem[n] = { 4'h2, n[11:0], 4'h0 };
is5_mem[n] = { 4'h3, n[11:0], 4'h0 };
is6_mem[n] = { 4'h4, n[11:0], 4'h0 };
is7_mem[n] = { 4'h5, n[11:0], 4'h0 };
is8_mem[n] = { 4'h6, n[11:0], 4'h0 };
is9_mem[n] = { 4'h7, n[11:0], 4'h0 };
is10_mem[n] = { 4'h8, n[11:0], 4'h0 };
is11_mem[n] = { 4'h9, n[11:0], 4'h0 };
is12_mem[n] = { 4'ha, n[11:0], 4'h0 };
end
else
for(n=0;n<256;n=n+1)
begin
is2_mem[n] = $random;
is3_mem[n] = $random;
is4_mem[n] = $random;
is5_mem[n] = $random;
is6_mem[n] = $random;
is7_mem[n] = $random;
is8_mem[n] = $random;
is9_mem[n] = $random;
is10_mem[n] = $random;
is11_mem[n] = $random;
is12_mem[n] = $random;
end
 
end
endtask
 
always @(posedge clk)
if(!rst) s0 = 0;
 
always @(posedge clk)
if(!rst) s1 = 0;
 
assign in_slt0 = s0;
assign in_slt1 = s1;
 
 
//always @(posedge sync)
always @(rslt0 or rslt1 or s0)
if(s0[13] | (rslt0[14] & rslt1[19]) )
begin
in_slt2 = #1 is2_mem[is2_ptr];
is2_ptr = is2_ptr + 1;
end
 
always @(posedge sync)
if(s0[12])
begin
in_slt3 = #1 is3_mem[is3_ptr];
is3_ptr = is3_ptr + 1;
end
 
always @(posedge sync)
if(s0[11])
begin
in_slt4 = #1 is4_mem[is4_ptr];
is4_ptr = is4_ptr + 1;
end
 
always @(posedge sync)
if(s0[10])
begin
in_slt5 = #1 is5_mem[is5_ptr];
is5_ptr = is5_ptr + 1;
end
 
always @(posedge sync)
if(s0[9])
begin
in_slt6 = #1 is6_mem[is6_ptr];
is6_ptr = is6_ptr + 1;
end
 
always @(posedge sync)
if(s0[8])
begin
in_slt7 = #1 is7_mem[is7_ptr];
is7_ptr = is7_ptr + 1;
end
 
always @(posedge sync)
if(s0[7])
begin
in_slt8 = #1 is8_mem[is8_ptr];
is8_ptr = is8_ptr + 1;
end
 
always @(posedge sync)
if(s0[6])
begin
in_slt9 = #1 is9_mem[is9_ptr];
is9_ptr = is9_ptr + 1;
end
 
always @(posedge sync)
if(s0[5])
begin
in_slt10 = #1 is10_mem[is10_ptr];
is10_ptr = is10_ptr + 1;
end
 
always @(posedge sync)
if(s0[4])
begin
in_slt11 = #1 is11_mem[is11_ptr];
is11_ptr = is11_ptr + 1;
end
 
always @(posedge sync)
if(s0[3])
begin
in_slt12 = #1 is12_mem[is12_ptr];
is12_ptr = is12_ptr + 1;
end
 
always @(posedge sync)
begin
rslt0 <= #2 out_slt0;
rslt1 <= #2 out_slt1;
rslt2 <= #2 out_slt2;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[14])
begin
rs1_mem[rs1_ptr] = #1 out_slt1;
rs1_ptr = rs1_ptr + 1;
//$display("INFO: Codec Register Addr: %h (%t)", out_slt1, $time);
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[13])
begin
rs2_mem[rs2_ptr] = #1 out_slt2;
rs2_ptr = rs2_ptr + 1;
//$display("INFO: Codec Register Data: %h (%t)", out_slt2, $time);
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[12])
begin
rs3_mem[rs3_ptr] = #1 out_slt3;
rs3_ptr = rs3_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[11])
begin
rs4_mem[rs4_ptr] = #1 out_slt4;
rs4_ptr = rs4_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[10])
begin
rs5_mem[rs5_ptr] = #1 out_slt5;
rs5_ptr = rs5_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[9])
begin
rs6_mem[rs6_ptr] = #1 out_slt6;
rs6_ptr = rs6_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[8])
begin
rs7_mem[rs7_ptr] = #1 out_slt7;
rs7_ptr = rs7_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[7])
begin
rs8_mem[rs8_ptr] = #1 out_slt8;
rs8_ptr = rs8_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[6])
begin
rs9_mem[rs9_ptr] = #1 out_slt9;
rs9_ptr = rs9_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[5])
begin
rs10_mem[rs10_ptr] = #1 out_slt10;
rs10_ptr = rs10_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[4])
begin
rs11_mem[rs11_ptr] = #1 out_slt11;
rs11_ptr = rs11_ptr + 1;
end
 
always @(posedge sync)
if(out_slt0[15] & out_slt0[3])
begin
rs12_mem[rs12_ptr] = #1 out_slt12;
rs12_ptr = rs12_ptr + 1;
end
 
 
task clr_ptrs;
 
begin
 
rs1_ptr = 0;
rs2_ptr = 0;
rs3_ptr = 0;
rs4_ptr = 0;
rs5_ptr = 0;
rs6_ptr = 0;
rs7_ptr = 0;
rs8_ptr = 0;
rs9_ptr = 0;
rs10_ptr = 0;
rs11_ptr = 0;
rs12_ptr = 0;
 
is2_ptr = 0;
is3_ptr = 0;
is4_ptr = 0;
is5_ptr = 0;
is6_ptr = 0;
is7_ptr = 0;
is8_ptr = 0;
is9_ptr = 0;
is10_ptr = 0;
is11_ptr = 0;
is12_ptr = 0;
 
end
endtask
 
 
task set_tag;
input cr;
input [11:0] tag;
 
// s0 - 16 bits
// 15 - Codec Ready
// 14:3 - Slot 1-12 Valid bits
// 2:0 - RESERVED (stuffed with 0)
begin
s0 = {cr, tag, 3'h0};
end
endtask
 
 
task set_req;
input [9:0] req;
 
reg [6:0] idx;
begin
 
idx = out_slt1[18:12];
s1 = {1'b0, idx, ~req, 2'h0};
 
end
endtask
 
 
task tx1;
input fcnt_max; // Total number fo frames
input rdy_del; // How many frames before codec is ready
input ovalid; // Out Channels valid (Surround Sound)
input ivalid; // In Channels Valid (Mic & Line In)
input oint; // Output Intervals
input iint; // input Intervals
 
integer fcnt_max, f;
integer rdy_del;
reg [9:0] ovalid, ivalid;
reg [19:0] oint, iint;
 
reg och0_v;
reg [1:0] och0_cnt;
reg och1_v;
reg [1:0] och1_cnt;
reg och2_v;
reg [1:0] och2_cnt;
reg och3_v;
reg [1:0] och3_cnt;
reg och4_v;
reg [1:0] och4_cnt;
reg och5_v;
reg [1:0] och5_cnt;
reg och6_v;
reg [1:0] och6_cnt;
reg och7_v;
reg [1:0] och7_cnt;
reg och8_v;
reg [1:0] och8_cnt;
reg och9_v;
reg [1:0] och9_cnt;
reg ich0_v;
reg [1:0] ich0_cnt;
reg ich1_v;
reg [1:0] ich1_cnt;
reg ich2_v;
reg [1:0] ich2_cnt;
reg ich3_v;
reg [1:0] ich3_cnt;
reg ich4_v;
reg [1:0] ich4_cnt;
reg ich5_v;
reg [1:0] ich5_cnt;
reg ich6_v;
reg [1:0] ich6_cnt;
reg ich7_v;
reg [1:0] ich7_cnt;
reg ich8_v;
reg [1:0] ich8_cnt;
reg ich9_v;
reg [1:0] ich9_cnt;
 
begin
 
och0_cnt = 0;
och1_cnt = 0;
och2_cnt = 0;
och3_cnt = 0;
och4_cnt = 0;
och5_cnt = 0;
och6_cnt = 0;
och7_cnt = 0;
och8_cnt = 0;
och9_cnt = 0;
 
ich0_cnt = 0;
ich1_cnt = 0;
ich2_cnt = 0;
ich3_cnt = 0;
ich4_cnt = 0;
ich5_cnt = 0;
ich6_cnt = 0;
ich7_cnt = 0;
ich8_cnt = 0;
ich9_cnt = 0;
 
for(f=0;f<fcnt_max;f=f+1)
begin
while(!sync) @(posedge clk);
if(f>rdy_del)
begin
 
och0_v = ovalid[9] & (och0_cnt == oint[19:18]);
if(och0_v) och0_cnt = 0;
else och0_cnt = och0_cnt + 1;
och1_v = ovalid[8] & (och1_cnt == oint[17:16]);
if(och1_v) och1_cnt = 0;
else och1_cnt = och1_cnt + 1;
och2_v = ovalid[7] & (och2_cnt == oint[15:14]);
if(och2_v) och2_cnt = 0;
else och2_cnt = och2_cnt + 1;
och3_v = ovalid[6] & (och3_cnt == oint[13:12]);
if(och3_v) och3_cnt = 0;
else och3_cnt = och3_cnt + 1;
och4_v = ovalid[5] & (och4_cnt == oint[11:10]);
if(och4_v) och4_cnt = 0;
else och4_cnt = och4_cnt + 1;
och5_v = ovalid[4] & (och5_cnt == oint[9:8]);
if(och5_v) och5_cnt = 0;
else och5_cnt = och5_cnt + 1;
och6_v = ovalid[3] & (och6_cnt == oint[7:6]);
if(och6_v) och6_cnt = 0;
else och6_cnt = och6_cnt + 1;
och7_v = ovalid[2] & (och7_cnt == oint[5:4]);
if(och7_v) och7_cnt = 0;
else och7_cnt = och7_cnt + 1;
och8_v = ovalid[1] & (och8_cnt == oint[3:2]);
if(och8_v) och8_cnt = 0;
else och8_cnt = och8_cnt + 1;
och9_v = ovalid[0] & (och9_cnt == oint[1:0]);
if(och9_v) och9_cnt = 0;
else och9_cnt = och9_cnt + 1;
 
ich0_v = ivalid[9] & (ich0_cnt == iint[19:18]);
if(ich0_v) ich0_cnt = 0;
else ich0_cnt = ich0_cnt + 1;
ich1_v = ivalid[8] & (ich1_cnt == iint[17:16]);
if(ich1_v) ich1_cnt = 0;
else ich1_cnt = ich1_cnt + 1;
ich2_v = ivalid[7] & (ich2_cnt == iint[15:14]);
if(ich2_v) ich2_cnt = 0;
else ich2_cnt = ich2_cnt + 1;
ich3_v = ivalid[6] & (ich3_cnt == iint[13:12]);
if(ich3_v) ich3_cnt = 0;
else ich3_cnt = ich3_cnt + 1;
ich4_v = ivalid[5] & (ich4_cnt == iint[11:10]);
if(ich4_v) ich4_cnt = 0;
else ich4_cnt = ich4_cnt + 1;
ich5_v = ivalid[4] & (ich5_cnt == iint[9:8]);
if(ich5_v) ich5_cnt = 0;
else ich5_cnt = ich5_cnt + 1;
ich6_v = ivalid[3] & (ich6_cnt == iint[7:6]);
if(ich6_v) ich6_cnt = 0;
else ich6_cnt = ich6_cnt + 1;
ich7_v = ivalid[2] & (ich7_cnt == iint[5:4]);
if(ich7_v) ich7_cnt = 0;
else ich7_cnt = ich7_cnt + 1;
ich8_v = ivalid[1] & (ich8_cnt == iint[3:2]);
if(ich8_v) ich8_cnt = 0;
else ich8_cnt = ich8_cnt + 1;
ich9_v = ivalid[0] & (ich9_cnt == iint[1:0]);
if(ich9_v) ich9_cnt = 0;
else ich9_cnt = ich9_cnt + 1;
 
set_tag(1'b1, { 1'b0, // Slot 1
1'b0, // Slot 2
ich0_v, ich1_v, ich2_v, ich3_v, ich4_v,
ich5_v, ich6_v, ich7_v, ich8_v, ich9_v} );
 
set_req( { och0_v, och1_v, och2_v, och3_v, och4_v,
och5_v, och6_v, och7_v, och8_v, och9_v} );
 
end
while(sync) @(posedge clk);
end
end
endtask
 
////////////////////////////////////////////////////////////////////
//
// Modules
//
 
ac97_codec_sin u0(
.clk( clk ),
.rst( rst ),
.sync( sync ),
.slt0( out_slt0 ),
.slt1( out_slt1 ),
.slt2( out_slt2 ),
.slt3( out_slt3 ),
.slt4( out_slt4 ),
.slt5( out_slt5 ),
.slt6( out_slt6 ),
.slt7( out_slt7 ),
.slt8( out_slt8 ),
.slt9( out_slt9 ),
.slt10( out_slt10 ),
.slt11( out_slt11 ),
.slt12( out_slt12 ),
.sdata_in( sdata_in )
);
 
ac97_codec_sout u1(
.clk( clk ),
.rst( rst ),
.sync( sync ),
.slt0( in_slt0 ),
.slt1( in_slt1 ),
.slt2( in_slt2 ),
.slt3( in_slt3 ),
.slt4( in_slt4 ),
.slt5( in_slt5 ),
.slt6( in_slt6 ),
.slt7( in_slt7 ),
.slt8( in_slt8 ),
.slt9( in_slt9 ),
.slt10( in_slt10 ),
.slt11( in_slt11 ),
.slt12( in_slt12 ),
.sdata_out( sdata_out )
);
 
endmodule
 
 
/trunk/bench/verilog/tests.v
0,0 → 1,875
/////////////////////////////////////////////////////////////////////
//// ////
//// Tests ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: tests.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
 
 
task show_errors;
 
begin
 
$display("\n");
$display(" +--------------------+");
$display(" | Total ERRORS: %0d |", error_cnt);
$display(" +--------------------+");
 
end
endtask
 
 
task basic1;
 
reg [31:0] data;
reg [31:0] data1;
reg [31:0] data2;
integer size, frames, m;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** Basic AC97 I/O Test & Reg Wr ... ***");
$display("*****************************************************\n");
 
 
wb_busy = 1;
m0.wb_wr1(`INTM,4'hf, 32'h0000_0003);
m0.wb_wr1(`OCC0,4'hf, 32'h7373_7373);
m0.wb_wr1(`OCC1,4'hf, 32'h0000_7373);
m0.wb_wr1(`ICC,4'hf, 32'h0073_7373);
 
wb_busy = 0;
oc0_dma_en = 1;
oc1_dma_en = 1;
oc2_dma_en = 1;
oc3_dma_en = 1;
oc4_dma_en = 1;
oc5_dma_en = 1;
ic0_dma_en = 1;
ic1_dma_en = 1;
ic2_dma_en = 1;
 
for(n=0;n<256;n=n+1)
begin
oc0_mem[n] = $random;
oc1_mem[n] = $random;
oc2_mem[n] = $random;
oc3_mem[n] = $random;
oc4_mem[n] = $random;
oc5_mem[n] = $random;
ic0_mem[n] = $random;
ic1_mem[n] = $random;
ic2_mem[n] = $random;
end
 
u1.init(0);
frames = 139;
 
fork
u1.tx1( frames, // Number of frames to process
0, // How many frames before codec is ready
10'b1111_1111_11, // Output slots valid bits
10'b1111_1111_11, // Input slots valid bits
20'b00_00_00_00_00_00_00_00_00_00, // Output Slots intervals
20'b00_00_00_00_00_00_00_00_00_00 // Input Slots intervals
);
 
begin // Do a register Write
repeat(2) @(posedge sync);
 
for(n=0;n<75;n=n+1)
begin
@(negedge sync);
repeat(230) @(posedge bit_clk);
 
repeat(n) @(posedge bit_clk);
 
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr1(`CRAC,4'hf, {9'h0, n[6:0], 16'h1234 + n[7:0]} );
wb_busy = 0;
 
while(!int) @(posedge clk);
end
end
join
 
repeat(300) @(posedge bit_clk);
 
for(n=0;n<75;n=n+1)
begin
data2 = {9'h0, n[6:0], 16'h1234 + n[7:0]};
tmp = u1.rs2_mem[n];
data1[15:0] = tmp[19:4];
 
tmp = u1.rs1_mem[n];
data1[31:16] = {9'h0, tmp[18:12]};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Register Write Data %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
 
end
 
size = frames - 4;
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs3_mem[n];
data = oc0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs4_mem[n];
data = oc1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs6_mem[n];
data = oc2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs7_mem[n];
data = oc3_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH3 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs8_mem[n];
data = oc4_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH4 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs9_mem[n];
data = oc5_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH5 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is3_mem[n];
data = ic0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is4_mem[n];
data = ic1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is6_mem[n];
data = ic2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
repeat(10) @(posedge clk);
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
task basic2;
 
reg [31:0] data;
reg [31:0] data1;
reg [31:0] data2;
integer size, frames, m;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** Basic AC97 I/O Test & Reg Rd ... ***");
$display("*****************************************************\n");
 
wb_busy = 1;
m0.wb_wr1(`INTM,4'hf, 32'h0000_0003);
m0.wb_wr1(`OCC0,4'hf, 32'h7373_7373);
m0.wb_wr1(`OCC1,4'hf, 32'h0000_7373);
m0.wb_wr1(`ICC,4'hf, 32'h0073_7373);
 
wb_busy = 0;
oc0_dma_en = 1;
oc1_dma_en = 1;
oc2_dma_en = 1;
oc3_dma_en = 1;
oc4_dma_en = 1;
oc5_dma_en = 1;
ic0_dma_en = 1;
ic1_dma_en = 1;
ic2_dma_en = 1;
 
for(n=0;n<256;n=n+1)
begin
oc0_mem[n] = $random;
oc1_mem[n] = $random;
oc2_mem[n] = $random;
oc3_mem[n] = $random;
oc4_mem[n] = $random;
oc5_mem[n] = $random;
ic0_mem[n] = $random;
ic1_mem[n] = $random;
ic2_mem[n] = $random;
end
 
u1.init(0);
frames = 139;
 
fork
u1.tx1( frames, // Number of frames to process
0, // How many frames before codec is ready
10'b1111_1111_11, // Output slots valid bits
10'b1111_1111_11, // Input slots valid bits
20'b00_00_00_00_00_00_00_00_00_00, // Output Slots intervals
20'b00_00_00_00_00_00_00_00_00_00 // Input Slots intervals
);
 
begin // Do a register Write
repeat(2) @(posedge sync);
 
for(n=0;n<75;n=n+1)
begin
@(negedge sync);
repeat(230) @(posedge bit_clk);
 
repeat(n) @(posedge bit_clk);
 
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_wr1(`CRAC,4'hf, {1'b1, 8'h0, n[6:0], 16'h1234 + n[7:0]} );
wb_busy = 0;
 
while(!int) @(posedge clk);
 
while(wb_busy) @(posedge clk);
wb_busy = 1;
m0.wb_rd1(`CRAC,4'hf, reg_mem[n] );
wb_busy = 0;
 
end
end
join
 
repeat(300) @(posedge bit_clk);
 
for(n=0;n<75;n=n+1)
begin
 
tmp = u1.is2_mem[n];
data2 = {16'h0, tmp[19:4]};
tmp = reg_mem[n];
data1 = {16'h0, tmp[15:0]};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Register Read Data %0d Mismatch Expected: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
 
end
 
size = frames - 4;
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs3_mem[n];
data = oc0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs4_mem[n];
data = oc1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs6_mem[n];
data = oc2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs7_mem[n];
data = oc3_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH3 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs8_mem[n];
data = oc4_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH4 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs9_mem[n];
data = oc5_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH5 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is3_mem[n];
data = ic0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is4_mem[n];
data = ic1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is6_mem[n];
data = ic2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
task vsr1;
 
reg [31:0] data;
reg [31:0] data1;
reg [31:0] data2;
integer size, frames, m;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** VSR AC97 I/O Test ... ***");
$display("*****************************************************\n");
 
wb_busy = 1;
m0.wb_wr1(`OCC0,4'hf, 32'h7373_7373);
m0.wb_wr1(`OCC1,4'hf, 32'h0000_7373);
m0.wb_wr1(`ICC,4'hf, 32'h0073_7373);
 
wb_busy = 0;
oc0_dma_en = 1;
oc1_dma_en = 1;
oc2_dma_en = 1;
oc3_dma_en = 1;
oc4_dma_en = 1;
oc5_dma_en = 1;
ic0_dma_en = 1;
ic1_dma_en = 1;
ic2_dma_en = 1;
 
for(n=0;n<256;n=n+1)
begin
oc0_mem[n] = $random;
oc1_mem[n] = $random;
oc2_mem[n] = $random;
oc3_mem[n] = $random;
oc4_mem[n] = $random;
oc5_mem[n] = $random;
ic0_mem[n] = $random;
ic1_mem[n] = $random;
ic2_mem[n] = $random;
end
 
u1.init(0);
 
frames = 132;
 
u1.tx1( frames, // Number of frames to process
0, // How many frames before codec is ready
10'b1101_1110_00, // Output slots valid bits
10'b1101_0000_00, // Input slots valid bits
20'b01_01_00_01_01_01_01_00_00_00, // Output Slots intervals
20'b01_01_00_01_00_00_00_00_00_00 // Input Slots intervals
);
 
size = (frames - 4)/2;
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs3_mem[n];
data = oc0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs4_mem[n];
data = oc1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs6_mem[n];
data = oc2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs7_mem[n];
data = oc3_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH3 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs8_mem[n];
data = oc4_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH4 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.rs9_mem[n];
data = oc5_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: Out. CH5 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is3_mem[n];
data = ic0_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH0 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is4_mem[n];
data = ic1_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH1 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
for(n=0;n<size;n=n+1)
begin
data1 = u1.is6_mem[n];
data = ic2_mem[n[8:1]];
 
if(~n[0]) data2 = {12'h0, data[15:0], 4'h0};
else data2 = {12'h0, data[31:16], 4'h0};
 
if( (data1 !== data2) |
(^data1 === 1'hx) |
(^data2 === 1'hx)
)
begin
$display("ERROR: In. CH2 Sample %0d Mismatch Sent: %h Got: %h",
n, data2, data1);
error_cnt = error_cnt + 1;
end
end
 
repeat(10) @(posedge clk);
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
/trunk/bench/verilog/wb_model_defines.v
0,0 → 1,55
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE Model Definitions ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: wb_model_defines.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
//
 
`timescale 1ns / 10ps
/trunk/bench/verilog/ac97_codec_sin.v
0,0 → 1,205
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE AC 97 Codec ////
//// Serial Input Block ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: ac97_codec_sin.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
 
`include "ac97_defines.v"
 
module ac97_codec_sin(clk, rst,
 
sync,
slt0, slt1, slt2, slt3, slt4, slt5,
slt6, slt7, slt8, slt9, slt10, slt11, slt12,
 
sdata_in
);
 
input clk, rst;
 
// --------------------------------------
// Misc Signals
input sync;
output [15:0] slt0;
output [19:0] slt1;
output [19:0] slt2;
output [19:0] slt3;
output [19:0] slt4;
output [19:0] slt5;
output [19:0] slt6;
output [19:0] slt7;
output [19:0] slt8;
output [19:0] slt9;
output [19:0] slt10;
output [19:0] slt11;
output [19:0] slt12;
 
// --------------------------------------
// AC97 Codec Interface
input sdata_in;
 
////////////////////////////////////////////////////////////////////
//
// Local Wires
//
 
reg sdata_in_r;
reg [19:0] sr;
 
reg [15:0] slt0;
reg [19:0] slt1;
reg [19:0] slt2;
reg [19:0] slt3;
reg [19:0] slt4;
reg [19:0] slt5;
reg [19:0] slt6;
reg [19:0] slt7;
reg [19:0] slt8;
reg [19:0] slt9;
reg [19:0] slt10;
reg [19:0] slt11;
reg [19:0] slt12;
 
wire [12:0] le;
 
////////////////////////////////////////////////////////////////////
//
// Latch Enable logic
//
 
// Sync Edge Detector
reg sync_r;
wire sync_e;
 
always @(posedge clk)
sync_r <= #1 sync;
 
assign sync_e = sync & !sync_r;
 
// Frame Counter
reg [7:0] cnt;
 
always @(posedge clk)
if(sync_e) cnt <= #1 0;
else cnt <= #1 cnt + 1;
 
assign le[0] = (cnt == 16);
assign le[1] = (cnt == 36);
assign le[2] = (cnt == 56);
assign le[3] = (cnt == 76);
assign le[4] = (cnt == 96);
assign le[5] = (cnt == 116);
assign le[6] = (cnt == 136);
assign le[7] = (cnt == 156);
assign le[8] = (cnt == 176);
assign le[9] = (cnt == 196);
assign le[10] = (cnt == 216);
assign le[11] = (cnt == 236);
assign le[12] = (cnt == 0);
 
////////////////////////////////////////////////////////////////////
//
// Output registers
//
 
always @(posedge clk)
if(le[0]) slt0 <= #1 sr[15:0];
 
always @(posedge clk)
if(le[1]) slt1 <= #1 sr;
 
always @(posedge clk)
if(le[2]) slt2 <= #1 sr;
 
always @(posedge clk)
if(le[3]) slt3 <= #1 sr;
 
always @(posedge clk)
if(le[4]) slt4 <= #1 sr;
 
always @(posedge clk)
if(le[5]) slt5 <= #1 sr;
 
always @(posedge clk)
if(le[6]) slt6 <= #1 sr;
 
always @(posedge clk)
if(le[7]) slt7 <= #1 sr;
 
always @(posedge clk)
if(le[8]) slt8 <= #1 sr;
 
always @(posedge clk)
if(le[9]) slt9 <= #1 sr;
 
always @(posedge clk)
if(le[10]) slt10 <= #1 sr;
 
always @(posedge clk)
if(le[11]) slt11 <= #1 sr;
 
always @(posedge clk)
if(le[12]) slt12 <= #1 sr;
 
////////////////////////////////////////////////////////////////////
//
// Serial Shift Register
//
 
always @(negedge clk)
sdata_in_r <= #1 sdata_in;
 
always @(posedge clk)
sr <= #1 {sr[18:0], sdata_in_r };
 
endmodule
 
 
/trunk/bench/verilog/ac97_codec_sout.v
0,0 → 1,191
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE AC 97 Codec ////
//// Serial Output Block ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/ac97_ctrl/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
// CVS Log
//
// $Id: ac97_codec_sout.v,v 1.1 2002-02-13 08:22:32 rudi Exp $
//
// $Date: 2002-02-13 08:22:32 $
// $Revision: 1.1 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
//
//
//
 
`include "ac97_defines.v"
 
module ac97_codec_sout(clk, rst,
 
sync, slt0, slt1, slt2, slt3, slt4, slt5,
slt6, slt7, slt8, slt9, slt10, slt11, slt12,
 
sdata_out
);
 
input clk, rst;
 
// --------------------------------------
// Misc Signals
input sync;
input [15:0] slt0;
input [19:0] slt1;
input [19:0] slt2;
input [19:0] slt3;
input [19:0] slt4;
input [19:0] slt5;
input [19:0] slt6;
input [19:0] slt7;
input [19:0] slt8;
input [19:0] slt9;
input [19:0] slt10;
input [19:0] slt11;
input [19:0] slt12;
 
// --------------------------------------
// AC97 Codec Interface
output sdata_out;
 
////////////////////////////////////////////////////////////////////
//
// Local Wires
//
 
reg sdata_out_r;
 
reg [15:0] slt0_r;
reg [19:0] slt1_r;
reg [19:0] slt2_r;
reg [19:0] slt3_r;
reg [19:0] slt4_r;
reg [19:0] slt5_r;
reg [19:0] slt6_r;
reg [19:0] slt7_r;
reg [19:0] slt8_r;
reg [19:0] slt9_r;
reg [19:0] slt10_r;
reg [19:0] slt11_r;
reg [19:0] slt12_r;
 
reg sync_r;
wire sync_e;
 
////////////////////////////////////////////////////////////////////
//
// Misc Logic
//
 
// Sync Edge detector
always @(posedge clk)
sync_r <= #1 sync;
 
assign sync_e = sync & !sync_r;
 
////////////////////////////////////////////////////////////////////
//
// Serial Shift Register
//
 
/*
always @(negedge clk)
sdata_out_r <= #1 slt0_r[15];
 
//assign sdata_out = sdata_out_r;
*/
 
assign sdata_out = slt0_r[15];
 
always @(posedge clk)
if(sync_e) slt0_r <= #1 slt0;
else slt0_r <= #1 {slt0_r[14:0], slt1_r[19]};
 
always @(posedge clk)
if(sync_e) slt1_r <= #1 slt1;
else slt1_r <= #1 {slt1_r[18:0], slt2_r[19]};
 
always @(posedge clk)
if(sync_e) slt2_r <= #1 slt2;
else slt2_r <= #1 {slt2_r[18:0], slt3_r[19]};
 
always @(posedge clk)
if(sync_e) slt3_r <= #1 slt3;
else slt3_r <= #1 {slt3_r[18:0], slt4_r[19]};
 
always @(posedge clk)
if(sync_e) slt4_r <= #1 slt4;
else slt4_r <= #1 {slt4_r[18:0], slt5_r[19]};
 
always @(posedge clk)
if(sync_e) slt5_r <= #1 slt5;
else slt5_r <= #1 {slt5_r[18:0], slt6_r[19]};
 
always @(posedge clk)
if(sync_e) slt6_r <= #1 slt6;
else slt6_r <= #1 {slt6_r[18:0], slt7_r[19]};
 
always @(posedge clk)
if(sync_e) slt7_r <= #1 slt7;
else slt7_r <= #1 {slt7_r[18:0], slt8_r[19]};
 
always @(posedge clk)
if(sync_e) slt8_r <= #1 slt8;
else slt8_r <= #1 {slt8_r[18:0], slt9_r[19]};
 
always @(posedge clk)
if(sync_e) slt9_r <= #1 slt9;
else slt9_r <= #1 {slt9_r[18:0], slt10_r[19]};
 
always @(posedge clk)
if(sync_e) slt10_r <= #1 slt10;
else slt10_r <= #1 {slt10_r[18:0], slt11_r[19]};
 
always @(posedge clk)
if(sync_e) slt11_r <= #1 slt11;
else slt11_r <= #1 {slt11_r[18:0], slt12_r[19]};
 
always @(posedge clk)
if(sync_e) slt12_r <= #1 slt12;
else slt12_r <= #1 {slt12_r[18:0], 1'b0 };
 
 
endmodule
 

powered by: WebSVN 2.1.0

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