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

Subversion Repositories mem_ctrl

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 15 to Rev 16
    Reverse comparison

Rev 15 → Rev 16

/trunk/bench/verilog/wb_mast_model.v
13,7 → 13,7
//// ////
//// 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 ////
37,10 → 37,10
 
// CVS Log
//
// $Id: wb_mast_model.v,v 1.2 2001-11-11 01:52:03 rudi Exp $
// $Id: wb_mast_model.v,v 1.3 2001-11-29 02:17:36 rudi Exp $
//
// $Date: 2001-11-11 01:52:03 $
// $Revision: 1.2 $
// $Date: 2001-11-29 02:17:36 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2001/11/11 01:52:03 rudi
//
// Minor fixes to testbench ...
//
// Revision 1.1 2001/07/29 07:34:40 rudi
//
//
320,11 → 324,29
integer delay;
integer rcount;
integer wcount;
 
begin
wb_rmw2(a,a,s,delay,rcount,wcount);
end
endtask
 
 
task wb_rmw2;
input [31:0] ra;
input [31:0] wa;
input [3:0] s;
input delay;
input rcount;
input wcount;
 
integer delay;
integer rcount;
integer wcount;
integer n;
 
begin
 
@(posedge clk);
//@(posedge clk);
#1;
cyc = 1;
we = 0;
333,7 → 355,7
 
for(n=0;n<rcount-1;n=n+1)
begin
adr = a + (n*4);
adr = ra + (n*4);
stb = 1;
while(~ack & ~err) @(posedge clk);
rd_mem[n + rd_cnt] = din;
352,7 → 374,7
sel = s;
end
 
adr = a+(n*4);
adr = ra+(n*4);
stb = 1;
@(posedge clk);
while(~ack & ~err) @(posedge clk);
376,7 → 398,7
@(posedge clk);
#1;
end
adr = a + (n*4);
adr = wa + (n*4);
dout = wr_mem[n + wr_cnt];
stb = 1;
we=1;
418,7 → 440,7
 
begin
 
@(posedge clk);
//@(posedge clk);
#1;
cyc = 1;
we = 1'bx;
/trunk/bench/verilog/test_bench_top.v
37,10 → 37,10
 
// CVS Log
//
// $Id: test_bench_top.v,v 1.5 2001-11-13 00:45:15 rudi Exp $
// $Id: test_bench_top.v,v 1.6 2001-11-29 02:17:36 rudi Exp $
//
// $Date: 2001-11-13 00:45:15 $
// $Revision: 1.5 $
// $Date: 2001-11-29 02:17:36 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/13 00:45:15 rudi
//
// Just minor test bench update, syncing all the files.
//
// Revision 1.4 2001/11/11 01:52:02 rudi
//
// Minor fixes to testbench ...
234,7 → 238,8
 
// HERE IS WHERE THE TEST CASES GO ...
 
if(1) // Full Regression Run
LVL = 2;
if(0) // Full Regression Run
begin
$display(" ......................................................");
$display(" : :");
257,6 → 262,7
sdram_wp(0);
sdram_rmw1(0);
sdram_rmw2(0);
rmw_cross1(0);
 
`ifdef MULTI_SDRAM
sdram_rd5(0);
276,7 → 282,6
`endif
 
scs_rdwr1(0);
 
end
else
if(1) // Quick Regression Run
286,35 → 291,37
$display(" : Short Regression Run ... :");
$display(" :....................................................:");
verbose = 0;
 
`ifdef FLASH
boot(2);
boot(LVL);
`endif
m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0000_0000);
 
sdram_rd1(2);
sdram_wr1(2);
sdram_rd1(LVL);
sdram_wr1(LVL);
 
sdram_rd2(2);
sdram_wr2(2);
sdram_rd2(LVL);
sdram_wr2(LVL);
 
sdram_rd3(2);
sdram_wr3(2);
sdram_rd3(LVL);
sdram_wr3(LVL);
 
sdram_rd4(2);
sdram_wr4(2);
sdram_rd4(LVL);
sdram_wr4(LVL);
 
sdram_wp(2);
sdram_rmw1(2);
sdram_rmw2(2);
sdram_wp(LVL);
sdram_rmw1(LVL);
sdram_rmw2(LVL);
rmw_cross1(LVL);
 
`ifdef MULTI_SDRAM
sdram_rd5(2);
sdram_wr5(2);
sdram_rd5(LVL);
sdram_wr5(LVL);
`endif
 
 
`ifdef FLASH
asc_rdwr1(2);
asc_rdwr1(LVL);
`endif
 
`ifdef SRAM
324,24 → 331,20
sram_rmw1;
sram_rmw2;
`endif
//scs_rdwr1(2);
scs_rdwr1(LVL);
 
mc_reset;
end
//else
if(1) // Suspend resume testing
if(0) // Suspend resume testing
begin
$display(" ......................................................");
$display(" : :");
$display(" : Suspend Resume Testing ... :");
$display(" :....................................................:");
 
verbose = 0;
done = 0;
LVL = 2;
 
fork
 
begin
 
`ifdef FLASH
356,7 → 359,6
while(susp_req | suspended) @(posedge clk);
sdram_rd2(LVL);
 
 
while(susp_req | suspended) @(posedge clk);
sdram_wr2(LVL);
 
375,6 → 377,8
sdram_rmw1(LVL);
while(susp_req | suspended) @(posedge clk);
sdram_rmw2(LVL);
while(susp_req | suspended) @(posedge clk);
rmw_cross1(LVL);
 
`ifdef MULTI_SDRAM
while(susp_req | suspended) @(posedge clk);
390,7 → 394,6
`endif
 
`ifdef SRAM
 
while(susp_req | suspended) @(posedge clk);
sram_rd1;
while(susp_req | suspended) @(posedge clk);
407,10 → 410,9
while(susp_req | suspended) @(posedge clk);
sram_rmw2;
`endif
//while(susp_req | suspended) @(posedge clk);
//scs_rdwr1(LVL);
while(susp_req | suspended) @(posedge clk);
scs_rdwr1(LVL);
 
 
done = 1;
end
 
427,7 → 429,7
mc_reset;
end
//else
if(1) // Bus Request testing
if(0) // Bus Request testing
begin
$display(" ......................................................");
$display(" : :");
435,14 → 437,14
$display(" :....................................................:");
verbose = 0;
done = 0;
LVL = 2;
fork
 
begin
`ifdef FLASH
boot(LVL);
`endif
 
m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0000_0000);
 
sdram_rd1(LVL);
sdram_wr1(LVL);
sdram_rd1(LVL);
460,6 → 462,7
sdram_wr5(LVL);
`endif
 
 
`ifdef FLASH
asc_rdwr1(LVL);
`endif
471,8 → 474,7
sram_rmw1;
sram_rmw2;
`endif
//scs_rdwr1(LVL);
 
scs_rdwr1(LVL);
done = 1;
end
 
496,8 → 498,8
$display(" :....................................................:");
//verbose = 0;
//boot(2);
 
/*
 
`define CSR 8'h00
`define POC 8'h04
`define BA_MASK 8'h08
514,8 → 516,11
m0.wb_wr1(`REG_BASE + `CSC1, 4'hf, 32'hffff_ffff);
m0.wb_wr1(`REG_BASE + `TMS1, 4'hf, 32'hffff_ffff);
m0.wb_wr1(`REG_BASE + `CSC2, 4'hf, 32'hffff_ffff);
@(posedge clk);
m0.wb_wr1(`REG_BASE + `TMS2, 4'hf, 32'hffff_ffff);
@(posedge clk);
m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'hffff_ffff);
@(posedge clk);
m0.wb_wr1(`REG_BASE + `TMS3, 4'hf, 32'hffff_ffff);
 
m0.wb_rd1(`REG_BASE + `CSR, 4'hf, data);
528,9 → 533,9
m0.wb_rd1(`REG_BASE + `TMS2, 4'hf, data);
m0.wb_rd1(`REG_BASE + `CSC3, 4'hf, data);
m0.wb_rd1(`REG_BASE + `TMS3, 4'hf, data);
*/
 
 
*/
 
 
m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0000_0000);
537,11 → 542,12
//sdram_rd1(2);
//sdram_wr1(2);
//asc_rdwr1(2);
//sram_rd1;
//sram_wr1;
// sram_rd1;
// sram_wr1;
//sram_rmw1;
//sram_rmw2;
//sram_wp;
//scs_rdwr1(2);
 
//scs_rdwr1(2);
 
558,13 → 564,33
//sdram_bo;
//sdram_rd1b(2);
 
 
 
//sdram_rd1(2);
//sdram_wr1(2);
 
 
//sdram_rd4(2);
//sdram_wr4(2);
//sdram_rd5(2);
//sdram_wr5(2);
sdram_wr4(2);
 
//sdram_wp(2);
//sdram_rmw1(2);
//sdram_rmw2(2);
 
//rmw_cross1(2);
 
/*
sram_rd1;
sram_wr1;
sram_rmw1;
sram_rmw2;
sram_wp;
*/
 
 
sdram_rd1(2);
sdram_wr1(2);
sdram_rd2(2);
575,15 → 601,13
sdram_wr4(2);
sdram_rd5(2);
sdram_wr5(2);
 
sdram_wp(2);
sdram_rmw1(2);
sdram_rmw2(2);
rmw_cross1(2);
 
*/
 
 
 
repeat(100) @(posedge clk);
$finish;
end
596,7 → 620,7
$display("\n\n");
$display("*****************************************************");
$display("*** Test Development ... ***");
$display("*****************************************************\n" );
$display("*****************************************************\n");
 
 
show_errors;
677,6 → 701,17
always @(error_cnt)
if(error_cnt > 25) #500 $finish;
 
/*
time mc_time;
 
always @(posedge mc_clk)
mc_time = $time;
 
always @(mc_cke_)
if($time != (mc_time+1) )
$display("WARNING: Unsexpected change of CKE (%t)", $time);
*/
/////////////////////////////////////////////////////////////////////
//
// IO Buffers
743,7 → 778,7
assign mc_we_ = mc_c_oe ? _mc_we_ : 1'bz;
assign mc_cas_ = mc_c_oe ? _mc_cas_ : 1'bz;
assign mc_ras_ = mc_c_oe ? _mc_ras_ : 1'bz;
assign #1.5 mc_cke_ = mc_c_oe ? _mc_cke_ : 1'bz;
assign mc_cke_ = mc_c_oe ? _mc_cke_ : 1'bz;
assign mc_cs_ = mc_c_oe ? _mc_cs_ : 8'bz;
assign mc_rp_ = mc_c_oe ? _mc_rp_ : 1'bz;
assign mc_vpen = mc_c_oe ? _mc_vpen : 1'bz;
/trunk/bench/verilog/tests.v
37,10 → 37,10
 
// CVS Log
//
// $Id: tests.v,v 1.5 2001-11-13 00:45:19 rudi Exp $
// $Id: tests.v,v 1.6 2001-11-29 02:17:36 rudi Exp $
//
// $Date: 2001-11-13 00:45:19 $
// $Revision: 1.5 $
// $Date: 2001-11-29 02:17:36 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/13 00:45:19 rudi
//
// Just minor test bench update, syncing all the files.
//
// Revision 1.4 2001/11/11 01:52:03 rudi
//
// Minor fixes to testbench ...
230,7 → 234,7
 
size = 4;
del = 1;
mode = 0;
mode = 2;
write = 0;
//force sdram0.Debug = 1;
 
380,12 → 384,12
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
2: del_max = 6;
endcase
 
size = 4;
del = 1;
mode = 9;
del = 0;
mode = 2;
write = 0;
//force sdram0.Debug = 1;
 
531,12 → 535,12
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
2: del_max = 6;
endcase
 
size = 1;
del = 0;
mode = 19;
del = 2;
mode = 16;
read = 1;
//force sdram0.Debug = 1;
 
584,7 → 588,7
begin
m0.mem_fill;
 
if(verbose) $display("Mode: %b, Size: %0d, Delay: %0d", mode, size, del);
if(verbose) $display("Mode: %b, Size: %0d, Delay: %0d (%t)", mode, size, del, $time);
 
m0.wb_wr_mult(`MEM_BASE + 0, 4'hf, del, size);
if(read) m0.wb_rd_mult(`MEM_BASE + 0, 4'hf, del, size);
1340,8 → 1344,8
m0.wb_wr1(`REG_BASE + `CSC0, 4'hf, 32'h0000_0421 | (bas[0]<<9));
 
size = 2;
del = 0;
mode = 8;
del = 3;
mode = 0;
write = 1;
//force sdram0.Debug = 1;
 
1388,6 → 1392,7
if(verbose) $display("BAS: %0d, Mode: %b, Size: %0d, Delay: %0d",
bas, mode, size, del);
 
//$display("Accessing Bank 0");
if(write)
m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size);
1395,6 → 1400,7
m0.wb_wr_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size);
 
//$display("Accessing Bank 1");
if(write)
m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size);
1402,6 → 1408,7
m0.wb_wr_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size);
 
//$display("Accessing Bank 2");
if(write)
m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size);
1409,6 → 1416,7
m0.wb_wr_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size);
 
//$display("Accessing Bank 3");
if(write)
m0.wb_wr_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
m0.wb_rd_mult(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size);
1512,12 → 1520,12
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
2: del_max = 8;
endcase
 
size = 1;
del = 0;
mode = 8;
del = 3;
mode = 4;
read = 1;
 
for(mode=0;mode<20;mode=mode+1)
1720,7 → 1728,7
 
size = 2;
del = 0;
mode = 8;
mode = 4;
write = 1;
if(0)
begin
2034,8 → 2042,8
endcase
 
size = 5;
del = 1;
mode = 6;
del = 0;
mode = 0;
read = 1;
 
if(0)
2238,6 → 2246,296
`endif
 
 
task rmw_cross1;
input quick;
 
integer quick;
integer x,s,n,m,adr;
integer del, size;
reg [7:0] mode, a_mode;
reg [2:0] bs;
integer sz_inc;
integer sz_max, del_max;
integer read;
reg [2:0] bas;
reg [31:0] data, exp;
integer page_size;
integer cycle;
 
begin
$display("\n\n");
$display("*****************************************************");
$display("*** RMW CS Cross Test 1 ... ***");
$display("*****************************************************\n");
 
page_size = 256; // 64 mbit x 32 SDRAM
 
m0.wb_wr1(`REG_BASE + `CSR, 4'hf, 32'h6030_0300);
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
 
m0.wb_wr1(`REG_BASE + `TMS3, 4'hf, 32'hffff_f40c);
 
m0.wb_wr1(`REG_BASE + `TMS0, 4'hf, {
4'd0, // RESERVED [31:28]
4'd7, // Trfc [27:24]
4'd2, // Trp [23:20]
3'd2, // Trcd [19:17]
2'd1, // Twr [16:15]
5'd0, // RESERVED [14:10]
1'd0, // Wr. Burst Len (1=Single)
2'd0, // Op Mode
3'd2, // CL
1'b0, // Burst Type (0=Seq;1=Inter)
3'd3 // Burst Length
});
 
m0.wb_wr1(`REG_BASE + `CSC0, 4'hf, 32'h0000_0821);
 
case(quick)
0: sz_max = 32;
1: sz_max = 16;
2: sz_max = 8;
endcase
 
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
endcase
 
size = 16;
del = 0;
mode = 4;
a_mode = 0;
read = 1;
write = 1;
cycle = 1;
 
for(cycle=0;cycle<7;cycle = cycle + 1)
for(mode=0;mode<19;mode=mode+1)
for(a_mode=0;a_mode<3;a_mode=a_mode+1)
begin
 
repeat(1) @(posedge clk);
 
sdram0.mem_fill(1024);
 
case(mode[4:2])
0: bs = 0;
1: bs = 1;
2: bs = 2;
3: bs = 3;
4: bs = 7;
endcase
case(mode[4:2])
0: sz_inc = 1;
1: sz_inc = 2;
2: sz_inc = 4;
3: sz_inc = 8;
4: sz_inc = 1;
endcase
 
 
m0.wb_wr1(`REG_BASE + `TMS0, 4'hf, {
4'd0, // RESERVED [31:28]
4'd7, // Trfc [27:24]
4'd2, // Trp [23:20]
3'd2, // Trcd [19:17]
2'd1, // Twr [16:15]
5'd0, // RESERVED [14:10]
1'd0+mode[1], // Wr. Burst Len (1=Single)
2'd0, // Op Mode
3'd2+mode[0], // CL
1'b0, // Burst Type (0=Seq;1=Inter)
3'd0+bs // Burst Length
});
 
case(a_mode)
0: m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0060_0025); // 32 bit bus
1: m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0060_0005); // 8 bit bus
2: m0.wb_wr1(`REG_BASE + `CSC3, 4'hf, 32'h0060_0015); // 16 bit bus
endcase
 
repeat(10) @(posedge clk);
if(!verbose) $display("Mode: %b", mode);
 
for(del=0;del<del_max;del=del+1)
for(size=sz_inc;size<sz_max;size=size+sz_inc)
begin
m0.mem_fill;
for(n=0;n<1024;n=n+1)
m0.wr_mem[n] = {n[15:0],n[15:0]};
 
if(verbose) $display("Mode: %0d, A_mode: %0d, Size: %0d, Delay: %0d, Cyc. Delay: %0d", mode, a_mode, size, del, cycle);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*0*4,
`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*1*4,
`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*2*4,
`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*3*4,
`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*4*4,
`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*5*4,
`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*6*4,
`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw2(`MEM_BASE3 + size*7*4,
`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size, size);
 
 
repeat(10) @(posedge clk);
 
x = 0;
for(n=0;n<(size*8);n=n+1)
begin
 
case(a_mode)
0: data = {16'hxxxx, n[15:0]};
1:
begin
data[31:24] = x[7:0]+3;
data[23:16] = x[7:0]+2;
data[15:08] = x[7:0]+1;
data[07:00] = x[7:0]+0;
end
2: begin
data[31:16] = x[15:0]+1;
data[15:00] = x[15:0]+0;
end
endcase
 
case(a_mode)
0: x = x + 1;
1: x = x + 4;
2: x = x + 2;
endcase
 
exp = m0.rd_mem[n];
if(a_mode==0) exp[31:16] = data[31:16];
 
if(data !== exp)
begin
$display("ERROR: RD[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
n, data, exp, $time);
error_cnt = error_cnt + 1;
end
 
end
 
for(m=0;m<4;m=m+1)
for(n=0;n<size*2;n=n+1)
begin
 
case(m)
0: data = sdram0.Bank0[n];
1: data = sdram0.Bank1[n+1*size*2];
2: data = sdram0.Bank2[n+2*size*2];
3: data = sdram0.Bank3[n+3*size*2];
endcase
 
if((data !== m0.wr_mem[(m*size*2)+n]) | (|data === 1'bx) |
(|m0.wr_mem[(m*size*2)+n] === 1'bx) )
begin
$display("ERROR: WR Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
(m*size*2)+n, data, m0.wr_mem[(m*size*2)+n], $time);
error_cnt = error_cnt + 1;
end
end
 
 
 
 
/*
m0.mem_fill;
for(n=0;n<1024;n=n+1)
m0.wr_mem[n] = 32'hffff_ffff;
if(verbose) $display("Mode: %0d, Size: %0d, Delay: %0d", mode, size, del);
 
if(write) m0.wb_wr_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
if(read) m0.wb_rd_mult(`MEM_BASE3 + size*0*4, 4'hf, del, size);
 
if(write) m0.wb_wr_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
if(read) m0.wb_rd_mult(`MEM_BASE3 + size*1*4, 4'hf, del, size);
 
if(write) m0.wb_wr_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
if(read) m0.wb_rd_mult(`MEM_BASE3 + size*2*4, 4'hf, del, size);
 
if(write) m0.wb_wr_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
if(read) m0.wb_rd_mult(`MEM_BASE3 + size*3*4, 4'hf, del, size);
 
repeat(10) @(posedge clk);
 
x = 0;
for(n=0;n<(size*4);n=n+1)
begin
 
case(mode)
0: data = {16'hxxxx, n[15:0]};
1:
begin
data[31:24] = x[7:0]+3;
data[23:16] = x[7:0]+2;
data[15:08] = x[7:0]+1;
data[07:00] = x[7:0]+0;
end
2: begin
data[31:16] = x[15:0]+1;
data[15:00] = x[15:0]+0;
end
endcase
 
case(mode)
0: x = x + 1;
1: x = x + 4;
2: x = x + 2;
endcase
 
exp = m0.rd_mem[n];
if(mode==0) exp[31:16] = data[31:16];
 
if(data !== exp)
begin
$display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",
n, data, exp, $time);
error_cnt = error_cnt + 1;
end
 
end
*/
 
end
 
end
 
show_errors;
$display("*****************************************************");
$display("*** Test DONE ... ***");
$display("*****************************************************\n\n");
 
end
endtask
 
 
task asc_rdwr1;
input quick;
 
2261,7 → 2559,7
m0.wb_wr1(`REG_BASE + `CSR, 4'hf, 32'h6030_0300);
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
 
m0.wb_wr1(`REG_BASE + `TMS3, 4'hf, 32'hffff_f40a);
m0.wb_wr1(`REG_BASE + `TMS3, 4'hf, 32'hffff_f40b);
 
case(quick)
0: sz_max = 32;
2276,7 → 2574,7
endcase
 
size = 16;
del = 4;
del = 0;
mode = 0;
read = 1;
write = 1;
2297,8 → 2595,8
repeat(10) @(posedge clk);
if(!verbose) $display("Mode: %b", mode);
 
//for(del=0;del<del_max;del=del+1)
//for(size=1;size<sz_max;size=size+1)
for(del=0;del<del_max;del=del+1)
for(size=1;size<sz_max;size=size+1)
begin
m0.mem_fill;
for(n=0;n<1024;n=n+1)
2830,7 → 3128,7
m0.wb_wr1(`REG_BASE + `CSR, 4'hf, 32'h6030_0300);
m0.wb_wr1(`REG_BASE + `BA_MASK, 4'hf, 32'h0000_00f0);
 
m0.wb_wr1(`REG_BASE + `TMS5, 4'hf, 32'hf03f_4104);
m0.wb_wr1(`REG_BASE + `TMS5, 4'hf, 32'hf03f_4105);
m0.wb_wr1(`REG_BASE + `CSC5, 4'hf, 32'h00a0_0027);
 
 
2955,7 → 3253,7
endcase
 
size = 4;
del = 4;
del = 1;
mode = 0;
read = 1;
//force sdram0.Debug = 1;
2962,7 → 3260,8
 
for(mode=0;mode<20;mode=mode+1)
begin
sdram0.mem_fill(1024);
//sdram0.mem_fill(1024);
fill_mem(1024);
 
case(mode[4:2])
0: bs = 0;
3152,6 → 3451,7
reg [31:0] mem1[0:1024];
reg [31:0] mem2[0:1024];
reg [31:0] mem3[0:1024];
integer cycle;
 
begin
 
3165,7 → 3465,7
 
case(quick)
0: sz_max = 32;
1: sz_max = 32;
1: sz_max = 16;
2: sz_max = 16;
endcase
 
3172,7 → 3472,7
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
2: del_max = 8;
endcase
 
m0.wb_wr1(`REG_BASE + `CSR, 4'hf, 32'h6030_0300);
3193,13 → 3493,15
});
 
kro = 1;
cycle=3;
for(cycle=0;cycle<8;cycle=cycle+1)
for(kro=0;kro<2;kro=kro+1) // Don't Need this for this test
begin
m0.wb_wr1(`REG_BASE + `CSC0, 4'hf, 32'h0000_0821 | (kro[0]<<10));
 
size = 2;
del = 0;
mode = 8;
del = 5;
mode = 2;
 
//force sdram0.Debug = 1;
 
3238,7 → 3540,7
 
repeat(50) @(posedge clk);
 
if(!verbose) $display("KRO: %0d, Mode: %b", kro, mode);
if(!verbose) $display("KRO: %0d, Mode: %b, Cyc. Delay: %0d", kro, mode, cycle);
 
for(del=0;del<del_max;del=del+1)
for(size=sz_inc;size<sz_max;size=size+sz_inc)
3254,21 → 3556,30
3: mem3[n] = sdram0.Bank3[n+3*size*2];
endcase
 
if(verbose) $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d",
kro, mode, size, del);
if(verbose) $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d, Cyc. Delay: %0d (%t)",
kro, mode, size, del, cycle, $time);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_rmw(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
for(m=0;m<4;m=m+1)
for(n=0;n<(size*2);n=n+1)
begin
3339,6 → 3650,7
reg [2:0] kro;
reg [31:0] data, data1;
integer page_size;
integer cycle;
 
begin
 
3352,14 → 3664,14
 
case(quick)
0: sz_max = 32;
1: sz_max = 32;
2: sz_max = 16;
1: sz_max = 16;
2: sz_max = 10;
endcase
 
case(quick)
0: del_max = 16;
1: del_max = 8;
2: del_max = 4;
2: del_max = 8;
endcase
 
m0.wb_wr1(`REG_BASE + `CSR, 4'hf, 32'h6030_0300);
3379,7 → 3691,8
3'd3 // Burst Length
});
 
kro = 0;
kro = 1;
for(cycle=0;cycle<8;cycle=cycle+1)
for(kro=0;kro<2;kro=kro+1) // Don't Need this for this test
begin
m0.wb_wr1(`REG_BASE + `CSC0, 4'hf, 32'h0000_0821 | (kro[0]<<10));
3427,7 → 3740,7
 
repeat(50) @(posedge clk);
 
if(!verbose) $display("KRO: %0d, Mode: %b", kro, mode);
if(!verbose) $display("KRO: %0d, Mode: %b, Cyc.Del: %0d", kro, mode, cycle);
 
for(del=0;del<del_max;del=del+1)
for(size=sz_inc;size<sz_max;size=size+sz_inc)
3436,21 → 3749,30
fill_mem(1024);
 
 
if(verbose) $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d",
kro, mode, size, del);
if(verbose) $display("KRO: %0d, Mode: %b, Size: %0d, Delay: %0d, Cyc.Del: %0d (%t)",
kro, mode, size, del, cycle, $time);
 
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*0*4) + size*0*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*0*4) + size*1*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*1*4) + size*2*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*1*4) + size*3*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*2*4) + size*4*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*2*4) + size*5*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*3*4) + size*6*4, 4'hf, del, size, size);
repeat(cycle) @(posedge clk);
m0.wb_wmr(`MEM_BASE + (page_size*3*4) + size*7*4, 4'hf, del, size, size);
 
repeat(cycle) @(posedge clk);
for(n=0;n<(size*2);n=n+1)
begin
 
/trunk/bench/verilog/160b3ver/adv_bb.v
931,8 → 931,8
 
// record the time for addr changes .
always @(addr) begin
if ($time != 0) begin
if ((curr_addr_time + TAVAV) > $time & !ceb) //Read/Write Cycle Time --- Added "& !ceb" RU 9/9/99 9pm
if ($time != 0 & !ceb) begin
if (((curr_addr_time + TAVAV) > $time) & !ceb) //Read/Write Cycle Time --- Added "& !ceb" RU 9/9/99 9pm
$display("FLASH: [",$time,"] Timing Violation: Read/Write Cycle Time (TAVAV), Last addr change: %d",curr_addr_time) ;
curr_addr_time = $time ;
end
/trunk/bench/verilog/sdram_models/16Mx16/mt48lc16m16a2.v
212,9 → 212,11
@ (posedge Clk) begin
Sys_clk = CkeZ;
CkeZ = Cke;
 
if (Cke == 1'b0 && (Data_in_enable == 1'b1 || Data_out_enable == 1'b1)) begin
$display ("at time %t ERROR: Illegal power down or self refresh. Please make sure data bus is idle.", $time);
end
 
end
@ (negedge Clk) begin
Sys_clk = 1'b0;
/trunk/rtl/verilog/mc_cs_rf.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_cs_rf.v,v 1.3 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_cs_rf.v,v 1.4 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.3 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.2 2001/08/10 08:16:21 rudi
//
// - Changed IO names to be more clear.
133,19 → 137,24
// Write Logic
//
 
assign sel = addr[6:3] == reg_select[3:0];
reg [6:0] addr_r;
 
always @(posedge clk or posedge rst)
if(rst) csc <= #1 (this_cs[2:0] == `MC_DEF_SEL) ?
always @(posedge clk)
addr_r <= #1 addr[6:0];
 
assign sel = addr_r[6:3] == reg_select[3:0];
 
always @(posedge clk)
if(rst) csc <= #1 (this_cs[2:0] == `MC_DEF_SEL) ?
{26'h0, poc[1:0], 1'b0, poc[3:2], (poc[3:2] != 2'b00)} : 32'h0;
else
if(rf_we & sel & !addr[2]) csc <= #1 din;
if(rf_we & sel & !addr_r[2]) csc <= #1 din;
 
always @(posedge clk or posedge rst)
always @(posedge clk)
if(rst) tms <= #1 (this_cs[2:0] == `MC_DEF_SEL) ?
`MC_DEF_POR_TMS : 32'h0;
else
if(rf_we & sel & addr[2]) tms <= #1 din;
if(rf_we & sel & addr_r[2]) tms <= #1 din;
 
////////////////////////////////////////////////////////////////////
//
152,7 → 161,7
// Load Mode Register Request/Ack Logic
//
always @(posedge clk)
lmr_req_we <= #1 rf_we & sel & addr[2];
lmr_req_we <= #1 rf_we & sel & addr_r[2];
 
always @(posedge clk or posedge rst)
if(rst) lmr_req <= #1 1'b0;
167,7 → 176,7
// Initialize SDRAM Request/Ack & tracking logic
//
always @(posedge clk)
init_req_we <= #1 rf_we & sel & !addr[2];
init_req_we <= #1 rf_we & sel & !addr_r[2];
 
always @(posedge clk or posedge rst)
if(rst) init_req <= #1 1'b0;
/trunk/rtl/verilog/mc_mem_if.v
38,10 → 38,10
 
// CVS Log
//
// $Id: mc_mem_if.v,v 1.3 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_mem_if.v,v 1.4 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.3 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 48,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.2 2001/09/02 02:28:28 rudi
//
// Many fixes for minor bugs that showed up in gate level simulations.
91,11 → 95,12
module mc_mem_if(clk, rst, mc_clk, mc_br, mc_bg,
mc_addr, mc_data_o, mc_dp_o, mc_data_oe,
mc_dqm, mc_oe_, mc_we_, mc_cas_, mc_ras_, mc_cke_, mc_cs_,
mc_adsc_, mc_adv_, mc_ack, mc_rp, mc_rp_d,
mc_br_r, mc_bg_d, mc_data_od, mc_dp_od, mc_addr_d, mc_ack_r, we_,
ras_, cas_, cke_, mc_adsc_d, mc_adv_d, cs_en, rfr_ack, cs_need_rfr,
lmr_sel, spec_req_cs, cs, data_oe, susp_sel, mc_c_oe, oe_,
wb_stb_i, wb_sel_i, wb_cycle, wr_cycle
mc_adsc_, mc_adv_, mc_ack, mc_rp, mc_c_oe, mc_c_oe_d,
mc_br_r, mc_bg_d, mc_data_od, mc_dp_od, mc_addr_d, mc_ack_r,
we_, ras_, cas_, cke_, mc_adsc_d, mc_adv_d, cs_en, rfr_ack,
cs_need_rfr, lmr_sel, spec_req_cs, cs, fs, data_oe, susp_sel,
suspended_o, oe_, wb_stb_i, wb_sel_i, wb_cycle, wr_cycle,
mc_data_ir, mc_data_i, mc_dp_i, mc_sts_ir, mc_sts_i, mc_zz_o
);
// Memory Interface
input clk;
118,6 → 123,10
output mc_adv_;
input mc_ack;
output mc_rp;
output mc_c_oe;
output [35:0] mc_data_ir;
output mc_sts_ir;
output mc_zz_o;
 
// Internal Interface
output mc_br_r;
124,7 → 133,7
input mc_bg_d;
input data_oe;
input susp_sel;
input mc_c_oe;
input suspended_o;
input [31:0] mc_data_od;
input [3:0] mc_dp_od;
input [23:0] mc_addr_d;
144,9 → 153,13
input lmr_sel;
input [7:0] spec_req_cs;
input [7:0] cs;
input fs;
input mc_adsc_d;
input mc_adv_d;
input mc_rp_d;
input mc_c_oe_d;
input [31:0] mc_data_i;
input [3:0] mc_dp_i;
input mc_sts_i;
 
////////////////////////////////////////////////////////////////////
//
171,8 → 184,11
reg mc_br_r;
reg mc_ack_r;
reg mc_rp;
reg mc_c_oe;
reg mc_zz_o;
 
//integer n;
reg [35:0] mc_data_ir;
reg mc_sts_ir;
 
////////////////////////////////////////////////////////////////////
//
180,9 → 196,21
//
 
always @(posedge mc_clk)
mc_rp <= #1 mc_rp_d;
mc_zz_o <= #1 suspended_o;
 
always @(posedge mc_clk)
mc_sts_ir <= #1 mc_sts_i;
 
always @(posedge mc_clk)
mc_data_ir <= #1 {mc_dp_i, mc_data_i};
 
always @(posedge mc_clk)
mc_c_oe <= #1 mc_c_oe_d;
 
always @(posedge mc_clk)
mc_rp <= #1 !suspended_o & !fs;
 
always @(posedge mc_clk)
mc_br_r <= #1 mc_br;
 
always @(posedge mc_clk)
193,7 → 221,7
 
always @(posedge mc_clk or posedge rst)
if(rst) mc_data_oe <= #1 1'b0;
else mc_data_oe <= #1 data_oe & !susp_sel & mc_c_oe;
else mc_data_oe <= #1 data_oe & !susp_sel & mc_c_oe_d;
 
always @(posedge mc_clk)
mc_data_o <= #1 mc_data_od;
228,16 → 256,6
 
assign mc_cke_ = cke_;
 
/* Apparently Synopsys Can't handle this ....
always @(posedge mc_clk)
for(n=0;n<8;n=n+1)
mc_cs_[n] <= #1 ~(cs_en & (
(rfr_ack | susp_sel) ? cs_need_rfr[n] :
lmr_sel ? spec_req_cs[n] :
cs[n]
));
*/
 
always @(posedge mc_clk or posedge rst)
if(rst) mc_cs_[0] <= #1 1'b1;
else
/trunk/rtl/verilog/mc_defines.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_defines.v,v 1.3 2001-09-10 13:44:17 rudi Exp $
// $Id: mc_defines.v,v 1.4 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-10 13:44:17 $
// $Revision: 1.3 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,9
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/10 13:44:17 rudi
// *** empty log message ***
//
// Revision 1.2 2001/08/10 08:16:21 rudi
//
// - Changed IO names to be more clear.
62,7 → 65,8
// Revision 1.3 2001/06/12 15:19:49 rudi
//
//
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
// Minor changes after running lint, and a small bug
// fix reading csr and ba_mask registers.
//
// Revision 1.2 2001/06/03 11:37:17 rudi
//
108,9 → 112,18
// This are the default Power-On Reset values for Chip Select
//
 
// This will be defined by the run script for my test bench ...
//`define RUDIS_TB 1
 
// Defines which chip select is used for Power On booting
`define MC_DEF_SEL 3'h1
 
// To run my default testbench default boot CS must be 3 !!!
`ifdef RUDIS_TB
`define MC_DEF_SEL 3'h3
`else
`define MC_DEF_SEL 3'h0
`endif
 
// Defines the default (reset) TMS value for the DEF_SEL chip select
`define MC_DEF_POR_TMS 32'hffff_ffff
 
128,6 → 141,14
//`define MC_HAVE_CS7 1
 
 
// To run my default testbench those need to there !!!
`ifdef RUDIS_TB
`define MC_HAVE_CS2 1
`define MC_HAVE_CS3 1
`define MC_HAVE_CS4 1
`define MC_HAVE_CS5 1
`endif
 
/////////////////////////////////////////////////////////////////////
//
// Init Refresh
/trunk/rtl/verilog/mc_top.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_top.v,v 1.4 2001-09-10 13:44:17 rudi Exp $
// $Id: mc_top.v,v 1.5 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-10 13:44:17 $
// $Revision: 1.4 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.5 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,9
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2001/09/10 13:44:17 rudi
// *** empty log message ***
//
// Revision 1.3 2001/09/02 02:28:28 rudi
//
// Many fixes for minor bugs that showed up in gate level simulations.
168,12 → 171,9
wire wb_first;
wire wb_wait;
wire mem_ack;
wire mem_wb_ack_o, rf_wb_ack_o;
 
// --------------------------------------
// Suspend Resume Interface
wire susp_sel;
reg mc_zz_pad_o;
 
// Register File Interconnects
wire [31:0] rf_dout;
187,7 → 187,6
wire [7:0] cs_need_rfr;
wire [2:0] ref_int;
wire [31:0] mem_dout;
wire rf_wb_err_o;
wire wp_err;
 
// Address Select Signals
216,6 → 215,7
wire [31:0] mc_data_od;
wire [3:0] mc_dp_od;
wire [23:0] mc_addr_d;
wire [35:0] mc_data_ir;
 
// Refresh Counter Signals
wire rfr_req;
238,6 → 238,7
wire wb_cycle, wr_cycle;
wire [31:0] tms_s;
wire [31:0] csc_s;
wire mc_c_oe_d;
wire mc_br_r;
wire mc_bg_d;
wire mc_adsc_d;
244,39 → 245,16
wire mc_adv_d;
wire mc_ack_r;
wire err;
wire mc_sts_i;
 
wire mc_rp_d;
 
/*
// synopsys translate_off
initial // FOR RICHARD TEST BENCH ONLY ... FIX_ME
begin
$shm_open("waves");
$shm_probe("AS",mc_top,"AS");
$display("INFO: Signal dump enabled ...\n\n");
repeat(4000) @(posedge clk_i);
$finish;
end
// synopsys translate_on
*/
 
////////////////////////////////////////////////////////////////////
//
// Misc Logic
//
 
assign mc_rp_d = !suspended_o & !fs;
 
always @(posedge mc_clk_i)
mc_zz_pad_o <= #1 suspended_o;
 
assign wb_err_o = wb_cyc_i & wb_stb_i &
(`MC_MEM_SEL ? ((par_err & !wb_we_i) | err | wp_err) : rf_wb_err_o);
assign wb_data_o = `MC_MEM_SEL ? mem_dout : rf_dout;
assign wb_ack_o = `MC_MEM_SEL ? mem_wb_ack_o : rf_wb_ack_o;
 
assign obct_cs = (rfr_ack | susp_sel) ? cs_need_rfr :
(lmr_ack | init_ack) ? spec_req_cs : cs;
 
assign lmr_sel = lmr_ack | init_ack;
 
assign tms_s = lmr_sel ? sp_tms : tms;
296,8 → 274,7
.wb_we_i( wb_we_i ),
.wb_cyc_i( wb_cyc_i ),
.wb_stb_i( wb_stb_i ),
.wb_ack_o( rf_wb_ack_o ),
.wb_err_o( rf_wb_err_o ),
.wb_ack_o( ),
.wp_err( wp_err ),
.csc( csc ),
.tms( tms ),
305,8 → 282,8
.sp_csc( sp_csc ),
.sp_tms( sp_tms ),
.cs( cs ),
.mc_data_i( mc_data_pad_i ),
.mc_sts( mc_sts_pad_i ),
.mc_data_i( mc_data_ir[31:0]),
.mc_sts( mc_sts_ir ),
.mc_vpen( mc_vpen_pad_o ),
.fs( fs ),
.cs_le( cs_le ),
325,8 → 302,9
.csc( csc_s ),
.tms( tms_s ),
.wb_stb_i( wb_stb_i ),
.wb_ack_o( mem_wb_ack_o ),
.wb_ack_o( wb_ack_o ),
.wb_addr_i( wb_addr_i ),
.wb_we_i( wb_we_i ),
.wb_write_go( wb_write_go ),
.wr_hold( wr_hold ),
.cas_( cas_ ),
363,11 → 341,15
.rst( rst_i ),
.csc( csc ),
.wb_cyc_i( wb_cyc_i ),
.mem_wb_ack_o( mem_wb_ack_o ),
.wb_stb_i( wb_stb_i ),
.mem_ack( mem_ack ),
.wb_ack_o( wb_ack_o ),
.wb_we_i( wb_we_i ),
.wb_data_i( wb_data_i ),
.wb_data_o( mem_dout ),
.wb_read_go( wb_read_go ),
.mc_data_i( mc_data_pad_i ),
.mc_clk( mc_clk_i ),
.mc_data_del( mc_data_ir ),
.mc_dp_i( mc_dp_pad_i ),
.mc_data_o( mc_data_od ),
.mc_dp_o( mc_dp_od ),
418,7 → 400,7
.cs_en( cs_en ),
.mc_adsc( mc_adsc_d ),
.mc_adv( mc_adv_d ),
.mc_c_oe( mc_coe_pad_coe_o),
.mc_c_oe( mc_c_oe_d ),
.wb_cycle( wb_cycle ),
.wr_cycle( wr_cycle ),
.csc( csc_s ),
455,7 → 437,7
.wb_cyc_i( wb_cyc_i ),
.wb_stb_i( wb_stb_i ),
.wb_we_i( wb_we_i ),
.wb_ack_o( mem_wb_ack_o ),
.wb_ack_o( wb_ack_o ),
.wb_err( wb_err_o ),
.wb_read_go( wb_read_go ),
.wb_write_go( wb_write_go ),
462,7 → 444,13
.wb_first( wb_first ),
.wb_wait( wb_wait ),
.mem_ack( mem_ack ),
.wr_hold( wr_hold )
.wr_hold( wr_hold ),
.err( err ),
.par_err( par_err ),
.wp_err( wp_err ),
.wb_data_o( wb_data_o ),
.mem_dout( mem_dout ),
.rf_dout( rf_dout )
);
 
mc_mem_if u7(
469,7 → 457,6
.clk( clk_i ),
.rst( rst_i ),
.mc_rp( mc_rp_pad_o_ ),
.mc_rp_d( mc_rp_d ),
.mc_clk( mc_clk_i ),
.mc_br( mc_br_pad_i ),
.mc_bg( mc_bg_pad_o ),
492,6 → 479,7
.mc_dp_od( mc_dp_od ),
.mc_addr_d( mc_addr_d ),
.mc_ack( mc_ack_pad_i ),
.mc_zz_o( mc_zz_pad_o ),
.we_( we_ ),
.ras_( ras_ ),
.cas_( cas_ ),
504,15 → 492,23
.lmr_sel( lmr_sel ),
.spec_req_cs( spec_req_cs ),
.cs( cs ),
.fs( fs ),
.data_oe( data_oe ),
.susp_sel( susp_sel ),
.suspended_o( suspended_o ),
.mc_c_oe( mc_coe_pad_coe_o),
.mc_c_oe_d( mc_c_oe_d ),
.mc_ack_r( mc_ack_r ),
.oe_( oe_ ),
.wb_stb_i( wb_stb_i ),
.wb_sel_i( wb_sel_i ),
.wb_cycle( wb_cycle ),
.wr_cycle( wr_cycle )
.wr_cycle( wr_cycle ),
.mc_data_i( mc_data_pad_i ),
.mc_dp_i( mc_dp_pad_i ),
.mc_data_ir( mc_data_ir ),
.mc_sts_i( mc_sts_pad_i ),
.mc_sts_ir( mc_sts_ir )
);
 
endmodule
/trunk/rtl/verilog/mc_dp.v
38,10 → 38,10
 
// CVS Log
//
// $Id: mc_dp.v,v 1.3 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_dp.v,v 1.4 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.3 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 48,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.2 2001/08/10 08:16:21 rudi
//
// - Changed IO names to be more clear.
85,9 → 89,9
`include "mc_defines.v"
 
module mc_dp( clk, rst, csc,
wb_cyc_i, mem_wb_ack_o, wb_data_i, wb_data_o,
wb_read_go,
mc_data_i, mc_dp_i, mc_data_o, mc_dp_o,
wb_cyc_i, wb_stb_i, wb_ack_o, mem_ack, wb_data_i, wb_data_o,
wb_read_go, wb_we_i,
mc_clk, mc_data_del, mc_dp_i, mc_data_o, mc_dp_o,
 
dv, pack_le0, pack_le1, pack_le2,
byte_en, par_err
97,12 → 101,16
input [31:0] csc;
 
input wb_cyc_i;
input mem_wb_ack_o;
input wb_stb_i;
input mem_ack;
input wb_ack_o;
input [31:0] wb_data_i;
output [31:0] wb_data_o;
input wb_read_go;
input wb_we_i;
 
input [31:0] mc_data_i;
input mc_clk;
input [35:0] mc_data_del;
input [3:0] mc_dp_i;
output [31:0] mc_data_o;
output [3:0] mc_dp_o;
120,7 → 128,6
reg [31:0] wb_data_o;
reg [31:0] mc_data_o;
wire [35:0] rd_fifo_out;
reg [35:0] mc_data_del;
wire rd_fifo_clr;
reg [3:0] mc_dp_o;
reg par_err_r;
143,18 → 150,14
// WB READ Data Path
//
 
always @(posedge clk)
if(mem_type == `MC_MEM_TYPE_SDRAM) wb_data_o <= #1 rd_fifo_out[31:0];
else
if(mem_type == `MC_MEM_TYPE_SRAM) wb_data_o <= #1 rd_fifo_out[31:0];
else wb_data_o <= #1 mc_data_d;
always @(mem_type or rd_fifo_out or mc_data_d)
if( (mem_type == `MC_MEM_TYPE_SDRAM) |
(mem_type == `MC_MEM_TYPE_SRAM) ) wb_data_o = rd_fifo_out[31:0];
else wb_data_o = mc_data_d;
 
always @(posedge clk)
mc_data_del <= #1 {mc_dp_i, mc_data_i};
assign rd_fifo_clr = !(rst | !wb_cyc_i | (wb_we_i & wb_stb_i) );
assign re = wb_ack_o & wb_read_go;
 
assign rd_fifo_clr = !rst & wb_cyc_i;
assign re = mem_wb_ack_o & wb_read_go;
 
mc_rd_fifo u0(
.clk( clk ),
.rst( rd_fifo_clr ),
170,7 → 173,7
//
 
always @(posedge clk)
if(mem_wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) )
if(wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) )
mc_data_o <= #1 wb_data_i;
 
////////////////////////////////////////////////////////////////////
179,21 → 182,21
//
 
always @(posedge clk)
if(pack_le0) byte0 <= #1 mc_data_i[7:0];
if(pack_le0) byte0 <= #1 mc_data_del[7:0];
 
always @(posedge clk)
if(pack_le1 & (bus_width == `MC_BW_8)) byte1 <= #1 mc_data_i[7:0];
if(pack_le1 & (bus_width == `MC_BW_8)) byte1 <= #1 mc_data_del[7:0];
else
if(pack_le0 & (bus_width == `MC_BW_16)) byte1 <= #1 mc_data_i[15:8];
if(pack_le0 & (bus_width == `MC_BW_16)) byte1 <= #1 mc_data_del[15:8];
 
always @(posedge clk)
if(pack_le2) byte2 <= #1 mc_data_i[7:0];
if(pack_le2) byte2 <= #1 mc_data_del[7:0];
 
always @(bus_width or mc_data_i or byte0 or byte1 or byte2)
if(bus_width == `MC_BW_8) mc_data_d = {mc_data_i[7:0], byte2, byte1, byte0};
always @(bus_width or mc_data_del or byte0 or byte1 or byte2)
if(bus_width == `MC_BW_8) mc_data_d = {mc_data_del[7:0], byte2, byte1, byte0};
else
if(bus_width == `MC_BW_16) mc_data_d = {mc_data_i[15:0], byte1, byte0};
else mc_data_d = mc_data_i;
if(bus_width == `MC_BW_16) mc_data_d = {mc_data_del[15:0], byte1, byte0};
else mc_data_d = mc_data_del[31:0];
 
////////////////////////////////////////////////////////////////////
//
201,7 → 204,7
//
 
always @(posedge clk)
if(mem_wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) )
if(wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) )
mc_dp_o <= #1 { ^wb_data_i[31:24], ^wb_data_i[23:16],
^wb_data_i[15:08], ^wb_data_i[07:00] };
 
210,10 → 213,7
// Parity Checking
//
 
assign par_err = par_err_r & mem_wb_ack_o;
 
always @(posedge clk)
par_err_r <= #1 pen & (
assign par_err = !wb_we_i & mem_ack & pen & (
(( ^rd_fifo_out[31:24] ^ rd_fifo_out[35] ) & byte_en[3] ) |
(( ^rd_fifo_out[23:16] ^ rd_fifo_out[34] ) & byte_en[2] ) |
(( ^rd_fifo_out[15:08] ^ rd_fifo_out[33] ) & byte_en[1] ) |
/trunk/rtl/verilog/mc_wb_if.v
38,10 → 38,10
 
// CVS Log
//
// $Id: mc_wb_if.v,v 1.3 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_wb_if.v,v 1.4 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.3 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 48,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.2 2001/08/10 08:16:21 rudi
//
// - Changed IO names to be more clear.
63,7 → 67,8
// Revision 1.3 2001/06/12 15:19:49 rudi
//
//
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
// Minor changes after running lint, and a small bug
// fix reading csr and ba_mask registers.
//
// Revision 1.2 2001/06/03 11:37:17 rudi
//
92,7 → 97,9
module mc_wb_if(clk, rst,
wb_addr_i, wb_cyc_i, wb_stb_i, wb_we_i, wb_err, wb_ack_o,
wb_read_go, wb_write_go,
wb_first, wb_wait, mem_ack, wr_hold);
wb_first, wb_wait, mem_ack, wr_hold,
err, par_err, wp_err,
wb_data_o, mem_dout, rf_dout);
 
input clk, rst;
input [31:0] wb_addr_i;
99,7 → 106,7
input wb_cyc_i;
input wb_stb_i;
input wb_we_i;
input wb_err;
output wb_err;
output wb_ack_o;
output wb_read_go;
output wb_write_go;
107,6 → 114,9
output wb_wait;
input mem_ack;
output wr_hold;
input err, par_err, wp_err;
output [31:0] wb_data_o;
input [31:0] mem_dout, rf_dout;
 
////////////////////////////////////////////////////////////////////
//
124,6 → 134,9
wire rmw;
reg rmw_r;
reg rmw_en;
reg wb_ack_o;
reg wb_err;
reg [31:0] wb_data_o;
 
////////////////////////////////////////////////////////////////////
//
135,7 → 148,7
always @(posedge clk or posedge rst)
if(rst) rmw_en <= #1 1'b0;
else
if(mem_ack) rmw_en <= #1 1'b1;
if(wb_ack_o) rmw_en <= #1 1'b1;
else
if(!wb_cyc_i) rmw_en <= #1 1'b0;
 
144,14 → 157,14
 
assign rmw = rmw_r | (!wr_hold & wb_we_i & wb_cyc_i & wb_stb_i & rmw_en);
 
 
always @(posedge clk)
read_go_r1 <= #1 !rmw & wb_cyc_i & ((wb_stb_i & mem_sel & !wb_we_i) | read_go_r);
read_go_r1 <= #1 !rmw & wb_cyc_i &
((wb_stb_i & mem_sel & !wb_we_i) | read_go_r);
 
always @(posedge clk)
read_go_r <= #1 read_go_r1 & wb_cyc_i;
 
assign wb_read_go = !rmw & read_go_r1 & wb_cyc_i;
assign wb_read_go = !rmw & read_go_r1 & wb_cyc_i;
 
always @(posedge clk)
write_go_r1 <= #1 wb_cyc_i & ((wb_stb_i & mem_sel & wb_we_i) | write_go_r);
160,11 → 173,11
write_go_r <= #1 write_go_r1 & wb_cyc_i &
((wb_we_i & wb_stb_i) | !wb_stb_i);
 
assign wb_write_go = !rmw & write_go_r1 & wb_cyc_i &
assign wb_write_go = !rmw & write_go_r1 & wb_cyc_i &
((wb_we_i & wb_stb_i) | !wb_stb_i);
 
assign wb_first_set = mem_sel & wb_cyc_i & wb_stb_i & !(read_go_r | write_go_r);
assign wb_first = wb_first_set | (wb_first_r & !mem_ack & !wb_err);
assign wb_first = wb_first_set | (wb_first_r & !wb_ack_o & !wb_err);
 
always @(posedge clk or posedge rst)
if(rst) wb_first_r <= #1 1'b0;
171,7 → 184,7
else
if(wb_first_set) wb_first_r <= #1 1'b1;
else
if(mem_ack | wb_err) wb_first_r <= #1 1'b0;
if(wb_ack_o | wb_err) wb_first_r <= #1 1'b0;
 
always @(posedge clk)
if(wb_cyc_i & wb_stb_i) wr_hold <= #1 wb_we_i;
181,8 → 194,14
// WB Ack
//
 
assign wb_ack_o = mem_ack;
always @(posedge clk)
wb_ack_o <= #1 `MC_MEM_SEL ? mem_ack :
`MC_REG_SEL & wb_cyc_i & wb_stb_i & !wb_ack_o;
 
always @(posedge clk)
wb_err <= #1 wb_cyc_i & wb_stb_i & `MC_MEM_SEL &
(par_err | err | wp_err) & !wb_err;
 
////////////////////////////////////////////////////////////////////
//
// Memory Wait Logic
190,4 → 209,12
 
assign wb_wait = wb_cyc_i & !wb_stb_i & (wb_write_go | wb_read_go);
 
////////////////////////////////////////////////////////////////////
//
// WISHBONE Data Output
//
 
always @(posedge clk)
wb_data_o <= #1 `MC_MEM_SEL ? mem_dout : rf_dout;
 
endmodule
/trunk/rtl/verilog/mc_obct.v
38,10 → 38,10
 
// CVS Log
//
// $Id: mc_obct.v,v 1.2 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_obct.v,v 1.3 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.2 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 48,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.1 2001/07/29 07:34:41 rudi
//
//
182,10 → 186,10
// Raw address checking
//
 
assign row0_same = b0_last_row == row_adr;
assign row1_same = b1_last_row == row_adr;
assign row2_same = b2_last_row == row_adr;
assign row3_same = b3_last_row == row_adr;
assign row0_same = (b0_last_row == row_adr);
assign row1_same = (b1_last_row == row_adr);
assign row2_same = (b2_last_row == row_adr);
assign row3_same = (b3_last_row == row_adr);
 
always @(bank_adr or row0_same or row1_same or row2_same or row3_same)
case(bank_adr) // synopsys full_case parallel_case
/trunk/rtl/verilog/mc_rf.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_rf.v,v 1.4 2001-10-04 03:19:37 rudi Exp $
// $Id: mc_rf.v,v 1.5 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-10-04 03:19:37 $
// $Revision: 1.4 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.5 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2001/10/04 03:19:37 rudi
//
// Fixed Register reads
// Tightened up timing for register rd/wr
//
// Revision 1.3 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
95,7 → 100,7
module mc_rf(clk, rst,
 
wb_data_i, rf_dout, wb_addr_i, wb_we_i, wb_cyc_i,
wb_stb_i, wb_ack_o, wb_err_o, wp_err,
wb_stb_i, wb_ack_o, wp_err,
 
csc, tms, poc,
sp_csc, sp_tms, cs,
119,7 → 124,6
input wb_cyc_i;
input wb_stb_i;
output wb_ack_o;
output wb_err_o;
output wp_err;
 
// --------------------------------------
156,7 → 160,6
//
 
reg wb_ack_o;
reg ack_r;
 
reg [31:0] csc;
reg [31:0] tms;
165,7 → 168,7
reg [31:0] rf_dout;
reg [7:0] cs;
 
wire rf_we;
reg rf_we;
wire [31:0] csr;
reg [10:0] csr_r;
reg [7:0] csr_r2;
207,8 → 210,6
wire [7:0] spec_req_cs_d;
reg [7:0] spec_req_cs;
reg init_req, lmr_req;
wire [2:0] cs_sel;
wire [2:0] sp_cs_sel;
reg sreq_cs_le;
 
// Aliases
220,31 → 221,30
// WISHBONE Register Read logic
//
 
assign wb_err_o = 1'b0;
 
always @(posedge clk)
if(wb_cyc_i & wb_stb_i & `MC_REG_SEL & !wb_we_i)
always @(wb_addr_i or csr or poc or csc_mask or csc0 or tms0 or csc1 or
tms1 or csc2 or tms2 or csc3 or tms3 or csc4 or tms4 or csc5 or
tms5 or csc6 or tms6 or csc7 or tms7)
case(wb_addr_i[6:2]) // synopsys full_case parallel_case
5'd0: rf_dout <= #1 csr;
5'd1: rf_dout <= #1 poc;
5'd2: rf_dout <= #1 csc_mask;
5'h00: rf_dout <= #1 csr;
5'h01: rf_dout <= #1 poc;
5'h02: rf_dout <= #1 csc_mask;
 
5'd4: rf_dout <= #1 csc0;
5'd5: rf_dout <= #1 tms0;
5'd6: rf_dout <= #1 csc1;
5'd7: rf_dout <= #1 tms1;
5'd8: rf_dout <= #1 csc2;
5'd9: rf_dout <= #1 tms2;
5'd10: rf_dout <= #1 csc3;
5'd11: rf_dout <= #1 tms3;
5'd12: rf_dout <= #1 csc4;
5'd13: rf_dout <= #1 tms4;
5'd14: rf_dout <= #1 csc5;
5'd15: rf_dout <= #1 tms5;
5'd16: rf_dout <= #1 csc6;
5'd17: rf_dout <= #1 tms6;
5'd18: rf_dout <= #1 csc7;
5'd19: rf_dout <= #1 tms7;
5'h04: rf_dout <= #1 csc0;
5'h05: rf_dout <= #1 tms0;
5'h06: rf_dout <= #1 csc1;
5'h07: rf_dout <= #1 tms1;
5'h08: rf_dout <= #1 csc2;
5'h09: rf_dout <= #1 tms2;
5'h0a: rf_dout <= #1 csc3;
5'h0b: rf_dout <= #1 tms3;
5'h0c: rf_dout <= #1 csc4;
5'h0d: rf_dout <= #1 tms4;
5'h0e: rf_dout <= #1 csc5;
5'h0f: rf_dout <= #1 tms5;
5'h10: rf_dout <= #1 csc6;
5'h11: rf_dout <= #1 tms6;
5'h12: rf_dout <= #1 csc7;
5'h13: rf_dout <= #1 tms7;
endcase
 
////////////////////////////////////////////////////////////////////
252,18 → 252,24
// WISHBONE Register Write logic
//
 
assign rf_we = `MC_REG_SEL & wb_we_i & wb_cyc_i & wb_stb_i;
reg [6:0] wb_addr_r;
 
always @(posedge clk)
wb_addr_r <= #1 wb_addr_i[6:0];
 
always @(posedge clk)
rf_we <= #1 `MC_REG_SEL & wb_we_i & wb_cyc_i & wb_stb_i & !rf_we;
 
always @(posedge clk or posedge rst)
if(rst) csr_r2 <= #1 8'h0;
else
if(rf_we & (wb_addr_i[6:2] == 5'h0) )
if(rf_we & (wb_addr_r[6:2] == 5'h0) )
csr_r2 <= #1 wb_data_i[31:24];
 
always @(posedge clk or posedge rst)
if(rst) csr_r[10:1] <= #1 10'h0;
else
if(rf_we & (wb_addr_i[6:2] == 5'h0) )
if(rf_we & (wb_addr_r[6:2] == 5'h0) )
csr_r[10:1] <= #1 wb_data_i[10:1];
 
always @(posedge clk)
276,7 → 282,7
always @(posedge clk or posedge rst)
if(rst) csc_mask_r <= #1 11'h7ff;
else
if(rf_we & (wb_addr_i[6:2] == 5'h2) )
if(rf_we & (wb_addr_r[6:2] == 5'h2) )
csc_mask_r <= #1 wb_data_i[10:0];
 
always @(posedge clk)
288,10 → 294,6
//
 
always @(posedge clk)
ack_r <= #1 `MC_REG_SEL & wb_cyc_i & wb_stb_i & !ack_r & !wb_ack_o;
 
always @(posedge clk)
//wb_ack_o <= #1 (ack_r & wb_we_i) | (`MC_REG_SEL & wb_cyc_i & wb_stb_i & !wb_we_i & !wb_ack_o) ;
wb_ack_o <= #1 `MC_REG_SEL & wb_cyc_i & wb_stb_i & !wb_ack_o;
 
////////////////////////////////////////////////////////////////////
309,65 → 311,81
else
if(!wb_cyc_i) wp_err <= #1 1'b0;
 
assign cs_sel[0] = cs1 | cs3 | cs5 | cs7;
assign cs_sel[1] = cs2 | cs3 | cs6 | cs7;
assign cs_sel[2] = cs4 | cs5 | cs6 | cs7;
 
always @(posedge clk)
if(cs_le)
case(cs_sel) // synopsys full_case parallel_case
3'h0: csc <= #1 csc0;
3'h1: csc <= #1 csc1;
3'h2: csc <= #1 csc2;
3'h3: csc <= #1 csc3;
3'h4: csc <= #1 csc4;
3'h5: csc <= #1 csc5;
3'h6: csc <= #1 csc6;
3'h7: csc <= #1 csc7;
endcase
begin
if(cs0) csc <= #1 csc0;
else
if(cs1) csc <= #1 csc1;
else
if(cs2) csc <= #1 csc2;
else
if(cs3) csc <= #1 csc3;
else
if(cs4) csc <= #1 csc4;
else
if(cs5) csc <= #1 csc5;
else
if(cs6) csc <= #1 csc6;
else csc <= #1 csc7;
end
 
always @(posedge clk)
if(cs_le | rf_we)
case(cs_sel) // synopsys full_case parallel_case
3'h0: tms <= #1 tms0;
3'h1: tms <= #1 tms1;
3'h2: tms <= #1 tms2;
3'h3: tms <= #1 tms3;
3'h4: tms <= #1 tms4;
3'h5: tms <= #1 tms5;
3'h6: tms <= #1 tms6;
3'h7: tms <= #1 tms7;
endcase
begin
if(cs0) tms <= #1 tms0;
else
if(cs1) tms <= #1 tms1;
else
if(cs2) tms <= #1 tms2;
else
if(cs3) tms <= #1 tms3;
else
if(cs4) tms <= #1 tms4;
else
if(cs5) tms <= #1 tms5;
else
if(cs6) tms <= #1 tms6;
else tms <= #1 tms7;
end
 
assign sp_cs_sel[0] = spec_req_cs[1] | spec_req_cs[3] | spec_req_cs[5] | spec_req_cs[7];
assign sp_cs_sel[1] = spec_req_cs[2] | spec_req_cs[3] | spec_req_cs[6] | spec_req_cs[7];
assign sp_cs_sel[2] = spec_req_cs[4] | spec_req_cs[5] | spec_req_cs[6] | spec_req_cs[7];
 
always @(posedge clk)
if(cs_le)
case(sp_cs_sel) // synopsys full_case parallel_case
3'h0: sp_csc <= #1 csc0;
3'h1: sp_csc <= #1 csc1;
3'h2: sp_csc <= #1 csc2;
3'h3: sp_csc <= #1 csc3;
3'h4: sp_csc <= #1 csc4;
3'h5: sp_csc <= #1 csc5;
3'h6: sp_csc <= #1 csc6;
3'h7: sp_csc <= #1 csc7;
endcase
begin
if(spec_req_cs[0]) sp_csc <= #1 csc0;
else
if(spec_req_cs[1]) sp_csc <= #1 csc1;
else
if(spec_req_cs[2]) sp_csc <= #1 csc2;
else
if(spec_req_cs[3]) sp_csc <= #1 csc3;
else
if(spec_req_cs[4]) sp_csc <= #1 csc4;
else
if(spec_req_cs[5]) sp_csc <= #1 csc5;
else
if(spec_req_cs[6]) sp_csc <= #1 csc6;
else sp_csc <= #1 csc7;
end
 
always @(posedge clk)
if(cs_le | rf_we)
case(sp_cs_sel) // synopsys full_case parallel_case
3'h0: sp_tms <= #1 tms0;
3'h1: sp_tms <= #1 tms1;
3'h2: sp_tms <= #1 tms2;
3'h3: sp_tms <= #1 tms3;
3'h4: sp_tms <= #1 tms4;
3'h5: sp_tms <= #1 tms5;
3'h6: sp_tms <= #1 tms6;
3'h7: sp_tms <= #1 tms7;
endcase
begin
if(spec_req_cs[0]) sp_tms <= #1 tms0;
else
if(spec_req_cs[1]) sp_tms <= #1 tms1;
else
if(spec_req_cs[2]) sp_tms <= #1 tms2;
else
if(spec_req_cs[3]) sp_tms <= #1 tms3;
else
if(spec_req_cs[4]) sp_tms <= #1 tms4;
else
if(spec_req_cs[5]) sp_tms <= #1 tms5;
else
if(spec_req_cs[6]) sp_tms <= #1 tms6;
else sp_tms <= #1 tms7;
end
 
assign cs_need_rfr[0] = csc0[0] & (csc0[3:1] == `MC_MEM_TYPE_SDRAM);
assign cs_need_rfr[1] = csc1[0] & (csc1[3:1] == `MC_MEM_TYPE_SDRAM);
405,14 → 423,14
sreq_cs_le <= #1 (!init_req & !lmr_req) | lmr_ack_fe | init_ack_fe;
 
// Make sure only one is serviced at a time
assign spec_req_cs_d[0] = spec_req_cs_t[0];
assign spec_req_cs_d[1] = spec_req_cs_t[1] & !spec_req_cs_t[0];
assign spec_req_cs_d[2] = spec_req_cs_t[2] & !( |spec_req_cs_t[1:0] );
assign spec_req_cs_d[3] = spec_req_cs_t[3] & !( |spec_req_cs_t[2:0] );
assign spec_req_cs_d[4] = spec_req_cs_t[4] & !( |spec_req_cs_t[3:0] );
assign spec_req_cs_d[5] = spec_req_cs_t[5] & !( |spec_req_cs_t[4:0] );
assign spec_req_cs_d[6] = spec_req_cs_t[6] & !( |spec_req_cs_t[5:0] );
assign spec_req_cs_d[7] = spec_req_cs_t[7] & !( |spec_req_cs_t[6:0] );
assign spec_req_cs_d[0] = spec_req_cs_t[0];
assign spec_req_cs_d[1] = spec_req_cs_t[1] & !spec_req_cs_t[0];
assign spec_req_cs_d[2] = spec_req_cs_t[2] & !( |spec_req_cs_t[1:0] );
assign spec_req_cs_d[3] = spec_req_cs_t[3] & !( |spec_req_cs_t[2:0] );
assign spec_req_cs_d[4] = spec_req_cs_t[4] & !( |spec_req_cs_t[3:0] );
assign spec_req_cs_d[5] = spec_req_cs_t[5] & !( |spec_req_cs_t[4:0] );
assign spec_req_cs_d[6] = spec_req_cs_t[6] & !( |spec_req_cs_t[5:0] );
assign spec_req_cs_d[7] = spec_req_cs_t[7] & !( |spec_req_cs_t[6:0] );
 
// Request Tracking
always @(posedge clk)
424,11 → 442,11
lmr_req4 | lmr_req5 | lmr_req6 | lmr_req7;
 
assign spec_req_cs_t = !init_req ? // Load Mode Register Requests
{lmr_req7, lmr_req6, lmr_req5, lmr_req4,
lmr_req3, lmr_req2, lmr_req1, lmr_req0 } :
// Initialize SDRAM Requests
{init_req7, init_req6, init_req5, init_req4,
init_req3, init_req2, init_req1, init_req0 };
{lmr_req7, lmr_req6, lmr_req5, lmr_req4,
lmr_req3, lmr_req2, lmr_req1, lmr_req0 } :
// Initialize SDRAM Requests
{init_req7, init_req6, init_req5, init_req4,
init_req3, init_req2, init_req1, init_req0 };
 
// Ack distribution
assign lmr_ack0 = spec_req_cs[0] & lmr_ack_fe;
/trunk/rtl/verilog/mc_timing.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_timing.v,v 1.4 2001-09-24 00:38:21 rudi Exp $
// $Id: mc_timing.v,v 1.5 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-09-24 00:38:21 $
// $Revision: 1.4 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.5 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2001/09/24 00:38:21 rudi
//
// Changed Reset to be active high and async.
//
// Revision 1.3 2001/09/02 02:28:28 rudi
//
// Many fixes for minor bugs that showed up in gate level simulations.
103,7 → 107,7
// Wishbone Interface
wb_cyc_i, wb_stb_i, wb_we_i,
wb_read_go, wb_write_go, wb_first, wb_wait, mem_ack,
err,
err,
 
// Suspend/Resume Interface
susp_req, resume_req, suspended, susp_sel,
211,37 → 215,33
 
// Number of states: 66
parameter [65:0] // synopsys enum state
// 6666666555555555544444444443333333333222222222211111111110000000000
// 6543210987654321098765432109876543210987654321098765432109876543210
POR = 66'b000000000000000000000000000000000000000000000000000000000000000001,
IDLE = 66'b000000000000000000000000000000000000000000000000000000000000000010,
IDLE_T = 66'b000000000000000000000000000000000000000000000000000000000000000100,
IDLE_T2 = 66'b000000000000000000000000000000000000000000000000000000000000001000,
PRECHARGE = 66'b000000000000000000000000000000000000000000000000000000000000010000,
 
PRECHARGE_W = 66'b000000000000000000000000000000000000000000000000000000000000100000,
ACTIVATE = 66'b000000000000000000000000000000000000000000000000000000000001000000,
ACTIVATE_W = 66'b000000000000000000000000000000000000000000000000000000000010000000,
SD_RD_WR = 66'b000000000000000000000000000000000000000000000000000000000100000000,
SD_RD = 66'b000000000000000000000000000000000000000000000000000000001000000000,
 
SD_RD_W = 66'b000000000000000000000000000000000000000000000000000000010000000000,
SD_RD_LOOP = 66'b000000000000000000000000000000000000000000000000000000100000000000,
 
SD_RD_W2 = 66'b000000000000000000000000000000000000000000000000000001000000000000,
SD_WR = 66'b000000000000000000000000000000000000000000000000000010000000000000,
SD_WR_W = 66'b000000000000000000000000000000000000000000000000000100000000000000,
 
BT = 66'b000000000000000000000000000000000000000000000000001000000000000000,
BT_W = 66'b000000000000000000000000000000000000000000000000010000000000000000,
REFR = 66'b000000000000000000000000000000000000000000000000100000000000000000,
LMR0 = 66'b000000000000000000000000000000000000000000000001000000000000000000,
LMR1 = 66'b000000000000000000000000000000000000000000000010000000000000000000,
 
LMR2 = 66'b000000000000000000000000000000000000000000000100000000000000000000,
INIT0 = 66'b000000000000000000000000000000000000000000001000000000000000000000,
INIT = 66'b000000000000000000000000000000000000000000010000000000000000000000,
INIT_W = 66'b000000000000000000000000000000000000000000100000000000000000000000,
INIT_REFR1 = 66'b000000000000000000000000000000000000000001000000000000000000000000,
 
INIT_REFR1_W = 66'b000000000000000000000000000000000000000010000000000000000000000000,
INIT_LMR = 66'b000000000000000000000000000000000000000100000000000000000000000000,
SUSP1 = 66'b000000000000000000000000000000000000001000000000000000000000000000,
301,11 → 301,11
wire cs_a;
reg [3:0] cmd;
 
reg mem_ack;
wire mem_ack;
wire mem_ack_s;
reg mem_ack_d;
reg err_d;
reg err;
wire err;
reg cmd_a10;
reg lmr_ack;
reg row_sel;
337,13 → 337,14
reg burst_act_rd;
wire single_write;
 
reg cs_le_d;
reg cs_le;
reg cs_le_r;
 
reg susp_req_r;
reg resume_req_r;
reg suspended;
reg suspended_d;
//wire susp_sel;
reg susp_sel_set, susp_sel_clr, susp_sel_r;
 
reg [3:0] cmd_del;
396,7 → 397,17
reg mc_c_oe;
 
reg mc_le;
reg mem_ack_r;
 
reg rsts, rsts1;
reg no_wb_cycle;
 
wire bc_dec;
reg ap_en; // Auto Precharge Enable
reg cmd_a10_r;
reg wb_stb_first;
reg tmr_ld_tavav;
 
////////////////////////////////////////////////////////////////////
//
// Aliases
404,14 → 415,23
assign mem_type = csc[3:1];
assign bus_width = csc[5:4];
assign kro = csc[10];
assign single_write = tms[9];
assign single_write = tms[9] | (tms[2:0] == 3'h0);
 
////////////////////////////////////////////////////////////////////
//
// Misc Logic
//
reg cs_le_r1;
 
reg rsts, rsts1;
always @(posedge clk)
cs_le_r <= #1 cs_le_r1;
 
always @(posedge clk)
cs_le_r1 <= #1 cs_le;
 
always @(posedge clk)
cs_le <= #1 cs_le_d;
 
always @(posedge mc_clk)
rsts1 <= #1 rst;
 
450,12 → 470,13
assign cs_a = |cs;
 
// Memory to Wishbone Ack
always @(posedge clk)
mem_ack <= #1 (mem_ack_d | mem_ack_s) & (wb_read_go | wb_write_go);
assign mem_ack = (mem_ack_d | mem_ack_s) & (wb_read_go | wb_write_go);
 
always @(posedge clk)
err <= #1 err_d;
mem_ack_r <= #1 mem_ack;
 
assign err = err_d;
 
// SDRAM Command, either delayed (for writes) or straight through
always @(posedge clk)
cmd_r <= #1 cmd;
512,10 → 533,10
 
// Indicates when the row_same and bank_open lookups are done
always @(posedge clk)
lookup_ready1 <= #1 cs_le;
lookup_ready1 <= #1 cs_le & wb_stb_i;
 
always @(posedge clk)
lookup_ready2 <= #1 lookup_ready1;
lookup_ready2 <= #1 lookup_ready1 & wb_stb_i;
 
// Keep Track if it is a SDRAM write cycle
always @(posedge clk or posedge rst)
533,11 → 554,17
else
if(!wb_cyc_i) wb_cycle <= #1 1'b0;
 
// Thses two signals are used to signal that no wishbone cycle is in
// progress. Need to register them to avoid a very long combinatorial
// path ....
always @(posedge clk)
no_wb_cycle <= #1 !wb_read_go & !wb_write_go;
 
// Track ack's for read cycles
always @(posedge clk or posedge rst)
if(rst) ack_cnt <= #1 4'h0;
else
if(!wb_read_go & !wb_write_go) ack_cnt <= #1 4'h0;
if(no_wb_cycle) ack_cnt <= #1 4'h0;
else
if(dv & !mem_ack_s) ack_cnt <= #1 ack_cnt + 4'h1;
else
545,7 → 572,7
 
assign ack_cnt_is_0 = (ack_cnt==4'h0);
 
assign mem_ack_s = (ack_cnt != 4'h0) & !wb_wait & !mem_ack & wb_read_go & !(wb_we_i & wb_stb_i);
assign mem_ack_s = (ack_cnt != 4'h0) & !wb_wait & !mem_ack_r & wb_read_go & !(wb_we_i & wb_stb_i);
 
// Internal Cycle Tracker
always @(posedge clk)
578,15 → 605,18
//
// Timing Logic
//
wire [3:0] twrp;
wire twd_is_zero;
wire [31:0] tms_x;
 
// FIX_ME
// Hard wire worst case or make it programmable ???
assign tms_x = (rfr_ack | rfr_ack_r | susp_sel | !mc_c_oe) ? 32'hffff_ffff : tms;
 
always @(posedge clk)
if(tmr2_ld_tscsto) timer2 <= #1 tms_x[24:16];
else
if(tmr2_ld_tsrdv) timer2 <= #1 9'd2; // SSRAM RD->1st DATA VALID
if(tmr2_ld_tsrdv) timer2 <= #1 9'd4; // SSRAM RD->1st DATA VALID
else
if(tmr2_ld_twpw) timer2 <= #1 { 5'h0, tms_x[15:12]};
else
600,7 → 630,6
else
if(!timer2_is_zero) timer2 <= #1 timer2 - 9'b1;
 
wire twd_is_zero;
assign twd_is_zero = (tms_x[19:16] == 4'h0);
 
assign timer2_is_zero = (timer2 == 9'h0);
609,10 → 638,8
tmr2_done <= #1 timer2_is_zero & !tmr2_ld_trdv & !tmr2_ld_trdz &
!tmr2_ld_twpw & !tmr2_ld_twd & !tmr2_ld_twwd & !tmr2_ld_tscsto;
 
wire [3:0] twrp;
assign twrp = {2'h0,tms_x[16:15]} + tms_x[23:20];
 
assign twrp = tms_x[16:15] + tms_x[23:20];
 
// SDRAM Memories timing tracker
always @(posedge clk or posedge rst)
`ifdef MC_POR_DELAY
625,7 → 652,6
else
if(tmr_ld_trdv) timer <= #1 tms_x[7:0];
else
//if(tmr_ld_twr) timer <= #1 { 6'h0, tms_x[16:15]};
if(tmr_ld_twr) timer <= #1 { 4'h0, twrp};
else
if(tmr_ld_trp) timer <= #1 { 4'h0, tms_x[23:20]};
636,8 → 662,10
else
if(tmr_ld_trfc) timer <= #1 { 4'h0, tms_x[27:24]};
else
if(tmr_ld_txsr) timer <= #1 8'd7;
if(tmr_ld_tavav) timer <= #1 8'h3;
else
if(tmr_ld_txsr) timer <= #1 8'h7;
else
if(!timer_is_zero & !mc_le) timer <= #1 timer - 8'b1;
 
assign timer_is_zero = (timer == 8'h0);
657,23 → 685,29
// Burst Counter
always @(tms_x or page_size)
case(tms_x[2:0]) // synopsys full_case parallel_case
3'h0: burst_val = 11'd1;
3'h1: burst_val = 11'd2;
3'h2: burst_val = 11'd4;
3'h3: burst_val = 11'd8;
3'h0: burst_val = 11'h1;
3'h1: burst_val = 11'h2;
3'h2: burst_val = 11'h4;
3'h3: burst_val = 11'h8;
3'h7: burst_val = page_size;
endcase
 
assign bc_dec = wr_cycle ? mem_ack_d : dv;
 
always @(posedge clk)
if(burst_cnt_ld_4) burst_cnt <= #1 11'h4;
if(burst_cnt_ld_4) burst_cnt <= #1 11'h4; // for SSRAM only
else
if(burst_cnt_ld) burst_cnt <= #1 burst_val;
if(burst_cnt_ld) burst_cnt <= #1 burst_val;
else
if(wr_cycle ? mem_ack_d : dv) burst_cnt <= #1 burst_cnt - 11'h1;
if(bc_dec) burst_cnt <= #1 burst_cnt - 11'h1;
 
always @(posedge clk)
if(burst_cnt_ld) burst_fp <= #1 (tms_x[2:0] == 3'h7);
 
// Auto Precharge Enable
always @(posedge clk)
if(burst_cnt_ld) ap_en <= #1 (tms_x[2:0] == 3'h0) & !kro;
 
assign burst_act = |burst_cnt & ( |tms_x[2:0] );
 
always @(posedge clk)
682,12 → 716,27
always @(posedge clk)
dv_r <= #1 dv;
 
always @(posedge clk) // Auto Precharge Holding Register
cmd_a10_r <= #1 cmd_a10;
 
////////////////////////////////////////////////////////////////////
//
// Main State Machine
//
reg wb_write_go_r;
 
always @(posedge clk)
wb_write_go_r <= #1 wb_write_go;
 
 
always @(posedge clk or posedge rst)
if(rst) wb_stb_first <= #1 1'b0;
else
if(mem_ack) wb_stb_first <= #1 1'b0;
else
if(wb_first & wb_stb_i) wb_stb_first <= #1 1'b1;
 
always @(posedge clk or posedge rst)
`ifdef MC_POR_DELAY
if(rst) state <= #1 POR;
`else
695,16 → 744,16
`endif
else state <= #1 next_state;
 
always @(state or cs_a or
twd_is_zero or wb_stb_i or
wb_first or wb_read_go or wb_write_go or wb_wait or mem_ack or wb_we_i or
ack_cnt_is_0 or wb_wait_r or cnt or wb_cycle or
mem_type or kro or lookup_ready1 or lookup_ready2 or row_same or
always @(state or cs_a or cs_le or cs_le_r or
twd_is_zero or wb_stb_i or wb_write_go_r or
wb_first or wb_read_go or wb_write_go or wb_wait or mem_ack_r or wb_we_i or
ack_cnt_is_0 or wb_wait_r or cnt or wb_cycle or wr_cycle or
mem_type or kro or lookup_ready2 or row_same or cmd_a10_r or
bank_open or single_write or
cmd_asserted or tmr_done or tmr2_done or ir_cnt_done or cmd_asserted2 or
burst_act or burst_act_rd or burst_fp or cke_ or cke_r or cke_o_del or
rfr_req or lmr_req or init_req or rfr_ack_r or susp_req_r or resume_req_r or
mc_br or bw8 or bw16 or dv_r or mc_adv_r or mc_ack
mc_br or bw8 or bw16 or dv_r or mc_adv_r or mc_ack or wb_stb_first or ap_en
)
begin
next_state = state; // Default keep current state
711,7 → 760,7
cnt_next = 1'b0;
 
cmd = `MC_CMD_NOP;
cmd_a10 = ~kro;
cmd_a10 = ap_en;
oe_d = 1'b0;
data_oe_d = 1'b0;
cke_d = 1'b1;
734,6 → 783,7
tmr_ld_trdv = 1'b0;
tmr_ld_trdz = 1'b0;
tmr_ld_twr2 = 1'b0;
tmr_ld_tavav = 1'b0;
 
tmr2_ld_trdv = 1'b0;
tmr2_ld_trdz = 1'b0;
754,7 → 804,7
ir_cnt_ld = 1'b0;
 
row_sel = 1'b0;
cs_le = 1'b0;
cs_le_d = 1'b0;
wr_clr = 1'b0;
wr_set = 1'b0;
wb_cycle_set = 1'b0;
781,10 → 831,14
`endif
IDLE:
begin
cs_le = (wb_first & wb_stb_i) | lmr_req;
cs_le_d = wb_stb_first | lmr_req;
burst_cnt_ld = 1'b1;
wr_clr = 1'b1;
 
if(mem_type == `MC_MEM_TYPE_SCS) tmr2_ld_tscsto = 1'b1;
if(mem_type == `MC_MEM_TYPE_SRAM) tmr2_ld_tsrdv = 1'b1;
 
 
if(rfr_req)
begin
rfr_ack = 1'b1;
793,7 → 847,7
else
if(init_req)
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
next_state = INIT0;
end
else
800,23 → 854,23
if(lmr_req & lookup_ready2)
begin
lmr_ack = 1'b1;
cs_le = 1'b1;
cs_le_d = 1'b1;
next_state = LMR0;
end
else
if(susp_req_r & !wb_cycle)
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
susp_sel_set = 1'b1;
next_state = SUSP1;
end
else
if(cs_a & (wb_read_go | wb_write_go) & (lookup_ready1 | wb_cycle) )
if(cs_a & (wb_read_go | wb_write_go) & lookup_ready2)
begin
wb_cycle_set = 1'b1;
case(mem_type) // synopsys full_case parallel_case
`MC_MEM_TYPE_SDRAM: // SDRAM
if((lookup_ready2 | wb_cycle) & !wb_wait)
if((lookup_ready2) & !wb_wait)
begin
if(wb_write_go | (wb_we_i & wb_stb_i)) wr_set = 1'b1;
if(kro & bank_open & row_same) next_state = SD_RD_WR;
828,13 → 882,13
begin // Async Chip Select
if(!wb_wait)
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
if(wb_write_go)
begin
data_oe_d = 1'b1;
next_state = ACS_WR;
data_oe_d = 1'b1;
next_state = ACS_WR;
end
else next_state = ACS_RD;
else next_state = ACS_RD;
end
end
`MC_MEM_TYPE_SCS:
841,8 → 895,7
begin // Sync Chip Select
if(!wb_wait)
begin
tmr2_ld_tscsto = 1'b1;
cs_le = 1'b1;
cs_le_d = 1'b1;
if(wb_write_go)
begin
cmd = `MC_CMD_XWR;
863,7 → 916,7
begin // SRAM
if(!wb_wait)
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
if(wb_write_go)
begin
data_oe_d = 1'b1;
875,7 → 928,6
cmd = `MC_CMD_XRD;
oe_d = 1'b1;
mc_adsc = 1'b1;
tmr2_ld_tsrdv = 1'b1;
next_state = SRAM_RD;
end
end
885,19 → 937,28
else
if(mc_br)
begin
if(!cmd_asserted2) next_state = BG0;
if(!cmd_asserted2)
begin
next_state = BG0;
mc_c_oe_d = 1'b0;
end
end
end
 
IDLE_T:
begin
cs_le = (wb_first & wb_stb_i) | lmr_req;
cmd_a10 = cmd_a10_r; // Hold Auto Precharge 'til cycle finishes
if(tmr_done & wb_cycle & !wb_wait) cs_le_d = 1'b1;
if(tmr_done) next_state = IDLE;
end
 
IDLE_T2:
begin
if(tmr2_done) next_state = IDLE;
if(tmr2_done & (!wb_wait | !wb_cycle) )
begin
cs_le_d = 1'b1;
if(cs_le_r) next_state = IDLE;
end
end
 
/////////////////////////////////////////
962,7 → 1023,6
/////////////////////////////////////////
// SSRAM STATES ....
/////////////////////////////////////////
 
SRAM_RD:
begin
cmd = `MC_CMD_XRD;
1014,7 → 1074,7
else
if(!wb_wait)
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
next_state = SRAM_RD;
end
end
1025,7 → 1085,7
next_state = IDLE;
end
 
SRAM_WR: // 80
SRAM_WR:
begin
cmd = `MC_CMD_XWR;
mc_adsc = 1'b1;
1042,12 → 1102,12
else
begin
data_oe_d = 1'b1;
mem_ack_d = ~mem_ack;
mem_ack_d = ~mem_ack_r;
end
end
end
 
SRAM_WR0: // 81
SRAM_WR0:
begin
if(wb_wait) next_state = SRAM_WR0;
else
1059,12 → 1119,8
else
begin
data_oe_d = 1'b1;
//mem_ack_d = ~mem_ack;
next_state = SRAM_WR;
end
 
//data_oe_d = 1'b1;
//if(!wb_wait) next_state = SRAM_WR;
end
 
/////////////////////////////////////////
1089,7 → 1145,6
else
if(bw16) next_state = ACS_RD_8_5;
else next_state = ACS_RD2A;
//else next_state = ACS_RD3;
end
end
 
1249,7 → 1304,7
end
end
 
ACTIVATE: // 4
ACTIVATE:
begin
if(!wb_wait_r)
begin
1271,8 → 1326,8
begin
if(wb_write_go)
begin
mem_ack_d = !mem_ack;
cmd_a10 = ~kro;
mem_ack_d = ~mem_ack_r;
cmd_a10 = ap_en | (single_write & !kro);
next_state = SD_WR;
end
else
1280,7 → 1335,7
end
end
 
SD_RD_WR: // 6
SD_RD_WR:
begin
if(wb_write_go | (wb_we_i & wb_stb_i)) wr_set = 1'b1;
 
1287,8 → 1342,8
if(wb_write_go & !wb_wait)
begin // Write
data_oe_d = 1'b1;
mem_ack_d = !mem_ack;
cmd_a10 = ~kro;
mem_ack_d = ~mem_ack_r;
cmd_a10 = ap_en | (single_write & !kro);
next_state = SD_WR;
end
else
1302,32 → 1357,35
end
end
 
SD_WR: // Write Command A
SD_WR: // Write Command
begin // Does the first single write
data_oe_d = 1'b1;
tmr_ld_twr = 1'b1;
cnt_next = ~cnt;
cmd = `MC_CMD_WR;
cmd_a10 = ~kro;
 
if(!cnt & wb_cycle & burst_act) cke_d = !wb_wait;
cmd_a10 = ap_en | (single_write & !kro);
 
if(!cnt & wb_cycle & burst_act) cke_d = ~wb_wait;
else cke_d = cke_r;
 
if(cmd_asserted)
begin
mem_ack_d = !mem_ack & wb_write_go & !wb_wait & wb_cycle & burst_act;
mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wb_cycle & burst_act;
 
if(wb_cycle & !burst_act) next_state = IDLE_T;
else
if(wb_cycle) next_state = SD_WR_W;
if(wb_write_go) next_state = SD_WR_W;
else
if(burst_act & !single_write) next_state = BT;
else
if(!ap_en) next_state = BT_W;
else next_state = IDLE_T;
end
 
end
 
SD_WR_W: // B
SD_WR_W:
begin // Does additional Writes or Times them
tmr_ld_twr = 1'b1;
cnt_next = ~cnt;
1335,46 → 1393,48
if(single_write & wb_cycle)
begin
cmd = `MC_CMD_WR;
if(burst_act) cmd_a10 = 1'b0;
else cmd_a10 = ~kro;
end
cmd_a10 = ap_en | (single_write & !kro);
 
data_oe_d = 1'b1;
mem_ack_d = !mem_ack & wb_write_go & !wb_wait & wb_cycle & burst_act;
mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wr_cycle & burst_act;
 
if(!cnt) cke_d = ~wb_wait;
else cke_d = cke_r;
if(cke_r)
 
if( (single_write & cke_r) | (!single_write & !cnt & !wb_wait) | (!single_write & cnt & cke_r) )
begin
if(single_write & !wb_cycle) next_state = IDLE_T;
else
if(burst_act & !single_write & !wb_write_go )
next_state = BT;
if(burst_act & !single_write & !wb_write_go_r)
begin
cmd = `MC_CMD_BT;
next_state = BT;
end
else
if(!burst_act & !ap_en) next_state = BT_W;
else
if(!burst_act) next_state = IDLE_T;
else
if(!wb_write_go & wb_read_go) next_state = IDLE_T; // Added for WMR
if(!wb_write_go_r & wb_read_go) next_state = IDLE_T; // Added for WMR
end
end
 
SD_RD: // Read Command 7
SD_RD: // Read Command
begin
cmd = `MC_CMD_RD;
if(burst_fp) cmd_a10 = 1'b0;
else cmd_a10 = ~kro;
cmd_a10 = ap_en;
tmr_ld_tcl = 1'b1;
if(cmd_asserted) next_state = SD_RD_W;
end
 
SD_RD_W: // 8
SD_RD_W:
begin
if(tmr_done) next_state = SD_RD_LOOP;
end
 
SD_RD_LOOP: // 9
SD_RD_LOOP:
begin
 
cnt_next = ~cnt;
 
if(cnt & !(burst_act & !wb_cycle) & burst_act ) cke_rd = !wb_wait;
1389,14 → 1449,17
if(!burst_act) next_state = SD_RD_W2;
end
 
SD_RD_W2: //32
SD_RD_W2:
begin
if(wb_cycle & wb_write_go) next_state = IDLE;
else
if(!wb_cycle | ack_cnt_is_0) next_state = IDLE;
if(wb_write_go | ack_cnt_is_0)
begin
if(!ap_en & !kro) next_state = BT_W;
else
if(!wb_wait & !mem_ack_r) next_state = IDLE_T;
end
end
 
BT: // Burst Terminate C
BT:
begin
cmd = `MC_CMD_BT;
tmr_ld_trp = 1'b1;
1403,25 → 1466,29
if(cmd_asserted) next_state = BT_W;
end
 
BT_W: // D
BT_W:
begin
if(kro) next_state = IDLE;
cmd_a10 = cmd_a10_r; // Hold Auto Precharge 'til cycle finishes
 
if(kro & tmr_done)
begin
if(kro & !wb_wait & (wb_read_go | wb_write_go) ) cs_le_d = 1'b1;
next_state = IDLE;
end
else
if(tmr_done & (!burst_fp | kro)) next_state = IDLE;
else
if(tmr_done & burst_fp & !kro) // Must PRECHARGE Full Page Bursts
if(!kro & tmr_done) // Must do a PRECHARGE after Burst Terminate
begin
bank_clr = 1'b1;
cmd = `MC_CMD_PC;
cmd_a10 = `MC_SINGLE_BANK;
tmr_ld_trp = 1'b1;
if(cmd_asserted) next_state = IDLE_T;
if(cmd_asserted) next_state = IDLE_T;
end
end
 
REFR: // Refresh Cycle
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
cmd = `MC_CMD_ARFR;
tmr_ld_trfc = 1'b1;
rfr_ack = 1'b1;
1459,7 → 1526,7
 
INIT0:
begin
cs_le = 1'b1;
cs_le_d = 1'b1;
next_state = INIT;
end
 
1492,7 → 1559,7
end
end
 
INIT_REFR1_W: // 21
INIT_REFR1_W:
begin
init_ack = 1'b1;
if(tmr_done)
1523,18 → 1590,19
BG1:
begin // Bus Grant
mc_bg = 1'b1;
cs_le = 1'b1;
cs_le_d = 1'b1;
mc_c_oe_d = 1'b0;
next_state = BG2;
end
BG2:
begin // Bus Grant
cs_le_d = 1'b1;
mc_bg = !wb_read_go & !wb_write_go &
!rfr_req & !init_req & !lmr_req &
!susp_req_r;
tmr_ld_tcl = 1'b1;
tmr_ld_tavav = 1'b1;
mc_c_oe_d = mc_br;
if(!mc_br) next_state = IDLE_T;
else mc_c_oe_d = 1'b0;
end
 
/////////////////////////////////////////
/trunk/rtl/verilog/mc_rd_fifo.v
38,10 → 38,10
 
// CVS Log
//
// $Id: mc_rd_fifo.v,v 1.1 2001-07-29 07:34:41 rudi Exp $
// $Id: mc_rd_fifo.v,v 1.2 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-07-29 07:34:41 $
// $Revision: 1.1 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.2 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 48,12
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/07/29 07:34:41 rudi
//
//
// 1) Changed Directory Structure
// 2) Fixed several minor bugs
//
// Revision 1.1.1.1 2001/05/13 09:39:44 rudi
// Created Directory Structure
//
92,8 → 98,6
if(we & wr_adr[3]) r3 <= #1 din;
 
always @(rd_adr or r0 or r1 or r2 or r3 or re or we or din)
if(re & we) dout = din;
else
case(rd_adr) // synopsys full_case parallel_case
4'h1: dout = r0;
4'h2: dout = r1;
/trunk/rtl/verilog/mc_adr_sel.v
37,10 → 37,10
 
// CVS Log
//
// $Id: mc_adr_sel.v,v 1.2 2001-08-10 08:16:21 rudi Exp $
// $Id: mc_adr_sel.v,v 1.3 2001-11-29 02:16:28 rudi Exp $
//
// $Date: 2001-08-10 08:16:21 $
// $Revision: 1.2 $
// $Date: 2001-11-29 02:16:28 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 47,12
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2001/08/10 08:16:21 rudi
//
// - Changed IO names to be more clear.
// - Uniquifyed define names to be core specific.
// - Removed "Refresh Early" configuration
//
// Revision 1.1 2001/07/29 07:34:41 rudi
//
//
67,7 → 73,7
 
`include "mc_defines.v"
 
module mc_adr_sel(clk, csc, tms, wb_ack_o, wb_stb_i, wb_addr_i,
module mc_adr_sel(clk, csc, tms, wb_ack_o, wb_stb_i, wb_addr_i, wb_we_i,
wb_write_go, wr_hold, cas_,
mc_addr, row_adr, bank_adr, rfr_ack,
cs_le, cmd_a10, row_sel, lmr_sel, next_adr, wr_cycle,
78,6 → 84,7
input [31:0] tms;
input wb_ack_o, wb_stb_i;
input [31:0] wb_addr_i;
input wb_we_i;
input wb_write_go;
input wr_hold;
input cas_;
139,7 → 146,6
// Async Devices Address Latch & Counter
//
 
//assign asc_addr_pl1 = asc_addr + 1;
mc_incn_r #(24) u0( .clk( clk ),
.inc_in( acs_addr ),
.inc_out( acs_addr_pl1 ) );
148,10 → 154,7
if(wb_stb_i) sram_addr <= #1 wb_addr_i[25:2];
 
always @(posedge clk)
// *** Use same address for write and read ***
//if(wb_write_go) acs_addr <= #1 wb_addr_i[25:2];
//else
if(cs_le)
if(cs_le | wb_we_i)
case(bus_width) // synopsys full_case parallel_case
`MC_BW_8: acs_addr <= #1 wb_addr_i[23:0];
`MC_BW_16: acs_addr <= #1 wb_addr_i[24:1];

powered by: WebSVN 2.1.0

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