added simulation for DLL Off (low frequency ddr3 clk)
This commit is contained in:
parent
baaa2a2482
commit
73431cdd82
|
|
@ -137,6 +137,7 @@ module ddr3 (
|
|||
parameter feature_odt_hi = 0;
|
||||
parameter PERTCKAVG=TDLLK;
|
||||
parameter FLY_BY_DELAY = 0, DQ_DELAY = 0;
|
||||
parameter[0:0] DLL_OFF = 0;
|
||||
|
||||
// text macros
|
||||
`define DQ_PER_DQS DQ_BITS/DQS_BITS
|
||||
|
|
@ -1662,7 +1663,7 @@ module ddr3 (
|
|||
$display ("%m at time %t WARNING: 500 us is required after RST_N goes inactive before CKE goes active.", $time);
|
||||
tm_txpr <= $time;
|
||||
ck_txpr <= ck_cntr;
|
||||
init_step = init_step + 1;
|
||||
init_step = init_step + 2;
|
||||
end
|
||||
1 : begin
|
||||
if (dll_en) init_step = init_step + 1;
|
||||
|
|
@ -1770,7 +1771,7 @@ module ddr3 (
|
|||
for (i=0; i<64; i=i+1) begin
|
||||
if (dq_in_valid && dll_locked && ($time - tm_dqs_neg[i] < $rtoi(TDSS*tck_avg)))
|
||||
$display ("%m: at time %t ERROR: tDSS violation on %s bit %d", $time, dqs_string[i/32], i%32);
|
||||
if (check_write_dqs_high[i])
|
||||
if (check_write_dqs_high[i] && !DLL_OFF)
|
||||
$display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period.", $time, dqs_string[i/32], i%32);
|
||||
end
|
||||
check_write_dqs_high <= 0;
|
||||
|
|
@ -1781,7 +1782,7 @@ module ddr3 (
|
|||
if ((tm_tdqss < tck_avg/2.0) && (tm_tdqss > TDQSS*tck_avg))
|
||||
$display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/32], i%32);
|
||||
end
|
||||
if (check_write_dqs_low[i])
|
||||
if (check_write_dqs_low[i] && !DLL_OFF)
|
||||
$display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/32], i%32);
|
||||
end
|
||||
check_write_preamble <= 0;
|
||||
|
|
@ -2249,8 +2250,8 @@ module ddr3 (
|
|||
$display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC);
|
||||
if (TCK_MIN - tck_avg >= 1.0)
|
||||
$display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg);
|
||||
if (tck_avg - TCK_MAX >= 1.0)
|
||||
$display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX);
|
||||
if ((tck_avg - TCK_MAX >= 1.0) && !DLL_OFF)
|
||||
$display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX);
|
||||
|
||||
// check tCL
|
||||
if (tm_ck_neg - $time < TCL_ABS_MIN*tck_avg)
|
||||
|
|
@ -2800,7 +2801,7 @@ module ddr3 (
|
|||
check_write_postamble[i] <= 1'b0;
|
||||
check_write_dqs_low[i] <= 1'b0;
|
||||
tm_dqs[i%32] <= $time;
|
||||
end else begin
|
||||
end else if(!DLL_OFF) begin
|
||||
$display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32);
|
||||
end
|
||||
end
|
||||
|
|
@ -2906,7 +2907,7 @@ module ddr3 (
|
|||
end
|
||||
check_dm_tdipw[i%32] <= 1'b1;
|
||||
tm_dqs[i%32] <= $time;
|
||||
end else begin
|
||||
end else if(!DLL_OFF) begin
|
||||
$display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32);
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -57,16 +57,16 @@ module ddr3_dimm_micron_sim;
|
|||
`endif
|
||||
|
||||
|
||||
localparam CONTROLLER_CLK_PERIOD = 5_000, //ps, period of clock input to this DDR3 controller module
|
||||
DDR3_CLK_PERIOD = 1_250, //ps, period of clock input to DDR3 RAM device
|
||||
localparam CONTROLLER_CLK_PERIOD = 12_000, //ps, period of clock input to this DDR3 controller module
|
||||
DDR3_CLK_PERIOD = 3_000, //ps, period of clock input to DDR3 RAM device
|
||||
AUX_WIDTH = 16, // AUX lines
|
||||
ECC_ENABLE = 0, // ECC enable
|
||||
SELF_REFRESH = 2'b00,
|
||||
DUAL_RANK_DIMM = 0,
|
||||
TEST_SELF_REFRESH = 0,
|
||||
SECOND_WISHBONE = 0,
|
||||
BIST_MODE = 1; // 0 = No BIST, 1 = run through all address space ONCE , 2 = run through all address space for every test (burst w/r, random w/r, alternating r/w)
|
||||
|
||||
BIST_MODE = 2, // 0 = No BIST, 1 = run through all address space ONCE , 2 = run through all address space for every test (burst w/r, random w/r, alternating r/w)
|
||||
DLL_OFF = 1;
|
||||
|
||||
reg i_controller_clk, i_ddr3_clk, i_ref_clk, i_ddr3_clk_90;
|
||||
reg i_rst_n;
|
||||
|
|
@ -171,7 +171,8 @@ ddr3_top #(
|
|||
.WB_ERROR(1), // set to 1 to support Wishbone error (asserts at ECC double bit error)
|
||||
.BIST_MODE(BIST_MODE), // 0 = No BIST, 1 = run through all address space ONCE , 2 = run through all address space for every test (burst w/r, random w/r, alternating r/w)
|
||||
.SELF_REFRESH(SELF_REFRESH), // 0 = use i_user_self_refresh input, 1 = Self-refresh mode is enabled after 64 controller clock cycles of no requests, 2 = 128 cycles, 3 = 256 cycles
|
||||
.DUAL_RANK_DIMM(DUAL_RANK_DIMM) // enable dual rank DIMM (1 = enable, 0 = disable)
|
||||
.DUAL_RANK_DIMM(DUAL_RANK_DIMM), // enable dual rank DIMM (1 = enable, 0 = disable)
|
||||
.DLL_OFF(DLL_OFF) // 1 = DLL off for low frequency ddr3 clock
|
||||
) ddr3_top
|
||||
(
|
||||
//clock and reset
|
||||
|
|
@ -227,7 +228,7 @@ ddr3_top #(
|
|||
|
||||
`ifdef TWO_LANES_x8
|
||||
// 1 lane DDR3
|
||||
ddr3 ddr3_0(
|
||||
ddr3 #(.DLL_OFF(DLL_OFF)) ddr3_0(
|
||||
.rst_n(reset_n),
|
||||
.ck(o_ddr3_clk_p[0]),
|
||||
.ck_n(o_ddr3_clk_n[0]),
|
||||
|
|
@ -249,7 +250,7 @@ ddr3_top #(
|
|||
|
||||
`ifdef EIGHT_LANES_x8
|
||||
// DDR3 Device
|
||||
ddr3_module ddr3_module(
|
||||
ddr3_module #(.DLL_OFF(DLL_OFF)) ddr3_module(
|
||||
.reset_n(reset_n),
|
||||
.ck(o_ddr3_clk_p), //[1:0]
|
||||
.ck_n(o_ddr3_clk_n), //[1:0]
|
||||
|
|
|
|||
|
|
@ -87,6 +87,8 @@ module ddr3_module (
|
|||
input scl ; // no connect
|
||||
inout sda ; // no connect
|
||||
|
||||
parameter DLL_OFF = 0;
|
||||
|
||||
`ifdef QUAD_RANK
|
||||
initial if (DEBUG) $display("%m: Quad Rank");
|
||||
`elsif DUAL_RANK
|
||||
|
|
@ -304,14 +306,14 @@ module ddr3_module (
|
|||
`endif
|
||||
`elsif x8
|
||||
initial if (DEBUG) $display("%m: Component Width = x8");
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_0)) U1R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_1)) U2R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_2)) U3R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_3)) U4R0 (reset_n, 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_4)) U6R0 (reset_n, 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_5)) U7R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_6)) U8R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_7)) U9R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_0), .DLL_OFF(DLL_OFF)) U1R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_1), .DLL_OFF(DLL_OFF)) U2R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_2), .DLL_OFF(DLL_OFF)) U3R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_3), .DLL_OFF(DLL_OFF)) U4R0 (reset_n, 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_4), .DLL_OFF(DLL_OFF)) U6R0 (reset_n, 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_5), .DLL_OFF(DLL_OFF)) U7R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_6), .DLL_OFF(DLL_OFF)) U8R0 (reset_n, rck[0], rck_n[0], 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]);
|
||||
ddr3 #(.FLY_BY_DELAY(FLY_BY_DELAY_LANE_7), .DLL_OFF(DLL_OFF)) U9R0 (reset_n, rck[0], rck_n[0], 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
|
||||
ddr3 U5R0 (reset_n, rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 0], dqs[ 8] , dqs_n[ 8] , dqs_n[17], rodt[0]);
|
||||
`endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue