mirror of
git://projects.qi-hardware.com/xue.git
synced 2024-12-25 20:08:58 +02:00
unzipped 2 files
This commit is contained in:
parent
12e7b3eabc
commit
29e7ceda7c
Binary file not shown.
Binary file not shown.
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
|
167
sim/verilog/micron_mobile_ddr/1024Mb_mobile_ddr_parameters.vh
Normal file
167
sim/verilog/micron_mobile_ddr/1024Mb_mobile_ddr_parameters.vh
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 2005 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Revisions: baaab - 06/20/06 - tMRD was set to 2.0 ns but should be 2 * tCK. Fixed.
|
||||||
|
* Added ROW_BITS & BA_BITS for compatibility w/our system.
|
||||||
|
* Removed part size parameter.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
// Parameters current with 1024Mb datasheet rev C (10/02/07)
|
||||||
|
// 04.17.08 - Consolidated 1024Mb and T48M designs; Updated to rev E (03/08)
|
||||||
|
// 12.10.08 - Updated to datasheet rev G (07/08)
|
||||||
|
|
||||||
|
|
||||||
|
// SYMBOL UNITS DESCRIPTION
|
||||||
|
// ------ ----- -----------
|
||||||
|
`ifdef sg5 // Timing Parameters for -5 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.40; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 40.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 55.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 15.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 10.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
`else `ifdef sg54 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 58.2; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 16.2; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 16.2; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.8; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 10.8; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
`else `ifdef sg6 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 18.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 18.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 12.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
`else `define sg75 // Timing Parameters for -75 (CL = 3)
|
||||||
|
parameter tAC3_max = 6.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.60; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 6.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 45.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 75.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 22.5; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 22.5; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 15.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
`endif `endif `endif
|
||||||
|
|
||||||
|
parameter tAC2_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC3_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tLZ = 1.0; // tLZ ns Data-out low Z window from CK/CK#
|
||||||
|
parameter tMRD = 2.0; // tMRD tCK Load Mode Register command cycle time
|
||||||
|
parameter tRFC = 110.0; // tRFC ns Refresh to Refresh Command interval time
|
||||||
|
parameter tSRC = 1.0; // tSRC tCK SRR READ command to first valid command Note: model adds CL to this value
|
||||||
|
parameter tSRR = 2.0; // tSRR tCK SRR command to SRR READ command
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
parameter tCH_MAX = 0.55; // Clk high level width
|
||||||
|
parameter tCH_MIN = 0.45; // Clk high level width
|
||||||
|
parameter tCL_MAX = 0.55; // Clk low level width
|
||||||
|
parameter tCL_MIN = 0.45; // Clk low level width
|
||||||
|
parameter tCKE = 1.0 ; // Minimum tCKE High/Low time (in tCK's)
|
||||||
|
parameter CL_MAX = 3 ; // Maximum CAS Latency
|
||||||
|
parameter BL_MAX = 16 ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Size Parameters based on Part Width
|
||||||
|
`ifdef x16
|
||||||
|
parameter ADDR_BITS = 14; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 14; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Set this parameter to control how many Bank bits are used
|
||||||
|
`else `define x32
|
||||||
|
`ifdef RP // reduced page mode
|
||||||
|
parameter ADDR_BITS = 14; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 14; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else
|
||||||
|
parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 13; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`endif
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// For use with the Multi Chip Package
|
||||||
|
`ifdef DUAL_RANK
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 2; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`else
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 1; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_mem_bits = 10; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_size = 1024; // Set this parameter to indicate part size(1024Mb, 512Mb, 256Mb, 128Mb)
|
||||||
|
|
||||||
|
|
153
sim/verilog/micron_mobile_ddr/128Mb_mobile_ddr_parameters.vh
Normal file
153
sim/verilog/micron_mobile_ddr/128Mb_mobile_ddr_parameters.vh
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 2005 - 2006 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Revisions: baaab - 06/20/06 - tMRD was set to 2.0 ns but should be 2 * tCK - fixed.
|
||||||
|
* Added ROW_BITS & BA_BITS for compatibility w/our system.
|
||||||
|
* Also changed Col bits from 10 to 9 per spec.
|
||||||
|
* Removed x32 option and part size parameter.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
// Parameters current with 128Mb datasheet rev J (11/05)
|
||||||
|
// 04.17.08 - Parameters current with 128Mb Data sheet rev A (04/08)
|
||||||
|
|
||||||
|
// Timing parameters based on Speed Grade
|
||||||
|
|
||||||
|
// SYMBOL UNITS DESCRIPTION
|
||||||
|
// ------ ----- -----------
|
||||||
|
`ifdef sg5 // Timing Parameters for -5 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.40; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 40.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 55.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 15.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 5.0; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `ifdef sg54 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 58.2; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 16.2; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 16.2; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.8; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 5.4; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `ifdef sg6 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.50; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 18.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 18.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `define sg75 // Timing Parameters for -75 (CL = 3)
|
||||||
|
parameter tAC3_max = 6.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.60; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 6.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 45.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 75.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 22.5; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 22.5; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 7.5; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`endif `endif `endif
|
||||||
|
|
||||||
|
parameter tAC2_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC3_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tLZ = 1.0; // tLZ ns Data-out low Z window from CK/CK#
|
||||||
|
parameter tMRD = 2.0; // tMRD tCK Load Mode Register command cycle time
|
||||||
|
parameter tRFC = 80.0; // tRFC ns Refresh to Refresh Command interval time
|
||||||
|
parameter tSRC = 1.0; // tSRC tCK SRR READ command to first valid command (Not Applicable for 128Mb, 256Mb Parts)
|
||||||
|
parameter tSRR = 2.0; // tSRR tCK SRR command to SRR READ command (Not Applicable for 128Mb, 256Mb Parts)
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
|
||||||
|
// Size Parameters based on Part Width
|
||||||
|
`ifdef x16
|
||||||
|
parameter ADDR_BITS = 12; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 12; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else `define x32
|
||||||
|
parameter ADDR_BITS = 12; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 12; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 8; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// For use with the Multi Chip Package
|
||||||
|
`ifdef DUAL_RANK
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 2; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`else
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 1; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_mem_bits = 10; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_size = 128; // Set this parameter to indicate part size(512Mb, 256Mb, 128Mb)
|
||||||
|
parameter tCH_MAX = 0.55; // Clk high level width
|
||||||
|
parameter tCH_MIN = 0.45; // Clk high level width
|
||||||
|
parameter tCL_MAX = 0.55; // Clk low level width
|
||||||
|
parameter tCL_MIN = 0.45; // Clk low level width
|
||||||
|
parameter tCKE = 2.0; // Minimum tCKE High/Low time (in tCK's)
|
||||||
|
parameter CL_MAX = 3; // Maximum CAS Latency
|
||||||
|
parameter BL_MAX = 16 ;
|
179
sim/verilog/micron_mobile_ddr/2048Mb_mobile_ddr_parameters.vh
Normal file
179
sim/verilog/micron_mobile_ddr/2048Mb_mobile_ddr_parameters.vh
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 2005 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Revisions: baaab - 06/20/06 - tMRD was set to 2.0 ns but should be 2 * tCK. Fixed.
|
||||||
|
* Added ROW_BITS & BA_BITS for compatibility w/our system.
|
||||||
|
* Removed part size parameter.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
// Parameters current with 2048Mb LPDDR SDRAM
|
||||||
|
// 04.26.10 - Based on Rev 0.7 04/09EN (DDS)
|
||||||
|
|
||||||
|
|
||||||
|
// SYMBOL UNITS DESCRIPTION
|
||||||
|
// ------ ----- -----------
|
||||||
|
`ifdef sg5 // Timing Parameters for -5 (CL = 3)
|
||||||
|
parameter tAC3_max = 4.8; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 4.8; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 4.8; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.40; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 4.8; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 40.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 55.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 14.4; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 14.4; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
parameter tWR = 14.4; // tWR ns Write recovery time
|
||||||
|
`else `ifdef sg54 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 41.8; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 58.2; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 16.2; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 16.2; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.8; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
`else `ifdef sg6 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 41.8; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 18.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 18.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
`else `define sg75 // Timing Parameters for -75 (CL = 3)
|
||||||
|
parameter tAC3_max = 6.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.60; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 6.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 45.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 67.5; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 22.5; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 22.5; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 7.50; // tXP ns Exit power-down to first valid cmd Note: spec'd as 2 * tCK
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
`endif `endif `endif
|
||||||
|
|
||||||
|
parameter tAC2_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC3_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tLZ = 1.0; // tLZ ns Data-out low Z window from CK/CK#
|
||||||
|
parameter tMRD = 2.0; // tMRD tCK Load Mode Register command cycle time
|
||||||
|
parameter tRFC = 72.0; // tRFC ns Refresh to Refresh Command interval time
|
||||||
|
parameter tSRC = 1.0; // tSRC tCK SRR READ command to first valid command Note: model adds CL to this value
|
||||||
|
parameter tSRR = 2.0; // tSRR tCK SRR command to SRR READ command
|
||||||
|
parameter tCH_MAX = 0.55; // Clk high level width
|
||||||
|
parameter tCH_MIN = 0.45; // Clk high level width
|
||||||
|
parameter tCL_MAX = 0.55; // Clk low level width
|
||||||
|
parameter tCL_MIN = 0.45; // Clk low level width
|
||||||
|
parameter tCKE = 1.0 ; // Minimum tCKE High/Low time (in tCK's)
|
||||||
|
parameter CL_MAX = 3 ; // Maximum CAS Latency
|
||||||
|
parameter BL_MAX = 16 ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Size Parameters based on Part Width
|
||||||
|
`ifdef x16
|
||||||
|
`ifdef RP
|
||||||
|
parameter ADDR_BITS = 15; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 15; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Set this parameter to control how many Bank bits are used
|
||||||
|
`else
|
||||||
|
parameter ADDR_BITS = 14; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 14; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Set this parameter to control how many Bank bits are used
|
||||||
|
`endif
|
||||||
|
`else `define x32
|
||||||
|
`ifdef RP // reduced page mode
|
||||||
|
parameter ADDR_BITS = 15; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 15; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else
|
||||||
|
parameter ADDR_BITS = 14; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 14; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`endif
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// For use with the Multi Chip Package
|
||||||
|
`ifdef DUAL_RANK
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 2; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`else
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 1; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_mem_bits = 10; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_size = 2048; // Set this parameter to indicate part size(1024Mb, 512Mb, 256Mb, 128Mb)
|
||||||
|
|
||||||
|
|
134
sim/verilog/micron_mobile_ddr/256Mb_mobile_ddr_parameters.vh
Normal file
134
sim/verilog/micron_mobile_ddr/256Mb_mobile_ddr_parameters.vh
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 2005 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Revisions: baaab - 06/20/06 - tMRD was set to 2.0 ns but should be 2 * tCK. Fixed.
|
||||||
|
* Added ROW_BITS & BA_BITS for compatibility w/our system.
|
||||||
|
* Also changed x16 Col bits from 8 to 9 per spec.
|
||||||
|
* Removed part size parameter.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
// Parameters current with 256Mb datasheet rev E (05/07)
|
||||||
|
// 04.17.08 - Parameters current with 256Mb Data sheet rev H (03/08)
|
||||||
|
|
||||||
|
// Timing parameters based on Speed Grade
|
||||||
|
|
||||||
|
// SYMBOL UNITS DESCRIPTION
|
||||||
|
// ------ ----- -----------
|
||||||
|
`ifdef sg6 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.50; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 18.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 18.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWR = 12.0; // tWR ns Write recovery time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd
|
||||||
|
`else `define sg75 // Timing Parameters for -75 (CL = 3)
|
||||||
|
parameter tAC3_max = 6.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.60; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 6.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 45.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 75.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 22.5; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 22.5; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 7.5; // tXP ns Exit power-down to first valid cmd
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter tAC2_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC3_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tLZ = 1.0; // tLZ ns Data-out low Z window from CK/CK#
|
||||||
|
parameter tMRD = 2.0; // tMRD tCK Load Mode Register command cycle time
|
||||||
|
parameter tRFC = 70.0; // tRFC ns Refresh to Refresh Command interval time
|
||||||
|
parameter tSRC = 1.0; // tSRC tCK SRR READ command to first valid command (Not Applicable for 128Mb, 256Mb, and 512Mb Parts)
|
||||||
|
parameter tSRR = 2.0; // tSRR tCK SRR command to SRR READ command (Not Applicable for 128Mb, 256Mb, and 512Mb Parts)
|
||||||
|
|
||||||
|
// Size Parameters based on Part Width
|
||||||
|
`ifdef x16
|
||||||
|
parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 13; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else `define x32
|
||||||
|
`ifdef RP
|
||||||
|
parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 13; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 8; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else
|
||||||
|
parameter ADDR_BITS = 12; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 12; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`endif
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// For use with the Multi Chip Package
|
||||||
|
`ifdef DUAL_RANK
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 2; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`else
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 1; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_mem_bits = 10; // For fast sim load
|
||||||
|
parameter part_size = 256; // Set this parameter to indicate part size(512Mb, 256Mb, 128Mb)
|
||||||
|
parameter tCH_MAX = 0.55; // Clk high level width
|
||||||
|
parameter tCH_MIN = 0.45; // Clk high level width
|
||||||
|
parameter tCL_MAX = 0.55; // Clk low level width
|
||||||
|
parameter tCL_MIN = 0.45; // Clk low level width
|
||||||
|
parameter tCKE = 2.0; // Minimum tCKE High/Low time (in tCK's)
|
||||||
|
parameter CL_MAX = 3; // Maximum CAS Latency
|
||||||
|
parameter BL_MAX = 16;
|
||||||
|
|
||||||
|
|
162
sim/verilog/micron_mobile_ddr/512Mb_mobile_ddr_parameters.vh
Normal file
162
sim/verilog/micron_mobile_ddr/512Mb_mobile_ddr_parameters.vh
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 2005 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Revisions: baaab - 06/20/06 - tMRD was set to 2.0 ns but should be 2 * tCK. Fixed.
|
||||||
|
* Added ROW_BITS & BA_BITS for compatibility w/our system.
|
||||||
|
* Removed part size parameter.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
// Parameters current with T47M datasheet rev M (07/07)
|
||||||
|
// 04.17.08 - Paramters current with 512Mb Data sheet rev C (03/08)
|
||||||
|
// Timing parameters based on Speed Grade
|
||||||
|
|
||||||
|
|
||||||
|
// SYMBOL UNITS DESCRIPTION
|
||||||
|
// ------ ----- -----------
|
||||||
|
`ifdef sg5 // Timing Parameters for -5 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.40; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 40.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 55.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 15.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 10.0; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `ifdef sg54 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 5.4; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 59.4; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 16.2; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 16.2; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 10.8; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 10.8; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `ifdef sg6 // Timing Parameters for -6 (CL = 3)
|
||||||
|
parameter tAC3_max = 5.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 6.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.50; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 5.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 42.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 18.0; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 18.0; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 2.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 6.0; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`else `define sg75 // Timing Parameters for -75 (CL = 3)
|
||||||
|
parameter tAC3_max = 6.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC2_max = 6.5; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK3_min = 7.5; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tCK2_min = 12.0; // tCK ns Nominal Clock Cycle Time
|
||||||
|
parameter tDQSQ = 0.60; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access
|
||||||
|
parameter tHZ3_max = 6.0; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tHZ2_max = 6.5; // tHZ ns Data-out high Z window from CK/CK#
|
||||||
|
parameter tRAS = 45.0; // tRAS ns Active to Precharge command time
|
||||||
|
parameter tRC = 75.0; // tRC ns Active to Active/Auto Refresh command time
|
||||||
|
parameter tRCD = 22.5; // tRCD ns Active to Read/Write command time
|
||||||
|
parameter tRP = 22.5; // tRP ns Precharge command period
|
||||||
|
parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time
|
||||||
|
parameter tWTR = 1.0; // tWTR tCK Internal Write-to-Read command delay
|
||||||
|
parameter tXP = 7.5; // tXP ns Exit power-down to first valid cmd *note: In data sheet this is specified as one clk, but min tck fails before tXP on the actual part
|
||||||
|
`endif `endif `endif
|
||||||
|
|
||||||
|
parameter tAC2_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tAC3_min = 2.0; // tAC ns Access window of DQ from CK/CK#
|
||||||
|
parameter tLZ = 1.0; // tLZ ns Data-out low Z window from CK/CK#
|
||||||
|
parameter tMRD = 2.0; // tMRD tCK Load Mode Register command cycle time
|
||||||
|
parameter tRFC = 97.5; // tRFC ns Refresh to Refresh Command interval time
|
||||||
|
parameter tSRC = 1.0; // tSRC tCK SRR READ command to first valid command (Not Applicable for 128Mb, 256Mb Parts)
|
||||||
|
parameter tSRR = 2.0; // tSRR tCK SRR command to SRR READ command (Not Applicable for 128Mb, 256Mb Parts)
|
||||||
|
parameter tWR = 15.0; // tWR ns Write recovery time
|
||||||
|
|
||||||
|
// Size Parameters based on Part Width
|
||||||
|
`ifdef x16
|
||||||
|
parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 13; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else `define x32
|
||||||
|
`ifdef RP
|
||||||
|
parameter ADDR_BITS = 14; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 14; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 8; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`else
|
||||||
|
parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used
|
||||||
|
parameter ROW_BITS = 13; // Set this parameter to control how many Row bits are used
|
||||||
|
parameter DQ_BITS = 32; // Set this parameter to control how many Data bits are used
|
||||||
|
parameter DQS_BITS = 4; // Set this parameter to control how many DQS bits are used
|
||||||
|
parameter DM_BITS = 4; // Set this parameter to control how many DM bits are used
|
||||||
|
parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used
|
||||||
|
parameter BA_BITS = 2; // Bank bits
|
||||||
|
`endif
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// For use with the Multi Chip Package
|
||||||
|
`ifdef DUAL_RANK
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 2; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`else
|
||||||
|
parameter CS_BITS = 2; // Set this parameter to control how many Chip Select bits are used
|
||||||
|
parameter RANKS = 1; // Set this parameter to control how many Ranks on the mcp are used
|
||||||
|
`endif
|
||||||
|
|
||||||
|
parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_mem_bits = 10; // Set this parameter to control how many unique addresses are used
|
||||||
|
parameter part_size = 512; // Set this parameter to indicate part size(512Mb, 256Mb, 128Mb)
|
||||||
|
parameter tCH_MAX = 0.55; // Clk high level width
|
||||||
|
parameter tCH_MIN = 0.45; // Clk high level width
|
||||||
|
parameter tCL_MAX = 0.55; // Clk low level width
|
||||||
|
parameter tCL_MIN = 0.45; // Clk low level width
|
||||||
|
parameter tCKE = 1.0; // Minimum tCKE High/Low time (in tCK's)
|
||||||
|
parameter CL_MAX = 3; // Maximum CAS Latency
|
||||||
|
parameter BL_MAX = 16 ;
|
2126
sim/verilog/micron_mobile_ddr/mobile_ddr.v
Normal file
2126
sim/verilog/micron_mobile_ddr/mobile_ddr.v
Normal file
File diff suppressed because it is too large
Load Diff
84
sim/verilog/micron_mobile_ddr/mobile_ddr_mcp.v
Normal file
84
sim/verilog/micron_mobile_ddr/mobile_ddr_mcp.v
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* File Name: mobile_ddr_mcp.v
|
||||||
|
*
|
||||||
|
* Dependencies: mobile_ddr.v, mobile_ddr_parameters.vh
|
||||||
|
*
|
||||||
|
* Description: Micron MOBILE DDR SDRAM 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 2008 Micron Technology, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
****************************************************************************************/
|
||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module mobile_ddr_mcp (
|
||||||
|
Clk ,
|
||||||
|
Clk_n ,
|
||||||
|
Cke ,
|
||||||
|
Cs_n ,
|
||||||
|
Ras_n ,
|
||||||
|
Cas_n ,
|
||||||
|
We_n ,
|
||||||
|
Addr ,
|
||||||
|
Ba ,
|
||||||
|
Dq ,
|
||||||
|
Dqs ,
|
||||||
|
Dm
|
||||||
|
);
|
||||||
|
|
||||||
|
`include "mobile_ddr_parameters.vh"
|
||||||
|
|
||||||
|
// Declare Ports
|
||||||
|
input Clk ;
|
||||||
|
input Clk_n ;
|
||||||
|
input [CS_BITS - 1 : 0] Cke ;
|
||||||
|
input [CS_BITS - 1 : 0] Cs_n ;
|
||||||
|
input Ras_n ;
|
||||||
|
input Cas_n ;
|
||||||
|
input We_n ;
|
||||||
|
input [ADDR_BITS - 1 : 0] Addr ;
|
||||||
|
input [1 : 0] Ba ;
|
||||||
|
inout [DQ_BITS - 1 : 0] Dq ;
|
||||||
|
inout [DQS_BITS - 1 : 0] Dqs ;
|
||||||
|
input [DM_BITS - 1 : 0] Dm ;
|
||||||
|
|
||||||
|
wire [RANKS - 1 : 0] Cke_mcp = Cke ;
|
||||||
|
wire [RANKS - 1 : 0] Cs_n_mcp = Cs_n ;
|
||||||
|
|
||||||
|
mobile_ddr rank [RANKS - 1:0] (
|
||||||
|
.Clk ( Clk ) ,
|
||||||
|
.Clk_n ( Clk_n ) ,
|
||||||
|
.Cke ( Cke_mcp ) ,
|
||||||
|
.Cs_n ( Cs_n_mcp ) ,
|
||||||
|
.Ras_n ( Ras_n ) ,
|
||||||
|
.Cas_n ( Cas_n ) ,
|
||||||
|
.We_n ( We_n ) ,
|
||||||
|
.Addr ( Addr ) ,
|
||||||
|
.Ba ( Ba ) ,
|
||||||
|
.Dq ( Dq ) ,
|
||||||
|
.Dqs ( Dqs ) ,
|
||||||
|
.Dm ( Dm )
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
167
sim/verilog/micron_mobile_ddr/readme.txt
Normal file
167
sim/verilog/micron_mobile_ddr/readme.txt
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
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 2008 Micron Technology, Inc. All rights reserved.
|
||||||
|
|
||||||
|
Getting Started:
|
||||||
|
----------------
|
||||||
|
Unzip the included files to a folder.
|
||||||
|
Compile mobile_ddr.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:
|
||||||
|
------------------
|
||||||
|
mobile_ddr.v --mobile ddr model
|
||||||
|
mobile_ddr_mcp.v --structural wrapper for mobile_ddr multi-chip package model
|
||||||
|
128Mb_mobile_ddr_parameters.vh --File that contains all parameters used by the model
|
||||||
|
256Mb_mobile_ddr_parameters.vh --File that contains all parameters used by the model
|
||||||
|
512Mb_mobile_ddr_parameters.vh --File that contains all parameters used by the model
|
||||||
|
1024Mb_mobile_ddr_parameters.vh --File that contains all parameters used by the model
|
||||||
|
2048Mb_mobile_ddr_parameters.vh --File that contains all parameters used by the model
|
||||||
|
readme.txt --This file
|
||||||
|
tb.v --Test bench
|
||||||
|
tb.do --File that compiles and runs the above files
|
||||||
|
|
||||||
|
Defining the Density (part size):
|
||||||
|
-------------------------
|
||||||
|
The verilog compiler directive "`define" may be used to choose between on of the
|
||||||
|
densities supported by the mobile ddr model. Allowable densities are listed in
|
||||||
|
the *.vh file. The density is used to select a set of bank, row, column, and timing
|
||||||
|
parameters for the mobile ddr model. The following are examples of defining
|
||||||
|
the density.
|
||||||
|
|
||||||
|
simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vlog +define+den512Mb mobile_ddr.v
|
||||||
|
VCS vcs +define+den512Mb mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +define+den512Mb mobile_ddr.v
|
||||||
|
|
||||||
|
|
||||||
|
Defining the Speed Grade:
|
||||||
|
-------------------------
|
||||||
|
The verilog compiler directive "`define" may be used to choose between
|
||||||
|
multiple speed grades supported by the mobile ddr model. Allowable speed
|
||||||
|
grades are listed in the mobile_ddr_parameters.vh file and begin with the
|
||||||
|
letters "sg". The speed grade is used to select a set of timing
|
||||||
|
parameters for the mobile ddr model. The following are examples of defining
|
||||||
|
the speed grade.
|
||||||
|
|
||||||
|
simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vlog +define+sg75 mobile_ddr.v
|
||||||
|
VCS vcs +define+sg75 mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +define+sg75 mobile_ddr.v
|
||||||
|
|
||||||
|
|
||||||
|
Defining the Organization:
|
||||||
|
--------------------------
|
||||||
|
The verilog compiler directive "`define" may be used to choose between
|
||||||
|
multiple organizations supported by the mobile ddr model. Valid
|
||||||
|
organizations include "x16" and "x32", and are listed in the
|
||||||
|
mobile_ddr_parameters.vh file. The organization is used to select the amount
|
||||||
|
of memory and the port sizes of the mobile ddr model. The following are
|
||||||
|
examples of defining the organization.
|
||||||
|
|
||||||
|
vlog +define+x16 mobile_ddr.v
|
||||||
|
simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vlog +define+x16 mobile_ddr.v
|
||||||
|
VCS vcs +define+x16 mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +define+x16 mobile_ddr.v
|
||||||
|
|
||||||
|
All combinations of speed grade and organization are considered valid
|
||||||
|
by the mobile ddr 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 mobile ddr model. The number of
|
||||||
|
entries in the associative array is controlled by the part_mem_bits
|
||||||
|
parameter, and is equal to 2^part_mem_bits. For example, if the
|
||||||
|
part_mem_bits parameter is equal to 10, the associative array will be
|
||||||
|
large enough to store 1024 write data transfers to unique addresses.
|
||||||
|
The following are examples of setting the MEM_BITS parameter to 8.
|
||||||
|
|
||||||
|
simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vsim -Gpart_mem_bits=8 mobile_ddr
|
||||||
|
VCS vcs -pvalue+part_mem_bits=8 mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +defparam+mobile_ddr.part_mem_bits=8 mobile_ddr.v
|
||||||
|
|
||||||
|
It is possible to allocate memory for every address supported by the
|
||||||
|
mobile ddr model by using the verilog compiler directive "`define FULL_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+FULL_MEM mobile_ddr.v
|
||||||
|
VCS vcs +define+FULL_MEM mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +define+FULL_MEM mobile_ddr.v
|
||||||
|
|
||||||
|
|
||||||
|
Reduced Page Mode:
|
||||||
|
------------------
|
||||||
|
Mobile DDR 256Mb, 512Mb, and 1024Mb part may be built with the reduced page size
|
||||||
|
architecture. This part is accessed with the +define+RP designator. RP
|
||||||
|
parts have one extra row bit and one less column bit effectively cutting
|
||||||
|
the page size in half but doubling the number of rows keeping total part
|
||||||
|
size the same.
|
||||||
|
|
||||||
|
Part Size Valid RP Designators
|
||||||
|
--------- --------------------
|
||||||
|
256Mb +define+RP
|
||||||
|
512Mb +define+RP
|
||||||
|
1024Mb +define+RP
|
||||||
|
|
||||||
|
Simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vlog +define+RP mobile_ddr.v
|
||||||
|
VCS vcs +define+RP mobile_ddr.v
|
||||||
|
NC-Verilog ncverilog +define+RP mobile_ddr.v
|
||||||
|
|
||||||
|
Multi-Chip Package Model:
|
||||||
|
-------------------------
|
||||||
|
The 1024Mb model can be supported in a Multi Chip Package, that allows
|
||||||
|
multiple die models in one structural package. The number of ranks and
|
||||||
|
chip selects of the mcp can be configured by using the `DUAL_RANK define
|
||||||
|
on the simulator call line. The currently supported configurations are
|
||||||
|
listed below:
|
||||||
|
|
||||||
|
Package Configuration Valid MCP Designator
|
||||||
|
--------------------- --------------------
|
||||||
|
2 Chip Selects, 2 Die +define+DUAL_RANK
|
||||||
|
2 Chip Selects, 1 Die (default)
|
||||||
|
|
||||||
|
The single rank mcp is the default. In order to simulate the DUAL_RANK
|
||||||
|
model, the define needs to be added:
|
||||||
|
|
||||||
|
Simulator command line
|
||||||
|
--------- ------------
|
||||||
|
ModelSim vlog +define+DUAL_RANK mobile_ddr.v mobile_ddr_mcp.v
|
||||||
|
VCS vcs +define+DUAL_RANK mobile_ddr.v mobile_ddr_mcp.v
|
||||||
|
NC-Verilog ncverilog +define+DUAL_RANK mobile_ddr.v mobile_ddr_mcp.v
|
||||||
|
|
32
sim/verilog/micron_mobile_ddr/subtest.vh
Normal file
32
sim/verilog/micron_mobile_ddr/subtest.vh
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
initial begin:test
|
||||||
|
//ck <= 1'b0;
|
||||||
|
cke <= 1'b0;
|
||||||
|
cs_n <= 1'bz;
|
||||||
|
ras_n <= 1'bz;
|
||||||
|
cas_n <= 1'bz;
|
||||||
|
we_n <= 1'bz;
|
||||||
|
a <= {ADDR_BITS{1'bz}};
|
||||||
|
ba <= {BA_BITS{1'bz}};
|
||||||
|
dq_en <= 1'b0;
|
||||||
|
dqs_en <= 1'b0;
|
||||||
|
power_up;
|
||||||
|
nop (10); // wait 10 clocks intead of 200 us for simulation purposes
|
||||||
|
precharge('h00000000, 1);
|
||||||
|
nop(trp);
|
||||||
|
refresh;
|
||||||
|
nop(trfc);
|
||||||
|
refresh;
|
||||||
|
nop(trfc);
|
||||||
|
load_mode('h0, 'h00000032);
|
||||||
|
nop(tmrd);
|
||||||
|
load_mode('h2, 'h00004000);
|
||||||
|
nop(tmrd);
|
||||||
|
activate('h00000000, 'h00000000);
|
||||||
|
nop(trcd-1);
|
||||||
|
write('h00000000, 'h00000000, 0, { {DM_BITS{1'b0}}, {DM_BITS{1'b0}}, {DM_BITS{1'b0}}, {DM_BITS{1'b0}}}, { 16'h3000, 16'h2000, 16'h1000, 16'h0});
|
||||||
|
nop(bl/2+twr);
|
||||||
|
read('h00000000, 'h00000000, 1);
|
||||||
|
nop(bl/2-1);
|
||||||
|
nop('h00000014);
|
||||||
|
test_done;
|
||||||
|
end
|
39
sim/verilog/micron_mobile_ddr/tb.do
Normal file
39
sim/verilog/micron_mobile_ddr/tb.do
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#########################################################################################
|
||||||
|
#
|
||||||
|
# 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 2005 Micron Technology, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
#########################################################################################
|
||||||
|
|
||||||
|
vlib work
|
||||||
|
vlog +define+den512Mb +define+sg75 +define+x16 mobile_ddr.v tb.v
|
||||||
|
vsim tb
|
||||||
|
add wave -p mobile_ddr/*
|
||||||
|
run -a
|
||||||
|
|
||||||
|
# For Reduced Page Parts run the following and comment out the lines above :
|
||||||
|
|
||||||
|
#vlog +define+den512Mb +define+sg75 +define+x32 mobile_ddr.v tb.v
|
||||||
|
#vsim tb
|
||||||
|
#add wave -p mobile_ddr/*
|
||||||
|
#run -a
|
587
sim/verilog/micron_mobile_ddr/tb.v
Normal file
587
sim/verilog/micron_mobile_ddr/tb.v
Normal file
@ -0,0 +1,587 @@
|
|||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
* File Name: tb.v
|
||||||
|
* Version: 6.00
|
||||||
|
* Model: BUS Functional
|
||||||
|
*
|
||||||
|
* Dependencies: mobile_ddr.v, mobile_ddr_parameters.vh, subtest.vh
|
||||||
|
*
|
||||||
|
* Description: Micron SDRAM DDR (Double Data Rate) 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.
|
||||||
|
*
|
||||||
|
* Rev Author Date Changes
|
||||||
|
* --- ------ ---------- ---------------------------------------
|
||||||
|
* 4.1 JMK 01/14/2001 -Grouped specify parameters by speed grade
|
||||||
|
* -Fixed mem_sizes parameter
|
||||||
|
* 2.1 SPH 03/19/2002 -Second Release
|
||||||
|
* -Fix tWR and several incompatability
|
||||||
|
* between different simulators
|
||||||
|
* 3.0 TFK 02/18/2003 -Added tDSS and tDSH timing checks.
|
||||||
|
* -Added tDQSH and tDQSL timing checks.
|
||||||
|
* 3.1 CAH 05/28/2003 -update all models to release version 3.1
|
||||||
|
* (no changes to this model)
|
||||||
|
* 3.2 JMK 06/16/2003 -updated all DDR400 models to support CAS Latency 3
|
||||||
|
* 3.3 JMK 09/11/2003 -Added initialization sequence checks.
|
||||||
|
* 4.0 JMK 12/01/2003 -Grouped parameters into "ddr_parameters.v"
|
||||||
|
* -Fixed tWTR check
|
||||||
|
* 4.2 JMK 03/19/2004 -Fixed pulse width checking on dqs
|
||||||
|
* 4.3 JMK 04/27/2004 -Changed bl wire size in tb module
|
||||||
|
* -Changed Dq_buf size to [15:0]
|
||||||
|
* 5.0 JMK 06/16/2004 -Added read to write checking.
|
||||||
|
* -Added read with precharge truncation to write checking.
|
||||||
|
* -Added associative memory array to reduce memory consumption.
|
||||||
|
* -Added checking for required DQS edges during write.
|
||||||
|
* 6.0 DMR 12/03/2004 -new density
|
||||||
|
* 6.01 BAAB 05/18/2006 -assimilating into Minneapolis site organization
|
||||||
|
* 3.11 BAS 10/18/2006 -added read_verify
|
||||||
|
* 3.35 bas 02/28/07 -mobile_ddr.v file uses tAC correctly to calculate strobe/data launch
|
||||||
|
* 3.36 bas 03/05/07 -fixed error messages for different banks interrupting
|
||||||
|
reads/writes w/autoprecharge
|
||||||
|
* 3.37 bas 03/21/07 -added T47M part for 512Mb in parameters file,
|
||||||
|
modified tXP check to measure in tCLK for T47M
|
||||||
|
* 3.60 clk 09/19/07 -fixed dm/dq verification fifo's
|
||||||
|
* 3.60 clk 09/19/07 -fixed dqrx module delay statement
|
||||||
|
* 3.80 clk 10/29/07 - Support for 1024Mb T48M
|
||||||
|
* 4.00 clk 12/30/07 - Fixed Read terminated by precharge testcase
|
||||||
|
* 4.70 clk 03/30/08 - Fixed typo in SRR code
|
||||||
|
* 4.80 clk 04/03/08 - Disable clk checking during initialization
|
||||||
|
* 4.90 clk 04/16/08 - Fixed tInit, added mpc support, updated t35m timing
|
||||||
|
* 5.00 clk 05/14/08 - Fixed back to back auto precharge commands
|
||||||
|
* 5.20 clk 05/21/08 - Fixed read interrupt by pre (BL8), fixed 1024Mb parameter file
|
||||||
|
* 5.30 clk 05/22/08 - Fixed DM signal which cause false tWTR errors
|
||||||
|
05/27/08 - Rewrote write and read pipelins, strobes
|
||||||
|
* 5.40 clk 05/28/08 - Fixed Addressing problem in Burst Order logic
|
||||||
|
* 5.50 clk 07/25/08 - Added T36N part type
|
||||||
|
* 5.60 clk 09/05/08 - Fixed tXP in 256Mb part type
|
||||||
|
* 5.70 clk 09/17/08 - Fixed burst term check for write w/ all DM active
|
||||||
|
* 5.80 clk 11/18/08 - Fixed internally latched dq & mask widths
|
||||||
|
* 5.90 clk 12/10/08 - Updated T36N parameters to latest datasheet
|
||||||
|
* 6.00 clk 03/05/09 - Fixed DQS problem w/ CL = 2
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module tb;
|
||||||
|
|
||||||
|
`ifdef den128Mb
|
||||||
|
`include "128Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den256Mb
|
||||||
|
`include "256Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den512Mb
|
||||||
|
`include "512Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den1024Mb
|
||||||
|
`include "1024Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den2048Mb
|
||||||
|
`include "2048Mb_mobile_ddr_parameters.vh"
|
||||||
|
`else
|
||||||
|
// NOTE: Intentionally cause a compile fail here to force the users
|
||||||
|
// to select the correct component density before continuing
|
||||||
|
ERROR: You must specify component density with +define+den____Mb.
|
||||||
|
`endif
|
||||||
|
|
||||||
|
reg ck_tb ;
|
||||||
|
reg ck_enable = 1'b1 ;
|
||||||
|
// ports
|
||||||
|
wire ck;
|
||||||
|
wire ck_n = ~ck;
|
||||||
|
reg cke = 1'b0;
|
||||||
|
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;
|
||||||
|
|
||||||
|
// 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 wl = 1; //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'b0}};
|
||||||
|
assign dq = dq_en ? dq_out : {DQ_BITS{1'bz}};
|
||||||
|
assign dqs = dqs_en ? dqs_out : {DQS_BITS{1'bz}};
|
||||||
|
|
||||||
|
// dq receive
|
||||||
|
reg [DM_BITS-1:0] dm_fifo [2*CL_MAX+16:0];
|
||||||
|
reg [DQ_BITS-1:0] dq_fifo [2*CL_MAX+16:0];
|
||||||
|
wire [DQ_BITS-1:0] q0, q1, q2, q3;
|
||||||
|
reg ptr_rst_n;
|
||||||
|
reg [1:0] burst_cntr;
|
||||||
|
|
||||||
|
// timing definition in tCK units
|
||||||
|
real tck;
|
||||||
|
wire [11:0] trc = tRC;
|
||||||
|
wire [11:0] trrd = ceil(tRRD/tck);
|
||||||
|
wire [11:0] trcd = ceil(tRCD/tck);
|
||||||
|
wire [11:0] tras = ceil(tRAS/tck);
|
||||||
|
wire [11:0] twr = ceil(tWR/tck);
|
||||||
|
wire [11:0] trp = ceil(tRP/tck);
|
||||||
|
wire [11:0] tmrd = tMRD;
|
||||||
|
wire [11:0] trfc = ceil(tRFC/tck);
|
||||||
|
wire [11:0] tsrr = ceil(tSRR);
|
||||||
|
wire [11:0] tsrc = ceil(tSRC);
|
||||||
|
wire [11:0] tdqsq = tDQSQ;
|
||||||
|
wire [11:0] twtr = tWTR;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
$timeformat (-9, 1, " ns", 1);
|
||||||
|
`ifdef period
|
||||||
|
tck <= `period;
|
||||||
|
`else
|
||||||
|
tck <= tCK;
|
||||||
|
`endif
|
||||||
|
ck_tb <= 1'b1;
|
||||||
|
dq_en <= 1'b0;
|
||||||
|
dqs_en <= 1'b0;
|
||||||
|
end
|
||||||
|
|
||||||
|
// component instantiation
|
||||||
|
mobile_ddr mobile_ddr (
|
||||||
|
.Clk ( ck ) ,
|
||||||
|
.Clk_n ( ck_n ) ,
|
||||||
|
.Cke ( cke ) ,
|
||||||
|
.Cs_n ( cs_n ) ,
|
||||||
|
.Ras_n ( ras_n ) ,
|
||||||
|
.Cas_n ( cas_n ) ,
|
||||||
|
.We_n ( we_n ) ,
|
||||||
|
.Addr ( a ) ,
|
||||||
|
.Ba ( ba ) ,
|
||||||
|
.Dq ( dq ) ,
|
||||||
|
.Dqs ( dqs ) ,
|
||||||
|
.Dm ( dm )
|
||||||
|
);
|
||||||
|
|
||||||
|
// clock generator
|
||||||
|
assign ck = ck_enable & ck_tb ;
|
||||||
|
always @(posedge ck_tb) begin
|
||||||
|
ck_tb <= #(tck/2) 1'b0;
|
||||||
|
ck_tb <= #(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
|
||||||
|
|
||||||
|
function [8*DQ_BITS-1:0] burst_order;
|
||||||
|
input [8-1:0] col;
|
||||||
|
input [8*DQ_BITS-1:0] dq;
|
||||||
|
reg [3:0] i;
|
||||||
|
reg [2:0] j;
|
||||||
|
integer k;
|
||||||
|
begin
|
||||||
|
burst_order = dq;
|
||||||
|
for (i=0; i<bl; i=i+1) begin
|
||||||
|
j = ((col%bl) ^ i);
|
||||||
|
if (!bo)
|
||||||
|
j[1:0] = (col + i);
|
||||||
|
for (k=0; k<DQ_BITS; k=k+1) begin
|
||||||
|
burst_order[i*DQ_BITS + k] = dq[j*DQ_BITS + k];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
task power_up;
|
||||||
|
begin
|
||||||
|
cke <= 1'b0;
|
||||||
|
cs_n <= 1'b1;
|
||||||
|
ras_n <= 1'b1;
|
||||||
|
cas_n <= 1'b1;
|
||||||
|
we_n <= 1'b1;
|
||||||
|
ba <= {BA_BITS{1'b0}};
|
||||||
|
a <= {ADDR_BITS{1'b0}};
|
||||||
|
repeat(10) @(negedge ck_tb);
|
||||||
|
@ (negedge ck_tb) cke <= 1'b1;
|
||||||
|
$display ("%m at time %t TB: A 200 us delay is required after cke is brought high.", $time);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task stop_clock_enter ;
|
||||||
|
begin
|
||||||
|
@ (negedge ck_tb);
|
||||||
|
ck_enable = 1'b0 ;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task stop_clock_exit ;
|
||||||
|
begin
|
||||||
|
@ (negedge ck_tb);
|
||||||
|
ck_enable = 1'b1 ;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task load_mode;
|
||||||
|
input [BA_BITS-1:0] bank;
|
||||||
|
input [ROW_BITS-1:0] row;
|
||||||
|
begin
|
||||||
|
case (bank)
|
||||||
|
0: mode_reg0 = row;
|
||||||
|
1: mode_reg1 = row;
|
||||||
|
endcase
|
||||||
|
cke <= 1'b1;
|
||||||
|
cs_n <= 1'b0;
|
||||||
|
ras_n <= 1'b0;
|
||||||
|
cas_n <= 1'b0;
|
||||||
|
we_n <= 1'b0;
|
||||||
|
ba <= bank;
|
||||||
|
a <= row;
|
||||||
|
@(negedge ck_tb);
|
||||||
|
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_tb);
|
||||||
|
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_tb);
|
||||||
|
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_tb);
|
||||||
|
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 [16*DM_BITS-1:0] dm;
|
||||||
|
input [16*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_tb);
|
||||||
|
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_tb);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task burst_term;
|
||||||
|
integer i;
|
||||||
|
begin
|
||||||
|
cke <= 1'b1;
|
||||||
|
cs_n <= 1'b0;
|
||||||
|
ras_n <= 1'b1;
|
||||||
|
cas_n <= 1'b1;
|
||||||
|
we_n <= 1'b0;
|
||||||
|
@(negedge ck_tb);
|
||||||
|
for (i=0; i<bl; i=i+1) begin
|
||||||
|
dm_fifo[2*cl + i] <= {DM_BITS{1'bx}};
|
||||||
|
dq_fifo[2*cl + i] <= {DQ_BITS{1'bx}};
|
||||||
|
end
|
||||||
|
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_tb);
|
||||||
|
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_tb);
|
||||||
|
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_tb);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task deep_power_down;
|
||||||
|
input [31:0] count;
|
||||||
|
begin
|
||||||
|
cke <= 1'b0;
|
||||||
|
cs_n <= 1'b0;
|
||||||
|
ras_n <= 1'b1;
|
||||||
|
cas_n <= 1'b1;
|
||||||
|
we_n <= 1'b0;
|
||||||
|
repeat(count) @(negedge ck_tb);
|
||||||
|
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;
|
||||||
|
repeat(count) @(negedge ck_tb);
|
||||||
|
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 [16*DM_BITS-1:0] dm; //Expected Data Mask
|
||||||
|
input [16*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*cl + i] <= dm>>(i*DM_BITS);
|
||||||
|
dq_fifo[2*cl + i] <= dq>>(i*DQ_BITS);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// receiver(s) for data_verify process
|
||||||
|
dqrx dqrx[DQS_BITS-1:0] (ptr_rst_n, dqs, dq, q0, q1, q2, q3);
|
||||||
|
|
||||||
|
// perform data verification as a result of read_verify task call
|
||||||
|
reg [DQ_BITS-1:0] bit_mask;
|
||||||
|
reg [DM_BITS-1:0] dm_temp;
|
||||||
|
reg [DQ_BITS-1:0] dq_temp;
|
||||||
|
always @(ck) begin:data_verify
|
||||||
|
integer i;
|
||||||
|
integer j;
|
||||||
|
|
||||||
|
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/(DQ_BITS/DM_BITS)];
|
||||||
|
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_tb) begin
|
||||||
|
ptr_rst_n <= (dm_fifo[4] !== {DM_BITS{1'bx}});
|
||||||
|
end else begin
|
||||||
|
//ptr_rst_n <= ptr_rst_n & (dm_fifo[6] !== {DM_BITS{1'bx}});
|
||||||
|
for (i=0; i<=2*CL_MAX+16; 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 (
|
||||||
|
ptr_rst_n, dqs, dq, q0, q1, q2, q3
|
||||||
|
);
|
||||||
|
|
||||||
|
`ifdef den128Mb
|
||||||
|
`include "128Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den256Mb
|
||||||
|
`include "256Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den512Mb
|
||||||
|
`include "512Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den1024Mb
|
||||||
|
`include "1024Mb_mobile_ddr_parameters.vh"
|
||||||
|
`elsif den2048Mb
|
||||||
|
`include "2048Mb_mobile_ddr_parameters.vh"
|
||||||
|
`else
|
||||||
|
// NOTE: Intentionally cause a compile fail here to force the users
|
||||||
|
// to select the correct component density before continuing
|
||||||
|
ERROR: You must specify component density with +define+den____Mb.
|
||||||
|
`endif
|
||||||
|
|
||||||
|
input ptr_rst_n;
|
||||||
|
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 [1:0] ptr;
|
||||||
|
reg [DQ_BITS/DQS_BITS-1:0] q [3:0];
|
||||||
|
|
||||||
|
reg ptr_rst_dly_n;
|
||||||
|
always @(posedge ptr_rst_n) ptr_rst_dly_n <= #(tAC2_min + tDQSQ) ptr_rst_n;
|
||||||
|
always @(negedge ptr_rst_n) ptr_rst_dly_n <= #(tAC2_max + tDQSQ + 0.002) ptr_rst_n;
|
||||||
|
|
||||||
|
reg dqs_dly;
|
||||||
|
always @(dqs) dqs_dly <= #(tDQSQ + 0.001) dqs;
|
||||||
|
|
||||||
|
always @(negedge ptr_rst_dly_n or posedge dqs_dly or negedge dqs_dly) begin
|
||||||
|
if (!ptr_rst_dly_n) begin
|
||||||
|
ptr <= 0;
|
||||||
|
end else if (dqs_dly || ptr) begin
|
||||||
|
q[ptr] <= dq;
|
||||||
|
ptr <= ptr + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign q0 = q[0];
|
||||||
|
assign q1 = q[1];
|
||||||
|
assign q2 = q[2];
|
||||||
|
assign q3 = q[3];
|
||||||
|
endmodule
|
Loading…
Reference in New Issue
Block a user