mirror of
git://projects.qi-hardware.com/xue.git
synced 2025-04-21 12:27:27 +03:00
unzipped 2 files
This commit is contained in:
2031
sim/verilog/micron_2048Mb_ddr2/ddr2.v
Normal file
2031
sim/verilog/micron_2048Mb_ddr2/ddr2.v
Normal file
File diff suppressed because it is too large
Load Diff
94
sim/verilog/micron_2048Mb_ddr2/ddr2_mcp.v
Normal file
94
sim/verilog/micron_2048Mb_ddr2/ddr2_mcp.v
Normal file
@@ -0,0 +1,94 @@
|
||||
/****************************************************************************************
|
||||
*
|
||||
* File Name: ddr2_mcp.v
|
||||
*
|
||||
* Dependencies: ddr2.v, ddr2_parameters.vh
|
||||
*
|
||||
* Description: Micron SDRAM DDR2 (Double Data Rate 2) multi-chip package model
|
||||
*
|
||||
* Disclaimer This software code and all associated documentation, comments or other
|
||||
* of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
* limitation of liability for consequential or incidental damages, the
|
||||
* above limitation may not apply to you.
|
||||
*
|
||||
* Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
*
|
||||
****************************************************************************************/
|
||||
`timescale 1ps / 1ps
|
||||
|
||||
module ddr2_mcp (
|
||||
ck,
|
||||
ck_n,
|
||||
cke,
|
||||
cs_n,
|
||||
ras_n,
|
||||
cas_n,
|
||||
we_n,
|
||||
dm_rdqs,
|
||||
ba,
|
||||
addr,
|
||||
dq,
|
||||
dqs,
|
||||
dqs_n,
|
||||
rdqs_n,
|
||||
odt
|
||||
);
|
||||
|
||||
`include "ddr2_parameters.vh"
|
||||
|
||||
// Declare Ports
|
||||
input ck;
|
||||
input ck_n;
|
||||
input [CS_BITS-1:0] cke;
|
||||
input [CS_BITS-1:0] cs_n;
|
||||
input ras_n;
|
||||
input cas_n;
|
||||
input we_n;
|
||||
inout [DM_BITS-1:0] dm_rdqs;
|
||||
input [BA_BITS-1:0] ba;
|
||||
input [ADDR_BITS-1:0] addr;
|
||||
inout [DQ_BITS-1:0] dq;
|
||||
inout [DQS_BITS-1:0] dqs;
|
||||
inout [DQS_BITS-1:0] dqs_n;
|
||||
output [DQS_BITS-1:0] rdqs_n;
|
||||
input [CS_BITS-1:0] odt;
|
||||
|
||||
wire [RANKS-1:0] cke_mcp = cke;
|
||||
wire [RANKS-1:0] cs_n_mcp = cs_n;
|
||||
wire [RANKS-1:0] odt_mcp = odt;
|
||||
|
||||
ddr2 rank [RANKS-1:0] (
|
||||
ck,
|
||||
ck_n,
|
||||
cke_mcp,
|
||||
cs_n_mcp,
|
||||
ras_n,
|
||||
cas_n,
|
||||
we_n,
|
||||
dm_rdqs,
|
||||
ba,
|
||||
addr,
|
||||
dq,
|
||||
dqs,
|
||||
dqs_n,
|
||||
rdqs_n,
|
||||
odt_mcp
|
||||
);
|
||||
|
||||
endmodule
|
||||
377
sim/verilog/micron_2048Mb_ddr2/ddr2_module.v
Normal file
377
sim/verilog/micron_2048Mb_ddr2/ddr2_module.v
Normal file
@@ -0,0 +1,377 @@
|
||||
/****************************************************************************************
|
||||
*
|
||||
* File Name: ddr2_module.v
|
||||
*
|
||||
* Dependencies: ddr2.v, ddr2.v, ddr2_parameters.vh
|
||||
*
|
||||
* Description: Micron SDRAM DDR2 (Double Data Rate 2) module model
|
||||
*
|
||||
* Limitation: - SPD (Serial Presence-Detect) is not modeled
|
||||
*
|
||||
* Disclaimer This software code and all associated documentation, comments or other
|
||||
* of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
* limitation of liability for consequential or incidental damages, the
|
||||
* above limitation may not apply to you.
|
||||
*
|
||||
* Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
*
|
||||
* Rev Author Date Changes
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* 1.00 SPH 09/18/09 Fixed cb connection in ECC mode
|
||||
* Added invalid ECC mode error message in x16 configuration
|
||||
****************************************************************************************/
|
||||
`timescale 1ps / 1ps
|
||||
|
||||
module ddr2_module (
|
||||
`ifdef SODIMM
|
||||
`else
|
||||
reset_n,
|
||||
cb ,
|
||||
`endif
|
||||
ck ,
|
||||
ck_n ,
|
||||
cke ,
|
||||
s_n ,
|
||||
ras_n ,
|
||||
cas_n ,
|
||||
we_n ,
|
||||
ba ,
|
||||
addr ,
|
||||
odt ,
|
||||
dqs ,
|
||||
dqs_n ,
|
||||
dq ,
|
||||
scl ,
|
||||
sa ,
|
||||
sda
|
||||
);
|
||||
|
||||
`include "ddr2_parameters.vh"
|
||||
|
||||
input [1:0] cke ;
|
||||
input ras_n ;
|
||||
input cas_n ;
|
||||
input we_n ;
|
||||
input [2:0] ba ;
|
||||
input [15:0] addr ;
|
||||
input [1:0] odt ;
|
||||
inout [17:0] dqs ;
|
||||
inout [17:0] dqs_n ;
|
||||
inout [63:0] dq ;
|
||||
input scl ; // no connect
|
||||
inout sda ; // no connect
|
||||
|
||||
`ifdef QUAD_RANK
|
||||
initial if (DEBUG) $display("%m: Quad Rank");
|
||||
`else `ifdef DUAL_RANK
|
||||
initial if (DEBUG) $display("%m: Dual Rank");
|
||||
`else
|
||||
initial if (DEBUG) $display("%m: Single Rank");
|
||||
`endif `endif
|
||||
|
||||
`ifdef ECC
|
||||
initial if (DEBUG) $display("%m: ECC");
|
||||
`ifdef SODIMM
|
||||
initial begin
|
||||
$display("%m ERROR: ECC is not available on SODIMM configurations");
|
||||
if (STOP_ON_ERROR) $stop(0);
|
||||
end
|
||||
`endif
|
||||
`ifdef x16
|
||||
initial begin
|
||||
$display("%m ERROR: ECC is not available on x16 configurations");
|
||||
if (STOP_ON_ERROR) $stop(0);
|
||||
end
|
||||
`endif
|
||||
`else
|
||||
initial if (DEBUG) $display("%m: non ECC");
|
||||
`endif
|
||||
|
||||
`ifdef RDIMM
|
||||
initial if (DEBUG) $display("%m: RDIMM");
|
||||
input reset_n;
|
||||
input ck ;
|
||||
input ck_n ;
|
||||
input [3:0] s_n ;
|
||||
inout [7:0] cb ;
|
||||
input [2:0] sa ; // no connect
|
||||
|
||||
wire [5:0] rck = {6{ck}};
|
||||
wire [5:0] rck_n = {6{ck_n}};
|
||||
reg [3:0] rs_n ;
|
||||
reg rras_n ;
|
||||
reg rcas_n ;
|
||||
reg rwe_n ;
|
||||
reg [2:0] rba ;
|
||||
reg [15:0] raddr ;
|
||||
reg [3:0] rcke ;
|
||||
reg [3:0] rodt ;
|
||||
|
||||
always @(negedge reset_n or posedge ck) begin
|
||||
if (!reset_n) begin
|
||||
rs_n <= #(500) 0;
|
||||
rras_n <= #(500) 0;
|
||||
rcas_n <= #(500) 0;
|
||||
rwe_n <= #(500) 0;
|
||||
rba <= #(500) 0;
|
||||
raddr <= #(500) 0;
|
||||
rcke <= #(500) 0;
|
||||
rodt <= #(500) 0;
|
||||
end else begin
|
||||
rs_n <= #(500) s_n ;
|
||||
rras_n <= #(500) ras_n;
|
||||
rcas_n <= #(500) cas_n;
|
||||
rwe_n <= #(500) we_n ;
|
||||
rba <= #(500) ba ;
|
||||
raddr <= #(500) addr ;
|
||||
`ifdef QUAD_RANK
|
||||
rcke <= #(500) {{2{cke[1]}}, {2{cke[0]}}};
|
||||
rodt <= #(500) {{2{odt[1]}}, {2{odt[0]}}};
|
||||
`else
|
||||
rcke <= #(500) {2'b00, cke};
|
||||
rodt <= #(500) {2'b00, odt};
|
||||
`endif
|
||||
|
||||
end
|
||||
end
|
||||
`else
|
||||
`ifdef SODIMM
|
||||
initial if (DEBUG) $display("%m: SODIMM");
|
||||
input [1:0] ck ;
|
||||
input [1:0] ck_n ;
|
||||
input [1:0] s_n ;
|
||||
input [1:0] sa ; // no connect
|
||||
|
||||
wire [7:0] cb;
|
||||
wire [5:0] rck = {{3{ck[1]}}, {3{ck[0]}}};
|
||||
wire [5:0] rck_n = {{3{ck_n[1]}}, {3{ck_n[0]}}};
|
||||
`else
|
||||
initial if (DEBUG) $display("%m: UDIMM");
|
||||
input reset_n;
|
||||
input [2:0] ck ;
|
||||
input [2:0] ck_n ;
|
||||
input [1:0] s_n ;
|
||||
inout [7:0] cb ;
|
||||
input [2:0] sa ; // no connect
|
||||
|
||||
wire [5:0] rck = {2{ck}};
|
||||
wire [5:0] rck_n = {2{ck_n}};
|
||||
`endif
|
||||
|
||||
wire [2:0] rba = ba ;
|
||||
wire [15:0] raddr = addr ;
|
||||
wire rras_n = ras_n;
|
||||
wire rcas_n = cas_n;
|
||||
wire rwe_n = we_n ;
|
||||
`ifdef QUAD_RANK
|
||||
wire [3:0] rs_n = {{2{s_n[1]}}, {2{s_n[0]}}};
|
||||
wire [3:0] rcke = {{2{cke[1]}}, {2{cke[0]}}};
|
||||
wire [3:0] rodt = {{2{odt[1]}}, {2{odt[0]}}};
|
||||
`else
|
||||
wire [3:0] rs_n = {2'b00, s_n};
|
||||
wire [3:0] rcke = {2'b00, cke};
|
||||
wire [3:0] rodt = {2'b00, odt};
|
||||
`endif
|
||||
`endif
|
||||
wire [15:0] rcb = {8'b0, cb};
|
||||
wire zero = 1'b0;
|
||||
wire one = 1'b1;
|
||||
|
||||
//ddr2 (ck , ck_n , cke , cs_n , ras_n , cas_n , we_n , dm_rdqs , ba , addr , dq , dqs , dqs_n , rdqs_n , odt );
|
||||
`ifdef x4
|
||||
initial if (DEBUG) $display("%m: Component Width = x4");
|
||||
ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[0]);
|
||||
ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[0]);
|
||||
ddr2 U3R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[0]);
|
||||
ddr2 U4R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[0]);
|
||||
ddr2 U6R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[0]);
|
||||
ddr2 U7R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[0]);
|
||||
ddr2 U8R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[0]);
|
||||
ddr2 U9R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[0]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[0]);
|
||||
`endif
|
||||
ddr2 U18R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[0]);
|
||||
ddr2 U17R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[0]);
|
||||
ddr2 U16R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[0]);
|
||||
ddr2 U15R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[0]);
|
||||
ddr2 U13R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[0]);
|
||||
ddr2 U12R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[0]);
|
||||
ddr2 U11R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[0]);
|
||||
ddr2 U10R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[0]);
|
||||
`ifdef ECC
|
||||
ddr2 U14R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[0]);
|
||||
`endif
|
||||
`ifdef DUAL_RANK
|
||||
ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[1]);
|
||||
ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[1]);
|
||||
ddr2 U3R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[1]);
|
||||
ddr2 U4R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[1]);
|
||||
ddr2 U6R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[1]);
|
||||
ddr2 U7R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[1]);
|
||||
ddr2 U8R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[1]);
|
||||
ddr2 U9R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[1]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[1]);
|
||||
`endif
|
||||
ddr2 U18R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[1]);
|
||||
ddr2 U17R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[1]);
|
||||
ddr2 U16R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[1]);
|
||||
ddr2 U15R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[1]);
|
||||
ddr2 U13R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[1]);
|
||||
ddr2 U12R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[1]);
|
||||
ddr2 U11R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[1]);
|
||||
ddr2 U10R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[1]);
|
||||
`ifdef ECC
|
||||
ddr2 U14R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[1]);
|
||||
`endif
|
||||
`endif
|
||||
`ifdef QUAD_RANK
|
||||
ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[2]);
|
||||
ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[2]);
|
||||
ddr2 U3R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[2]);
|
||||
ddr2 U4R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[2]);
|
||||
ddr2 U6R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[2]);
|
||||
ddr2 U7R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[2]);
|
||||
ddr2 U8R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[2]);
|
||||
ddr2 U9R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[2]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[2]);
|
||||
`endif
|
||||
ddr2 U18R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[2]);
|
||||
ddr2 U17R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[2]);
|
||||
ddr2 U16R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[2]);
|
||||
ddr2 U15R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[2]);
|
||||
ddr2 U13R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[2]);
|
||||
ddr2 U12R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[2]);
|
||||
ddr2 U11R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[2]);
|
||||
ddr2 U10R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[2]);
|
||||
`ifdef ECC
|
||||
ddr2 U14R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[2]);
|
||||
`endif
|
||||
ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[3]);
|
||||
ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[3]);
|
||||
ddr2 U3R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[3]);
|
||||
ddr2 U4R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[3]);
|
||||
ddr2 U6R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[3]);
|
||||
ddr2 U7R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[3]);
|
||||
ddr2 U8R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[3]);
|
||||
ddr2 U9R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[3]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[3]);
|
||||
`endif
|
||||
ddr2 U18R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[3]);
|
||||
ddr2 U17R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[3]);
|
||||
ddr2 U16R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[3]);
|
||||
ddr2 U15R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[3]);
|
||||
ddr2 U13R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[3]);
|
||||
ddr2 U12R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[3]);
|
||||
ddr2 U11R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[3]);
|
||||
ddr2 U10R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[3]);
|
||||
`ifdef ECC
|
||||
ddr2 U14R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], cb [ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[3]);
|
||||
`endif
|
||||
`endif
|
||||
`else `ifdef x8
|
||||
initial if (DEBUG) $display("%m: Component Width = x8");
|
||||
ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[0]);
|
||||
ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[0]);
|
||||
ddr2 U3R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[0]);
|
||||
ddr2 U4R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[0]);
|
||||
ddr2 U6R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[0]);
|
||||
ddr2 U7R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[0]);
|
||||
ddr2 U8R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[0]);
|
||||
ddr2 U9R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[0]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], cb [ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[0]);
|
||||
`endif
|
||||
`ifdef DUAL_RANK
|
||||
ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[1]);
|
||||
ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[1]);
|
||||
ddr2 U3R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[1]);
|
||||
ddr2 U4R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[1]);
|
||||
ddr2 U6R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[1]);
|
||||
ddr2 U7R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[1]);
|
||||
ddr2 U8R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[1]);
|
||||
ddr2 U9R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[1]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], cb [ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[1]);
|
||||
`endif
|
||||
`endif
|
||||
`ifdef QUAD_RANK
|
||||
ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[2]);
|
||||
ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[2]);
|
||||
ddr2 U3R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[2]);
|
||||
ddr2 U4R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[2]);
|
||||
ddr2 U6R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[2]);
|
||||
ddr2 U7R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[2]);
|
||||
ddr2 U8R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[2]);
|
||||
ddr2 U9R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[2]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], cb [ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[2]);
|
||||
`endif
|
||||
ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[3]);
|
||||
ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[3]);
|
||||
ddr2 U3R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[3]);
|
||||
ddr2 U4R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[3]);
|
||||
ddr2 U6R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[3]);
|
||||
ddr2 U7R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[3]);
|
||||
ddr2 U8R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[3]);
|
||||
ddr2 U9R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[3]);
|
||||
`ifdef ECC
|
||||
ddr2 U5R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], cb [ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[3]);
|
||||
`endif
|
||||
`endif
|
||||
`else `ifdef x16
|
||||
initial if (DEBUG) $display("%m: Component Width = x16");
|
||||
ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[0]);
|
||||
ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[0]);
|
||||
ddr2 U4R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[0]);
|
||||
ddr2 U5R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[0]);
|
||||
`ifdef ECC
|
||||
ddr2 U3R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[0]);
|
||||
`endif
|
||||
`ifdef DUAL_RANK
|
||||
ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[1]);
|
||||
ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[1]);
|
||||
ddr2 U4R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[1]);
|
||||
ddr2 U5R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[1]);
|
||||
`ifdef ECC
|
||||
ddr2 U3R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[1]);
|
||||
`endif
|
||||
`endif
|
||||
`ifdef QUAD_RANK
|
||||
ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[2]);
|
||||
ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[2]);
|
||||
ddr2 U4R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[2]);
|
||||
ddr2 U5R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[2]);
|
||||
`ifdef ECC
|
||||
ddr2 U3R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[2]);
|
||||
`endif
|
||||
ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[3]);
|
||||
ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[3]);
|
||||
ddr2 U4R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[3]);
|
||||
ddr2 U5R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[3]);
|
||||
`ifdef ECC
|
||||
ddr2 U3R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[3]);
|
||||
`endif
|
||||
`endif
|
||||
`endif `endif `endif
|
||||
|
||||
endmodule
|
||||
383
sim/verilog/micron_2048Mb_ddr2/ddr2_parameters.vh
Normal file
383
sim/verilog/micron_2048Mb_ddr2/ddr2_parameters.vh
Normal file
@@ -0,0 +1,383 @@
|
||||
/****************************************************************************************
|
||||
*
|
||||
* Disclaimer This software code and all associated documentation, comments or other
|
||||
* of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
* limitation of liability for consequential or incidental damages, the
|
||||
* above limitation may not apply to you.
|
||||
*
|
||||
* Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
*
|
||||
****************************************************************************************/
|
||||
|
||||
// Parameters current with 2Gb datasheet rev B
|
||||
|
||||
// Timing parameters based on Speed Grade
|
||||
|
||||
// SYMBOL UNITS DESCRIPTION
|
||||
// ------ ----- -----------
|
||||
`ifdef sg187E
|
||||
parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 90; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 75; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 132; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 157; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 175; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 188; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 250; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 425; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 250; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 350; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 0; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 75; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 175; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 125; // tIS ps Input Setup Time
|
||||
parameter TIH = 200; // tIH ps Input Hold Time
|
||||
parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 13125; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 13125; // tRP ps Precharge command period
|
||||
parameter TRPA = 15000; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 10; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 3; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 3; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 4; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 11; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 13125; // CL ps Minimum CAS Latency
|
||||
`else `ifdef sg25E
|
||||
parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 100; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 300; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 400; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 175; // tIS ps Input Setup Time
|
||||
parameter TIH = 250; // tIH ps Input Hold Time
|
||||
parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 12500; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 12500; // tRP ps Precharge command period
|
||||
parameter TRPA = 15000; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 12500; // CL ps Minimum CAS Latency
|
||||
`else `ifdef sg25
|
||||
parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 100; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 300; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 400; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 175; // tIS ps Input Setup Time
|
||||
parameter TIH = 250; // tIH ps Input Hold Time
|
||||
parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 15000; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 15000; // tRP ps Precharge command period
|
||||
parameter TRPA = 17500; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 15000; // CL ps Minimum CAS Latency
|
||||
`else `ifdef sg3E
|
||||
parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 125; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 340; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 450; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 200; // tIS ps Input Setup Time
|
||||
parameter TIH = 275; // tIH ps Input Hold Time
|
||||
parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 12000; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 12000; // tRP ps Precharge command period
|
||||
parameter TRPA = 15000; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 12000; // CL ps Minimum CAS Latency
|
||||
`else `ifdef sg3
|
||||
parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 125; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 340; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 450; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 200; // tIS ps Input Setup Time
|
||||
parameter TIH = 275; // tIH ps Input Hold Time
|
||||
parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 15000; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 15000; // tRP ps Precharge command period
|
||||
parameter TRPA = 18000; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 15000; // CL ps Minimum CAS Latency
|
||||
`else `ifdef sg37E
|
||||
parameter TCK_MIN = 3750; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 125; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 400; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 500; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 225; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 450; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 300; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 250; // tIS ps Input Setup Time
|
||||
parameter TIH = 375; // tIH ps Input Hold Time
|
||||
parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 15000; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 7500; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 15000; // tRP ps Precharge command period
|
||||
parameter TRPA = 18750; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 15000; // CL ps Minimum CAS Latency
|
||||
`else `define sg5E
|
||||
parameter TCK_MIN = 5000; // tCK ps Minimum Clock Cycle Time
|
||||
parameter TJIT_PER = 125; // tJIT(per) ps Period JItter
|
||||
parameter TJIT_DUTY = 150; // tJIT(duty) ps Half Period Jitter
|
||||
parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter
|
||||
parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle)
|
||||
parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle)
|
||||
parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle)
|
||||
parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle)
|
||||
parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle)
|
||||
parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle)
|
||||
parameter TQHS = 450; // tQHS ps Data hold skew factor
|
||||
parameter TAC = 600; // tAC ps DQ output access time from CK/CK#
|
||||
parameter TDS = 150; // tDS ps DQ and DM input setup time relative to DQS
|
||||
parameter TDH = 275; // tDH ps DQ and DM input hold time relative to DQS
|
||||
parameter TDQSCK = 500; // tDQSCK ps DQS output access time from CK/CK#
|
||||
parameter TDQSQ = 350; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||
parameter TIS = 350; // tIS ps Input Setup Time
|
||||
parameter TIH = 475; // tIH ps Input Hold Time
|
||||
parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time
|
||||
parameter TRCD = 15000; // tRCD ps Active to Read/Write command time
|
||||
parameter TWTR = 10000; // tWTR ps Write to Read command delay
|
||||
parameter TRP = 15000; // tRP ps Precharge command period
|
||||
parameter TRPA = 20000; // tRPA ps Precharge All period
|
||||
parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command
|
||||
parameter TXARD = 2; // tXARD tCK Exit active power down to a read command
|
||||
parameter TXP = 2; // tXP tCK Exit power down to a non-read command
|
||||
parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency
|
||||
parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency
|
||||
parameter CL_TIME = 15000; // CL ps Minimum CAS Latency
|
||||
`endif `endif `endif `endif `endif `endif
|
||||
|
||||
`ifdef x16
|
||||
`ifdef sg187E
|
||||
parameter TFAW = 45000; // tFAW ps Four Bank Activate window
|
||||
`else `ifdef sg25E
|
||||
parameter TFAW = 45000; // tFAW ps Four Bank Activate window
|
||||
`else `ifdef sg25
|
||||
parameter TFAW = 45000; // tFAW ps Four Bank Activate window
|
||||
`else // sg3E, sg3, sg37E, sg5E
|
||||
parameter TFAW = 50000; // tFAW ps Four Bank Activate window
|
||||
`endif `endif `endif
|
||||
`else // x4, x8
|
||||
`ifdef sg187E
|
||||
parameter TFAW = 35000; // tFAW ps Four Bank Activate window
|
||||
`else `ifdef sg25E
|
||||
parameter TFAW = 35000; // tFAW ps Four Bank Activate window
|
||||
`else `ifdef sg25
|
||||
parameter TFAW = 35000; // tFAW ps Four Bank Activate window
|
||||
`else // sg3E, sg3, sg37E, sg5E
|
||||
parameter TFAW = 37500; // tFAW ps Four Bank Activate window
|
||||
`endif `endif `endif
|
||||
`endif
|
||||
|
||||
// Timing Parameters
|
||||
|
||||
// Mode Register
|
||||
parameter AL_MIN = 0; // AL tCK Minimum Additive Latency
|
||||
parameter AL_MAX = 6; // AL tCK Maximum Additive Latency
|
||||
parameter CL_MIN = 3; // CL tCK Minimum CAS Latency
|
||||
parameter CL_MAX = 7; // CL tCK Maximum CAS Latency
|
||||
parameter WR_MIN = 2; // WR tCK Minimum Write Recovery
|
||||
parameter WR_MAX = 8; // WR tCK Maximum Write Recovery
|
||||
parameter BL_MIN = 4; // BL tCK Minimum Burst Length
|
||||
parameter BL_MAX = 8; // BL tCK Minimum Burst Length
|
||||
// Clock
|
||||
parameter TCK_MAX = 8000; // tCK ps Maximum Clock Cycle Time
|
||||
parameter TCH_MIN = 0.48; // tCH tCK Minimum Clock High-Level Pulse Width
|
||||
parameter TCH_MAX = 0.52; // tCH tCK Maximum Clock High-Level Pulse Width
|
||||
parameter TCL_MIN = 0.48; // tCL tCK Minimum Clock Low-Level Pulse Width
|
||||
parameter TCL_MAX = 0.52; // tCL tCK Maximum Clock Low-Level Pulse Width
|
||||
// Data
|
||||
parameter TLZ = TAC; // tLZ ps Data-out low-impedance window from CK/CK#
|
||||
parameter THZ = TAC; // tHZ ps Data-out high impedance window from CK/CK#
|
||||
parameter TDIPW = 0.35; // tDIPW tCK DQ and DM input Pulse Width
|
||||
// Data Strobe
|
||||
parameter TDQSH = 0.35; // tDQSH tCK DQS input High Pulse Width
|
||||
parameter TDQSL = 0.35; // tDQSL tCK DQS input Low Pulse Width
|
||||
parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time)
|
||||
parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time)
|
||||
parameter TWPRE = 0.35; // tWPRE tCK DQS Write Preamble
|
||||
parameter TWPST = 0.40; // tWPST tCK DQS Write Postamble
|
||||
parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition
|
||||
// Command and Address
|
||||
parameter TIPW = 0.6; // tIPW tCK Control and Address input Pulse Width
|
||||
parameter TCCD = 2; // tCCD tCK Cas to Cas command delay
|
||||
parameter TRAS_MIN = 40000; // tRAS ps Minimum Active to Precharge command time
|
||||
parameter TRAS_MAX =70000000; // tRAS ps Maximum Active to Precharge command time
|
||||
parameter TRTP = 7500; // tRTP ps Read to Precharge command delay
|
||||
parameter TWR = 15000; // tWR ps Write recovery time
|
||||
parameter TMRD = 2; // tMRD tCK Load Mode Register command cycle time
|
||||
parameter TDLLK = 200; // tDLLK tCK DLL locking time
|
||||
// Refresh
|
||||
parameter TRFC_MIN = 197500; // tRFC ps Refresh to Refresh Command interval minimum value
|
||||
parameter TRFC_MAX =70000000; // tRFC ps Refresh to Refresh Command Interval maximum value
|
||||
// Self Refresh
|
||||
parameter TXSNR = TRFC_MIN + 10000; // tXSNR ps Exit self refesh to a non-read command
|
||||
parameter TXSRD = 200; // tXSRD tCK Exit self refresh to a read command
|
||||
parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit.
|
||||
// ODT
|
||||
parameter TAOND = 2; // tAOND tCK ODT turn-on delay
|
||||
parameter TAOFD = 2.5; // tAOFD tCK ODT turn-off delay
|
||||
parameter TAONPD = 2000; // tAONPD ps ODT turn-on (precharge power-down mode)
|
||||
parameter TAOFPD = 2000; // tAOFPD ps ODT turn-off (precharge power-down mode)
|
||||
parameter TMOD = 12000; // tMOD ps ODT enable in EMR to ODT pin transition
|
||||
// Power Down
|
||||
parameter TCKE = 3; // tCKE tCK CKE minimum high or low pulse width
|
||||
|
||||
// Size Parameters based on Part Width
|
||||
|
||||
`ifdef x4
|
||||
parameter ADDR_BITS = 15; // Address Bits
|
||||
parameter ROW_BITS = 15; // Number of Address bits
|
||||
parameter COL_BITS = 11; // Number of Column bits
|
||||
parameter DM_BITS = 1; // Number of Data Mask bits
|
||||
parameter DQ_BITS = 4; // Number of Data bits
|
||||
parameter DQS_BITS = 1; // Number of Dqs bits
|
||||
parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time
|
||||
`else `ifdef x8
|
||||
parameter ADDR_BITS = 15; // Address Bits
|
||||
parameter ROW_BITS = 15; // Number of Address bits
|
||||
parameter COL_BITS = 10; // Number of Column bits
|
||||
parameter DM_BITS = 1; // Number of Data Mask bits
|
||||
parameter DQ_BITS = 8; // Number of Data bits
|
||||
parameter DQS_BITS = 1; // Number of Dqs bits
|
||||
parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time
|
||||
`else `define x16
|
||||
parameter ADDR_BITS = 14; // Address Bits
|
||||
parameter ROW_BITS = 14; // Number of Address bits
|
||||
parameter COL_BITS = 10; // Number of Column bits
|
||||
parameter DM_BITS = 2; // Number of Data Mask bits
|
||||
parameter DQ_BITS = 16; // Number of Data bits
|
||||
parameter DQS_BITS = 2; // Number of Dqs bits
|
||||
parameter TRRD = 10000; // tRRD Active bank a to Active bank b command time
|
||||
`endif `endif
|
||||
|
||||
`ifdef QUAD_RANK
|
||||
`define DUAL_RANK // also define DUAL_RANK
|
||||
parameter CS_BITS = 4; // Number of Chip Select Bits
|
||||
parameter RANKS = 4; // Number of Chip Select Bits
|
||||
`else `ifdef DUAL_RANK
|
||||
parameter CS_BITS = 2; // Number of Chip Select Bits
|
||||
parameter RANKS = 2; // Number of Chip Select Bits
|
||||
`else
|
||||
parameter CS_BITS = 2; // Number of Chip Select Bits
|
||||
parameter RANKS = 1; // Number of Chip Select Bits
|
||||
`endif `endif
|
||||
|
||||
// Size Parameters
|
||||
parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits
|
||||
parameter MEM_BITS = 10; // Number of write data bursts can be stored in memory. The default is 2^10=1024.
|
||||
parameter AP = 10; // the address bit that controls auto-precharge and precharge-all
|
||||
parameter BL_BITS = 3; // the number of bits required to count to MAX_BL
|
||||
parameter BO_BITS = 2; // the number of Burst Order Bits
|
||||
|
||||
// Simulation parameters
|
||||
parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors
|
||||
parameter DEBUG = 1; // Turn on Debug messages
|
||||
parameter BUS_DELAY = 0; // delay in nanoseconds
|
||||
parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads
|
||||
parameter RANDOM_SEED = 711689044; //seed value for random generator.
|
||||
|
||||
parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe
|
||||
parameter RDQSEN_PST = 1; // DQS driving time after last read strobe
|
||||
parameter RDQS_PRE = 2; // DQS low time prior to first read strobe
|
||||
parameter RDQS_PST = 1; // DQS low time after last valid read strobe
|
||||
parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data
|
||||
parameter RDQEN_PST = 0; // DQ/DM driving time after last read data
|
||||
parameter WDQS_PRE = 1; // DQS half clock periods prior to first write strobe
|
||||
parameter WDQS_PST = 1; // DQS half clock periods after last valid write strobe
|
||||
190
sim/verilog/micron_2048Mb_ddr2/readme.txt
Normal file
190
sim/verilog/micron_2048Mb_ddr2/readme.txt
Normal file
@@ -0,0 +1,190 @@
|
||||
Disclaimer of Warranty:
|
||||
-----------------------
|
||||
This software code and all associated documentation, comments or other
|
||||
information (collectively "Software") is provided "AS IS" without
|
||||
warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
limitation of liability for consequential or incidental damages, the
|
||||
above limitation may not apply to you.
|
||||
|
||||
Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
|
||||
Getting Started:
|
||||
----------------
|
||||
Unzip the included files to a folder.
|
||||
Compile ddr2.v, ddr2_mcp.v, and tb.v using a verilog simulator.
|
||||
Simulate the top level test bench tb.
|
||||
Or, if you are using the ModelSim simulator, type "do tb.do" at the prompt.
|
||||
|
||||
File Descriptions:
|
||||
------------------
|
||||
ddr2.v -ddr2 model
|
||||
ddr2_mcp.v -structural wrapper for ddr2 - multi-chip package model
|
||||
ddr2_module.v -structural wrapper for ddr2 - module model
|
||||
ddr2_parameters.vh -file that contains all parameters used by the model
|
||||
readme.txt -this file
|
||||
tb.v -ddr2 model test bench
|
||||
subtest.vh -example test included by the test bench.
|
||||
tb.do -compiles and runs the ddr2 model and test bench
|
||||
|
||||
Defining the Speed Grade:
|
||||
-------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
multiple speed grades supported by the ddr2 model. Allowable speed
|
||||
grades are listed in the ddr2_parameters.vh file and begin with the
|
||||
letters "sg". The speed grade is used to select a set of timing
|
||||
parameters for the ddr2 model. The following are examples of defining
|
||||
the speed grade.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+sg5 ddr2.v
|
||||
NC-Verilog ncverilog +define+sg5 ddr2.v
|
||||
VCS vcs +define+sg5 ddr2.v
|
||||
|
||||
Defining the Organization:
|
||||
--------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
multiple organizations supported by the ddr2 model. Valid
|
||||
organizations include "x4", "x8", and x16, and are listed in the
|
||||
ddr2_parameters.vh file. The organization is used to select the amount
|
||||
of memory and the port sizes of the ddr2 model. The following are
|
||||
examples of defining the organization.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+x8 ddr2.v
|
||||
NC-Verilog ncverilog +define+x8 ddr2.v
|
||||
VCS vcs +define+x8 ddr2.v
|
||||
|
||||
All combinations of speed grade and organization are considered valid
|
||||
by the ddr2 model even though a Micron part may not exist for every
|
||||
combination.
|
||||
|
||||
Allocating Memory:
|
||||
------------------
|
||||
An associative array has been implemented to reduce the amount of
|
||||
static memory allocated by the ddr2 model. Each entry in the
|
||||
associative array is a burst length of eight in size. The number of
|
||||
entries in the associative array is controlled by the MEM_BITS
|
||||
parameter, and is equal to 2^MEM_BITS. For example, if the MEM_BITS
|
||||
parameter is equal to 10, the associative array will be large enough
|
||||
to store 1024 writes of burst length 8 to unique addresses. The
|
||||
following are examples of setting the MEM_BITS parameter to 8.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vsim -GMEM_BITS=8 ddr2
|
||||
NC-Verilog ncverilog +defparam+ddr2.MEM_BITS=8 ddr2.v
|
||||
VCS vcs -pvalue+MEM_BITS=8 ddr2.v
|
||||
|
||||
It is possible to allocate memory for every address supported by the
|
||||
ddr2 model by using the verilog compiler directive "`define MAX_MEM".
|
||||
This procedure will improve simulation performance at the expense of
|
||||
system memory. The following are examples of allocating memory for
|
||||
every address.
|
||||
|
||||
Simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+MAX_MEM ddr2.v
|
||||
NC-Verilog ncverilog +define+MAX_MEM ddr2.v
|
||||
VCS vcs +define+MAX_MEM ddr2.v
|
||||
|
||||
|
||||
**********************************************************************
|
||||
The following information is provided to assist the modeling engineer
|
||||
in creating multi-chip package (mcp) models. ddr2_mcp.v is a
|
||||
structural wrapper that instantiates ddr2 models. This wrapper can be
|
||||
used to create single, dual, or quad rank mcp models. From the
|
||||
perspective of the model, the only item that needs to be defined is the
|
||||
number of ranks.
|
||||
**********************************************************************
|
||||
|
||||
Defining the Number of Ranks in a multi-chip package:
|
||||
----------------------------------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
single, dual, and quad rank mcp configurations. The default is single
|
||||
rank if nothing is defined. Dual rank configuration can be selected by
|
||||
defining "DUAL_RANK" when the ddr2_mcp is compiled. Quad rank
|
||||
configuration can be selected by defining "QUAD_RANK" when the ddr2_mcp
|
||||
is compiled. The following are examples of defining a dual rank mcp
|
||||
configuration.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+DUAL_RANK ddr2.v ddr2_mcp.v
|
||||
NC-Verilog ncverilog +define+DUAL_RANK ddr2.v ddr2_mcp.v
|
||||
VCS vcs +define+DUAL_RANK ddr2.v ddr2_mcp.v
|
||||
|
||||
|
||||
**********************************************************************
|
||||
The following information is provided to assist the modeling engineer
|
||||
in creating DIMM models. ddr2_module.v is a structural wrapper that
|
||||
instantiates ddr2 models. This wrapper can be used to create UDIMM,
|
||||
RDIMM or SODIMM models. Other form factors are not supported
|
||||
(MiniDIMM, VLP DIMM, etc.). From the perspective of the model, the
|
||||
items that need to be defined are the number of ranks, the module
|
||||
type, and the presence of ECC. All combinations of ranks, module
|
||||
type, and ECC are considered valid by the ddr2_module model even
|
||||
though a Micron part may not exist for every combination.
|
||||
**********************************************************************
|
||||
|
||||
Defining the Number of Ranks on a module:
|
||||
----------------------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
single, dual, and quad rank module configurations. The default is single
|
||||
rank if nothing is defined. Dual rank configuration can be selected by
|
||||
defining "DUAL_RANK" when the ddr2_module is compiled. Quad rank
|
||||
configuration can be selected by defining "QUAD_RANK" when the ddr2_module
|
||||
is compiled. The following are examples of defining a dual rank module
|
||||
configuration.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+DUAL_RANK ddr2.v ddr2_module.v
|
||||
NC-Verilog ncverilog +define+DUAL_RANK ddr2.v ddr2_module.v
|
||||
VCS vcs +define+DUAL_RANK ddr2.v ddr2_module.v
|
||||
|
||||
Defining the Module Type:
|
||||
-----------------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
UDIMM, RDIMM, and SODIMM module configurations. The default is
|
||||
unregistered (UDIMM) if nothing is defined. SODIMM configuration can be
|
||||
selected by defining "SODIMM" when the ddr2_module is compiled. Registered
|
||||
configuration can be selected by defining "RDIMM" when the ddr2_module is
|
||||
compiled. The following are examples of defining a registered module
|
||||
configuration.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+RDIMM ddr2.v ddr2_module.v
|
||||
NC-Verilog ncverilog +define+RDIMM ddr2.v ddr2_module.v
|
||||
VCS vcs +define+RDIMM ddr2.v ddr2_module.v
|
||||
|
||||
Defining the ECC for a module:
|
||||
-----------------------------
|
||||
The verilog compiler directive "`define" may be used to choose between
|
||||
ECC and nonECC module configurations. The default is nonECC if nothing
|
||||
is defined. ECC configuration can be selected by defining "ECC" when
|
||||
the ddr2_module is compiled. The following are examples of defining an
|
||||
ECC module configuration.
|
||||
|
||||
simulator command line
|
||||
--------- ------------
|
||||
ModelSim vlog +define+ECC ddr2.v ddr2_module.v
|
||||
NC-Verilog ncverilog +define+ECC ddr2.v ddr2_module.v
|
||||
VCS vcs +define+ECC ddr2.v ddr2_module.v
|
||||
225
sim/verilog/micron_2048Mb_ddr2/subtest.vh
Normal file
225
sim/verilog/micron_2048Mb_ddr2/subtest.vh
Normal file
@@ -0,0 +1,225 @@
|
||||
/****************************************************************************************
|
||||
*
|
||||
* File Name: subtest.vh
|
||||
*
|
||||
* Description: Micron SDRAM DDR2 (Double Data Rate 2)
|
||||
* This file is included by tb.v
|
||||
*
|
||||
* Disclaimer This software code and all associated documentation, comments or other
|
||||
* of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
* limitation of liability for consequential or incidental damages, the
|
||||
* above limitation may not apply to you.
|
||||
*
|
||||
* Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
*
|
||||
****************************************************************************************/
|
||||
|
||||
initial begin : test
|
||||
cke <= 1'b0;
|
||||
cs_n <= 1'b1;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b1;
|
||||
ba <= {BA_BITS{1'bz}};
|
||||
a <= {ADDR_BITS{1'bz}};
|
||||
odt <= 1'b0;
|
||||
dq_en <= 1'b0;
|
||||
dqs_en <= 1'b0;
|
||||
|
||||
cke <= 1'b1;
|
||||
|
||||
// POWERUP SECTION
|
||||
power_up;
|
||||
|
||||
// INITIALIZE SECTION
|
||||
precharge (0, 1); // Precharge all banks
|
||||
nop (trp);
|
||||
|
||||
load_mode (2, 0); // Extended Mode Register (2)
|
||||
nop (tmrd-1);
|
||||
|
||||
load_mode (3, 0); // Extended Mode Register (3)
|
||||
nop (tmrd-1);
|
||||
|
||||
load_mode (1, 13'b0_0_0_000_0_000_1_0_0); // Extended Mode Register with DLL Enable
|
||||
nop (tmrd-1);
|
||||
|
||||
load_mode (0, 13'b0_000_1_0_000_0_011 | (twr-1)<<9 | taa<<4); // Mode Register without DLL Reset (bl=8)
|
||||
nop (tmrd-1);
|
||||
|
||||
precharge (0, 1); // Precharge all banks
|
||||
nop (trp);
|
||||
|
||||
refresh;
|
||||
nop (trfc-1);
|
||||
|
||||
refresh;
|
||||
nop (trfc-1);
|
||||
|
||||
load_mode (0, 13'b0_000_0_0_000_0_011 | (twr-1)<<9 | taa<<4); // Mode Register without DLL Reset (bl=8)
|
||||
nop (tmrd-1);
|
||||
|
||||
load_mode (1, 13'b0_0_0_111_0_000_1_0_0); // Extended Mode Register with OCD Default
|
||||
nop (tmrd-1);
|
||||
|
||||
load_mode (1, 13'b0_0_0_000_0_000_1_0_0); // Extended Mode Register with OCD Exit
|
||||
nop (tmrd-1);
|
||||
|
||||
// DLL RESET ENABLE - you will need 200 TCK before any read command.
|
||||
nop (200);
|
||||
|
||||
// WRITE SECTION
|
||||
activate (0, 0); // Activate Bank 0, Row 0
|
||||
nop (trcd-1);
|
||||
write (0, 4, 0, 0, 'h3210); // Write Bank 0, Col 0
|
||||
nop (tccd-1);
|
||||
write (0, 0, 1, 0, 'h0123); // Write Bank 0, Col 0
|
||||
|
||||
activate (1, 0); // Activate Bank 1, Row 0
|
||||
nop (trcd-1);
|
||||
write (1, 0, 1, 0, 'h4567); // Write Bank 1, Col 0
|
||||
|
||||
activate (2, 0); // Activate Bank 2, Row 0
|
||||
nop (trcd-1);
|
||||
write (2, 0, 1, 0, 'h89AB); // Write Bank 2, Col 0
|
||||
|
||||
activate (3, 0); // Activate Bank 3, Row 0
|
||||
nop (trcd-1);
|
||||
write (3, 0, 1, 0, 'hCDEF); // Write Bank 3, Col 0
|
||||
|
||||
nop (cl - 1 + bl/2 + twtr-1);
|
||||
|
||||
nop (tras);
|
||||
|
||||
// READ SECTION
|
||||
activate (0, 0); // Activate Bank 0, Row 0
|
||||
nop (trrd-1);
|
||||
activate (1, 0); // Activate Bank 1, Row 0
|
||||
nop (trrd-1);
|
||||
activate (2, 0); // Activate Bank 2, Row 0
|
||||
nop (trrd-1);
|
||||
activate (3, 0); // Activate Bank 3, Row 0
|
||||
read (0, 0, 1); // Read Bank 0, Col 0
|
||||
nop (bl/2);
|
||||
read (1, 1, 1); // Read Bank 1, Col 1
|
||||
nop (bl/2);
|
||||
read (2, 2, 1); // Read Bank 2, Col 2
|
||||
nop (bl/2);
|
||||
read (3, 3, 1); // Read Bank 3, Col 3
|
||||
nop (rl + bl/2);
|
||||
|
||||
activate (0, 0); // Activate Bank 0, Row 0
|
||||
nop (trrd-1);
|
||||
activate (1, 0); // Activate Bank 1, Row 0
|
||||
nop (trcd-1);
|
||||
$display ("%m at time %t: Figure 22: Consecutive READ Bursts", $time);
|
||||
read (0, 0, 0); // Read Bank 0, Col 0
|
||||
nop (bl/2-1);
|
||||
read (0, 4, 0); // Read Bank 0, Col 4
|
||||
nop (rl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 23: Nonconsecutive READ Bursts", $time);
|
||||
read (0, 0, 0); // Read Bank 0, Col 0
|
||||
nop (bl/2);
|
||||
read (0, 4, 0); // Read Bank 0, Col 4
|
||||
nop (rl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 24: READ Interrupted by READ", $time);
|
||||
read (0, 0, 0); // Read Bank 0, Col 0
|
||||
nop (tccd-1);
|
||||
read (1, 0, 0); // Read Bank 0, Col 0
|
||||
nop (rl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 25 & 26: READ to PRECHARGE", $time);
|
||||
read (0, 0, 0); // Read Bank 0, Col 0
|
||||
nop (al + bl/2 + trtp - 2);
|
||||
precharge (0, 0); // Precharge Bank 0
|
||||
nop (trp-1);
|
||||
|
||||
activate (0, 0); // Activate Bank 0, Row 0
|
||||
nop (trcd-1);
|
||||
$display ("%m at time %t: Figure 27: READ to WRITE", $time);
|
||||
read (0, 0, 0); // Read Bank 0, Col 0
|
||||
nop (rl + bl/2 - wl);
|
||||
write (0, 0, 1, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2 + twr + trp-1);
|
||||
|
||||
activate (0, 0); // Activate Bank 0, Row 0
|
||||
nop (trcd-1);
|
||||
$display ("%m at time %t: Figure 36: Nonconsecutive WRITE to WRITE", $time);
|
||||
write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (bl/2);
|
||||
write (0, 4, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 37: Random WRITE Cycles", $time);
|
||||
write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (bl/2-1);
|
||||
write (0, 4, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 37: Figure 38: WRITE Interrupted by WRITE", $time);
|
||||
write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (tccd-1);
|
||||
write (1, 4, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 39: WRITE to READ", $time);
|
||||
write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2 + twtr-1);
|
||||
read_verify (0, 0, 0, 0, 'h0123); // Read Bank 0, Col 0
|
||||
nop (rl + bl/2);
|
||||
|
||||
$display ("%m at time %t: Figure 40: WRITE to PRECHARGE", $time);
|
||||
write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0
|
||||
nop (wl + bl/2 + twr-1);
|
||||
precharge (0, 1); // Precharge all banks
|
||||
nop (trp-1);
|
||||
|
||||
// odt Section
|
||||
$display ("%m at time %t: Figure 60: odt Timing for Active or Fast-Exit Power-Down Mode", $time);
|
||||
odt = 1'b1;
|
||||
nop (1);
|
||||
odt = 1'b0;
|
||||
nop (tanpd);
|
||||
|
||||
$display ("%m at time %t: Figure 61: odt timing for Slow-Exit or Precharge Power-Down Modes", $time);
|
||||
cke = 1'b0;
|
||||
@(negedge ck);
|
||||
odt = 1'b1;
|
||||
@(negedge ck);
|
||||
odt = 1'b0;
|
||||
repeat(tanpd)@(negedge ck);
|
||||
nop (taxpd);
|
||||
|
||||
$display ("%m at time %t: Figure 62 & 63: odt Transition Timings when Entering Power-Down Mode", $time);
|
||||
odt = 1'b1;
|
||||
nop (tanpd);
|
||||
power_down (tcke);
|
||||
|
||||
// Self Refresh Section
|
||||
nop (taxpd);
|
||||
odt = 1'b0;
|
||||
nop (3); // taofd
|
||||
self_refresh (tcke);
|
||||
nop (tdllk);
|
||||
nop (tcke);
|
||||
|
||||
test_done;
|
||||
end
|
||||
31
sim/verilog/micron_2048Mb_ddr2/tb.do
Normal file
31
sim/verilog/micron_2048Mb_ddr2/tb.do
Normal file
@@ -0,0 +1,31 @@
|
||||
#########################################################################################
|
||||
#
|
||||
# Disclaimer This software code and all associated documentation, comments or other
|
||||
# of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
# warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
# DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
# TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
# WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
# OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
# FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
# THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
# ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
# OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
# ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
# WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
# OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
# THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
# DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
# limitation of liability for consequential or incidental damages, the
|
||||
# above limitation may not apply to you.
|
||||
#
|
||||
# Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
#
|
||||
#########################################################################################
|
||||
|
||||
vlog -novopt ddr2.v tb.v
|
||||
vsim -novopt tb
|
||||
add wave -p sdramddr2/*
|
||||
run -all
|
||||
468
sim/verilog/micron_2048Mb_ddr2/tb.v
Normal file
468
sim/verilog/micron_2048Mb_ddr2/tb.v
Normal file
@@ -0,0 +1,468 @@
|
||||
/****************************************************************************************
|
||||
*
|
||||
* File Name: tb.v
|
||||
*
|
||||
* Dependencies: ddr2.v, ddr2_parameters.vh
|
||||
*
|
||||
* Description: Micron SDRAM DDR2 (Double Data Rate 2) test bench
|
||||
*
|
||||
* Note: -Set simulator resolution to "ps" accuracy
|
||||
* -Set Debug = 0 to disable $display messages
|
||||
*
|
||||
* Disclaimer This software code and all associated documentation, comments or other
|
||||
* of Warranty: information (collectively "Software") is provided "AS IS" without
|
||||
* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
|
||||
* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
|
||||
* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
|
||||
* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
|
||||
* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
|
||||
* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
|
||||
* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
|
||||
* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
|
||||
* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
|
||||
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
|
||||
* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
|
||||
* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGES. Because some jurisdictions prohibit the exclusion or
|
||||
* limitation of liability for consequential or incidental damages, the
|
||||
* above limitation may not apply to you.
|
||||
*
|
||||
* Copyright 2003 Micron Technology, Inc. All rights reserved.
|
||||
*
|
||||
****************************************************************************************/
|
||||
|
||||
// DO NOT CHANGE THE TIMESCALE
|
||||
|
||||
`timescale 1ps / 1ps
|
||||
|
||||
module tb;
|
||||
|
||||
`include "ddr2_parameters.vh"
|
||||
|
||||
// ports
|
||||
reg ck;
|
||||
wire ck_n = ~ck;
|
||||
reg cke;
|
||||
reg cs_n;
|
||||
reg ras_n;
|
||||
reg cas_n;
|
||||
reg we_n;
|
||||
reg [BA_BITS-1:0] ba;
|
||||
reg [ADDR_BITS-1:0] a;
|
||||
wire [DM_BITS-1:0] dm;
|
||||
wire [DQ_BITS-1:0] dq;
|
||||
wire [DQS_BITS-1:0] dqs;
|
||||
wire [DQS_BITS-1:0] dqs_n;
|
||||
wire [DQS_BITS-1:0] rdqs_n;
|
||||
reg odt;
|
||||
|
||||
// mode registers
|
||||
reg [ADDR_BITS-1:0] mode_reg0; //Mode Register
|
||||
reg [ADDR_BITS-1:0] mode_reg1; //Extended Mode Register
|
||||
wire [2:0] cl = mode_reg0[6:4]; //CAS Latency
|
||||
wire bo = mode_reg0[3]; //Burst Order
|
||||
wire [7:0] bl = (1<<mode_reg0[2:0]); //Burst Length
|
||||
wire rdqs_en = mode_reg1[11]; //RDQS Enable
|
||||
wire dqs_n_en = ~mode_reg1[10]; //dqs# Enable
|
||||
wire [2:0] al = mode_reg1[5:3]; //Additive Latency
|
||||
wire [3:0] rl = al + cl; //Read Latency
|
||||
wire [3:0] wl = al + cl-1'b1; //Write Latency
|
||||
|
||||
// dq transmit
|
||||
reg dq_en;
|
||||
reg [DM_BITS-1:0] dm_out;
|
||||
reg [DQ_BITS-1:0] dq_out;
|
||||
reg dqs_en;
|
||||
reg [DQS_BITS-1:0] dqs_out;
|
||||
assign dm = dq_en ? dm_out : {DM_BITS{1'bz}};
|
||||
assign dq = dq_en ? dq_out : {DQ_BITS{1'bz}};
|
||||
assign dqs = dqs_en ? dqs_out : {DQS_BITS{1'bz}};
|
||||
assign dqs_n = (dqs_en & dqs_n_en) ? ~dqs_out : {DQS_BITS{1'bz}};
|
||||
|
||||
// dq receive
|
||||
reg [DM_BITS-1:0] dm_fifo [2*(AL_MAX+CL_MAX)+BL_MAX:0];
|
||||
reg [DQ_BITS-1:0] dq_fifo [2*(AL_MAX+CL_MAX)+BL_MAX:0];
|
||||
wire [DQ_BITS-1:0] q0, q1, q2, q3;
|
||||
reg [1:0] burst_cntr;
|
||||
assign rdqs_n = {DQS_BITS{1'bz}};
|
||||
|
||||
// timing definition in tCK units
|
||||
real tck;
|
||||
wire [11:0] taa = ceil(CL_TIME/tck);
|
||||
wire [11:0] tanpd = TANPD;
|
||||
wire [11:0] taond = TAOND;
|
||||
wire [11:0] taofd = ceil(TAOFD);
|
||||
wire [11:0] taxpd = TAXPD;
|
||||
wire [11:0] tccd = TCCD;
|
||||
wire [11:0] tcke = TCKE;
|
||||
wire [11:0] tdllk = TDLLK;
|
||||
wire [11:0] tfaw = ceil(TFAW/tck);
|
||||
wire [11:0] tmod = ceil(TMOD/tck);
|
||||
wire [11:0] tmrd = TMRD;
|
||||
wire [11:0] tras = ceil(TRAS_MIN/tck);
|
||||
wire [11:0] trc = TRC;
|
||||
wire [11:0] trcd = ceil(TRCD/tck);
|
||||
wire [11:0] trfc = ceil(TRFC_MIN/tck);
|
||||
wire [11:0] trp = ceil(TRP/tck);
|
||||
wire [11:0] trrd = ceil(TRRD/tck);
|
||||
wire [11:0] trtp = ceil(TRTP/tck);
|
||||
wire [11:0] twr = ceil(TWR/tck);
|
||||
wire [11:0] twtr = ceil(TWTR/tck);
|
||||
wire [11:0] txard = TXARD;
|
||||
wire [11:0] txards = TXARDS;
|
||||
wire [11:0] txp = TXP;
|
||||
wire [11:0] txsnr = ceil(TXSNR/tck);
|
||||
wire [11:0] txsrd = TXSRD;
|
||||
|
||||
initial begin
|
||||
$timeformat (-9, 1, " ns", 1);
|
||||
`ifdef period
|
||||
tck <= `period;
|
||||
`else
|
||||
tck <= TCK_MIN;
|
||||
`endif
|
||||
ck <= 1'b1;
|
||||
end
|
||||
|
||||
// component instantiation
|
||||
ddr2 sdramddr2 (
|
||||
ck,
|
||||
ck_n,
|
||||
cke,
|
||||
cs_n,
|
||||
ras_n,
|
||||
cas_n,
|
||||
we_n,
|
||||
dm,
|
||||
ba,
|
||||
a,
|
||||
dq,
|
||||
dqs,
|
||||
dqs_n,
|
||||
rdqs_n,
|
||||
odt
|
||||
);
|
||||
|
||||
// clock generator
|
||||
always @(posedge ck) begin
|
||||
ck <= #(tck/2) 1'b0;
|
||||
ck <= #(tck) 1'b1;
|
||||
end
|
||||
|
||||
function integer ceil;
|
||||
input number;
|
||||
real number;
|
||||
if (number > $rtoi(number))
|
||||
ceil = $rtoi(number) + 1;
|
||||
else
|
||||
ceil = number;
|
||||
endfunction
|
||||
|
||||
function integer max;
|
||||
input arg1;
|
||||
input arg2;
|
||||
integer arg1;
|
||||
integer arg2;
|
||||
if (arg1 > arg2)
|
||||
max = arg1;
|
||||
else
|
||||
max = arg2;
|
||||
endfunction
|
||||
|
||||
task power_up;
|
||||
begin
|
||||
cke <= 1'b0;
|
||||
odt <= 1'b0;
|
||||
repeat(10) @(negedge ck);
|
||||
cke <= 1'b1;
|
||||
nop (400000/tck+1);
|
||||
end
|
||||
endtask
|
||||
|
||||
task load_mode;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input [ADDR_BITS-1:0] addr;
|
||||
begin
|
||||
case (bank)
|
||||
0: mode_reg0 = addr;
|
||||
1: mode_reg1 = addr;
|
||||
endcase
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b0;
|
||||
cas_n <= 1'b0;
|
||||
we_n <= 1'b0;
|
||||
ba <= bank;
|
||||
a <= addr;
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task refresh;
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b0;
|
||||
cas_n <= 1'b0;
|
||||
we_n <= 1'b1;
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task precharge;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input ap; //precharge all
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b0;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b0;
|
||||
ba <= bank;
|
||||
a <= (ap<<10);
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task activate;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input [ROW_BITS-1:0] row;
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b0;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b1;
|
||||
ba <= bank;
|
||||
a <= row;
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
//write task supports burst lengths <= 8
|
||||
task write;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input [COL_BITS-1:0] col;
|
||||
input ap; //Auto Precharge
|
||||
input [8*DM_BITS-1:0] dm;
|
||||
input [8*DQ_BITS-1:0] dq;
|
||||
reg [ADDR_BITS-1:0] atemp [1:0];
|
||||
integer i;
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b0;
|
||||
we_n <= 1'b0;
|
||||
ba <= bank;
|
||||
atemp[0] = col & 10'h3ff; //addr[ 9: 0] = COL[ 9: 0]
|
||||
atemp[1] = (col>>10)<<11; //addr[ N:11] = COL[ N:10]
|
||||
a <= atemp[0] | atemp[1] | (ap<<10);
|
||||
for (i=0; i<=bl; i=i+1) begin
|
||||
|
||||
dqs_en <= #(wl*tck + i*tck/2) 1'b1;
|
||||
if (i%2 == 0) begin
|
||||
dqs_out <= #(wl*tck + i*tck/2) {DQS_BITS{1'b0}};
|
||||
end else begin
|
||||
dqs_out <= #(wl*tck + i*tck/2) {DQS_BITS{1'b1}};
|
||||
end
|
||||
|
||||
dq_en <= #(wl*tck + i*tck/2 + tck/4) 1'b1;
|
||||
dm_out <= #(wl*tck + i*tck/2 + tck/4) dm>>i*DM_BITS;
|
||||
dq_out <= #(wl*tck + i*tck/2 + tck/4) dq>>i*DQ_BITS;
|
||||
end
|
||||
dqs_en <= #(wl*tck + bl*tck/2 + tck/2) 1'b0;
|
||||
dq_en <= #(wl*tck + bl*tck/2 + tck/4) 1'b0;
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
// read without data verification
|
||||
task read;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input [COL_BITS-1:0] col;
|
||||
input ap; //Auto Precharge
|
||||
reg [ADDR_BITS-1:0] atemp [1:0];
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b0;
|
||||
we_n <= 1'b1;
|
||||
ba <= bank;
|
||||
atemp[0] = col & 10'h3ff; //addr[ 9: 0] = COL[ 9: 0]
|
||||
atemp[1] = (col>>10)<<11; //addr[ N:11] = COL[ N:10]
|
||||
a <= atemp[0] | atemp[1] | (ap<<10);
|
||||
@(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task nop;
|
||||
input [31:0] count;
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b1;
|
||||
repeat(count) @(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task deselect;
|
||||
input [31:0] count;
|
||||
begin
|
||||
cke <= 1'b1;
|
||||
cs_n <= 1'b1;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b1;
|
||||
repeat(count) @(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task power_down;
|
||||
input [31:0] count;
|
||||
begin
|
||||
cke <= 1'b0;
|
||||
cs_n <= 1'b1;
|
||||
ras_n <= 1'b1;
|
||||
cas_n <= 1'b1;
|
||||
we_n <= 1'b1;
|
||||
repeat(count) @(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
task self_refresh;
|
||||
input [31:0] count;
|
||||
begin
|
||||
cke <= 1'b0;
|
||||
cs_n <= 1'b0;
|
||||
ras_n <= 1'b0;
|
||||
cas_n <= 1'b0;
|
||||
we_n <= 1'b1;
|
||||
cs_n <= #(tck) 1'b1;
|
||||
ras_n <= #(tck) 1'b1;
|
||||
cas_n <= #(tck) 1'b1;
|
||||
we_n <= #(tck) 1'b1;
|
||||
repeat(count) @(negedge ck);
|
||||
end
|
||||
endtask
|
||||
|
||||
// read with data verification
|
||||
task read_verify;
|
||||
input [BA_BITS-1:0] bank;
|
||||
input [COL_BITS-1:0] col;
|
||||
input ap; //Auto Precharge
|
||||
input [8*DM_BITS-1:0] dm; //Expected Data Mask
|
||||
input [8*DQ_BITS-1:0] dq; //Expected Data
|
||||
integer i;
|
||||
begin
|
||||
read (bank, col, ap);
|
||||
for (i=0; i<bl; i=i+1) begin
|
||||
dm_fifo[2*rl + i] = dm >> (i*DM_BITS);
|
||||
dq_fifo[2*rl + i] = dq >> (i*DQ_BITS);
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
// receiver(s) for data_verify process
|
||||
dqrx dqrx[DQS_BITS-1:0] (dqs, dq, q0, q1, q2, q3);
|
||||
|
||||
// perform data verification as a result of read_verify task call
|
||||
always @(ck) begin:data_verify
|
||||
integer i;
|
||||
integer j;
|
||||
reg [DQ_BITS-1:0] bit_mask;
|
||||
reg [DM_BITS-1:0] dm_temp;
|
||||
reg [DQ_BITS-1:0] dq_temp;
|
||||
|
||||
for (i = !ck; (i < 2/(2.0 - !ck)); i=i+1) begin
|
||||
if (dm_fifo[i] === {DM_BITS{1'bx}}) begin
|
||||
burst_cntr = 0;
|
||||
end else begin
|
||||
|
||||
dm_temp = dm_fifo[i];
|
||||
for (j=0; j<DQ_BITS; j=j+1) begin
|
||||
bit_mask[j] = !dm_temp[j/8];
|
||||
end
|
||||
|
||||
case (burst_cntr)
|
||||
0: dq_temp = q0;
|
||||
1: dq_temp = q1;
|
||||
2: dq_temp = q2;
|
||||
3: dq_temp = q3;
|
||||
endcase
|
||||
//if ( ((dq_temp & bit_mask) === (dq_fifo[i] & bit_mask)))
|
||||
// $display ("%m at time %t: INFO: Successful read data compare. Expected = %h, Actual = %h, Mask = %h, i = %d", $time, dq_fifo[i], dq_temp, bit_mask, burst_cntr);
|
||||
if ((dq_temp & bit_mask) !== (dq_fifo[i] & bit_mask))
|
||||
$display ("%m at time %t: ERROR: Read data miscompare. Expected = %h, Actual = %h, Mask = %h, i = %d", $time, dq_fifo[i], dq_temp, bit_mask, burst_cntr);
|
||||
|
||||
burst_cntr = burst_cntr + 1;
|
||||
end
|
||||
end
|
||||
|
||||
if (ck) begin
|
||||
if (dm_fifo[2] === {DM_BITS{1'bx}}) begin
|
||||
dqrx[0%DQS_BITS].ptr <= 0; // v2k syntax
|
||||
dqrx[1%DQS_BITS].ptr <= 0; // v2k syntax
|
||||
dqrx[2%DQS_BITS].ptr <= 0; // v2k syntax
|
||||
dqrx[3%DQS_BITS].ptr <= 0; // v2k syntax
|
||||
end
|
||||
end else begin
|
||||
for (i=0; i<=(2*(AL_MAX+CL_MAX)+BL_MAX); i=i+1) begin
|
||||
dm_fifo[i] = dm_fifo[i+2];
|
||||
dq_fifo[i] = dq_fifo[i+2];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// End-of-test triggered in 'subtest.vh'
|
||||
task test_done;
|
||||
begin
|
||||
$display ("%m at time %t: INFO: Simulation is Complete", $time);
|
||||
$stop(0);
|
||||
end
|
||||
endtask
|
||||
|
||||
// Test included from external file
|
||||
`include "subtest.vh"
|
||||
|
||||
endmodule
|
||||
|
||||
module dqrx (
|
||||
dqs, dq, q0, q1, q2, q3
|
||||
);
|
||||
|
||||
`include "ddr2_parameters.vh"
|
||||
|
||||
input dqs;
|
||||
input [DQ_BITS/DQS_BITS-1:0] dq;
|
||||
output [DQ_BITS/DQS_BITS-1:0] q0;
|
||||
output [DQ_BITS/DQS_BITS-1:0] q1;
|
||||
output [DQ_BITS/DQS_BITS-1:0] q2;
|
||||
output [DQ_BITS/DQS_BITS-1:0] q3;
|
||||
|
||||
reg [DQ_BITS/DQS_BITS-1:0] q [3:0];
|
||||
|
||||
assign q0 = q[0];
|
||||
assign q1 = q[1];
|
||||
assign q2 = q[2];
|
||||
assign q3 = q[3];
|
||||
|
||||
reg [1:0] ptr;
|
||||
reg dqs_q;
|
||||
|
||||
always @(dqs) begin
|
||||
if (dqs ^ dqs_q) begin
|
||||
#(TDQSQ + 1);
|
||||
q[ptr] <= dq;
|
||||
ptr <= (ptr + 1)%4;
|
||||
end
|
||||
dqs_q <= dqs;
|
||||
end
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user