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

Subversion Repositories vga_lcd

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /vga_lcd/tags/rel_19/bench/verilog
    from Rev 61 to Rev 62
    Reverse comparison

Rev 61 → Rev 62

/wb_mast_model.v
0,0 → 1,361
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE Master Model ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/wb_dma/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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.2 2003-09-23 13:09:25 markom Exp $
//
// $Date: 2003-09-23 13:09:25 $
// $Revision: 1.2 $
// $Author: markom $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/08/21 05:42:32 rudi
//
// - Changed Directory Structure
// - Added verilog Source Code
// - Changed IO pin names and defines statements
//
//
//
//
 
`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
//
 
reg [31:0] adr;
reg [31:0] dout;
reg cyc, stb;
reg [3:0] sel;
reg we;
 
////////////////////////////////////////////////////////////////////
//
// 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;
#1;
$display("\nINFO: WISHBONE MASTER MODEL INSTANTIATED (%m)\n");
end
 
////////////////////////////////////////////////////////////////////
//
// 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) @(posedge clk);
#1;
cyc=0;
stb=0;
adr = 32'hxxxx_xxxx;
dout = 32'hxxxx_xxxx;
we = 1'hx;
sel = 4'hx;
 
//@(posedge clk);
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) @(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) @(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) @(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) @(posedge clk);
#1;
stb=0;
cyc=0;
 
adr = 32'hxxxx_xxxx;
dout = 32'hxxxx_xxxx;
we = 1'hx;
sel = 4'hx;
 
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) @(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) @(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) @(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) @(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) @(posedge clk);
d4 = din;
#1;
stb=0;
cyc=0;
we = 1'hx;
sel = 4'hx;
adr = 32'hffff_ffff;
end
endtask
 
 
endmodule
/test_bench_top.v
0,0 → 1,680
/////////////////////////////////////////////////////////////////////
//// ////
//// Top Level Test Bench ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/vga_lcd/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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.10 2003-09-23 13:09:25 markom Exp $
//
// $Date: 2003-09-23 13:09:25 $
// $Revision: 1.10 $
// $Author: markom $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.9 2003/08/22 07:12:31 rherveille
// Enabled Fifo Underrun test
//
// Revision 1.8 2003/05/07 14:39:19 rherveille
// Added DVI tests
//
// Revision 1.7 2003/05/07 09:45:28 rherveille
// Numerous updates and added checks
//
// Revision 1.6 2003/03/19 17:22:19 rherveille
// Added WISHBONE revB.3 sanity checks
//
// Revision 1.5 2003/03/19 12:20:53 rherveille
// Changed timing section in VGA core, changed testbench accordingly.
// Fixed bug in 'timing check' test.
//
// Revision 1.4 2002/02/07 05:38:32 rherveille
// Added wb_ack delay section to testbench
//
//
//
//
//
 
`timescale 1ns/10ps
 
module test;
 
reg clk;
reg rst;
 
parameter LINE_FIFO_AWIDTH = 7;
 
wire int;
wire [31:0] wb_addr_o;
wire [31:0] wb_data_i;
wire [31:0] wb_data_o;
wire [3:0] wb_sel_o;
wire wb_we_o;
wire wb_stb_o;
wire wb_cyc_o;
wire [2:0] wb_cti_o;
wire [1:0] wb_bte_o;
wire wb_ack_i;
wire wb_err_i;
wire [31:0] wb_addr_i;
wire [31:0] wbm_data_i;
wire [3:0] wb_sel_i;
wire wb_we_i;
wire wb_stb_i;
wire wb_cyc_i;
wire wb_ack_o;
wire wb_rty_o;
wire wb_err_o;
reg pclk_i;
wire pclk;
wire hsync;
wire vsync;
wire ihsync;
wire ivsync;
wire csync;
wire blanc;
wire [7:0] red;
wire [7:0] green;
wire [7:0] blue;
wire dvi_de_o;
`ifdef VGA_12BIT_DVI
wire [11:0] dvi_d_o;
`else
wire [23:0] dvi_d_o;
`endif
 
wire vga_stb_i;
wire clut_stb_i;
 
reg scen;
 
// Test Bench Variables
integer wd_cnt;
integer error_cnt;
 
// Misc Variables
reg [31:0] data;
reg [31:0] pattern;
reg int_warn;
 
integer n;
integer mode;
 
reg [7:0] thsync, thgdel;
reg [15:0] thgate, thlen;
reg [7:0] tvsync, tvgdel;
reg [15:0] tvgate, tvlen;
reg hpol;
reg vpol;
reg cpol;
reg bpol;
integer p, l;
reg [31:0] pn;
reg [31:0] pra, paa, tmp;
reg [23:0] pd;
reg [1:0] cd;
reg pc;
reg [31:0] vbase;
reg [31:0] cbase;
reg [31:0] vbara;
reg [31:0] vbarb;
reg [7:0] bank;
 
/////////////////////////////////////////////////////////////////////
//
// Defines
//
 
`define CTRL 32'h0000_0000
`define STAT 32'h0000_0004
`define HTIM 32'h0000_0008
`define VTIM 32'h0000_000c
`define HVLEN 32'h0000_0010
`define VBARA 32'h0000_0014
`define VBARB 32'h0000_0018
 
`define USE_VC 1
 
parameter PCLK_C = 30;
 
/////////////////////////////////////////////////////////////////////
//
// Simulation Initialization and Start up Section
//
 
initial
begin
$timeformat (-9, 1, " ns", 12);
$display("\n\n");
$display("******************************************************");
$display("* WISHBONE VGA/LCD Controller Simulation started ... *");
$display("******************************************************");
$display("\n");
`ifdef WAVES
$shm_open("waves");
$shm_probe("AS",test,"AS");
$display("INFO: Signal dump enabled ...\n\n");
`endif
scen = 0;
error_cnt = 0;
clk = 0;
pclk_i = 0;
rst = 0;
int_warn=1;
 
repeat(20) @(posedge clk);
rst = 1;
repeat(20) @(posedge clk);
 
// HERE IS WHERE THE TEST CASES GO ...
 
if(0) // Full Regression Run
begin
 
end
else
if(1) // Quick Regression Run
begin
reg_test;
tim_test;
 
`ifdef VGA_24BIT_DVI
dvi_pd_test;
`endif
`ifdef VGA_12BIT_DVI
`else
pd1_test;
pd2_test;
`endif
 
ur_test;
end
else
begin
 
//
// TEST DEVELOPMENT AREA
//
$display("\n\n");
$display("*****************************************************");
$display("*** XXX Test ***");
$display("*****************************************************\n");
 
s0.fill_mem(1);
 
repeat(10) @(posedge clk);
 
vbara = 32'h0000_0000;
vbarb = 32'h0001_0000;
 
m0.wb_wr1( `VBARA, 4'hf, vbara );
m0.wb_wr1( `VBARB, 4'hf, vbarb );
 
thsync = 0;
thgdel = 0;
thgate = 340;
thlen = 345;
 
tvsync = 0;
tvgdel = 0;
tvgate = 240;
tvlen = 245;
 
/*
thsync = 0;
thgdel = 0;
thgate = 63;
thlen = 70;
 
tvsync = 0;
tvgdel = 0;
tvgate = 32;
tvlen = 36;
*/
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
 
mode = 2;
 
//for(mode=0;mode<1;mode=mode+1)
for(bank=0;bank<3;bank=bank + 1)
begin
case(mode)
0:
begin
cd = 2'h2;
pc = 1'b0;
end
1:
begin
cd = 2'h0;
pc = 1'b0;
end
2:
begin
cd = 2'h0;
pc = 1'b1;
end
3:
begin
cd = 2'h1;
pc = 1'b0;
end
endcase
 
m0.wb_wr1( `CTRL, 4'hf, {
16'h0, // Reserved
bpol, cpol,
vpol, hpol,
pc, // 1'b0, // PC
cd, // 2'h2, // CD
2'h0, // VBL
1'b0, // Reserved
1'b1, // CBSWE
1'b1, // VBSWE
1'b0, // BSIE
1'b0, // HIE
1'b0, // VIE
1'b1 // Video Enable
});
 
$display("Mode: %0d Screen: %0d", mode, bank);
//repeat(2) @(posedge vsync);
@(posedge vsync);
 
// For Each Line
for(l=0;l<tvgate+1;l=l+1)
// For each Pixel
for(p=0;p<thgate+1;p=p+1)
begin
while(blanc) @(posedge pclk); // wait for viewable data
 
//$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
 
if(bank[0]) vbase = vbarb[31:2];
else vbase = vbara[31:2];
if(bank[0]) cbase = 32'h0000_0c00;
else cbase = 32'h0000_0800;
 
// Depending on Mode, determine pixel data
// pixel number = line * (thgate + 1) + p
pn = l * (thgate + 1) + p;
 
case(mode)
0: // 24 bit/pixel mode
begin
pra = pn[31:2] * 3; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
// Pixel Data
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = tmp[31:8];
end
1:
begin
tmp = s0.mem[paa];
pd[23:16] = tmp[7:0];
tmp = s0.mem[paa+1];
pd[15:0] = tmp[31:16];
end
2:
begin
tmp = s0.mem[paa+1];
pd[23:8] = tmp[15:0];
tmp = s0.mem[paa+2];
pd[7:0] = tmp[31:24];
end
3:
begin
tmp = s0.mem[paa+2];
pd = tmp[23:0];
end
endcase
end
 
1: // 8 bit/pixel grayscale mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
end
1:
begin
tmp = s0.mem[paa];
pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
end
2:
begin
tmp = s0.mem[paa];
pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
end
3:
begin
tmp = s0.mem[paa];
pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
end
endcase
end
 
2: // 8 bit/pixel Pseudo Color mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[31:24]];
pd = tmp[23:0];
end
1:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[23:16]];
pd = tmp[23:0];
end
2:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[15:8]];
pd = tmp[23:0];
end
3:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[7:0]];
pd = tmp[23:0];
end
endcase
end
 
3: // 16 bit/pixel mode
begin
pra = pn[31:1]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
case(pn[0])
0:
begin
tmp = s0.mem[paa];
tmp[15:0] = tmp[31:16];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
1:
begin
tmp = s0.mem[paa];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
endcase
end
 
endcase
 
if(pd !== {red, green, blue} )
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",
pd, red, green, blue);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
end
 
@(posedge pclk);
 
end
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
 
end
 
repeat(10) @(posedge clk);
$finish;
end
 
/////////////////////////////////////////////////////////////////////
//
// Sync Monitor
//
 
`ifdef VGA_12BIT_DVI
sync_check #(PCLK_C) ucheck(
`else
sync_check #(PCLK_C) ucheck(
`endif
.pclk( pclk ),
.rst( rst ),
.enable( scen ),
.hsync( hsync ),
.vsync( vsync ),
.csync( csync ),
.blanc( blanc ),
.hpol( hpol ),
.vpol( vpol ),
.cpol( cpol ),
.bpol( bpol ),
.thsync( thsync ),
.thgdel( thgdel ),
.thgate( thgate ),
.thlen( thlen ),
.tvsync( tvsync ),
.tvgdel( tvgdel ),
.tvgate( tvgate ),
.tvlen( tvlen ) );
 
/////////////////////////////////////////////////////////////////////
//
// Video Data Monitor
//
 
/////////////////////////////////////////////////////////////////////
//
// WISHBONE revB.3 checker
//
 
wb_b3_check u_wb_check (
.clk_i ( clk ),
.cyc_i ( wb_cyc_o ),
.stb_i ( wb_stb_o ),
.cti_i ( wb_cti_o ),
.bte_i ( wb_bte_o ),
.we_i ( wb_we_o ),
.ack_i ( wb_ack_i ),
.err_i ( wb_err_i ),
.rty_i ( 1'b0 ) );
 
 
/////////////////////////////////////////////////////////////////////
//
// Watchdog Counter
//
 
always @(posedge clk)
if(wb_cyc_i | wb_cyc_o | wb_ack_i | wb_ack_o | hsync)
wd_cnt <= #1 0;
else
wd_cnt <= #1 wd_cnt + 1;
 
 
always @(wd_cnt)
if(wd_cnt>9000)
begin
$display("\n\n*************************************\n");
$display("ERROR: Watch Dog Counter Expired\n");
$display("*************************************\n\n\n");
$finish;
end
 
 
always @(posedge int)
if(int_warn)
begin
$display("\n\n*************************************\n");
$display("WARNING: Recieved Interrupt (%0t)", $time);
$display("*************************************\n\n\n");
end
 
always #2.4 clk = ~clk;
always #(PCLK_C/2) pclk_i = ~pclk_i;
 
/////////////////////////////////////////////////////////////////////
//
// WISHBONE VGA/LCD IP Core
//
 
 
// Module Prototype
 
`ifdef VGA_12BIT_DVI
vga_dvi_top #(1'b0, LINE_FIFO_AWIDTH) u0 (
`else
vga_enh_top #(1'b0, LINE_FIFO_AWIDTH) u0 (
`endif
.wb_clk_i ( clk ),
.wb_rst_i ( 1'b0 ),
.rst_i ( rst ),
.wb_inta_o ( int ),
 
//-- slave signals
.wbs_adr_i ( wb_addr_i[11:0] ),
.wbs_dat_i ( wb_data_i ),
.wbs_dat_o ( wb_data_o ),
.wbs_sel_i ( wb_sel_i ),
.wbs_we_i ( wb_we_i ),
.wbs_stb_i ( wb_stb_i ),
.wbs_cyc_i ( wb_cyc_i ),
.wbs_ack_o ( wb_ack_o ),
.wbs_rty_o ( wb_rty_o ),
.wbs_err_o ( wb_err_o ),
 
//-- master signals
.wbm_adr_o ( wb_addr_o[31:0] ),
.wbm_dat_i ( wbm_data_i ),
.wbm_sel_o ( wb_sel_o ),
.wbm_we_o ( wb_we_o ),
.wbm_stb_o ( wb_stb_o ),
.wbm_cyc_o ( wb_cyc_o ),
.wbm_cti_o ( wb_cti_o ),
.wbm_bte_o ( wb_bte_o ),
.wbm_ack_i ( wb_ack_i ),
.wbm_err_i ( wb_err_i ),
 
//-- VGA signals
.clk_p_i ( pclk_i )
`ifdef VGA_24BIT_DVI
, .dvi_hsync_o ( ihsync ),
.dvi_vsync_o ( ivsync ),
.dvi_de_o ( dvi_de_o ),
.dvi_d_o ( dvi_d_o )
`endif
`ifdef VGA_12BIT_DVI
`else
, .hsync_pad_o ( hsync ),
.vsync_pad_o ( vsync ),
.csync_pad_o ( csync ),
.blank_pad_o ( blanc ),
.r_pad_o ( red ),
.g_pad_o ( green ),
.b_pad_o ( blue )
`endif
 
`ifdef VGA_BIST
/* BIST signals */
, .scanb_rst(1'b1),
.scanb_clk(1'b0),
.scanb_si (1'b0),
.scanb_en (1'b0),
.scanb_so ()
`endif
);
 
assign pclk = pclk_i;
 
`ifdef VGA_12BIT_DVI
assign hsync = !ihsync;
assign vsync = !ivsync;
`endif
 
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( 1'b0 )
);
 
wb_slv #(24) s0(.clk( clk ),
.rst( rst ),
.adr( {1'b0, wb_addr_o[30:0]} ),
.din( 32'h0 ),
.dout( wbm_data_i ),
.cyc( wb_cyc_o ),
.stb( wb_stb_o ),
.sel( wb_sel_o ),
.we( wb_we_o ),
.ack( wb_ack_i ),
.err( wb_err_i ),
.rty( )
);
 
`include "tests.v"
 
endmodule
/tests.v
0,0 → 1,1551
/////////////////////////////////////////////////////////////////////
//// ////
//// Tests Library ////
//// ////
//// ////
//// Authors: Rudolf Usselmann, Richard Herveille ////
//// rudi@asics.ws, richard@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/vga_lcd/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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.10 2003-09-23 13:09:25 markom Exp $
//
// $Date: 2003-09-23 13:09:25 $
// $Revision: 1.10 $
// $Author: markom $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.9 2003/08/22 07:17:21 rherveille
// Removed ctrl register's clut and vide bank switch from the register test. As they get reset automatically. This may result to erroneous errors.
//
// Revision 1.8 2003/05/07 14:39:19 rherveille
// Added DVI tests
//
// Revision 1.7 2003/05/07 09:45:28 rherveille
// Numerous updates and added checks
//
// Revision 1.6 2003/03/19 12:20:53 rherveille
// Changed timing section in VGA core, changed testbench accordingly.
// Fixed bug in 'timing check' test.
//
// Revision 1.5 2002/04/20 09:57:55 rherveille
// Changed testbench to reflect modified VGA timing generator.
//
//
//
//
//
 
 
task show_errors;
 
begin
 
$display("\n");
$display(" +--------------------+");
$display(" | Total ERRORS: %0d |", error_cnt);
$display(" +--------------------+");
 
end
endtask
 
 
task reg_test;
 
reg [31:0] data;
reg [31:0] pattern;
integer n;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** Register Test ***");
$display("*****************************************************\n");
 
// Check reset Values
$display("Testing Reset Values ...");
check( `CTRL, 0, 32'h0000_ffff, "CTRL ");
check( `STAT, 0, 32'h0000_0073, "STAT ");
check( `HTIM, 0, 32'hffff_ffff, "HTIM ");
check( `VTIM, 0, 32'hffff_ffff, "VTIM ");
check( `HVLEN, 0, 32'hffff_ffff, "HVLEN");
check( `VBARA, 0, 32'hffff_ffff, "VBARA");
check( `VBARB, 0, 32'hffff_ffff, "VBARB");
 
$display("Testing Pattern R/W ...");
for(n=0;n<6;n=n+1)
begin
case(n)
0: pattern = 32'h0000_0000;
1: pattern = 32'hffff_ffff;
2: pattern = 32'haaaa_aaaa;
3: pattern = 32'h5555_5555;
4: pattern = 32'hcccc_cccc;
5: pattern = 32'h3333_3333;
endcase
 
m0.wb_wr1( `CTRL, 4'hf, pattern );
check( `CTRL, pattern, 32'hffff_ff9f, "CTRL ");
 
m0.wb_wr1( `HTIM, 4'hf, pattern );
check( `HTIM, pattern, 32'hffff_ffff, "HTIM ");
 
m0.wb_wr1( `VTIM, 4'hf, pattern );
check( `VTIM, pattern, 32'hffff_ffff, "VTIM ");
 
m0.wb_wr1( `HVLEN, 4'hf, pattern );
check( `HVLEN, pattern, 32'hffff_ffff, "HVLEN");
 
m0.wb_wr1( `VBARA, 4'hf, pattern );
check( `VBARA, pattern, 32'hffff_fffc, "VBARA");
 
m0.wb_wr1( `VBARB, 4'hf, pattern );
check( `VBARB, pattern, 32'hffff_fffc, "VBARB");
 
end
 
repeat(10) @(posedge clk);
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
task check;
input [31:0] addr;
input [31:0] edata;
input [31:0] mask;
input [39:0] name;
 
reg [31:0] data;
begin
 
m0.wb_rd1( addr, 4'hf, data );
if(( (data & mask) != (edata & mask)) | ((^data) === 1'bx) )
begin
$display("ERROR: %s Reg: Value Mismatch. Expected %h, Got %h (%0t)",
name, edata & mask, data, $time);
error_cnt = error_cnt + 1;
end
 
end
endtask
 
 
 
 
task tim_test;
 
integer mode;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** Timing Test ***");
$display("*****************************************************\n");
 
s0.fill_mem(0);
 
repeat(10) @(posedge clk);
 
m0.wb_wr1( `VBARA, 4'hf, 0 );
m0.wb_wr1( `VBARB, 4'hf, 0 );
 
mode = 2;
for(mode=0;mode<6;mode=mode+1)
begin
// reset core
scen = 0;
m0.wb_wr1( `CTRL, 4'hf, 32'h0000_0000);
repeat(10) @(posedge clk);
 
$display("Mode: %0d", mode);
 
case(mode)
0:
begin
thsync = 0;
thgdel = 0;
thgate = 319; // gate = 320
thlen = 345;
 
tvsync = 0;
tvgdel = 0;
tvgate = 239; // vgate = 240
tvlen = 245;
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
end
 
1:
begin
thsync = 18;
thgdel = 18;
thgate = 319; // gate = 320
thlen = 390;
 
tvsync = 18;
tvgdel = 18;
tvgate = 239; // vgate = 240
tvlen = 290;
 
hpol = 1;
vpol = 0;
cpol = 0;
bpol = 0;
end
 
2:
begin
thsync = 1;
thgdel = 1;
thgate = 639; // hgate = 640
thlen = 644;
 
tvsync = 1;
tvgdel = 1;
tvgate = 479; // vgate = 480
tvlen = 484;
 
hpol = 0;
vpol = 1;
cpol = 0;
bpol = 0;
end
 
3:
begin
thsync = 0;
thgdel = 2;
thgate = 799; // hgate = 800
thlen = 804;
 
tvsync = 0;
tvgdel = 2;
tvgate = 599; // vgate = 600
tvlen = 604;
 
hpol = 0;
vpol = 0;
cpol = 1;
bpol = 0;
end
 
4:
begin
thsync = 3;
thgdel = 2;
thgate = 799; // hgate = 800
thlen = 807;
 
tvsync = 2;
tvgdel = 2;
tvgate = 599; // vgate = 600
tvlen = 606;
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 1;
end
 
5:
begin
thsync = 6;
thgdel = 2;
thgate = 799; // hgate = 800
thlen = 810;
 
tvsync = 4;
tvgdel = 2;
tvgate = 599; // vgate = 600
tvlen = 608;
 
hpol = 1;
vpol = 1;
cpol = 1;
bpol = 1;
end
endcase
 
/*
thsync = 0;
thgdel = 0;
thgate = 64;
thlen = 70;
 
tvsync = 0;
tvgdel = 0;
tvgate = 64;
tvlen = 70;
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
*/
 
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
m0.wb_wr1( `CTRL, 4'hf, {
16'h0,
bpol, cpol,
vpol, hpol,
1'b0, // PC
2'h0, // CD
2'h0, // VBL
2'h0, // Reserved
5'h01 // Bank Switch, INT, VideoEn
});
 
repeat(2) @(posedge vsync);
scen = 1;
repeat(4) @(posedge vsync);
end
 
scen = 0;
repeat(10) @(posedge clk);
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
 
task pd1_test;
 
integer mode;
integer n, p, l;
reg [31:0] pn;
reg [31:0] pra, paa, tmp;
reg [23:0] pd;
reg [ 1:0] cd;
reg pc;
reg [31:0] data;
reg [31:0] cbar;
reg [ 7:0] vbl;
reg [ 5:0] delay;
 
begin
 
$display("\n\n");
$display("*****************************************************");
$display("*** Pixel Data Test 1 ***");
$display("*****************************************************\n");
 
m0.wb_wr1( `VBARA, 4'hf, 0 );
m0.wb_wr1( `VBARB, 4'hf, 123456 );
 
cbar = 32'h0000_0800;
 
thsync = 0;
thgdel = 0;
thgate = 320;
thlen = 345;
 
tvsync = 0;
tvgdel = 0;
tvgate = 240;
tvlen = 245;
 
thsync = 39;
thgdel = 124;
thgate = 646;
thlen = 832;
 
tvsync = 2;
tvgdel = 25;
tvgate = 484;
tvlen = 520;
 
thsync = 6;
thgdel = 20;
thgate = 319;
thlen = 390;
 
tvsync = 1;
tvgdel = 8;
tvgate = 239;
tvlen = 280;
 
/*
thsync = 0;
thgdel = 0;
thgate = 63;
thlen = 70;
 
tvsync = 0;
tvgdel = 0;
tvgate = 32;
tvlen = 36;
 
thsync = 119;
thgdel = 61;
thgate = 805;
thlen = 1038;
 
tvsync = 5;
tvgdel = 20;
tvgate = 600;
tvlen = 665;
 
*/
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
 
mode = 3;
vbl = 1;
delay = 1;
 
for(delay=0;delay<6;delay=delay+1)
begin
s0.set_delay(delay);
for(vbl=0;vbl<4;vbl=vbl+1)
for(mode=0;mode<4;mode=mode+1)
begin
// -------------------------------
// Turn Off VGA before Mode Change
 
m0.wb_wr1( `CTRL, 4'hf, {
16'h0, // Reserved
bpol, cpol,
vpol, hpol,
pc, // 1'b0, // PC
cd, // 2'h2, // CD
2'h0, // VBL
1'b0, // CBSWE
1'b0, // VBSWE
1'b0, // CBSIE
1'b0, // VBSIE
1'b0, // HIE
1'b0, // VIE
1'b0 // Video Enable
});
 
s0.fill_mem(1);
 
`ifdef USE_VC
// Fill internal Color Lookup Table
repeat(10) @(posedge clk);
for(n=0;n<512;n=n+1)
begin
//m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
data = s0.mem[ cbar[31:2] + n];
m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
end
repeat(10) @(posedge clk);
`endif
 
case(mode)
0:
begin
cd = 2'h2;
pc = 1'b0;
end
1:
begin
cd = 2'h0;
pc = 1'b0;
end
2:
begin
cd = 2'h0;
pc = 1'b1;
end
3:
begin
cd = 2'h1;
pc = 1'b0;
end
endcase
 
//repeat(50) @(posedge clk);
 
// -------------------------------
// Turn VGA back On ...
m0.wb_wr1( `CTRL, 4'hf, {
16'h0, // Reserved
bpol, cpol,
vpol, hpol,
pc, // 1'b0, // PC
cd, // 2'h2, // CD
vbl[1:0], // VBL
1'b0, // Reserved
1'b0, // CBSWE
1'b0, // VBSWE
1'b0, // BSIE
1'b0, // HIE
1'b0, // VIE
1'b1 // Video Enable
});
 
$display("VBL: %0d, Mode: %0d", vbl, mode);
repeat(2) @(posedge vsync);
 
// For Each Line
for(l=0;l<tvgate;l=l+1)
// For each Pixel
for(p=0;p<thgate+1;p=p+1)
begin
while(blanc) @(posedge pclk); // wait for viewable data
 
//$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
 
// Depending on Mode, determine pixel data
// pixel number = line * (thgate + 1) + p
pn = l * (thgate + 1) + p;
 
case(mode)
0: // 24 bit/pixel mode
begin
pra = pn[31:2] * 3; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
 
// Pixel Data
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = tmp[31:8];
end
1:
begin
tmp = s0.mem[paa];
pd[23:16] = tmp[7:0];
tmp = s0.mem[paa+1];
pd[15:0] = tmp[31:16];
end
2:
begin
tmp = s0.mem[paa+1];
pd[23:8] = tmp[15:0];
tmp = s0.mem[paa+2];
pd[7:0] = tmp[31:24];
end
3:
begin
tmp = s0.mem[paa+2];
pd = tmp[23:0];
end
endcase
end
 
1: // 8 bit/pixel grayscale mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
end
1:
begin
tmp = s0.mem[paa];
pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
end
2:
begin
tmp = s0.mem[paa];
pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
end
3:
begin
tmp = s0.mem[paa];
pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
end
endcase
end
 
2: // 8 bit/pixel Pseudo Color mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[31:24]];
pd = tmp[23:0];
end
1:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[23:16]];
pd = tmp[23:0];
end
2:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[15:8]];
pd = tmp[23:0];
end
3:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[7:0]];
pd = tmp[23:0];
end
endcase
end
 
3: // 16 bit/pixel mode
begin
pra = pn[31:1]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[0])
0:
begin
tmp = s0.mem[paa];
tmp[15:0] = tmp[31:16];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
1:
begin
tmp = s0.mem[paa];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
endcase
end
 
endcase
 
if(pd !== {red, green, blue} )
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",
pd, red, green, blue);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
if(error_cnt > 10) $stop;
end
 
@(posedge pclk);
 
end
end end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
task pd2_test;
 
integer mode;
integer p, l;
reg [31:0] pn;
reg [31:0] pra, paa, tmp;
reg [23:0] pd;
reg [ 1:0] cd;
reg pc;
reg [31:0] cbar;
reg [31:0] vbase;
reg [31:0] cbase;
reg [31:0] vbara;
reg [31:0] vbarb;
reg [ 7:0] bank, vbl;
reg [ 5:0] delay;
 
begin
 
$display("\n\n");
$display("*****************************************************");
$display("*** Pixel Data Test 2 ***");
$display("*****************************************************\n");
 
s0.fill_mem(1);
 
repeat(10) @(posedge clk);
 
vbara = 32'h0000_0000;
vbarb = 32'h0040_0000;
cbar = 32'h0000_0800;
 
m0.wb_wr1( `VBARA, 4'hf, vbara );
m0.wb_wr1( `VBARB, 4'hf, vbarb );
 
thsync = 6;
thgdel = 20;
thgate = 319;
thlen = 390;
 
tvsync = 1;
tvgdel = 8;
tvgate = 239;
// tvgate = 240;
tvlen = 280;
 
/*
thsync = 0;
thgdel = 0;
thgate = 63;
thlen = 70;
 
tvsync = 0;
tvgdel = 0;
tvgate = 32;
tvlen = 36;
 
*/
 
/*
thsync = 39;
thgdel = 124;
thgate = 645;
thlen = 832;
 
tvsync = 2;
tvgdel = 25;
tvgate = 483;
tvlen = 520;
*/
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
 
 
`ifdef USE_VC
// Fill internal Color Lookup Table
repeat(10) @(posedge clk);
for(n=0;n<512;n=n+1)
begin
//m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
data = s0.mem[ cbar[31:2] + n];
m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
end
repeat(10) @(posedge clk);
`endif
 
 
vbl = 3;
mode = 3;
delay = 2;
 
for(delay=0;delay<6;delay=delay+1)
begin
s0.set_delay(delay);
for(vbl=0;vbl<4;vbl=vbl+1)
for(mode=0;mode<=4;mode=mode+1)
begin
 
m0.wb_wr1( `CTRL, 4'hf, 32'h0);
repeat(100) @(posedge clk);
 
case(mode)
0:
begin
cd = 2'h2;
pc = 1'b0;
end
 
1:
begin
cd = 2'h0;
pc = 1'b0;
end
 
2:
begin
cd = 2'h0;
pc = 1'b1;
end
 
3:
begin
cd = 2'h1;
pc = 1'b0;
end
 
4:
begin
cd = 2'h3;
pc = 1'b0;
end
endcase
 
m0.wb_wr1( `CTRL, 4'hf, {
16'h0, // Reserved
bpol, cpol,
vpol, hpol,
pc, // 1'b0, // PC
cd, // 2'h2, // CD
vbl[1:0],// VBL
1'b1, // CBSWE
1'b1, // VBSWE
1'b0, // CBSIE
1'b0, // VBSIE
1'b0, // HIE
1'b0, // VIE
1'b1 // Video Enable
}
);
 
bank = 0;
 
//for(bank=0;bank<3;bank=bank+1)
for(bank=0;bank<2;bank=bank+1)
begin
 
$display("VBL: %0d, Mode: %0d Screen: %0d", vbl, mode, bank);
@(posedge vsync);
 
error_cnt=0;
// For Each Line
for(l=0; l<tvgate;l=l+1)
// For each Pixel
for(p=0;p<thgate+1;p=p+1)
begin
while(blanc) @(posedge pclk); // wait for viewable data
 
//$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
 
if(bank[0]) vbase = vbarb[31:2];
else vbase = vbara[31:2];
if(bank[0]) cbase = cbar | 32'h0000_0400;
else cbase = cbar;
 
// Depending on Mode, determine pixel data
// pixel number = line * (thgate + 1) + p
pn = l * (thgate + 1) + p;
 
case(mode)
0: // 24 bit/pixel mode
begin
pra = pn[31:2] * 3; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
// Pixel Data
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = tmp[31:8];
end
 
1:
begin
tmp = s0.mem[paa];
pd[23:16] = tmp[7:0];
tmp = s0.mem[paa+1];
pd[15:0] = tmp[31:16];
end
 
2:
begin
tmp = s0.mem[paa+1];
pd[23:8] = tmp[15:0];
tmp = s0.mem[paa+2];
pd[7:0] = tmp[31:24];
end
 
3:
begin
tmp = s0.mem[paa+2];
pd = tmp[23:0];
end
endcase
end
 
1: // 8 bit/pixel grayscale mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
end
 
1:
begin
tmp = s0.mem[paa];
pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
end
 
2:
begin
tmp = s0.mem[paa];
pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
end
 
3:
begin
tmp = s0.mem[paa];
pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
end
endcase
end
 
2: // 8 bit/pixel Pseudo Color mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[31:24]];
pd = tmp[23:0];
end
 
1:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[23:16]];
pd = tmp[23:0];
end
 
2:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[15:8]];
pd = tmp[23:0];
end
 
3:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbase[31:2] + tmp[7:0]];
pd = tmp[23:0];
end
endcase
end
 
3: // 16 bit/pixel mode
begin
pra = pn[31:1]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
case(pn[0])
0:
begin
tmp = s0.mem[paa];
tmp[15:0] = tmp[31:16];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
 
1:
begin
tmp = s0.mem[paa];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
endcase
end
 
4: // 32 bit/pixel mode
begin
pra = pn[31:0]; // Pixel relative Address
paa = pra + vbase; // Pixel Absolute Address
 
tmp = s0.mem[paa];
pd = tmp[23:0];
end
 
endcase
 
if(pd !== {red, green, blue} )
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",
pd, red, green, blue);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
if(error_cnt > 10) $stop;
end
 
@(posedge pclk);
 
end
end
end end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
 
task ur_test;
 
integer mode;
integer n, p, l;
reg [31:0] pn;
reg [31:0] pra, paa, tmp;
reg [23:0] pd;
reg [1:0] cd;
reg pc;
reg [31:0] cbar;
reg [31:0] data;
reg [7:0] vbl;
 
begin
 
$display("\n\n");
$display("*****************************************************");
$display("*** FIFO Underrun Test 1 ***");
$display("*****************************************************\n");
 
s0.delay=15;
int_warn = 0;
 
m0.wb_wr1( `VBARA, 4'hf, 0 );
m0.wb_wr1( `VBARB, 4'hf, 123456 );
 
cbar = 32'h0000_0800;
 
thsync = 6;
thgdel = 20;
thgate = 319;
thlen = 390;
 
tvsync = 1;
tvgdel = 8;
tvgate = 239;
tvlen = 280;
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
 
mode = 0;
 
// -------------------------------
// Turn Off VGA before Mode Change
 
m0.wb_wr1( `CTRL, 4'hf, 32'h0000_0000);
 
s0.fill_mem(1);
 
`ifdef USE_VC
// Fill internal Color Lookup Table
repeat(10) @(posedge clk);
for(n=0;n<512;n=n+1)
begin
//m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
data = s0.mem[ cbar[31:2] + n];
m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
end
repeat(10) @(posedge clk);
`endif
 
case(mode)
0:
begin
cd = 2'h2;
pc = 1'b0;
end
1:
begin
cd = 2'h0;
pc = 1'b0;
end
2:
begin
cd = 2'h0;
pc = 1'b1;
end
3:
begin
cd = 2'h1;
pc = 1'b0;
end
endcase
 
// -------------------------------
// Turn VGA back On ...
m0.wb_wr1( `CTRL, 4'hf, {
16'h0, // Reserved
bpol, cpol,
vpol, hpol,
pc, // 1'b0, // PC
cd, // 2'h2, // CD
2'b00, // VBL
1'b0, // Reserved
1'b0, // CBSWE
1'b0, // VBSWE
1'b0, // BSIE
1'b0, // HIE
1'b0, // VIE
1'b1 // Video Enable
});
 
while(!int) @(posedge clk);
m0.wb_rd1( `STAT, 4'hf, data);
if(data[1] !== 1'b1)
begin
$display("ERROR: Did not get Line FIFO Interrupt. (%0t)",
$time);
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
m0.wb_wr1( `CTRL, 4'hf, 32'h0000_0000);
int_warn = 1;
s0.delay=1;
repeat(10) @(posedge clk);
 
end
endtask
 
 
//////////////////////////////////////
//
// DVI test section
//
 
 
task dvi_pd_test;
 
integer mode;
integer n, p, l;
reg [ 2:0] dvi_odf;
reg [31:0] pn;
reg [31:0] pra, paa, tmp;
reg [23:0] pd;
reg [11:0] pda, pdb;
reg [ 1:0] cd;
reg pc;
reg [31:0] data;
reg [31:0] cbar;
reg [ 7:0] vbl;
reg [ 5:0] delay;
 
begin
 
$display("\n\n");
$display("*****************************************************");
$display("*** DVI Pixel Data Test ***");
$display("*****************************************************\n");
 
m0.wb_wr1( `VBARA, 4'hf, 0 );
m0.wb_wr1( `VBARB, 4'hf, 123456 );
 
cbar = 32'h0000_0800;
 
thsync = 0;
thgdel = 0;
thgate = 320;
thlen = 345;
 
tvsync = 0;
tvgdel = 0;
tvgate = 240;
tvlen = 245;
 
thsync = 39;
thgdel = 124;
thgate = 646;
thlen = 832;
 
tvsync = 2;
tvgdel = 25;
tvgate = 484;
tvlen = 520;
 
thsync = 6;
thgdel = 20;
thgate = 319;
thlen = 390;
 
tvsync = 1;
tvgdel = 8;
tvgate = 239;
tvlen = 280;
 
hpol = 0;
vpol = 0;
cpol = 0;
bpol = 0;
 
m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );
 
// Choose mode, vbl, and delay
// These should have been tested & verified by previous tests
mode = 3;
vbl = 4;
delay = 0;
s0.set_delay(delay);
 
for(dvi_odf=0; dvi_odf<4;dvi_odf=dvi_odf +1)
begin
// -------------------------------
// Turn Off VGA before Mode Change
 
m0.wb_wr1( `CTRL, 4'hf, {
2'h0, // Reserved
dvi_odf[1:0],
12'h0, // Reserved
bpol,
cpol,
vpol,
hpol,
pc, // PC
cd, // CD
2'h0, // VBL
1'b0, // CBSWE
1'b0, // VBSWE
1'b0, // CBSIE
1'b0, // VBSIE
1'b0, // HIE
1'b0, // VIE
1'b0 // Video Enable
});
 
s0.fill_mem(1);
 
`ifdef USE_VC
// Fill internal Color Lookup Table
repeat(10) @(posedge clk);
for(n=0;n<512;n=n+1)
begin
//m0.wb_rd1( 32'h0002_0000 + (n*4), 4'hf, data );
data = s0.mem[ cbar[31:2] + n];
m0.wb_wr1( 32'h0000_0800 + (n*4), 4'hf, data );
end
repeat(10) @(posedge clk);
`endif
 
case(mode)
0:
begin
cd = 2'h2;
pc = 1'b0;
end
1:
begin
cd = 2'h0;
pc = 1'b0;
end
2:
begin
cd = 2'h0;
pc = 1'b1;
end
3:
begin
cd = 2'h1;
pc = 1'b0;
end
endcase
 
//repeat(50) @(posedge clk);
 
// -------------------------------
// Turn VGA back On ...
m0.wb_wr1( `CTRL, 4'hf, {
2'h0, // Reserved
dvi_odf[1:0],
12'h0, // Reserved
bpol,
cpol,
vpol,
hpol,
pc, // PC
cd, // CD
2'h0, // VBL
1'b0, // CBSWE
1'b0, // VBSWE
1'b0, // CBSIE
1'b0, // VBSIE
1'b0, // HIE
1'b0, // VIE
1'b1 // Video Enable
});
 
$display("DVI output data format: %0h", dvi_odf);
repeat(2) @(posedge vsync);
 
// For Each Line
for(l=0;l<tvgate;l=l+1)
// For each Pixel
for(p=0;p<thgate+1;p=p+1)
begin
while(dvi_de_o == 1'b0) @(pclk); // wait for viewable data
 
//$display("pixel=%0d, line=%0d, (%0t)",p,l,$time);
 
// Depending on Mode, determine pixel data
// pixel number = line * (thgate + 1) + p
pn = l * (thgate + 1) + p;
 
//
// Get the correct pixel data
case(mode)
0: // 24 bit/pixel mode
begin
pra = pn[31:2] * 3; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
 
// Pixel Data
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = tmp[31:8];
end
1:
begin
tmp = s0.mem[paa];
pd[23:16] = tmp[7:0];
tmp = s0.mem[paa+1];
pd[15:0] = tmp[31:16];
end
2:
begin
tmp = s0.mem[paa+1];
pd[23:8] = tmp[15:0];
tmp = s0.mem[paa+2];
pd[7:0] = tmp[31:24];
end
3:
begin
tmp = s0.mem[paa+2];
pd = tmp[23:0];
end
endcase
end
 
1: // 8 bit/pixel grayscale mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
pd = { tmp[31:24], tmp[31:24], tmp[31:24] };
end
1:
begin
tmp = s0.mem[paa];
pd = { tmp[23:16], tmp[23:16], tmp[23:16] };
end
2:
begin
tmp = s0.mem[paa];
pd = { tmp[15:8], tmp[15:8], tmp[15:8] };
end
3:
begin
tmp = s0.mem[paa];
pd = { tmp[7:0], tmp[7:0], tmp[7:0] };
end
endcase
end
 
2: // 8 bit/pixel Pseudo Color mode
begin
pra = pn[31:2]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[1:0])
0:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[31:24]];
pd = tmp[23:0];
end
1:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[23:16]];
pd = tmp[23:0];
end
2:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[15:8]];
pd = tmp[23:0];
end
3:
begin
tmp = s0.mem[paa];
tmp = s0.mem[cbar[31:2] + tmp[7:0]];
pd = tmp[23:0];
end
endcase
end
 
3: // 16 bit/pixel mode
begin
pra = pn[31:1]; // Pixel relative Address
paa = pra + 0; // Pixel Absolute Address
case(pn[0])
0:
begin
tmp = s0.mem[paa];
tmp[15:0] = tmp[31:16];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
1:
begin
tmp = s0.mem[paa];
pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};
end
endcase
end
 
endcase
 
//
// convert pixel data in DVI output format
case (dvi_odf)
2'b00:
begin
pda = pd[11:0];
pdb = pd[23:12];
end
 
2'b01:
begin
pda = {pd[12:10],pd[7:3],pd[8],pd[2:0]};
pdb = {pd[23:19],pd[15:13],pd[18:16],pd[9]};
end
 
2'b10:
begin
pda = {pd[12:10],pd[7:3],4'h0};
pdb = {pd[23:19],pd[15:13],4'h0};
end
 
2'b11:
begin
pda = {pd[13:11],pd[7:3],4'h0};
pdb = {1'b0,pd[23:19],pd[15:14],4'h0};
end
endcase
 
//
// verify pixel data
 
`ifdef VGA_12BIT_DVI
 
// rising edge data
if (pda !== dvi_d_o)
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h",
pda, dvi_d_o);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
if(error_cnt > 10) $stop;
end
 
@(negedge pclk_i);
 
// falling edge data
if (pdb !== dvi_d_o)
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h",
pdb, dvi_d_o);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
if(error_cnt > 10) $stop;
end
@(posedge pclk_i);
`else
 
// compare data
if ({pdb, pda} !== dvi_d_o)
begin
$display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h",
{pdb, pda}, dvi_d_o);
$display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);
error_cnt = error_cnt + 1;
if(error_cnt > 10) $stop;
end
 
@(negedge pclk_i);
@(posedge pclk_i);
`endif
end
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
/sync_check.v
0,0 → 1,234
/////////////////////////////////////////////////////////////////////
//// ////
//// Top Level Test Bench ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/vga_lcd/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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: sync_check.v,v 1.5 2003-09-23 13:09:25 markom Exp $
//
// $Date: 2003-09-23 13:09:25 $
// $Revision: 1.5 $
// $Author: markom $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2003/05/07 09:45:28 rherveille
// Numerous updates and added checks
//
// Revision 1.3 2003/03/19 12:20:53 rherveille
// Changed timing section in VGA core, changed testbench accordingly.
// Fixed bug in 'timing check' test.
//
// Revision 1.2 2001/11/15 07:04:15 rherveille
// Updated testbench for VGA/LCD Core version 2.0
//
//
//
//
//
 
`timescale 1ns / 10ps
`include "vga_defines.v"
 
module sync_check( pclk, rst, enable, hsync, vsync, csync, blanc,
hpol, vpol, cpol, bpol,
thsync, thgdel, thgate, thlen,
tvsync, tvgdel, tvgate, tvlen);
 
input pclk, rst, enable, hsync, vsync, csync, blanc;
input hpol, vpol, cpol, bpol;
input [7:0] thsync, thgdel;
input [15:0] thgate, thlen;
input [7:0] tvsync, tvgdel;
input [15:0] tvgate, tvlen;
 
 
time last_htime;
reg hvalid;
time htime;
time hhtime;
 
time last_vtime;
reg vvalid;
time vtime;
time vhtime;
 
wire [31:0] htime_exp;
wire [31:0] hhtime_exp;
wire [31:0] vtime_exp;
wire [31:0] vhtime_exp;
 
wire hcheck;
wire vcheck;
 
wire [31:0] bh_start;
wire [31:0] bh_end;
wire [31:0] bv_start;
wire [31:0] bv_end;
 
integer bdel1;
reg bval1;
reg bval;
integer bdel2;
wire bcheck;
 
//initial hvalid=0;
//initial vvalid=0;
 
parameter clk_time = 40;
 
assign hcheck = enable;
assign vcheck = enable;
assign hhtime_exp = (thsync +1) * clk_time;
assign htime_exp = (thlen +1) * clk_time;
assign vhtime_exp = (htime_exp * (tvsync +1));
assign vtime_exp = htime_exp * (tvlen +1);
 
always @(posedge pclk)
if(!rst | !enable)
begin
hvalid = 0;
vvalid = 0;
end
 
// Verify HSYNC Timing
always @(hsync)
if(hcheck)
begin
if(hsync == ~hpol)
begin
htime = $time - last_htime;
//if(hvalid) $display("HSYNC length time: %0t", htime);
if(hvalid & (htime != htime_exp))
$display("HSYNC length ERROR: Expected: %0d Got: %0d (%0t)",
htime_exp, htime, $time);
last_htime = $time;
hvalid = 1;
end
 
if(hsync == hpol)
begin
hhtime = $time - last_htime;
//if(hvalid) $display("HSYNC pulse time: %0t", hhtime);
if(hvalid & (hhtime != hhtime_exp))
$display("HSYNC Pulse ERROR: Expected: %0d Got: %0d (%0t)",
hhtime_exp, hhtime, $time);
end
end
 
 
// Verify VSYNC Timing
always @(vsync)
if(vcheck)
begin
if(vsync == ~vpol)
begin
vtime = $time - last_vtime;
//if(vvalid) $display("VSYNC length time: %0t", vtime);
if(vvalid & (vtime != vtime_exp))
$display("VSYNC length ERROR: Expected: %0d Got: %0d (%0t)",
vtime_exp, vtime, $time);
last_vtime = $time;
vvalid = 1;
end
 
if(vsync == vpol)
begin
vhtime = $time - last_vtime;
//if(vvalid) $display("VSYNC pulse time: %0t", vhtime);
if(vvalid & (vhtime != vhtime_exp))
$display("VSYNC Pulse ERROR: Expected: %0d Got: %0d (%0t)",
vhtime_exp, vhtime, $time);
end
end
 
`ifdef VGA_12BIT_DVI
`else
// Verify BLANC Timing
//assign bv_start = tvsync + tvgdel + 2;
//assign bv_end = bv_start + tvgate + 2;
 
//assign bh_start = thsync + thgdel + 1;
//assign bh_end = bh_start + thgate + 2;
assign bv_start = tvsync + tvgdel + 1;
assign bv_end = bv_start + tvgate + 2;
 
assign bh_start = thsync + thgdel + 1;
assign bh_end = bh_start + thgate + 2;
 
assign bcheck = enable;
 
always @(vsync)
if(vsync == ~vpol)
bdel1 = 0;
 
always @(hsync)
if(hsync == ~hpol)
bdel1 = bdel1 + 1;
 
always @(bdel1)
bval1 = (bdel1 > bv_start) & (bdel1 < bv_end);
 
always @(hsync)
if(hsync == ~hpol)
bdel2 = 0;
 
always @(posedge pclk)
bdel2 = bdel2 + 1;
 
initial bval = 1;
always @(bdel2)
bval = #1 !(bval1 & (bdel2 > bh_start) & (bdel2 < bh_end));
 
always @(bval or blanc)
#0.01
if(enable)
if(( (blanc ^ bpol) != bval) & bcheck)
$display("BLANK ERROR: Expected: %0d Got: %0d (%0t)",
bval, (blanc ^ bpol), $time);
 
// verify CSYNC
always @(csync or vsync or hsync)
if(enable)
if( (csync ^ cpol) != ( (vsync ^ vpol) | (hsync ^ hpol) ) )
$display("CSYNC ERROR: Expected: %0d Got: %0d (%0t)",
( (vsync ^ vpol) | (hsync ^ hpol) ), (csync ^ cpol), $time);
`endif
 
endmodule
 
/wb_slv_model.v
0,0 → 1,170
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE Slave Model ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/vga_lcd/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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_slv_model.v,v 1.3 2003-05-07 09:45:28 rherveille Exp $
//
// $Date: 2003-05-07 09:45:28 $
// $Revision: 1.3 $
// $Author: rherveille $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/02/07 05:38:32 rherveille
// Added wb_ack delay section to testbench
//
// Revision 1.1 2001/08/21 05:42:32 rudi
//
// - Changed Directory Structure
// - Added verilog Source Code
// - Changed IO pin names and defines statements
//
//
//
//
 
`include "wb_model_defines.v"
 
module wb_slv(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);
 
input clk, rst;
input [31:0] adr, din;
output [31:0] dout;
input cyc, stb;
input [3:0] sel;
input we;
output ack, err, rty;
 
////////////////////////////////////////////////////////////////////
//
// Local Wires
//
 
parameter mem_size = 13;
parameter sz = (1<<mem_size)-1;
 
reg [31:0] mem[sz:0];
wire mem_re, mem_we;
wire [31:0] tmp;
reg [31:0] dout, tmp2;
 
reg ack, err, rty;
reg [31:0] del_ack;
reg [5:0] delay;
 
////////////////////////////////////////////////////////////////////
//
// Memory Logic
//
 
initial
begin
delay = 0;
ack = 0;
err = 0;
rty = 0;
#2;
$display("\nINFO: WISHBONE MEMORY MODEL INSTANTIATED (%m)");
$display(" Memory Size %0d address lines %0d words\n",
mem_size, sz+1);
end
 
assign mem_re = cyc & stb & !we;
assign mem_we = cyc & stb & we;
 
assign tmp = mem[adr[mem_size+1:2]];
 
always @(sel or tmp or mem_re or ack)
if(mem_re & ack)
begin
dout[31:24] <= #1 sel[3] ? tmp[31:24] : 8'hxx;
dout[23:16] <= #1 sel[2] ? tmp[23:16] : 8'hxx;
dout[15:08] <= #1 sel[1] ? tmp[15:08] : 8'hxx;
dout[07:00] <= #1 sel[0] ? tmp[07:00] : 8'hxx;
end
else dout <= #1 32'hzzzz_zzzz;
 
 
always @(sel or tmp or din)
begin
tmp2[31:24] = !sel[3] ? tmp[31:24] : din[31:24];
tmp2[23:16] = !sel[2] ? tmp[23:16] : din[23:16];
tmp2[15:08] = !sel[1] ? tmp[15:08] : din[15:08];
tmp2[07:00] = !sel[0] ? tmp[07:00] : din[07:00];
end
 
always @(posedge clk)
if(mem_we) mem[adr[mem_size+1:2]] <= #1 tmp2;
 
always @(posedge clk)
del_ack = ack ? 0 : {del_ack[30:0], cyc & stb};
 
always ack = #1 cyc & stb & ((delay==0) ? 1'b1 : del_ack[delay-1]);
 
 
task fill_mem;
input mode;
integer n, mode;
 
begin
for(n=0;n<(sz+1);n=n+1)
begin
case(mode)
0: mem[n] = { ~n[15:0], n[15:0] };
1: mem[n] = $random;
2: mem[n] = { n[5:0], 2'h3, n[5:0], 2'h2, n[5:0], 2'h1, n[5:0], 2'h0};
endcase
end
end
endtask
 
task set_delay;
input dly;
 
reg [5:0] dly;
begin
delay = dly;
$display("\n INFO: WISHBONE MEMORY MODEL (%M)");
$display(" Delay set to %d\n", delay);
end
endtask
 
endmodule
 
/wb_b3_check.v
0,0 → 1,199
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE revB.3 Registered Feedback Cycle checker ////
//// ////
//// ////
//// Author: Richard Herveille ////
//// richard@ascis.ws ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/vga_lcd/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2003 Richard Herveille ////
//// richard@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. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module wb_b3_check (clk_i, cyc_i, stb_i, we_i, cti_i, bte_i, ack_i, err_i, rty_i);
 
input clk_i;
input cyc_i;
input stb_i;
input [2:0] cti_i;
input [1:0] bte_i;
input we_i;
input ack_i;
input err_i;
input rty_i;
 
 
parameter [2:0] cti_classic = 3'b000;
parameter [2:0] cti_streaming = 3'b001;
parameter [2:0] cti_inc_burst = 3'b010;
parameter [2:0] cti_eob = 3'b111;
 
// check CTI, BTE
reg [2:0] pcti; // previous cti
reg [1:0] pbte; // previous bte
reg pwe; // previous we
reg chk;
 
integer wb_b3_err;
 
initial
begin
chk = 0;
wb_b3_err = 0;
 
$display ("**********************************************");
$display ("** **");
$display ("** WISBONE RevB.3 sanity check instantiated **");
$display ("** (C) 2003 Richard Herveille **");
$display ("** **");
$display ("**********************************************");
end
 
 
always @(posedge clk_i)
begin
pcti <= #1 cti_i;
pbte <= #1 bte_i;
pwe <= #1 we_i;
end
 
 
always @(posedge clk_i)
if (cyc_i) begin
chk <= #1 1'b1;
end else
chk <= #1 1'b0;
 
 
 
//
// Check CTI_I
always @(cti_i)
if (chk)
if (cyc_i) begin
if (ack_i)
case (cti_i)
cti_eob: ; // ok
 
default:
if ( (cti_i !== pcti) && (pcti !== cti_eob) ) begin
$display("\nWISHBONE revB.3 Burst error. CTI change from %b to %b not allowed. (%t)\n",
pcti, cti_i, $time);
 
wb_b3_err = wb_b3_err +1;
end
endcase
else
if ( (cti_i !== pcti) && (pcti !== cti_eob) ) begin
$display("\nWISHBONE revB.3 Burst error. Illegal CTI change during burst transfer. (%t)\n",
$time);
 
wb_b3_err = wb_b3_err +1;
end
end else
case (pcti)
cti_classic: ; //ok
cti_eob: ; // ok
 
default: begin
$display("\nWISHBONE revB.3 Burst error. Cycle negated without EOB (CTI=%b). (%t)\n",
pcti, $time);
 
wb_b3_err = wb_b3_err +1;
end
endcase
 
 
//
// Check BTE_I
always @(bte_i)
if (chk & cyc_i)
if (ack_i) begin
if ( (pcti !== cti_eob) && (bte_i !== pbte) ) begin
$display("\nWISHBONE revB.3 Burst ERROR. BTE change from %b to %b not allowed. (%t)\n",
pbte, bte_i, $time);
 
wb_b3_err = wb_b3_err +1;
end
end else begin
$display("\nWISHBONE revB.3 Burst error. Illegal BTE change in burst cycle. (%t)\n",
$time);
 
wb_b3_err = wb_b3_err +1;
end
 
//
// Check WE_I
always @(we_i)
if (chk & cyc_i & stb_i)
if (ack_i) begin
if ( (pcti !== cti_eob) && (we_i !== pwe)) begin
$display("\nWISHBONE revB.3 Burst ERROR. WE change from %b to %b not allowed. (%t)\n",
pwe, we_i, $time);
 
wb_b3_err = wb_b3_err +1;
end
end else begin
$display("\nWISHBONE revB.3 Burst error. Illegal WE change in burst cycle. (%t)\n",
$time);
 
wb_b3_err = wb_b3_err +1;
end
 
 
 
//
// Check ACK_I, ERR_I, RTY_I
always @(posedge clk_i)
if (cyc_i & stb_i)
case ({ack_i, err_i, rty_i})
3'b000: ;
3'b001: ;
3'b010: ;
3'b100: ;
 
default: begin
$display("\n WISHBONE revB.3 ERROR. Either ack(%0b), rty(%0b), or err(%0b) may be asserted. (%t)",
ack_i, rty_i, err_i, $time);
 
wb_b3_err = wb_b3_err +1;
end
endcase
 
//
// check errors
always @(wb_b3_err)
if (chk && (wb_b3_err > 10) ) begin
$display ("**********************************************");
$display ("** **");
$display ("** More than 10 WISBONE RevB.3 errors found **");
$display ("** Simulation stopped **");
$display ("** **");
$display ("**********************************************");
$stop;
end
endmodule
/wb_model_defines.v
0,0 → 1,63
/////////////////////////////////////////////////////////////////////
//// ////
//// WISHBONE Model Definitions ////
//// ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/cores/wb_dma/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 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.2 2003-03-19 12:20:53 rherveille Exp $
//
// $Date: 2003-03-19 12:20:53 $
// $Revision: 1.2 $
// $Author: rherveille $
// $Locker: $
// $State: Exp $
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/08/21 05:42:32 rudi
//
// - Changed Directory Structure
// - Added verilog Source Code
// - Changed IO pin names and defines statements
//
// Revision 1.1.1.1 2001/03/19 13:12:48 rudi
// Initial Release
//
//
//
 
`timescale 1ns / 10ps
//`timescale 1ns / 1ns

powered by: WebSVN 2.1.0

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